summaryrefslogtreecommitdiffstats
path: root/vendor
diff options
context:
space:
mode:
authorChristopher Speller <crspeller@gmail.com>2016-09-23 10:17:51 -0400
committerGitHub <noreply@github.com>2016-09-23 10:17:51 -0400
commit2ca0e8f9a0f9863555a26e984cde15efff9ef8f8 (patch)
treedaae1ee67b14a3d0a84424f2a304885d9e75ce2b /vendor
parent6d62d65b2dc85855aabea036cbd44f6059e19d13 (diff)
downloadchat-2ca0e8f9a0f9863555a26e984cde15efff9ef8f8.tar.gz
chat-2ca0e8f9a0f9863555a26e984cde15efff9ef8f8.tar.bz2
chat-2ca0e8f9a0f9863555a26e984cde15efff9ef8f8.zip
Updating golang dependancies (#4075)
Diffstat (limited to 'vendor')
-rw-r--r--vendor/github.com/NYTimes/gziphandler/.gitignore1
-rw-r--r--vendor/github.com/NYTimes/gziphandler/.travis.yml5
-rw-r--r--vendor/github.com/NYTimes/gziphandler/CODE_OF_CONDUCT.md75
-rw-r--r--vendor/github.com/NYTimes/gziphandler/CONTRIBUTING.md30
-rw-r--r--vendor/github.com/NYTimes/gziphandler/gzip.go170
-rw-r--r--vendor/github.com/NYTimes/gziphandler/gzip_test.go184
-rw-r--r--vendor/github.com/braintree/manners/README.md4
-rw-r--r--vendor/github.com/braintree/manners/helpers_test.go141
-rw-r--r--vendor/github.com/braintree/manners/interfaces.go7
-rw-r--r--vendor/github.com/braintree/manners/server.go141
-rw-r--r--vendor/github.com/braintree/manners/server_test.go153
-rw-r--r--vendor/github.com/braintree/manners/static.go14
-rw-r--r--vendor/github.com/braintree/manners/test_helpers/certs.go29
-rw-r--r--vendor/github.com/braintree/manners/test_helpers/conn.go13
-rw-r--r--vendor/github.com/braintree/manners/test_helpers/listener.go34
-rw-r--r--vendor/github.com/braintree/manners/test_helpers/temp_file.go27
-rw-r--r--vendor/github.com/braintree/manners/test_helpers/wait_group.go33
-rw-r--r--vendor/github.com/braintree/manners/transition_test.go9
-rw-r--r--vendor/github.com/dgryski/dgoogauth/README.md2
-rw-r--r--vendor/github.com/disintegration/imaging/.travis.yml2
-rw-r--r--vendor/github.com/garyburd/redigo/.travis.yml16
-rw-r--r--vendor/github.com/garyburd/redigo/LICENSE175
-rw-r--r--vendor/github.com/garyburd/redigo/README.markdown50
-rw-r--r--vendor/github.com/garyburd/redigo/internal/commandinfo.go54
-rw-r--r--vendor/github.com/garyburd/redigo/internal/commandinfo_test.go27
-rw-r--r--vendor/github.com/garyburd/redigo/internal/redistest/testdb.go68
-rw-r--r--vendor/github.com/garyburd/redigo/redis/conn.go570
-rw-r--r--vendor/github.com/garyburd/redigo/redis/conn_test.go670
-rw-r--r--vendor/github.com/garyburd/redigo/redis/doc.go169
-rw-r--r--vendor/github.com/garyburd/redigo/redis/log.go117
-rw-r--r--vendor/github.com/garyburd/redigo/redis/pool.go393
-rw-r--r--vendor/github.com/garyburd/redigo/redis/pool_test.go684
-rw-r--r--vendor/github.com/garyburd/redigo/redis/pubsub.go144
-rw-r--r--vendor/github.com/garyburd/redigo/redis/pubsub_test.go148
-rw-r--r--vendor/github.com/garyburd/redigo/redis/redis.go44
-rw-r--r--vendor/github.com/garyburd/redigo/redis/reply.go393
-rw-r--r--vendor/github.com/garyburd/redigo/redis/reply_test.go179
-rw-r--r--vendor/github.com/garyburd/redigo/redis/scan.go555
-rw-r--r--vendor/github.com/garyburd/redigo/redis/scan_test.go440
-rw-r--r--vendor/github.com/garyburd/redigo/redis/script.go86
-rw-r--r--vendor/github.com/garyburd/redigo/redis/script_test.go100
-rw-r--r--vendor/github.com/garyburd/redigo/redis/test_test.go177
-rw-r--r--vendor/github.com/garyburd/redigo/redis/zpop_example_test.go113
-rw-r--r--vendor/github.com/garyburd/redigo/redisx/connmux.go152
-rw-r--r--vendor/github.com/garyburd/redigo/redisx/connmux_test.go259
-rw-r--r--vendor/github.com/garyburd/redigo/redisx/doc.go17
-rwxr-xr-xvendor/github.com/go-ldap/ldap/.githooks/pre-push6
-rw-r--r--vendor/github.com/go-ldap/ldap/.travis.yml11
-rw-r--r--vendor/github.com/go-ldap/ldap/Makefile42
-rw-r--r--vendor/github.com/go-ldap/ldap/README.md28
-rw-r--r--vendor/github.com/go-ldap/ldap/add.go49
-rw-r--r--vendor/github.com/go-ldap/ldap/bind.go42
-rw-r--r--vendor/github.com/go-ldap/ldap/compare.go18
-rw-r--r--vendor/github.com/go-ldap/ldap/conn.go147
-rw-r--r--vendor/github.com/go-ldap/ldap/conn_test.go295
-rw-r--r--vendor/github.com/go-ldap/ldap/control.go132
-rw-r--r--vendor/github.com/go-ldap/ldap/control_test.go58
-rw-r--r--vendor/github.com/go-ldap/ldap/del.go27
-rw-r--r--vendor/github.com/go-ldap/ldap/dn.go21
-rw-r--r--vendor/github.com/go-ldap/ldap/error.go8
-rw-r--r--vendor/github.com/go-ldap/ldap/error_test.go77
-rw-r--r--vendor/github.com/go-ldap/ldap/filter.go72
-rw-r--r--vendor/github.com/go-ldap/ldap/ldap.go3
-rw-r--r--vendor/github.com/go-ldap/ldap/modify.go66
-rw-r--r--vendor/github.com/go-ldap/ldap/passwdmodify.go34
-rw-r--r--vendor/github.com/go-ldap/ldap/search.go58
-rw-r--r--vendor/github.com/go-sql-driver/mysql/.travis.yml7
-rw-r--r--vendor/github.com/go-sql-driver/mysql/AUTHORS17
-rw-r--r--vendor/github.com/go-sql-driver/mysql/CHANGELOG.md31
-rw-r--r--vendor/github.com/go-sql-driver/mysql/CONTRIBUTING.md17
-rw-r--r--vendor/github.com/go-sql-driver/mysql/ISSUE_TEMPLATE.md21
-rw-r--r--vendor/github.com/go-sql-driver/mysql/PULL_REQUEST_TEMPLATE.md9
-rw-r--r--vendor/github.com/go-sql-driver/mysql/README.md90
-rw-r--r--vendor/github.com/go-sql-driver/mysql/benchmark_test.go40
-rw-r--r--vendor/github.com/go-sql-driver/mysql/buffer.go55
-rw-r--r--vendor/github.com/go-sql-driver/mysql/collations.go16
-rw-r--r--vendor/github.com/go-sql-driver/mysql/connection.go270
-rw-r--r--vendor/github.com/go-sql-driver/mysql/const.go37
-rw-r--r--vendor/github.com/go-sql-driver/mysql/driver.go85
-rw-r--r--vendor/github.com/go-sql-driver/mysql/driver_test.go893
-rw-r--r--vendor/github.com/go-sql-driver/mysql/dsn.go513
-rw-r--r--vendor/github.com/go-sql-driver/mysql/dsn_test.go207
-rw-r--r--vendor/github.com/go-sql-driver/mysql/errors.go22
-rw-r--r--vendor/github.com/go-sql-driver/mysql/infile.go53
-rw-r--r--vendor/github.com/go-sql-driver/mysql/packets.go337
-rw-r--r--vendor/github.com/go-sql-driver/mysql/rows.go50
-rw-r--r--vendor/github.com/go-sql-driver/mysql/statement.go40
-rw-r--r--vendor/github.com/go-sql-driver/mysql/utils.go574
-rw-r--r--vendor/github.com/go-sql-driver/mysql/utils_test.go143
-rw-r--r--vendor/github.com/goamz/goamz/aws/aws.go2
-rw-r--r--vendor/github.com/goamz/goamz/aws/regions.go23
-rw-r--r--vendor/github.com/goamz/goamz/exp/ses/ses.go10
-rw-r--r--vendor/github.com/goamz/goamz/exp/ses/ses_types.go4
-rw-r--r--vendor/github.com/goamz/goamz/s3/s3test/server.go4
-rw-r--r--vendor/github.com/goamz/goamz/sqs/sqs.go23
-rw-r--r--vendor/github.com/golang/freetype/example/genbasicfont/main.go237
-rw-r--r--vendor/github.com/golang/freetype/truetype/hint.go9
-rw-r--r--vendor/github.com/golang/groupcache/.gitignore1
-rw-r--r--vendor/github.com/golang/groupcache/LICENSE191
-rw-r--r--vendor/github.com/golang/groupcache/README.md73
-rw-r--r--vendor/github.com/golang/groupcache/byteview.go160
-rw-r--r--vendor/github.com/golang/groupcache/byteview_test.go142
-rw-r--r--vendor/github.com/golang/groupcache/consistenthash/consistenthash.go81
-rw-r--r--vendor/github.com/golang/groupcache/consistenthash/consistenthash_test.go110
-rw-r--r--vendor/github.com/golang/groupcache/groupcache.go489
-rw-r--r--vendor/github.com/golang/groupcache/groupcache_test.go447
-rw-r--r--vendor/github.com/golang/groupcache/groupcachepb/groupcache.pb.go65
-rw-r--r--vendor/github.com/golang/groupcache/groupcachepb/groupcache.proto34
-rw-r--r--vendor/github.com/golang/groupcache/http.go227
-rw-r--r--vendor/github.com/golang/groupcache/http_test.go166
-rw-r--r--vendor/github.com/golang/groupcache/lru/lru.go121
-rw-r--r--vendor/github.com/golang/groupcache/lru/lru_test.go73
-rw-r--r--vendor/github.com/golang/groupcache/peers.go71
-rw-r--r--vendor/github.com/golang/groupcache/singleflight/singleflight.go64
-rw-r--r--vendor/github.com/golang/groupcache/singleflight/singleflight_test.go85
-rw-r--r--vendor/github.com/golang/groupcache/sinks.go322
-rw-r--r--vendor/github.com/golang/groupcache/testpb/test.pb.go235
-rw-r--r--vendor/github.com/golang/groupcache/testpb/test.proto63
-rw-r--r--vendor/github.com/gorilla/context/.travis.yml1
-rw-r--r--vendor/github.com/gorilla/context/README.md3
-rw-r--r--vendor/github.com/gorilla/context/context_test.go2
-rw-r--r--vendor/github.com/gorilla/context/doc.go6
-rw-r--r--vendor/github.com/gorilla/handlers/.travis.yml7
-rw-r--r--vendor/github.com/gorilla/handlers/cors.go3
-rw-r--r--vendor/github.com/gorilla/handlers/cors_test.go18
-rw-r--r--vendor/github.com/gorilla/mux/.travis.yml3
-rw-r--r--vendor/github.com/gorilla/mux/mux.go46
-rw-r--r--vendor/github.com/gorilla/mux/mux_test.go18
-rw-r--r--vendor/github.com/gorilla/mux/route.go7
-rw-r--r--vendor/github.com/hashicorp/golang-lru/.gitignore23
-rw-r--r--vendor/github.com/hashicorp/golang-lru/2q.go212
-rw-r--r--vendor/github.com/hashicorp/golang-lru/2q_test.go306
-rw-r--r--vendor/github.com/hashicorp/golang-lru/LICENSE362
-rw-r--r--vendor/github.com/hashicorp/golang-lru/README.md25
-rw-r--r--vendor/github.com/hashicorp/golang-lru/arc.go257
-rw-r--r--vendor/github.com/hashicorp/golang-lru/arc_test.go377
-rw-r--r--vendor/github.com/hashicorp/golang-lru/lru.go114
-rw-r--r--vendor/github.com/hashicorp/golang-lru/lru_test.go221
-rw-r--r--vendor/github.com/hashicorp/golang-lru/simplelru/lru.go160
-rw-r--r--vendor/github.com/hashicorp/golang-lru/simplelru/lru_test.go167
-rw-r--r--vendor/github.com/jehiah/go-strftime/.gitignore22
-rwxr-xr-xvendor/github.com/lib/pq/.travis.sh73
-rw-r--r--vendor/github.com/lib/pq/.travis.yml75
-rw-r--r--vendor/github.com/lib/pq/README.md2
-rw-r--r--vendor/github.com/lib/pq/array.go727
-rw-r--r--vendor/github.com/lib/pq/array_test.go1153
-rw-r--r--vendor/github.com/lib/pq/certs/bogus_root.crt19
-rw-r--r--vendor/github.com/lib/pq/conn.go17
-rw-r--r--vendor/github.com/lib/pq/conn_test.go16
-rw-r--r--vendor/github.com/lib/pq/encode.go117
-rw-r--r--vendor/github.com/lib/pq/encode_test.go11
-rw-r--r--vendor/github.com/lib/pq/ssl_test.go43
-rw-r--r--vendor/github.com/mssola/user_agent/.travis.yml2
-rw-r--r--vendor/github.com/mssola/user_agent/LICENSE2
-rw-r--r--vendor/github.com/mssola/user_agent/README.md2
-rw-r--r--vendor/github.com/mssola/user_agent/all_test.go610
-rw-r--r--vendor/github.com/mssola/user_agent/bot.go14
-rw-r--r--vendor/github.com/mssola/user_agent/browser.go30
-rw-r--r--vendor/github.com/mssola/user_agent/operating_systems.go29
-rw-r--r--vendor/github.com/mssola/user_agent/user_agent.go15
-rw-r--r--vendor/github.com/pborman/uuid/CONTRIBUTING.md10
-rw-r--r--vendor/github.com/pborman/uuid/sql.go8
-rw-r--r--vendor/github.com/pborman/uuid/sql_test.go9
-rw-r--r--vendor/github.com/pborman/uuid/uuid.go25
-rw-r--r--vendor/github.com/pborman/uuid/uuid_test.go74
-rw-r--r--vendor/github.com/segmentio/analytics-go/cli/cli.go174
-rw-r--r--vendor/github.com/segmentio/backo-go/.gitmodules3
-rw-r--r--vendor/golang.org/x/crypto/acme/acme.go944
-rw-r--r--vendor/golang.org/x/crypto/acme/acme_test.go (renamed from vendor/golang.org/x/crypto/acme/internal/acme/acme_test.go)538
-rw-r--r--vendor/golang.org/x/crypto/acme/autocert/autocert.go776
-rw-r--r--vendor/golang.org/x/crypto/acme/autocert/autocert_test.go390
-rw-r--r--vendor/golang.org/x/crypto/acme/autocert/cache.go130
-rw-r--r--vendor/golang.org/x/crypto/acme/autocert/cache_test.go58
-rw-r--r--vendor/golang.org/x/crypto/acme/autocert/renewal.go125
-rw-r--r--vendor/golang.org/x/crypto/acme/autocert/renewal_test.go190
-rw-r--r--vendor/golang.org/x/crypto/acme/internal/acme/acme.go473
-rw-r--r--vendor/golang.org/x/crypto/acme/internal/acme/jws.go67
-rw-r--r--vendor/golang.org/x/crypto/acme/jws.go153
-rw-r--r--vendor/golang.org/x/crypto/acme/jws_test.go (renamed from vendor/golang.org/x/crypto/acme/internal/acme/jws_test.go)143
-rw-r--r--vendor/golang.org/x/crypto/acme/types.go (renamed from vendor/golang.org/x/crypto/acme/internal/acme/types.go)66
-rw-r--r--vendor/golang.org/x/crypto/blowfish/cipher.go2
-rw-r--r--vendor/golang.org/x/crypto/nacl/box/box.go5
-rw-r--r--vendor/golang.org/x/crypto/nacl/secretbox/example_test.go53
-rw-r--r--vendor/golang.org/x/crypto/nacl/secretbox/secretbox.go2
-rw-r--r--vendor/golang.org/x/crypto/ocsp/ocsp.go12
-rw-r--r--vendor/golang.org/x/crypto/openpgp/keys.go6
-rw-r--r--vendor/golang.org/x/crypto/openpgp/keys_test.go34
-rw-r--r--vendor/golang.org/x/crypto/openpgp/packet/signature.go2
-rw-r--r--vendor/golang.org/x/crypto/openpgp/packet/signature_test.go36
-rw-r--r--vendor/golang.org/x/crypto/openpgp/write.go2
-rw-r--r--vendor/golang.org/x/crypto/scrypt/scrypt.go2
-rw-r--r--vendor/golang.org/x/crypto/sha3/keccakf.go2
-rw-r--r--vendor/golang.org/x/crypto/sha3/keccakf_amd64.go13
-rw-r--r--vendor/golang.org/x/crypto/sha3/keccakf_amd64.s392
-rw-r--r--vendor/golang.org/x/crypto/sha3/sha3.go2
-rw-r--r--vendor/golang.org/x/crypto/ssh/agent/client.go55
-rw-r--r--vendor/golang.org/x/crypto/ssh/agent/client_test.go42
-rw-r--r--vendor/golang.org/x/crypto/ssh/agent/server.go35
-rw-r--r--vendor/golang.org/x/crypto/ssh/agent/server_test.go21
-rw-r--r--vendor/golang.org/x/crypto/ssh/agent/testdata_test.go2
-rw-r--r--vendor/golang.org/x/crypto/ssh/channel.go2
-rw-r--r--vendor/golang.org/x/crypto/ssh/cipher.go39
-rw-r--r--vendor/golang.org/x/crypto/ssh/cipher_test.go2
-rw-r--r--vendor/golang.org/x/crypto/ssh/client_auth.go34
-rw-r--r--vendor/golang.org/x/crypto/ssh/client_auth_test.go81
-rw-r--r--vendor/golang.org/x/crypto/ssh/common.go2
-rw-r--r--vendor/golang.org/x/crypto/ssh/connection.go1
-rw-r--r--vendor/golang.org/x/crypto/ssh/handshake.go43
-rw-r--r--vendor/golang.org/x/crypto/ssh/keys.go2
-rw-r--r--vendor/golang.org/x/crypto/ssh/server.go1
-rw-r--r--vendor/golang.org/x/crypto/ssh/session.go33
-rw-r--r--vendor/golang.org/x/crypto/ssh/session_test.go8
-rw-r--r--vendor/golang.org/x/crypto/ssh/terminal/util.go9
-rw-r--r--vendor/golang.org/x/crypto/ssh/test/session_test.go10
-rw-r--r--vendor/golang.org/x/crypto/ssh/test/testdata_test.go2
-rw-r--r--vendor/golang.org/x/crypto/ssh/testdata_test.go2
-rw-r--r--vendor/golang.org/x/crypto/ssh/transport.go9
-rw-r--r--vendor/golang.org/x/image/colornames/gen.go14
-rw-r--r--vendor/golang.org/x/image/colornames/table.go150
-rw-r--r--vendor/golang.org/x/image/font/basicfont/basicfont.go32
-rw-r--r--vendor/golang.org/x/image/font/font.go75
-rw-r--r--vendor/golang.org/x/image/font/inconsolata/bold8x16.go5557
-rw-r--r--vendor/golang.org/x/image/font/inconsolata/inconsolata.go29
-rw-r--r--vendor/golang.org/x/image/font/inconsolata/regular8x16.go5557
-rw-r--r--vendor/golang.org/x/image/font/plan9font/plan9font.go27
-rw-r--r--vendor/golang.org/x/image/math/fixed/fixed.go38
-rw-r--r--vendor/golang.org/x/image/math/fixed/fixed_test.go329
-rw-r--r--vendor/golang.org/x/image/riff/riff.go20
-rw-r--r--vendor/golang.org/x/image/riff/riff_test.go69
-rw-r--r--vendor/golang.org/x/image/vector/raster_floating.go153
-rw-r--r--vendor/golang.org/x/image/vector/vector.go228
-rw-r--r--vendor/golang.org/x/image/vector/vector_test.go76
-rw-r--r--vendor/golang.org/x/image/webp/decode.go8
-rw-r--r--vendor/golang.org/x/image/webp/decode_test.go2
-rw-r--r--vendor/golang.org/x/image/webp/webp.go30
-rw-r--r--vendor/golang.org/x/sys/unix/asm_linux_s390x.s28
-rwxr-xr-xvendor/golang.org/x/sys/unix/mkall.sh17
-rw-r--r--vendor/golang.org/x/sys/unix/mkpost.go62
-rw-r--r--vendor/golang.org/x/sys/unix/syscall_bsd_test.go29
-rw-r--r--vendor/golang.org/x/sys/unix/syscall_darwin.go2
-rw-r--r--vendor/golang.org/x/sys/unix/syscall_dragonfly.go1
-rw-r--r--vendor/golang.org/x/sys/unix/syscall_freebsd.go1
-rw-r--r--vendor/golang.org/x/sys/unix/syscall_linux.go11
-rw-r--r--vendor/golang.org/x/sys/unix/syscall_linux_386.go9
-rw-r--r--vendor/golang.org/x/sys/unix/syscall_linux_amd64.go9
-rw-r--r--vendor/golang.org/x/sys/unix/syscall_linux_arm.go9
-rw-r--r--vendor/golang.org/x/sys/unix/syscall_linux_arm64.go12
-rw-r--r--vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go9
-rw-r--r--vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go9
-rw-r--r--vendor/golang.org/x/sys/unix/syscall_linux_s390x.go329
-rw-r--r--vendor/golang.org/x/sys/unix/syscall_linux_test.go76
-rw-r--r--vendor/golang.org/x/sys/unix/syscall_openbsd.go1
-rw-r--r--vendor/golang.org/x/sys/unix/syscall_solaris.go46
-rw-r--r--vendor/golang.org/x/sys/unix/types_linux.go37
-rw-r--r--vendor/golang.org/x/sys/unix/types_solaris.go2
-rw-r--r--vendor/golang.org/x/sys/unix/zerrors_linux_386.go1
-rw-r--r--vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go1
-rw-r--r--vendor/golang.org/x/sys/unix/zerrors_linux_arm.go1
-rw-r--r--vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go1
-rw-r--r--vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go1
-rw-r--r--vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go1
-rw-r--r--vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go1
-rw-r--r--vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go1
-rw-r--r--vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go2027
-rw-r--r--vendor/golang.org/x/sys/unix/zsyscall_darwin_386.go1
-rw-r--r--vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go1
-rw-r--r--vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.go1
-rw-r--r--vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go1
-rw-r--r--vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go1
-rw-r--r--vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go1
-rw-r--r--vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go1
-rw-r--r--vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go1
-rw-r--r--vendor/golang.org/x/sys/unix/zsyscall_linux_386.go22
-rw-r--r--vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go22
-rw-r--r--vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go22
-rw-r--r--vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go11
-rw-r--r--vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go22
-rw-r--r--vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go22
-rw-r--r--vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go22
-rw-r--r--vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go22
-rw-r--r--vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go1645
-rw-r--r--vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go1
-rw-r--r--vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go1
-rw-r--r--vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go1
-rw-r--r--vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go1
-rw-r--r--vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go1
-rw-r--r--vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go40
-rw-r--r--vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go328
-rw-r--r--vendor/golang.org/x/sys/unix/ztypes_linux_386.go20
-rw-r--r--vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go20
-rw-r--r--vendor/golang.org/x/sys/unix/ztypes_linux_arm.go20
-rw-r--r--vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go20
-rw-r--r--vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go20
-rw-r--r--vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go20
-rw-r--r--vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go20
-rw-r--r--vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go20
-rw-r--r--vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go649
-rw-r--r--vendor/golang.org/x/sys/unix/ztypes_solaris_amd64.go3
-rw-r--r--vendor/golang.org/x/sys/windows/dll_windows.go4
-rw-r--r--vendor/golang.org/x/sys/windows/mksyscall.go7
-rw-r--r--vendor/golang.org/x/sys/windows/registry/mksyscall.go7
-rw-r--r--vendor/golang.org/x/sys/windows/registry/syscall.go2
-rw-r--r--vendor/golang.org/x/sys/windows/syscall_windows.go2
-rw-r--r--vendor/gopkg.in/fsnotify.v1/AUTHORS1
-rw-r--r--vendor/gopkg.in/fsnotify.v1/CHANGELOG.md4
-rw-r--r--vendor/gopkg.in/fsnotify.v1/windows.go8
-rw-r--r--vendor/gopkg.in/throttled/throttled.v1/.gitignore10
-rw-r--r--vendor/gopkg.in/throttled/throttled.v1/.travis.yml10
-rw-r--r--vendor/gopkg.in/throttled/throttled.v1/README.md82
-rw-r--r--vendor/gopkg.in/throttled/throttled.v1/common_test.go65
-rw-r--r--vendor/gopkg.in/throttled/throttled.v1/delayer.go109
-rw-r--r--vendor/gopkg.in/throttled/throttled.v1/delayer_test.go65
-rw-r--r--vendor/gopkg.in/throttled/throttled.v1/doc.go77
-rw-r--r--vendor/gopkg.in/throttled/throttled.v1/examples/README.md12
-rw-r--r--vendor/gopkg.in/throttled/throttled.v1/examples/custom/main.go90
-rw-r--r--vendor/gopkg.in/throttled/throttled.v1/examples/interval-many/main.go79
-rw-r--r--vendor/gopkg.in/throttled/throttled.v1/examples/interval-vary/main.go74
-rw-r--r--vendor/gopkg.in/throttled/throttled.v1/examples/interval-vary/siege-urls4
-rw-r--r--vendor/gopkg.in/throttled/throttled.v1/examples/interval/main.go69
-rw-r--r--vendor/gopkg.in/throttled/throttled.v1/examples/memstats/main.go97
-rw-r--r--vendor/gopkg.in/throttled/throttled.v1/examples/memstats/test-filebin65536 -> 0 bytes
-rw-r--r--vendor/gopkg.in/throttled/throttled.v1/examples/rate-limit/main.go101
-rw-r--r--vendor/gopkg.in/throttled/throttled.v1/interval.go164
-rw-r--r--vendor/gopkg.in/throttled/throttled.v1/interval_test.go114
-rw-r--r--vendor/gopkg.in/throttled/throttled.v1/memstats.go214
-rw-r--r--vendor/gopkg.in/throttled/throttled.v1/memstats_test.go64
-rwxr-xr-xvendor/gopkg.in/throttled/throttled.v1/misc/pre-commit38
-rw-r--r--vendor/gopkg.in/throttled/throttled.v1/rate.go116
-rw-r--r--vendor/gopkg.in/throttled/throttled.v1/rate_test.go101
-rw-r--r--vendor/gopkg.in/throttled/throttled.v1/store.go31
-rw-r--r--vendor/gopkg.in/throttled/throttled.v1/store/doc.go2
-rw-r--r--vendor/gopkg.in/throttled/throttled.v1/store/mem.go90
-rw-r--r--vendor/gopkg.in/throttled/throttled.v1/store/mem_test.go43
-rw-r--r--vendor/gopkg.in/throttled/throttled.v1/store/redis.go85
-rw-r--r--vendor/gopkg.in/throttled/throttled.v1/store/redis_test.go66
-rw-r--r--vendor/gopkg.in/throttled/throttled.v1/throttler.go86
-rw-r--r--vendor/gopkg.in/throttled/throttled.v2/.gitignore5
-rw-r--r--vendor/gopkg.in/throttled/throttled.v2/.travis.yml24
-rw-r--r--vendor/gopkg.in/throttled/throttled.v2/LICENSE (renamed from vendor/gopkg.in/throttled/throttled.v1/LICENSE)0
-rw-r--r--vendor/gopkg.in/throttled/throttled.v2/Makefile31
-rw-r--r--vendor/gopkg.in/throttled/throttled.v2/README.md85
-rw-r--r--vendor/gopkg.in/throttled/throttled.v2/deprecated.go73
-rw-r--r--vendor/gopkg.in/throttled/throttled.v2/deprecated_test.go59
-rw-r--r--vendor/gopkg.in/throttled/throttled.v2/doc.go3
-rw-r--r--vendor/gopkg.in/throttled/throttled.v2/example_test.go103
-rw-r--r--vendor/gopkg.in/throttled/throttled.v2/http.go110
-rw-r--r--vendor/gopkg.in/throttled/throttled.v2/http_test.go99
-rw-r--r--vendor/gopkg.in/throttled/throttled.v2/rate.go239
-rw-r--r--vendor/gopkg.in/throttled/throttled.v2/rate_test.go128
-rw-r--r--vendor/gopkg.in/throttled/throttled.v2/store.go34
-rw-r--r--vendor/gopkg.in/throttled/throttled.v2/store/deprecated.go32
-rw-r--r--vendor/gopkg.in/throttled/throttled.v2/store/memstore/memstore.go127
-rw-r--r--vendor/gopkg.in/throttled/throttled.v2/store/memstore/memstore_test.go40
-rw-r--r--vendor/gopkg.in/throttled/throttled.v2/store/redigostore/redigostore.go156
-rw-r--r--vendor/gopkg.in/throttled/throttled.v2/store/redigostore/redisstore_test.go85
-rw-r--r--vendor/gopkg.in/throttled/throttled.v2/store/storetest/doc.go2
-rw-r--r--vendor/gopkg.in/throttled/throttled.v2/store/storetest/storetest.go176
-rw-r--r--vendor/gopkg.in/throttled/throttled.v2/varyby.go (renamed from vendor/gopkg.in/throttled/throttled.v1/varyby.go)2
-rw-r--r--vendor/gopkg.in/throttled/throttled.v2/varyby_test.go (renamed from vendor/gopkg.in/throttled/throttled.v1/varyby_test.go)18
-rw-r--r--vendor/gopkg.in/yaml.v2/LICENSE195
-rw-r--r--vendor/gopkg.in/yaml.v2/README.md2
361 files changed, 31451 insertions, 16501 deletions
diff --git a/vendor/github.com/NYTimes/gziphandler/.gitignore b/vendor/github.com/NYTimes/gziphandler/.gitignore
new file mode 100644
index 000000000..1377554eb
--- /dev/null
+++ b/vendor/github.com/NYTimes/gziphandler/.gitignore
@@ -0,0 +1 @@
+*.swp
diff --git a/vendor/github.com/NYTimes/gziphandler/.travis.yml b/vendor/github.com/NYTimes/gziphandler/.travis.yml
new file mode 100644
index 000000000..f918f8d76
--- /dev/null
+++ b/vendor/github.com/NYTimes/gziphandler/.travis.yml
@@ -0,0 +1,5 @@
+language: go
+
+go:
+ - 1.7
+ - tip
diff --git a/vendor/github.com/NYTimes/gziphandler/CODE_OF_CONDUCT.md b/vendor/github.com/NYTimes/gziphandler/CODE_OF_CONDUCT.md
new file mode 100644
index 000000000..cdbca194c
--- /dev/null
+++ b/vendor/github.com/NYTimes/gziphandler/CODE_OF_CONDUCT.md
@@ -0,0 +1,75 @@
+---
+layout: code-of-conduct
+version: v1.0
+---
+
+This code of conduct outlines our expectations for participants within the **NYTimes/gziphandler** community, as well as steps to reporting unacceptable behavior. We are committed to providing a welcoming and inspiring community for all and expect our code of conduct to be honored. Anyone who violates this code of conduct may be banned from the community.
+
+Our open source community strives to:
+
+* **Be friendly and patient.**
+* **Be welcoming**: We strive to be a community that welcomes and supports people of all backgrounds and identities. This includes, but is not limited to members of any race, ethnicity, culture, national origin, colour, immigration status, social and economic class, educational level, sex, sexual orientation, gender identity and expression, age, size, family status, political belief, religion, and mental and physical ability.
+* **Be considerate**: Your work will be used by other people, and you in turn will depend on the work of others. Any decision you take will affect users and colleagues, and you should take those consequences into account when making decisions. Remember that we're a world-wide community, so you might not be communicating in someone else's primary language.
+* **Be respectful**: Not all of us will agree all the time, but disagreement is no excuse for poor behavior and poor manners. We might all experience some frustration now and then, but we cannot allow that frustration to turn into a personal attack. It’s important to remember that a community where people feel uncomfortable or threatened is not a productive one.
+* **Be careful in the words that we choose**: we are a community of professionals, and we conduct ourselves professionally. Be kind to others. Do not insult or put down other participants. Harassment and other exclusionary behavior aren't acceptable.
+* **Try to understand why we disagree**: Disagreements, both social and technical, happen all the time. It is important that we resolve disagreements and differing views constructively. Remember that we’re different. The strength of our community comes from its diversity, people from a wide range of backgrounds. Different people have different perspectives on issues. Being unable to understand why someone holds a viewpoint doesn’t mean that they’re wrong. Don’t forget that it is human to err and blaming each other doesn’t get us anywhere. Instead, focus on helping to resolve issues and learning from mistakes.
+
+## Definitions
+
+Harassment includes, but is not limited to:
+
+- Offensive comments related to gender, gender identity and expression, sexual orientation, disability, mental illness, neuro(a)typicality, physical appearance, body size, race, age, regional discrimination, political or religious affiliation
+- Unwelcome comments regarding a person’s lifestyle choices and practices, including those related to food, health, parenting, drugs, and employment
+- Deliberate misgendering. This includes deadnaming or persistently using a pronoun that does not correctly reflect a person's gender identity. You must address people by the name they give you when not addressing them by their username or handle
+- Physical contact and simulated physical contact (eg, textual descriptions like “*hug*” or “*backrub*”) without consent or after a request to stop
+- Threats of violence, both physical and psychological
+- Incitement of violence towards any individual, including encouraging a person to commit suicide or to engage in self-harm
+- Deliberate intimidation
+- Stalking or following
+- Harassing photography or recording, including logging online activity for harassment purposes
+- Sustained disruption of discussion
+- Unwelcome sexual attention, including gratuitous or off-topic sexual images or behaviour
+- Pattern of inappropriate social contact, such as requesting/assuming inappropriate levels of intimacy with others
+- Continued one-on-one communication after requests to cease
+- Deliberate “outing” of any aspect of a person’s identity without their consent except as necessary to protect others from intentional abuse
+- Publication of non-harassing private communication
+
+Our open source community prioritizes marginalized people’s safety over privileged people’s comfort. We will not act on complaints regarding:
+
+- ‘Reverse’ -isms, including ‘reverse racism,’ ‘reverse sexism,’ and ‘cisphobia’
+- Reasonable communication of boundaries, such as “leave me alone,” “go away,” or “I’m not discussing this with you”
+- Refusal to explain or debate social justice concepts
+- Communicating in a ‘tone’ you don’t find congenial
+- Criticizing racist, sexist, cissexist, or otherwise oppressive behavior or assumptions
+
+
+### Diversity Statement
+
+We encourage everyone to participate and are committed to building a community for all. Although we will fail at times, we seek to treat everyone both as fairly and equally as possible. Whenever a participant has made a mistake, we expect them to take responsibility for it. If someone has been harmed or offended, it is our responsibility to listen carefully and respectfully, and do our best to right the wrong.
+
+Although this list cannot be exhaustive, we explicitly honor diversity in age, gender, gender identity or expression, culture, ethnicity, language, national origin, political beliefs, profession, race, religion, sexual orientation, socioeconomic status, and technical ability. We will not tolerate discrimination based on any of the protected
+characteristics above, including participants with disabilities.
+
+### Reporting Issues
+
+If you experience or witness unacceptable behavior—or have any other concerns—please report it by contacting us via **code@nytimes.com**. All reports will be handled with discretion. In your report please include:
+
+- Your contact information.
+- Names (real, nicknames, or pseudonyms) of any individuals involved. If there are additional witnesses, please
+include them as well. Your account of what occurred, and if you believe the incident is ongoing. If there is a publicly available record (e.g. a mailing list archive or a public IRC logger), please include a link.
+- Any additional information that may be helpful.
+
+After filing a report, a representative will contact you personally, review the incident, follow up with any additional questions, and make a decision as to how to respond. If the person who is harassing you is part of the response team, they will recuse themselves from handling your incident. If the complaint originates from a member of the response team, it will be handled by a different member of the response team. We will respect confidentiality requests for the purpose of protecting victims of abuse.
+
+### Attribution & Acknowledgements
+
+We all stand on the shoulders of giants across many open source communities. We'd like to thank the communities and projects that established code of conducts and diversity statements as our inspiration:
+
+* [Django](https://www.djangoproject.com/conduct/reporting/)
+* [Python](https://www.python.org/community/diversity/)
+* [Ubuntu](http://www.ubuntu.com/about/about-ubuntu/conduct)
+* [Contributor Covenant](http://contributor-covenant.org/)
+* [Geek Feminism](http://geekfeminism.org/about/code-of-conduct/)
+* [Citizen Code of Conduct](http://citizencodeofconduct.org/)
+
+This Code of Conduct was based on https://github.com/todogroup/opencodeofconduct
diff --git a/vendor/github.com/NYTimes/gziphandler/CONTRIBUTING.md b/vendor/github.com/NYTimes/gziphandler/CONTRIBUTING.md
new file mode 100644
index 000000000..b89a9eb4f
--- /dev/null
+++ b/vendor/github.com/NYTimes/gziphandler/CONTRIBUTING.md
@@ -0,0 +1,30 @@
+# Contributing to NYTimes/gziphandler
+
+This is an open source project started by handful of developers at The New York Times and open to the entire Go community.
+
+We really appreciate your help!
+
+## Filing issues
+
+When filing an issue, make sure to answer these five questions:
+
+1. What version of Go are you using (`go version`)?
+2. What operating system and processor architecture are you using?
+3. What did you do?
+4. What did you expect to see?
+5. What did you see instead?
+
+## Contributing code
+
+Before submitting changes, please follow these guidelines:
+
+1. Check the open issues and pull requests for existing discussions.
+2. Open an issue to discuss a new feature.
+3. Write tests.
+4. Make sure code follows the ['Go Code Review Comments'](https://github.com/golang/go/wiki/CodeReviewComments).
+5. Make sure your changes pass `go test`.
+6. Make sure the entire test suite passes locally and on Travis CI.
+7. Open a Pull Request.
+8. [Squash your commits](http://gitready.com/advanced/2009/02/10/squashing-commits-with-rebase.html) after receiving feedback and add a [great commit message](http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html).
+
+Unless otherwise noted, the gziphandler source files are distributed under the Apache 2.0-style license found in the LICENSE.md file.
diff --git a/vendor/github.com/NYTimes/gziphandler/gzip.go b/vendor/github.com/NYTimes/gziphandler/gzip.go
index ee1526f42..39e8c5e75 100644
--- a/vendor/github.com/NYTimes/gziphandler/gzip.go
+++ b/vendor/github.com/NYTimes/gziphandler/gzip.go
@@ -13,6 +13,8 @@ const (
vary = "Vary"
acceptEncoding = "Accept-Encoding"
contentEncoding = "Content-Encoding"
+ contentType = "Content-Type"
+ contentLength = "Content-Length"
)
type codings map[string]float64
@@ -22,57 +24,160 @@ type codings map[string]float64
// The examples seem to indicate that it is.
const DEFAULT_QVALUE = 1.0
-var gzipWriterPool = sync.Pool{
- New: func() interface{} { return gzip.NewWriter(nil) },
+// gzipWriterPools stores a sync.Pool for each compression level for reuse of
+// gzip.Writers. Use poolIndex to covert a compression level to an index into
+// gzipWriterPools.
+var gzipWriterPools [gzip.BestCompression - gzip.BestSpeed + 2]*sync.Pool
+
+func init() {
+ for i := gzip.BestSpeed; i <= gzip.BestCompression; i++ {
+ addLevelPool(i)
+ }
+ addLevelPool(gzip.DefaultCompression)
+}
+
+// poolIndex maps a compression level to its index into gzipWriterPools. It
+// assumes that level is a valid gzip compression level.
+func poolIndex(level int) int {
+ // gzip.DefaultCompression == -1, so we need to treat it special.
+ if level == gzip.DefaultCompression {
+ return gzip.BestCompression - gzip.BestSpeed + 1
+ }
+ return level - gzip.BestSpeed
+}
+
+func addLevelPool(level int) {
+ gzipWriterPools[poolIndex(level)] = &sync.Pool{
+ New: func() interface{} {
+ // NewWriterLevel only returns error on a bad level, we are guaranteeing
+ // that this will be a valid level so it is okay to ignore the returned
+ // error.
+ w, _ := gzip.NewWriterLevel(nil, level)
+ return w
+ },
+ }
}
// GzipResponseWriter provides an http.ResponseWriter interface, which gzips
-// bytes before writing them to the underlying response. This doesn't set the
-// Content-Encoding header, nor close the writers, so don't forget to do that.
+// bytes before writing them to the underlying response. This doesn't close the
+// writers, so don't forget to do that.
type GzipResponseWriter struct {
- gw *gzip.Writer
http.ResponseWriter
+ index int // Index for gzipWriterPools.
+ gw *gzip.Writer
}
// Write appends data to the gzip writer.
-func (w GzipResponseWriter) Write(b []byte) (int, error) {
- if _, ok := w.Header()["Content-Type"]; !ok {
+func (w *GzipResponseWriter) Write(b []byte) (int, error) {
+ // Lazily create the gzip.Writer, this allows empty bodies to be actually
+ // empty, for example in the case of status code 204 (no content).
+ if w.gw == nil {
+ w.init()
+ }
+
+ if _, ok := w.Header()[contentType]; !ok {
// If content type is not set, infer it from the uncompressed body.
- w.Header().Set("Content-Type", http.DetectContentType(b))
+ w.Header().Set(contentType, http.DetectContentType(b))
}
return w.gw.Write(b)
}
+// WriteHeader will check if the gzip writer needs to be lazily initiated and
+// then pass the code along to the underlying ResponseWriter.
+func (w *GzipResponseWriter) WriteHeader(code int) {
+ if w.gw == nil &&
+ code != http.StatusNotModified && code != http.StatusNoContent {
+ w.init()
+ }
+ w.ResponseWriter.WriteHeader(code)
+}
+
+// init graps a new gzip writer from the gzipWriterPool and writes the correct
+// content encoding header.
+func (w *GzipResponseWriter) init() {
+ // Bytes written during ServeHTTP are redirected to this gzip writer
+ // before being written to the underlying response.
+ gzw := gzipWriterPools[w.index].Get().(*gzip.Writer)
+ gzw.Reset(w.ResponseWriter)
+ w.gw = gzw
+ w.ResponseWriter.Header().Set(contentEncoding, "gzip")
+ // if the Content-Length is already set, then calls to Write on gzip
+ // will fail to set the Content-Length header since its already set
+ // See: https://github.com/golang/go/issues/14975
+ w.ResponseWriter.Header().Del(contentLength)
+}
+
+// Close will close the gzip.Writer and will put it back in the gzipWriterPool.
+func (w *GzipResponseWriter) Close() error {
+ if w.gw == nil {
+ return nil
+ }
+
+ err := w.gw.Close()
+ gzipWriterPools[w.index].Put(w.gw)
+ return err
+}
+
// Flush flushes the underlying *gzip.Writer and then the underlying
// http.ResponseWriter if it is an http.Flusher. This makes GzipResponseWriter
// an http.Flusher.
-func (w GzipResponseWriter) Flush() {
- w.gw.Flush()
+func (w *GzipResponseWriter) Flush() {
+ if w.gw != nil {
+ w.gw.Flush()
+ }
+
if fw, ok := w.ResponseWriter.(http.Flusher); ok {
fw.Flush()
}
}
+// MustNewGzipLevelHandler behaves just like NewGzipLevelHandler except that in
+// an error case it panics rather than returning an error.
+func MustNewGzipLevelHandler(level int) func(http.Handler) http.Handler {
+ wrap, err := NewGzipLevelHandler(level)
+ if err != nil {
+ panic(err)
+ }
+ return wrap
+}
+
+// NewGzipLevelHandler returns a wrapper function (often known as middleware)
+// which can be used to wrap an HTTP handler to transparently gzip the response
+// body if the client supports it (via the Accept-Encoding header). Responses will
+// be encoded at the given gzip compression level. An error will be returned only
+// if an invalid gzip compression level is given, so if one can ensure the level
+// is valid, the returned error can be safely ignored.
+func NewGzipLevelHandler(level int) (func(http.Handler) http.Handler, error) {
+ if level != gzip.DefaultCompression && (level < gzip.BestSpeed || level > gzip.BestCompression) {
+ return nil, fmt.Errorf("invalid compression level requested: %d", level)
+ }
+ return func(h http.Handler) http.Handler {
+ index := poolIndex(level)
+
+ return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ w.Header().Add(vary, acceptEncoding)
+
+ if acceptsGzip(r) {
+ gw := &GzipResponseWriter{
+ ResponseWriter: w,
+ index: index,
+ }
+ defer gw.Close()
+
+ h.ServeHTTP(gw, r)
+ } else {
+ h.ServeHTTP(w, r)
+ }
+ })
+ }, nil
+}
+
// GzipHandler wraps an HTTP handler, to transparently gzip the response body if
-// the client supports it (via the Accept-Encoding header).
+// the client supports it (via the Accept-Encoding header). This will compress at
+// the default compression level.
func GzipHandler(h http.Handler) http.Handler {
- return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
- w.Header().Add(vary, acceptEncoding)
-
- if acceptsGzip(r) {
- // Bytes written during ServeHTTP are redirected to this gzip writer
- // before being written to the underlying response.
- gzw := gzipWriterPool.Get().(*gzip.Writer)
- defer gzipWriterPool.Put(gzw)
- gzw.Reset(w)
- defer gzw.Close()
-
- w.Header().Set(contentEncoding, "gzip")
- h.ServeHTTP(GzipResponseWriter{gzw, w}, r)
- } else {
- h.ServeHTTP(w, r)
- }
- })
+ wrapper, _ := NewGzipLevelHandler(gzip.DefaultCompression)
+ return wrapper(h)
}
// acceptsGzip returns true if the given HTTP request indicates that it will
@@ -84,21 +189,20 @@ func acceptsGzip(r *http.Request) bool {
// parseEncodings attempts to parse a list of codings, per RFC 2616, as might
// appear in an Accept-Encoding header. It returns a map of content-codings to
-// quality values, and an error containing the errors encounted. It's probably
+// quality values, and an error containing the errors encountered. It's probably
// safe to ignore those, because silently ignoring errors is how the internet
// works.
//
-// See: http://tools.ietf.org/html/rfc2616#section-14.3
+// See: http://tools.ietf.org/html/rfc2616#section-14.3.
func parseEncodings(s string) (codings, error) {
c := make(codings)
- e := make([]string, 0)
+ var e []string
for _, ss := range strings.Split(s, ",") {
coding, qvalue, err := parseCoding(ss)
if err != nil {
e = append(e, err.Error())
-
} else {
c[coding] = qvalue
}
@@ -123,13 +227,11 @@ func parseCoding(s string) (coding string, qvalue float64, err error) {
if n == 0 {
coding = strings.ToLower(part)
-
} else if strings.HasPrefix(part, "q=") {
qvalue, err = strconv.ParseFloat(strings.TrimPrefix(part, "q="), 64)
if qvalue < 0.0 {
qvalue = 0.0
-
} else if qvalue > 1.0 {
qvalue = 1.0
}
diff --git a/vendor/github.com/NYTimes/gziphandler/gzip_test.go b/vendor/github.com/NYTimes/gziphandler/gzip_test.go
index 9a62bcbaa..f2d44e04f 100644
--- a/vendor/github.com/NYTimes/gziphandler/gzip_test.go
+++ b/vendor/github.com/NYTimes/gziphandler/gzip_test.go
@@ -3,10 +3,14 @@ package gziphandler
import (
"bytes"
"compress/gzip"
+ "fmt"
"io"
"io/ioutil"
+ "net"
"net/http"
"net/http/httptest"
+ "net/url"
+ "strconv"
"testing"
"github.com/stretchr/testify/assert"
@@ -17,15 +21,15 @@ func TestParseEncodings(t *testing.T) {
examples := map[string]codings{
// Examples from RFC 2616
- "compress, gzip": codings{"compress": 1.0, "gzip": 1.0},
- "": codings{},
- "*": codings{"*": 1.0},
- "compress;q=0.5, gzip;q=1.0": codings{"compress": 0.5, "gzip": 1.0},
- "gzip;q=1.0, identity; q=0.5, *;q=0": codings{"gzip": 1.0, "identity": 0.5, "*": 0.0},
+ "compress, gzip": {"compress": 1.0, "gzip": 1.0},
+ "": {},
+ "*": {"*": 1.0},
+ "compress;q=0.5, gzip;q=1.0": {"compress": 0.5, "gzip": 1.0},
+ "gzip;q=1.0, identity; q=0.5, *;q=0": {"gzip": 1.0, "identity": 0.5, "*": 0.0},
// More random stuff
- "AAA;q=1": codings{"aaa": 1.0},
- "BBB ; q = 2": codings{"bbb": 1.0},
+ "AAA;q=1": {"aaa": 1.0},
+ "BBB ; q = 2": {"bbb": 1.0},
}
for eg, exp := range examples {
@@ -43,25 +47,27 @@ func TestGzipHandler(t *testing.T) {
// requests without accept-encoding are passed along as-is
req1, _ := http.NewRequest("GET", "/whatever", nil)
- res1 := httptest.NewRecorder()
- handler.ServeHTTP(res1, req1)
+ resp1 := httptest.NewRecorder()
+ handler.ServeHTTP(resp1, req1)
+ res1 := resp1.Result()
- assert.Equal(t, 200, res1.Code)
- assert.Equal(t, "", res1.Header().Get("Content-Encoding"))
- assert.Equal(t, "Accept-Encoding", res1.Header().Get("Vary"))
- assert.Equal(t, testBody, res1.Body.String())
+ assert.Equal(t, 200, res1.StatusCode)
+ assert.Equal(t, "", res1.Header.Get("Content-Encoding"))
+ assert.Equal(t, "Accept-Encoding", res1.Header.Get("Vary"))
+ assert.Equal(t, testBody, resp1.Body.String())
// but requests with accept-encoding:gzip are compressed if possible
req2, _ := http.NewRequest("GET", "/whatever", nil)
req2.Header.Set("Accept-Encoding", "gzip")
- res2 := httptest.NewRecorder()
- handler.ServeHTTP(res2, req2)
+ resp2 := httptest.NewRecorder()
+ handler.ServeHTTP(resp2, req2)
+ res2 := resp2.Result()
- assert.Equal(t, 200, res2.Code)
- assert.Equal(t, "gzip", res2.Header().Get("Content-Encoding"))
- assert.Equal(t, "Accept-Encoding", res2.Header().Get("Vary"))
- assert.Equal(t, gzipStr(testBody), res2.Body.Bytes())
+ assert.Equal(t, 200, res2.StatusCode)
+ assert.Equal(t, "gzip", res2.Header.Get("Content-Encoding"))
+ assert.Equal(t, "Accept-Encoding", res2.Header.Get("Vary"))
+ assert.Equal(t, gzipStrLevel(testBody, gzip.DefaultCompression), resp2.Body.Bytes())
// content-type header is correctly set based on uncompressed body
@@ -73,6 +79,142 @@ func TestGzipHandler(t *testing.T) {
assert.Equal(t, http.DetectContentType([]byte(testBody)), res3.Header().Get("Content-Type"))
}
+func TestNewGzipLevelHandler(t *testing.T) {
+ testBody := "aaabbbccc"
+ handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ w.WriteHeader(http.StatusOK)
+ io.WriteString(w, testBody)
+ })
+
+ for lvl := gzip.BestSpeed; lvl <= gzip.BestCompression; lvl++ {
+ wrapper, err := NewGzipLevelHandler(lvl)
+ if !assert.Nil(t, err, "NewGzipLevleHandler returned error for level:", lvl) {
+ continue
+ }
+
+ req, _ := http.NewRequest("GET", "/whatever", nil)
+ req.Header.Set("Accept-Encoding", "gzip")
+ resp := httptest.NewRecorder()
+ wrapper(handler).ServeHTTP(resp, req)
+ res := resp.Result()
+
+ assert.Equal(t, 200, res.StatusCode)
+ assert.Equal(t, "gzip", res.Header.Get("Content-Encoding"))
+ assert.Equal(t, "Accept-Encoding", res.Header.Get("Vary"))
+ assert.Equal(t, gzipStrLevel(testBody, lvl), resp.Body.Bytes())
+
+ }
+}
+
+func TestNewGzipLevelHandlerReturnsErrorForInvalidLevels(t *testing.T) {
+ var err error
+ _, err = NewGzipLevelHandler(-42)
+ assert.NotNil(t, err)
+
+ _, err = NewGzipLevelHandler(42)
+ assert.NotNil(t, err)
+}
+
+func TestMustNewGzipLevelHandlerWillPanic(t *testing.T) {
+ defer func() {
+ if r := recover(); r == nil {
+ t.Error("panic was not called")
+ }
+ }()
+
+ _ = MustNewGzipLevelHandler(-42)
+}
+
+func TestGzipHandlerNoBody(t *testing.T) {
+ tests := []struct {
+ statusCode int
+ contentEncoding string
+ bodyLen int
+ }{
+ // Body must be empty.
+ {http.StatusNoContent, "", 0},
+ {http.StatusNotModified, "", 0},
+ // Body is going to get gzip'd no matter what.
+ {http.StatusOK, "gzip", 23},
+ }
+
+ for num, test := range tests {
+ handler := GzipHandler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ w.WriteHeader(test.statusCode)
+ }))
+
+ rec := httptest.NewRecorder()
+ // TODO: in Go1.7 httptest.NewRequest was introduced this should be used
+ // once 1.6 is not longer supported.
+ req := &http.Request{
+ Method: "GET",
+ URL: &url.URL{Path: "/"},
+ Proto: "HTTP/1.1",
+ ProtoMinor: 1,
+ RemoteAddr: "192.0.2.1:1234",
+ Header: make(http.Header),
+ }
+ req.Header.Set("Accept-Encoding", "gzip")
+ handler.ServeHTTP(rec, req)
+
+ body, err := ioutil.ReadAll(rec.Body)
+ if err != nil {
+ t.Fatalf("Unexpected error reading response body: %v", err)
+ }
+
+ header := rec.Header()
+ assert.Equal(t, test.contentEncoding, header.Get("Content-Encoding"), fmt.Sprintf("for test iteration %d", num))
+ assert.Equal(t, "Accept-Encoding", header.Get("Vary"), fmt.Sprintf("for test iteration %d", num))
+ assert.Equal(t, test.bodyLen, len(body), fmt.Sprintf("for test iteration %d", num))
+ }
+}
+
+func TestGzipHandlerContentLength(t *testing.T) {
+ b := []byte("testtesttesttesttesttesttesttesttesttesttesttesttest")
+ handler := GzipHandler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ w.Header().Set("Content-Length", strconv.Itoa(len(b)))
+ w.Write(b)
+ }))
+ // httptest.NewRecorder doesn't give you access to the Content-Length
+ // header so instead, we create a server on a random port and make
+ // a request to that instead
+ ln, err := net.Listen("tcp", "127.0.0.1:")
+ if err != nil {
+ t.Fatalf("failed creating listen socket: %v", err)
+ }
+ defer ln.Close()
+ srv := &http.Server{
+ Handler: handler,
+ }
+ go srv.Serve(ln)
+
+ req := &http.Request{
+ Method: "GET",
+ URL: &url.URL{Path: "/", Scheme: "http", Host: ln.Addr().String()},
+ Header: make(http.Header),
+ Close: true,
+ }
+ req.Header.Set("Accept-Encoding", "gzip")
+ res, err := http.DefaultClient.Do(req)
+ if err != nil {
+ t.Fatalf("Unexpected error making http request: %v", err)
+ }
+ defer res.Body.Close()
+
+ body, err := ioutil.ReadAll(res.Body)
+ if err != nil {
+ t.Fatalf("Unexpected error reading response body: %v", err)
+ }
+
+ l, err := strconv.Atoi(res.Header.Get("Content-Length"))
+ if err != nil {
+ t.Fatalf("Unexpected error parsing Content-Length: %v", err)
+ }
+ assert.Len(t, body, l)
+ assert.Equal(t, "gzip", res.Header.Get("Content-Encoding"))
+ assert.NotEqual(t, b, body)
+}
+
// --------------------------------------------------------------------
func BenchmarkGzipHandler_S2k(b *testing.B) { benchmark(b, false, 2048) }
@@ -84,9 +226,9 @@ func BenchmarkGzipHandler_P100k(b *testing.B) { benchmark(b, true, 102400) }
// --------------------------------------------------------------------
-func gzipStr(s string) []byte {
+func gzipStrLevel(s string, lvl int) []byte {
var b bytes.Buffer
- w := gzip.NewWriter(&b)
+ w, _ := gzip.NewWriterLevel(&b, lvl)
io.WriteString(w, s)
w.Close()
return b.Bytes()
diff --git a/vendor/github.com/braintree/manners/README.md b/vendor/github.com/braintree/manners/README.md
index 09f6f9693..78e0fc01a 100644
--- a/vendor/github.com/braintree/manners/README.md
+++ b/vendor/github.com/braintree/manners/README.md
@@ -23,10 +23,6 @@ Manners ensures that all requests are served by incrementing a WaitGroup when a
If your request handler spawns Goroutines that are not guaranteed to finish with the request, you can ensure they are also completed with the `StartRoutine` and `FinishRoutine` functions on the server.
-### Known Issues
-
-Manners does not correctly shut down long-lived keepalive connections when issued a shutdown command. Clients on an idle keepalive connection may see a connection reset error rather than a close. See https://github.com/braintree/manners/issues/13 for details.
-
### Compatability
Manners 0.3.0 and above uses standard library functionality introduced in Go 1.3.
diff --git a/vendor/github.com/braintree/manners/helpers_test.go b/vendor/github.com/braintree/manners/helpers_test.go
index 3c11a081d..ba1422cb4 100644
--- a/vendor/github.com/braintree/manners/helpers_test.go
+++ b/vendor/github.com/braintree/manners/helpers_test.go
@@ -3,27 +3,30 @@ package manners
import (
"bufio"
"crypto/tls"
+ "errors"
"io/ioutil"
"net"
"net/http"
+ "os"
+ "sync"
"testing"
)
+func newServer() *GracefulServer {
+ return NewWithServer(new(http.Server))
+}
+
// a simple step-controllable http client
type client struct {
tls bool
addr net.Addr
connected chan error
sendrequest chan bool
- response chan *rawResponse
+ idle chan error
+ idlerelease chan bool
closed chan bool
}
-type rawResponse struct {
- body []string
- err error
-}
-
func (c *client) Run() {
go func() {
var err error
@@ -39,21 +42,19 @@ func (c *client) Run() {
for <-c.sendrequest {
_, err = conn.Write([]byte("GET / HTTP/1.1\nHost: localhost:8000\n\n"))
if err != nil {
- c.response <- &rawResponse{err: err}
+ c.idle <- err
}
// Read response; no content
scanner := bufio.NewScanner(conn)
- var lines []string
for scanner.Scan() {
// our null handler doesn't send a body, so we know the request is
// done when we reach the blank line after the headers
- line := scanner.Text()
- if line == "" {
+ if scanner.Text() == "" {
break
}
- lines = append(lines, line)
}
- c.response <- &rawResponse{lines, scanner.Err()}
+ c.idle <- scanner.Err()
+ <-c.idlerelease
}
conn.Close()
ioutil.ReadAll(conn)
@@ -67,7 +68,8 @@ func newClient(addr net.Addr, tls bool) *client {
tls: tls,
connected: make(chan error),
sendrequest: make(chan bool),
- response: make(chan *rawResponse),
+ idle: make(chan error),
+ idlerelease: make(chan bool),
closed: make(chan bool),
}
}
@@ -86,6 +88,7 @@ func startGenericServer(t *testing.T, server *GracefulServer, statechanged chan
}
}
+ //server.up = make(chan chan bool))
server.up = make(chan net.Listener)
exitchan := make(chan error)
@@ -117,3 +120,115 @@ func startTLSServer(t *testing.T, server *GracefulServer, certFile, keyFile stri
return startGenericServer(t, server, statechanged, runner)
}
+
+type tempFile struct {
+ *os.File
+}
+
+func newTempFile(content []byte) (*tempFile, error) {
+ f, err := ioutil.TempFile("", "graceful-test")
+ if err != nil {
+ return nil, err
+ }
+
+ f.Write(content)
+ return &tempFile{f}, nil
+}
+
+func (tf *tempFile) Unlink() {
+ if tf.File != nil {
+ os.Remove(tf.Name())
+ tf.File = nil
+ }
+}
+
+type testWg struct {
+ sync.Mutex
+ count int
+ waitCalled chan int
+}
+
+func newTestWg() *testWg {
+ return &testWg{
+ waitCalled: make(chan int, 1),
+ }
+}
+
+func (wg *testWg) Add(delta int) {
+ wg.Lock()
+ wg.count++
+ wg.Unlock()
+}
+
+func (wg *testWg) Done() {
+ wg.Lock()
+ wg.count--
+ wg.Unlock()
+}
+
+func (wg *testWg) Wait() {
+ wg.Lock()
+ wg.waitCalled <- wg.count
+ wg.Unlock()
+}
+
+type fakeConn struct {
+ net.Conn
+ closeCalled bool
+}
+
+func (c *fakeConn) Close() error {
+ c.closeCalled = true
+ return nil
+}
+
+type fakeListener struct {
+ acceptRelease chan bool
+ closeCalled chan bool
+}
+
+func newFakeListener() *fakeListener { return &fakeListener{make(chan bool, 1), make(chan bool, 1)} }
+
+func (l *fakeListener) Addr() net.Addr {
+ addr, _ := net.ResolveTCPAddr("tcp", "127.0.0.1:8080")
+ return addr
+}
+
+func (l *fakeListener) Close() error {
+ l.closeCalled <- true
+ l.acceptRelease <- true
+ return nil
+}
+
+func (l *fakeListener) Accept() (net.Conn, error) {
+ <-l.acceptRelease
+ return nil, errors.New("connection closed")
+}
+
+// localhostCert is a PEM-encoded TLS cert with SAN IPs
+// "127.0.0.1" and "[::1]", expiring at the last second of 2049 (the end
+// of ASN.1 time).
+// generated from src/pkg/crypto/tls:
+// go run generate_cert.go --rsa-bits 512 --host 127.0.0.1,::1,example.com --ca --start-date "Jan 1 00:00:00 1970" --duration=1000000h
+var (
+ localhostCert = []byte(`-----BEGIN CERTIFICATE-----
+MIIBdzCCASOgAwIBAgIBADALBgkqhkiG9w0BAQUwEjEQMA4GA1UEChMHQWNtZSBD
+bzAeFw03MDAxMDEwMDAwMDBaFw00OTEyMzEyMzU5NTlaMBIxEDAOBgNVBAoTB0Fj
+bWUgQ28wWjALBgkqhkiG9w0BAQEDSwAwSAJBAN55NcYKZeInyTuhcCwFMhDHCmwa
+IUSdtXdcbItRB/yfXGBhiex00IaLXQnSU+QZPRZWYqeTEbFSgihqi1PUDy8CAwEA
+AaNoMGYwDgYDVR0PAQH/BAQDAgCkMBMGA1UdJQQMMAoGCCsGAQUFBwMBMA8GA1Ud
+EwEB/wQFMAMBAf8wLgYDVR0RBCcwJYILZXhhbXBsZS5jb22HBH8AAAGHEAAAAAAA
+AAAAAAAAAAAAAAEwCwYJKoZIhvcNAQEFA0EAAoQn/ytgqpiLcZu9XKbCJsJcvkgk
+Se6AbGXgSlq+ZCEVo0qIwSgeBqmsJxUu7NCSOwVJLYNEBO2DtIxoYVk+MA==
+-----END CERTIFICATE-----`)
+
+ localhostKey = []byte(`-----BEGIN RSA PRIVATE KEY-----
+MIIBPAIBAAJBAN55NcYKZeInyTuhcCwFMhDHCmwaIUSdtXdcbItRB/yfXGBhiex0
+0IaLXQnSU+QZPRZWYqeTEbFSgihqi1PUDy8CAwEAAQJBAQdUx66rfh8sYsgfdcvV
+NoafYpnEcB5s4m/vSVe6SU7dCK6eYec9f9wpT353ljhDUHq3EbmE4foNzJngh35d
+AekCIQDhRQG5Li0Wj8TM4obOnnXUXf1jRv0UkzE9AHWLG5q3AwIhAPzSjpYUDjVW
+MCUXgckTpKCuGwbJk7424Nb8bLzf3kllAiA5mUBgjfr/WtFSJdWcPQ4Zt9KTMNKD
+EUO0ukpTwEIl6wIhAMbGqZK3zAAFdq8DD2jPx+UJXnh0rnOkZBzDtJ6/iN69AiEA
+1Aq8MJgTaYsDQWyU/hDq5YkDJc9e9DSCvUIzqxQWMQE=
+-----END RSA PRIVATE KEY-----`)
+)
diff --git a/vendor/github.com/braintree/manners/interfaces.go b/vendor/github.com/braintree/manners/interfaces.go
deleted file mode 100644
index fd0732857..000000000
--- a/vendor/github.com/braintree/manners/interfaces.go
+++ /dev/null
@@ -1,7 +0,0 @@
-package manners
-
-type waitGroup interface {
- Add(int)
- Done()
- Wait()
-}
diff --git a/vendor/github.com/braintree/manners/server.go b/vendor/github.com/braintree/manners/server.go
index dfd3b873b..d51d99b81 100644
--- a/vendor/github.com/braintree/manners/server.go
+++ b/vendor/github.com/braintree/manners/server.go
@@ -60,32 +60,29 @@ import (
type GracefulServer struct {
*http.Server
- shutdown chan bool
- shutdownFinished chan bool
- wg waitGroup
- routinesCount int
+ shutdown chan bool
+ wg waitGroup
- lcsmu sync.RWMutex
- connections map[net.Conn]bool
+ lcsmu sync.RWMutex
+ lastConnState map[net.Conn]http.ConnState
up chan net.Listener // Only used by test code.
}
-// NewServer creates a new GracefulServer.
-func NewServer() *GracefulServer {
- return NewWithServer(new(http.Server))
+type waitGroup interface {
+ Add(int)
+ Done()
+ Wait()
}
// NewWithServer wraps an existing http.Server object and returns a
// GracefulServer that supports all of the original Server operations.
func NewWithServer(s *http.Server) *GracefulServer {
return &GracefulServer{
- Server: s,
- shutdown: make(chan bool),
- shutdownFinished: make(chan bool, 1),
- wg: new(sync.WaitGroup),
- routinesCount: 0,
- connections: make(map[net.Conn]bool),
+ Server: s,
+ shutdown: make(chan bool),
+ wg: new(sync.WaitGroup),
+ lastConnState: make(map[net.Conn]http.ConnState),
}
}
@@ -95,14 +92,6 @@ func (s *GracefulServer) Close() bool {
return <-s.shutdown
}
-// BlockingClose is similar to Close, except that it blocks until the last
-// connection has been closed.
-func (s *GracefulServer) BlockingClose() bool {
- result := s.Close()
- <-s.shutdownFinished
- return result
-}
-
// ListenAndServe provides a graceful equivalent of net/http.Serve.ListenAndServe.
func (s *GracefulServer) ListenAndServe() error {
addr := s.Addr
@@ -149,64 +138,56 @@ func (s *GracefulServer) ListenAndServeTLS(certFile, keyFile string) error {
// Serve provides a graceful equivalent net/http.Server.Serve.
func (s *GracefulServer) Serve(listener net.Listener) error {
- // Wrap the server HTTP handler into graceful one, that will close kept
- // alive connections if a new request is received after shutdown.
- gracefulHandler := newGracefulHandler(s.Server.Handler)
- s.Server.Handler = gracefulHandler
-
- // Start a goroutine that waits for a shutdown signal and will stop the
- // listener when it receives the signal. That in turn will result in
- // unblocking of the http.Serve call.
+ var closing int32
+
go func() {
s.shutdown <- true
close(s.shutdown)
- gracefulHandler.Close()
+ atomic.StoreInt32(&closing, 1)
s.Server.SetKeepAlivesEnabled(false)
listener.Close()
}()
originalConnState := s.Server.ConnState
-
- // s.ConnState is invoked by the net/http.Server every time a connection
- // changes state. It keeps track of each connection's state over time,
- // enabling manners to handle persisted connections correctly.
s.ConnState = func(conn net.Conn, newState http.ConnState) {
s.lcsmu.RLock()
- protected := s.connections[conn]
+ lastConnState := s.lastConnState[conn]
s.lcsmu.RUnlock()
switch newState {
-
case http.StateNew:
// New connection -> StateNew
- protected = true
s.StartRoutine()
case http.StateActive:
// (StateNew, StateIdle) -> StateActive
- if gracefulHandler.IsClosed() {
- conn.Close()
- break
+ if lastConnState == http.StateIdle {
+ // The connection transitioned from idle back to active
+ s.StartRoutine()
}
- if !protected {
- protected = true
- s.StartRoutine()
+ case http.StateIdle:
+ // StateActive -> StateIdle
+ // Immediately close newly idle connections; if not they may make
+ // one more request before SetKeepAliveEnabled(false) takes effect.
+ if atomic.LoadInt32(&closing) == 1 {
+ conn.Close()
}
+ s.FinishRoutine()
- default:
- // (StateNew, StateActive) -> (StateIdle, StateClosed, StateHiJacked)
- if protected {
+ case http.StateClosed, http.StateHijacked:
+ // (StateNew, StateActive, StateIdle) -> (StateClosed, StateHiJacked)
+ // If the connection was idle we do not need to decrement the counter.
+ if lastConnState != http.StateIdle {
s.FinishRoutine()
- protected = false
}
}
s.lcsmu.Lock()
if newState == http.StateClosed || newState == http.StateHijacked {
- delete(s.connections, conn)
+ delete(s.lastConnState, conn)
} else {
- s.connections[conn] = protected
+ s.lastConnState[conn] = newState
}
s.lcsmu.Unlock()
@@ -220,16 +201,15 @@ func (s *GracefulServer) Serve(listener net.Listener) error {
if s.up != nil {
s.up <- listener
}
-
err := s.Server.Serve(listener)
- // An error returned on shutdown is not worth reporting.
- if err != nil && gracefulHandler.IsClosed() {
- err = nil
+
+ // This block is reached when the server has received a shut down command
+ // or a real error happened.
+ if err == nil || atomic.LoadInt32(&closing) == 1 {
+ s.wg.Wait()
+ return nil
}
- // Wait for pending requests to complete regardless the Serve result.
- s.wg.Wait()
- s.shutdownFinished <- true
return err
}
@@ -237,56 +217,11 @@ func (s *GracefulServer) Serve(listener net.Listener) error {
// starts more goroutines and these goroutines are not guaranteed to finish
// before the request.
func (s *GracefulServer) StartRoutine() {
- s.lcsmu.Lock()
- defer s.lcsmu.Unlock()
s.wg.Add(1)
- s.routinesCount++
}
// FinishRoutine decrements the server's WaitGroup. Use this to complement
// StartRoutine().
func (s *GracefulServer) FinishRoutine() {
- s.lcsmu.Lock()
- defer s.lcsmu.Unlock()
s.wg.Done()
- s.routinesCount--
-}
-
-// RoutinesCount returns the number of currently running routines
-func (s *GracefulServer) RoutinesCount() int {
- s.lcsmu.RLock()
- defer s.lcsmu.RUnlock()
- return s.routinesCount
-}
-
-// gracefulHandler is used by GracefulServer to prevent calling ServeHTTP on
-// to be closed kept-alive connections during the server shutdown.
-type gracefulHandler struct {
- closed int32 // accessed atomically.
- wrapped http.Handler
-}
-
-func newGracefulHandler(wrapped http.Handler) *gracefulHandler {
- return &gracefulHandler{
- wrapped: wrapped,
- }
-}
-
-func (gh *gracefulHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
- if atomic.LoadInt32(&gh.closed) == 0 {
- gh.wrapped.ServeHTTP(w, r)
- return
- }
- r.Body.Close()
- // Server is shutting down at this moment, and the connection that this
- // handler is being called on is about to be closed. So we do not need to
- // actually execute the handler logic.
-}
-
-func (gh *gracefulHandler) Close() {
- atomic.StoreInt32(&gh.closed, 1)
-}
-
-func (gh *gracefulHandler) IsClosed() bool {
- return atomic.LoadInt32(&gh.closed) == 1
}
diff --git a/vendor/github.com/braintree/manners/server_test.go b/vendor/github.com/braintree/manners/server_test.go
index 994284216..108863040 100644
--- a/vendor/github.com/braintree/manners/server_test.go
+++ b/vendor/github.com/braintree/manners/server_test.go
@@ -5,34 +5,13 @@ import (
"net/http"
"testing"
"time"
-
- helpers "github.com/braintree/manners/test_helpers"
)
-type httpInterface interface {
- ListenAndServe() error
- ListenAndServeTLS(certFile, keyFile string) error
- Serve(listener net.Listener) error
-}
-
-// Test that the method signatures of the methods we override from net/http/Server match those of the original.
-func TestInterface(t *testing.T) {
- var original, ours interface{}
- original = &http.Server{}
- ours = &GracefulServer{}
- if _, ok := original.(httpInterface); !ok {
- t.Errorf("httpInterface definition does not match the canonical server!")
- }
- if _, ok := ours.(httpInterface); !ok {
- t.Errorf("GracefulServer does not implement httpInterface")
- }
-}
-
// Tests that the server allows in-flight requests to complete
// before shutting down.
func TestGracefulness(t *testing.T) {
- server := NewServer()
- wg := helpers.NewWaitGroup()
+ server := newServer()
+ wg := newTestWg()
server.wg = wg
statechanged := make(chan http.ConnState)
listener, exitchan := startServer(t, server, statechanged)
@@ -44,13 +23,14 @@ func TestGracefulness(t *testing.T) {
if err := <-client.connected; err != nil {
t.Fatal("Client failed to connect to server", err)
}
- // Even though the client is connected, the server ConnState handler may
- // not know about that yet. So wait until it is called.
- waitForState(t, statechanged, http.StateNew, "Request not received")
+ // avoid a race between the client connection and the server accept
+ if state := <-statechanged; state != http.StateNew {
+ t.Fatal("Unexpected state", state)
+ }
server.Close()
- waiting := <-wg.WaitCalled
+ waiting := <-wg.waitCalled
if waiting < 1 {
t.Errorf("Expected the waitgroup to equal 1 at shutdown; actually %d", waiting)
}
@@ -64,23 +44,11 @@ func TestGracefulness(t *testing.T) {
}
}
-// Tests that starting the server and closing in 2 new, separate goroutines doesnot
-// get flagged by the race detector (need to run 'go test' w/the -race flag)
-func TestRacyClose(t *testing.T) {
- go func() {
- ListenAndServe(":9000", nil)
- }()
-
- go func() {
- Close()
- }()
-}
-
// Tests that the server begins to shut down when told to and does not accept
// new requests once shutdown has begun
func TestShutdown(t *testing.T) {
- server := NewServer()
- wg := helpers.NewWaitGroup()
+ server := newServer()
+ wg := newTestWg()
server.wg = wg
statechanged := make(chan http.ConnState)
listener, exitchan := startServer(t, server, statechanged)
@@ -92,9 +60,10 @@ func TestShutdown(t *testing.T) {
if err := <-client1.connected; err != nil {
t.Fatal("Client failed to connect to server", err)
}
- // Even though the client is connected, the server ConnState handler may
- // not know about that yet. So wait until it is called.
- waitForState(t, statechanged, http.StateNew, "Request not received")
+ // avoid a race between the client connection and the server accept
+ if state := <-statechanged; state != http.StateNew {
+ t.Fatal("Unexpected state", state)
+ }
// start the shutdown; once it hits waitgroup.Wait()
// the listener should of been closed, though client1 is still connected
@@ -105,7 +74,7 @@ func TestShutdown(t *testing.T) {
t.Fatal("second call to Close returned true")
}
- waiting := <-wg.WaitCalled
+ waiting := <-wg.waitCalled
if waiting != 1 {
t.Errorf("Waitcount should be one, got %d", waiting)
}
@@ -124,32 +93,36 @@ func TestShutdown(t *testing.T) {
<-exitchan
}
-// If a request is sent to a closed server via a kept alive connection then
-// the server closes the connection upon receiving the request.
-func TestRequestAfterClose(t *testing.T) {
- // Given
- server := NewServer()
- srvStateChangedCh := make(chan http.ConnState, 100)
- listener, srvClosedCh := startServer(t, server, srvStateChangedCh)
+// Test that a connection is closed upon reaching an idle state if and only if the server
+// is shutting down.
+func TestCloseOnIdle(t *testing.T) {
+ server := newServer()
+ wg := newTestWg()
+ server.wg = wg
+ fl := newFakeListener()
+ runner := func() error {
+ return server.Serve(fl)
+ }
- client := newClient(listener.Addr(), false)
- client.Run()
- <-client.connected
- client.sendrequest <- true
- <-client.response
+ startGenericServer(t, server, nil, runner)
- server.Close()
- if err := <-srvClosedCh; err != nil {
- t.Error("Unexpected error during shutdown", err)
+ // Change to idle state while server is not closing; Close should not be called
+ conn := &fakeConn{}
+ server.ConnState(conn, http.StateIdle)
+ if conn.closeCalled {
+ t.Error("Close was called unexpected")
}
- // When
- client.sendrequest <- true
- rr := <-client.response
+ server.Close()
- // Then
- if rr.body != nil || rr.err != nil {
- t.Errorf("Request should be rejected, body=%v, err=%v", rr.body, rr.err)
+ // wait until the server calls Close() on the listener
+ // by that point the atomic closing variable will have been updated, avoiding a race.
+ <-fl.closeCalled
+
+ conn = &fakeConn{}
+ server.ConnState(conn, http.StateIdle)
+ if !conn.closeCalled {
+ t.Error("Close was not called")
}
}
@@ -169,8 +142,8 @@ func waitForState(t *testing.T, waiter chan http.ConnState, state http.ConnState
// Test that a request moving from active->idle->active using an actual
// network connection still results in a corect shutdown
func TestStateTransitionActiveIdleActive(t *testing.T) {
- server := NewServer()
- wg := helpers.NewWaitGroup()
+ server := newServer()
+ wg := newTestWg()
statechanged := make(chan http.ConnState)
server.wg = wg
listener, exitchan := startServer(t, server, statechanged)
@@ -186,14 +159,15 @@ func TestStateTransitionActiveIdleActive(t *testing.T) {
for i := 0; i < 2; i++ {
client.sendrequest <- true
waitForState(t, statechanged, http.StateActive, "Client failed to reach active state")
- <-client.response
+ <-client.idle
+ client.idlerelease <- true
waitForState(t, statechanged, http.StateIdle, "Client failed to reach idle state")
}
// client is now in an idle state
server.Close()
- waiting := <-wg.WaitCalled
+ waiting := <-wg.waitCalled
if waiting != 0 {
t.Errorf("Waitcount should be zero, got %d", waiting)
}
@@ -211,8 +185,8 @@ func TestStateTransitionActiveIdleClosed(t *testing.T) {
exitchan chan error
)
- keyFile, err1 := helpers.NewTempFile(helpers.Key)
- certFile, err2 := helpers.NewTempFile(helpers.Cert)
+ keyFile, err1 := newTempFile(localhostKey)
+ certFile, err2 := newTempFile(localhostCert)
defer keyFile.Unlink()
defer certFile.Unlink()
@@ -221,8 +195,8 @@ func TestStateTransitionActiveIdleClosed(t *testing.T) {
}
for _, withTLS := range []bool{false, true} {
- server := NewServer()
- wg := helpers.NewWaitGroup()
+ server := newServer()
+ wg := newTestWg()
statechanged := make(chan http.ConnState)
server.wg = wg
if withTLS {
@@ -242,11 +216,12 @@ func TestStateTransitionActiveIdleClosed(t *testing.T) {
client.sendrequest <- true
waitForState(t, statechanged, http.StateActive, "Client failed to reach active state")
- rr := <-client.response
- if rr.err != nil {
- t.Fatalf("tls=%t unexpected error from client %s", withTLS, rr.err)
+ err := <-client.idle
+ if err != nil {
+ t.Fatalf("tls=%t unexpected error from client %s", withTLS, err)
}
+ client.idlerelease <- true
waitForState(t, statechanged, http.StateIdle, "Client failed to reach idle state")
// client is now in an idle state
@@ -255,7 +230,7 @@ func TestStateTransitionActiveIdleClosed(t *testing.T) {
waitForState(t, statechanged, http.StateClosed, "Client failed to reach closed state")
server.Close()
- waiting := <-wg.WaitCalled
+ waiting := <-wg.waitCalled
if waiting != 0 {
t.Errorf("Waitcount should be zero, got %d", waiting)
}
@@ -265,25 +240,3 @@ func TestStateTransitionActiveIdleClosed(t *testing.T) {
}
}
}
-
-func TestRoutinesCount(t *testing.T) {
- var count int
- server := NewServer()
-
- count = server.RoutinesCount()
- if count != 0 {
- t.Errorf("Expected the routines count to equal 0; actually %d", count)
- }
-
- server.StartRoutine()
- count = server.RoutinesCount()
- if count != 1 {
- t.Errorf("Expected the routines count to equal 1; actually %d", count)
- }
-
- server.FinishRoutine()
- count = server.RoutinesCount()
- if count != 0 {
- t.Errorf("Expected the routines count to equal 0; actually %d", count)
- }
-}
diff --git a/vendor/github.com/braintree/manners/static.go b/vendor/github.com/braintree/manners/static.go
index b53950675..2a74b094b 100644
--- a/vendor/github.com/braintree/manners/static.go
+++ b/vendor/github.com/braintree/manners/static.go
@@ -3,23 +3,14 @@ package manners
import (
"net"
"net/http"
- "sync"
)
-var (
- defaultServer *GracefulServer
- defaultServerLock = &sync.Mutex{}
-)
-
-func init() {
- defaultServerLock.Lock()
-}
+var defaultServer *GracefulServer
// ListenAndServe provides a graceful version of the function provided by the
// net/http package. Call Close() to stop the server.
func ListenAndServe(addr string, handler http.Handler) error {
defaultServer = NewWithServer(&http.Server{Addr: addr, Handler: handler})
- defaultServerLock.Unlock()
return defaultServer.ListenAndServe()
}
@@ -27,7 +18,6 @@ func ListenAndServe(addr string, handler http.Handler) error {
// net/http package. Call Close() to stop the server.
func ListenAndServeTLS(addr string, certFile string, keyFile string, handler http.Handler) error {
defaultServer = NewWithServer(&http.Server{Addr: addr, Handler: handler})
- defaultServerLock.Unlock()
return defaultServer.ListenAndServeTLS(certFile, keyFile)
}
@@ -35,13 +25,11 @@ func ListenAndServeTLS(addr string, certFile string, keyFile string, handler htt
// package. Call Close() to stop the server.
func Serve(l net.Listener, handler http.Handler) error {
defaultServer = NewWithServer(&http.Server{Handler: handler})
- defaultServerLock.Unlock()
return defaultServer.Serve(l)
}
// Shuts down the default server used by ListenAndServe, ListenAndServeTLS and
// Serve. It returns true if it's the first time Close is called.
func Close() bool {
- defaultServerLock.Lock()
return defaultServer.Close()
}
diff --git a/vendor/github.com/braintree/manners/test_helpers/certs.go b/vendor/github.com/braintree/manners/test_helpers/certs.go
deleted file mode 100644
index ede248b3d..000000000
--- a/vendor/github.com/braintree/manners/test_helpers/certs.go
+++ /dev/null
@@ -1,29 +0,0 @@
-package test_helpers
-
-// A PEM-encoded TLS cert with SAN IPs "127.0.0.1" and "[::1]", expiring at the
-// last second of 2049 (the end of ASN.1 time).
-
-// generated from src/pkg/crypto/tls:
-// go run generate_cert.go --rsa-bits 512 --host 127.0.0.1,::1,example.com --ca --start-date "Jan 1 00:00:00 1970" --duration=1000000h
-var (
- Cert = []byte(`-----BEGIN CERTIFICATE-----
-MIIBdzCCASOgAwIBAgIBADALBgkqhkiG9w0BAQUwEjEQMA4GA1UEChMHQWNtZSBD
-bzAeFw03MDAxMDEwMDAwMDBaFw00OTEyMzEyMzU5NTlaMBIxEDAOBgNVBAoTB0Fj
-bWUgQ28wWjALBgkqhkiG9w0BAQEDSwAwSAJBAN55NcYKZeInyTuhcCwFMhDHCmwa
-IUSdtXdcbItRB/yfXGBhiex00IaLXQnSU+QZPRZWYqeTEbFSgihqi1PUDy8CAwEA
-AaNoMGYwDgYDVR0PAQH/BAQDAgCkMBMGA1UdJQQMMAoGCCsGAQUFBwMBMA8GA1Ud
-EwEB/wQFMAMBAf8wLgYDVR0RBCcwJYILZXhhbXBsZS5jb22HBH8AAAGHEAAAAAAA
-AAAAAAAAAAAAAAEwCwYJKoZIhvcNAQEFA0EAAoQn/ytgqpiLcZu9XKbCJsJcvkgk
-Se6AbGXgSlq+ZCEVo0qIwSgeBqmsJxUu7NCSOwVJLYNEBO2DtIxoYVk+MA==
------END CERTIFICATE-----`)
-
- Key = []byte(`-----BEGIN RSA PRIVATE KEY-----
-MIIBPAIBAAJBAN55NcYKZeInyTuhcCwFMhDHCmwaIUSdtXdcbItRB/yfXGBhiex0
-0IaLXQnSU+QZPRZWYqeTEbFSgihqi1PUDy8CAwEAAQJBAQdUx66rfh8sYsgfdcvV
-NoafYpnEcB5s4m/vSVe6SU7dCK6eYec9f9wpT353ljhDUHq3EbmE4foNzJngh35d
-AekCIQDhRQG5Li0Wj8TM4obOnnXUXf1jRv0UkzE9AHWLG5q3AwIhAPzSjpYUDjVW
-MCUXgckTpKCuGwbJk7424Nb8bLzf3kllAiA5mUBgjfr/WtFSJdWcPQ4Zt9KTMNKD
-EUO0ukpTwEIl6wIhAMbGqZK3zAAFdq8DD2jPx+UJXnh0rnOkZBzDtJ6/iN69AiEA
-1Aq8MJgTaYsDQWyU/hDq5YkDJc9e9DSCvUIzqxQWMQE=
------END RSA PRIVATE KEY-----`)
-)
diff --git a/vendor/github.com/braintree/manners/test_helpers/conn.go b/vendor/github.com/braintree/manners/test_helpers/conn.go
deleted file mode 100644
index 8c610f58e..000000000
--- a/vendor/github.com/braintree/manners/test_helpers/conn.go
+++ /dev/null
@@ -1,13 +0,0 @@
-package test_helpers
-
-import "net"
-
-type Conn struct {
- net.Conn
- CloseCalled bool
-}
-
-func (c *Conn) Close() error {
- c.CloseCalled = true
- return nil
-}
diff --git a/vendor/github.com/braintree/manners/test_helpers/listener.go b/vendor/github.com/braintree/manners/test_helpers/listener.go
deleted file mode 100644
index e3af35a6e..000000000
--- a/vendor/github.com/braintree/manners/test_helpers/listener.go
+++ /dev/null
@@ -1,34 +0,0 @@
-package test_helpers
-
-import (
- "errors"
- "net"
-)
-
-type Listener struct {
- AcceptRelease chan bool
- CloseCalled chan bool
-}
-
-func NewListener() *Listener {
- return &Listener{
- make(chan bool, 1),
- make(chan bool, 1),
- }
-}
-
-func (l *Listener) Addr() net.Addr {
- addr, _ := net.ResolveTCPAddr("tcp", "127.0.0.1:8080")
- return addr
-}
-
-func (l *Listener) Close() error {
- l.CloseCalled <- true
- l.AcceptRelease <- true
- return nil
-}
-
-func (l *Listener) Accept() (net.Conn, error) {
- <-l.AcceptRelease
- return nil, errors.New("connection closed")
-}
diff --git a/vendor/github.com/braintree/manners/test_helpers/temp_file.go b/vendor/github.com/braintree/manners/test_helpers/temp_file.go
deleted file mode 100644
index c4aa263a0..000000000
--- a/vendor/github.com/braintree/manners/test_helpers/temp_file.go
+++ /dev/null
@@ -1,27 +0,0 @@
-package test_helpers
-
-import (
- "io/ioutil"
- "os"
-)
-
-type TempFile struct {
- *os.File
-}
-
-func NewTempFile(content []byte) (*TempFile, error) {
- f, err := ioutil.TempFile("", "graceful-test")
- if err != nil {
- return nil, err
- }
-
- f.Write(content)
- return &TempFile{f}, nil
-}
-
-func (tf *TempFile) Unlink() {
- if tf.File != nil {
- os.Remove(tf.Name())
- tf.File = nil
- }
-}
diff --git a/vendor/github.com/braintree/manners/test_helpers/wait_group.go b/vendor/github.com/braintree/manners/test_helpers/wait_group.go
deleted file mode 100644
index 1df590db7..000000000
--- a/vendor/github.com/braintree/manners/test_helpers/wait_group.go
+++ /dev/null
@@ -1,33 +0,0 @@
-package test_helpers
-
-import "sync"
-
-type WaitGroup struct {
- sync.Mutex
- Count int
- WaitCalled chan int
-}
-
-func NewWaitGroup() *WaitGroup {
- return &WaitGroup{
- WaitCalled: make(chan int, 1),
- }
-}
-
-func (wg *WaitGroup) Add(delta int) {
- wg.Lock()
- wg.Count++
- wg.Unlock()
-}
-
-func (wg *WaitGroup) Done() {
- wg.Lock()
- wg.Count--
- wg.Unlock()
-}
-
-func (wg *WaitGroup) Wait() {
- wg.Lock()
- wg.WaitCalled <- wg.Count
- wg.Unlock()
-}
diff --git a/vendor/github.com/braintree/manners/transition_test.go b/vendor/github.com/braintree/manners/transition_test.go
index 5d398514e..ffa06d3eb 100644
--- a/vendor/github.com/braintree/manners/transition_test.go
+++ b/vendor/github.com/braintree/manners/transition_test.go
@@ -1,7 +1,6 @@
package manners
import (
- helpers "github.com/braintree/manners/test_helpers"
"net/http"
"strings"
"testing"
@@ -31,18 +30,18 @@ type transitionTest struct {
}
func testStateTransition(t *testing.T, test transitionTest) {
- server := NewServer()
- wg := helpers.NewWaitGroup()
+ server := newServer()
+ wg := newTestWg()
server.wg = wg
startServer(t, server, nil)
- conn := &helpers.Conn{}
+ conn := &fakeConn{}
for _, newState := range test.states {
server.ConnState(conn, newState)
}
server.Close()
- waiting := <-wg.WaitCalled
+ waiting := <-wg.waitCalled
if waiting != test.expectedWgCount {
names := make([]string, len(test.states))
for i, s := range test.states {
diff --git a/vendor/github.com/dgryski/dgoogauth/README.md b/vendor/github.com/dgryski/dgoogauth/README.md
index 75fdde78a..372a46084 100644
--- a/vendor/github.com/dgryski/dgoogauth/README.md
+++ b/vendor/github.com/dgryski/dgoogauth/README.md
@@ -1,6 +1,6 @@
This is a Go implementation of the Google Authenticator library.
-[![Build Status](https://travis-ci.org/dgryski/dgoogauth.png)](https://travis-ci.org/dgryski/dgoogauth)
+[![GoDoc](https://godoc.org/github.com/dgryski/dgoogauth?status.svg)](https://godoc.org/github.com/dgryski/dgoogauth) [![Build Status](https://travis-ci.org/dgryski/dgoogauth.png)](https://travis-ci.org/dgryski/dgoogauth)
Copyright (c) 2012 Damian Gryski <damian@gryski.com>
This code is licensed under the Apache License, version 2.0
diff --git a/vendor/github.com/disintegration/imaging/.travis.yml b/vendor/github.com/disintegration/imaging/.travis.yml
index 3bfcffd01..0e214c00d 100644
--- a/vendor/github.com/disintegration/imaging/.travis.yml
+++ b/vendor/github.com/disintegration/imaging/.travis.yml
@@ -8,7 +8,7 @@ go:
- 1.4
- 1.5
- 1.6
- - tip
+ - 1.7
before_install:
- go get golang.org/x/tools/cmd/cover
diff --git a/vendor/github.com/garyburd/redigo/.travis.yml b/vendor/github.com/garyburd/redigo/.travis.yml
deleted file mode 100644
index 80c179fe5..000000000
--- a/vendor/github.com/garyburd/redigo/.travis.yml
+++ /dev/null
@@ -1,16 +0,0 @@
-language: go
-sudo: false
-services:
- - redis-server
-
-go:
- - 1.4
- - 1.5
- - 1.6
- - tip
-
-script:
- - go get -t -v ./...
- - diff -u <(echo -n) <(gofmt -d .)
- - go vet $(go list ./... | grep -v /vendor/)
- - go test -v -race ./...
diff --git a/vendor/github.com/garyburd/redigo/LICENSE b/vendor/github.com/garyburd/redigo/LICENSE
deleted file mode 100644
index 67db85882..000000000
--- a/vendor/github.com/garyburd/redigo/LICENSE
+++ /dev/null
@@ -1,175 +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.
diff --git a/vendor/github.com/garyburd/redigo/README.markdown b/vendor/github.com/garyburd/redigo/README.markdown
deleted file mode 100644
index 662690b3d..000000000
--- a/vendor/github.com/garyburd/redigo/README.markdown
+++ /dev/null
@@ -1,50 +0,0 @@
-Redigo
-======
-
-[![Build Status](https://travis-ci.org/garyburd/redigo.svg?branch=master)](https://travis-ci.org/garyburd/redigo)
-[![GoDoc](https://godoc.org/github.com/garyburd/redigo/redis?status.svg)](https://godoc.org/github.com/garyburd/redigo/redis)
-
-Redigo is a [Go](http://golang.org/) client for the [Redis](http://redis.io/) database.
-
-Features
--------
-
-* A [Print-like](http://godoc.org/github.com/garyburd/redigo/redis#hdr-Executing_Commands) API with support for all Redis commands.
-* [Pipelining](http://godoc.org/github.com/garyburd/redigo/redis#hdr-Pipelining), including pipelined transactions.
-* [Publish/Subscribe](http://godoc.org/github.com/garyburd/redigo/redis#hdr-Publish_and_Subscribe).
-* [Connection pooling](http://godoc.org/github.com/garyburd/redigo/redis#Pool).
-* [Script helper type](http://godoc.org/github.com/garyburd/redigo/redis#Script) with optimistic use of EVALSHA.
-* [Helper functions](http://godoc.org/github.com/garyburd/redigo/redis#hdr-Reply_Helpers) for working with command replies.
-
-Documentation
--------------
-
-- [API Reference](http://godoc.org/github.com/garyburd/redigo/redis)
-- [FAQ](https://github.com/garyburd/redigo/wiki/FAQ)
-
-Installation
-------------
-
-Install Redigo using the "go get" command:
-
- go get github.com/garyburd/redigo/redis
-
-The Go distribution is Redigo's only dependency.
-
-Related Projects
-----------------
-
-- [rafaeljusto/redigomock](https://godoc.org/github.com/rafaeljusto/redigomock) - A mock library for Redigo.
-- [chasex/redis-go-cluster](https://github.com/chasex/redis-go-cluster) - A Redis cluster client implementation.
-- [FZambia/go-sentinel](https://github.com/FZambia/go-sentinel) - Redis Sentinel support for Redigo
-- [PuerkitoBio/redisc](https://github.com/PuerkitoBio/redisc) - Redis Cluster client built on top of Redigo
-
-Contributing
-------------
-
-Send email to Gary Burd (address in GitHub profile) before doing any work on Redigo.
-
-License
--------
-
-Redigo is available under the [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.html).
diff --git a/vendor/github.com/garyburd/redigo/internal/commandinfo.go b/vendor/github.com/garyburd/redigo/internal/commandinfo.go
deleted file mode 100644
index 11e584257..000000000
--- a/vendor/github.com/garyburd/redigo/internal/commandinfo.go
+++ /dev/null
@@ -1,54 +0,0 @@
-// Copyright 2014 Gary Burd
-//
-// Licensed under the Apache License, Version 2.0 (the "License"): you may
-// not use this file except in compliance with the License. You may obtain
-// a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// 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 internal // import "github.com/garyburd/redigo/internal"
-
-import (
- "strings"
-)
-
-const (
- WatchState = 1 << iota
- MultiState
- SubscribeState
- MonitorState
-)
-
-type CommandInfo struct {
- Set, Clear int
-}
-
-var commandInfos = map[string]CommandInfo{
- "WATCH": {Set: WatchState},
- "UNWATCH": {Clear: WatchState},
- "MULTI": {Set: MultiState},
- "EXEC": {Clear: WatchState | MultiState},
- "DISCARD": {Clear: WatchState | MultiState},
- "PSUBSCRIBE": {Set: SubscribeState},
- "SUBSCRIBE": {Set: SubscribeState},
- "MONITOR": {Set: MonitorState},
-}
-
-func init() {
- for n, ci := range commandInfos {
- commandInfos[strings.ToLower(n)] = ci
- }
-}
-
-func LookupCommandInfo(commandName string) CommandInfo {
- if ci, ok := commandInfos[commandName]; ok {
- return ci
- }
- return commandInfos[strings.ToUpper(commandName)]
-}
diff --git a/vendor/github.com/garyburd/redigo/internal/commandinfo_test.go b/vendor/github.com/garyburd/redigo/internal/commandinfo_test.go
deleted file mode 100644
index 118e94b67..000000000
--- a/vendor/github.com/garyburd/redigo/internal/commandinfo_test.go
+++ /dev/null
@@ -1,27 +0,0 @@
-package internal
-
-import "testing"
-
-func TestLookupCommandInfo(t *testing.T) {
- for _, n := range []string{"watch", "WATCH", "wAtch"} {
- if LookupCommandInfo(n) == (CommandInfo{}) {
- t.Errorf("LookupCommandInfo(%q) = CommandInfo{}, expected non-zero value", n)
- }
- }
-}
-
-func benchmarkLookupCommandInfo(b *testing.B, names ...string) {
- for i := 0; i < b.N; i++ {
- for _, c := range names {
- LookupCommandInfo(c)
- }
- }
-}
-
-func BenchmarkLookupCommandInfoCorrectCase(b *testing.B) {
- benchmarkLookupCommandInfo(b, "watch", "WATCH", "monitor", "MONITOR")
-}
-
-func BenchmarkLookupCommandInfoMixedCase(b *testing.B) {
- benchmarkLookupCommandInfo(b, "wAtch", "WeTCH", "monItor", "MONiTOR")
-}
diff --git a/vendor/github.com/garyburd/redigo/internal/redistest/testdb.go b/vendor/github.com/garyburd/redigo/internal/redistest/testdb.go
deleted file mode 100644
index b6f205b7f..000000000
--- a/vendor/github.com/garyburd/redigo/internal/redistest/testdb.go
+++ /dev/null
@@ -1,68 +0,0 @@
-// Copyright 2014 Gary Burd
-//
-// Licensed under the Apache License, Version 2.0 (the "License"): you may
-// not use this file except in compliance with the License. You may obtain
-// a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// 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 redistest contains utilities for writing Redigo tests.
-package redistest
-
-import (
- "errors"
- "time"
-
- "github.com/garyburd/redigo/redis"
-)
-
-type testConn struct {
- redis.Conn
-}
-
-func (t testConn) Close() error {
- _, err := t.Conn.Do("SELECT", "9")
- if err != nil {
- return nil
- }
- _, err = t.Conn.Do("FLUSHDB")
- if err != nil {
- return err
- }
- return t.Conn.Close()
-}
-
-// Dial dials the local Redis server and selects database 9. To prevent
-// stomping on real data, DialTestDB fails if database 9 contains data. The
-// returned connection flushes database 9 on close.
-func Dial() (redis.Conn, error) {
- c, err := redis.DialTimeout("tcp", ":6379", 0, 1*time.Second, 1*time.Second)
- if err != nil {
- return nil, err
- }
-
- _, err = c.Do("SELECT", "9")
- if err != nil {
- c.Close()
- return nil, err
- }
-
- n, err := redis.Int(c.Do("DBSIZE"))
- if err != nil {
- c.Close()
- return nil, err
- }
-
- if n != 0 {
- c.Close()
- return nil, errors.New("database #9 is not empty, test can not continue")
- }
-
- return testConn{c}, nil
-}
diff --git a/vendor/github.com/garyburd/redigo/redis/conn.go b/vendor/github.com/garyburd/redigo/redis/conn.go
deleted file mode 100644
index ed358c601..000000000
--- a/vendor/github.com/garyburd/redigo/redis/conn.go
+++ /dev/null
@@ -1,570 +0,0 @@
-// Copyright 2012 Gary Burd
-//
-// Licensed under the Apache License, Version 2.0 (the "License"): you may
-// not use this file except in compliance with the License. You may obtain
-// a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// 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 redis
-
-import (
- "bufio"
- "bytes"
- "errors"
- "fmt"
- "io"
- "net"
- "net/url"
- "regexp"
- "strconv"
- "sync"
- "time"
-)
-
-// conn is the low-level implementation of Conn
-type conn struct {
-
- // Shared
- mu sync.Mutex
- pending int
- err error
- conn net.Conn
-
- // Read
- readTimeout time.Duration
- br *bufio.Reader
-
- // Write
- writeTimeout time.Duration
- bw *bufio.Writer
-
- // Scratch space for formatting argument length.
- // '*' or '$', length, "\r\n"
- lenScratch [32]byte
-
- // Scratch space for formatting integers and floats.
- numScratch [40]byte
-}
-
-// DialTimeout acts like Dial but takes timeouts for establishing the
-// connection to the server, writing a command and reading a reply.
-//
-// Deprecated: Use Dial with options instead.
-func DialTimeout(network, address string, connectTimeout, readTimeout, writeTimeout time.Duration) (Conn, error) {
- return Dial(network, address,
- DialConnectTimeout(connectTimeout),
- DialReadTimeout(readTimeout),
- DialWriteTimeout(writeTimeout))
-}
-
-// DialOption specifies an option for dialing a Redis server.
-type DialOption struct {
- f func(*dialOptions)
-}
-
-type dialOptions struct {
- readTimeout time.Duration
- writeTimeout time.Duration
- dial func(network, addr string) (net.Conn, error)
- db int
- password string
-}
-
-// DialReadTimeout specifies the timeout for reading a single command reply.
-func DialReadTimeout(d time.Duration) DialOption {
- return DialOption{func(do *dialOptions) {
- do.readTimeout = d
- }}
-}
-
-// DialWriteTimeout specifies the timeout for writing a single command.
-func DialWriteTimeout(d time.Duration) DialOption {
- return DialOption{func(do *dialOptions) {
- do.writeTimeout = d
- }}
-}
-
-// DialConnectTimeout specifies the timeout for connecting to the Redis server.
-func DialConnectTimeout(d time.Duration) DialOption {
- return DialOption{func(do *dialOptions) {
- dialer := net.Dialer{Timeout: d}
- do.dial = dialer.Dial
- }}
-}
-
-// DialNetDial specifies a custom dial function for creating TCP
-// connections. If this option is left out, then net.Dial is
-// used. DialNetDial overrides DialConnectTimeout.
-func DialNetDial(dial func(network, addr string) (net.Conn, error)) DialOption {
- return DialOption{func(do *dialOptions) {
- do.dial = dial
- }}
-}
-
-// DialDatabase specifies the database to select when dialing a connection.
-func DialDatabase(db int) DialOption {
- return DialOption{func(do *dialOptions) {
- do.db = db
- }}
-}
-
-// DialPassword specifies the password to use when connecting to
-// the Redis server.
-func DialPassword(password string) DialOption {
- return DialOption{func(do *dialOptions) {
- do.password = password
- }}
-}
-
-// Dial connects to the Redis server at the given network and
-// address using the specified options.
-func Dial(network, address string, options ...DialOption) (Conn, error) {
- do := dialOptions{
- dial: net.Dial,
- }
- for _, option := range options {
- option.f(&do)
- }
-
- netConn, err := do.dial(network, address)
- if err != nil {
- return nil, err
- }
- c := &conn{
- conn: netConn,
- bw: bufio.NewWriter(netConn),
- br: bufio.NewReader(netConn),
- readTimeout: do.readTimeout,
- writeTimeout: do.writeTimeout,
- }
-
- if do.password != "" {
- if _, err := c.Do("AUTH", do.password); err != nil {
- netConn.Close()
- return nil, err
- }
- }
-
- if do.db != 0 {
- if _, err := c.Do("SELECT", do.db); err != nil {
- netConn.Close()
- return nil, err
- }
- }
-
- return c, nil
-}
-
-var pathDBRegexp = regexp.MustCompile(`/(\d*)\z`)
-
-// DialURL connects to a Redis server at the given URL using the Redis
-// URI scheme. URLs should follow the draft IANA specification for the
-// scheme (https://www.iana.org/assignments/uri-schemes/prov/redis).
-func DialURL(rawurl string, options ...DialOption) (Conn, error) {
- u, err := url.Parse(rawurl)
- if err != nil {
- return nil, err
- }
-
- if u.Scheme != "redis" {
- return nil, fmt.Errorf("invalid redis URL scheme: %s", u.Scheme)
- }
-
- // As per the IANA draft spec, the host defaults to localhost and
- // the port defaults to 6379.
- host, port, err := net.SplitHostPort(u.Host)
- if err != nil {
- // assume port is missing
- host = u.Host
- port = "6379"
- }
- if host == "" {
- host = "localhost"
- }
- address := net.JoinHostPort(host, port)
-
- if u.User != nil {
- password, isSet := u.User.Password()
- if isSet {
- options = append(options, DialPassword(password))
- }
- }
-
- match := pathDBRegexp.FindStringSubmatch(u.Path)
- if len(match) == 2 {
- db := 0
- if len(match[1]) > 0 {
- db, err = strconv.Atoi(match[1])
- if err != nil {
- return nil, fmt.Errorf("invalid database: %s", u.Path[1:])
- }
- }
- if db != 0 {
- options = append(options, DialDatabase(db))
- }
- } else if u.Path != "" {
- return nil, fmt.Errorf("invalid database: %s", u.Path[1:])
- }
-
- return Dial("tcp", address, options...)
-}
-
-// NewConn returns a new Redigo connection for the given net connection.
-func NewConn(netConn net.Conn, readTimeout, writeTimeout time.Duration) Conn {
- return &conn{
- conn: netConn,
- bw: bufio.NewWriter(netConn),
- br: bufio.NewReader(netConn),
- readTimeout: readTimeout,
- writeTimeout: writeTimeout,
- }
-}
-
-func (c *conn) Close() error {
- c.mu.Lock()
- err := c.err
- if c.err == nil {
- c.err = errors.New("redigo: closed")
- err = c.conn.Close()
- }
- c.mu.Unlock()
- return err
-}
-
-func (c *conn) fatal(err error) error {
- c.mu.Lock()
- if c.err == nil {
- c.err = err
- // Close connection to force errors on subsequent calls and to unblock
- // other reader or writer.
- c.conn.Close()
- }
- c.mu.Unlock()
- return err
-}
-
-func (c *conn) Err() error {
- c.mu.Lock()
- err := c.err
- c.mu.Unlock()
- return err
-}
-
-func (c *conn) writeLen(prefix byte, n int) error {
- c.lenScratch[len(c.lenScratch)-1] = '\n'
- c.lenScratch[len(c.lenScratch)-2] = '\r'
- i := len(c.lenScratch) - 3
- for {
- c.lenScratch[i] = byte('0' + n%10)
- i -= 1
- n = n / 10
- if n == 0 {
- break
- }
- }
- c.lenScratch[i] = prefix
- _, err := c.bw.Write(c.lenScratch[i:])
- return err
-}
-
-func (c *conn) writeString(s string) error {
- c.writeLen('$', len(s))
- c.bw.WriteString(s)
- _, err := c.bw.WriteString("\r\n")
- return err
-}
-
-func (c *conn) writeBytes(p []byte) error {
- c.writeLen('$', len(p))
- c.bw.Write(p)
- _, err := c.bw.WriteString("\r\n")
- return err
-}
-
-func (c *conn) writeInt64(n int64) error {
- return c.writeBytes(strconv.AppendInt(c.numScratch[:0], n, 10))
-}
-
-func (c *conn) writeFloat64(n float64) error {
- return c.writeBytes(strconv.AppendFloat(c.numScratch[:0], n, 'g', -1, 64))
-}
-
-func (c *conn) writeCommand(cmd string, args []interface{}) (err error) {
- c.writeLen('*', 1+len(args))
- err = c.writeString(cmd)
- for _, arg := range args {
- if err != nil {
- break
- }
- switch arg := arg.(type) {
- case string:
- err = c.writeString(arg)
- case []byte:
- err = c.writeBytes(arg)
- case int:
- err = c.writeInt64(int64(arg))
- case int64:
- err = c.writeInt64(arg)
- case float64:
- err = c.writeFloat64(arg)
- case bool:
- if arg {
- err = c.writeString("1")
- } else {
- err = c.writeString("0")
- }
- case nil:
- err = c.writeString("")
- default:
- var buf bytes.Buffer
- fmt.Fprint(&buf, arg)
- err = c.writeBytes(buf.Bytes())
- }
- }
- return err
-}
-
-type protocolError string
-
-func (pe protocolError) Error() string {
- return fmt.Sprintf("redigo: %s (possible server error or unsupported concurrent read by application)", string(pe))
-}
-
-func (c *conn) readLine() ([]byte, error) {
- p, err := c.br.ReadSlice('\n')
- if err == bufio.ErrBufferFull {
- return nil, protocolError("long response line")
- }
- if err != nil {
- return nil, err
- }
- i := len(p) - 2
- if i < 0 || p[i] != '\r' {
- return nil, protocolError("bad response line terminator")
- }
- return p[:i], nil
-}
-
-// parseLen parses bulk string and array lengths.
-func parseLen(p []byte) (int, error) {
- if len(p) == 0 {
- return -1, protocolError("malformed length")
- }
-
- if p[0] == '-' && len(p) == 2 && p[1] == '1' {
- // handle $-1 and $-1 null replies.
- return -1, nil
- }
-
- var n int
- for _, b := range p {
- n *= 10
- if b < '0' || b > '9' {
- return -1, protocolError("illegal bytes in length")
- }
- n += int(b - '0')
- }
-
- return n, nil
-}
-
-// parseInt parses an integer reply.
-func parseInt(p []byte) (interface{}, error) {
- if len(p) == 0 {
- return 0, protocolError("malformed integer")
- }
-
- var negate bool
- if p[0] == '-' {
- negate = true
- p = p[1:]
- if len(p) == 0 {
- return 0, protocolError("malformed integer")
- }
- }
-
- var n int64
- for _, b := range p {
- n *= 10
- if b < '0' || b > '9' {
- return 0, protocolError("illegal bytes in length")
- }
- n += int64(b - '0')
- }
-
- if negate {
- n = -n
- }
- return n, nil
-}
-
-var (
- okReply interface{} = "OK"
- pongReply interface{} = "PONG"
-)
-
-func (c *conn) readReply() (interface{}, error) {
- line, err := c.readLine()
- if err != nil {
- return nil, err
- }
- if len(line) == 0 {
- return nil, protocolError("short response line")
- }
- switch line[0] {
- case '+':
- switch {
- case len(line) == 3 && line[1] == 'O' && line[2] == 'K':
- // Avoid allocation for frequent "+OK" response.
- return okReply, nil
- case len(line) == 5 && line[1] == 'P' && line[2] == 'O' && line[3] == 'N' && line[4] == 'G':
- // Avoid allocation in PING command benchmarks :)
- return pongReply, nil
- default:
- return string(line[1:]), nil
- }
- case '-':
- return Error(string(line[1:])), nil
- case ':':
- return parseInt(line[1:])
- case '$':
- n, err := parseLen(line[1:])
- if n < 0 || err != nil {
- return nil, err
- }
- p := make([]byte, n)
- _, err = io.ReadFull(c.br, p)
- if err != nil {
- return nil, err
- }
- if line, err := c.readLine(); err != nil {
- return nil, err
- } else if len(line) != 0 {
- return nil, protocolError("bad bulk string format")
- }
- return p, nil
- case '*':
- n, err := parseLen(line[1:])
- if n < 0 || err != nil {
- return nil, err
- }
- r := make([]interface{}, n)
- for i := range r {
- r[i], err = c.readReply()
- if err != nil {
- return nil, err
- }
- }
- return r, nil
- }
- return nil, protocolError("unexpected response line")
-}
-
-func (c *conn) Send(cmd string, args ...interface{}) error {
- c.mu.Lock()
- c.pending += 1
- c.mu.Unlock()
- if c.writeTimeout != 0 {
- c.conn.SetWriteDeadline(time.Now().Add(c.writeTimeout))
- }
- if err := c.writeCommand(cmd, args); err != nil {
- return c.fatal(err)
- }
- return nil
-}
-
-func (c *conn) Flush() error {
- if c.writeTimeout != 0 {
- c.conn.SetWriteDeadline(time.Now().Add(c.writeTimeout))
- }
- if err := c.bw.Flush(); err != nil {
- return c.fatal(err)
- }
- return nil
-}
-
-func (c *conn) Receive() (reply interface{}, err error) {
- if c.readTimeout != 0 {
- c.conn.SetReadDeadline(time.Now().Add(c.readTimeout))
- }
- if reply, err = c.readReply(); err != nil {
- return nil, c.fatal(err)
- }
- // When using pub/sub, the number of receives can be greater than the
- // number of sends. To enable normal use of the connection after
- // unsubscribing from all channels, we do not decrement pending to a
- // negative value.
- //
- // The pending field is decremented after the reply is read to handle the
- // case where Receive is called before Send.
- c.mu.Lock()
- if c.pending > 0 {
- c.pending -= 1
- }
- c.mu.Unlock()
- if err, ok := reply.(Error); ok {
- return nil, err
- }
- return
-}
-
-func (c *conn) Do(cmd string, args ...interface{}) (interface{}, error) {
- c.mu.Lock()
- pending := c.pending
- c.pending = 0
- c.mu.Unlock()
-
- if cmd == "" && pending == 0 {
- return nil, nil
- }
-
- if c.writeTimeout != 0 {
- c.conn.SetWriteDeadline(time.Now().Add(c.writeTimeout))
- }
-
- if cmd != "" {
- if err := c.writeCommand(cmd, args); err != nil {
- return nil, c.fatal(err)
- }
- }
-
- if err := c.bw.Flush(); err != nil {
- return nil, c.fatal(err)
- }
-
- if c.readTimeout != 0 {
- c.conn.SetReadDeadline(time.Now().Add(c.readTimeout))
- }
-
- if cmd == "" {
- reply := make([]interface{}, pending)
- for i := range reply {
- r, e := c.readReply()
- if e != nil {
- return nil, c.fatal(e)
- }
- reply[i] = r
- }
- return reply, nil
- }
-
- var err error
- var reply interface{}
- for i := 0; i <= pending; i++ {
- var e error
- if reply, e = c.readReply(); e != nil {
- return nil, c.fatal(e)
- }
- if e, ok := reply.(Error); ok && err == nil {
- err = e
- }
- }
- return reply, err
-}
diff --git a/vendor/github.com/garyburd/redigo/redis/conn_test.go b/vendor/github.com/garyburd/redigo/redis/conn_test.go
deleted file mode 100644
index 2ead63326..000000000
--- a/vendor/github.com/garyburd/redigo/redis/conn_test.go
+++ /dev/null
@@ -1,670 +0,0 @@
-// Copyright 2012 Gary Burd
-//
-// Licensed under the Apache License, Version 2.0 (the "License"): you may
-// not use this file except in compliance with the License. You may obtain
-// a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// 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 redis_test
-
-import (
- "bytes"
- "io"
- "math"
- "net"
- "os"
- "reflect"
- "strings"
- "testing"
- "time"
-
- "github.com/garyburd/redigo/redis"
-)
-
-type testConn struct {
- io.Reader
- io.Writer
-}
-
-func (*testConn) Close() error { return nil }
-func (*testConn) LocalAddr() net.Addr { return nil }
-func (*testConn) RemoteAddr() net.Addr { return nil }
-func (*testConn) SetDeadline(t time.Time) error { return nil }
-func (*testConn) SetReadDeadline(t time.Time) error { return nil }
-func (*testConn) SetWriteDeadline(t time.Time) error { return nil }
-
-func dialTestConn(r io.Reader, w io.Writer) redis.DialOption {
- return redis.DialNetDial(func(net, addr string) (net.Conn, error) {
- return &testConn{Reader: r, Writer: w}, nil
- })
-}
-
-var writeTests = []struct {
- args []interface{}
- expected string
-}{
- {
- []interface{}{"SET", "key", "value"},
- "*3\r\n$3\r\nSET\r\n$3\r\nkey\r\n$5\r\nvalue\r\n",
- },
- {
- []interface{}{"SET", "key", "value"},
- "*3\r\n$3\r\nSET\r\n$3\r\nkey\r\n$5\r\nvalue\r\n",
- },
- {
- []interface{}{"SET", "key", byte(100)},
- "*3\r\n$3\r\nSET\r\n$3\r\nkey\r\n$3\r\n100\r\n",
- },
- {
- []interface{}{"SET", "key", 100},
- "*3\r\n$3\r\nSET\r\n$3\r\nkey\r\n$3\r\n100\r\n",
- },
- {
- []interface{}{"SET", "key", int64(math.MinInt64)},
- "*3\r\n$3\r\nSET\r\n$3\r\nkey\r\n$20\r\n-9223372036854775808\r\n",
- },
- {
- []interface{}{"SET", "key", float64(1349673917.939762)},
- "*3\r\n$3\r\nSET\r\n$3\r\nkey\r\n$21\r\n1.349673917939762e+09\r\n",
- },
- {
- []interface{}{"SET", "key", ""},
- "*3\r\n$3\r\nSET\r\n$3\r\nkey\r\n$0\r\n\r\n",
- },
- {
- []interface{}{"SET", "key", nil},
- "*3\r\n$3\r\nSET\r\n$3\r\nkey\r\n$0\r\n\r\n",
- },
- {
- []interface{}{"ECHO", true, false},
- "*3\r\n$4\r\nECHO\r\n$1\r\n1\r\n$1\r\n0\r\n",
- },
-}
-
-func TestWrite(t *testing.T) {
- for _, tt := range writeTests {
- var buf bytes.Buffer
- c, _ := redis.Dial("", "", dialTestConn(nil, &buf))
- err := c.Send(tt.args[0].(string), tt.args[1:]...)
- if err != nil {
- t.Errorf("Send(%v) returned error %v", tt.args, err)
- continue
- }
- c.Flush()
- actual := buf.String()
- if actual != tt.expected {
- t.Errorf("Send(%v) = %q, want %q", tt.args, actual, tt.expected)
- }
- }
-}
-
-var errorSentinel = &struct{}{}
-
-var readTests = []struct {
- reply string
- expected interface{}
-}{
- {
- "+OK\r\n",
- "OK",
- },
- {
- "+PONG\r\n",
- "PONG",
- },
- {
- "@OK\r\n",
- errorSentinel,
- },
- {
- "$6\r\nfoobar\r\n",
- []byte("foobar"),
- },
- {
- "$-1\r\n",
- nil,
- },
- {
- ":1\r\n",
- int64(1),
- },
- {
- ":-2\r\n",
- int64(-2),
- },
- {
- "*0\r\n",
- []interface{}{},
- },
- {
- "*-1\r\n",
- nil,
- },
- {
- "*4\r\n$3\r\nfoo\r\n$3\r\nbar\r\n$5\r\nHello\r\n$5\r\nWorld\r\n",
- []interface{}{[]byte("foo"), []byte("bar"), []byte("Hello"), []byte("World")},
- },
- {
- "*3\r\n$3\r\nfoo\r\n$-1\r\n$3\r\nbar\r\n",
- []interface{}{[]byte("foo"), nil, []byte("bar")},
- },
-
- {
- // "x" is not a valid length
- "$x\r\nfoobar\r\n",
- errorSentinel,
- },
- {
- // -2 is not a valid length
- "$-2\r\n",
- errorSentinel,
- },
- {
- // "x" is not a valid integer
- ":x\r\n",
- errorSentinel,
- },
- {
- // missing \r\n following value
- "$6\r\nfoobar",
- errorSentinel,
- },
- {
- // short value
- "$6\r\nxx",
- errorSentinel,
- },
- {
- // long value
- "$6\r\nfoobarx\r\n",
- errorSentinel,
- },
-}
-
-func TestRead(t *testing.T) {
- for _, tt := range readTests {
- c, _ := redis.Dial("", "", dialTestConn(strings.NewReader(tt.reply), nil))
- actual, err := c.Receive()
- if tt.expected == errorSentinel {
- if err == nil {
- t.Errorf("Receive(%q) did not return expected error", tt.reply)
- }
- } else {
- if err != nil {
- t.Errorf("Receive(%q) returned error %v", tt.reply, err)
- continue
- }
- if !reflect.DeepEqual(actual, tt.expected) {
- t.Errorf("Receive(%q) = %v, want %v", tt.reply, actual, tt.expected)
- }
- }
- }
-}
-
-var testCommands = []struct {
- args []interface{}
- expected interface{}
-}{
- {
- []interface{}{"PING"},
- "PONG",
- },
- {
- []interface{}{"SET", "foo", "bar"},
- "OK",
- },
- {
- []interface{}{"GET", "foo"},
- []byte("bar"),
- },
- {
- []interface{}{"GET", "nokey"},
- nil,
- },
- {
- []interface{}{"MGET", "nokey", "foo"},
- []interface{}{nil, []byte("bar")},
- },
- {
- []interface{}{"INCR", "mycounter"},
- int64(1),
- },
- {
- []interface{}{"LPUSH", "mylist", "foo"},
- int64(1),
- },
- {
- []interface{}{"LPUSH", "mylist", "bar"},
- int64(2),
- },
- {
- []interface{}{"LRANGE", "mylist", 0, -1},
- []interface{}{[]byte("bar"), []byte("foo")},
- },
- {
- []interface{}{"MULTI"},
- "OK",
- },
- {
- []interface{}{"LRANGE", "mylist", 0, -1},
- "QUEUED",
- },
- {
- []interface{}{"PING"},
- "QUEUED",
- },
- {
- []interface{}{"EXEC"},
- []interface{}{
- []interface{}{[]byte("bar"), []byte("foo")},
- "PONG",
- },
- },
-}
-
-func TestDoCommands(t *testing.T) {
- c, err := redis.DialDefaultServer()
- if err != nil {
- t.Fatalf("error connection to database, %v", err)
- }
- defer c.Close()
-
- for _, cmd := range testCommands {
- actual, err := c.Do(cmd.args[0].(string), cmd.args[1:]...)
- if err != nil {
- t.Errorf("Do(%v) returned error %v", cmd.args, err)
- continue
- }
- if !reflect.DeepEqual(actual, cmd.expected) {
- t.Errorf("Do(%v) = %v, want %v", cmd.args, actual, cmd.expected)
- }
- }
-}
-
-func TestPipelineCommands(t *testing.T) {
- c, err := redis.DialDefaultServer()
- if err != nil {
- t.Fatalf("error connection to database, %v", err)
- }
- defer c.Close()
-
- for _, cmd := range testCommands {
- if err := c.Send(cmd.args[0].(string), cmd.args[1:]...); err != nil {
- t.Fatalf("Send(%v) returned error %v", cmd.args, err)
- }
- }
- if err := c.Flush(); err != nil {
- t.Errorf("Flush() returned error %v", err)
- }
- for _, cmd := range testCommands {
- actual, err := c.Receive()
- if err != nil {
- t.Fatalf("Receive(%v) returned error %v", cmd.args, err)
- }
- if !reflect.DeepEqual(actual, cmd.expected) {
- t.Errorf("Receive(%v) = %v, want %v", cmd.args, actual, cmd.expected)
- }
- }
-}
-
-func TestBlankCommmand(t *testing.T) {
- c, err := redis.DialDefaultServer()
- if err != nil {
- t.Fatalf("error connection to database, %v", err)
- }
- defer c.Close()
-
- for _, cmd := range testCommands {
- if err := c.Send(cmd.args[0].(string), cmd.args[1:]...); err != nil {
- t.Fatalf("Send(%v) returned error %v", cmd.args, err)
- }
- }
- reply, err := redis.Values(c.Do(""))
- if err != nil {
- t.Fatalf("Do() returned error %v", err)
- }
- if len(reply) != len(testCommands) {
- t.Fatalf("len(reply)=%d, want %d", len(reply), len(testCommands))
- }
- for i, cmd := range testCommands {
- actual := reply[i]
- if !reflect.DeepEqual(actual, cmd.expected) {
- t.Errorf("Receive(%v) = %v, want %v", cmd.args, actual, cmd.expected)
- }
- }
-}
-
-func TestRecvBeforeSend(t *testing.T) {
- c, err := redis.DialDefaultServer()
- if err != nil {
- t.Fatalf("error connection to database, %v", err)
- }
- defer c.Close()
- done := make(chan struct{})
- go func() {
- c.Receive()
- close(done)
- }()
- time.Sleep(time.Millisecond)
- c.Send("PING")
- c.Flush()
- <-done
- _, err = c.Do("")
- if err != nil {
- t.Fatalf("error=%v", err)
- }
-}
-
-func TestError(t *testing.T) {
- c, err := redis.DialDefaultServer()
- if err != nil {
- t.Fatalf("error connection to database, %v", err)
- }
- defer c.Close()
-
- c.Do("SET", "key", "val")
- _, err = c.Do("HSET", "key", "fld", "val")
- if err == nil {
- t.Errorf("Expected err for HSET on string key.")
- }
- if c.Err() != nil {
- t.Errorf("Conn has Err()=%v, expect nil", c.Err())
- }
- _, err = c.Do("SET", "key", "val")
- if err != nil {
- t.Errorf("Do(SET, key, val) returned error %v, expected nil.", err)
- }
-}
-
-func TestReadTimeout(t *testing.T) {
- l, err := net.Listen("tcp", "127.0.0.1:0")
- if err != nil {
- t.Fatalf("net.Listen returned %v", err)
- }
- defer l.Close()
-
- go func() {
- for {
- c, err := l.Accept()
- if err != nil {
- return
- }
- go func() {
- time.Sleep(time.Second)
- c.Write([]byte("+OK\r\n"))
- c.Close()
- }()
- }
- }()
-
- // Do
-
- c1, err := redis.Dial(l.Addr().Network(), l.Addr().String(), redis.DialReadTimeout(time.Millisecond))
- if err != nil {
- t.Fatalf("redis.Dial returned %v", err)
- }
- defer c1.Close()
-
- _, err = c1.Do("PING")
- if err == nil {
- t.Fatalf("c1.Do() returned nil, expect error")
- }
- if c1.Err() == nil {
- t.Fatalf("c1.Err() = nil, expect error")
- }
-
- // Send/Flush/Receive
-
- c2, err := redis.Dial(l.Addr().Network(), l.Addr().String(), redis.DialReadTimeout(time.Millisecond))
- if err != nil {
- t.Fatalf("redis.Dial returned %v", err)
- }
- defer c2.Close()
-
- c2.Send("PING")
- c2.Flush()
- _, err = c2.Receive()
- if err == nil {
- t.Fatalf("c2.Receive() returned nil, expect error")
- }
- if c2.Err() == nil {
- t.Fatalf("c2.Err() = nil, expect error")
- }
-}
-
-var dialErrors = []struct {
- rawurl string
- expectedError string
-}{
- {
- "localhost",
- "invalid redis URL scheme",
- },
- // The error message for invalid hosts is diffferent in different
- // versions of Go, so just check that there is an error message.
- {
- "redis://weird url",
- "",
- },
- {
- "redis://foo:bar:baz",
- "",
- },
- {
- "http://www.google.com",
- "invalid redis URL scheme: http",
- },
- {
- "redis://localhost:6379/abc123",
- "invalid database: abc123",
- },
-}
-
-func TestDialURLErrors(t *testing.T) {
- for _, d := range dialErrors {
- _, err := redis.DialURL(d.rawurl)
- if err == nil || !strings.Contains(err.Error(), d.expectedError) {
- t.Errorf("DialURL did not return expected error (expected %v to contain %s)", err, d.expectedError)
- }
- }
-}
-
-func TestDialURLPort(t *testing.T) {
- checkPort := func(network, address string) (net.Conn, error) {
- if address != "localhost:6379" {
- t.Errorf("DialURL did not set port to 6379 by default (got %v)", address)
- }
- return nil, nil
- }
- _, err := redis.DialURL("redis://localhost", redis.DialNetDial(checkPort))
- if err != nil {
- t.Error("dial error:", err)
- }
-}
-
-func TestDialURLHost(t *testing.T) {
- checkHost := func(network, address string) (net.Conn, error) {
- if address != "localhost:6379" {
- t.Errorf("DialURL did not set host to localhost by default (got %v)", address)
- }
- return nil, nil
- }
- _, err := redis.DialURL("redis://:6379", redis.DialNetDial(checkHost))
- if err != nil {
- t.Error("dial error:", err)
- }
-}
-
-func TestDialURLPassword(t *testing.T) {
- var buf bytes.Buffer
- _, err := redis.DialURL("redis://x:abc123@localhost", dialTestConn(strings.NewReader("+OK\r\n"), &buf))
- if err != nil {
- t.Error("dial error:", err)
- }
- expected := "*2\r\n$4\r\nAUTH\r\n$6\r\nabc123\r\n"
- actual := buf.String()
- if actual != expected {
- t.Errorf("commands = %q, want %q", actual, expected)
- }
-}
-
-func TestDialURLDatabase(t *testing.T) {
- var buf3 bytes.Buffer
- _, err3 := redis.DialURL("redis://localhost/3", dialTestConn(strings.NewReader("+OK\r\n"), &buf3))
- if err3 != nil {
- t.Error("dial error:", err3)
- }
- expected3 := "*2\r\n$6\r\nSELECT\r\n$1\r\n3\r\n"
- actual3 := buf3.String()
- if actual3 != expected3 {
- t.Errorf("commands = %q, want %q", actual3, expected3)
- }
- // empty DB means 0
- var buf0 bytes.Buffer
- _, err0 := redis.DialURL("redis://localhost/", dialTestConn(strings.NewReader("+OK\r\n"), &buf0))
- if err0 != nil {
- t.Error("dial error:", err0)
- }
- expected0 := ""
- actual0 := buf0.String()
- if actual0 != expected0 {
- t.Errorf("commands = %q, want %q", actual0, expected0)
- }
-}
-
-// Connect to local instance of Redis running on the default port.
-func ExampleDial() {
- c, err := redis.Dial("tcp", ":6379")
- if err != nil {
- // handle error
- }
- defer c.Close()
-}
-
-// Connect to remote instance of Redis using a URL.
-func ExampleDialURL() {
- c, err := redis.DialURL(os.Getenv("REDIS_URL"))
- if err != nil {
- // handle connection error
- }
- defer c.Close()
-}
-
-// TextExecError tests handling of errors in a transaction. See
-// http://redis.io/topics/transactions for information on how Redis handles
-// errors in a transaction.
-func TestExecError(t *testing.T) {
- c, err := redis.DialDefaultServer()
- if err != nil {
- t.Fatalf("error connection to database, %v", err)
- }
- defer c.Close()
-
- // Execute commands that fail before EXEC is called.
-
- c.Do("DEL", "k0")
- c.Do("ZADD", "k0", 0, 0)
- c.Send("MULTI")
- c.Send("NOTACOMMAND", "k0", 0, 0)
- c.Send("ZINCRBY", "k0", 0, 0)
- v, err := c.Do("EXEC")
- if err == nil {
- t.Fatalf("EXEC returned values %v, expected error", v)
- }
-
- // Execute commands that fail after EXEC is called. The first command
- // returns an error.
-
- c.Do("DEL", "k1")
- c.Do("ZADD", "k1", 0, 0)
- c.Send("MULTI")
- c.Send("HSET", "k1", 0, 0)
- c.Send("ZINCRBY", "k1", 0, 0)
- v, err = c.Do("EXEC")
- if err != nil {
- t.Fatalf("EXEC returned error %v", err)
- }
-
- vs, err := redis.Values(v, nil)
- if err != nil {
- t.Fatalf("Values(v) returned error %v", err)
- }
-
- if len(vs) != 2 {
- t.Fatalf("len(vs) == %d, want 2", len(vs))
- }
-
- if _, ok := vs[0].(error); !ok {
- t.Fatalf("first result is type %T, expected error", vs[0])
- }
-
- if _, ok := vs[1].([]byte); !ok {
- t.Fatalf("second result is type %T, expected []byte", vs[1])
- }
-
- // Execute commands that fail after EXEC is called. The second command
- // returns an error.
-
- c.Do("ZADD", "k2", 0, 0)
- c.Send("MULTI")
- c.Send("ZINCRBY", "k2", 0, 0)
- c.Send("HSET", "k2", 0, 0)
- v, err = c.Do("EXEC")
- if err != nil {
- t.Fatalf("EXEC returned error %v", err)
- }
-
- vs, err = redis.Values(v, nil)
- if err != nil {
- t.Fatalf("Values(v) returned error %v", err)
- }
-
- if len(vs) != 2 {
- t.Fatalf("len(vs) == %d, want 2", len(vs))
- }
-
- if _, ok := vs[0].([]byte); !ok {
- t.Fatalf("first result is type %T, expected []byte", vs[0])
- }
-
- if _, ok := vs[1].(error); !ok {
- t.Fatalf("second result is type %T, expected error", vs[2])
- }
-}
-
-func BenchmarkDoEmpty(b *testing.B) {
- b.StopTimer()
- c, err := redis.DialDefaultServer()
- if err != nil {
- b.Fatal(err)
- }
- defer c.Close()
- b.StartTimer()
- for i := 0; i < b.N; i++ {
- if _, err := c.Do(""); err != nil {
- b.Fatal(err)
- }
- }
-}
-
-func BenchmarkDoPing(b *testing.B) {
- b.StopTimer()
- c, err := redis.DialDefaultServer()
- if err != nil {
- b.Fatal(err)
- }
- defer c.Close()
- b.StartTimer()
- for i := 0; i < b.N; i++ {
- if _, err := c.Do("PING"); err != nil {
- b.Fatal(err)
- }
- }
-}
diff --git a/vendor/github.com/garyburd/redigo/redis/doc.go b/vendor/github.com/garyburd/redigo/redis/doc.go
deleted file mode 100644
index a5cd454af..000000000
--- a/vendor/github.com/garyburd/redigo/redis/doc.go
+++ /dev/null
@@ -1,169 +0,0 @@
-// Copyright 2012 Gary Burd
-//
-// Licensed under the Apache License, Version 2.0 (the "License"): you may
-// not use this file except in compliance with the License. You may obtain
-// a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// 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 redis is a client for the Redis database.
-//
-// The Redigo FAQ (https://github.com/garyburd/redigo/wiki/FAQ) contains more
-// documentation about this package.
-//
-// Connections
-//
-// The Conn interface is the primary interface for working with Redis.
-// Applications create connections by calling the Dial, DialWithTimeout or
-// NewConn functions. In the future, functions will be added for creating
-// sharded and other types of connections.
-//
-// The application must call the connection Close method when the application
-// is done with the connection.
-//
-// Executing Commands
-//
-// The Conn interface has a generic method for executing Redis commands:
-//
-// Do(commandName string, args ...interface{}) (reply interface{}, err error)
-//
-// The Redis command reference (http://redis.io/commands) lists the available
-// commands. An example of using the Redis APPEND command is:
-//
-// n, err := conn.Do("APPEND", "key", "value")
-//
-// The Do method converts command arguments to binary strings for transmission
-// to the server as follows:
-//
-// Go Type Conversion
-// []byte Sent as is
-// string Sent as is
-// int, int64 strconv.FormatInt(v)
-// float64 strconv.FormatFloat(v, 'g', -1, 64)
-// bool true -> "1", false -> "0"
-// nil ""
-// all other types fmt.Print(v)
-//
-// Redis command reply types are represented using the following Go types:
-//
-// Redis type Go type
-// error redis.Error
-// integer int64
-// simple string string
-// bulk string []byte or nil if value not present.
-// array []interface{} or nil if value not present.
-//
-// Use type assertions or the reply helper functions to convert from
-// interface{} to the specific Go type for the command result.
-//
-// Pipelining
-//
-// Connections support pipelining using the Send, Flush and Receive methods.
-//
-// Send(commandName string, args ...interface{}) error
-// Flush() error
-// Receive() (reply interface{}, err error)
-//
-// Send writes the command to the connection's output buffer. Flush flushes the
-// connection's output buffer to the server. Receive reads a single reply from
-// the server. The following example shows a simple pipeline.
-//
-// c.Send("SET", "foo", "bar")
-// c.Send("GET", "foo")
-// c.Flush()
-// c.Receive() // reply from SET
-// v, err = c.Receive() // reply from GET
-//
-// The Do method combines the functionality of the Send, Flush and Receive
-// methods. The Do method starts by writing the command and flushing the output
-// buffer. Next, the Do method receives all pending replies including the reply
-// for the command just sent by Do. If any of the received replies is an error,
-// then Do returns the error. If there are no errors, then Do returns the last
-// reply. If the command argument to the Do method is "", then the Do method
-// will flush the output buffer and receive pending replies without sending a
-// command.
-//
-// Use the Send and Do methods to implement pipelined transactions.
-//
-// c.Send("MULTI")
-// c.Send("INCR", "foo")
-// c.Send("INCR", "bar")
-// r, err := c.Do("EXEC")
-// fmt.Println(r) // prints [1, 1]
-//
-// Concurrency
-//
-// Connections do not support concurrent calls to the write methods (Send,
-// Flush) or concurrent calls to the read method (Receive). Connections do
-// allow a concurrent reader and writer.
-//
-// Because the Do method combines the functionality of Send, Flush and Receive,
-// the Do method cannot be called concurrently with the other methods.
-//
-// For full concurrent access to Redis, use the thread-safe Pool to get and
-// release connections from within a goroutine.
-//
-// Publish and Subscribe
-//
-// Use the Send, Flush and Receive methods to implement Pub/Sub subscribers.
-//
-// c.Send("SUBSCRIBE", "example")
-// c.Flush()
-// for {
-// reply, err := c.Receive()
-// if err != nil {
-// return err
-// }
-// // process pushed message
-// }
-//
-// The PubSubConn type wraps a Conn with convenience methods for implementing
-// subscribers. The Subscribe, PSubscribe, Unsubscribe and PUnsubscribe methods
-// send and flush a subscription management command. The receive method
-// converts a pushed message to convenient types for use in a type switch.
-//
-// psc := redis.PubSubConn{c}
-// psc.Subscribe("example")
-// for {
-// switch v := psc.Receive().(type) {
-// case redis.Message:
-// fmt.Printf("%s: message: %s\n", v.Channel, v.Data)
-// case redis.Subscription:
-// fmt.Printf("%s: %s %d\n", v.Channel, v.Kind, v.Count)
-// case error:
-// return v
-// }
-// }
-//
-// Reply Helpers
-//
-// The Bool, Int, Bytes, String, Strings and Values functions convert a reply
-// to a value of a specific type. To allow convenient wrapping of calls to the
-// connection Do and Receive methods, the functions take a second argument of
-// type error. If the error is non-nil, then the helper function returns the
-// error. If the error is nil, the function converts the reply to the specified
-// type:
-//
-// exists, err := redis.Bool(c.Do("EXISTS", "foo"))
-// if err != nil {
-// // handle error return from c.Do or type conversion error.
-// }
-//
-// The Scan function converts elements of a array reply to Go types:
-//
-// var value1 int
-// var value2 string
-// reply, err := redis.Values(c.Do("MGET", "key1", "key2"))
-// if err != nil {
-// // handle error
-// }
-// if _, err := redis.Scan(reply, &value1, &value2); err != nil {
-// // handle error
-// }
-package redis // import "github.com/garyburd/redigo/redis"
diff --git a/vendor/github.com/garyburd/redigo/redis/log.go b/vendor/github.com/garyburd/redigo/redis/log.go
deleted file mode 100644
index 129b86d67..000000000
--- a/vendor/github.com/garyburd/redigo/redis/log.go
+++ /dev/null
@@ -1,117 +0,0 @@
-// Copyright 2012 Gary Burd
-//
-// Licensed under the Apache License, Version 2.0 (the "License"): you may
-// not use this file except in compliance with the License. You may obtain
-// a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// 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 redis
-
-import (
- "bytes"
- "fmt"
- "log"
-)
-
-// NewLoggingConn returns a logging wrapper around a connection.
-func NewLoggingConn(conn Conn, logger *log.Logger, prefix string) Conn {
- if prefix != "" {
- prefix = prefix + "."
- }
- return &loggingConn{conn, logger, prefix}
-}
-
-type loggingConn struct {
- Conn
- logger *log.Logger
- prefix string
-}
-
-func (c *loggingConn) Close() error {
- err := c.Conn.Close()
- var buf bytes.Buffer
- fmt.Fprintf(&buf, "%sClose() -> (%v)", c.prefix, err)
- c.logger.Output(2, buf.String())
- return err
-}
-
-func (c *loggingConn) printValue(buf *bytes.Buffer, v interface{}) {
- const chop = 32
- switch v := v.(type) {
- case []byte:
- if len(v) > chop {
- fmt.Fprintf(buf, "%q...", v[:chop])
- } else {
- fmt.Fprintf(buf, "%q", v)
- }
- case string:
- if len(v) > chop {
- fmt.Fprintf(buf, "%q...", v[:chop])
- } else {
- fmt.Fprintf(buf, "%q", v)
- }
- case []interface{}:
- if len(v) == 0 {
- buf.WriteString("[]")
- } else {
- sep := "["
- fin := "]"
- if len(v) > chop {
- v = v[:chop]
- fin = "...]"
- }
- for _, vv := range v {
- buf.WriteString(sep)
- c.printValue(buf, vv)
- sep = ", "
- }
- buf.WriteString(fin)
- }
- default:
- fmt.Fprint(buf, v)
- }
-}
-
-func (c *loggingConn) print(method, commandName string, args []interface{}, reply interface{}, err error) {
- var buf bytes.Buffer
- fmt.Fprintf(&buf, "%s%s(", c.prefix, method)
- if method != "Receive" {
- buf.WriteString(commandName)
- for _, arg := range args {
- buf.WriteString(", ")
- c.printValue(&buf, arg)
- }
- }
- buf.WriteString(") -> (")
- if method != "Send" {
- c.printValue(&buf, reply)
- buf.WriteString(", ")
- }
- fmt.Fprintf(&buf, "%v)", err)
- c.logger.Output(3, buf.String())
-}
-
-func (c *loggingConn) Do(commandName string, args ...interface{}) (interface{}, error) {
- reply, err := c.Conn.Do(commandName, args...)
- c.print("Do", commandName, args, reply, err)
- return reply, err
-}
-
-func (c *loggingConn) Send(commandName string, args ...interface{}) error {
- err := c.Conn.Send(commandName, args...)
- c.print("Send", commandName, args, nil, err)
- return err
-}
-
-func (c *loggingConn) Receive() (interface{}, error) {
- reply, err := c.Conn.Receive()
- c.print("Receive", "", nil, reply, err)
- return reply, err
-}
diff --git a/vendor/github.com/garyburd/redigo/redis/pool.go b/vendor/github.com/garyburd/redigo/redis/pool.go
deleted file mode 100644
index d66ef84b6..000000000
--- a/vendor/github.com/garyburd/redigo/redis/pool.go
+++ /dev/null
@@ -1,393 +0,0 @@
-// Copyright 2012 Gary Burd
-//
-// Licensed under the Apache License, Version 2.0 (the "License"): you may
-// not use this file except in compliance with the License. You may obtain
-// a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// 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 redis
-
-import (
- "bytes"
- "container/list"
- "crypto/rand"
- "crypto/sha1"
- "errors"
- "io"
- "strconv"
- "sync"
- "time"
-
- "github.com/garyburd/redigo/internal"
-)
-
-var nowFunc = time.Now // for testing
-
-// ErrPoolExhausted is returned from a pool connection method (Do, Send,
-// Receive, Flush, Err) when the maximum number of database connections in the
-// pool has been reached.
-var ErrPoolExhausted = errors.New("redigo: connection pool exhausted")
-
-var (
- errPoolClosed = errors.New("redigo: connection pool closed")
- errConnClosed = errors.New("redigo: connection closed")
-)
-
-// Pool maintains a pool of connections. The application calls the Get method
-// to get a connection from the pool and the connection's Close method to
-// return the connection's resources to the pool.
-//
-// The following example shows how to use a pool in a web application. The
-// application creates a pool at application startup and makes it available to
-// request handlers using a global variable.
-//
-// func newPool(server, password string) *redis.Pool {
-// return &redis.Pool{
-// MaxIdle: 3,
-// IdleTimeout: 240 * time.Second,
-// Dial: func () (redis.Conn, error) {
-// c, err := redis.Dial("tcp", server)
-// if err != nil {
-// return nil, err
-// }
-// if _, err := c.Do("AUTH", password); err != nil {
-// c.Close()
-// return nil, err
-// }
-// return c, err
-// },
-// TestOnBorrow: func(c redis.Conn, t time.Time) error {
-// _, err := c.Do("PING")
-// return err
-// },
-// }
-// }
-//
-// var (
-// pool *redis.Pool
-// redisServer = flag.String("redisServer", ":6379", "")
-// redisPassword = flag.String("redisPassword", "", "")
-// )
-//
-// func main() {
-// flag.Parse()
-// pool = newPool(*redisServer, *redisPassword)
-// ...
-// }
-//
-// A request handler gets a connection from the pool and closes the connection
-// when the handler is done:
-//
-// func serveHome(w http.ResponseWriter, r *http.Request) {
-// conn := pool.Get()
-// defer conn.Close()
-// ....
-// }
-//
-type Pool struct {
-
- // Dial is an application supplied function for creating and configuring a
- // connection.
- //
- // The connection returned from Dial must not be in a special state
- // (subscribed to pubsub channel, transaction started, ...).
- Dial func() (Conn, error)
-
- // TestOnBorrow is an optional application supplied function for checking
- // the health of an idle connection before the connection is used again by
- // the application. Argument t is the time that the connection was returned
- // to the pool. If the function returns an error, then the connection is
- // closed.
- TestOnBorrow func(c Conn, t time.Time) error
-
- // Maximum number of idle connections in the pool.
- MaxIdle int
-
- // Maximum number of connections allocated by the pool at a given time.
- // When zero, there is no limit on the number of connections in the pool.
- MaxActive int
-
- // Close connections after remaining idle for this duration. If the value
- // is zero, then idle connections are not closed. Applications should set
- // the timeout to a value less than the server's timeout.
- IdleTimeout time.Duration
-
- // If Wait is true and the pool is at the MaxActive limit, then Get() waits
- // for a connection to be returned to the pool before returning.
- Wait bool
-
- // mu protects fields defined below.
- mu sync.Mutex
- cond *sync.Cond
- closed bool
- active int
-
- // Stack of idleConn with most recently used at the front.
- idle list.List
-}
-
-type idleConn struct {
- c Conn
- t time.Time
-}
-
-// NewPool creates a new pool.
-//
-// Deprecated: Initialize the Pool directory as shown in the example.
-func NewPool(newFn func() (Conn, error), maxIdle int) *Pool {
- return &Pool{Dial: newFn, MaxIdle: maxIdle}
-}
-
-// Get gets a connection. The application must close the returned connection.
-// This method always returns a valid connection so that applications can defer
-// error handling to the first use of the connection. If there is an error
-// getting an underlying connection, then the connection Err, Do, Send, Flush
-// and Receive methods return that error.
-func (p *Pool) Get() Conn {
- c, err := p.get()
- if err != nil {
- return errorConnection{err}
- }
- return &pooledConnection{p: p, c: c}
-}
-
-// ActiveCount returns the number of active connections in the pool.
-func (p *Pool) ActiveCount() int {
- p.mu.Lock()
- active := p.active
- p.mu.Unlock()
- return active
-}
-
-// Close releases the resources used by the pool.
-func (p *Pool) Close() error {
- p.mu.Lock()
- idle := p.idle
- p.idle.Init()
- p.closed = true
- p.active -= idle.Len()
- if p.cond != nil {
- p.cond.Broadcast()
- }
- p.mu.Unlock()
- for e := idle.Front(); e != nil; e = e.Next() {
- e.Value.(idleConn).c.Close()
- }
- return nil
-}
-
-// release decrements the active count and signals waiters. The caller must
-// hold p.mu during the call.
-func (p *Pool) release() {
- p.active -= 1
- if p.cond != nil {
- p.cond.Signal()
- }
-}
-
-// get prunes stale connections and returns a connection from the idle list or
-// creates a new connection.
-func (p *Pool) get() (Conn, error) {
- p.mu.Lock()
-
- // Prune stale connections.
-
- if timeout := p.IdleTimeout; timeout > 0 {
- for i, n := 0, p.idle.Len(); i < n; i++ {
- e := p.idle.Back()
- if e == nil {
- break
- }
- ic := e.Value.(idleConn)
- if ic.t.Add(timeout).After(nowFunc()) {
- break
- }
- p.idle.Remove(e)
- p.release()
- p.mu.Unlock()
- ic.c.Close()
- p.mu.Lock()
- }
- }
-
- for {
-
- // Get idle connection.
-
- for i, n := 0, p.idle.Len(); i < n; i++ {
- e := p.idle.Front()
- if e == nil {
- break
- }
- ic := e.Value.(idleConn)
- p.idle.Remove(e)
- test := p.TestOnBorrow
- p.mu.Unlock()
- if test == nil || test(ic.c, ic.t) == nil {
- return ic.c, nil
- }
- ic.c.Close()
- p.mu.Lock()
- p.release()
- }
-
- // Check for pool closed before dialing a new connection.
-
- if p.closed {
- p.mu.Unlock()
- return nil, errors.New("redigo: get on closed pool")
- }
-
- // Dial new connection if under limit.
-
- if p.MaxActive == 0 || p.active < p.MaxActive {
- dial := p.Dial
- p.active += 1
- p.mu.Unlock()
- c, err := dial()
- if err != nil {
- p.mu.Lock()
- p.release()
- p.mu.Unlock()
- c = nil
- }
- return c, err
- }
-
- if !p.Wait {
- p.mu.Unlock()
- return nil, ErrPoolExhausted
- }
-
- if p.cond == nil {
- p.cond = sync.NewCond(&p.mu)
- }
- p.cond.Wait()
- }
-}
-
-func (p *Pool) put(c Conn, forceClose bool) error {
- err := c.Err()
- p.mu.Lock()
- if !p.closed && err == nil && !forceClose {
- p.idle.PushFront(idleConn{t: nowFunc(), c: c})
- if p.idle.Len() > p.MaxIdle {
- c = p.idle.Remove(p.idle.Back()).(idleConn).c
- } else {
- c = nil
- }
- }
-
- if c == nil {
- if p.cond != nil {
- p.cond.Signal()
- }
- p.mu.Unlock()
- return nil
- }
-
- p.release()
- p.mu.Unlock()
- return c.Close()
-}
-
-type pooledConnection struct {
- p *Pool
- c Conn
- state int
-}
-
-var (
- sentinel []byte
- sentinelOnce sync.Once
-)
-
-func initSentinel() {
- p := make([]byte, 64)
- if _, err := rand.Read(p); err == nil {
- sentinel = p
- } else {
- h := sha1.New()
- io.WriteString(h, "Oops, rand failed. Use time instead.")
- io.WriteString(h, strconv.FormatInt(time.Now().UnixNano(), 10))
- sentinel = h.Sum(nil)
- }
-}
-
-func (pc *pooledConnection) Close() error {
- c := pc.c
- if _, ok := c.(errorConnection); ok {
- return nil
- }
- pc.c = errorConnection{errConnClosed}
-
- if pc.state&internal.MultiState != 0 {
- c.Send("DISCARD")
- pc.state &^= (internal.MultiState | internal.WatchState)
- } else if pc.state&internal.WatchState != 0 {
- c.Send("UNWATCH")
- pc.state &^= internal.WatchState
- }
- if pc.state&internal.SubscribeState != 0 {
- c.Send("UNSUBSCRIBE")
- c.Send("PUNSUBSCRIBE")
- // To detect the end of the message stream, ask the server to echo
- // a sentinel value and read until we see that value.
- sentinelOnce.Do(initSentinel)
- c.Send("ECHO", sentinel)
- c.Flush()
- for {
- p, err := c.Receive()
- if err != nil {
- break
- }
- if p, ok := p.([]byte); ok && bytes.Equal(p, sentinel) {
- pc.state &^= internal.SubscribeState
- break
- }
- }
- }
- c.Do("")
- pc.p.put(c, pc.state != 0)
- return nil
-}
-
-func (pc *pooledConnection) Err() error {
- return pc.c.Err()
-}
-
-func (pc *pooledConnection) Do(commandName string, args ...interface{}) (reply interface{}, err error) {
- ci := internal.LookupCommandInfo(commandName)
- pc.state = (pc.state | ci.Set) &^ ci.Clear
- return pc.c.Do(commandName, args...)
-}
-
-func (pc *pooledConnection) Send(commandName string, args ...interface{}) error {
- ci := internal.LookupCommandInfo(commandName)
- pc.state = (pc.state | ci.Set) &^ ci.Clear
- return pc.c.Send(commandName, args...)
-}
-
-func (pc *pooledConnection) Flush() error {
- return pc.c.Flush()
-}
-
-func (pc *pooledConnection) Receive() (reply interface{}, err error) {
- return pc.c.Receive()
-}
-
-type errorConnection struct{ err error }
-
-func (ec errorConnection) Do(string, ...interface{}) (interface{}, error) { return nil, ec.err }
-func (ec errorConnection) Send(string, ...interface{}) error { return ec.err }
-func (ec errorConnection) Err() error { return ec.err }
-func (ec errorConnection) Close() error { return ec.err }
-func (ec errorConnection) Flush() error { return ec.err }
-func (ec errorConnection) Receive() (interface{}, error) { return nil, ec.err }
diff --git a/vendor/github.com/garyburd/redigo/redis/pool_test.go b/vendor/github.com/garyburd/redigo/redis/pool_test.go
deleted file mode 100644
index 9419a128f..000000000
--- a/vendor/github.com/garyburd/redigo/redis/pool_test.go
+++ /dev/null
@@ -1,684 +0,0 @@
-// Copyright 2011 Gary Burd
-//
-// Licensed under the Apache License, Version 2.0 (the "License"): you may
-// not use this file except in compliance with the License. You may obtain
-// a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// 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 redis_test
-
-import (
- "errors"
- "io"
- "reflect"
- "sync"
- "testing"
- "time"
-
- "github.com/garyburd/redigo/redis"
-)
-
-type poolTestConn struct {
- d *poolDialer
- err error
- redis.Conn
-}
-
-func (c *poolTestConn) Close() error {
- c.d.mu.Lock()
- c.d.open -= 1
- c.d.mu.Unlock()
- return c.Conn.Close()
-}
-
-func (c *poolTestConn) Err() error { return c.err }
-
-func (c *poolTestConn) Do(commandName string, args ...interface{}) (interface{}, error) {
- if commandName == "ERR" {
- c.err = args[0].(error)
- commandName = "PING"
- }
- if commandName != "" {
- c.d.commands = append(c.d.commands, commandName)
- }
- return c.Conn.Do(commandName, args...)
-}
-
-func (c *poolTestConn) Send(commandName string, args ...interface{}) error {
- c.d.commands = append(c.d.commands, commandName)
- return c.Conn.Send(commandName, args...)
-}
-
-type poolDialer struct {
- mu sync.Mutex
- t *testing.T
- dialed int
- open int
- commands []string
- dialErr error
-}
-
-func (d *poolDialer) dial() (redis.Conn, error) {
- d.mu.Lock()
- d.dialed += 1
- dialErr := d.dialErr
- d.mu.Unlock()
- if dialErr != nil {
- return nil, d.dialErr
- }
- c, err := redis.DialDefaultServer()
- if err != nil {
- return nil, err
- }
- d.mu.Lock()
- d.open += 1
- d.mu.Unlock()
- return &poolTestConn{d: d, Conn: c}, nil
-}
-
-func (d *poolDialer) check(message string, p *redis.Pool, dialed, open int) {
- d.mu.Lock()
- if d.dialed != dialed {
- d.t.Errorf("%s: dialed=%d, want %d", message, d.dialed, dialed)
- }
- if d.open != open {
- d.t.Errorf("%s: open=%d, want %d", message, d.open, open)
- }
- if active := p.ActiveCount(); active != open {
- d.t.Errorf("%s: active=%d, want %d", message, active, open)
- }
- d.mu.Unlock()
-}
-
-func TestPoolReuse(t *testing.T) {
- d := poolDialer{t: t}
- p := &redis.Pool{
- MaxIdle: 2,
- Dial: d.dial,
- }
-
- for i := 0; i < 10; i++ {
- c1 := p.Get()
- c1.Do("PING")
- c2 := p.Get()
- c2.Do("PING")
- c1.Close()
- c2.Close()
- }
-
- d.check("before close", p, 2, 2)
- p.Close()
- d.check("after close", p, 2, 0)
-}
-
-func TestPoolMaxIdle(t *testing.T) {
- d := poolDialer{t: t}
- p := &redis.Pool{
- MaxIdle: 2,
- Dial: d.dial,
- }
- defer p.Close()
-
- for i := 0; i < 10; i++ {
- c1 := p.Get()
- c1.Do("PING")
- c2 := p.Get()
- c2.Do("PING")
- c3 := p.Get()
- c3.Do("PING")
- c1.Close()
- c2.Close()
- c3.Close()
- }
- d.check("before close", p, 12, 2)
- p.Close()
- d.check("after close", p, 12, 0)
-}
-
-func TestPoolError(t *testing.T) {
- d := poolDialer{t: t}
- p := &redis.Pool{
- MaxIdle: 2,
- Dial: d.dial,
- }
- defer p.Close()
-
- c := p.Get()
- c.Do("ERR", io.EOF)
- if c.Err() == nil {
- t.Errorf("expected c.Err() != nil")
- }
- c.Close()
-
- c = p.Get()
- c.Do("ERR", io.EOF)
- c.Close()
-
- d.check(".", p, 2, 0)
-}
-
-func TestPoolClose(t *testing.T) {
- d := poolDialer{t: t}
- p := &redis.Pool{
- MaxIdle: 2,
- Dial: d.dial,
- }
- defer p.Close()
-
- c1 := p.Get()
- c1.Do("PING")
- c2 := p.Get()
- c2.Do("PING")
- c3 := p.Get()
- c3.Do("PING")
-
- c1.Close()
- if _, err := c1.Do("PING"); err == nil {
- t.Errorf("expected error after connection closed")
- }
-
- c2.Close()
- c2.Close()
-
- p.Close()
-
- d.check("after pool close", p, 3, 1)
-
- if _, err := c1.Do("PING"); err == nil {
- t.Errorf("expected error after connection and pool closed")
- }
-
- c3.Close()
-
- d.check("after conn close", p, 3, 0)
-
- c1 = p.Get()
- if _, err := c1.Do("PING"); err == nil {
- t.Errorf("expected error after pool closed")
- }
-}
-
-func TestPoolTimeout(t *testing.T) {
- d := poolDialer{t: t}
- p := &redis.Pool{
- MaxIdle: 2,
- IdleTimeout: 300 * time.Second,
- Dial: d.dial,
- }
- defer p.Close()
-
- now := time.Now()
- redis.SetNowFunc(func() time.Time { return now })
- defer redis.SetNowFunc(time.Now)
-
- c := p.Get()
- c.Do("PING")
- c.Close()
-
- d.check("1", p, 1, 1)
-
- now = now.Add(p.IdleTimeout)
-
- c = p.Get()
- c.Do("PING")
- c.Close()
-
- d.check("2", p, 2, 1)
-}
-
-func TestPoolConcurrenSendReceive(t *testing.T) {
- p := &redis.Pool{
- Dial: redis.DialDefaultServer,
- }
- defer p.Close()
-
- c := p.Get()
- done := make(chan error, 1)
- go func() {
- _, err := c.Receive()
- done <- err
- }()
- c.Send("PING")
- c.Flush()
- err := <-done
- if err != nil {
- t.Fatalf("Receive() returned error %v", err)
- }
- _, err = c.Do("")
- if err != nil {
- t.Fatalf("Do() returned error %v", err)
- }
- c.Close()
-}
-
-func TestPoolBorrowCheck(t *testing.T) {
- d := poolDialer{t: t}
- p := &redis.Pool{
- MaxIdle: 2,
- Dial: d.dial,
- TestOnBorrow: func(redis.Conn, time.Time) error { return redis.Error("BLAH") },
- }
- defer p.Close()
-
- for i := 0; i < 10; i++ {
- c := p.Get()
- c.Do("PING")
- c.Close()
- }
- d.check("1", p, 10, 1)
-}
-
-func TestPoolMaxActive(t *testing.T) {
- d := poolDialer{t: t}
- p := &redis.Pool{
- MaxIdle: 2,
- MaxActive: 2,
- Dial: d.dial,
- }
- defer p.Close()
-
- c1 := p.Get()
- c1.Do("PING")
- c2 := p.Get()
- c2.Do("PING")
-
- d.check("1", p, 2, 2)
-
- c3 := p.Get()
- if _, err := c3.Do("PING"); err != redis.ErrPoolExhausted {
- t.Errorf("expected pool exhausted")
- }
-
- c3.Close()
- d.check("2", p, 2, 2)
- c2.Close()
- d.check("3", p, 2, 2)
-
- c3 = p.Get()
- if _, err := c3.Do("PING"); err != nil {
- t.Errorf("expected good channel, err=%v", err)
- }
- c3.Close()
-
- d.check("4", p, 2, 2)
-}
-
-func TestPoolMonitorCleanup(t *testing.T) {
- d := poolDialer{t: t}
- p := &redis.Pool{
- MaxIdle: 2,
- MaxActive: 2,
- Dial: d.dial,
- }
- defer p.Close()
-
- c := p.Get()
- c.Send("MONITOR")
- c.Close()
-
- d.check("", p, 1, 0)
-}
-
-func TestPoolPubSubCleanup(t *testing.T) {
- d := poolDialer{t: t}
- p := &redis.Pool{
- MaxIdle: 2,
- MaxActive: 2,
- Dial: d.dial,
- }
- defer p.Close()
-
- c := p.Get()
- c.Send("SUBSCRIBE", "x")
- c.Close()
-
- want := []string{"SUBSCRIBE", "UNSUBSCRIBE", "PUNSUBSCRIBE", "ECHO"}
- if !reflect.DeepEqual(d.commands, want) {
- t.Errorf("got commands %v, want %v", d.commands, want)
- }
- d.commands = nil
-
- c = p.Get()
- c.Send("PSUBSCRIBE", "x*")
- c.Close()
-
- want = []string{"PSUBSCRIBE", "UNSUBSCRIBE", "PUNSUBSCRIBE", "ECHO"}
- if !reflect.DeepEqual(d.commands, want) {
- t.Errorf("got commands %v, want %v", d.commands, want)
- }
- d.commands = nil
-}
-
-func TestPoolTransactionCleanup(t *testing.T) {
- d := poolDialer{t: t}
- p := &redis.Pool{
- MaxIdle: 2,
- MaxActive: 2,
- Dial: d.dial,
- }
- defer p.Close()
-
- c := p.Get()
- c.Do("WATCH", "key")
- c.Do("PING")
- c.Close()
-
- want := []string{"WATCH", "PING", "UNWATCH"}
- if !reflect.DeepEqual(d.commands, want) {
- t.Errorf("got commands %v, want %v", d.commands, want)
- }
- d.commands = nil
-
- c = p.Get()
- c.Do("WATCH", "key")
- c.Do("UNWATCH")
- c.Do("PING")
- c.Close()
-
- want = []string{"WATCH", "UNWATCH", "PING"}
- if !reflect.DeepEqual(d.commands, want) {
- t.Errorf("got commands %v, want %v", d.commands, want)
- }
- d.commands = nil
-
- c = p.Get()
- c.Do("WATCH", "key")
- c.Do("MULTI")
- c.Do("PING")
- c.Close()
-
- want = []string{"WATCH", "MULTI", "PING", "DISCARD"}
- if !reflect.DeepEqual(d.commands, want) {
- t.Errorf("got commands %v, want %v", d.commands, want)
- }
- d.commands = nil
-
- c = p.Get()
- c.Do("WATCH", "key")
- c.Do("MULTI")
- c.Do("DISCARD")
- c.Do("PING")
- c.Close()
-
- want = []string{"WATCH", "MULTI", "DISCARD", "PING"}
- if !reflect.DeepEqual(d.commands, want) {
- t.Errorf("got commands %v, want %v", d.commands, want)
- }
- d.commands = nil
-
- c = p.Get()
- c.Do("WATCH", "key")
- c.Do("MULTI")
- c.Do("EXEC")
- c.Do("PING")
- c.Close()
-
- want = []string{"WATCH", "MULTI", "EXEC", "PING"}
- if !reflect.DeepEqual(d.commands, want) {
- t.Errorf("got commands %v, want %v", d.commands, want)
- }
- d.commands = nil
-}
-
-func startGoroutines(p *redis.Pool, cmd string, args ...interface{}) chan error {
- errs := make(chan error, 10)
- for i := 0; i < cap(errs); i++ {
- go func() {
- c := p.Get()
- _, err := c.Do(cmd, args...)
- errs <- err
- c.Close()
- }()
- }
-
- // Wait for goroutines to block.
- time.Sleep(time.Second / 4)
-
- return errs
-}
-
-func TestWaitPool(t *testing.T) {
- d := poolDialer{t: t}
- p := &redis.Pool{
- MaxIdle: 1,
- MaxActive: 1,
- Dial: d.dial,
- Wait: true,
- }
- defer p.Close()
-
- c := p.Get()
- errs := startGoroutines(p, "PING")
- d.check("before close", p, 1, 1)
- c.Close()
- timeout := time.After(2 * time.Second)
- for i := 0; i < cap(errs); i++ {
- select {
- case err := <-errs:
- if err != nil {
- t.Fatal(err)
- }
- case <-timeout:
- t.Fatalf("timeout waiting for blocked goroutine %d", i)
- }
- }
- d.check("done", p, 1, 1)
-}
-
-func TestWaitPoolClose(t *testing.T) {
- d := poolDialer{t: t}
- p := &redis.Pool{
- MaxIdle: 1,
- MaxActive: 1,
- Dial: d.dial,
- Wait: true,
- }
- defer p.Close()
-
- c := p.Get()
- if _, err := c.Do("PING"); err != nil {
- t.Fatal(err)
- }
- errs := startGoroutines(p, "PING")
- d.check("before close", p, 1, 1)
- p.Close()
- timeout := time.After(2 * time.Second)
- for i := 0; i < cap(errs); i++ {
- select {
- case err := <-errs:
- switch err {
- case nil:
- t.Fatal("blocked goroutine did not get error")
- case redis.ErrPoolExhausted:
- t.Fatal("blocked goroutine got pool exhausted error")
- }
- case <-timeout:
- t.Fatal("timeout waiting for blocked goroutine")
- }
- }
- c.Close()
- d.check("done", p, 1, 0)
-}
-
-func TestWaitPoolCommandError(t *testing.T) {
- testErr := errors.New("test")
- d := poolDialer{t: t}
- p := &redis.Pool{
- MaxIdle: 1,
- MaxActive: 1,
- Dial: d.dial,
- Wait: true,
- }
- defer p.Close()
-
- c := p.Get()
- errs := startGoroutines(p, "ERR", testErr)
- d.check("before close", p, 1, 1)
- c.Close()
- timeout := time.After(2 * time.Second)
- for i := 0; i < cap(errs); i++ {
- select {
- case err := <-errs:
- if err != nil {
- t.Fatal(err)
- }
- case <-timeout:
- t.Fatalf("timeout waiting for blocked goroutine %d", i)
- }
- }
- d.check("done", p, cap(errs), 0)
-}
-
-func TestWaitPoolDialError(t *testing.T) {
- testErr := errors.New("test")
- d := poolDialer{t: t}
- p := &redis.Pool{
- MaxIdle: 1,
- MaxActive: 1,
- Dial: d.dial,
- Wait: true,
- }
- defer p.Close()
-
- c := p.Get()
- errs := startGoroutines(p, "ERR", testErr)
- d.check("before close", p, 1, 1)
-
- d.dialErr = errors.New("dial")
- c.Close()
-
- nilCount := 0
- errCount := 0
- timeout := time.After(2 * time.Second)
- for i := 0; i < cap(errs); i++ {
- select {
- case err := <-errs:
- switch err {
- case nil:
- nilCount++
- case d.dialErr:
- errCount++
- default:
- t.Fatalf("expected dial error or nil, got %v", err)
- }
- case <-timeout:
- t.Fatalf("timeout waiting for blocked goroutine %d", i)
- }
- }
- if nilCount != 1 {
- t.Errorf("expected one nil error, got %d", nilCount)
- }
- if errCount != cap(errs)-1 {
- t.Errorf("expected %d dial erors, got %d", cap(errs)-1, errCount)
- }
- d.check("done", p, cap(errs), 0)
-}
-
-// Borrowing requires us to iterate over the idle connections, unlock the pool,
-// and perform a blocking operation to check the connection still works. If
-// TestOnBorrow fails, we must reacquire the lock and continue iteration. This
-// test ensures that iteration will work correctly if multiple threads are
-// iterating simultaneously.
-func TestLocking_TestOnBorrowFails_PoolDoesntCrash(t *testing.T) {
- const count = 100
-
- // First we'll Create a pool where the pilfering of idle connections fails.
- d := poolDialer{t: t}
- p := &redis.Pool{
- MaxIdle: count,
- MaxActive: count,
- Dial: d.dial,
- TestOnBorrow: func(c redis.Conn, t time.Time) error {
- return errors.New("No way back into the real world.")
- },
- }
- defer p.Close()
-
- // Fill the pool with idle connections.
- conns := make([]redis.Conn, count)
- for i := range conns {
- conns[i] = p.Get()
- }
- for i := range conns {
- conns[i].Close()
- }
-
- // Spawn a bunch of goroutines to thrash the pool.
- var wg sync.WaitGroup
- wg.Add(count)
- for i := 0; i < count; i++ {
- go func() {
- c := p.Get()
- if c.Err() != nil {
- t.Errorf("pool get failed: %v", c.Err())
- }
- c.Close()
- wg.Done()
- }()
- }
- wg.Wait()
- if d.dialed != count*2 {
- t.Errorf("Expected %d dials, got %d", count*2, d.dialed)
- }
-}
-
-func BenchmarkPoolGet(b *testing.B) {
- b.StopTimer()
- p := redis.Pool{Dial: redis.DialDefaultServer, MaxIdle: 2}
- c := p.Get()
- if err := c.Err(); err != nil {
- b.Fatal(err)
- }
- c.Close()
- defer p.Close()
- b.StartTimer()
- for i := 0; i < b.N; i++ {
- c = p.Get()
- c.Close()
- }
-}
-
-func BenchmarkPoolGetErr(b *testing.B) {
- b.StopTimer()
- p := redis.Pool{Dial: redis.DialDefaultServer, MaxIdle: 2}
- c := p.Get()
- if err := c.Err(); err != nil {
- b.Fatal(err)
- }
- c.Close()
- defer p.Close()
- b.StartTimer()
- for i := 0; i < b.N; i++ {
- c = p.Get()
- if err := c.Err(); err != nil {
- b.Fatal(err)
- }
- c.Close()
- }
-}
-
-func BenchmarkPoolGetPing(b *testing.B) {
- b.StopTimer()
- p := redis.Pool{Dial: redis.DialDefaultServer, MaxIdle: 2}
- c := p.Get()
- if err := c.Err(); err != nil {
- b.Fatal(err)
- }
- c.Close()
- defer p.Close()
- b.StartTimer()
- for i := 0; i < b.N; i++ {
- c = p.Get()
- if _, err := c.Do("PING"); err != nil {
- b.Fatal(err)
- }
- c.Close()
- }
-}
diff --git a/vendor/github.com/garyburd/redigo/redis/pubsub.go b/vendor/github.com/garyburd/redigo/redis/pubsub.go
deleted file mode 100644
index c0ecce824..000000000
--- a/vendor/github.com/garyburd/redigo/redis/pubsub.go
+++ /dev/null
@@ -1,144 +0,0 @@
-// Copyright 2012 Gary Burd
-//
-// Licensed under the Apache License, Version 2.0 (the "License"): you may
-// not use this file except in compliance with the License. You may obtain
-// a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// 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 redis
-
-import "errors"
-
-// Subscription represents a subscribe or unsubscribe notification.
-type Subscription struct {
-
- // Kind is "subscribe", "unsubscribe", "psubscribe" or "punsubscribe"
- Kind string
-
- // The channel that was changed.
- Channel string
-
- // The current number of subscriptions for connection.
- Count int
-}
-
-// Message represents a message notification.
-type Message struct {
-
- // The originating channel.
- Channel string
-
- // The message data.
- Data []byte
-}
-
-// PMessage represents a pmessage notification.
-type PMessage struct {
-
- // The matched pattern.
- Pattern string
-
- // The originating channel.
- Channel string
-
- // The message data.
- Data []byte
-}
-
-// Pong represents a pubsub pong notification.
-type Pong struct {
- Data string
-}
-
-// PubSubConn wraps a Conn with convenience methods for subscribers.
-type PubSubConn struct {
- Conn Conn
-}
-
-// Close closes the connection.
-func (c PubSubConn) Close() error {
- return c.Conn.Close()
-}
-
-// Subscribe subscribes the connection to the specified channels.
-func (c PubSubConn) Subscribe(channel ...interface{}) error {
- c.Conn.Send("SUBSCRIBE", channel...)
- return c.Conn.Flush()
-}
-
-// PSubscribe subscribes the connection to the given patterns.
-func (c PubSubConn) PSubscribe(channel ...interface{}) error {
- c.Conn.Send("PSUBSCRIBE", channel...)
- return c.Conn.Flush()
-}
-
-// Unsubscribe unsubscribes the connection from the given channels, or from all
-// of them if none is given.
-func (c PubSubConn) Unsubscribe(channel ...interface{}) error {
- c.Conn.Send("UNSUBSCRIBE", channel...)
- return c.Conn.Flush()
-}
-
-// PUnsubscribe unsubscribes the connection from the given patterns, or from all
-// of them if none is given.
-func (c PubSubConn) PUnsubscribe(channel ...interface{}) error {
- c.Conn.Send("PUNSUBSCRIBE", channel...)
- return c.Conn.Flush()
-}
-
-// Ping sends a PING to the server with the specified data.
-func (c PubSubConn) Ping(data string) error {
- c.Conn.Send("PING", data)
- return c.Conn.Flush()
-}
-
-// Receive returns a pushed message as a Subscription, Message, PMessage, Pong
-// or error. The return value is intended to be used directly in a type switch
-// as illustrated in the PubSubConn example.
-func (c PubSubConn) Receive() interface{} {
- reply, err := Values(c.Conn.Receive())
- if err != nil {
- return err
- }
-
- var kind string
- reply, err = Scan(reply, &kind)
- if err != nil {
- return err
- }
-
- switch kind {
- case "message":
- var m Message
- if _, err := Scan(reply, &m.Channel, &m.Data); err != nil {
- return err
- }
- return m
- case "pmessage":
- var pm PMessage
- if _, err := Scan(reply, &pm.Pattern, &pm.Channel, &pm.Data); err != nil {
- return err
- }
- return pm
- case "subscribe", "psubscribe", "unsubscribe", "punsubscribe":
- s := Subscription{Kind: kind}
- if _, err := Scan(reply, &s.Channel, &s.Count); err != nil {
- return err
- }
- return s
- case "pong":
- var p Pong
- if _, err := Scan(reply, &p.Data); err != nil {
- return err
- }
- return p
- }
- return errors.New("redigo: unknown pubsub notification")
-}
diff --git a/vendor/github.com/garyburd/redigo/redis/pubsub_test.go b/vendor/github.com/garyburd/redigo/redis/pubsub_test.go
deleted file mode 100644
index b95513155..000000000
--- a/vendor/github.com/garyburd/redigo/redis/pubsub_test.go
+++ /dev/null
@@ -1,148 +0,0 @@
-// Copyright 2012 Gary Burd
-//
-// Licensed under the Apache License, Version 2.0 (the "License"): you may
-// not use this file except in compliance with the License. You may obtain
-// a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// 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 redis_test
-
-import (
- "fmt"
- "reflect"
- "sync"
- "testing"
-
- "github.com/garyburd/redigo/redis"
-)
-
-func publish(channel, value interface{}) {
- c, err := dial()
- if err != nil {
- fmt.Println(err)
- return
- }
- defer c.Close()
- c.Do("PUBLISH", channel, value)
-}
-
-// Applications can receive pushed messages from one goroutine and manage subscriptions from another goroutine.
-func ExamplePubSubConn() {
- c, err := dial()
- if err != nil {
- fmt.Println(err)
- return
- }
- defer c.Close()
- var wg sync.WaitGroup
- wg.Add(2)
-
- psc := redis.PubSubConn{Conn: c}
-
- // This goroutine receives and prints pushed notifications from the server.
- // The goroutine exits when the connection is unsubscribed from all
- // channels or there is an error.
- go func() {
- defer wg.Done()
- for {
- switch n := psc.Receive().(type) {
- case redis.Message:
- fmt.Printf("Message: %s %s\n", n.Channel, n.Data)
- case redis.PMessage:
- fmt.Printf("PMessage: %s %s %s\n", n.Pattern, n.Channel, n.Data)
- case redis.Subscription:
- fmt.Printf("Subscription: %s %s %d\n", n.Kind, n.Channel, n.Count)
- if n.Count == 0 {
- return
- }
- case error:
- fmt.Printf("error: %v\n", n)
- return
- }
- }
- }()
-
- // This goroutine manages subscriptions for the connection.
- go func() {
- defer wg.Done()
-
- psc.Subscribe("example")
- psc.PSubscribe("p*")
-
- // The following function calls publish a message using another
- // connection to the Redis server.
- publish("example", "hello")
- publish("example", "world")
- publish("pexample", "foo")
- publish("pexample", "bar")
-
- // Unsubscribe from all connections. This will cause the receiving
- // goroutine to exit.
- psc.Unsubscribe()
- psc.PUnsubscribe()
- }()
-
- wg.Wait()
-
- // Output:
- // Subscription: subscribe example 1
- // Subscription: psubscribe p* 2
- // Message: example hello
- // Message: example world
- // PMessage: p* pexample foo
- // PMessage: p* pexample bar
- // Subscription: unsubscribe example 1
- // Subscription: punsubscribe p* 0
-}
-
-func expectPushed(t *testing.T, c redis.PubSubConn, message string, expected interface{}) {
- actual := c.Receive()
- if !reflect.DeepEqual(actual, expected) {
- t.Errorf("%s = %v, want %v", message, actual, expected)
- }
-}
-
-func TestPushed(t *testing.T) {
- pc, err := redis.DialDefaultServer()
- if err != nil {
- t.Fatalf("error connection to database, %v", err)
- }
- defer pc.Close()
-
- sc, err := redis.DialDefaultServer()
- if err != nil {
- t.Fatalf("error connection to database, %v", err)
- }
- defer sc.Close()
-
- c := redis.PubSubConn{Conn: sc}
-
- c.Subscribe("c1")
- expectPushed(t, c, "Subscribe(c1)", redis.Subscription{Kind: "subscribe", Channel: "c1", Count: 1})
- c.Subscribe("c2")
- expectPushed(t, c, "Subscribe(c2)", redis.Subscription{Kind: "subscribe", Channel: "c2", Count: 2})
- c.PSubscribe("p1")
- expectPushed(t, c, "PSubscribe(p1)", redis.Subscription{Kind: "psubscribe", Channel: "p1", Count: 3})
- c.PSubscribe("p2")
- expectPushed(t, c, "PSubscribe(p2)", redis.Subscription{Kind: "psubscribe", Channel: "p2", Count: 4})
- c.PUnsubscribe()
- expectPushed(t, c, "Punsubscribe(p1)", redis.Subscription{Kind: "punsubscribe", Channel: "p1", Count: 3})
- expectPushed(t, c, "Punsubscribe()", redis.Subscription{Kind: "punsubscribe", Channel: "p2", Count: 2})
-
- pc.Do("PUBLISH", "c1", "hello")
- expectPushed(t, c, "PUBLISH c1 hello", redis.Message{Channel: "c1", Data: []byte("hello")})
-
- c.Ping("hello")
- expectPushed(t, c, `Ping("hello")`, redis.Pong{Data: "hello"})
-
- c.Conn.Send("PING")
- c.Conn.Flush()
- expectPushed(t, c, `Send("PING")`, redis.Pong{})
-}
diff --git a/vendor/github.com/garyburd/redigo/redis/redis.go b/vendor/github.com/garyburd/redigo/redis/redis.go
deleted file mode 100644
index c90a48ed4..000000000
--- a/vendor/github.com/garyburd/redigo/redis/redis.go
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright 2012 Gary Burd
-//
-// Licensed under the Apache License, Version 2.0 (the "License"): you may
-// not use this file except in compliance with the License. You may obtain
-// a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// 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 redis
-
-// Error represents an error returned in a command reply.
-type Error string
-
-func (err Error) Error() string { return string(err) }
-
-// Conn represents a connection to a Redis server.
-type Conn interface {
- // Close closes the connection.
- Close() error
-
- // Err returns a non-nil value if the connection is broken. The returned
- // value is either the first non-nil value returned from the underlying
- // network connection or a protocol parsing error. Applications should
- // close broken connections.
- Err() error
-
- // Do sends a command to the server and returns the received reply.
- Do(commandName string, args ...interface{}) (reply interface{}, err error)
-
- // Send writes the command to the client's output buffer.
- Send(commandName string, args ...interface{}) error
-
- // Flush flushes the output buffer to the Redis server.
- Flush() error
-
- // Receive receives a single reply from the Redis server
- Receive() (reply interface{}, err error)
-}
diff --git a/vendor/github.com/garyburd/redigo/redis/reply.go b/vendor/github.com/garyburd/redigo/redis/reply.go
deleted file mode 100644
index 57896147f..000000000
--- a/vendor/github.com/garyburd/redigo/redis/reply.go
+++ /dev/null
@@ -1,393 +0,0 @@
-// Copyright 2012 Gary Burd
-//
-// Licensed under the Apache License, Version 2.0 (the "License"): you may
-// not use this file except in compliance with the License. You may obtain
-// a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// 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 redis
-
-import (
- "errors"
- "fmt"
- "strconv"
-)
-
-// ErrNil indicates that a reply value is nil.
-var ErrNil = errors.New("redigo: nil returned")
-
-// Int is a helper that converts a command reply to an integer. If err is not
-// equal to nil, then Int returns 0, err. Otherwise, Int converts the
-// reply to an int as follows:
-//
-// Reply type Result
-// integer int(reply), nil
-// bulk string parsed reply, nil
-// nil 0, ErrNil
-// other 0, error
-func Int(reply interface{}, err error) (int, error) {
- if err != nil {
- return 0, err
- }
- switch reply := reply.(type) {
- case int64:
- x := int(reply)
- if int64(x) != reply {
- return 0, strconv.ErrRange
- }
- return x, nil
- case []byte:
- n, err := strconv.ParseInt(string(reply), 10, 0)
- return int(n), err
- case nil:
- return 0, ErrNil
- case Error:
- return 0, reply
- }
- return 0, fmt.Errorf("redigo: unexpected type for Int, got type %T", reply)
-}
-
-// Int64 is a helper that converts a command reply to 64 bit integer. If err is
-// not equal to nil, then Int returns 0, err. Otherwise, Int64 converts the
-// reply to an int64 as follows:
-//
-// Reply type Result
-// integer reply, nil
-// bulk string parsed reply, nil
-// nil 0, ErrNil
-// other 0, error
-func Int64(reply interface{}, err error) (int64, error) {
- if err != nil {
- return 0, err
- }
- switch reply := reply.(type) {
- case int64:
- return reply, nil
- case []byte:
- n, err := strconv.ParseInt(string(reply), 10, 64)
- return n, err
- case nil:
- return 0, ErrNil
- case Error:
- return 0, reply
- }
- return 0, fmt.Errorf("redigo: unexpected type for Int64, got type %T", reply)
-}
-
-var errNegativeInt = errors.New("redigo: unexpected value for Uint64")
-
-// Uint64 is a helper that converts a command reply to 64 bit integer. If err is
-// not equal to nil, then Int returns 0, err. Otherwise, Int64 converts the
-// reply to an int64 as follows:
-//
-// Reply type Result
-// integer reply, nil
-// bulk string parsed reply, nil
-// nil 0, ErrNil
-// other 0, error
-func Uint64(reply interface{}, err error) (uint64, error) {
- if err != nil {
- return 0, err
- }
- switch reply := reply.(type) {
- case int64:
- if reply < 0 {
- return 0, errNegativeInt
- }
- return uint64(reply), nil
- case []byte:
- n, err := strconv.ParseUint(string(reply), 10, 64)
- return n, err
- case nil:
- return 0, ErrNil
- case Error:
- return 0, reply
- }
- return 0, fmt.Errorf("redigo: unexpected type for Uint64, got type %T", reply)
-}
-
-// Float64 is a helper that converts a command reply to 64 bit float. If err is
-// not equal to nil, then Float64 returns 0, err. Otherwise, Float64 converts
-// the reply to an int as follows:
-//
-// Reply type Result
-// bulk string parsed reply, nil
-// nil 0, ErrNil
-// other 0, error
-func Float64(reply interface{}, err error) (float64, error) {
- if err != nil {
- return 0, err
- }
- switch reply := reply.(type) {
- case []byte:
- n, err := strconv.ParseFloat(string(reply), 64)
- return n, err
- case nil:
- return 0, ErrNil
- case Error:
- return 0, reply
- }
- return 0, fmt.Errorf("redigo: unexpected type for Float64, got type %T", reply)
-}
-
-// String is a helper that converts a command reply to a string. If err is not
-// equal to nil, then String returns "", err. Otherwise String converts the
-// reply to a string as follows:
-//
-// Reply type Result
-// bulk string string(reply), nil
-// simple string reply, nil
-// nil "", ErrNil
-// other "", error
-func String(reply interface{}, err error) (string, error) {
- if err != nil {
- return "", err
- }
- switch reply := reply.(type) {
- case []byte:
- return string(reply), nil
- case string:
- return reply, nil
- case nil:
- return "", ErrNil
- case Error:
- return "", reply
- }
- return "", fmt.Errorf("redigo: unexpected type for String, got type %T", reply)
-}
-
-// Bytes is a helper that converts a command reply to a slice of bytes. If err
-// is not equal to nil, then Bytes returns nil, err. Otherwise Bytes converts
-// the reply to a slice of bytes as follows:
-//
-// Reply type Result
-// bulk string reply, nil
-// simple string []byte(reply), nil
-// nil nil, ErrNil
-// other nil, error
-func Bytes(reply interface{}, err error) ([]byte, error) {
- if err != nil {
- return nil, err
- }
- switch reply := reply.(type) {
- case []byte:
- return reply, nil
- case string:
- return []byte(reply), nil
- case nil:
- return nil, ErrNil
- case Error:
- return nil, reply
- }
- return nil, fmt.Errorf("redigo: unexpected type for Bytes, got type %T", reply)
-}
-
-// Bool is a helper that converts a command reply to a boolean. If err is not
-// equal to nil, then Bool returns false, err. Otherwise Bool converts the
-// reply to boolean as follows:
-//
-// Reply type Result
-// integer value != 0, nil
-// bulk string strconv.ParseBool(reply)
-// nil false, ErrNil
-// other false, error
-func Bool(reply interface{}, err error) (bool, error) {
- if err != nil {
- return false, err
- }
- switch reply := reply.(type) {
- case int64:
- return reply != 0, nil
- case []byte:
- return strconv.ParseBool(string(reply))
- case nil:
- return false, ErrNil
- case Error:
- return false, reply
- }
- return false, fmt.Errorf("redigo: unexpected type for Bool, got type %T", reply)
-}
-
-// MultiBulk is a helper that converts an array command reply to a []interface{}.
-//
-// Deprecated: Use Values instead.
-func MultiBulk(reply interface{}, err error) ([]interface{}, error) { return Values(reply, err) }
-
-// Values is a helper that converts an array command reply to a []interface{}.
-// If err is not equal to nil, then Values returns nil, err. Otherwise, Values
-// converts the reply as follows:
-//
-// Reply type Result
-// array reply, nil
-// nil nil, ErrNil
-// other nil, error
-func Values(reply interface{}, err error) ([]interface{}, error) {
- if err != nil {
- return nil, err
- }
- switch reply := reply.(type) {
- case []interface{}:
- return reply, nil
- case nil:
- return nil, ErrNil
- case Error:
- return nil, reply
- }
- return nil, fmt.Errorf("redigo: unexpected type for Values, got type %T", reply)
-}
-
-// Strings is a helper that converts an array command reply to a []string. If
-// err is not equal to nil, then Strings returns nil, err. Nil array items are
-// converted to "" in the output slice. Strings returns an error if an array
-// item is not a bulk string or nil.
-func Strings(reply interface{}, err error) ([]string, error) {
- if err != nil {
- return nil, err
- }
- switch reply := reply.(type) {
- case []interface{}:
- result := make([]string, len(reply))
- for i := range reply {
- if reply[i] == nil {
- continue
- }
- p, ok := reply[i].([]byte)
- if !ok {
- return nil, fmt.Errorf("redigo: unexpected element type for Strings, got type %T", reply[i])
- }
- result[i] = string(p)
- }
- return result, nil
- case nil:
- return nil, ErrNil
- case Error:
- return nil, reply
- }
- return nil, fmt.Errorf("redigo: unexpected type for Strings, got type %T", reply)
-}
-
-// ByteSlices is a helper that converts an array command reply to a [][]byte.
-// If err is not equal to nil, then ByteSlices returns nil, err. Nil array
-// items are stay nil. ByteSlices returns an error if an array item is not a
-// bulk string or nil.
-func ByteSlices(reply interface{}, err error) ([][]byte, error) {
- if err != nil {
- return nil, err
- }
- switch reply := reply.(type) {
- case []interface{}:
- result := make([][]byte, len(reply))
- for i := range reply {
- if reply[i] == nil {
- continue
- }
- p, ok := reply[i].([]byte)
- if !ok {
- return nil, fmt.Errorf("redigo: unexpected element type for ByteSlices, got type %T", reply[i])
- }
- result[i] = p
- }
- return result, nil
- case nil:
- return nil, ErrNil
- case Error:
- return nil, reply
- }
- return nil, fmt.Errorf("redigo: unexpected type for ByteSlices, got type %T", reply)
-}
-
-// Ints is a helper that converts an array command reply to a []int. If
-// err is not equal to nil, then Ints returns nil, err.
-func Ints(reply interface{}, err error) ([]int, error) {
- var ints []int
- values, err := Values(reply, err)
- if err != nil {
- return ints, err
- }
- if err := ScanSlice(values, &ints); err != nil {
- return ints, err
- }
- return ints, nil
-}
-
-// StringMap is a helper that converts an array of strings (alternating key, value)
-// into a map[string]string. The HGETALL and CONFIG GET commands return replies in this format.
-// Requires an even number of values in result.
-func StringMap(result interface{}, err error) (map[string]string, error) {
- values, err := Values(result, err)
- if err != nil {
- return nil, err
- }
- if len(values)%2 != 0 {
- return nil, errors.New("redigo: StringMap expects even number of values result")
- }
- m := make(map[string]string, len(values)/2)
- for i := 0; i < len(values); i += 2 {
- key, okKey := values[i].([]byte)
- value, okValue := values[i+1].([]byte)
- if !okKey || !okValue {
- return nil, errors.New("redigo: ScanMap key not a bulk string value")
- }
- m[string(key)] = string(value)
- }
- return m, nil
-}
-
-// IntMap is a helper that converts an array of strings (alternating key, value)
-// into a map[string]int. The HGETALL commands return replies in this format.
-// Requires an even number of values in result.
-func IntMap(result interface{}, err error) (map[string]int, error) {
- values, err := Values(result, err)
- if err != nil {
- return nil, err
- }
- if len(values)%2 != 0 {
- return nil, errors.New("redigo: IntMap expects even number of values result")
- }
- m := make(map[string]int, len(values)/2)
- for i := 0; i < len(values); i += 2 {
- key, ok := values[i].([]byte)
- if !ok {
- return nil, errors.New("redigo: ScanMap key not a bulk string value")
- }
- value, err := Int(values[i+1], nil)
- if err != nil {
- return nil, err
- }
- m[string(key)] = value
- }
- return m, nil
-}
-
-// Int64Map is a helper that converts an array of strings (alternating key, value)
-// into a map[string]int64. The HGETALL commands return replies in this format.
-// Requires an even number of values in result.
-func Int64Map(result interface{}, err error) (map[string]int64, error) {
- values, err := Values(result, err)
- if err != nil {
- return nil, err
- }
- if len(values)%2 != 0 {
- return nil, errors.New("redigo: Int64Map expects even number of values result")
- }
- m := make(map[string]int64, len(values)/2)
- for i := 0; i < len(values); i += 2 {
- key, ok := values[i].([]byte)
- if !ok {
- return nil, errors.New("redigo: ScanMap key not a bulk string value")
- }
- value, err := Int64(values[i+1], nil)
- if err != nil {
- return nil, err
- }
- m[string(key)] = value
- }
- return m, nil
-}
diff --git a/vendor/github.com/garyburd/redigo/redis/reply_test.go b/vendor/github.com/garyburd/redigo/redis/reply_test.go
deleted file mode 100644
index 2c774866d..000000000
--- a/vendor/github.com/garyburd/redigo/redis/reply_test.go
+++ /dev/null
@@ -1,179 +0,0 @@
-// Copyright 2012 Gary Burd
-//
-// Licensed under the Apache License, Version 2.0 (the "License"): you may
-// not use this file except in compliance with the License. You may obtain
-// a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// 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 redis_test
-
-import (
- "fmt"
- "reflect"
- "testing"
-
- "github.com/garyburd/redigo/redis"
-)
-
-type valueError struct {
- v interface{}
- err error
-}
-
-func ve(v interface{}, err error) valueError {
- return valueError{v, err}
-}
-
-var replyTests = []struct {
- name interface{}
- actual valueError
- expected valueError
-}{
- {
- "ints([v1, v2])",
- ve(redis.Ints([]interface{}{[]byte("4"), []byte("5")}, nil)),
- ve([]int{4, 5}, nil),
- },
- {
- "ints(nil)",
- ve(redis.Ints(nil, nil)),
- ve([]int(nil), redis.ErrNil),
- },
- {
- "strings([v1, v2])",
- ve(redis.Strings([]interface{}{[]byte("v1"), []byte("v2")}, nil)),
- ve([]string{"v1", "v2"}, nil),
- },
- {
- "strings(nil)",
- ve(redis.Strings(nil, nil)),
- ve([]string(nil), redis.ErrNil),
- },
- {
- "byteslices([v1, v2])",
- ve(redis.ByteSlices([]interface{}{[]byte("v1"), []byte("v2")}, nil)),
- ve([][]byte{[]byte("v1"), []byte("v2")}, nil),
- },
- {
- "byteslices(nil)",
- ve(redis.ByteSlices(nil, nil)),
- ve([][]byte(nil), redis.ErrNil),
- },
- {
- "values([v1, v2])",
- ve(redis.Values([]interface{}{[]byte("v1"), []byte("v2")}, nil)),
- ve([]interface{}{[]byte("v1"), []byte("v2")}, nil),
- },
- {
- "values(nil)",
- ve(redis.Values(nil, nil)),
- ve([]interface{}(nil), redis.ErrNil),
- },
- {
- "float64(1.0)",
- ve(redis.Float64([]byte("1.0"), nil)),
- ve(float64(1.0), nil),
- },
- {
- "float64(nil)",
- ve(redis.Float64(nil, nil)),
- ve(float64(0.0), redis.ErrNil),
- },
- {
- "uint64(1)",
- ve(redis.Uint64(int64(1), nil)),
- ve(uint64(1), nil),
- },
- {
- "uint64(-1)",
- ve(redis.Uint64(int64(-1), nil)),
- ve(uint64(0), redis.ErrNegativeInt),
- },
-}
-
-func TestReply(t *testing.T) {
- for _, rt := range replyTests {
- if rt.actual.err != rt.expected.err {
- t.Errorf("%s returned err %v, want %v", rt.name, rt.actual.err, rt.expected.err)
- continue
- }
- if !reflect.DeepEqual(rt.actual.v, rt.expected.v) {
- t.Errorf("%s=%+v, want %+v", rt.name, rt.actual.v, rt.expected.v)
- }
- }
-}
-
-// dial wraps DialDefaultServer() with a more suitable function name for examples.
-func dial() (redis.Conn, error) {
- return redis.DialDefaultServer()
-}
-
-func ExampleBool() {
- c, err := dial()
- if err != nil {
- fmt.Println(err)
- return
- }
- defer c.Close()
-
- c.Do("SET", "foo", 1)
- exists, _ := redis.Bool(c.Do("EXISTS", "foo"))
- fmt.Printf("%#v\n", exists)
- // Output:
- // true
-}
-
-func ExampleInt() {
- c, err := dial()
- if err != nil {
- fmt.Println(err)
- return
- }
- defer c.Close()
-
- c.Do("SET", "k1", 1)
- n, _ := redis.Int(c.Do("GET", "k1"))
- fmt.Printf("%#v\n", n)
- n, _ = redis.Int(c.Do("INCR", "k1"))
- fmt.Printf("%#v\n", n)
- // Output:
- // 1
- // 2
-}
-
-func ExampleInts() {
- c, err := dial()
- if err != nil {
- fmt.Println(err)
- return
- }
- defer c.Close()
-
- c.Do("SADD", "set_with_integers", 4, 5, 6)
- ints, _ := redis.Ints(c.Do("SMEMBERS", "set_with_integers"))
- fmt.Printf("%#v\n", ints)
- // Output:
- // []int{4, 5, 6}
-}
-
-func ExampleString() {
- c, err := dial()
- if err != nil {
- fmt.Println(err)
- return
- }
- defer c.Close()
-
- c.Do("SET", "hello", "world")
- s, err := redis.String(c.Do("GET", "hello"))
- fmt.Printf("%#v\n", s)
- // Output:
- // "world"
-}
diff --git a/vendor/github.com/garyburd/redigo/redis/scan.go b/vendor/github.com/garyburd/redigo/redis/scan.go
deleted file mode 100644
index 962e94bcc..000000000
--- a/vendor/github.com/garyburd/redigo/redis/scan.go
+++ /dev/null
@@ -1,555 +0,0 @@
-// Copyright 2012 Gary Burd
-//
-// Licensed under the Apache License, Version 2.0 (the "License"): you may
-// not use this file except in compliance with the License. You may obtain
-// a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// 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 redis
-
-import (
- "errors"
- "fmt"
- "reflect"
- "strconv"
- "strings"
- "sync"
-)
-
-func ensureLen(d reflect.Value, n int) {
- if n > d.Cap() {
- d.Set(reflect.MakeSlice(d.Type(), n, n))
- } else {
- d.SetLen(n)
- }
-}
-
-func cannotConvert(d reflect.Value, s interface{}) error {
- var sname string
- switch s.(type) {
- case string:
- sname = "Redis simple string"
- case Error:
- sname = "Redis error"
- case int64:
- sname = "Redis integer"
- case []byte:
- sname = "Redis bulk string"
- case []interface{}:
- sname = "Redis array"
- default:
- sname = reflect.TypeOf(s).String()
- }
- return fmt.Errorf("cannot convert from %s to %s", sname, d.Type())
-}
-
-func convertAssignBulkString(d reflect.Value, s []byte) (err error) {
- switch d.Type().Kind() {
- case reflect.Float32, reflect.Float64:
- var x float64
- x, err = strconv.ParseFloat(string(s), d.Type().Bits())
- d.SetFloat(x)
- case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
- var x int64
- x, err = strconv.ParseInt(string(s), 10, d.Type().Bits())
- d.SetInt(x)
- case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
- var x uint64
- x, err = strconv.ParseUint(string(s), 10, d.Type().Bits())
- d.SetUint(x)
- case reflect.Bool:
- var x bool
- x, err = strconv.ParseBool(string(s))
- d.SetBool(x)
- case reflect.String:
- d.SetString(string(s))
- case reflect.Slice:
- if d.Type().Elem().Kind() != reflect.Uint8 {
- err = cannotConvert(d, s)
- } else {
- d.SetBytes(s)
- }
- default:
- err = cannotConvert(d, s)
- }
- return
-}
-
-func convertAssignInt(d reflect.Value, s int64) (err error) {
- switch d.Type().Kind() {
- case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
- d.SetInt(s)
- if d.Int() != s {
- err = strconv.ErrRange
- d.SetInt(0)
- }
- case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
- if s < 0 {
- err = strconv.ErrRange
- } else {
- x := uint64(s)
- d.SetUint(x)
- if d.Uint() != x {
- err = strconv.ErrRange
- d.SetUint(0)
- }
- }
- case reflect.Bool:
- d.SetBool(s != 0)
- default:
- err = cannotConvert(d, s)
- }
- return
-}
-
-func convertAssignValue(d reflect.Value, s interface{}) (err error) {
- switch s := s.(type) {
- case []byte:
- err = convertAssignBulkString(d, s)
- case int64:
- err = convertAssignInt(d, s)
- default:
- err = cannotConvert(d, s)
- }
- return err
-}
-
-func convertAssignArray(d reflect.Value, s []interface{}) error {
- if d.Type().Kind() != reflect.Slice {
- return cannotConvert(d, s)
- }
- ensureLen(d, len(s))
- for i := 0; i < len(s); i++ {
- if err := convertAssignValue(d.Index(i), s[i]); err != nil {
- return err
- }
- }
- return nil
-}
-
-func convertAssign(d interface{}, s interface{}) (err error) {
- // Handle the most common destination types using type switches and
- // fall back to reflection for all other types.
- switch s := s.(type) {
- case nil:
- // ingore
- case []byte:
- switch d := d.(type) {
- case *string:
- *d = string(s)
- case *int:
- *d, err = strconv.Atoi(string(s))
- case *bool:
- *d, err = strconv.ParseBool(string(s))
- case *[]byte:
- *d = s
- case *interface{}:
- *d = s
- case nil:
- // skip value
- default:
- if d := reflect.ValueOf(d); d.Type().Kind() != reflect.Ptr {
- err = cannotConvert(d, s)
- } else {
- err = convertAssignBulkString(d.Elem(), s)
- }
- }
- case int64:
- switch d := d.(type) {
- case *int:
- x := int(s)
- if int64(x) != s {
- err = strconv.ErrRange
- x = 0
- }
- *d = x
- case *bool:
- *d = s != 0
- case *interface{}:
- *d = s
- case nil:
- // skip value
- default:
- if d := reflect.ValueOf(d); d.Type().Kind() != reflect.Ptr {
- err = cannotConvert(d, s)
- } else {
- err = convertAssignInt(d.Elem(), s)
- }
- }
- case string:
- switch d := d.(type) {
- case *string:
- *d = string(s)
- default:
- err = cannotConvert(reflect.ValueOf(d), s)
- }
- case []interface{}:
- switch d := d.(type) {
- case *[]interface{}:
- *d = s
- case *interface{}:
- *d = s
- case nil:
- // skip value
- default:
- if d := reflect.ValueOf(d); d.Type().Kind() != reflect.Ptr {
- err = cannotConvert(d, s)
- } else {
- err = convertAssignArray(d.Elem(), s)
- }
- }
- case Error:
- err = s
- default:
- err = cannotConvert(reflect.ValueOf(d), s)
- }
- return
-}
-
-// Scan copies from src to the values pointed at by dest.
-//
-// The values pointed at by dest must be an integer, float, boolean, string,
-// []byte, interface{} or slices of these types. Scan uses the standard strconv
-// package to convert bulk strings to numeric and boolean types.
-//
-// If a dest value is nil, then the corresponding src value is skipped.
-//
-// If a src element is nil, then the corresponding dest value is not modified.
-//
-// To enable easy use of Scan in a loop, Scan returns the slice of src
-// following the copied values.
-func Scan(src []interface{}, dest ...interface{}) ([]interface{}, error) {
- if len(src) < len(dest) {
- return nil, errors.New("redigo.Scan: array short")
- }
- var err error
- for i, d := range dest {
- err = convertAssign(d, src[i])
- if err != nil {
- err = fmt.Errorf("redigo.Scan: cannot assign to dest %d: %v", i, err)
- break
- }
- }
- return src[len(dest):], err
-}
-
-type fieldSpec struct {
- name string
- index []int
- omitEmpty bool
-}
-
-type structSpec struct {
- m map[string]*fieldSpec
- l []*fieldSpec
-}
-
-func (ss *structSpec) fieldSpec(name []byte) *fieldSpec {
- return ss.m[string(name)]
-}
-
-func compileStructSpec(t reflect.Type, depth map[string]int, index []int, ss *structSpec) {
- for i := 0; i < t.NumField(); i++ {
- f := t.Field(i)
- switch {
- case f.PkgPath != "" && !f.Anonymous:
- // Ignore unexported fields.
- case f.Anonymous:
- // TODO: Handle pointers. Requires change to decoder and
- // protection against infinite recursion.
- if f.Type.Kind() == reflect.Struct {
- compileStructSpec(f.Type, depth, append(index, i), ss)
- }
- default:
- fs := &fieldSpec{name: f.Name}
- tag := f.Tag.Get("redis")
- p := strings.Split(tag, ",")
- if len(p) > 0 {
- if p[0] == "-" {
- continue
- }
- if len(p[0]) > 0 {
- fs.name = p[0]
- }
- for _, s := range p[1:] {
- switch s {
- case "omitempty":
- fs.omitEmpty = true
- default:
- panic(fmt.Errorf("redigo: unknown field tag %s for type %s", s, t.Name()))
- }
- }
- }
- d, found := depth[fs.name]
- if !found {
- d = 1 << 30
- }
- switch {
- case len(index) == d:
- // At same depth, remove from result.
- delete(ss.m, fs.name)
- j := 0
- for i := 0; i < len(ss.l); i++ {
- if fs.name != ss.l[i].name {
- ss.l[j] = ss.l[i]
- j += 1
- }
- }
- ss.l = ss.l[:j]
- case len(index) < d:
- fs.index = make([]int, len(index)+1)
- copy(fs.index, index)
- fs.index[len(index)] = i
- depth[fs.name] = len(index)
- ss.m[fs.name] = fs
- ss.l = append(ss.l, fs)
- }
- }
- }
-}
-
-var (
- structSpecMutex sync.RWMutex
- structSpecCache = make(map[reflect.Type]*structSpec)
- defaultFieldSpec = &fieldSpec{}
-)
-
-func structSpecForType(t reflect.Type) *structSpec {
-
- structSpecMutex.RLock()
- ss, found := structSpecCache[t]
- structSpecMutex.RUnlock()
- if found {
- return ss
- }
-
- structSpecMutex.Lock()
- defer structSpecMutex.Unlock()
- ss, found = structSpecCache[t]
- if found {
- return ss
- }
-
- ss = &structSpec{m: make(map[string]*fieldSpec)}
- compileStructSpec(t, make(map[string]int), nil, ss)
- structSpecCache[t] = ss
- return ss
-}
-
-var errScanStructValue = errors.New("redigo.ScanStruct: value must be non-nil pointer to a struct")
-
-// ScanStruct scans alternating names and values from src to a struct. The
-// HGETALL and CONFIG GET commands return replies in this format.
-//
-// ScanStruct uses exported field names to match values in the response. Use
-// 'redis' field tag to override the name:
-//
-// Field int `redis:"myName"`
-//
-// Fields with the tag redis:"-" are ignored.
-//
-// Integer, float, boolean, string and []byte fields are supported. Scan uses the
-// standard strconv package to convert bulk string values to numeric and
-// boolean types.
-//
-// If a src element is nil, then the corresponding field is not modified.
-func ScanStruct(src []interface{}, dest interface{}) error {
- d := reflect.ValueOf(dest)
- if d.Kind() != reflect.Ptr || d.IsNil() {
- return errScanStructValue
- }
- d = d.Elem()
- if d.Kind() != reflect.Struct {
- return errScanStructValue
- }
- ss := structSpecForType(d.Type())
-
- if len(src)%2 != 0 {
- return errors.New("redigo.ScanStruct: number of values not a multiple of 2")
- }
-
- for i := 0; i < len(src); i += 2 {
- s := src[i+1]
- if s == nil {
- continue
- }
- name, ok := src[i].([]byte)
- if !ok {
- return fmt.Errorf("redigo.ScanStruct: key %d not a bulk string value", i)
- }
- fs := ss.fieldSpec(name)
- if fs == nil {
- continue
- }
- if err := convertAssignValue(d.FieldByIndex(fs.index), s); err != nil {
- return fmt.Errorf("redigo.ScanStruct: cannot assign field %s: %v", fs.name, err)
- }
- }
- return nil
-}
-
-var (
- errScanSliceValue = errors.New("redigo.ScanSlice: dest must be non-nil pointer to a struct")
-)
-
-// ScanSlice scans src to the slice pointed to by dest. The elements the dest
-// slice must be integer, float, boolean, string, struct or pointer to struct
-// values.
-//
-// Struct fields must be integer, float, boolean or string values. All struct
-// fields are used unless a subset is specified using fieldNames.
-func ScanSlice(src []interface{}, dest interface{}, fieldNames ...string) error {
- d := reflect.ValueOf(dest)
- if d.Kind() != reflect.Ptr || d.IsNil() {
- return errScanSliceValue
- }
- d = d.Elem()
- if d.Kind() != reflect.Slice {
- return errScanSliceValue
- }
-
- isPtr := false
- t := d.Type().Elem()
- if t.Kind() == reflect.Ptr && t.Elem().Kind() == reflect.Struct {
- isPtr = true
- t = t.Elem()
- }
-
- if t.Kind() != reflect.Struct {
- ensureLen(d, len(src))
- for i, s := range src {
- if s == nil {
- continue
- }
- if err := convertAssignValue(d.Index(i), s); err != nil {
- return fmt.Errorf("redigo.ScanSlice: cannot assign element %d: %v", i, err)
- }
- }
- return nil
- }
-
- ss := structSpecForType(t)
- fss := ss.l
- if len(fieldNames) > 0 {
- fss = make([]*fieldSpec, len(fieldNames))
- for i, name := range fieldNames {
- fss[i] = ss.m[name]
- if fss[i] == nil {
- return fmt.Errorf("redigo.ScanSlice: ScanSlice bad field name %s", name)
- }
- }
- }
-
- if len(fss) == 0 {
- return errors.New("redigo.ScanSlice: no struct fields")
- }
-
- n := len(src) / len(fss)
- if n*len(fss) != len(src) {
- return errors.New("redigo.ScanSlice: length not a multiple of struct field count")
- }
-
- ensureLen(d, n)
- for i := 0; i < n; i++ {
- d := d.Index(i)
- if isPtr {
- if d.IsNil() {
- d.Set(reflect.New(t))
- }
- d = d.Elem()
- }
- for j, fs := range fss {
- s := src[i*len(fss)+j]
- if s == nil {
- continue
- }
- if err := convertAssignValue(d.FieldByIndex(fs.index), s); err != nil {
- return fmt.Errorf("redigo.ScanSlice: cannot assign element %d to field %s: %v", i*len(fss)+j, fs.name, err)
- }
- }
- }
- return nil
-}
-
-// Args is a helper for constructing command arguments from structured values.
-type Args []interface{}
-
-// Add returns the result of appending value to args.
-func (args Args) Add(value ...interface{}) Args {
- return append(args, value...)
-}
-
-// AddFlat returns the result of appending the flattened value of v to args.
-//
-// Maps are flattened by appending the alternating keys and map values to args.
-//
-// Slices are flattened by appending the slice elements to args.
-//
-// Structs are flattened by appending the alternating names and values of
-// exported fields to args. If v is a nil struct pointer, then nothing is
-// appended. The 'redis' field tag overrides struct field names. See ScanStruct
-// for more information on the use of the 'redis' field tag.
-//
-// Other types are appended to args as is.
-func (args Args) AddFlat(v interface{}) Args {
- rv := reflect.ValueOf(v)
- switch rv.Kind() {
- case reflect.Struct:
- args = flattenStruct(args, rv)
- case reflect.Slice:
- for i := 0; i < rv.Len(); i++ {
- args = append(args, rv.Index(i).Interface())
- }
- case reflect.Map:
- for _, k := range rv.MapKeys() {
- args = append(args, k.Interface(), rv.MapIndex(k).Interface())
- }
- case reflect.Ptr:
- if rv.Type().Elem().Kind() == reflect.Struct {
- if !rv.IsNil() {
- args = flattenStruct(args, rv.Elem())
- }
- } else {
- args = append(args, v)
- }
- default:
- args = append(args, v)
- }
- return args
-}
-
-func flattenStruct(args Args, v reflect.Value) Args {
- ss := structSpecForType(v.Type())
- for _, fs := range ss.l {
- fv := v.FieldByIndex(fs.index)
- if fs.omitEmpty {
- var empty = false
- switch fv.Kind() {
- case reflect.Array, reflect.Map, reflect.Slice, reflect.String:
- empty = fv.Len() == 0
- case reflect.Bool:
- empty = !fv.Bool()
- case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
- empty = fv.Int() == 0
- case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
- empty = fv.Uint() == 0
- case reflect.Float32, reflect.Float64:
- empty = fv.Float() == 0
- case reflect.Interface, reflect.Ptr:
- empty = fv.IsNil()
- }
- if empty {
- continue
- }
- }
- args = append(args, fs.name, fv.Interface())
- }
- return args
-}
diff --git a/vendor/github.com/garyburd/redigo/redis/scan_test.go b/vendor/github.com/garyburd/redigo/redis/scan_test.go
deleted file mode 100644
index d364dff42..000000000
--- a/vendor/github.com/garyburd/redigo/redis/scan_test.go
+++ /dev/null
@@ -1,440 +0,0 @@
-// Copyright 2012 Gary Burd
-//
-// Licensed under the Apache License, Version 2.0 (the "License"): you may
-// not use this file except in compliance with the License. You may obtain
-// a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// 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 redis_test
-
-import (
- "fmt"
- "math"
- "reflect"
- "testing"
-
- "github.com/garyburd/redigo/redis"
-)
-
-var scanConversionTests = []struct {
- src interface{}
- dest interface{}
-}{
- {[]byte("-inf"), math.Inf(-1)},
- {[]byte("+inf"), math.Inf(1)},
- {[]byte("0"), float64(0)},
- {[]byte("3.14159"), float64(3.14159)},
- {[]byte("3.14"), float32(3.14)},
- {[]byte("-100"), int(-100)},
- {[]byte("101"), int(101)},
- {int64(102), int(102)},
- {[]byte("103"), uint(103)},
- {int64(104), uint(104)},
- {[]byte("105"), int8(105)},
- {int64(106), int8(106)},
- {[]byte("107"), uint8(107)},
- {int64(108), uint8(108)},
- {[]byte("0"), false},
- {int64(0), false},
- {[]byte("f"), false},
- {[]byte("1"), true},
- {int64(1), true},
- {[]byte("t"), true},
- {"hello", "hello"},
- {[]byte("hello"), "hello"},
- {[]byte("world"), []byte("world")},
- {[]interface{}{[]byte("foo")}, []interface{}{[]byte("foo")}},
- {[]interface{}{[]byte("foo")}, []string{"foo"}},
- {[]interface{}{[]byte("hello"), []byte("world")}, []string{"hello", "world"}},
- {[]interface{}{[]byte("bar")}, [][]byte{[]byte("bar")}},
- {[]interface{}{[]byte("1")}, []int{1}},
- {[]interface{}{[]byte("1"), []byte("2")}, []int{1, 2}},
- {[]interface{}{[]byte("1"), []byte("2")}, []float64{1, 2}},
- {[]interface{}{[]byte("1")}, []byte{1}},
- {[]interface{}{[]byte("1")}, []bool{true}},
-}
-
-func TestScanConversion(t *testing.T) {
- for _, tt := range scanConversionTests {
- values := []interface{}{tt.src}
- dest := reflect.New(reflect.TypeOf(tt.dest))
- values, err := redis.Scan(values, dest.Interface())
- if err != nil {
- t.Errorf("Scan(%v) returned error %v", tt, err)
- continue
- }
- if !reflect.DeepEqual(tt.dest, dest.Elem().Interface()) {
- t.Errorf("Scan(%v) returned %v, want %v", tt, dest.Elem().Interface(), tt.dest)
- }
- }
-}
-
-var scanConversionErrorTests = []struct {
- src interface{}
- dest interface{}
-}{
- {[]byte("1234"), byte(0)},
- {int64(1234), byte(0)},
- {[]byte("-1"), byte(0)},
- {int64(-1), byte(0)},
- {[]byte("junk"), false},
- {redis.Error("blah"), false},
-}
-
-func TestScanConversionError(t *testing.T) {
- for _, tt := range scanConversionErrorTests {
- values := []interface{}{tt.src}
- dest := reflect.New(reflect.TypeOf(tt.dest))
- values, err := redis.Scan(values, dest.Interface())
- if err == nil {
- t.Errorf("Scan(%v) did not return error", tt)
- }
- }
-}
-
-func ExampleScan() {
- c, err := dial()
- if err != nil {
- fmt.Println(err)
- return
- }
- defer c.Close()
-
- c.Send("HMSET", "album:1", "title", "Red", "rating", 5)
- c.Send("HMSET", "album:2", "title", "Earthbound", "rating", 1)
- c.Send("HMSET", "album:3", "title", "Beat")
- c.Send("LPUSH", "albums", "1")
- c.Send("LPUSH", "albums", "2")
- c.Send("LPUSH", "albums", "3")
- values, err := redis.Values(c.Do("SORT", "albums",
- "BY", "album:*->rating",
- "GET", "album:*->title",
- "GET", "album:*->rating"))
- if err != nil {
- fmt.Println(err)
- return
- }
-
- for len(values) > 0 {
- var title string
- rating := -1 // initialize to illegal value to detect nil.
- values, err = redis.Scan(values, &title, &rating)
- if err != nil {
- fmt.Println(err)
- return
- }
- if rating == -1 {
- fmt.Println(title, "not-rated")
- } else {
- fmt.Println(title, rating)
- }
- }
- // Output:
- // Beat not-rated
- // Earthbound 1
- // Red 5
-}
-
-type s0 struct {
- X int
- Y int `redis:"y"`
- Bt bool
-}
-
-type s1 struct {
- X int `redis:"-"`
- I int `redis:"i"`
- U uint `redis:"u"`
- S string `redis:"s"`
- P []byte `redis:"p"`
- B bool `redis:"b"`
- Bt bool
- Bf bool
- s0
-}
-
-var scanStructTests = []struct {
- title string
- reply []string
- value interface{}
-}{
- {"basic",
- []string{"i", "-1234", "u", "5678", "s", "hello", "p", "world", "b", "t", "Bt", "1", "Bf", "0", "X", "123", "y", "456"},
- &s1{I: -1234, U: 5678, S: "hello", P: []byte("world"), B: true, Bt: true, Bf: false, s0: s0{X: 123, Y: 456}},
- },
-}
-
-func TestScanStruct(t *testing.T) {
- for _, tt := range scanStructTests {
-
- var reply []interface{}
- for _, v := range tt.reply {
- reply = append(reply, []byte(v))
- }
-
- value := reflect.New(reflect.ValueOf(tt.value).Type().Elem())
-
- if err := redis.ScanStruct(reply, value.Interface()); err != nil {
- t.Fatalf("ScanStruct(%s) returned error %v", tt.title, err)
- }
-
- if !reflect.DeepEqual(value.Interface(), tt.value) {
- t.Fatalf("ScanStruct(%s) returned %v, want %v", tt.title, value.Interface(), tt.value)
- }
- }
-}
-
-func TestBadScanStructArgs(t *testing.T) {
- x := []interface{}{"A", "b"}
- test := func(v interface{}) {
- if err := redis.ScanStruct(x, v); err == nil {
- t.Errorf("Expect error for ScanStruct(%T, %T)", x, v)
- }
- }
-
- test(nil)
-
- var v0 *struct{}
- test(v0)
-
- var v1 int
- test(&v1)
-
- x = x[:1]
- v2 := struct{ A string }{}
- test(&v2)
-}
-
-var scanSliceTests = []struct {
- src []interface{}
- fieldNames []string
- ok bool
- dest interface{}
-}{
- {
- []interface{}{[]byte("1"), nil, []byte("-1")},
- nil,
- true,
- []int{1, 0, -1},
- },
- {
- []interface{}{[]byte("1"), nil, []byte("2")},
- nil,
- true,
- []uint{1, 0, 2},
- },
- {
- []interface{}{[]byte("-1")},
- nil,
- false,
- []uint{1},
- },
- {
- []interface{}{[]byte("hello"), nil, []byte("world")},
- nil,
- true,
- [][]byte{[]byte("hello"), nil, []byte("world")},
- },
- {
- []interface{}{[]byte("hello"), nil, []byte("world")},
- nil,
- true,
- []string{"hello", "", "world"},
- },
- {
- []interface{}{[]byte("a1"), []byte("b1"), []byte("a2"), []byte("b2")},
- nil,
- true,
- []struct{ A, B string }{{"a1", "b1"}, {"a2", "b2"}},
- },
- {
- []interface{}{[]byte("a1"), []byte("b1")},
- nil,
- false,
- []struct{ A, B, C string }{{"a1", "b1", ""}},
- },
- {
- []interface{}{[]byte("a1"), []byte("b1"), []byte("a2"), []byte("b2")},
- nil,
- true,
- []*struct{ A, B string }{{"a1", "b1"}, {"a2", "b2"}},
- },
- {
- []interface{}{[]byte("a1"), []byte("b1"), []byte("a2"), []byte("b2")},
- []string{"A", "B"},
- true,
- []struct{ A, C, B string }{{"a1", "", "b1"}, {"a2", "", "b2"}},
- },
- {
- []interface{}{[]byte("a1"), []byte("b1"), []byte("a2"), []byte("b2")},
- nil,
- false,
- []struct{}{},
- },
-}
-
-func TestScanSlice(t *testing.T) {
- for _, tt := range scanSliceTests {
-
- typ := reflect.ValueOf(tt.dest).Type()
- dest := reflect.New(typ)
-
- err := redis.ScanSlice(tt.src, dest.Interface(), tt.fieldNames...)
- if tt.ok != (err == nil) {
- t.Errorf("ScanSlice(%v, []%s, %v) returned error %v", tt.src, typ, tt.fieldNames, err)
- continue
- }
- if tt.ok && !reflect.DeepEqual(dest.Elem().Interface(), tt.dest) {
- t.Errorf("ScanSlice(src, []%s) returned %#v, want %#v", typ, dest.Elem().Interface(), tt.dest)
- }
- }
-}
-
-func ExampleScanSlice() {
- c, err := dial()
- if err != nil {
- fmt.Println(err)
- return
- }
- defer c.Close()
-
- c.Send("HMSET", "album:1", "title", "Red", "rating", 5)
- c.Send("HMSET", "album:2", "title", "Earthbound", "rating", 1)
- c.Send("HMSET", "album:3", "title", "Beat", "rating", 4)
- c.Send("LPUSH", "albums", "1")
- c.Send("LPUSH", "albums", "2")
- c.Send("LPUSH", "albums", "3")
- values, err := redis.Values(c.Do("SORT", "albums",
- "BY", "album:*->rating",
- "GET", "album:*->title",
- "GET", "album:*->rating"))
- if err != nil {
- fmt.Println(err)
- return
- }
-
- var albums []struct {
- Title string
- Rating int
- }
- if err := redis.ScanSlice(values, &albums); err != nil {
- fmt.Println(err)
- return
- }
- fmt.Printf("%v\n", albums)
- // Output:
- // [{Earthbound 1} {Beat 4} {Red 5}]
-}
-
-var argsTests = []struct {
- title string
- actual redis.Args
- expected redis.Args
-}{
- {"struct ptr",
- redis.Args{}.AddFlat(&struct {
- I int `redis:"i"`
- U uint `redis:"u"`
- S string `redis:"s"`
- P []byte `redis:"p"`
- M map[string]string `redis:"m"`
- Bt bool
- Bf bool
- }{
- -1234, 5678, "hello", []byte("world"), map[string]string{"hello": "world"}, true, false,
- }),
- redis.Args{"i", int(-1234), "u", uint(5678), "s", "hello", "p", []byte("world"), "m", map[string]string{"hello": "world"}, "Bt", true, "Bf", false},
- },
- {"struct",
- redis.Args{}.AddFlat(struct{ I int }{123}),
- redis.Args{"I", 123},
- },
- {"slice",
- redis.Args{}.Add(1).AddFlat([]string{"a", "b", "c"}).Add(2),
- redis.Args{1, "a", "b", "c", 2},
- },
- {"struct omitempty",
- redis.Args{}.AddFlat(&struct {
- I int `redis:"i,omitempty"`
- U uint `redis:"u,omitempty"`
- S string `redis:"s,omitempty"`
- P []byte `redis:"p,omitempty"`
- M map[string]string `redis:"m,omitempty"`
- Bt bool `redis:"Bt,omitempty"`
- Bf bool `redis:"Bf,omitempty"`
- }{
- 0, 0, "", []byte{}, map[string]string{}, true, false,
- }),
- redis.Args{"Bt", true},
- },
-}
-
-func TestArgs(t *testing.T) {
- for _, tt := range argsTests {
- if !reflect.DeepEqual(tt.actual, tt.expected) {
- t.Fatalf("%s is %v, want %v", tt.title, tt.actual, tt.expected)
- }
- }
-}
-
-func ExampleArgs() {
- c, err := dial()
- if err != nil {
- fmt.Println(err)
- return
- }
- defer c.Close()
-
- var p1, p2 struct {
- Title string `redis:"title"`
- Author string `redis:"author"`
- Body string `redis:"body"`
- }
-
- p1.Title = "Example"
- p1.Author = "Gary"
- p1.Body = "Hello"
-
- if _, err := c.Do("HMSET", redis.Args{}.Add("id1").AddFlat(&p1)...); err != nil {
- fmt.Println(err)
- return
- }
-
- m := map[string]string{
- "title": "Example2",
- "author": "Steve",
- "body": "Map",
- }
-
- if _, err := c.Do("HMSET", redis.Args{}.Add("id2").AddFlat(m)...); err != nil {
- fmt.Println(err)
- return
- }
-
- for _, id := range []string{"id1", "id2"} {
-
- v, err := redis.Values(c.Do("HGETALL", id))
- if err != nil {
- fmt.Println(err)
- return
- }
-
- if err := redis.ScanStruct(v, &p2); err != nil {
- fmt.Println(err)
- return
- }
-
- fmt.Printf("%+v\n", p2)
- }
-
- // Output:
- // {Title:Example Author:Gary Body:Hello}
- // {Title:Example2 Author:Steve Body:Map}
-}
diff --git a/vendor/github.com/garyburd/redigo/redis/script.go b/vendor/github.com/garyburd/redigo/redis/script.go
deleted file mode 100644
index 78605a90a..000000000
--- a/vendor/github.com/garyburd/redigo/redis/script.go
+++ /dev/null
@@ -1,86 +0,0 @@
-// Copyright 2012 Gary Burd
-//
-// Licensed under the Apache License, Version 2.0 (the "License"): you may
-// not use this file except in compliance with the License. You may obtain
-// a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// 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 redis
-
-import (
- "crypto/sha1"
- "encoding/hex"
- "io"
- "strings"
-)
-
-// Script encapsulates the source, hash and key count for a Lua script. See
-// http://redis.io/commands/eval for information on scripts in Redis.
-type Script struct {
- keyCount int
- src string
- hash string
-}
-
-// NewScript returns a new script object. If keyCount is greater than or equal
-// to zero, then the count is automatically inserted in the EVAL command
-// argument list. If keyCount is less than zero, then the application supplies
-// the count as the first value in the keysAndArgs argument to the Do, Send and
-// SendHash methods.
-func NewScript(keyCount int, src string) *Script {
- h := sha1.New()
- io.WriteString(h, src)
- return &Script{keyCount, src, hex.EncodeToString(h.Sum(nil))}
-}
-
-func (s *Script) args(spec string, keysAndArgs []interface{}) []interface{} {
- var args []interface{}
- if s.keyCount < 0 {
- args = make([]interface{}, 1+len(keysAndArgs))
- args[0] = spec
- copy(args[1:], keysAndArgs)
- } else {
- args = make([]interface{}, 2+len(keysAndArgs))
- args[0] = spec
- args[1] = s.keyCount
- copy(args[2:], keysAndArgs)
- }
- return args
-}
-
-// Do evaluates the script. Under the covers, Do optimistically evaluates the
-// script using the EVALSHA command. If the command fails because the script is
-// not loaded, then Do evaluates the script using the EVAL command (thus
-// causing the script to load).
-func (s *Script) Do(c Conn, keysAndArgs ...interface{}) (interface{}, error) {
- v, err := c.Do("EVALSHA", s.args(s.hash, keysAndArgs)...)
- if e, ok := err.(Error); ok && strings.HasPrefix(string(e), "NOSCRIPT ") {
- v, err = c.Do("EVAL", s.args(s.src, keysAndArgs)...)
- }
- return v, err
-}
-
-// SendHash evaluates the script without waiting for the reply. The script is
-// evaluated with the EVALSHA command. The application must ensure that the
-// script is loaded by a previous call to Send, Do or Load methods.
-func (s *Script) SendHash(c Conn, keysAndArgs ...interface{}) error {
- return c.Send("EVALSHA", s.args(s.hash, keysAndArgs)...)
-}
-
-// Send evaluates the script without waiting for the reply.
-func (s *Script) Send(c Conn, keysAndArgs ...interface{}) error {
- return c.Send("EVAL", s.args(s.src, keysAndArgs)...)
-}
-
-// Load loads the script without evaluating it.
-func (s *Script) Load(c Conn) error {
- _, err := c.Do("SCRIPT", "LOAD", s.src)
- return err
-}
diff --git a/vendor/github.com/garyburd/redigo/redis/script_test.go b/vendor/github.com/garyburd/redigo/redis/script_test.go
deleted file mode 100644
index af282415c..000000000
--- a/vendor/github.com/garyburd/redigo/redis/script_test.go
+++ /dev/null
@@ -1,100 +0,0 @@
-// Copyright 2012 Gary Burd
-//
-// Licensed under the Apache License, Version 2.0 (the "License"): you may
-// not use this file except in compliance with the License. You may obtain
-// a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// 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 redis_test
-
-import (
- "fmt"
- "reflect"
- "testing"
- "time"
-
- "github.com/garyburd/redigo/redis"
-)
-
-var (
- // These variables are declared at package level to remove distracting
- // details from the examples.
- c redis.Conn
- reply interface{}
- err error
-)
-
-func ExampleScript() {
- // Initialize a package-level variable with a script.
- var getScript = redis.NewScript(1, `return redis.call('get', KEYS[1])`)
-
- // In a function, use the script Do method to evaluate the script. The Do
- // method optimistically uses the EVALSHA command. If the script is not
- // loaded, then the Do method falls back to the EVAL command.
- reply, err = getScript.Do(c, "foo")
-}
-
-func TestScript(t *testing.T) {
- c, err := redis.DialDefaultServer()
- if err != nil {
- t.Fatalf("error connection to database, %v", err)
- }
- defer c.Close()
-
- // To test fall back in Do, we make script unique by adding comment with current time.
- script := fmt.Sprintf("--%d\nreturn {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}", time.Now().UnixNano())
- s := redis.NewScript(2, script)
- reply := []interface{}{[]byte("key1"), []byte("key2"), []byte("arg1"), []byte("arg2")}
-
- v, err := s.Do(c, "key1", "key2", "arg1", "arg2")
- if err != nil {
- t.Errorf("s.Do(c, ...) returned %v", err)
- }
-
- if !reflect.DeepEqual(v, reply) {
- t.Errorf("s.Do(c, ..); = %v, want %v", v, reply)
- }
-
- err = s.Load(c)
- if err != nil {
- t.Errorf("s.Load(c) returned %v", err)
- }
-
- err = s.SendHash(c, "key1", "key2", "arg1", "arg2")
- if err != nil {
- t.Errorf("s.SendHash(c, ...) returned %v", err)
- }
-
- err = c.Flush()
- if err != nil {
- t.Errorf("c.Flush() returned %v", err)
- }
-
- v, err = c.Receive()
- if !reflect.DeepEqual(v, reply) {
- t.Errorf("s.SendHash(c, ..); c.Receive() = %v, want %v", v, reply)
- }
-
- err = s.Send(c, "key1", "key2", "arg1", "arg2")
- if err != nil {
- t.Errorf("s.Send(c, ...) returned %v", err)
- }
-
- err = c.Flush()
- if err != nil {
- t.Errorf("c.Flush() returned %v", err)
- }
-
- v, err = c.Receive()
- if !reflect.DeepEqual(v, reply) {
- t.Errorf("s.Send(c, ..); c.Receive() = %v, want %v", v, reply)
- }
-
-}
diff --git a/vendor/github.com/garyburd/redigo/redis/test_test.go b/vendor/github.com/garyburd/redigo/redis/test_test.go
deleted file mode 100644
index 7240fa1f3..000000000
--- a/vendor/github.com/garyburd/redigo/redis/test_test.go
+++ /dev/null
@@ -1,177 +0,0 @@
-// Copyright 2012 Gary Burd
-//
-// Licensed under the Apache License, Version 2.0 (the "License"): you may
-// not use this file except in compliance with the License. You may obtain
-// a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// 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 redis
-
-import (
- "bufio"
- "errors"
- "flag"
- "fmt"
- "io"
- "io/ioutil"
- "os"
- "os/exec"
- "strconv"
- "strings"
- "sync"
- "testing"
- "time"
-)
-
-func SetNowFunc(f func() time.Time) {
- nowFunc = f
-}
-
-var (
- ErrNegativeInt = errNegativeInt
-
- serverPath = flag.String("redis-server", "redis-server", "Path to redis server binary")
- serverBasePort = flag.Int("redis-port", 16379, "Beginning of port range for test servers")
- serverLogName = flag.String("redis-log", "", "Write Redis server logs to `filename`")
- serverLog = ioutil.Discard
-
- defaultServerMu sync.Mutex
- defaultServer *Server
- defaultServerErr error
-)
-
-type Server struct {
- name string
- cmd *exec.Cmd
- done chan struct{}
-}
-
-func NewServer(name string, args ...string) (*Server, error) {
- s := &Server{
- name: name,
- cmd: exec.Command(*serverPath, args...),
- done: make(chan struct{}),
- }
-
- r, err := s.cmd.StdoutPipe()
- if err != nil {
- return nil, err
- }
-
- err = s.cmd.Start()
- if err != nil {
- return nil, err
- }
-
- ready := make(chan error, 1)
- go s.watch(r, ready)
-
- select {
- case err = <-ready:
- case <-time.After(time.Second * 10):
- err = errors.New("timeout waiting for server to start")
- }
-
- if err != nil {
- s.Stop()
- return nil, err
- }
-
- return s, nil
-}
-
-func (s *Server) watch(r io.Reader, ready chan error) {
- fmt.Fprintf(serverLog, "%d START %s \n", s.cmd.Process.Pid, s.name)
- var listening bool
- var text string
- scn := bufio.NewScanner(r)
- for scn.Scan() {
- text = scn.Text()
- fmt.Fprintf(serverLog, "%s\n", text)
- if !listening {
- if strings.Contains(text, "The server is now ready to accept connections on port") {
- listening = true
- ready <- nil
- }
- }
- }
- if !listening {
- ready <- fmt.Errorf("server exited: %s", text)
- }
- s.cmd.Wait()
- fmt.Fprintf(serverLog, "%d STOP %s \n", s.cmd.Process.Pid, s.name)
- close(s.done)
-}
-
-func (s *Server) Stop() {
- s.cmd.Process.Signal(os.Interrupt)
- <-s.done
-}
-
-// stopDefaultServer stops the server created by DialDefaultServer.
-func stopDefaultServer() {
- defaultServerMu.Lock()
- defer defaultServerMu.Unlock()
- if defaultServer != nil {
- defaultServer.Stop()
- defaultServer = nil
- }
-}
-
-// startDefaultServer starts the default server if not already running.
-func startDefaultServer() error {
- defaultServerMu.Lock()
- defer defaultServerMu.Unlock()
- if defaultServer != nil || defaultServerErr != nil {
- return defaultServerErr
- }
- defaultServer, defaultServerErr = NewServer(
- "default",
- "--port", strconv.Itoa(*serverBasePort),
- "--save", "",
- "--appendonly", "no")
- return defaultServerErr
-}
-
-// DialDefaultServer starts the test server if not already started and dials a
-// connection to the server.
-func DialDefaultServer() (Conn, error) {
- if err := startDefaultServer(); err != nil {
- return nil, err
- }
- c, err := Dial("tcp", fmt.Sprintf(":%d", *serverBasePort), DialReadTimeout(1*time.Second), DialWriteTimeout(1*time.Second))
- if err != nil {
- return nil, err
- }
- c.Do("FLUSHDB")
- return c, nil
-}
-
-func TestMain(m *testing.M) {
- os.Exit(func() int {
- flag.Parse()
-
- var f *os.File
- if *serverLogName != "" {
- var err error
- f, err = os.OpenFile(*serverLogName, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0600)
- if err != nil {
- fmt.Fprintf(os.Stderr, "Error opening redis-log: %v\n", err)
- return 1
- }
- defer f.Close()
- serverLog = f
- }
-
- defer stopDefaultServer()
-
- return m.Run()
- }())
-}
diff --git a/vendor/github.com/garyburd/redigo/redis/zpop_example_test.go b/vendor/github.com/garyburd/redigo/redis/zpop_example_test.go
deleted file mode 100644
index 1d86ee6ce..000000000
--- a/vendor/github.com/garyburd/redigo/redis/zpop_example_test.go
+++ /dev/null
@@ -1,113 +0,0 @@
-// Copyright 2013 Gary Burd
-//
-// Licensed under the Apache License, Version 2.0 (the "License"): you may
-// not use this file except in compliance with the License. You may obtain
-// a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// 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 redis_test
-
-import (
- "fmt"
- "github.com/garyburd/redigo/redis"
-)
-
-// zpop pops a value from the ZSET key using WATCH/MULTI/EXEC commands.
-func zpop(c redis.Conn, key string) (result string, err error) {
-
- defer func() {
- // Return connection to normal state on error.
- if err != nil {
- c.Do("DISCARD")
- }
- }()
-
- // Loop until transaction is successful.
- for {
- if _, err := c.Do("WATCH", key); err != nil {
- return "", err
- }
-
- members, err := redis.Strings(c.Do("ZRANGE", key, 0, 0))
- if err != nil {
- return "", err
- }
- if len(members) != 1 {
- return "", redis.ErrNil
- }
-
- c.Send("MULTI")
- c.Send("ZREM", key, members[0])
- queued, err := c.Do("EXEC")
- if err != nil {
- return "", err
- }
-
- if queued != nil {
- result = members[0]
- break
- }
- }
-
- return result, nil
-}
-
-// zpopScript pops a value from a ZSET.
-var zpopScript = redis.NewScript(1, `
- local r = redis.call('ZRANGE', KEYS[1], 0, 0)
- if r ~= nil then
- r = r[1]
- redis.call('ZREM', KEYS[1], r)
- end
- return r
-`)
-
-// This example implements ZPOP as described at
-// http://redis.io/topics/transactions using WATCH/MULTI/EXEC and scripting.
-func Example_zpop() {
- c, err := dial()
- if err != nil {
- fmt.Println(err)
- return
- }
- defer c.Close()
-
- // Add test data using a pipeline.
-
- for i, member := range []string{"red", "blue", "green"} {
- c.Send("ZADD", "zset", i, member)
- }
- if _, err := c.Do(""); err != nil {
- fmt.Println(err)
- return
- }
-
- // Pop using WATCH/MULTI/EXEC
-
- v, err := zpop(c, "zset")
- if err != nil {
- fmt.Println(err)
- return
- }
- fmt.Println(v)
-
- // Pop using a script.
-
- v, err = redis.String(zpopScript.Do(c, "zset"))
- if err != nil {
- fmt.Println(err)
- return
- }
- fmt.Println(v)
-
- // Output:
- // red
- // blue
-}
diff --git a/vendor/github.com/garyburd/redigo/redisx/connmux.go b/vendor/github.com/garyburd/redigo/redisx/connmux.go
deleted file mode 100644
index af2cced3f..000000000
--- a/vendor/github.com/garyburd/redigo/redisx/connmux.go
+++ /dev/null
@@ -1,152 +0,0 @@
-// Copyright 2014 Gary Burd
-//
-// Licensed under the Apache License, Version 2.0 (the "License"): you may
-// not use this file except in compliance with the License. You may obtain
-// a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// 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 redisx
-
-import (
- "errors"
- "sync"
-
- "github.com/garyburd/redigo/internal"
- "github.com/garyburd/redigo/redis"
-)
-
-// ConnMux multiplexes one or more connections to a single underlying
-// connection. The ConnMux connections do not support concurrency, commands
-// that associate server side state with the connection or commands that put
-// the connection in a special mode.
-type ConnMux struct {
- c redis.Conn
-
- sendMu sync.Mutex
- sendID uint
-
- recvMu sync.Mutex
- recvID uint
- recvWait map[uint]chan struct{}
-}
-
-func NewConnMux(c redis.Conn) *ConnMux {
- return &ConnMux{c: c, recvWait: make(map[uint]chan struct{})}
-}
-
-// Get gets a connection. The application must close the returned connection.
-func (p *ConnMux) Get() redis.Conn {
- c := &muxConn{p: p}
- c.ids = c.buf[:0]
- return c
-}
-
-// Close closes the underlying connection.
-func (p *ConnMux) Close() error {
- return p.c.Close()
-}
-
-type muxConn struct {
- p *ConnMux
- ids []uint
- buf [8]uint
-}
-
-func (c *muxConn) send(flush bool, cmd string, args ...interface{}) error {
- if internal.LookupCommandInfo(cmd).Set != 0 {
- return errors.New("command not supported by mux pool")
- }
- p := c.p
- p.sendMu.Lock()
- id := p.sendID
- c.ids = append(c.ids, id)
- p.sendID++
- err := p.c.Send(cmd, args...)
- if flush {
- err = p.c.Flush()
- }
- p.sendMu.Unlock()
- return err
-}
-
-func (c *muxConn) Send(cmd string, args ...interface{}) error {
- return c.send(false, cmd, args...)
-}
-
-func (c *muxConn) Flush() error {
- p := c.p
- p.sendMu.Lock()
- err := p.c.Flush()
- p.sendMu.Unlock()
- return err
-}
-
-func (c *muxConn) Receive() (interface{}, error) {
- if len(c.ids) == 0 {
- return nil, errors.New("mux pool underflow")
- }
-
- id := c.ids[0]
- c.ids = c.ids[1:]
- if len(c.ids) == 0 {
- c.ids = c.buf[:0]
- }
-
- p := c.p
- p.recvMu.Lock()
- if p.recvID != id {
- ch := make(chan struct{})
- p.recvWait[id] = ch
- p.recvMu.Unlock()
- <-ch
- p.recvMu.Lock()
- if p.recvID != id {
- panic("out of sync")
- }
- }
-
- v, err := p.c.Receive()
-
- id++
- p.recvID = id
- ch, ok := p.recvWait[id]
- if ok {
- delete(p.recvWait, id)
- }
- p.recvMu.Unlock()
- if ok {
- ch <- struct{}{}
- }
-
- return v, err
-}
-
-func (c *muxConn) Close() error {
- var err error
- if len(c.ids) == 0 {
- return nil
- }
- c.Flush()
- for _ = range c.ids {
- _, err = c.Receive()
- }
- return err
-}
-
-func (c *muxConn) Do(cmd string, args ...interface{}) (interface{}, error) {
- if err := c.send(true, cmd, args...); err != nil {
- return nil, err
- }
- return c.Receive()
-}
-
-func (c *muxConn) Err() error {
- return c.p.c.Err()
-}
diff --git a/vendor/github.com/garyburd/redigo/redisx/connmux_test.go b/vendor/github.com/garyburd/redigo/redisx/connmux_test.go
deleted file mode 100644
index 9c3c8b162..000000000
--- a/vendor/github.com/garyburd/redigo/redisx/connmux_test.go
+++ /dev/null
@@ -1,259 +0,0 @@
-// Copyright 2014 Gary Burd
-//
-// Licensed under the Apache License, Version 2.0 (the "License"): you may
-// not use this file except in compliance with the License. You may obtain
-// a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// 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 redisx_test
-
-import (
- "net/textproto"
- "sync"
- "testing"
-
- "github.com/garyburd/redigo/internal/redistest"
- "github.com/garyburd/redigo/redis"
- "github.com/garyburd/redigo/redisx"
-)
-
-func TestConnMux(t *testing.T) {
- c, err := redistest.Dial()
- if err != nil {
- t.Fatalf("error connection to database, %v", err)
- }
- m := redisx.NewConnMux(c)
- defer m.Close()
-
- c1 := m.Get()
- c2 := m.Get()
- c1.Send("ECHO", "hello")
- c2.Send("ECHO", "world")
- c1.Flush()
- c2.Flush()
- s, err := redis.String(c1.Receive())
- if err != nil {
- t.Fatal(err)
- }
- if s != "hello" {
- t.Fatalf("echo returned %q, want %q", s, "hello")
- }
- s, err = redis.String(c2.Receive())
- if err != nil {
- t.Fatal(err)
- }
- if s != "world" {
- t.Fatalf("echo returned %q, want %q", s, "world")
- }
- c1.Close()
- c2.Close()
-}
-
-func TestConnMuxClose(t *testing.T) {
- c, err := redistest.Dial()
- if err != nil {
- t.Fatalf("error connection to database, %v", err)
- }
- m := redisx.NewConnMux(c)
- defer m.Close()
-
- c1 := m.Get()
- c2 := m.Get()
-
- if err := c1.Send("ECHO", "hello"); err != nil {
- t.Fatal(err)
- }
- if err := c1.Close(); err != nil {
- t.Fatal(err)
- }
-
- if err := c2.Send("ECHO", "world"); err != nil {
- t.Fatal(err)
- }
- if err := c2.Flush(); err != nil {
- t.Fatal(err)
- }
-
- s, err := redis.String(c2.Receive())
- if err != nil {
- t.Fatal(err)
- }
- if s != "world" {
- t.Fatalf("echo returned %q, want %q", s, "world")
- }
- c2.Close()
-}
-
-func BenchmarkConn(b *testing.B) {
- b.StopTimer()
- c, err := redistest.Dial()
- if err != nil {
- b.Fatalf("error connection to database, %v", err)
- }
- defer c.Close()
- b.StartTimer()
-
- for i := 0; i < b.N; i++ {
- if _, err := c.Do("PING"); err != nil {
- b.Fatal(err)
- }
- }
-}
-
-func BenchmarkConnMux(b *testing.B) {
- b.StopTimer()
- c, err := redistest.Dial()
- if err != nil {
- b.Fatalf("error connection to database, %v", err)
- }
- m := redisx.NewConnMux(c)
- defer m.Close()
-
- b.StartTimer()
-
- for i := 0; i < b.N; i++ {
- c := m.Get()
- if _, err := c.Do("PING"); err != nil {
- b.Fatal(err)
- }
- c.Close()
- }
-}
-
-func BenchmarkPool(b *testing.B) {
- b.StopTimer()
-
- p := redis.Pool{Dial: redistest.Dial, MaxIdle: 1}
- defer p.Close()
-
- // Fill the pool.
- c := p.Get()
- if err := c.Err(); err != nil {
- b.Fatal(err)
- }
- c.Close()
-
- b.StartTimer()
-
- for i := 0; i < b.N; i++ {
- c := p.Get()
- if _, err := c.Do("PING"); err != nil {
- b.Fatal(err)
- }
- c.Close()
- }
-}
-
-const numConcurrent = 10
-
-func BenchmarkConnMuxConcurrent(b *testing.B) {
- b.StopTimer()
- c, err := redistest.Dial()
- if err != nil {
- b.Fatalf("error connection to database, %v", err)
- }
- defer c.Close()
-
- m := redisx.NewConnMux(c)
-
- var wg sync.WaitGroup
- wg.Add(numConcurrent)
-
- b.StartTimer()
-
- for i := 0; i < numConcurrent; i++ {
- go func() {
- defer wg.Done()
- for i := 0; i < b.N; i++ {
- c := m.Get()
- if _, err := c.Do("PING"); err != nil {
- b.Fatal(err)
- }
- c.Close()
- }
- }()
- }
- wg.Wait()
-}
-
-func BenchmarkPoolConcurrent(b *testing.B) {
- b.StopTimer()
-
- p := redis.Pool{Dial: redistest.Dial, MaxIdle: numConcurrent}
- defer p.Close()
-
- // Fill the pool.
- conns := make([]redis.Conn, numConcurrent)
- for i := range conns {
- c := p.Get()
- if err := c.Err(); err != nil {
- b.Fatal(err)
- }
- conns[i] = c
- }
- for _, c := range conns {
- c.Close()
- }
-
- var wg sync.WaitGroup
- wg.Add(numConcurrent)
-
- b.StartTimer()
-
- for i := 0; i < numConcurrent; i++ {
- go func() {
- defer wg.Done()
- for i := 0; i < b.N; i++ {
- c := p.Get()
- if _, err := c.Do("PING"); err != nil {
- b.Fatal(err)
- }
- c.Close()
- }
- }()
- }
- wg.Wait()
-}
-
-func BenchmarkPipelineConcurrency(b *testing.B) {
- b.StopTimer()
- c, err := redistest.Dial()
- if err != nil {
- b.Fatalf("error connection to database, %v", err)
- }
- defer c.Close()
-
- var wg sync.WaitGroup
- wg.Add(numConcurrent)
-
- var pipeline textproto.Pipeline
-
- b.StartTimer()
-
- for i := 0; i < numConcurrent; i++ {
- go func() {
- defer wg.Done()
- for i := 0; i < b.N; i++ {
- id := pipeline.Next()
- pipeline.StartRequest(id)
- c.Send("PING")
- c.Flush()
- pipeline.EndRequest(id)
- pipeline.StartResponse(id)
- _, err := c.Receive()
- if err != nil {
- b.Fatal(err)
- }
- pipeline.EndResponse(id)
- }
- }()
- }
- wg.Wait()
-}
diff --git a/vendor/github.com/garyburd/redigo/redisx/doc.go b/vendor/github.com/garyburd/redigo/redisx/doc.go
deleted file mode 100644
index 91653dbe2..000000000
--- a/vendor/github.com/garyburd/redigo/redisx/doc.go
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright 2012 Gary Burd
-//
-// Licensed under the Apache License, Version 2.0 (the "License"): you may
-// not use this file except in compliance with the License. You may obtain
-// a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// 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 redisx contains experimental features for Redigo. Features in this
-// package may be modified or deleted at any time.
-package redisx // import "github.com/garyburd/redigo/redisx"
diff --git a/vendor/github.com/go-ldap/ldap/.githooks/pre-push b/vendor/github.com/go-ldap/ldap/.githooks/pre-push
new file mode 100755
index 000000000..4325ee31c
--- /dev/null
+++ b/vendor/github.com/go-ldap/ldap/.githooks/pre-push
@@ -0,0 +1,6 @@
+#!/usr/bin/env bash
+
+# install from the root of the repo with:
+# ln -s ../../.githooks/pre-push .git/hooks/pre-push
+
+make vet fmt lint \ No newline at end of file
diff --git a/vendor/github.com/go-ldap/ldap/.travis.yml b/vendor/github.com/go-ldap/ldap/.travis.yml
index a7a38951b..7e2f641e7 100644
--- a/vendor/github.com/go-ldap/ldap/.travis.yml
+++ b/vendor/github.com/go-ldap/ldap/.travis.yml
@@ -1,15 +1,24 @@
language: go
+env:
+ global:
+ - VET_VERSIONS="1.5 1.6 tip"
+ - LINT_VERSIONS="1.5 1.6 tip"
go:
- 1.2
- 1.3
- 1.4
- 1.5
+ - 1.6
- tip
go_import_path: gopkg.in/ldap.v2
install:
- go get gopkg.in/asn1-ber.v1
- go get gopkg.in/ldap.v2
- go get code.google.com/p/go.tools/cmd/cover || go get golang.org/x/tools/cmd/cover
+ - go get github.com/golang/lint/golint || true
- go build -v ./...
script:
- - go test -v -cover ./...
+ - make test
+ - make fmt
+ - if [[ "$VET_VERSIONS" == *"$TRAVIS_GO_VERSION"* ]]; then make vet; fi
+ - if [[ "$LINT_VERSIONS" == *"$TRAVIS_GO_VERSION"* ]]; then make lint; fi
diff --git a/vendor/github.com/go-ldap/ldap/Makefile b/vendor/github.com/go-ldap/ldap/Makefile
new file mode 100644
index 000000000..c1fc96657
--- /dev/null
+++ b/vendor/github.com/go-ldap/ldap/Makefile
@@ -0,0 +1,42 @@
+.PHONY: default install build test quicktest fmt vet lint
+
+default: fmt vet lint build quicktest
+
+install:
+ go get -t -v ./...
+
+build:
+ go build -v ./...
+
+test:
+ go test -v -cover ./...
+
+quicktest:
+ go test ./...
+
+# Capture output and force failure when there is non-empty output
+fmt:
+ @echo gofmt -l .
+ @OUTPUT=`gofmt -l . 2>&1`; \
+ if [ "$$OUTPUT" ]; then \
+ echo "gofmt must be run on the following files:"; \
+ echo "$$OUTPUT"; \
+ exit 1; \
+ fi
+
+# Only run on go1.5+
+vet:
+ go tool vet -atomic -bool -copylocks -nilfunc -printf -shadow -rangeloops -unreachable -unsafeptr -unusedresult .
+
+# https://github.com/golang/lint
+# go get github.com/golang/lint/golint
+# Capture output and force failure when there is non-empty output
+# Only run on go1.5+
+lint:
+ @echo golint ./...
+ @OUTPUT=`golint ./... 2>&1`; \
+ if [ "$$OUTPUT" ]; then \
+ echo "golint errors:"; \
+ echo "$$OUTPUT"; \
+ exit 1; \
+ fi
diff --git a/vendor/github.com/go-ldap/ldap/README.md b/vendor/github.com/go-ldap/ldap/README.md
index f49b4d6a1..a26ed2d82 100644
--- a/vendor/github.com/go-ldap/ldap/README.md
+++ b/vendor/github.com/go-ldap/ldap/README.md
@@ -13,41 +13,39 @@ Import the latest version with:
import "gopkg.in/ldap.v2"
-
## Required Libraries:
- gopkg.in/asn1-ber.v1
-## Working:
+## Features:
- - Connecting to LDAP server
+ - Connecting to LDAP server (non-TLS, TLS, STARTTLS)
- Binding to LDAP server
- Searching for entries
- - Compiling string filters to LDAP filters
+ - Filter Compile / Decompile
- Paging Search Results
- Modify Requests / Responses
- Add Requests / Responses
- Delete Requests / Responses
- - Better Unicode support
## Examples:
- search
- modify
-## Tests Implemented:
-
- - Filter Compile / Decompile
-
-## TODO:
+## Contributing:
- - [x] Add Requests / Responses
- - [x] Delete Requests / Responses
- - [x] Modify DN Requests / Responses
- - [ ] Compare Requests / Responses
- - [ ] Implement Tests / Benchmarks
+Bug reports and pull requests are welcome!
+Before submitting a pull request, please make sure tests and verification scripts pass:
+```
+make all
+```
+To set up a pre-push hook to run the tests and verify scripts before pushing:
+```
+ln -s ../../.githooks/pre-push .git/hooks/pre-push
+```
---
The Go gopher was designed by Renee French. (http://reneefrench.blogspot.com/)
diff --git a/vendor/github.com/go-ldap/ldap/add.go b/vendor/github.com/go-ldap/ldap/add.go
index 61b795e0e..0e5f6cdba 100644
--- a/vendor/github.com/go-ldap/ldap/add.go
+++ b/vendor/github.com/go-ldap/ldap/add.go
@@ -16,73 +16,78 @@ import (
"gopkg.in/asn1-ber.v1"
)
+// Attribute represents an LDAP attribute
type Attribute struct {
- attrType string
- attrVals []string
+ // Type is the name of the LDAP attribute
+ Type string
+ // Vals are the LDAP attribute values
+ Vals []string
}
func (a *Attribute) encode() *ber.Packet {
seq := ber.Encode(ber.ClassUniversal, ber.TypeConstructed, ber.TagSequence, nil, "Attribute")
- seq.AppendChild(ber.NewString(ber.ClassUniversal, ber.TypePrimitive, ber.TagOctetString, a.attrType, "Type"))
+ seq.AppendChild(ber.NewString(ber.ClassUniversal, ber.TypePrimitive, ber.TagOctetString, a.Type, "Type"))
set := ber.Encode(ber.ClassUniversal, ber.TypeConstructed, ber.TagSet, nil, "AttributeValue")
- for _, value := range a.attrVals {
+ for _, value := range a.Vals {
set.AppendChild(ber.NewString(ber.ClassUniversal, ber.TypePrimitive, ber.TagOctetString, value, "Vals"))
}
seq.AppendChild(set)
return seq
}
+// AddRequest represents an LDAP AddRequest operation
type AddRequest struct {
- dn string
- attributes []Attribute
+ // DN identifies the entry being added
+ DN string
+ // Attributes list the attributes of the new entry
+ Attributes []Attribute
}
func (a AddRequest) encode() *ber.Packet {
request := ber.Encode(ber.ClassApplication, ber.TypeConstructed, ApplicationAddRequest, nil, "Add Request")
- request.AppendChild(ber.NewString(ber.ClassUniversal, ber.TypePrimitive, ber.TagOctetString, a.dn, "DN"))
+ request.AppendChild(ber.NewString(ber.ClassUniversal, ber.TypePrimitive, ber.TagOctetString, a.DN, "DN"))
attributes := ber.Encode(ber.ClassUniversal, ber.TypeConstructed, ber.TagSequence, nil, "Attributes")
- for _, attribute := range a.attributes {
+ for _, attribute := range a.Attributes {
attributes.AppendChild(attribute.encode())
}
request.AppendChild(attributes)
return request
}
+// Attribute adds an attribute with the given type and values
func (a *AddRequest) Attribute(attrType string, attrVals []string) {
- a.attributes = append(a.attributes, Attribute{attrType: attrType, attrVals: attrVals})
+ a.Attributes = append(a.Attributes, Attribute{Type: attrType, Vals: attrVals})
}
+// NewAddRequest returns an AddRequest for the given DN, with no attributes
func NewAddRequest(dn string) *AddRequest {
return &AddRequest{
- dn: dn,
+ DN: dn,
}
}
+// Add performs the given AddRequest
func (l *Conn) Add(addRequest *AddRequest) error {
- messageID := l.nextMessageID()
packet := ber.Encode(ber.ClassUniversal, ber.TypeConstructed, ber.TagSequence, nil, "LDAP Request")
- packet.AppendChild(ber.NewInteger(ber.ClassUniversal, ber.TypePrimitive, ber.TagInteger, messageID, "MessageID"))
+ packet.AppendChild(ber.NewInteger(ber.ClassUniversal, ber.TypePrimitive, ber.TagInteger, l.nextMessageID(), "MessageID"))
packet.AppendChild(addRequest.encode())
l.Debug.PrintPacket(packet)
- channel, err := l.sendMessage(packet)
+ msgCtx, err := l.sendMessage(packet)
if err != nil {
return err
}
- if channel == nil {
- return NewError(ErrorNetwork, errors.New("ldap: could not send message"))
- }
- defer l.finishMessage(messageID)
+ defer l.finishMessage(msgCtx)
- l.Debug.Printf("%d: waiting for response", messageID)
- packetResponse, ok := <-channel
+ l.Debug.Printf("%d: waiting for response", msgCtx.id)
+ packetResponse, ok := <-msgCtx.responses
if !ok {
- return NewError(ErrorNetwork, errors.New("ldap: channel closed"))
+ return NewError(ErrorNetwork, errors.New("ldap: response channel closed"))
}
packet, err = packetResponse.ReadPacket()
- l.Debug.Printf("%d: got response %p", messageID, packet)
+ l.Debug.Printf("%d: got response %p", msgCtx.id, packet)
if err != nil {
return err
}
@@ -103,6 +108,6 @@ func (l *Conn) Add(addRequest *AddRequest) error {
log.Printf("Unexpected Response: %d", packet.Children[1].Tag)
}
- l.Debug.Printf("%d: returning", messageID)
+ l.Debug.Printf("%d: returning", msgCtx.id)
return nil
}
diff --git a/vendor/github.com/go-ldap/ldap/bind.go b/vendor/github.com/go-ldap/ldap/bind.go
index ae68eb481..26b3cc727 100644
--- a/vendor/github.com/go-ldap/ldap/bind.go
+++ b/vendor/github.com/go-ldap/ldap/bind.go
@@ -10,16 +10,22 @@ import (
"gopkg.in/asn1-ber.v1"
)
+// SimpleBindRequest represents a username/password bind operation
type SimpleBindRequest struct {
+ // Username is the name of the Directory object that the client wishes to bind as
Username string
+ // Password is the credentials to bind with
Password string
+ // Controls are optional controls to send with the bind request
Controls []Control
}
+// SimpleBindResult contains the response from the server
type SimpleBindResult struct {
Controls []Control
}
+// NewSimpleBindRequest returns a bind request
func NewSimpleBindRequest(username string, password string, controls []Control) *SimpleBindRequest {
return &SimpleBindRequest{
Username: username,
@@ -39,11 +45,10 @@ func (bindRequest *SimpleBindRequest) encode() *ber.Packet {
return request
}
+// SimpleBind performs the simple bind operation defined in the given request
func (l *Conn) SimpleBind(simpleBindRequest *SimpleBindRequest) (*SimpleBindResult, error) {
- messageID := l.nextMessageID()
-
packet := ber.Encode(ber.ClassUniversal, ber.TypeConstructed, ber.TagSequence, nil, "LDAP Request")
- packet.AppendChild(ber.NewInteger(ber.ClassUniversal, ber.TypePrimitive, ber.TagInteger, messageID, "MessageID"))
+ packet.AppendChild(ber.NewInteger(ber.ClassUniversal, ber.TypePrimitive, ber.TagInteger, l.nextMessageID(), "MessageID"))
encodedBindRequest := simpleBindRequest.encode()
packet.AppendChild(encodedBindRequest)
@@ -51,21 +56,18 @@ func (l *Conn) SimpleBind(simpleBindRequest *SimpleBindRequest) (*SimpleBindResu
ber.PrintPacket(packet)
}
- channel, err := l.sendMessage(packet)
+ msgCtx, err := l.sendMessage(packet)
if err != nil {
return nil, err
}
- if channel == nil {
- return nil, NewError(ErrorNetwork, errors.New("ldap: could not send message"))
- }
- defer l.finishMessage(messageID)
+ defer l.finishMessage(msgCtx)
- packetResponse, ok := <-channel
+ packetResponse, ok := <-msgCtx.responses
if !ok {
- return nil, NewError(ErrorNetwork, errors.New("ldap: channel closed"))
+ return nil, NewError(ErrorNetwork, errors.New("ldap: response channel closed"))
}
packet, err = packetResponse.ReadPacket()
- l.Debug.Printf("%d: got response %p", messageID, packet)
+ l.Debug.Printf("%d: got response %p", msgCtx.id, packet)
if err != nil {
return nil, err
}
@@ -95,11 +97,10 @@ func (l *Conn) SimpleBind(simpleBindRequest *SimpleBindRequest) (*SimpleBindResu
return result, nil
}
+// Bind performs a bind with the given username and password
func (l *Conn) Bind(username, password string) error {
- messageID := l.nextMessageID()
-
packet := ber.Encode(ber.ClassUniversal, ber.TypeConstructed, ber.TagSequence, nil, "LDAP Request")
- packet.AppendChild(ber.NewInteger(ber.ClassUniversal, ber.TypePrimitive, ber.TagInteger, messageID, "MessageID"))
+ packet.AppendChild(ber.NewInteger(ber.ClassUniversal, ber.TypePrimitive, ber.TagInteger, l.nextMessageID(), "MessageID"))
bindRequest := ber.Encode(ber.ClassApplication, ber.TypeConstructed, ApplicationBindRequest, nil, "Bind Request")
bindRequest.AppendChild(ber.NewInteger(ber.ClassUniversal, ber.TypePrimitive, ber.TagInteger, 3, "Version"))
bindRequest.AppendChild(ber.NewString(ber.ClassUniversal, ber.TypePrimitive, ber.TagOctetString, username, "User Name"))
@@ -110,21 +111,18 @@ func (l *Conn) Bind(username, password string) error {
ber.PrintPacket(packet)
}
- channel, err := l.sendMessage(packet)
+ msgCtx, err := l.sendMessage(packet)
if err != nil {
return err
}
- if channel == nil {
- return NewError(ErrorNetwork, errors.New("ldap: could not send message"))
- }
- defer l.finishMessage(messageID)
+ defer l.finishMessage(msgCtx)
- packetResponse, ok := <-channel
+ packetResponse, ok := <-msgCtx.responses
if !ok {
- return NewError(ErrorNetwork, errors.New("ldap: channel closed"))
+ return NewError(ErrorNetwork, errors.New("ldap: response channel closed"))
}
packet, err = packetResponse.ReadPacket()
- l.Debug.Printf("%d: got response %p", messageID, packet)
+ l.Debug.Printf("%d: got response %p", msgCtx.id, packet)
if err != nil {
return err
}
diff --git a/vendor/github.com/go-ldap/ldap/compare.go b/vendor/github.com/go-ldap/ldap/compare.go
index dfe728bad..cc6d2af5e 100644
--- a/vendor/github.com/go-ldap/ldap/compare.go
+++ b/vendor/github.com/go-ldap/ldap/compare.go
@@ -33,9 +33,8 @@ import (
// Compare checks to see if the attribute of the dn matches value. Returns true if it does otherwise
// false with any error that occurs if any.
func (l *Conn) Compare(dn, attribute, value string) (bool, error) {
- messageID := l.nextMessageID()
packet := ber.Encode(ber.ClassUniversal, ber.TypeConstructed, ber.TagSequence, nil, "LDAP Request")
- packet.AppendChild(ber.NewInteger(ber.ClassUniversal, ber.TypePrimitive, ber.TagInteger, messageID, "MessageID"))
+ packet.AppendChild(ber.NewInteger(ber.ClassUniversal, ber.TypePrimitive, ber.TagInteger, l.nextMessageID(), "MessageID"))
request := ber.Encode(ber.ClassApplication, ber.TypeConstructed, ApplicationCompareRequest, nil, "Compare Request")
request.AppendChild(ber.NewString(ber.ClassUniversal, ber.TypePrimitive, ber.TagOctetString, dn, "DN"))
@@ -48,22 +47,19 @@ func (l *Conn) Compare(dn, attribute, value string) (bool, error) {
l.Debug.PrintPacket(packet)
- channel, err := l.sendMessage(packet)
+ msgCtx, err := l.sendMessage(packet)
if err != nil {
return false, err
}
- if channel == nil {
- return false, NewError(ErrorNetwork, errors.New("ldap: could not send message"))
- }
- defer l.finishMessage(messageID)
+ defer l.finishMessage(msgCtx)
- l.Debug.Printf("%d: waiting for response", messageID)
- packetResponse, ok := <-channel
+ l.Debug.Printf("%d: waiting for response", msgCtx.id)
+ packetResponse, ok := <-msgCtx.responses
if !ok {
- return false, NewError(ErrorNetwork, errors.New("ldap: channel closed"))
+ return false, NewError(ErrorNetwork, errors.New("ldap: response channel closed"))
}
packet, err = packetResponse.ReadPacket()
- l.Debug.Printf("%d: got response %p", messageID, packet)
+ l.Debug.Printf("%d: got response %p", msgCtx.id, packet)
if err != nil {
return false, err
}
diff --git a/vendor/github.com/go-ldap/ldap/conn.go b/vendor/github.com/go-ldap/ldap/conn.go
index 6aad628be..b5bd99adb 100644
--- a/vendor/github.com/go-ldap/ldap/conn.go
+++ b/vendor/github.com/go-ldap/ldap/conn.go
@@ -17,18 +17,27 @@ import (
)
const (
- MessageQuit = 0
- MessageRequest = 1
+ // MessageQuit causes the processMessages loop to exit
+ MessageQuit = 0
+ // MessageRequest sends a request to the server
+ MessageRequest = 1
+ // MessageResponse receives a response from the server
MessageResponse = 2
- MessageFinish = 3
- MessageTimeout = 4
+ // MessageFinish indicates the client considers a particular message ID to be finished
+ MessageFinish = 3
+ // MessageTimeout indicates the client-specified timeout for a particular message ID has been reached
+ MessageTimeout = 4
)
+// PacketResponse contains the packet or error encountered reading a response
type PacketResponse struct {
+ // Packet is the packet read from the server
Packet *ber.Packet
- Error error
+ // Error is an error encountered while reading
+ Error error
}
+// ReadPacket returns the packet or an error
func (pr *PacketResponse) ReadPacket() (*ber.Packet, error) {
if (pr == nil) || (pr.Packet == nil && pr.Error == nil) {
return nil, NewError(ErrorNetwork, errors.New("ldap: could not retrieve response"))
@@ -36,11 +45,31 @@ func (pr *PacketResponse) ReadPacket() (*ber.Packet, error) {
return pr.Packet, pr.Error
}
+type messageContext struct {
+ id int64
+ // close(done) should only be called from finishMessage()
+ done chan struct{}
+ // close(responses) should only be called from processMessages(), and only sent to from sendResponse()
+ responses chan *PacketResponse
+}
+
+// sendResponse should only be called within the processMessages() loop which
+// is also responsible for closing the responses channel.
+func (msgCtx *messageContext) sendResponse(packet *PacketResponse) {
+ select {
+ case msgCtx.responses <- packet:
+ // Successfully sent packet to message handler.
+ case <-msgCtx.done:
+ // The request handler is done and will not receive more
+ // packets.
+ }
+}
+
type messagePacket struct {
Op int
MessageID int64
Packet *ber.Packet
- Channel chan *PacketResponse
+ Context *messageContext
}
type sendMessageFlags uint
@@ -54,10 +83,11 @@ type Conn struct {
conn net.Conn
isTLS bool
isClosing bool
+ closeErr error
isStartingTLS bool
Debug debugging
chanConfirm chan bool
- chanResults map[int64]chan *PacketResponse
+ messageContexts map[int64]*messageContext
chanMessage chan *messagePacket
chanMessageID chan int64
wgSender sync.WaitGroup
@@ -111,16 +141,17 @@ func DialTLS(network, addr string, config *tls.Config) (*Conn, error) {
// NewConn returns a new Conn using conn for network I/O.
func NewConn(conn net.Conn, isTLS bool) *Conn {
return &Conn{
- conn: conn,
- chanConfirm: make(chan bool),
- chanMessageID: make(chan int64),
- chanMessage: make(chan *messagePacket, 10),
- chanResults: map[int64]chan *PacketResponse{},
- requestTimeout: 0,
- isTLS: isTLS,
+ conn: conn,
+ chanConfirm: make(chan bool),
+ chanMessageID: make(chan int64),
+ chanMessage: make(chan *messagePacket, 10),
+ messageContexts: map[int64]*messageContext{},
+ requestTimeout: 0,
+ isTLS: isTLS,
}
}
+// Start initializes goroutines to read responses and process messages
func (l *Conn) Start() {
go l.reader()
go l.processMessages()
@@ -148,7 +179,7 @@ func (l *Conn) Close() {
l.wgClose.Wait()
}
-// Sets the time after a request is sent that a MessageTimeout triggers
+// SetTimeout sets the time after a request is sent that a MessageTimeout triggers
func (l *Conn) SetTimeout(timeout time.Duration) {
if timeout > 0 {
l.requestTimeout = timeout
@@ -167,35 +198,31 @@ func (l *Conn) nextMessageID() int64 {
// StartTLS sends the command to start a TLS session and then creates a new TLS Client
func (l *Conn) StartTLS(config *tls.Config) error {
- messageID := l.nextMessageID()
-
if l.isTLS {
return NewError(ErrorNetwork, errors.New("ldap: already encrypted"))
}
packet := ber.Encode(ber.ClassUniversal, ber.TypeConstructed, ber.TagSequence, nil, "LDAP Request")
- packet.AppendChild(ber.NewInteger(ber.ClassUniversal, ber.TypePrimitive, ber.TagInteger, messageID, "MessageID"))
+ packet.AppendChild(ber.NewInteger(ber.ClassUniversal, ber.TypePrimitive, ber.TagInteger, l.nextMessageID(), "MessageID"))
request := ber.Encode(ber.ClassApplication, ber.TypeConstructed, ApplicationExtendedRequest, nil, "Start TLS")
request.AppendChild(ber.NewString(ber.ClassContext, ber.TypePrimitive, 0, "1.3.6.1.4.1.1466.20037", "TLS Extended Command"))
packet.AppendChild(request)
l.Debug.PrintPacket(packet)
- channel, err := l.sendMessageWithFlags(packet, startTLS)
+ msgCtx, err := l.sendMessageWithFlags(packet, startTLS)
if err != nil {
return err
}
- if channel == nil {
- return NewError(ErrorNetwork, errors.New("ldap: could not send message"))
- }
+ defer l.finishMessage(msgCtx)
- l.Debug.Printf("%d: waiting for response", messageID)
- defer l.finishMessage(messageID)
- packetResponse, ok := <-channel
+ l.Debug.Printf("%d: waiting for response", msgCtx.id)
+
+ packetResponse, ok := <-msgCtx.responses
if !ok {
- return NewError(ErrorNetwork, errors.New("ldap: channel closed"))
+ return NewError(ErrorNetwork, errors.New("ldap: response channel closed"))
}
packet, err = packetResponse.ReadPacket()
- l.Debug.Printf("%d: got response %p", messageID, packet)
+ l.Debug.Printf("%d: got response %p", msgCtx.id, packet)
if err != nil {
return err
}
@@ -226,11 +253,11 @@ func (l *Conn) StartTLS(config *tls.Config) error {
return nil
}
-func (l *Conn) sendMessage(packet *ber.Packet) (chan *PacketResponse, error) {
+func (l *Conn) sendMessage(packet *ber.Packet) (*messageContext, error) {
return l.sendMessageWithFlags(packet, 0)
}
-func (l *Conn) sendMessageWithFlags(packet *ber.Packet, flags sendMessageFlags) (chan *PacketResponse, error) {
+func (l *Conn) sendMessageWithFlags(packet *ber.Packet, flags sendMessageFlags) (*messageContext, error) {
if l.isClosing {
return nil, NewError(ErrorNetwork, errors.New("ldap: connection closed"))
}
@@ -238,32 +265,38 @@ func (l *Conn) sendMessageWithFlags(packet *ber.Packet, flags sendMessageFlags)
l.Debug.Printf("flags&startTLS = %d", flags&startTLS)
if l.isStartingTLS {
l.messageMutex.Unlock()
- return nil, NewError(ErrorNetwork, errors.New("ldap: connection is in startls phase."))
+ return nil, NewError(ErrorNetwork, errors.New("ldap: connection is in startls phase"))
}
if flags&startTLS != 0 {
if l.outstandingRequests != 0 {
l.messageMutex.Unlock()
return nil, NewError(ErrorNetwork, errors.New("ldap: cannot StartTLS with outstanding requests"))
- } else {
- l.isStartingTLS = true
}
+ l.isStartingTLS = true
}
l.outstandingRequests++
l.messageMutex.Unlock()
- out := make(chan *PacketResponse)
+ responses := make(chan *PacketResponse)
+ messageID := packet.Children[0].Value.(int64)
message := &messagePacket{
Op: MessageRequest,
- MessageID: packet.Children[0].Value.(int64),
+ MessageID: messageID,
Packet: packet,
- Channel: out,
+ Context: &messageContext{
+ id: messageID,
+ done: make(chan struct{}),
+ responses: responses,
+ },
}
l.sendProcessMessage(message)
- return out, nil
+ return message.Context, nil
}
-func (l *Conn) finishMessage(messageID int64) {
+func (l *Conn) finishMessage(msgCtx *messageContext) {
+ close(msgCtx.done)
+
if l.isClosing {
return
}
@@ -277,7 +310,7 @@ func (l *Conn) finishMessage(messageID int64) {
message := &messagePacket{
Op: MessageFinish,
- MessageID: messageID,
+ MessageID: msgCtx.id,
}
l.sendProcessMessage(message)
}
@@ -297,10 +330,15 @@ func (l *Conn) processMessages() {
if err := recover(); err != nil {
log.Printf("ldap: recovered panic in processMessages: %v", err)
}
- for messageID, channel := range l.chanResults {
+ for messageID, msgCtx := range l.messageContexts {
+ // If we are closing due to an error, inform anyone who
+ // is waiting about the error.
+ if l.isClosing && l.closeErr != nil {
+ msgCtx.sendResponse(&PacketResponse{Error: l.closeErr})
+ }
l.Debug.Printf("Closing channel for MessageID %d", messageID)
- close(channel)
- delete(l.chanResults, messageID)
+ close(msgCtx.responses)
+ delete(l.messageContexts, messageID)
}
close(l.chanMessageID)
l.chanConfirm <- true
@@ -324,15 +362,20 @@ func (l *Conn) processMessages() {
case MessageRequest:
// Add to message list and write to network
l.Debug.Printf("Sending message %d", message.MessageID)
- l.chanResults[message.MessageID] = message.Channel
buf := message.Packet.Bytes()
_, err := l.conn.Write(buf)
if err != nil {
l.Debug.Printf("Error Sending Message: %s", err.Error())
+ message.Context.sendResponse(&PacketResponse{Error: fmt.Errorf("unable to send request: %s", err)})
+ close(message.Context.responses)
break
}
+ // Only add to messageContexts if we were able to
+ // successfully write the message.
+ l.messageContexts[message.MessageID] = message.Context
+
// Add timeout if defined
if l.requestTimeout > 0 {
go func() {
@@ -351,8 +394,8 @@ func (l *Conn) processMessages() {
}
case MessageResponse:
l.Debug.Printf("Receiving message %d", message.MessageID)
- if chanResult, ok := l.chanResults[message.MessageID]; ok {
- chanResult <- &PacketResponse{message.Packet, nil}
+ if msgCtx, ok := l.messageContexts[message.MessageID]; ok {
+ msgCtx.sendResponse(&PacketResponse{message.Packet, nil})
} else {
log.Printf("Received unexpected message %d, %v", message.MessageID, l.isClosing)
ber.PrintPacket(message.Packet)
@@ -360,17 +403,17 @@ func (l *Conn) processMessages() {
case MessageTimeout:
// Handle the timeout by closing the channel
// All reads will return immediately
- if chanResult, ok := l.chanResults[message.MessageID]; ok {
- chanResult <- &PacketResponse{message.Packet, errors.New("ldap: connection timed out")}
+ if msgCtx, ok := l.messageContexts[message.MessageID]; ok {
l.Debug.Printf("Receiving message timeout for %d", message.MessageID)
- delete(l.chanResults, message.MessageID)
- close(chanResult)
+ msgCtx.sendResponse(&PacketResponse{message.Packet, errors.New("ldap: connection timed out")})
+ delete(l.messageContexts, message.MessageID)
+ close(msgCtx.responses)
}
case MessageFinish:
l.Debug.Printf("Finished message %d", message.MessageID)
- if chanResult, ok := l.chanResults[message.MessageID]; ok {
- close(chanResult)
- delete(l.chanResults, message.MessageID)
+ if msgCtx, ok := l.messageContexts[message.MessageID]; ok {
+ delete(l.messageContexts, message.MessageID)
+ close(msgCtx.responses)
}
}
}
@@ -397,6 +440,7 @@ func (l *Conn) reader() {
if err != nil {
// A read error is expected here if we are closing the connection...
if !l.isClosing {
+ l.closeErr = fmt.Errorf("unable to read LDAP response packet: %s", err)
l.Debug.Printf("reader error: %s", err.Error())
}
return
@@ -419,6 +463,5 @@ func (l *Conn) reader() {
if !l.sendProcessMessage(message) {
return
}
-
}
}
diff --git a/vendor/github.com/go-ldap/ldap/conn_test.go b/vendor/github.com/go-ldap/ldap/conn_test.go
index 8394e5339..10766bbd4 100644
--- a/vendor/github.com/go-ldap/ldap/conn_test.go
+++ b/vendor/github.com/go-ldap/ldap/conn_test.go
@@ -1,9 +1,14 @@
package ldap
import (
+ "bytes"
+ "errors"
+ "io"
"net"
"net/http"
"net/http/httptest"
+ "runtime"
+ "sync"
"testing"
"time"
@@ -27,19 +32,20 @@ func TestUnresponsiveConnection(t *testing.T) {
defer conn.Close()
// Mock a packet
- messageID := conn.nextMessageID()
packet := ber.Encode(ber.ClassUniversal, ber.TypeConstructed, ber.TagSequence, nil, "LDAP Request")
- packet.AppendChild(ber.NewInteger(ber.ClassUniversal, ber.TypePrimitive, ber.TagInteger, messageID, "MessageID"))
+ packet.AppendChild(ber.NewInteger(ber.ClassUniversal, ber.TypePrimitive, ber.TagInteger, conn.nextMessageID(), "MessageID"))
bindRequest := ber.Encode(ber.ClassApplication, ber.TypeConstructed, ApplicationBindRequest, nil, "Bind Request")
bindRequest.AppendChild(ber.NewInteger(ber.ClassUniversal, ber.TypePrimitive, ber.TagInteger, 3, "Version"))
packet.AppendChild(bindRequest)
// Send packet and test response
- channel, err := conn.sendMessage(packet)
+ msgCtx, err := conn.sendMessage(packet)
if err != nil {
t.Fatalf("error sending message: %v", err)
}
- packetResponse, ok := <-channel
+ defer conn.finishMessage(msgCtx)
+
+ packetResponse, ok := <-msgCtx.responses
if !ok {
t.Fatalf("no PacketResponse in response channel")
}
@@ -51,3 +57,284 @@ func TestUnresponsiveConnection(t *testing.T) {
t.Fatalf("unexpected error: %v", err)
}
}
+
+// TestFinishMessage tests that we do not enter deadlock when a goroutine makes
+// a request but does not handle all responses from the server.
+func TestConn(t *testing.T) {
+ ptc := newPacketTranslatorConn()
+ defer ptc.Close()
+
+ conn := NewConn(ptc, false)
+ conn.Start()
+
+ // Test sending 5 different requests in series. Ensure that we can
+ // get a response packet from the underlying connection and also
+ // ensure that we can gracefully ignore unhandled responses.
+ for i := 0; i < 5; i++ {
+ t.Logf("serial request %d", i)
+ // Create a message and make sure we can receive responses.
+ msgCtx := testSendRequest(t, ptc, conn)
+ testReceiveResponse(t, ptc, msgCtx)
+
+ // Send a few unhandled responses and finish the message.
+ testSendUnhandledResponsesAndFinish(t, ptc, conn, msgCtx, 5)
+ t.Logf("serial request %d done", i)
+ }
+
+ // Test sending 5 different requests in parallel.
+ var wg sync.WaitGroup
+ for i := 0; i < 5; i++ {
+ wg.Add(1)
+ go func(i int) {
+ defer wg.Done()
+ t.Logf("parallel request %d", i)
+ // Create a message and make sure we can receive responses.
+ msgCtx := testSendRequest(t, ptc, conn)
+ testReceiveResponse(t, ptc, msgCtx)
+
+ // Send a few unhandled responses and finish the message.
+ testSendUnhandledResponsesAndFinish(t, ptc, conn, msgCtx, 5)
+ t.Logf("parallel request %d done", i)
+ }(i)
+ }
+ wg.Wait()
+
+ // We cannot run Close() in a defer because t.FailNow() will run it and
+ // it will block if the processMessage Loop is in a deadlock.
+ conn.Close()
+}
+
+func testSendRequest(t *testing.T, ptc *packetTranslatorConn, conn *Conn) (msgCtx *messageContext) {
+ var msgID int64
+ runWithTimeout(t, time.Second, func() {
+ msgID = conn.nextMessageID()
+ })
+
+ requestPacket := ber.Encode(ber.ClassUniversal, ber.TypeConstructed, ber.TagSequence, nil, "LDAP Request")
+ requestPacket.AppendChild(ber.NewInteger(ber.ClassUniversal, ber.TypePrimitive, ber.TagInteger, msgID, "MessageID"))
+
+ var err error
+
+ runWithTimeout(t, time.Second, func() {
+ msgCtx, err = conn.sendMessage(requestPacket)
+ if err != nil {
+ t.Fatalf("unable to send request message: %s", err)
+ }
+ })
+
+ // We should now be able to get this request packet out from the other
+ // side.
+ runWithTimeout(t, time.Second, func() {
+ if _, err = ptc.ReceiveRequest(); err != nil {
+ t.Fatalf("unable to receive request packet: %s", err)
+ }
+ })
+
+ return msgCtx
+}
+
+func testReceiveResponse(t *testing.T, ptc *packetTranslatorConn, msgCtx *messageContext) {
+ // Send a mock response packet.
+ responsePacket := ber.Encode(ber.ClassUniversal, ber.TypeConstructed, ber.TagSequence, nil, "LDAP Response")
+ responsePacket.AppendChild(ber.NewInteger(ber.ClassUniversal, ber.TypePrimitive, ber.TagInteger, msgCtx.id, "MessageID"))
+
+ runWithTimeout(t, time.Second, func() {
+ if err := ptc.SendResponse(responsePacket); err != nil {
+ t.Fatalf("unable to send response packet: %s", err)
+ }
+ })
+
+ // We should be able to receive the packet from the connection.
+ runWithTimeout(t, time.Second, func() {
+ if _, ok := <-msgCtx.responses; !ok {
+ t.Fatal("response channel closed")
+ }
+ })
+}
+
+func testSendUnhandledResponsesAndFinish(t *testing.T, ptc *packetTranslatorConn, conn *Conn, msgCtx *messageContext, numResponses int) {
+ // Send a mock response packet.
+ responsePacket := ber.Encode(ber.ClassUniversal, ber.TypeConstructed, ber.TagSequence, nil, "LDAP Response")
+ responsePacket.AppendChild(ber.NewInteger(ber.ClassUniversal, ber.TypePrimitive, ber.TagInteger, msgCtx.id, "MessageID"))
+
+ // Send extra responses but do not attempt to receive them on the
+ // client side.
+ for i := 0; i < numResponses; i++ {
+ runWithTimeout(t, time.Second, func() {
+ if err := ptc.SendResponse(responsePacket); err != nil {
+ t.Fatalf("unable to send response packet: %s", err)
+ }
+ })
+ }
+
+ // Finally, attempt to finish this message.
+ runWithTimeout(t, time.Second, func() {
+ conn.finishMessage(msgCtx)
+ })
+}
+
+func runWithTimeout(t *testing.T, timeout time.Duration, f func()) {
+ runtime.Gosched()
+
+ done := make(chan struct{})
+ go func() {
+ f()
+ close(done)
+ }()
+
+ runtime.Gosched()
+
+ select {
+ case <-done: // Success!
+ case <-time.After(timeout):
+ _, file, line, _ := runtime.Caller(1)
+ t.Fatalf("%s:%d timed out", file, line)
+ }
+}
+
+// packetTranslatorConn is a helful type which can be used with various tests
+// in this package. It implements the net.Conn interface to be used as an
+// underlying connection for a *ldap.Conn. Most methods are no-ops but the
+// Read() and Write() methods are able to translate ber-encoded packets for
+// testing LDAP requests and responses.
+//
+// Test cases can simulate an LDAP server sending a response by calling the
+// SendResponse() method with a ber-encoded LDAP response packet. Test cases
+// can simulate an LDAP server receiving a request from a client by calling the
+// ReceiveRequest() method which returns a ber-encoded LDAP request packet.
+type packetTranslatorConn struct {
+ lock sync.Mutex
+ isClosed bool
+
+ responseCond sync.Cond
+ requestCond sync.Cond
+
+ responseBuf bytes.Buffer
+ requestBuf bytes.Buffer
+}
+
+var errPacketTranslatorConnClosed = errors.New("connection closed")
+
+func newPacketTranslatorConn() *packetTranslatorConn {
+ conn := &packetTranslatorConn{}
+ conn.responseCond = sync.Cond{L: &conn.lock}
+ conn.requestCond = sync.Cond{L: &conn.lock}
+
+ return conn
+}
+
+// Read is called by the reader() loop to receive response packets. It will
+// block until there are more packet bytes available or this connection is
+// closed.
+func (c *packetTranslatorConn) Read(b []byte) (n int, err error) {
+ c.lock.Lock()
+ defer c.lock.Unlock()
+
+ for !c.isClosed {
+ // Attempt to read data from the response buffer. If it fails
+ // with an EOF, wait and try again.
+ n, err = c.responseBuf.Read(b)
+ if err != io.EOF {
+ return n, err
+ }
+
+ c.responseCond.Wait()
+ }
+
+ return 0, errPacketTranslatorConnClosed
+}
+
+// SendResponse writes the given response packet to the response buffer for
+// this conection, signalling any goroutine waiting to read a response.
+func (c *packetTranslatorConn) SendResponse(packet *ber.Packet) error {
+ c.lock.Lock()
+ defer c.lock.Unlock()
+
+ if c.isClosed {
+ return errPacketTranslatorConnClosed
+ }
+
+ // Signal any goroutine waiting to read a response.
+ defer c.responseCond.Broadcast()
+
+ // Writes to the buffer should always succeed.
+ c.responseBuf.Write(packet.Bytes())
+
+ return nil
+}
+
+// Write is called by the processMessages() loop to send request packets.
+func (c *packetTranslatorConn) Write(b []byte) (n int, err error) {
+ c.lock.Lock()
+ defer c.lock.Unlock()
+
+ if c.isClosed {
+ return 0, errPacketTranslatorConnClosed
+ }
+
+ // Signal any goroutine waiting to read a request.
+ defer c.requestCond.Broadcast()
+
+ // Writes to the buffer should always succeed.
+ return c.requestBuf.Write(b)
+}
+
+// ReceiveRequest attempts to read a request packet from this connection. It
+// will block until it is able to read a full request packet or until this
+// connection is closed.
+func (c *packetTranslatorConn) ReceiveRequest() (*ber.Packet, error) {
+ c.lock.Lock()
+ defer c.lock.Unlock()
+
+ for !c.isClosed {
+ // Attempt to parse a request packet from the request buffer.
+ // If it fails with an unexpected EOF, wait and try again.
+ requestReader := bytes.NewReader(c.requestBuf.Bytes())
+ packet, err := ber.ReadPacket(requestReader)
+ switch err {
+ case io.EOF, io.ErrUnexpectedEOF:
+ c.requestCond.Wait()
+ case nil:
+ // Advance the request buffer by the number of bytes
+ // read to decode the request packet.
+ c.requestBuf.Next(c.requestBuf.Len() - requestReader.Len())
+ return packet, nil
+ default:
+ return nil, err
+ }
+ }
+
+ return nil, errPacketTranslatorConnClosed
+}
+
+// Close closes this connection causing Read() and Write() calls to fail.
+func (c *packetTranslatorConn) Close() error {
+ c.lock.Lock()
+ defer c.lock.Unlock()
+
+ c.isClosed = true
+ c.responseCond.Broadcast()
+ c.requestCond.Broadcast()
+
+ return nil
+}
+
+func (c *packetTranslatorConn) LocalAddr() net.Addr {
+ return (*net.TCPAddr)(nil)
+}
+
+func (c *packetTranslatorConn) RemoteAddr() net.Addr {
+ return (*net.TCPAddr)(nil)
+}
+
+func (c *packetTranslatorConn) SetDeadline(t time.Time) error {
+ return nil
+}
+
+func (c *packetTranslatorConn) SetReadDeadline(t time.Time) error {
+ return nil
+}
+
+func (c *packetTranslatorConn) SetWriteDeadline(t time.Time) error {
+ return nil
+}
diff --git a/vendor/github.com/go-ldap/ldap/control.go b/vendor/github.com/go-ldap/ldap/control.go
index 4d8298093..5c62118d4 100644
--- a/vendor/github.com/go-ldap/ldap/control.go
+++ b/vendor/github.com/go-ldap/ldap/control.go
@@ -12,35 +12,48 @@ import (
)
const (
- ControlTypePaging = "1.2.840.113556.1.4.319"
- ControlTypeBeheraPasswordPolicy = "1.3.6.1.4.1.42.2.27.8.5.1"
+ // ControlTypePaging - https://www.ietf.org/rfc/rfc2696.txt
+ ControlTypePaging = "1.2.840.113556.1.4.319"
+ // ControlTypeBeheraPasswordPolicy - https://tools.ietf.org/html/draft-behera-ldap-password-policy-10
+ ControlTypeBeheraPasswordPolicy = "1.3.6.1.4.1.42.2.27.8.5.1"
+ // ControlTypeVChuPasswordMustChange - https://tools.ietf.org/html/draft-vchu-ldap-pwd-policy-00
ControlTypeVChuPasswordMustChange = "2.16.840.1.113730.3.4.4"
- ControlTypeVChuPasswordWarning = "2.16.840.1.113730.3.4.5"
- ControlTypeManageDsaIT = "2.16.840.1.113730.3.4.2"
+ // ControlTypeVChuPasswordWarning - https://tools.ietf.org/html/draft-vchu-ldap-pwd-policy-00
+ ControlTypeVChuPasswordWarning = "2.16.840.1.113730.3.4.5"
+ // ControlTypeManageDsaIT - https://tools.ietf.org/html/rfc3296
+ ControlTypeManageDsaIT = "2.16.840.1.113730.3.4.2"
)
+// ControlTypeMap maps controls to text descriptions
var ControlTypeMap = map[string]string{
ControlTypePaging: "Paging",
ControlTypeBeheraPasswordPolicy: "Password Policy - Behera Draft",
ControlTypeManageDsaIT: "Manage DSA IT",
}
+// Control defines an interface controls provide to encode and describe themselves
type Control interface {
+ // GetControlType returns the OID
GetControlType() string
+ // Encode returns the ber packet representation
Encode() *ber.Packet
+ // String returns a human-readable description
String() string
}
+// ControlString implements the Control interface for simple controls
type ControlString struct {
ControlType string
Criticality bool
ControlValue string
}
+// GetControlType returns the OID
func (c *ControlString) GetControlType() string {
return c.ControlType
}
+// Encode returns the ber packet representation
func (c *ControlString) Encode() *ber.Packet {
packet := ber.Encode(ber.ClassUniversal, ber.TypeConstructed, ber.TagSequence, nil, "Control")
packet.AppendChild(ber.NewString(ber.ClassUniversal, ber.TypePrimitive, ber.TagOctetString, c.ControlType, "Control Type ("+ControlTypeMap[c.ControlType]+")"))
@@ -51,26 +64,32 @@ func (c *ControlString) Encode() *ber.Packet {
return packet
}
+// String returns a human-readable description
func (c *ControlString) String() string {
return fmt.Sprintf("Control Type: %s (%q) Criticality: %t Control Value: %s", ControlTypeMap[c.ControlType], c.ControlType, c.Criticality, c.ControlValue)
}
+// ControlPaging implements the paging control described in https://www.ietf.org/rfc/rfc2696.txt
type ControlPaging struct {
+ // PagingSize indicates the page size
PagingSize uint32
- Cookie []byte
+ // Cookie is an opaque value returned by the server to track a paging cursor
+ Cookie []byte
}
+// GetControlType returns the OID
func (c *ControlPaging) GetControlType() string {
return ControlTypePaging
}
+// Encode returns the ber packet representation
func (c *ControlPaging) Encode() *ber.Packet {
packet := ber.Encode(ber.ClassUniversal, ber.TypeConstructed, ber.TagSequence, nil, "Control")
packet.AppendChild(ber.NewString(ber.ClassUniversal, ber.TypePrimitive, ber.TagOctetString, ControlTypePaging, "Control Type ("+ControlTypeMap[ControlTypePaging]+")"))
p2 := ber.Encode(ber.ClassUniversal, ber.TypePrimitive, ber.TagOctetString, nil, "Control Value (Paging)")
seq := ber.Encode(ber.ClassUniversal, ber.TypeConstructed, ber.TagSequence, nil, "Search Control Value")
- seq.AppendChild(ber.NewInteger(ber.ClassUniversal, ber.TypePrimitive, ber.TagInteger, uint64(c.PagingSize), "Paging Size"))
+ seq.AppendChild(ber.NewInteger(ber.ClassUniversal, ber.TypePrimitive, ber.TagInteger, int64(c.PagingSize), "Paging Size"))
cookie := ber.Encode(ber.ClassUniversal, ber.TypePrimitive, ber.TagOctetString, nil, "Cookie")
cookie.Value = c.Cookie
cookie.Data.Write(c.Cookie)
@@ -81,6 +100,7 @@ func (c *ControlPaging) Encode() *ber.Packet {
return packet
}
+// String returns a human-readable description
func (c *ControlPaging) String() string {
return fmt.Sprintf(
"Control Type: %s (%q) Criticality: %t PagingSize: %d Cookie: %q",
@@ -91,21 +111,29 @@ func (c *ControlPaging) String() string {
c.Cookie)
}
+// SetCookie stores the given cookie in the paging control
func (c *ControlPaging) SetCookie(cookie []byte) {
c.Cookie = cookie
}
+// ControlBeheraPasswordPolicy implements the control described in https://tools.ietf.org/html/draft-behera-ldap-password-policy-10
type ControlBeheraPasswordPolicy struct {
- Expire int64
- Grace int64
- Error int8
+ // Expire contains the number of seconds before a password will expire
+ Expire int64
+ // Grace indicates the remaining number of times a user will be allowed to authenticate with an expired password
+ Grace int64
+ // Error indicates the error code
+ Error int8
+ // ErrorString is a human readable error
ErrorString string
}
+// GetControlType returns the OID
func (c *ControlBeheraPasswordPolicy) GetControlType() string {
return ControlTypeBeheraPasswordPolicy
}
+// Encode returns the ber packet representation
func (c *ControlBeheraPasswordPolicy) Encode() *ber.Packet {
packet := ber.Encode(ber.ClassUniversal, ber.TypeConstructed, ber.TagSequence, nil, "Control")
packet.AppendChild(ber.NewString(ber.ClassUniversal, ber.TypePrimitive, ber.TagOctetString, ControlTypeBeheraPasswordPolicy, "Control Type ("+ControlTypeMap[ControlTypeBeheraPasswordPolicy]+")"))
@@ -113,6 +141,7 @@ func (c *ControlBeheraPasswordPolicy) Encode() *ber.Packet {
return packet
}
+// String returns a human-readable description
func (c *ControlBeheraPasswordPolicy) String() string {
return fmt.Sprintf(
"Control Type: %s (%q) Criticality: %t Expire: %d Grace: %d Error: %d, ErrorString: %s",
@@ -125,39 +154,49 @@ func (c *ControlBeheraPasswordPolicy) String() string {
c.ErrorString)
}
+// ControlVChuPasswordMustChange implements the control described in https://tools.ietf.org/html/draft-vchu-ldap-pwd-policy-00
type ControlVChuPasswordMustChange struct {
+ // MustChange indicates if the password is required to be changed
MustChange bool
}
+// GetControlType returns the OID
func (c *ControlVChuPasswordMustChange) GetControlType() string {
return ControlTypeVChuPasswordMustChange
}
+// Encode returns the ber packet representation
func (c *ControlVChuPasswordMustChange) Encode() *ber.Packet {
return nil
}
+// String returns a human-readable description
func (c *ControlVChuPasswordMustChange) String() string {
return fmt.Sprintf(
- "Control Type: %s (%q) Criticality: %t MustChange: %b",
+ "Control Type: %s (%q) Criticality: %t MustChange: %v",
ControlTypeMap[ControlTypeVChuPasswordMustChange],
ControlTypeVChuPasswordMustChange,
false,
c.MustChange)
}
+// ControlVChuPasswordWarning implements the control described in https://tools.ietf.org/html/draft-vchu-ldap-pwd-policy-00
type ControlVChuPasswordWarning struct {
+ // Expire indicates the time in seconds until the password expires
Expire int64
}
+// GetControlType returns the OID
func (c *ControlVChuPasswordWarning) GetControlType() string {
return ControlTypeVChuPasswordWarning
}
+// Encode returns the ber packet representation
func (c *ControlVChuPasswordWarning) Encode() *ber.Packet {
return nil
}
+// String returns a human-readable description
func (c *ControlVChuPasswordWarning) String() string {
return fmt.Sprintf(
"Control Type: %s (%q) Criticality: %t Expire: %b",
@@ -167,14 +206,18 @@ func (c *ControlVChuPasswordWarning) String() string {
c.Expire)
}
+// ControlManageDsaIT implements the control described in https://tools.ietf.org/html/rfc3296
type ControlManageDsaIT struct {
+ // Criticality indicates if this control is required
Criticality bool
}
+// GetControlType returns the OID
func (c *ControlManageDsaIT) GetControlType() string {
return ControlTypeManageDsaIT
}
+// Encode returns the ber packet representation
func (c *ControlManageDsaIT) Encode() *ber.Packet {
//FIXME
packet := ber.Encode(ber.ClassUniversal, ber.TypeConstructed, ber.TagSequence, nil, "Control")
@@ -185,6 +228,7 @@ func (c *ControlManageDsaIT) Encode() *ber.Packet {
return packet
}
+// String returns a human-readable description
func (c *ControlManageDsaIT) String() string {
return fmt.Sprintf(
"Control Type: %s (%q) Criticality: %t",
@@ -193,10 +237,12 @@ func (c *ControlManageDsaIT) String() string {
c.Criticality)
}
+// NewControlManageDsaIT returns a ControlManageDsaIT control
func NewControlManageDsaIT(Criticality bool) *ControlManageDsaIT {
return &ControlManageDsaIT{Criticality: Criticality}
}
+// FindControl returns the first control of the given type in the list, or nil
func FindControl(controls []Control, controlType string) Control {
for _, c := range controls {
if c.GetControlType() == controlType {
@@ -206,20 +252,56 @@ func FindControl(controls []Control, controlType string) Control {
return nil
}
+// DecodeControl returns a control read from the given packet, or nil if no recognized control can be made
func DecodeControl(packet *ber.Packet) Control {
- ControlType := packet.Children[0].Value.(string)
- Criticality := false
+ var (
+ ControlType = ""
+ Criticality = false
+ value *ber.Packet
+ )
+
+ switch len(packet.Children) {
+ case 0:
+ // at least one child is required for control type
+ return nil
+
+ case 1:
+ // just type, no criticality or value
+ packet.Children[0].Description = "Control Type (" + ControlTypeMap[ControlType] + ")"
+ ControlType = packet.Children[0].Value.(string)
+
+ case 2:
+ packet.Children[0].Description = "Control Type (" + ControlTypeMap[ControlType] + ")"
+ ControlType = packet.Children[0].Value.(string)
+
+ // Children[1] could be criticality or value (both are optional)
+ // duck-type on whether this is a boolean
+ if _, ok := packet.Children[1].Value.(bool); ok {
+ packet.Children[1].Description = "Criticality"
+ Criticality = packet.Children[1].Value.(bool)
+ } else {
+ packet.Children[1].Description = "Control Value"
+ value = packet.Children[1]
+ }
+
+ case 3:
+ packet.Children[0].Description = "Control Type (" + ControlTypeMap[ControlType] + ")"
+ ControlType = packet.Children[0].Value.(string)
- packet.Children[0].Description = "Control Type (" + ControlTypeMap[ControlType] + ")"
- value := packet.Children[1]
- if len(packet.Children) == 3 {
- value = packet.Children[2]
packet.Children[1].Description = "Criticality"
Criticality = packet.Children[1].Value.(bool)
+
+ packet.Children[2].Description = "Control Value"
+ value = packet.Children[2]
+
+ default:
+ // more than 3 children is invalid
+ return nil
}
- value.Description = "Control Value"
switch ControlType {
+ case ControlTypeManageDsaIT:
+ return NewControlManageDsaIT(Criticality)
case ControlTypePaging:
value.Description += " (Paging)"
c := new(ControlPaging)
@@ -295,14 +377,18 @@ func DecodeControl(packet *ber.Packet) Control {
value.Value = c.Expire
return c
+ default:
+ c := new(ControlString)
+ c.ControlType = ControlType
+ c.Criticality = Criticality
+ if value != nil {
+ c.ControlValue = value.Value.(string)
+ }
+ return c
}
- c := new(ControlString)
- c.ControlType = ControlType
- c.Criticality = Criticality
- c.ControlValue = value.Value.(string)
- return c
}
+// NewControlString returns a generic control
func NewControlString(controlType string, criticality bool, controlValue string) *ControlString {
return &ControlString{
ControlType: controlType,
@@ -311,10 +397,12 @@ func NewControlString(controlType string, criticality bool, controlValue string)
}
}
+// NewControlPaging returns a paging control
func NewControlPaging(pagingSize uint32) *ControlPaging {
return &ControlPaging{PagingSize: pagingSize}
}
+// NewControlBeheraPasswordPolicy returns a ControlBeheraPasswordPolicy
func NewControlBeheraPasswordPolicy() *ControlBeheraPasswordPolicy {
return &ControlBeheraPasswordPolicy{
Expire: -1,
diff --git a/vendor/github.com/go-ldap/ldap/control_test.go b/vendor/github.com/go-ldap/ldap/control_test.go
new file mode 100644
index 000000000..3fcdab0d7
--- /dev/null
+++ b/vendor/github.com/go-ldap/ldap/control_test.go
@@ -0,0 +1,58 @@
+package ldap
+
+import (
+ "bytes"
+ "fmt"
+ "reflect"
+ "runtime"
+ "testing"
+
+ "gopkg.in/asn1-ber.v1"
+)
+
+func TestControlPaging(t *testing.T) {
+ runControlTest(t, NewControlPaging(0))
+ runControlTest(t, NewControlPaging(100))
+}
+
+func TestControlManageDsaIT(t *testing.T) {
+ runControlTest(t, NewControlManageDsaIT(true))
+ runControlTest(t, NewControlManageDsaIT(false))
+}
+
+func TestControlString(t *testing.T) {
+ runControlTest(t, NewControlString("x", true, "y"))
+ runControlTest(t, NewControlString("x", true, ""))
+ runControlTest(t, NewControlString("x", false, "y"))
+ runControlTest(t, NewControlString("x", false, ""))
+}
+
+func runControlTest(t *testing.T, originalControl Control) {
+ header := ""
+ if callerpc, _, line, ok := runtime.Caller(1); ok {
+ if caller := runtime.FuncForPC(callerpc); caller != nil {
+ header = fmt.Sprintf("%s:%d: ", caller.Name(), line)
+ }
+ }
+
+ encodedPacket := originalControl.Encode()
+ encodedBytes := encodedPacket.Bytes()
+
+ // Decode directly from the encoded packet (ensures Value is correct)
+ fromPacket := DecodeControl(encodedPacket)
+ if !bytes.Equal(encodedBytes, fromPacket.Encode().Bytes()) {
+ t.Errorf("%sround-trip from encoded packet failed", header)
+ }
+ if reflect.TypeOf(originalControl) != reflect.TypeOf(fromPacket) {
+ t.Errorf("%sgot different type decoding from encoded packet: %T vs %T", header, fromPacket, originalControl)
+ }
+
+ // Decode from the wire bytes (ensures ber-encoding is correct)
+ fromBytes := DecodeControl(ber.DecodePacket(encodedBytes))
+ if !bytes.Equal(encodedBytes, fromBytes.Encode().Bytes()) {
+ t.Errorf("%sround-trip from encoded bytes failed", header)
+ }
+ if reflect.TypeOf(originalControl) != reflect.TypeOf(fromPacket) {
+ t.Errorf("%sgot different type decoding from encoded bytes: %T vs %T", header, fromBytes, originalControl)
+ }
+}
diff --git a/vendor/github.com/go-ldap/ldap/del.go b/vendor/github.com/go-ldap/ldap/del.go
index 5bb5a25d7..4fd63dc3f 100644
--- a/vendor/github.com/go-ldap/ldap/del.go
+++ b/vendor/github.com/go-ldap/ldap/del.go
@@ -12,8 +12,11 @@ import (
"gopkg.in/asn1-ber.v1"
)
+// DelRequest implements an LDAP deletion request
type DelRequest struct {
- DN string
+ // DN is the name of the directory entry to delete
+ DN string
+ // Controls hold optional controls to send with the request
Controls []Control
}
@@ -23,6 +26,7 @@ func (d DelRequest) encode() *ber.Packet {
return request
}
+// NewDelRequest creates a delete request for the given DN and controls
func NewDelRequest(DN string,
Controls []Control) *DelRequest {
return &DelRequest{
@@ -31,10 +35,10 @@ func NewDelRequest(DN string,
}
}
+// Del executes the given delete request
func (l *Conn) Del(delRequest *DelRequest) error {
- messageID := l.nextMessageID()
packet := ber.Encode(ber.ClassUniversal, ber.TypeConstructed, ber.TagSequence, nil, "LDAP Request")
- packet.AppendChild(ber.NewInteger(ber.ClassUniversal, ber.TypePrimitive, ber.TagInteger, messageID, "MessageID"))
+ packet.AppendChild(ber.NewInteger(ber.ClassUniversal, ber.TypePrimitive, ber.TagInteger, l.nextMessageID(), "MessageID"))
packet.AppendChild(delRequest.encode())
if delRequest.Controls != nil {
packet.AppendChild(encodeControls(delRequest.Controls))
@@ -42,22 +46,19 @@ func (l *Conn) Del(delRequest *DelRequest) error {
l.Debug.PrintPacket(packet)
- channel, err := l.sendMessage(packet)
+ msgCtx, err := l.sendMessage(packet)
if err != nil {
return err
}
- if channel == nil {
- return NewError(ErrorNetwork, errors.New("ldap: could not send message"))
- }
- defer l.finishMessage(messageID)
+ defer l.finishMessage(msgCtx)
- l.Debug.Printf("%d: waiting for response", messageID)
- packetResponse, ok := <-channel
+ l.Debug.Printf("%d: waiting for response", msgCtx.id)
+ packetResponse, ok := <-msgCtx.responses
if !ok {
- return NewError(ErrorNetwork, errors.New("ldap: channel closed"))
+ return NewError(ErrorNetwork, errors.New("ldap: response channel closed"))
}
packet, err = packetResponse.ReadPacket()
- l.Debug.Printf("%d: got response %p", messageID, packet)
+ l.Debug.Printf("%d: got response %p", msgCtx.id, packet)
if err != nil {
return err
}
@@ -78,6 +79,6 @@ func (l *Conn) Del(delRequest *DelRequest) error {
log.Printf("Unexpected Response: %d", packet.Children[1].Tag)
}
- l.Debug.Printf("%d: returning", messageID)
+ l.Debug.Printf("%d: returning", msgCtx.id)
return nil
}
diff --git a/vendor/github.com/go-ldap/ldap/dn.go b/vendor/github.com/go-ldap/ldap/dn.go
index 5d83c5e9a..cc70c894c 100644
--- a/vendor/github.com/go-ldap/ldap/dn.go
+++ b/vendor/github.com/go-ldap/ldap/dn.go
@@ -55,19 +55,25 @@ import (
ber "gopkg.in/asn1-ber.v1"
)
+// AttributeTypeAndValue represents an attributeTypeAndValue from https://tools.ietf.org/html/rfc4514
type AttributeTypeAndValue struct {
- Type string
+ // Type is the attribute type
+ Type string
+ // Value is the attribute value
Value string
}
+// RelativeDN represents a relativeDistinguishedName from https://tools.ietf.org/html/rfc4514
type RelativeDN struct {
Attributes []*AttributeTypeAndValue
}
+// DN represents a distinguishedName from https://tools.ietf.org/html/rfc4514
type DN struct {
RDNs []*RelativeDN
}
+// ParseDN returns a distinguishedName or an error
func ParseDN(str string) (*DN, error) {
dn := new(DN)
dn.RDNs = make([]*RelativeDN, 0)
@@ -94,11 +100,9 @@ func ParseDN(str string) (*DN, error) {
dst := []byte{0}
n, err := enchex.Decode([]byte(dst), []byte(str[i:i+2]))
if err != nil {
- return nil, errors.New(
- fmt.Sprintf("Failed to decode escaped character: %s", err))
+ return nil, fmt.Errorf("Failed to decode escaped character: %s", err)
} else if n != 1 {
- return nil, errors.New(
- fmt.Sprintf("Expected 1 byte when un-escaping, got %d", n))
+ return nil, fmt.Errorf("Expected 1 byte when un-escaping, got %d", n)
}
buffer.WriteByte(dst[0])
i++
@@ -119,12 +123,11 @@ func ParseDN(str string) (*DN, error) {
} else {
data = str[i:]
}
- raw_ber, err := enchex.DecodeString(data)
+ rawBER, err := enchex.DecodeString(data)
if err != nil {
- return nil, errors.New(
- fmt.Sprintf("Failed to decode BER encoding: %s", err))
+ return nil, fmt.Errorf("Failed to decode BER encoding: %s", err)
}
- packet := ber.DecodePacket(raw_ber)
+ packet := ber.DecodePacket(rawBER)
buffer.WriteString(packet.Data.String())
i += len(data) - 1
}
diff --git a/vendor/github.com/go-ldap/ldap/error.go b/vendor/github.com/go-ldap/ldap/error.go
index 97404eb65..ff697873d 100644
--- a/vendor/github.com/go-ldap/ldap/error.go
+++ b/vendor/github.com/go-ldap/ldap/error.go
@@ -56,6 +56,7 @@ const (
ErrorUnexpectedResponse = 205
)
+// LDAPResultCodeMap contains string descriptions for LDAP error codes
var LDAPResultCodeMap = map[uint8]string{
LDAPResultSuccess: "Success",
LDAPResultOperationsError: "Operations Error",
@@ -115,8 +116,11 @@ func getLDAPResultCode(packet *ber.Packet) (code uint8, description string) {
return ErrorNetwork, "Invalid packet format"
}
+// Error holds LDAP error information
type Error struct {
- Err error
+ // Err is the underlying error
+ Err error
+ // ResultCode is the LDAP error code
ResultCode uint8
}
@@ -124,10 +128,12 @@ func (e *Error) Error() string {
return fmt.Sprintf("LDAP Result Code %d %q: %s", e.ResultCode, LDAPResultCodeMap[e.ResultCode], e.Err.Error())
}
+// NewError creates an LDAP error with the given code and underlying error
func NewError(resultCode uint8, err error) error {
return &Error{ResultCode: resultCode, Err: err}
}
+// IsErrorWithCode returns true if the given error is an LDAP error with the given result code
func IsErrorWithCode(err error, desiredResultCode uint8) bool {
if err == nil {
return false
diff --git a/vendor/github.com/go-ldap/ldap/error_test.go b/vendor/github.com/go-ldap/ldap/error_test.go
index 4ec720d9f..c010ebe3e 100644
--- a/vendor/github.com/go-ldap/ldap/error_test.go
+++ b/vendor/github.com/go-ldap/ldap/error_test.go
@@ -1,7 +1,11 @@
package ldap
import (
+ "errors"
+ "net"
+ "strings"
"testing"
+ "time"
"gopkg.in/asn1-ber.v1"
)
@@ -16,8 +20,8 @@ func TestNilPacket(t *testing.T) {
// Test for nil result
kids := []*ber.Packet{
- &ber.Packet{}, // Unused
- nil, // Can't be nil
+ {}, // Unused
+ nil, // Can't be nil
}
pack := &ber.Packet{Children: kids}
code, _ = getLDAPResultCode(pack)
@@ -25,5 +29,74 @@ func TestNilPacket(t *testing.T) {
if code != ErrorUnexpectedResponse {
t.Errorf("Should have an 'ErrorUnexpectedResponse' error in nil packets, got: %v", code)
}
+}
+
+// TestConnReadErr tests that an unexpected error reading from underlying
+// connection bubbles up to the goroutine which makes a request.
+func TestConnReadErr(t *testing.T) {
+ conn := &signalErrConn{
+ signals: make(chan error),
+ }
+
+ ldapConn := NewConn(conn, false)
+ ldapConn.Start()
+
+ // Make a dummy search request.
+ searchReq := NewSearchRequest("dc=example,dc=com", ScopeWholeSubtree, DerefAlways, 0, 0, false, "(objectClass=*)", nil, nil)
+
+ expectedError := errors.New("this is the error you are looking for")
+
+ // Send the signal after a short amount of time.
+ time.AfterFunc(10*time.Millisecond, func() { conn.signals <- expectedError })
+
+ // This should block until the underlyiny conn gets the error signal
+ // which should bubble up through the reader() goroutine, close the
+ // connection, and
+ _, err := ldapConn.Search(searchReq)
+ if err == nil || !strings.Contains(err.Error(), expectedError.Error()) {
+ t.Errorf("not the expected error: %s", err)
+ }
+}
+
+// signalErrConn is a helful type used with TestConnReadErr. It implements the
+// net.Conn interface to be used as a connection for the test. Most methods are
+// no-ops but the Read() method blocks until it receives a signal which it
+// returns as an error.
+type signalErrConn struct {
+ signals chan error
+}
+
+// Read blocks until an error is sent on the internal signals channel. That
+// error is returned.
+func (c *signalErrConn) Read(b []byte) (n int, err error) {
+ return 0, <-c.signals
+}
+
+func (c *signalErrConn) Write(b []byte) (n int, err error) {
+ return len(b), nil
+}
+
+func (c *signalErrConn) Close() error {
+ close(c.signals)
+ return nil
+}
+
+func (c *signalErrConn) LocalAddr() net.Addr {
+ return (*net.TCPAddr)(nil)
+}
+
+func (c *signalErrConn) RemoteAddr() net.Addr {
+ return (*net.TCPAddr)(nil)
+}
+
+func (c *signalErrConn) SetDeadline(t time.Time) error {
+ return nil
+}
+
+func (c *signalErrConn) SetReadDeadline(t time.Time) error {
+ return nil
+}
+func (c *signalErrConn) SetWriteDeadline(t time.Time) error {
+ return nil
}
diff --git a/vendor/github.com/go-ldap/ldap/filter.go b/vendor/github.com/go-ldap/ldap/filter.go
index 63bcec1e3..7eae310f1 100644
--- a/vendor/github.com/go-ldap/ldap/filter.go
+++ b/vendor/github.com/go-ldap/ldap/filter.go
@@ -15,6 +15,7 @@ import (
"gopkg.in/asn1-ber.v1"
)
+// Filter choices
const (
FilterAnd = 0
FilterOr = 1
@@ -28,6 +29,7 @@ const (
FilterExtensibleMatch = 9
)
+// FilterMap contains human readable descriptions of Filter choices
var FilterMap = map[uint64]string{
FilterAnd: "And",
FilterOr: "Or",
@@ -41,18 +43,21 @@ var FilterMap = map[uint64]string{
FilterExtensibleMatch: "Extensible Match",
}
+// SubstringFilter options
const (
FilterSubstringsInitial = 0
FilterSubstringsAny = 1
FilterSubstringsFinal = 2
)
+// FilterSubstringsMap contains human readable descriptions of SubstringFilter choices
var FilterSubstringsMap = map[uint64]string{
FilterSubstringsInitial: "Substrings Initial",
FilterSubstringsAny: "Substrings Any",
FilterSubstringsFinal: "Substrings Final",
}
+// MatchingRuleAssertion choices
const (
MatchingRuleAssertionMatchingRule = 1
MatchingRuleAssertionType = 2
@@ -60,6 +65,7 @@ const (
MatchingRuleAssertionDNAttributes = 4
)
+// MatchingRuleAssertionMap contains human readable descriptions of MatchingRuleAssertion choices
var MatchingRuleAssertionMap = map[uint64]string{
MatchingRuleAssertionMatchingRule: "Matching Rule Assertion Matching Rule",
MatchingRuleAssertionType: "Matching Rule Assertion Type",
@@ -67,6 +73,7 @@ var MatchingRuleAssertionMap = map[uint64]string{
MatchingRuleAssertionDNAttributes: "Matching Rule Assertion DN Attributes",
}
+// CompileFilter converts a string representation of a filter into a BER-encoded packet
func CompileFilter(filter string) (*ber.Packet, error) {
if len(filter) == 0 || filter[0] != '(' {
return nil, NewError(ErrorFilterCompile, errors.New("ldap: filter does not start with an '('"))
@@ -81,6 +88,7 @@ func CompileFilter(filter string) (*ber.Packet, error) {
return packet, nil
}
+// DecompileFilter converts a packet representation of a filter into a string representation
func DecompileFilter(packet *ber.Packet) (ret string, err error) {
defer func() {
if r := recover(); r != nil {
@@ -239,11 +247,13 @@ func compileFilter(filter string, pos int) (*ber.Packet, int, error) {
packet.AppendChild(child)
return packet, newPos, err
default:
- READING_ATTR := 0
- READING_EXTENSIBLE_MATCHING_RULE := 1
- READING_CONDITION := 2
+ const (
+ stateReadingAttr = 0
+ stateReadingExtensibleMatchingRule = 1
+ stateReadingCondition = 2
+ )
- state := READING_ATTR
+ state := stateReadingAttr
attribute := ""
extensibleDNAttributes := false
@@ -261,56 +271,56 @@ func compileFilter(filter string, pos int) (*ber.Packet, int, error) {
}
switch state {
- case READING_ATTR:
+ case stateReadingAttr:
switch {
// Extensible rule, with only DN-matching
case currentRune == ':' && strings.HasPrefix(remainingFilter, ":dn:="):
packet = ber.Encode(ber.ClassContext, ber.TypeConstructed, FilterExtensibleMatch, nil, FilterMap[FilterExtensibleMatch])
extensibleDNAttributes = true
- state = READING_CONDITION
+ state = stateReadingCondition
newPos += 5
// Extensible rule, with DN-matching and a matching OID
case currentRune == ':' && strings.HasPrefix(remainingFilter, ":dn:"):
packet = ber.Encode(ber.ClassContext, ber.TypeConstructed, FilterExtensibleMatch, nil, FilterMap[FilterExtensibleMatch])
extensibleDNAttributes = true
- state = READING_EXTENSIBLE_MATCHING_RULE
+ state = stateReadingExtensibleMatchingRule
newPos += 4
// Extensible rule, with attr only
case currentRune == ':' && strings.HasPrefix(remainingFilter, ":="):
packet = ber.Encode(ber.ClassContext, ber.TypeConstructed, FilterExtensibleMatch, nil, FilterMap[FilterExtensibleMatch])
- state = READING_CONDITION
+ state = stateReadingCondition
newPos += 2
// Extensible rule, with no DN attribute matching
case currentRune == ':':
packet = ber.Encode(ber.ClassContext, ber.TypeConstructed, FilterExtensibleMatch, nil, FilterMap[FilterExtensibleMatch])
- state = READING_EXTENSIBLE_MATCHING_RULE
- newPos += 1
+ state = stateReadingExtensibleMatchingRule
+ newPos++
// Equality condition
case currentRune == '=':
packet = ber.Encode(ber.ClassContext, ber.TypeConstructed, FilterEqualityMatch, nil, FilterMap[FilterEqualityMatch])
- state = READING_CONDITION
- newPos += 1
+ state = stateReadingCondition
+ newPos++
// Greater-than or equal
case currentRune == '>' && strings.HasPrefix(remainingFilter, ">="):
packet = ber.Encode(ber.ClassContext, ber.TypeConstructed, FilterGreaterOrEqual, nil, FilterMap[FilterGreaterOrEqual])
- state = READING_CONDITION
+ state = stateReadingCondition
newPos += 2
// Less-than or equal
case currentRune == '<' && strings.HasPrefix(remainingFilter, "<="):
packet = ber.Encode(ber.ClassContext, ber.TypeConstructed, FilterLessOrEqual, nil, FilterMap[FilterLessOrEqual])
- state = READING_CONDITION
+ state = stateReadingCondition
newPos += 2
// Approx
case currentRune == '~' && strings.HasPrefix(remainingFilter, "~="):
packet = ber.Encode(ber.ClassContext, ber.TypeConstructed, FilterApproxMatch, nil, FilterMap[FilterApproxMatch])
- state = READING_CONDITION
+ state = stateReadingCondition
newPos += 2
// Still reading the attribute name
@@ -319,12 +329,12 @@ func compileFilter(filter string, pos int) (*ber.Packet, int, error) {
newPos += currentWidth
}
- case READING_EXTENSIBLE_MATCHING_RULE:
+ case stateReadingExtensibleMatchingRule:
switch {
// Matching rule OID is done
case currentRune == ':' && strings.HasPrefix(remainingFilter, ":="):
- state = READING_CONDITION
+ state = stateReadingCondition
newPos += 2
// Still reading the matching rule oid
@@ -333,7 +343,7 @@ func compileFilter(filter string, pos int) (*ber.Packet, int, error) {
newPos += currentWidth
}
- case READING_CONDITION:
+ case stateReadingCondition:
// append to the condition
condition += fmt.Sprintf("%c", currentRune)
newPos += currentWidth
@@ -369,9 +379,9 @@ func compileFilter(filter string, pos int) (*ber.Packet, int, error) {
}
// Add the value (only required child)
- encodedString, err := escapedStringToEncodedBytes(condition)
- if err != nil {
- return packet, newPos, err
+ encodedString, encodeErr := escapedStringToEncodedBytes(condition)
+ if encodeErr != nil {
+ return packet, newPos, encodeErr
}
packet.AppendChild(ber.NewString(ber.ClassContext, ber.TypePrimitive, MatchingRuleAssertionMatchValue, encodedString, MatchingRuleAssertionMap[MatchingRuleAssertionMatchValue]))
@@ -401,17 +411,17 @@ func compileFilter(filter string, pos int) (*ber.Packet, int, error) {
default:
tag = FilterSubstringsAny
}
- encodedString, err := escapedStringToEncodedBytes(part)
- if err != nil {
- return packet, newPos, err
+ encodedString, encodeErr := escapedStringToEncodedBytes(part)
+ if encodeErr != nil {
+ return packet, newPos, encodeErr
}
seq.AppendChild(ber.NewString(ber.ClassContext, ber.TypePrimitive, tag, encodedString, FilterSubstringsMap[uint64(tag)]))
}
packet.AppendChild(seq)
default:
- encodedString, err := escapedStringToEncodedBytes(condition)
- if err != nil {
- return packet, newPos, err
+ encodedString, encodeErr := escapedStringToEncodedBytes(condition)
+ if encodeErr != nil {
+ return packet, newPos, encodeErr
}
packet.AppendChild(ber.NewString(ber.ClassUniversal, ber.TypePrimitive, ber.TagOctetString, attribute, "Attribute"))
packet.AppendChild(ber.NewString(ber.ClassUniversal, ber.TypePrimitive, ber.TagOctetString, encodedString, "Condition"))
@@ -440,12 +450,12 @@ func escapedStringToEncodedBytes(escapedString string) (string, error) {
if i+2 > len(escapedString) {
return "", NewError(ErrorFilterCompile, errors.New("ldap: missing characters for escape in filter"))
}
- if escByte, decodeErr := hexpac.DecodeString(escapedString[i+1 : i+3]); decodeErr != nil {
+ escByte, decodeErr := hexpac.DecodeString(escapedString[i+1 : i+3])
+ if decodeErr != nil {
return "", NewError(ErrorFilterCompile, errors.New("ldap: invalid characters for escape in filter"))
- } else {
- buffer.WriteByte(escByte[0])
- i += 2 // +1 from end of loop, so 3 total for \xx.
}
+ buffer.WriteByte(escByte[0])
+ i += 2 // +1 from end of loop, so 3 total for \xx.
} else {
buffer.WriteRune(currentRune)
}
diff --git a/vendor/github.com/go-ldap/ldap/ldap.go b/vendor/github.com/go-ldap/ldap/ldap.go
index 1620aaea6..90018be83 100644
--- a/vendor/github.com/go-ldap/ldap/ldap.go
+++ b/vendor/github.com/go-ldap/ldap/ldap.go
@@ -36,6 +36,7 @@ const (
ApplicationExtendedResponse = 24
)
+// ApplicationMap contains human readable descriptions of LDAP Application Codes
var ApplicationMap = map[uint8]string{
ApplicationBindRequest: "Bind Request",
ApplicationBindResponse: "Bind Response",
@@ -72,6 +73,7 @@ const (
BeheraPasswordInHistory = 8
)
+// BeheraPasswordPolicyErrorMap contains human readable descriptions of Behera Password Policy error codes
var BeheraPasswordPolicyErrorMap = map[int8]string{
BeheraPasswordExpired: "Password expired",
BeheraAccountLocked: "Account locked",
@@ -237,6 +239,7 @@ func addDefaultLDAPResponseDescriptions(packet *ber.Packet) {
}
}
+// DebugBinaryFile reads and prints packets from the given filename
func DebugBinaryFile(fileName string) error {
file, err := ioutil.ReadFile(fileName)
if err != nil {
diff --git a/vendor/github.com/go-ldap/ldap/modify.go b/vendor/github.com/go-ldap/ldap/modify.go
index 5c042af79..e4ab6cefc 100644
--- a/vendor/github.com/go-ldap/ldap/modify.go
+++ b/vendor/github.com/go-ldap/ldap/modify.go
@@ -36,64 +36,76 @@ import (
"gopkg.in/asn1-ber.v1"
)
+// Change operation choices
const (
AddAttribute = 0
DeleteAttribute = 1
ReplaceAttribute = 2
)
+// PartialAttribute for a ModifyRequest as defined in https://tools.ietf.org/html/rfc4511
type PartialAttribute struct {
- attrType string
- attrVals []string
+ // Type is the type of the partial attribute
+ Type string
+ // Vals are the values of the partial attribute
+ Vals []string
}
func (p *PartialAttribute) encode() *ber.Packet {
seq := ber.Encode(ber.ClassUniversal, ber.TypeConstructed, ber.TagSequence, nil, "PartialAttribute")
- seq.AppendChild(ber.NewString(ber.ClassUniversal, ber.TypePrimitive, ber.TagOctetString, p.attrType, "Type"))
+ seq.AppendChild(ber.NewString(ber.ClassUniversal, ber.TypePrimitive, ber.TagOctetString, p.Type, "Type"))
set := ber.Encode(ber.ClassUniversal, ber.TypeConstructed, ber.TagSet, nil, "AttributeValue")
- for _, value := range p.attrVals {
+ for _, value := range p.Vals {
set.AppendChild(ber.NewString(ber.ClassUniversal, ber.TypePrimitive, ber.TagOctetString, value, "Vals"))
}
seq.AppendChild(set)
return seq
}
+// ModifyRequest as defined in https://tools.ietf.org/html/rfc4511
type ModifyRequest struct {
- dn string
- addAttributes []PartialAttribute
- deleteAttributes []PartialAttribute
- replaceAttributes []PartialAttribute
+ // DN is the distinguishedName of the directory entry to modify
+ DN string
+ // AddAttributes contain the attributes to add
+ AddAttributes []PartialAttribute
+ // DeleteAttributes contain the attributes to delete
+ DeleteAttributes []PartialAttribute
+ // ReplaceAttributes contain the attributes to replace
+ ReplaceAttributes []PartialAttribute
}
+// Add inserts the given attribute to the list of attributes to add
func (m *ModifyRequest) Add(attrType string, attrVals []string) {
- m.addAttributes = append(m.addAttributes, PartialAttribute{attrType: attrType, attrVals: attrVals})
+ m.AddAttributes = append(m.AddAttributes, PartialAttribute{Type: attrType, Vals: attrVals})
}
+// Delete inserts the given attribute to the list of attributes to delete
func (m *ModifyRequest) Delete(attrType string, attrVals []string) {
- m.deleteAttributes = append(m.deleteAttributes, PartialAttribute{attrType: attrType, attrVals: attrVals})
+ m.DeleteAttributes = append(m.DeleteAttributes, PartialAttribute{Type: attrType, Vals: attrVals})
}
+// Replace inserts the given attribute to the list of attributes to replace
func (m *ModifyRequest) Replace(attrType string, attrVals []string) {
- m.replaceAttributes = append(m.replaceAttributes, PartialAttribute{attrType: attrType, attrVals: attrVals})
+ m.ReplaceAttributes = append(m.ReplaceAttributes, PartialAttribute{Type: attrType, Vals: attrVals})
}
func (m ModifyRequest) encode() *ber.Packet {
request := ber.Encode(ber.ClassApplication, ber.TypeConstructed, ApplicationModifyRequest, nil, "Modify Request")
- request.AppendChild(ber.NewString(ber.ClassUniversal, ber.TypePrimitive, ber.TagOctetString, m.dn, "DN"))
+ request.AppendChild(ber.NewString(ber.ClassUniversal, ber.TypePrimitive, ber.TagOctetString, m.DN, "DN"))
changes := ber.Encode(ber.ClassUniversal, ber.TypeConstructed, ber.TagSequence, nil, "Changes")
- for _, attribute := range m.addAttributes {
+ for _, attribute := range m.AddAttributes {
change := ber.Encode(ber.ClassUniversal, ber.TypeConstructed, ber.TagSequence, nil, "Change")
change.AppendChild(ber.NewInteger(ber.ClassUniversal, ber.TypePrimitive, ber.TagEnumerated, uint64(AddAttribute), "Operation"))
change.AppendChild(attribute.encode())
changes.AppendChild(change)
}
- for _, attribute := range m.deleteAttributes {
+ for _, attribute := range m.DeleteAttributes {
change := ber.Encode(ber.ClassUniversal, ber.TypeConstructed, ber.TagSequence, nil, "Change")
change.AppendChild(ber.NewInteger(ber.ClassUniversal, ber.TypePrimitive, ber.TagEnumerated, uint64(DeleteAttribute), "Operation"))
change.AppendChild(attribute.encode())
changes.AppendChild(change)
}
- for _, attribute := range m.replaceAttributes {
+ for _, attribute := range m.ReplaceAttributes {
change := ber.Encode(ber.ClassUniversal, ber.TypeConstructed, ber.TagSequence, nil, "Change")
change.AppendChild(ber.NewInteger(ber.ClassUniversal, ber.TypePrimitive, ber.TagEnumerated, uint64(ReplaceAttribute), "Operation"))
change.AppendChild(attribute.encode())
@@ -103,38 +115,36 @@ func (m ModifyRequest) encode() *ber.Packet {
return request
}
+// NewModifyRequest creates a modify request for the given DN
func NewModifyRequest(
dn string,
) *ModifyRequest {
return &ModifyRequest{
- dn: dn,
+ DN: dn,
}
}
+// Modify performs the ModifyRequest
func (l *Conn) Modify(modifyRequest *ModifyRequest) error {
- messageID := l.nextMessageID()
packet := ber.Encode(ber.ClassUniversal, ber.TypeConstructed, ber.TagSequence, nil, "LDAP Request")
- packet.AppendChild(ber.NewInteger(ber.ClassUniversal, ber.TypePrimitive, ber.TagInteger, messageID, "MessageID"))
+ packet.AppendChild(ber.NewInteger(ber.ClassUniversal, ber.TypePrimitive, ber.TagInteger, l.nextMessageID(), "MessageID"))
packet.AppendChild(modifyRequest.encode())
l.Debug.PrintPacket(packet)
- channel, err := l.sendMessage(packet)
+ msgCtx, err := l.sendMessage(packet)
if err != nil {
return err
}
- if channel == nil {
- return NewError(ErrorNetwork, errors.New("ldap: could not send message"))
- }
- defer l.finishMessage(messageID)
+ defer l.finishMessage(msgCtx)
- l.Debug.Printf("%d: waiting for response", messageID)
- packetResponse, ok := <-channel
+ l.Debug.Printf("%d: waiting for response", msgCtx.id)
+ packetResponse, ok := <-msgCtx.responses
if !ok {
- return NewError(ErrorNetwork, errors.New("ldap: channel closed"))
+ return NewError(ErrorNetwork, errors.New("ldap: response channel closed"))
}
packet, err = packetResponse.ReadPacket()
- l.Debug.Printf("%d: got response %p", messageID, packet)
+ l.Debug.Printf("%d: got response %p", msgCtx.id, packet)
if err != nil {
return err
}
@@ -155,6 +165,6 @@ func (l *Conn) Modify(modifyRequest *ModifyRequest) error {
log.Printf("Unexpected Response: %d", packet.Children[1].Tag)
}
- l.Debug.Printf("%d: returning", messageID)
+ l.Debug.Printf("%d: returning", msgCtx.id)
return nil
}
diff --git a/vendor/github.com/go-ldap/ldap/passwdmodify.go b/vendor/github.com/go-ldap/ldap/passwdmodify.go
index 6d5ca975a..26110ccf4 100644
--- a/vendor/github.com/go-ldap/ldap/passwdmodify.go
+++ b/vendor/github.com/go-ldap/ldap/passwdmodify.go
@@ -16,13 +16,21 @@ const (
passwordModifyOID = "1.3.6.1.4.1.4203.1.11.1"
)
+// PasswordModifyRequest implements the Password Modify Extended Operation as defined in https://www.ietf.org/rfc/rfc3062.txt
type PasswordModifyRequest struct {
+ // UserIdentity is an optional string representation of the user associated with the request.
+ // This string may or may not be an LDAPDN [RFC2253].
+ // If no UserIdentity field is present, the request acts up upon the password of the user currently associated with the LDAP session
UserIdentity string
- OldPassword string
- NewPassword string
+ // OldPassword, if present, contains the user's current password
+ OldPassword string
+ // NewPassword, if present, contains the desired password for this user
+ NewPassword string
}
+// PasswordModifyResult holds the server response to a PasswordModifyRequest
type PasswordModifyResult struct {
+ // GeneratedPassword holds a password generated by the server, if present
GeneratedPassword string
}
@@ -47,7 +55,7 @@ func (r *PasswordModifyRequest) encode() (*ber.Packet, error) {
return request, nil
}
-// Create a new PasswordModifyRequest
+// NewPasswordModifyRequest creates a new PasswordModifyRequest
//
// According to the RFC 3602:
// userIdentity is a string representing the user associated with the request.
@@ -72,11 +80,10 @@ func NewPasswordModifyRequest(userIdentity string, oldPassword string, newPasswo
}
}
+// PasswordModify performs the modification request
func (l *Conn) PasswordModify(passwordModifyRequest *PasswordModifyRequest) (*PasswordModifyResult, error) {
- messageID := l.nextMessageID()
-
packet := ber.Encode(ber.ClassUniversal, ber.TypeConstructed, ber.TagSequence, nil, "LDAP Request")
- packet.AppendChild(ber.NewInteger(ber.ClassUniversal, ber.TypePrimitive, ber.TagInteger, messageID, "MessageID"))
+ packet.AppendChild(ber.NewInteger(ber.ClassUniversal, ber.TypePrimitive, ber.TagInteger, l.nextMessageID(), "MessageID"))
encodedPasswordModifyRequest, err := passwordModifyRequest.encode()
if err != nil {
@@ -86,24 +93,21 @@ func (l *Conn) PasswordModify(passwordModifyRequest *PasswordModifyRequest) (*Pa
l.Debug.PrintPacket(packet)
- channel, err := l.sendMessage(packet)
+ msgCtx, err := l.sendMessage(packet)
if err != nil {
return nil, err
}
- if channel == nil {
- return nil, NewError(ErrorNetwork, errors.New("ldap: could not send message"))
- }
- defer l.finishMessage(messageID)
+ defer l.finishMessage(msgCtx)
result := &PasswordModifyResult{}
- l.Debug.Printf("%d: waiting for response", messageID)
- packetResponse, ok := <-channel
+ l.Debug.Printf("%d: waiting for response", msgCtx.id)
+ packetResponse, ok := <-msgCtx.responses
if !ok {
- return nil, NewError(ErrorNetwork, errors.New("ldap: channel closed"))
+ return nil, NewError(ErrorNetwork, errors.New("ldap: response channel closed"))
}
packet, err = packetResponse.ReadPacket()
- l.Debug.Printf("%d: got response %p", messageID, packet)
+ l.Debug.Printf("%d: got response %p", msgCtx.id, packet)
if err != nil {
return nil, err
}
diff --git a/vendor/github.com/go-ldap/ldap/search.go b/vendor/github.com/go-ldap/ldap/search.go
index 7e9495bdc..2a99894c9 100644
--- a/vendor/github.com/go-ldap/ldap/search.go
+++ b/vendor/github.com/go-ldap/ldap/search.go
@@ -68,18 +68,21 @@ import (
"gopkg.in/asn1-ber.v1"
)
+// scope choices
const (
ScopeBaseObject = 0
ScopeSingleLevel = 1
ScopeWholeSubtree = 2
)
+// ScopeMap contains human readable descriptions of scope choices
var ScopeMap = map[int]string{
ScopeBaseObject: "Base Object",
ScopeSingleLevel: "Single Level",
ScopeWholeSubtree: "Whole Subtree",
}
+// derefAliases
const (
NeverDerefAliases = 0
DerefInSearching = 1
@@ -87,6 +90,7 @@ const (
DerefAlways = 3
)
+// DerefMap contains human readable descriptions of derefAliases choices
var DerefMap = map[int]string{
NeverDerefAliases: "NeverDerefAliases",
DerefInSearching: "DerefInSearching",
@@ -114,11 +118,15 @@ func NewEntry(dn string, attributes map[string][]string) *Entry {
}
}
+// Entry represents a single search result entry
type Entry struct {
- DN string
+ // DN is the distinguished name of the entry
+ DN string
+ // Attributes are the returned attributes for the entry
Attributes []*EntryAttribute
}
+// GetAttributeValues returns the values for the named attribute, or an empty list
func (e *Entry) GetAttributeValues(attribute string) []string {
for _, attr := range e.Attributes {
if attr.Name == attribute {
@@ -128,6 +136,7 @@ func (e *Entry) GetAttributeValues(attribute string) []string {
return []string{}
}
+// GetRawAttributeValues returns the byte values for the named attribute, or an empty list
func (e *Entry) GetRawAttributeValues(attribute string) [][]byte {
for _, attr := range e.Attributes {
if attr.Name == attribute {
@@ -137,6 +146,7 @@ func (e *Entry) GetRawAttributeValues(attribute string) [][]byte {
return [][]byte{}
}
+// GetAttributeValue returns the first value for the named attribute, or ""
func (e *Entry) GetAttributeValue(attribute string) string {
values := e.GetAttributeValues(attribute)
if len(values) == 0 {
@@ -145,6 +155,7 @@ func (e *Entry) GetAttributeValue(attribute string) string {
return values[0]
}
+// GetRawAttributeValue returns the first value for the named attribute, or an empty slice
func (e *Entry) GetRawAttributeValue(attribute string) []byte {
values := e.GetRawAttributeValues(attribute)
if len(values) == 0 {
@@ -153,6 +164,7 @@ func (e *Entry) GetRawAttributeValue(attribute string) []byte {
return values[0]
}
+// Print outputs a human-readable description
func (e *Entry) Print() {
fmt.Printf("DN: %s\n", e.DN)
for _, attr := range e.Attributes {
@@ -160,6 +172,7 @@ func (e *Entry) Print() {
}
}
+// PrettyPrint outputs a human-readable description indenting
func (e *Entry) PrettyPrint(indent int) {
fmt.Printf("%sDN: %s\n", strings.Repeat(" ", indent), e.DN)
for _, attr := range e.Attributes {
@@ -180,38 +193,51 @@ func NewEntryAttribute(name string, values []string) *EntryAttribute {
}
}
+// EntryAttribute holds a single attribute
type EntryAttribute struct {
- Name string
- Values []string
+ // Name is the name of the attribute
+ Name string
+ // Values contain the string values of the attribute
+ Values []string
+ // ByteValues contain the raw values of the attribute
ByteValues [][]byte
}
+// Print outputs a human-readable description
func (e *EntryAttribute) Print() {
fmt.Printf("%s: %s\n", e.Name, e.Values)
}
+// PrettyPrint outputs a human-readable description with indenting
func (e *EntryAttribute) PrettyPrint(indent int) {
fmt.Printf("%s%s: %s\n", strings.Repeat(" ", indent), e.Name, e.Values)
}
+// SearchResult holds the server's response to a search request
type SearchResult struct {
- Entries []*Entry
+ // Entries are the returned entries
+ Entries []*Entry
+ // Referrals are the returned referrals
Referrals []string
- Controls []Control
+ // Controls are the returned controls
+ Controls []Control
}
+// Print outputs a human-readable description
func (s *SearchResult) Print() {
for _, entry := range s.Entries {
entry.Print()
}
}
+// PrettyPrint outputs a human-readable description with indenting
func (s *SearchResult) PrettyPrint(indent int) {
for _, entry := range s.Entries {
entry.PrettyPrint(indent)
}
}
+// SearchRequest represents a search request to send to the server
type SearchRequest struct {
BaseDN string
Scope int
@@ -247,6 +273,7 @@ func (s *SearchRequest) encode() (*ber.Packet, error) {
return request, nil
}
+// NewSearchRequest creates a new search request
func NewSearchRequest(
BaseDN string,
Scope, DerefAliases, SizeLimit, TimeLimit int,
@@ -341,10 +368,10 @@ func (l *Conn) SearchWithPaging(searchRequest *SearchRequest, pagingSize uint32)
return searchResult, nil
}
+// Search performs the given search request
func (l *Conn) Search(searchRequest *SearchRequest) (*SearchResult, error) {
- messageID := l.nextMessageID()
packet := ber.Encode(ber.ClassUniversal, ber.TypeConstructed, ber.TagSequence, nil, "LDAP Request")
- packet.AppendChild(ber.NewInteger(ber.ClassUniversal, ber.TypePrimitive, ber.TagInteger, messageID, "MessageID"))
+ packet.AppendChild(ber.NewInteger(ber.ClassUniversal, ber.TypePrimitive, ber.TagInteger, l.nextMessageID(), "MessageID"))
// encode search request
encodedSearchRequest, err := searchRequest.encode()
if err != nil {
@@ -358,14 +385,11 @@ func (l *Conn) Search(searchRequest *SearchRequest) (*SearchResult, error) {
l.Debug.PrintPacket(packet)
- channel, err := l.sendMessage(packet)
+ msgCtx, err := l.sendMessage(packet)
if err != nil {
return nil, err
}
- if channel == nil {
- return nil, NewError(ErrorNetwork, errors.New("ldap: could not send message"))
- }
- defer l.finishMessage(messageID)
+ defer l.finishMessage(msgCtx)
result := &SearchResult{
Entries: make([]*Entry, 0),
@@ -374,13 +398,13 @@ func (l *Conn) Search(searchRequest *SearchRequest) (*SearchResult, error) {
foundSearchResultDone := false
for !foundSearchResultDone {
- l.Debug.Printf("%d: waiting for response", messageID)
- packetResponse, ok := <-channel
+ l.Debug.Printf("%d: waiting for response", msgCtx.id)
+ packetResponse, ok := <-msgCtx.responses
if !ok {
- return nil, NewError(ErrorNetwork, errors.New("ldap: channel closed"))
+ return nil, NewError(ErrorNetwork, errors.New("ldap: response channel closed"))
}
packet, err = packetResponse.ReadPacket()
- l.Debug.Printf("%d: got response %p", messageID, packet)
+ l.Debug.Printf("%d: got response %p", msgCtx.id, packet)
if err != nil {
return nil, err
}
@@ -421,6 +445,6 @@ func (l *Conn) Search(searchRequest *SearchRequest) (*SearchResult, error) {
result.Referrals = append(result.Referrals, packet.Children[1].Children[0].Value.(string))
}
}
- l.Debug.Printf("%d: returning", messageID)
+ l.Debug.Printf("%d: returning", msgCtx.id)
return result, nil
}
diff --git a/vendor/github.com/go-sql-driver/mysql/.travis.yml b/vendor/github.com/go-sql-driver/mysql/.travis.yml
index 211969dfa..cc97c31e7 100644
--- a/vendor/github.com/go-sql-driver/mysql/.travis.yml
+++ b/vendor/github.com/go-sql-driver/mysql/.travis.yml
@@ -1,11 +1,6 @@
-sudo: false
language: go
go:
- - 1.2
- - 1.3
- - 1.4
- - 1.5
- - 1.6
+ - 1.1
- tip
before_script:
diff --git a/vendor/github.com/go-sql-driver/mysql/AUTHORS b/vendor/github.com/go-sql-driver/mysql/AUTHORS
index 3774919d7..f3c62e178 100644
--- a/vendor/github.com/go-sql-driver/mysql/AUTHORS
+++ b/vendor/github.com/go-sql-driver/mysql/AUTHORS
@@ -14,34 +14,18 @@
Aaron Hopkins <go-sql-driver at die.net>
Arne Hormann <arnehormann at gmail.com>
Carlos Nieto <jose.carlos at menteslibres.net>
-Chris Moos <chris at tech9computers.com>
-Daniel Nichter <nil at codenode.com>
-Daniël van Eeden <git at myname.nl>
DisposaBoy <disposaboy at dby.me>
Frederick Mayle <frederickmayle at gmail.com>
Gustavo Kristic <gkristic at gmail.com>
Hanno Braun <mail at hannobraun.com>
-Henri Yandell <flamefew at gmail.com>
-Hirotaka Yamamoto <ymmt2005 at gmail.com>
-INADA Naoki <songofacandy at gmail.com>
James Harr <james.harr at gmail.com>
Jian Zhen <zhenjl at gmail.com>
-Joshua Prunier <joshua.prunier at gmail.com>
-Julien Lefevre <julien.lefevr at gmail.com>
Julien Schmidt <go-sql-driver at julienschmidt.com>
-Kamil Dziedzic <kamil at klecza.pl>
-Kevin Malachowski <kevin at chowski.com>
Leonardo YongUk Kim <dalinaum at gmail.com>
-Luca Looz <luca.looz92 at gmail.com>
Lucas Liu <extrafliu at gmail.com>
Luke Scott <luke at webconnex.com>
Michael Woolnough <michael.woolnough at gmail.com>
Nicola Peduzzi <thenikso at gmail.com>
-Paul Bonser <misterpib at gmail.com>
-Runrioter Wung <runrioter at gmail.com>
-Soroush Pour <me at soroushjp.com>
-Stan Putrya <root.vagner at gmail.com>
-Stanley Gunawan <gunawan.stanley at gmail.com>
Xiaobing Jiang <s7v7nislands at gmail.com>
Xiuming Chen <cc at cxm.cc>
@@ -49,4 +33,3 @@ Xiuming Chen <cc at cxm.cc>
Barracuda Networks, Inc.
Google Inc.
-Stripe Inc.
diff --git a/vendor/github.com/go-sql-driver/mysql/CHANGELOG.md b/vendor/github.com/go-sql-driver/mysql/CHANGELOG.md
index 381d91825..feb53a1e8 100644
--- a/vendor/github.com/go-sql-driver/mysql/CHANGELOG.md
+++ b/vendor/github.com/go-sql-driver/mysql/CHANGELOG.md
@@ -1,34 +1,3 @@
-## HEAD
-
-Changes:
-
- - Go 1.1 is no longer supported
- - Use decimals field from MySQL to format time types (#249)
- - Buffer optimizations (#269)
- - TLS ServerName defaults to the host (#283)
-
-Bugfixes:
-
- - Enable microsecond resolution on TIME, DATETIME and TIMESTAMP (#249)
- - Fixed handling of queries without columns and rows (#255)
- - Fixed a panic when SetKeepAlive() failed (#298)
- - Support receiving ERR packet while reading rows (#321)
- - Fixed reading NULL length-encoded integers in MySQL 5.6+ (#349)
- - Fixed absolute paths support in LOAD LOCAL DATA INFILE (#356)
- - Actually zero out bytes in handshake response (#378)
- - Fixed race condition in registering LOAD DATA INFILE handler (#383)
- - Fixed tests with MySQL 5.7.9+ (#380)
- - QueryUnescape TLS config names (#397)
- - Fixed "broken pipe" error by writing to closed socket (#390)
-
-New Features:
- - Support for returning table alias on Columns() (#289, #359, #382)
- - Placeholder interpolation, can be actived with the DSN parameter `interpolateParams=true` (#309, #318)
- - Support for uint64 parameters with high bit set (#332, #345)
- - Cleartext authentication plugin support (#327)
-
-
-
## Version 1.2 (2014-06-03)
Changes:
diff --git a/vendor/github.com/go-sql-driver/mysql/CONTRIBUTING.md b/vendor/github.com/go-sql-driver/mysql/CONTRIBUTING.md
index 8fe16bcb4..f87c19824 100644
--- a/vendor/github.com/go-sql-driver/mysql/CONTRIBUTING.md
+++ b/vendor/github.com/go-sql-driver/mysql/CONTRIBUTING.md
@@ -4,11 +4,28 @@
Before creating a new Issue, please check first if a similar Issue [already exists](https://github.com/go-sql-driver/mysql/issues?state=open) or was [recently closed](https://github.com/go-sql-driver/mysql/issues?direction=desc&page=1&sort=updated&state=closed).
+Please provide the following minimum information:
+* Your Go-MySQL-Driver version (or git SHA)
+* Your Go version (run `go version` in your console)
+* A detailed issue description
+* Error Log if present
+* If possible, a short example
+
+
## Contributing Code
By contributing to this project, you share your code under the Mozilla Public License 2, as specified in the LICENSE file.
Don't forget to add yourself to the AUTHORS file.
+### Pull Requests Checklist
+
+Please check the following points before submitting your pull request:
+- [x] Code compiles correctly
+- [x] Created tests, if possible
+- [x] All tests pass
+- [x] Extended the README / documentation, if necessary
+- [x] Added yourself to the AUTHORS file
+
### Code Review
Everyone is invited to review and comment on pull requests.
diff --git a/vendor/github.com/go-sql-driver/mysql/ISSUE_TEMPLATE.md b/vendor/github.com/go-sql-driver/mysql/ISSUE_TEMPLATE.md
deleted file mode 100644
index d9771f1dd..000000000
--- a/vendor/github.com/go-sql-driver/mysql/ISSUE_TEMPLATE.md
+++ /dev/null
@@ -1,21 +0,0 @@
-### Issue description
-Tell us what should happen and what happens instead
-
-### Example code
-```go
-If possible, please enter some example code here to reproduce the issue.
-```
-
-### Error log
-```
-If you have an error log, please paste it here.
-```
-
-### Configuration
-*Driver version (or git SHA):*
-
-*Go version:* run `go version` in your console
-
-*Server version:* E.g. MySQL 5.6, MariaDB 10.0.20
-
-*Server OS:* E.g. Debian 8.1 (Jessie), Windows 10
diff --git a/vendor/github.com/go-sql-driver/mysql/PULL_REQUEST_TEMPLATE.md b/vendor/github.com/go-sql-driver/mysql/PULL_REQUEST_TEMPLATE.md
deleted file mode 100644
index 6f5c7ebeb..000000000
--- a/vendor/github.com/go-sql-driver/mysql/PULL_REQUEST_TEMPLATE.md
+++ /dev/null
@@ -1,9 +0,0 @@
-### Description
-Please explain the changes you made here.
-
-### Checklist
-- [ ] Code compiles correctly
-- [ ] Created tests which fail without the change (if possible)
-- [ ] All tests passing
-- [ ] Extended the README / documentation, if necessary
-- [ ] Added myself / the copyright holder to the AUTHORS file
diff --git a/vendor/github.com/go-sql-driver/mysql/README.md b/vendor/github.com/go-sql-driver/mysql/README.md
index c64aae264..6b3475b37 100644
--- a/vendor/github.com/go-sql-driver/mysql/README.md
+++ b/vendor/github.com/go-sql-driver/mysql/README.md
@@ -30,7 +30,7 @@ A MySQL-Driver for Go's [database/sql](http://golang.org/pkg/database/sql) packa
## Features
* Lightweight and [fast](https://github.com/go-sql-driver/sql-benchmark "golang MySQL-Driver performance")
* Native Go implementation. No C-bindings, just pure Go
- * Connections over TCP/IPv4, TCP/IPv6, Unix domain sockets or [custom protocols](http://godoc.org/github.com/go-sql-driver/mysql#DialFunc)
+ * Connections over TCP/IPv4, TCP/IPv6 or Unix domain sockets
* Automatic handling of broken connections
* Automatic Connection Pooling *(by database/sql package)*
* Supports queries larger than 16MB
@@ -38,10 +38,9 @@ A MySQL-Driver for Go's [database/sql](http://golang.org/pkg/database/sql) packa
* Intelligent `LONG DATA` handling in prepared statements
* Secure `LOAD DATA LOCAL INFILE` support with file Whitelisting and `io.Reader` support
* Optional `time.Time` parsing
- * Optional placeholder interpolation
## Requirements
- * Go 1.2 or higher
+ * Go 1.1 or higher
* MySQL (4.1+), MariaDB, Percona Server, Google CloudSQL or Sphinx (2.2.3+)
---------------------------------------
@@ -93,8 +92,6 @@ This has the same effect as an empty DSN string:
```
-Alternatively, [Config.FormatDSN](https://godoc.org/github.com/go-sql-driver/mysql#Config.FormatDSN) can be used to create a DSN string by filling a struct.
-
#### Password
Passwords can consist of any character. Escaping is **not** necessary.
@@ -125,16 +122,6 @@ Default: false
`allowAllFiles=true` disables the file Whitelist for `LOAD DATA LOCAL INFILE` and allows *all* files.
[*Might be insecure!*](http://dev.mysql.com/doc/refman/5.7/en/load-data-local.html)
-##### `allowCleartextPasswords`
-
-```
-Type: bool
-Valid Values: true, false
-Default: false
-```
-
-`allowCleartextPasswords=true` allows using the [cleartext client side plugin](http://dev.mysql.com/doc/en/cleartext-authentication-plugin.html) if required by an account, such as one defined with the [PAM authentication plugin](http://dev.mysql.com/doc/en/pam-authentication-plugin.html). Sending passwords in clear text may be a security problem in some configurations. To avoid problems if there is any possibility that the password would be intercepted, clients should connect to MySQL Server using a method that protects the password. Possibilities include [TLS / SSL](#tls), IPsec, or a private network.
-
##### `allowOldPasswords`
```
@@ -179,33 +166,6 @@ Default: false
`clientFoundRows=true` causes an UPDATE to return the number of matching rows instead of the number of rows changed.
-##### `columnsWithAlias`
-
-```
-Type: bool
-Valid Values: true, false
-Default: false
-```
-
-When `columnsWithAlias` is true, calls to `sql.Rows.Columns()` will return the table alias and the column name separated by a dot. For example:
-
-```
-SELECT u.id FROM users as u
-```
-
-will return `u.id` instead of just `id` if `columnsWithAlias=true`.
-
-##### `interpolateParams`
-
-```
-Type: bool
-Valid Values: true, false
-Default: false
-```
-
-If `interpolateParams` is true, placeholders (`?`) in calls to `db.Query()` and `db.Exec()` are interpolated into a single query string with given parameters. This reduces the number of roundtrips, since the driver has to prepare a statement, execute it with given parameters and close the statement again with `interpolateParams=false`.
-
-*This can not be used together with the multibyte encodings BIG5, CP932, GB2312, GBK or SJIS. These are blacklisted as they may [introduce a SQL injection vulnerability](http://stackoverflow.com/a/12118602/3430118)!*
##### `loc`
@@ -217,22 +177,8 @@ Default: UTC
Sets the location for time.Time values (when using `parseTime=true`). *"Local"* sets the system's location. See [time.LoadLocation](http://golang.org/pkg/time/#LoadLocation) for details.
-Note that this sets the location for time.Time values but does not change MySQL's [time_zone setting](https://dev.mysql.com/doc/refman/5.5/en/time-zone-support.html). For that see the [time_zone system variable](#system-variables), which can also be set as a DSN parameter.
-
Please keep in mind, that param values must be [url.QueryEscape](http://golang.org/pkg/net/url/#QueryEscape)'ed. Alternatively you can manually replace the `/` with `%2F`. For example `US/Pacific` would be `loc=US%2FPacific`.
-##### `multiStatements`
-
-```
-Type: bool
-Valid Values: true, false
-Default: false
-```
-
-Allow multiple statements in one query. While this allows batch queries, it also greatly increases the risk of SQL injections. Only the result of the first query is returned, all other results are silently discarded.
-
-When `multiStatements` is used, `?` parameters must only be used in the first statement.
-
##### `parseTime`
@@ -245,16 +191,6 @@ Default: false
`parseTime=true` changes the output type of `DATE` and `DATETIME` values to `time.Time` instead of `[]byte` / `string`
-##### `readTimeout`
-
-```
-Type: decimal number
-Default: 0
-```
-
-I/O read timeout. The value must be a decimal number with an unit suffix ( *"ms"*, *"s"*, *"m"*, *"h"* ), such as *"30s"*, *"0.5m"* or *"1m30s"*.
-
-
##### `strict`
```
@@ -275,7 +211,7 @@ Type: decimal number
Default: OS default
```
-*Driver* side connection timeout. The value must be a decimal number with an unit suffix ( *"ms"*, *"s"*, *"m"*, *"h"* ), such as *"30s"*, *"0.5m"* or *"1m30s"*. To set a server side timeout, use the parameter [`wait_timeout`](http://dev.mysql.com/doc/refman/5.6/en/server-system-variables.html#sysvar_wait_timeout).
+*Driver* side connection timeout. The value must be a string of decimal numbers, each with optional fraction and a unit suffix ( *"ms"*, *"s"*, *"m"*, *"h"* ), such as *"30s"*, *"0.5m"* or *"1m30s"*. To set a server side timeout, use the parameter [`wait_timeout`](http://dev.mysql.com/doc/refman/5.6/en/server-system-variables.html#sysvar_wait_timeout).
##### `tls`
@@ -289,21 +225,11 @@ Default: false
`tls=true` enables TLS / SSL encrypted connection to the server. Use `skip-verify` if you want to use a self-signed or invalid certificate (server side). Use a custom value registered with [`mysql.RegisterTLSConfig`](http://godoc.org/github.com/go-sql-driver/mysql#RegisterTLSConfig).
-##### `writeTimeout`
-
-```
-Type: decimal number
-Default: 0
-```
-
-I/O write timeout. The value must be a decimal number with an unit suffix ( *"ms"*, *"s"*, *"m"*, *"h"* ), such as *"30s"*, *"0.5m"* or *"1m30s"*.
-
-
##### System Variables
All other parameters are interpreted as system variables:
* `autocommit`: `"SET autocommit=<value>"`
- * [`time_zone`](https://dev.mysql.com/doc/refman/5.5/en/time-zone-support.html): `"SET time_zone=<value>"`
+ * `time_zone`: `"SET time_zone=<value>"`
* [`tx_isolation`](https://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_tx_isolation): `"SET tx_isolation=<value>"`
* `param`: `"SET <param>=<value>"`
@@ -365,7 +291,7 @@ import "github.com/go-sql-driver/mysql"
Files must be whitelisted by registering them with `mysql.RegisterLocalFile(filepath)` (recommended) or the Whitelist check must be deactivated by using the DSN parameter `allowAllFiles=true` ([*Might be insecure!*](http://dev.mysql.com/doc/refman/5.7/en/load-data-local.html)).
-To use a `io.Reader` a handler function must be registered with `mysql.RegisterReaderHandler(name, handler)` which returns a `io.Reader` or `io.ReadCloser`. The Reader is available with the filepath `Reader::<name>` then. Choose different names for different handlers and `DeregisterReaderHandler` when you don't need it anymore.
+To use a `io.Reader` a handler function must be registered with `mysql.RegisterReaderHandler(name, handler)` which returns a `io.Reader` or `io.ReadCloser`. The Reader is available with the filepath `Reader::<name>` then.
See the [godoc of Go-MySQL-Driver](http://godoc.org/github.com/go-sql-driver/mysql "golang mysql driver documentation") for details.
@@ -408,9 +334,9 @@ Mozilla summarizes the license scope as follows:
That means:
- * You can **use** the **unchanged** source code both in private and commercially
- * When distributing, you **must publish** the source code of any **changed files** licensed under the MPL 2.0 under a) the MPL 2.0 itself or b) a compatible license (e.g. GPL 3.0 or Apache License 2.0)
- * You **needn't publish** the source code of your library as long as the files licensed under the MPL 2.0 are **unchanged**
+ * You can **use** the **unchanged** source code both in private as also commercial
+ * You **needn't publish** the source code of your library as long the files licensed under the MPL 2.0 are **unchanged**
+ * You **must publish** the source code of any **changed files** licensed under the MPL 2.0 under a) the MPL 2.0 itself or b) a compatible license (e.g. GPL 3.0 or Apache License 2.0)
Please read the [MPL 2.0 FAQ](http://www.mozilla.org/MPL/2.0/FAQ.html) if you have further questions regarding the license.
diff --git a/vendor/github.com/go-sql-driver/mysql/benchmark_test.go b/vendor/github.com/go-sql-driver/mysql/benchmark_test.go
index 8f721139b..d72a4183f 100644
--- a/vendor/github.com/go-sql-driver/mysql/benchmark_test.go
+++ b/vendor/github.com/go-sql-driver/mysql/benchmark_test.go
@@ -11,13 +11,10 @@ package mysql
import (
"bytes"
"database/sql"
- "database/sql/driver"
- "math"
"strings"
"sync"
"sync/atomic"
"testing"
- "time"
)
type TB testing.B
@@ -48,11 +45,7 @@ func initDB(b *testing.B, queries ...string) *sql.DB {
db := tb.checkDB(sql.Open("mysql", dsn))
for _, query := range queries {
if _, err := db.Exec(query); err != nil {
- if w, ok := err.(MySQLWarnings); ok {
- b.Logf("warning on %q: %v", query, w)
- } else {
- b.Fatalf("error on %q: %v", query, err)
- }
+ b.Fatalf("Error on %q: %v", query, err)
}
}
return db
@@ -213,34 +206,3 @@ func BenchmarkRoundtripBin(b *testing.B) {
rows.Close()
}
}
-
-func BenchmarkInterpolation(b *testing.B) {
- mc := &mysqlConn{
- cfg: &Config{
- InterpolateParams: true,
- Loc: time.UTC,
- },
- maxPacketAllowed: maxPacketSize,
- maxWriteSize: maxPacketSize - 1,
- buf: newBuffer(nil),
- }
-
- args := []driver.Value{
- int64(42424242),
- float64(math.Pi),
- false,
- time.Unix(1423411542, 807015000),
- []byte("bytes containing special chars ' \" \a \x00"),
- "string containing special chars ' \" \a \x00",
- }
- q := "SELECT ?, ?, ?, ?, ?, ?"
-
- b.ReportAllocs()
- b.ResetTimer()
- for i := 0; i < b.N; i++ {
- _, err := mc.interpolateParams(q, args)
- if err != nil {
- b.Fatal(err)
- }
- }
-}
diff --git a/vendor/github.com/go-sql-driver/mysql/buffer.go b/vendor/github.com/go-sql-driver/mysql/buffer.go
index 2001feacd..794ac3099 100644
--- a/vendor/github.com/go-sql-driver/mysql/buffer.go
+++ b/vendor/github.com/go-sql-driver/mysql/buffer.go
@@ -8,11 +8,7 @@
package mysql
-import (
- "io"
- "net"
- "time"
-)
+import "io"
const defaultBufSize = 4096
@@ -22,28 +18,25 @@ const defaultBufSize = 4096
// The buffer is similar to bufio.Reader / Writer but zero-copy-ish
// Also highly optimized for this particular use case.
type buffer struct {
- buf []byte
- nc net.Conn
- idx int
- length int
- timeout time.Duration
+ buf []byte
+ rd io.Reader
+ idx int
+ length int
}
-func newBuffer(nc net.Conn) buffer {
+func newBuffer(rd io.Reader) buffer {
var b [defaultBufSize]byte
return buffer{
buf: b[:],
- nc: nc,
+ rd: rd,
}
}
// fill reads into the buffer until at least _need_ bytes are in it
func (b *buffer) fill(need int) error {
- n := b.length
-
// move existing data to the beginning
- if n > 0 && b.idx > 0 {
- copy(b.buf[0:n], b.buf[b.idx:])
+ if b.length > 0 && b.idx > 0 {
+ copy(b.buf[0:b.length], b.buf[b.idx:])
}
// grow buffer if necessary
@@ -59,33 +52,19 @@ func (b *buffer) fill(need int) error {
b.idx = 0
for {
- if b.timeout > 0 {
- if err := b.nc.SetReadDeadline(time.Now().Add(b.timeout)); err != nil {
- return err
- }
- }
+ n, err := b.rd.Read(b.buf[b.length:])
+ b.length += n
- nn, err := b.nc.Read(b.buf[n:])
- n += nn
-
- switch err {
- case nil:
- if n < need {
+ if err == nil {
+ if b.length < need {
continue
}
- b.length = n
return nil
-
- case io.EOF:
- if n >= need {
- b.length = n
- return nil
- }
- return io.ErrUnexpectedEOF
-
- default:
- return err
}
+ if b.length >= need && err == io.EOF {
+ return nil
+ }
+ return err
}
}
diff --git a/vendor/github.com/go-sql-driver/mysql/collations.go b/vendor/github.com/go-sql-driver/mysql/collations.go
index 82079cfb9..aabe0055d 100644
--- a/vendor/github.com/go-sql-driver/mysql/collations.go
+++ b/vendor/github.com/go-sql-driver/mysql/collations.go
@@ -8,7 +8,7 @@
package mysql
-const defaultCollation = "utf8_general_ci"
+const defaultCollation byte = 33 // utf8_general_ci
// A list of available collations mapped to the internal ID.
// To update this map use the following MySQL query:
@@ -234,17 +234,3 @@ var collations = map[string]byte{
"utf8mb4_unicode_520_ci": 246,
"utf8mb4_vietnamese_ci": 247,
}
-
-// A blacklist of collations which is unsafe to interpolate parameters.
-// These multibyte encodings may contains 0x5c (`\`) in their trailing bytes.
-var unsafeCollations = map[string]bool{
- "big5_chinese_ci": true,
- "sjis_japanese_ci": true,
- "gbk_chinese_ci": true,
- "big5_bin": true,
- "gb2312_bin": true,
- "gbk_bin": true,
- "sjis_bin": true,
- "cp932_japanese_ci": true,
- "cp932_bin": true,
-}
diff --git a/vendor/github.com/go-sql-driver/mysql/connection.go b/vendor/github.com/go-sql-driver/mysql/connection.go
index c3899de0e..04607296e 100644
--- a/vendor/github.com/go-sql-driver/mysql/connection.go
+++ b/vendor/github.com/go-sql-driver/mysql/connection.go
@@ -9,9 +9,10 @@
package mysql
import (
+ "crypto/tls"
"database/sql/driver"
+ "errors"
"net"
- "strconv"
"strings"
"time"
)
@@ -21,20 +22,34 @@ type mysqlConn struct {
netConn net.Conn
affectedRows uint64
insertId uint64
- cfg *Config
+ cfg *config
maxPacketAllowed int
maxWriteSize int
- writeTimeout time.Duration
flags clientFlag
- status statusFlag
sequence uint8
parseTime bool
strict bool
}
+type config struct {
+ user string
+ passwd string
+ net string
+ addr string
+ dbname string
+ params map[string]string
+ loc *time.Location
+ tls *tls.Config
+ timeout time.Duration
+ collation uint8
+ allowAllFiles bool
+ allowOldPasswords bool
+ clientFoundRows bool
+}
+
// Handles parameters set in DSN after the connection is established
func (mc *mysqlConn) handleParams() (err error) {
- for param, val := range mc.cfg.Params {
+ for param, val := range mc.cfg.params {
switch param {
// Charset
case "charset":
@@ -50,6 +65,27 @@ func (mc *mysqlConn) handleParams() (err error) {
return
}
+ // time.Time parsing
+ case "parseTime":
+ var isBool bool
+ mc.parseTime, isBool = readBool(val)
+ if !isBool {
+ return errors.New("Invalid Bool value: " + val)
+ }
+
+ // Strict mode
+ case "strict":
+ var isBool bool
+ mc.strict, isBool = readBool(val)
+ if !isBool {
+ return errors.New("Invalid Bool value: " + val)
+ }
+
+ // Compression
+ case "compress":
+ err = errors.New("Compression not implemented yet")
+ return
+
// System Vars
default:
err = mc.exec("SET " + param + "=" + val + "")
@@ -79,27 +115,18 @@ func (mc *mysqlConn) Close() (err error) {
// Makes Close idempotent
if mc.netConn != nil {
err = mc.writeCommandPacket(comQuit)
- }
-
- mc.cleanup()
-
- return
-}
-
-// Closes the network connection and unsets internal variables. Do not call this
-// function after successfully authentication, call Close instead. This function
-// is called before auth or on auth failure because MySQL will have already
-// closed the network connection.
-func (mc *mysqlConn) cleanup() {
- // Makes cleanup idempotent
- if mc.netConn != nil {
- if err := mc.netConn.Close(); err != nil {
- errLog.Print(err)
+ if err == nil {
+ err = mc.netConn.Close()
+ } else {
+ mc.netConn.Close()
}
mc.netConn = nil
}
+
mc.cfg = nil
- mc.buf.nc = nil
+ mc.buf.rd = nil
+
+ return
}
func (mc *mysqlConn) Prepare(query string) (driver.Stmt, error) {
@@ -134,151 +161,28 @@ func (mc *mysqlConn) Prepare(query string) (driver.Stmt, error) {
return stmt, err
}
-func (mc *mysqlConn) interpolateParams(query string, args []driver.Value) (string, error) {
- buf := mc.buf.takeCompleteBuffer()
- if buf == nil {
- // can not take the buffer. Something must be wrong with the connection
- errLog.Print(ErrBusyBuffer)
- return "", driver.ErrBadConn
- }
- buf = buf[:0]
- argPos := 0
-
- for i := 0; i < len(query); i++ {
- q := strings.IndexByte(query[i:], '?')
- if q == -1 {
- buf = append(buf, query[i:]...)
- break
- }
- buf = append(buf, query[i:i+q]...)
- i += q
-
- arg := args[argPos]
- argPos++
-
- if arg == nil {
- buf = append(buf, "NULL"...)
- continue
- }
-
- switch v := arg.(type) {
- case int64:
- buf = strconv.AppendInt(buf, v, 10)
- case float64:
- buf = strconv.AppendFloat(buf, v, 'g', -1, 64)
- case bool:
- if v {
- buf = append(buf, '1')
- } else {
- buf = append(buf, '0')
- }
- case time.Time:
- if v.IsZero() {
- buf = append(buf, "'0000-00-00'"...)
- } else {
- v := v.In(mc.cfg.Loc)
- v = v.Add(time.Nanosecond * 500) // To round under microsecond
- year := v.Year()
- year100 := year / 100
- year1 := year % 100
- month := v.Month()
- day := v.Day()
- hour := v.Hour()
- minute := v.Minute()
- second := v.Second()
- micro := v.Nanosecond() / 1000
-
- buf = append(buf, []byte{
- '\'',
- digits10[year100], digits01[year100],
- digits10[year1], digits01[year1],
- '-',
- digits10[month], digits01[month],
- '-',
- digits10[day], digits01[day],
- ' ',
- digits10[hour], digits01[hour],
- ':',
- digits10[minute], digits01[minute],
- ':',
- digits10[second], digits01[second],
- }...)
-
- if micro != 0 {
- micro10000 := micro / 10000
- micro100 := micro / 100 % 100
- micro1 := micro % 100
- buf = append(buf, []byte{
- '.',
- digits10[micro10000], digits01[micro10000],
- digits10[micro100], digits01[micro100],
- digits10[micro1], digits01[micro1],
- }...)
- }
- buf = append(buf, '\'')
- }
- case []byte:
- if v == nil {
- buf = append(buf, "NULL"...)
- } else {
- buf = append(buf, "_binary'"...)
- if mc.status&statusNoBackslashEscapes == 0 {
- buf = escapeBytesBackslash(buf, v)
- } else {
- buf = escapeBytesQuotes(buf, v)
- }
- buf = append(buf, '\'')
- }
- case string:
- buf = append(buf, '\'')
- if mc.status&statusNoBackslashEscapes == 0 {
- buf = escapeStringBackslash(buf, v)
- } else {
- buf = escapeStringQuotes(buf, v)
- }
- buf = append(buf, '\'')
- default:
- return "", driver.ErrSkip
- }
-
- if len(buf)+4 > mc.maxPacketAllowed {
- return "", driver.ErrSkip
- }
- }
- if argPos != len(args) {
- return "", driver.ErrSkip
- }
- return string(buf), nil
-}
-
func (mc *mysqlConn) Exec(query string, args []driver.Value) (driver.Result, error) {
if mc.netConn == nil {
errLog.Print(ErrInvalidConn)
return nil, driver.ErrBadConn
}
- if len(args) != 0 {
- if !mc.cfg.InterpolateParams {
- return nil, driver.ErrSkip
- }
- // try to interpolate the parameters to save extra roundtrips for preparing and closing a statement
- prepared, err := mc.interpolateParams(query, args)
- if err != nil {
- return nil, err
+ if len(args) == 0 { // no args, fastpath
+ mc.affectedRows = 0
+ mc.insertId = 0
+
+ err := mc.exec(query)
+ if err == nil {
+ return &mysqlResult{
+ affectedRows: int64(mc.affectedRows),
+ insertId: int64(mc.insertId),
+ }, err
}
- query = prepared
- args = nil
+ return nil, err
}
- mc.affectedRows = 0
- mc.insertId = 0
- err := mc.exec(query)
- if err == nil {
- return &mysqlResult{
- affectedRows: int64(mc.affectedRows),
- insertId: int64(mc.insertId),
- }, err
- }
- return nil, err
+ // with args, must use prepared stmt
+ return nil, driver.ErrSkip
+
}
// Internal function to execute commands
@@ -307,38 +211,29 @@ func (mc *mysqlConn) Query(query string, args []driver.Value) (driver.Rows, erro
errLog.Print(ErrInvalidConn)
return nil, driver.ErrBadConn
}
- if len(args) != 0 {
- if !mc.cfg.InterpolateParams {
- return nil, driver.ErrSkip
- }
- // try client-side prepare to reduce roundtrip
- prepared, err := mc.interpolateParams(query, args)
- if err != nil {
- return nil, err
- }
- query = prepared
- args = nil
- }
- // Send command
- err := mc.writeCommandPacketStr(comQuery, query)
- if err == nil {
- // Read Result
- var resLen int
- resLen, err = mc.readResultSetHeaderPacket()
+ if len(args) == 0 { // no args, fastpath
+ // Send command
+ err := mc.writeCommandPacketStr(comQuery, query)
if err == nil {
- rows := new(textRows)
- rows.mc = mc
-
- if resLen == 0 {
- // no columns, no more data
- return emptyRows{}, nil
+ // Read Result
+ var resLen int
+ resLen, err = mc.readResultSetHeaderPacket()
+ if err == nil {
+ rows := new(textRows)
+ rows.mc = mc
+
+ if resLen > 0 {
+ // Columns
+ rows.columns, err = mc.readColumns(resLen)
+ }
+ return rows, err
}
- // Columns
- rows.columns, err = mc.readColumns(resLen)
- return rows, err
}
+ return nil, err
}
- return nil, err
+
+ // with args, must use prepared stmt
+ return nil, driver.ErrSkip
}
// Gets the value of the given MySQL System Variable
@@ -354,7 +249,6 @@ func (mc *mysqlConn) getSystemVar(name string) ([]byte, error) {
if err == nil {
rows := new(textRows)
rows.mc = mc
- rows.columns = []mysqlField{{fieldType: fieldTypeVarChar}}
if resLen > 0 {
// Columns
diff --git a/vendor/github.com/go-sql-driver/mysql/const.go b/vendor/github.com/go-sql-driver/mysql/const.go
index 88cfff3fd..379eabec1 100644
--- a/vendor/github.com/go-sql-driver/mysql/const.go
+++ b/vendor/github.com/go-sql-driver/mysql/const.go
@@ -11,7 +11,7 @@ package mysql
const (
minProtocolVersion byte = 10
maxPacketSize = 1<<24 - 1
- timeFormat = "2006-01-02 15:04:05.999999"
+ timeFormat = "2006-01-02 15:04:05"
)
// MySQL constants documentation:
@@ -24,7 +24,6 @@ const (
iERR byte = 0xff
)
-// https://dev.mysql.com/doc/internals/en/capability-flags.html#packet-Protocol::CapabilityFlags
type clientFlag uint32
const (
@@ -46,13 +45,6 @@ const (
clientSecureConn
clientMultiStatements
clientMultiResults
- clientPSMultiResults
- clientPluginAuth
- clientConnectAttrs
- clientPluginAuthLenEncClientData
- clientCanHandleExpiredPasswords
- clientSessionTrack
- clientDeprecateEOF
)
const (
@@ -76,7 +68,7 @@ const (
comBinlogDump
comTableDump
comConnectOut
- comRegisterSlave
+ comRegiserSlave
comStmtPrepare
comStmtExecute
comStmtSendLongData
@@ -86,7 +78,6 @@ const (
comStmtFetch
)
-// https://dev.mysql.com/doc/internals/en/com-query-response.html#packet-Protocol::ColumnType
const (
fieldTypeDecimal byte = iota
fieldTypeTiny
@@ -107,8 +98,7 @@ const (
fieldTypeBit
)
const (
- fieldTypeJSON byte = iota + 0xf5
- fieldTypeNewDecimal
+ fieldTypeNewDecimal byte = iota + 0xf6
fieldTypeEnum
fieldTypeSet
fieldTypeTinyBLOB
@@ -140,24 +130,3 @@ const (
flagUnknown3
flagUnknown4
)
-
-// http://dev.mysql.com/doc/internals/en/status-flags.html
-type statusFlag uint16
-
-const (
- statusInTrans statusFlag = 1 << iota
- statusInAutocommit
- statusReserved // Not in documentation
- statusMoreResultsExists
- statusNoGoodIndexUsed
- statusNoIndexUsed
- statusCursorExists
- statusLastRowSent
- statusDbDropped
- statusNoBackslashEscapes
- statusMetadataChanged
- statusQueryWasSlow
- statusPsOutParams
- statusInTransReadonly
- statusSessionStateChanged
-)
diff --git a/vendor/github.com/go-sql-driver/mysql/driver.go b/vendor/github.com/go-sql-driver/mysql/driver.go
index 899f955fb..c0375fe18 100644
--- a/vendor/github.com/go-sql-driver/mysql/driver.go
+++ b/vendor/github.com/go-sql-driver/mysql/driver.go
@@ -4,7 +4,7 @@
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
// You can obtain one at http://mozilla.org/MPL/2.0/.
-// Package mysql provides a MySQL driver for Go's database/sql package
+// Go MySQL Driver - A MySQL-Driver for Go's database/sql package
//
// The driver should be used via the database/sql package:
//
@@ -22,7 +22,7 @@ import (
"net"
)
-// MySQLDriver is exported to make the driver directly accessible.
+// This struct is exported to make the driver directly accessible.
// In general the driver is used via the database/sql package.
type MySQLDriver struct{}
@@ -53,19 +53,17 @@ func (d MySQLDriver) Open(dsn string) (driver.Conn, error) {
maxPacketAllowed: maxPacketSize,
maxWriteSize: maxPacketSize - 1,
}
- mc.cfg, err = ParseDSN(dsn)
+ mc.cfg, err = parseDSN(dsn)
if err != nil {
return nil, err
}
- mc.parseTime = mc.cfg.ParseTime
- mc.strict = mc.cfg.Strict
// Connect to Server
- if dial, ok := dials[mc.cfg.Net]; ok {
- mc.netConn, err = dial(mc.cfg.Addr)
+ if dial, ok := dials[mc.cfg.net]; ok {
+ mc.netConn, err = dial(mc.cfg.addr)
} else {
- nd := net.Dialer{Timeout: mc.cfg.Timeout}
- mc.netConn, err = nd.Dial(mc.cfg.Net, mc.cfg.Addr)
+ nd := net.Dialer{Timeout: mc.cfg.timeout}
+ mc.netConn, err = nd.Dial(mc.cfg.net, mc.cfg.addr)
}
if err != nil {
return nil, err
@@ -74,39 +72,44 @@ func (d MySQLDriver) Open(dsn string) (driver.Conn, error) {
// Enable TCP Keepalives on TCP connections
if tc, ok := mc.netConn.(*net.TCPConn); ok {
if err := tc.SetKeepAlive(true); err != nil {
- // Don't send COM_QUIT before handshake.
- mc.netConn.Close()
- mc.netConn = nil
+ mc.Close()
return nil, err
}
}
mc.buf = newBuffer(mc.netConn)
- // Set I/O timeouts
- mc.buf.timeout = mc.cfg.ReadTimeout
- mc.writeTimeout = mc.cfg.WriteTimeout
-
// Reading Handshake Initialization Packet
cipher, err := mc.readInitPacket()
if err != nil {
- mc.cleanup()
+ mc.Close()
return nil, err
}
// Send Client Authentication Packet
if err = mc.writeAuthPacket(cipher); err != nil {
- mc.cleanup()
+ mc.Close()
return nil, err
}
- // Handle response to auth packet, switch methods if possible
- if err = handleAuthResult(mc, cipher); err != nil {
- // Authentication failed and MySQL has already closed the connection
- // (https://dev.mysql.com/doc/internals/en/authentication-fails.html).
- // Do not send COM_QUIT, just cleanup and return the error.
- mc.cleanup()
- return nil, err
+ // Read Result Packet
+ err = mc.readResultOK()
+ if err != nil {
+ // Retry with old authentication method, if allowed
+ if mc.cfg != nil && mc.cfg.allowOldPasswords && err == ErrOldPassword {
+ if err = mc.writeOldAuthPacket(cipher); err != nil {
+ mc.Close()
+ return nil, err
+ }
+ if err = mc.readResultOK(); err != nil {
+ mc.Close()
+ return nil, err
+ }
+ } else {
+ mc.Close()
+ return nil, err
+ }
+
}
// Get max allowed packet size
@@ -130,38 +133,6 @@ func (d MySQLDriver) Open(dsn string) (driver.Conn, error) {
return mc, nil
}
-func handleAuthResult(mc *mysqlConn, cipher []byte) error {
- // Read Result Packet
- err := mc.readResultOK()
- if err == nil {
- return nil // auth successful
- }
-
- if mc.cfg == nil {
- return err // auth failed and retry not possible
- }
-
- // Retry auth if configured to do so.
- if mc.cfg.AllowOldPasswords && err == ErrOldPassword {
- // Retry with old authentication method. Note: there are edge cases
- // where this should work but doesn't; this is currently "wontfix":
- // https://github.com/go-sql-driver/mysql/issues/184
- if err = mc.writeOldAuthPacket(cipher); err != nil {
- return err
- }
- err = mc.readResultOK()
- } else if mc.cfg.AllowCleartextPasswords && err == ErrCleartextPassword {
- // Retry with clear text password for
- // http://dev.mysql.com/doc/refman/5.7/en/cleartext-authentication-plugin.html
- // http://dev.mysql.com/doc/refman/5.7/en/pam-authentication-plugin.html
- if err = mc.writeClearAuthPacket(); err != nil {
- return err
- }
- err = mc.readResultOK()
- }
- return err
-}
-
func init() {
sql.Register("mysql", &MySQLDriver{})
}
diff --git a/vendor/github.com/go-sql-driver/mysql/driver_test.go b/vendor/github.com/go-sql-driver/mysql/driver_test.go
index efbc4925c..ef5b371cf 100644
--- a/vendor/github.com/go-sql-driver/mysql/driver_test.go
+++ b/vendor/github.com/go-sql-driver/mysql/driver_test.go
@@ -9,14 +9,12 @@
package mysql
import (
- "bytes"
"crypto/tls"
"database/sql"
"database/sql/driver"
"fmt"
"io"
"io/ioutil"
- "log"
"net"
"net/url"
"os"
@@ -76,75 +74,23 @@ type DBTest struct {
db *sql.DB
}
-func runTestsWithMultiStatement(t *testing.T, dsn string, tests ...func(dbt *DBTest)) {
- if !available {
- t.Skipf("MySQL server not running on %s", netAddr)
- }
-
- dsn += "&multiStatements=true"
- var db *sql.DB
- if _, err := ParseDSN(dsn); err != errInvalidDSNUnsafeCollation {
- db, err = sql.Open("mysql", dsn)
- if err != nil {
- t.Fatalf("error connecting: %s", err.Error())
- }
- defer db.Close()
- }
-
- dbt := &DBTest{t, db}
- for _, test := range tests {
- test(dbt)
- dbt.db.Exec("DROP TABLE IF EXISTS test")
- }
-}
-
func runTests(t *testing.T, dsn string, tests ...func(dbt *DBTest)) {
if !available {
- t.Skipf("MySQL server not running on %s", netAddr)
+ t.Skipf("MySQL-Server not running on %s", netAddr)
}
db, err := sql.Open("mysql", dsn)
if err != nil {
- t.Fatalf("error connecting: %s", err.Error())
+ t.Fatalf("Error connecting: %s", err.Error())
}
defer db.Close()
db.Exec("DROP TABLE IF EXISTS test")
- dsn2 := dsn + "&interpolateParams=true"
- var db2 *sql.DB
- if _, err := ParseDSN(dsn2); err != errInvalidDSNUnsafeCollation {
- db2, err = sql.Open("mysql", dsn2)
- if err != nil {
- t.Fatalf("error connecting: %s", err.Error())
- }
- defer db2.Close()
- }
-
- dsn3 := dsn + "&multiStatements=true"
- var db3 *sql.DB
- if _, err := ParseDSN(dsn3); err != errInvalidDSNUnsafeCollation {
- db3, err = sql.Open("mysql", dsn3)
- if err != nil {
- t.Fatalf("error connecting: %s", err.Error())
- }
- defer db3.Close()
- }
-
dbt := &DBTest{t, db}
- dbt2 := &DBTest{t, db2}
- dbt3 := &DBTest{t, db3}
for _, test := range tests {
test(dbt)
dbt.db.Exec("DROP TABLE IF EXISTS test")
- if db2 != nil {
- test(dbt2)
- dbt2.db.Exec("DROP TABLE IF EXISTS test")
- }
- if db3 != nil {
- test(dbt3)
- dbt3.db.Exec("DROP TABLE IF EXISTS test")
- }
}
}
@@ -152,13 +98,13 @@ func (dbt *DBTest) fail(method, query string, err error) {
if len(query) > 300 {
query = "[query too large to print]"
}
- dbt.Fatalf("error on %s %s: %s", method, query, err.Error())
+ dbt.Fatalf("Error on %s %s: %s", method, query, err.Error())
}
func (dbt *DBTest) mustExec(query string, args ...interface{}) (res sql.Result) {
res, err := dbt.db.Exec(query, args...)
if err != nil {
- dbt.fail("exec", query, err)
+ dbt.fail("Exec", query, err)
}
return res
}
@@ -166,22 +112,11 @@ func (dbt *DBTest) mustExec(query string, args ...interface{}) (res sql.Result)
func (dbt *DBTest) mustQuery(query string, args ...interface{}) (rows *sql.Rows) {
rows, err := dbt.db.Query(query, args...)
if err != nil {
- dbt.fail("query", query, err)
+ dbt.fail("Query", query, err)
}
return rows
}
-func TestEmptyQuery(t *testing.T) {
- runTests(t, dsn, func(dbt *DBTest) {
- // just a comment, no query
- rows := dbt.mustQuery("--")
- // will hang before #255
- if rows.Next() {
- dbt.Errorf("next on rows must be false")
- }
- })
-}
-
func TestCRUD(t *testing.T) {
runTests(t, dsn, func(dbt *DBTest) {
// Create Table
@@ -201,7 +136,7 @@ func TestCRUD(t *testing.T) {
dbt.Fatalf("res.RowsAffected() returned error: %s", err.Error())
}
if count != 1 {
- dbt.Fatalf("expected 1 affected row, got %d", count)
+ dbt.Fatalf("Expected 1 affected row, got %d", count)
}
id, err := res.LastInsertId()
@@ -209,7 +144,7 @@ func TestCRUD(t *testing.T) {
dbt.Fatalf("res.LastInsertId() returned error: %s", err.Error())
}
if id != 0 {
- dbt.Fatalf("expected InsertId 0, got %d", id)
+ dbt.Fatalf("Expected InsertID 0, got %d", id)
}
// Read
@@ -234,7 +169,7 @@ func TestCRUD(t *testing.T) {
dbt.Fatalf("res.RowsAffected() returned error: %s", err.Error())
}
if count != 1 {
- dbt.Fatalf("expected 1 affected row, got %d", count)
+ dbt.Fatalf("Expected 1 affected row, got %d", count)
}
// Check Update
@@ -259,7 +194,7 @@ func TestCRUD(t *testing.T) {
dbt.Fatalf("res.RowsAffected() returned error: %s", err.Error())
}
if count != 1 {
- dbt.Fatalf("expected 1 affected row, got %d", count)
+ dbt.Fatalf("Expected 1 affected row, got %d", count)
}
// Check for unexpected rows
@@ -269,55 +204,11 @@ func TestCRUD(t *testing.T) {
dbt.Fatalf("res.RowsAffected() returned error: %s", err.Error())
}
if count != 0 {
- dbt.Fatalf("expected 0 affected row, got %d", count)
+ dbt.Fatalf("Expected 0 affected row, got %d", count)
}
})
}
-func TestMultiQuery(t *testing.T) {
- runTestsWithMultiStatement(t, dsn, func(dbt *DBTest) {
- // Create Table
- dbt.mustExec("CREATE TABLE `test` (`id` int(11) NOT NULL, `value` int(11) NOT NULL) ")
-
- // Create Data
- res := dbt.mustExec("INSERT INTO test VALUES (1, 1)")
- count, err := res.RowsAffected()
- if err != nil {
- dbt.Fatalf("res.RowsAffected() returned error: %s", err.Error())
- }
- if count != 1 {
- dbt.Fatalf("expected 1 affected row, got %d", count)
- }
-
- // Update
- res = dbt.mustExec("UPDATE test SET value = 3 WHERE id = 1; UPDATE test SET value = 4 WHERE id = 1; UPDATE test SET value = 5 WHERE id = 1;")
- count, err = res.RowsAffected()
- if err != nil {
- dbt.Fatalf("res.RowsAffected() returned error: %s", err.Error())
- }
- if count != 1 {
- dbt.Fatalf("expected 1 affected row, got %d", count)
- }
-
- // Read
- var out int
- rows := dbt.mustQuery("SELECT value FROM test WHERE id=1;")
- if rows.Next() {
- rows.Scan(&out)
- if 5 != out {
- dbt.Errorf("5 != %d", out)
- }
-
- if rows.Next() {
- dbt.Error("unexpected data")
- }
- } else {
- dbt.Error("no data")
- }
-
- })
-}
-
func TestInt(t *testing.T) {
runTests(t, dsn, func(dbt *DBTest) {
types := [5]string{"TINYINT", "SMALLINT", "MEDIUMINT", "INT", "BIGINT"}
@@ -365,7 +256,7 @@ func TestInt(t *testing.T) {
})
}
-func TestFloat32(t *testing.T) {
+func TestFloat(t *testing.T) {
runTests(t, dsn, func(dbt *DBTest) {
types := [2]string{"FLOAT", "DOUBLE"}
in := float32(42.23)
@@ -388,52 +279,6 @@ func TestFloat32(t *testing.T) {
})
}
-func TestFloat64(t *testing.T) {
- runTests(t, dsn, func(dbt *DBTest) {
- types := [2]string{"FLOAT", "DOUBLE"}
- var expected float64 = 42.23
- var out float64
- var rows *sql.Rows
- for _, v := range types {
- dbt.mustExec("CREATE TABLE test (value " + v + ")")
- dbt.mustExec("INSERT INTO test VALUES (42.23)")
- rows = dbt.mustQuery("SELECT value FROM test")
- if rows.Next() {
- rows.Scan(&out)
- if expected != out {
- dbt.Errorf("%s: %g != %g", v, expected, out)
- }
- } else {
- dbt.Errorf("%s: no data", v)
- }
- dbt.mustExec("DROP TABLE IF EXISTS test")
- }
- })
-}
-
-func TestFloat64Placeholder(t *testing.T) {
- runTests(t, dsn, func(dbt *DBTest) {
- types := [2]string{"FLOAT", "DOUBLE"}
- var expected float64 = 42.23
- var out float64
- var rows *sql.Rows
- for _, v := range types {
- dbt.mustExec("CREATE TABLE test (id int, value " + v + ")")
- dbt.mustExec("INSERT INTO test VALUES (1, 42.23)")
- rows = dbt.mustQuery("SELECT value FROM test WHERE id = ?", 1)
- if rows.Next() {
- rows.Scan(&out)
- if expected != out {
- dbt.Errorf("%s: %g != %g", v, expected, out)
- }
- } else {
- dbt.Errorf("%s: no data", v)
- }
- dbt.mustExec("DROP TABLE IF EXISTS test")
- }
- })
-}
-
func TestString(t *testing.T) {
runTests(t, dsn, func(dbt *DBTest) {
types := [6]string{"CHAR(255)", "VARCHAR(255)", "TINYTEXT", "TEXT", "MEDIUMTEXT", "LONGTEXT"}
@@ -482,281 +327,97 @@ func TestString(t *testing.T) {
})
}
-type timeTests struct {
- dbtype string
- tlayout string
- tests []timeTest
-}
-
-type timeTest struct {
- s string // leading "!": do not use t as value in queries
- t time.Time
-}
-
-type timeMode byte
-
-func (t timeMode) String() string {
- switch t {
- case binaryString:
- return "binary:string"
- case binaryTime:
- return "binary:time.Time"
- case textString:
- return "text:string"
- }
- panic("unsupported timeMode")
-}
-
-func (t timeMode) Binary() bool {
- switch t {
- case binaryString, binaryTime:
- return true
- }
- return false
-}
-
-const (
- binaryString timeMode = iota
- binaryTime
- textString
-)
-
-func (t timeTest) genQuery(dbtype string, mode timeMode) string {
- var inner string
- if mode.Binary() {
- inner = "?"
- } else {
- inner = `"%s"`
- }
- return `SELECT cast(` + inner + ` as ` + dbtype + `)`
-}
-
-func (t timeTest) run(dbt *DBTest, dbtype, tlayout string, mode timeMode) {
- var rows *sql.Rows
- query := t.genQuery(dbtype, mode)
- switch mode {
- case binaryString:
- rows = dbt.mustQuery(query, t.s)
- case binaryTime:
- rows = dbt.mustQuery(query, t.t)
- case textString:
- query = fmt.Sprintf(query, t.s)
- rows = dbt.mustQuery(query)
- default:
- panic("unsupported mode")
- }
- defer rows.Close()
- var err error
- if !rows.Next() {
- err = rows.Err()
- if err == nil {
- err = fmt.Errorf("no data")
- }
- dbt.Errorf("%s [%s]: %s", dbtype, mode, err)
- return
- }
- var dst interface{}
- err = rows.Scan(&dst)
- if err != nil {
- dbt.Errorf("%s [%s]: %s", dbtype, mode, err)
- return
- }
- switch val := dst.(type) {
- case []uint8:
- str := string(val)
- if str == t.s {
- return
- }
- if mode.Binary() && dbtype == "DATETIME" && len(str) == 26 && str[:19] == t.s {
- // a fix mainly for TravisCI:
- // accept full microsecond resolution in result for DATETIME columns
- // where the binary protocol was used
- return
- }
- dbt.Errorf("%s [%s] to string: expected %q, got %q",
- dbtype, mode,
- t.s, str,
- )
- case time.Time:
- if val == t.t {
- return
- }
- dbt.Errorf("%s [%s] to string: expected %q, got %q",
- dbtype, mode,
- t.s, val.Format(tlayout),
- )
- default:
- fmt.Printf("%#v\n", []interface{}{dbtype, tlayout, mode, t.s, t.t})
- dbt.Errorf("%s [%s]: unhandled type %T (is '%v')",
- dbtype, mode,
- val, val,
- )
- }
-}
-
func TestDateTime(t *testing.T) {
- afterTime := func(t time.Time, d string) time.Time {
- dur, err := time.ParseDuration(d)
- if err != nil {
- panic(err)
- }
- return t.Add(dur)
+ type testmode struct {
+ selectSuffix string
+ args []interface{}
}
- // NOTE: MySQL rounds DATETIME(x) up - but that's not included in the tests
- format := "2006-01-02 15:04:05.999999"
- t0 := time.Time{}
- tstr0 := "0000-00-00 00:00:00.000000"
- testcases := []timeTests{
- {"DATE", format[:10], []timeTest{
- {t: time.Date(2011, 11, 20, 0, 0, 0, 0, time.UTC)},
- {t: t0, s: tstr0[:10]},
- }},
- {"DATETIME", format[:19], []timeTest{
- {t: time.Date(2011, 11, 20, 21, 27, 37, 0, time.UTC)},
- {t: t0, s: tstr0[:19]},
- }},
- {"DATETIME(0)", format[:21], []timeTest{
- {t: time.Date(2011, 11, 20, 21, 27, 37, 0, time.UTC)},
- {t: t0, s: tstr0[:19]},
- }},
- {"DATETIME(1)", format[:21], []timeTest{
- {t: time.Date(2011, 11, 20, 21, 27, 37, 100000000, time.UTC)},
- {t: t0, s: tstr0[:21]},
- }},
- {"DATETIME(6)", format, []timeTest{
- {t: time.Date(2011, 11, 20, 21, 27, 37, 123456000, time.UTC)},
- {t: t0, s: tstr0},
- }},
- {"TIME", format[11:19], []timeTest{
- {t: afterTime(t0, "12345s")},
- {s: "!-12:34:56"},
- {s: "!-838:59:59"},
- {s: "!838:59:59"},
- {t: t0, s: tstr0[11:19]},
- }},
- {"TIME(0)", format[11:19], []timeTest{
- {t: afterTime(t0, "12345s")},
- {s: "!-12:34:56"},
- {s: "!-838:59:59"},
- {s: "!838:59:59"},
- {t: t0, s: tstr0[11:19]},
- }},
- {"TIME(1)", format[11:21], []timeTest{
- {t: afterTime(t0, "12345600ms")},
- {s: "!-12:34:56.7"},
- {s: "!-838:59:58.9"},
- {s: "!838:59:58.9"},
- {t: t0, s: tstr0[11:21]},
- }},
- {"TIME(6)", format[11:], []timeTest{
- {t: afterTime(t0, "1234567890123000ns")},
- {s: "!-12:34:56.789012"},
- {s: "!-838:59:58.999999"},
- {s: "!838:59:58.999999"},
- {t: t0, s: tstr0[11:]},
- }},
+ type timetest struct {
+ in interface{}
+ sOut string
+ tOut time.Time
+ tIsZero bool
}
- dsns := []string{
- dsn + "&parseTime=true",
- dsn + "&parseTime=false",
+ type tester func(dbt *DBTest, rows *sql.Rows,
+ test *timetest, sqltype, resulttype, mode string)
+ type setup struct {
+ vartype string
+ dsnSuffix string
+ test tester
}
- for _, testdsn := range dsns {
- runTests(t, testdsn, func(dbt *DBTest) {
- microsecsSupported := false
- zeroDateSupported := false
- var rows *sql.Rows
- var err error
- rows, err = dbt.db.Query(`SELECT cast("00:00:00.1" as TIME(1)) = "00:00:00.1"`)
- if err == nil {
- rows.Scan(&microsecsSupported)
- rows.Close()
- }
- rows, err = dbt.db.Query(`SELECT cast("0000-00-00" as DATE) = "0000-00-00"`)
- if err == nil {
- rows.Scan(&zeroDateSupported)
- rows.Close()
- }
- for _, setups := range testcases {
- if t := setups.dbtype; !microsecsSupported && t[len(t)-1:] == ")" {
- // skip fractional second tests if unsupported by server
- continue
+ var (
+ modes = map[string]*testmode{
+ "text": &testmode{},
+ "binary": &testmode{" WHERE 1 = ?", []interface{}{1}},
+ }
+ timetests = map[string][]*timetest{
+ "DATE": {
+ {sDate, sDate, tDate, false},
+ {sDate0, sDate0, tDate0, true},
+ {tDate, sDate, tDate, false},
+ {tDate0, sDate0, tDate0, true},
+ },
+ "DATETIME": {
+ {sDateTime, sDateTime, tDateTime, false},
+ {sDateTime0, sDateTime0, tDate0, true},
+ {tDateTime, sDateTime, tDateTime, false},
+ {tDate0, sDateTime0, tDate0, true},
+ },
+ }
+ setups = []*setup{
+ {"string", "&parseTime=false", func(
+ dbt *DBTest, rows *sql.Rows, test *timetest, sqltype, resulttype, mode string) {
+ var sOut string
+ if err := rows.Scan(&sOut); err != nil {
+ dbt.Errorf("%s (%s %s): %s", sqltype, resulttype, mode, err.Error())
+ } else if test.sOut != sOut {
+ dbt.Errorf("%s (%s %s): %s != %s", sqltype, resulttype, mode, test.sOut, sOut)
}
- for _, setup := range setups.tests {
- allowBinTime := true
- if setup.s == "" {
- // fill time string whereever Go can reliable produce it
- setup.s = setup.t.Format(setups.tlayout)
- } else if setup.s[0] == '!' {
- // skip tests using setup.t as source in queries
- allowBinTime = false
- // fix setup.s - remove the "!"
- setup.s = setup.s[1:]
- }
- if !zeroDateSupported && setup.s == tstr0[:len(setup.s)] {
- // skip disallowed 0000-00-00 date
- continue
- }
- setup.run(dbt, setups.dbtype, setups.tlayout, textString)
- setup.run(dbt, setups.dbtype, setups.tlayout, binaryString)
- if allowBinTime {
- setup.run(dbt, setups.dbtype, setups.tlayout, binaryTime)
+ }},
+ {"time.Time", "&parseTime=true", func(
+ dbt *DBTest, rows *sql.Rows, test *timetest, sqltype, resulttype, mode string) {
+ var tOut time.Time
+ if err := rows.Scan(&tOut); err != nil {
+ dbt.Errorf("%s (%s %s): %s", sqltype, resulttype, mode, err.Error())
+ } else if test.tOut != tOut || test.tIsZero != tOut.IsZero() {
+ dbt.Errorf("%s (%s %s): %s [%t] != %s [%t]", sqltype, resulttype, mode, test.tOut, test.tIsZero, tOut, tOut.IsZero())
+ }
+ }},
+ }
+ )
+
+ var s *setup
+ testTime := func(dbt *DBTest) {
+ var rows *sql.Rows
+ for sqltype, tests := range timetests {
+ dbt.mustExec("CREATE TABLE test (value " + sqltype + ")")
+ for _, test := range tests {
+ for mode, q := range modes {
+ dbt.mustExec("TRUNCATE test")
+ dbt.mustExec("INSERT INTO test VALUES (?)", test.in)
+ rows = dbt.mustQuery("SELECT value FROM test"+q.selectSuffix, q.args...)
+ if rows.Next() {
+ s.test(dbt, rows, test, sqltype, s.vartype, mode)
+ } else {
+ if err := rows.Err(); err != nil {
+ dbt.Errorf("%s (%s %s): %s",
+ sqltype, s.vartype, mode, err.Error())
+ } else {
+ dbt.Errorf("%s (%s %s): no data",
+ sqltype, s.vartype, mode)
+ }
}
}
}
- })
+ dbt.mustExec("DROP TABLE IF EXISTS test")
+ }
}
-}
-func TestTimestampMicros(t *testing.T) {
- format := "2006-01-02 15:04:05.999999"
- f0 := format[:19]
- f1 := format[:21]
- f6 := format[:26]
- runTests(t, dsn, func(dbt *DBTest) {
- // check if microseconds are supported.
- // Do not use timestamp(x) for that check - before 5.5.6, x would mean display width
- // and not precision.
- // Se last paragraph at http://dev.mysql.com/doc/refman/5.6/en/fractional-seconds.html
- microsecsSupported := false
- if rows, err := dbt.db.Query(`SELECT cast("00:00:00.1" as TIME(1)) = "00:00:00.1"`); err == nil {
- rows.Scan(&microsecsSupported)
- rows.Close()
- }
- if !microsecsSupported {
- // skip test
- return
- }
- _, err := dbt.db.Exec(`
- CREATE TABLE test (
- value0 TIMESTAMP NOT NULL DEFAULT '` + f0 + `',
- value1 TIMESTAMP(1) NOT NULL DEFAULT '` + f1 + `',
- value6 TIMESTAMP(6) NOT NULL DEFAULT '` + f6 + `'
- )`,
- )
- if err != nil {
- dbt.Error(err)
- }
- defer dbt.mustExec("DROP TABLE IF EXISTS test")
- dbt.mustExec("INSERT INTO test SET value0=?, value1=?, value6=?", f0, f1, f6)
- var res0, res1, res6 string
- rows := dbt.mustQuery("SELECT * FROM test")
- if !rows.Next() {
- dbt.Errorf("test contained no selectable values")
- }
- err = rows.Scan(&res0, &res1, &res6)
- if err != nil {
- dbt.Error(err)
- }
- if res0 != f0 {
- dbt.Errorf("expected %q, got %q", f0, res0)
- }
- if res1 != f1 {
- dbt.Errorf("expected %q, got %q", f1, res1)
- }
- if res6 != f6 {
- dbt.Errorf("expected %q, got %q", f6, res6)
- }
- })
+ timeDsn := dsn + "&sql_mode=ALLOW_INVALID_DATES"
+ for _, v := range setups {
+ s = v
+ runTests(t, timeDsn+s.dsnSuffix, testTime)
+ }
}
func TestNULL(t *testing.T) {
@@ -780,14 +441,14 @@ func TestNULL(t *testing.T) {
dbt.Fatal(err)
}
if nb.Valid {
- dbt.Error("valid NullBool which should be invalid")
+ dbt.Error("Valid NullBool which should be invalid")
}
// Valid
if err = nonNullStmt.QueryRow().Scan(&nb); err != nil {
dbt.Fatal(err)
}
if !nb.Valid {
- dbt.Error("invalid NullBool which should be valid")
+ dbt.Error("Invalid NullBool which should be valid")
} else if nb.Bool != true {
dbt.Errorf("Unexpected NullBool value: %t (should be true)", nb.Bool)
}
@@ -799,16 +460,16 @@ func TestNULL(t *testing.T) {
dbt.Fatal(err)
}
if nf.Valid {
- dbt.Error("valid NullFloat64 which should be invalid")
+ dbt.Error("Valid NullFloat64 which should be invalid")
}
// Valid
if err = nonNullStmt.QueryRow().Scan(&nf); err != nil {
dbt.Fatal(err)
}
if !nf.Valid {
- dbt.Error("invalid NullFloat64 which should be valid")
+ dbt.Error("Invalid NullFloat64 which should be valid")
} else if nf.Float64 != float64(1) {
- dbt.Errorf("unexpected NullFloat64 value: %f (should be 1.0)", nf.Float64)
+ dbt.Errorf("Unexpected NullFloat64 value: %f (should be 1.0)", nf.Float64)
}
// NullInt64
@@ -818,16 +479,16 @@ func TestNULL(t *testing.T) {
dbt.Fatal(err)
}
if ni.Valid {
- dbt.Error("valid NullInt64 which should be invalid")
+ dbt.Error("Valid NullInt64 which should be invalid")
}
// Valid
if err = nonNullStmt.QueryRow().Scan(&ni); err != nil {
dbt.Fatal(err)
}
if !ni.Valid {
- dbt.Error("invalid NullInt64 which should be valid")
+ dbt.Error("Invalid NullInt64 which should be valid")
} else if ni.Int64 != int64(1) {
- dbt.Errorf("unexpected NullInt64 value: %d (should be 1)", ni.Int64)
+ dbt.Errorf("Unexpected NullInt64 value: %d (should be 1)", ni.Int64)
}
// NullString
@@ -837,16 +498,16 @@ func TestNULL(t *testing.T) {
dbt.Fatal(err)
}
if ns.Valid {
- dbt.Error("valid NullString which should be invalid")
+ dbt.Error("Valid NullString which should be invalid")
}
// Valid
if err = nonNullStmt.QueryRow().Scan(&ns); err != nil {
dbt.Fatal(err)
}
if !ns.Valid {
- dbt.Error("invalid NullString which should be valid")
+ dbt.Error("Invalid NullString which should be valid")
} else if ns.String != `1` {
- dbt.Error("unexpected NullString value:" + ns.String + " (should be `1`)")
+ dbt.Error("Unexpected NullString value:" + ns.String + " (should be `1`)")
}
// nil-bytes
@@ -856,14 +517,14 @@ func TestNULL(t *testing.T) {
dbt.Fatal(err)
}
if b != nil {
- dbt.Error("non-nil []byte wich should be nil")
+ dbt.Error("Non-nil []byte wich should be nil")
}
// Read non-nil
if err = nonNullStmt.QueryRow().Scan(&b); err != nil {
dbt.Fatal(err)
}
if b == nil {
- dbt.Error("nil []byte wich should be non-nil")
+ dbt.Error("Nil []byte wich should be non-nil")
}
// Insert nil
b = nil
@@ -872,7 +533,7 @@ func TestNULL(t *testing.T) {
dbt.Fatal(err)
}
if !success {
- dbt.Error("inserting []byte(nil) as NULL failed")
+ dbt.Error("Inserting []byte(nil) as NULL failed")
}
// Check input==output with input==nil
b = nil
@@ -880,7 +541,7 @@ func TestNULL(t *testing.T) {
dbt.Fatal(err)
}
if b != nil {
- dbt.Error("non-nil echo from nil input")
+ dbt.Error("Non-nil echo from nil input")
}
// Check input==output with input!=nil
b = []byte("")
@@ -909,49 +570,6 @@ func TestNULL(t *testing.T) {
})
}
-func TestUint64(t *testing.T) {
- const (
- u0 = uint64(0)
- uall = ^u0
- uhigh = uall >> 1
- utop = ^uhigh
- s0 = int64(0)
- sall = ^s0
- shigh = int64(uhigh)
- stop = ^shigh
- )
- runTests(t, dsn, func(dbt *DBTest) {
- stmt, err := dbt.db.Prepare(`SELECT ?, ?, ? ,?, ?, ?, ?, ?`)
- if err != nil {
- dbt.Fatal(err)
- }
- defer stmt.Close()
- row := stmt.QueryRow(
- u0, uhigh, utop, uall,
- s0, shigh, stop, sall,
- )
-
- var ua, ub, uc, ud uint64
- var sa, sb, sc, sd int64
-
- err = row.Scan(&ua, &ub, &uc, &ud, &sa, &sb, &sc, &sd)
- if err != nil {
- dbt.Fatal(err)
- }
- switch {
- case ua != u0,
- ub != uhigh,
- uc != utop,
- ud != uall,
- sa != s0,
- sb != shigh,
- sc != stop,
- sd != sall:
- dbt.Fatal("unexpected result value")
- }
- })
-}
-
func TestLongData(t *testing.T) {
runTests(t, dsn, func(dbt *DBTest) {
var maxAllowedPacketSize int
@@ -1042,7 +660,7 @@ func TestLoadData(t *testing.T) {
dbt.Fatalf("%d != %d", i, id)
}
if values[i-1] != value {
- dbt.Fatalf("%q != %q", values[i-1], value)
+ dbt.Fatalf("%s != %s", values[i-1], value)
}
}
err = rows.Err()
@@ -1051,7 +669,7 @@ func TestLoadData(t *testing.T) {
}
if i != 4 {
- dbt.Fatalf("rows count mismatch. Got %d, want 4", i)
+ dbt.Fatalf("Rows count mismatch. Got %d, want 4", i)
}
}
file, err := ioutil.TempFile("", "gotest")
@@ -1067,13 +685,13 @@ func TestLoadData(t *testing.T) {
// Local File
RegisterLocalFile(file.Name())
- dbt.mustExec(fmt.Sprintf("LOAD DATA LOCAL INFILE %q INTO TABLE test", file.Name()))
+ dbt.mustExec(fmt.Sprintf("LOAD DATA LOCAL INFILE '%q' INTO TABLE test", file.Name()))
verifyLoadDataResult()
// negative test
_, err = dbt.db.Exec("LOAD DATA LOCAL INFILE 'doesnotexist' INTO TABLE test")
if err == nil {
- dbt.Fatal("load non-existent file didn't fail")
- } else if err.Error() != "local file 'doesnotexist' is not registered" {
+ dbt.Fatal("Load non-existent file didn't fail")
+ } else if err.Error() != "Local File 'doesnotexist' is not registered. Use the DSN parameter 'allowAllFiles=true' to allow all files" {
dbt.Fatal(err.Error())
}
@@ -1093,7 +711,7 @@ func TestLoadData(t *testing.T) {
// negative test
_, err = dbt.db.Exec("LOAD DATA LOCAL INFILE 'Reader::doesnotexist' INTO TABLE test")
if err == nil {
- dbt.Fatal("load non-existent Reader didn't fail")
+ dbt.Fatal("Load non-existent Reader didn't fail")
} else if err.Error() != "Reader 'doesnotexist' is not registered" {
dbt.Fatal(err.Error())
}
@@ -1147,18 +765,7 @@ func TestFoundRows(t *testing.T) {
func TestStrict(t *testing.T) {
// ALLOW_INVALID_DATES to get rid of stricter modes - we want to test for warnings, not errors
- relaxedDsn := dsn + "&sql_mode='ALLOW_INVALID_DATES,NO_AUTO_CREATE_USER'"
- // make sure the MySQL version is recent enough with a separate connection
- // before running the test
- conn, err := MySQLDriver{}.Open(relaxedDsn)
- if conn != nil {
- conn.Close()
- }
- if me, ok := err.(*MySQLError); ok && me.Number == 1231 {
- // Error 1231: Variable 'sql_mode' can't be set to the value of 'ALLOW_INVALID_DATES'
- // => skip test, MySQL server version is too old
- return
- }
+ relaxedDsn := dsn + "&sql_mode=ALLOW_INVALID_DATES"
runTests(t, relaxedDsn, func(dbt *DBTest) {
dbt.mustExec("CREATE TABLE test (a TINYINT NOT NULL, b CHAR(4))")
@@ -1173,7 +780,7 @@ func TestStrict(t *testing.T) {
var checkWarnings = func(err error, mode string, idx int) {
if err == nil {
- dbt.Errorf("expected STRICT error on query [%s] %s", mode, queries[idx].in)
+ dbt.Errorf("Expected STRICT error on query [%s] %s", mode, queries[idx].in)
}
if warnings, ok := err.(MySQLWarnings); ok {
@@ -1182,18 +789,18 @@ func TestStrict(t *testing.T) {
codes[i] = warnings[i].Code
}
if len(codes) != len(queries[idx].codes) {
- dbt.Errorf("unexpected STRICT error count on query [%s] %s: Wanted %v, Got %v", mode, queries[idx].in, queries[idx].codes, codes)
+ dbt.Errorf("Unexpected STRICT error count on query [%s] %s: Wanted %v, Got %v", mode, queries[idx].in, queries[idx].codes, codes)
}
for i := range warnings {
if codes[i] != queries[idx].codes[i] {
- dbt.Errorf("unexpected STRICT error codes on query [%s] %s: Wanted %v, Got %v", mode, queries[idx].in, queries[idx].codes, codes)
+ dbt.Errorf("Unexpected STRICT error codes on query [%s] %s: Wanted %v, Got %v", mode, queries[idx].in, queries[idx].codes, codes)
return
}
}
} else {
- dbt.Errorf("unexpected error on query [%s] %s: %s", mode, queries[idx].in, err.Error())
+ dbt.Errorf("Unexpected error on query [%s] %s: %s", mode, queries[idx].in, err.Error())
}
}
@@ -1209,7 +816,7 @@ func TestStrict(t *testing.T) {
for i := range queries {
stmt, err = dbt.db.Prepare(queries[i].in)
if err != nil {
- dbt.Errorf("error on preparing query %s: %s", queries[i].in, err.Error())
+ dbt.Errorf("Error on preparing query %s: %s", queries[i].in, err.Error())
}
_, err = stmt.Exec()
@@ -1217,7 +824,7 @@ func TestStrict(t *testing.T) {
err = stmt.Close()
if err != nil {
- dbt.Errorf("error on closing stmt for query %s: %s", queries[i].in, err.Error())
+ dbt.Errorf("Error on closing stmt for query %s: %s", queries[i].in, err.Error())
}
}
})
@@ -1227,9 +834,9 @@ func TestTLS(t *testing.T) {
tlsTest := func(dbt *DBTest) {
if err := dbt.db.Ping(); err != nil {
if err == ErrNoTLS {
- dbt.Skip("server does not support TLS")
+ dbt.Skip("Server does not support TLS")
} else {
- dbt.Fatalf("error on Ping: %s", err.Error())
+ dbt.Fatalf("Error on Ping: %s", err.Error())
}
}
@@ -1242,7 +849,7 @@ func TestTLS(t *testing.T) {
}
if value == nil {
- dbt.Fatal("no Cipher")
+ dbt.Fatal("No Cipher")
}
}
}
@@ -1259,42 +866,42 @@ func TestTLS(t *testing.T) {
func TestReuseClosedConnection(t *testing.T) {
// this test does not use sql.database, it uses the driver directly
if !available {
- t.Skipf("MySQL server not running on %s", netAddr)
+ t.Skipf("MySQL-Server not running on %s", netAddr)
}
md := &MySQLDriver{}
conn, err := md.Open(dsn)
if err != nil {
- t.Fatalf("error connecting: %s", err.Error())
+ t.Fatalf("Error connecting: %s", err.Error())
}
stmt, err := conn.Prepare("DO 1")
if err != nil {
- t.Fatalf("error preparing statement: %s", err.Error())
+ t.Fatalf("Error preparing statement: %s", err.Error())
}
_, err = stmt.Exec(nil)
if err != nil {
- t.Fatalf("error executing statement: %s", err.Error())
+ t.Fatalf("Error executing statement: %s", err.Error())
}
err = conn.Close()
if err != nil {
- t.Fatalf("error closing connection: %s", err.Error())
+ t.Fatalf("Error closing connection: %s", err.Error())
}
defer func() {
if err := recover(); err != nil {
- t.Errorf("panic after reusing a closed connection: %v", err)
+ t.Errorf("Panic after reusing a closed connection: %v", err)
}
}()
_, err = stmt.Exec(nil)
if err != nil && err != driver.ErrBadConn {
- t.Errorf("unexpected error '%s', expected '%s'",
+ t.Errorf("Unexpected error '%s', expected '%s'",
err.Error(), driver.ErrBadConn.Error())
}
}
func TestCharset(t *testing.T) {
if !available {
- t.Skipf("MySQL server not running on %s", netAddr)
+ t.Skipf("MySQL-Server not running on %s", netAddr)
}
mustSetCharset := func(charsetParam, expected string) {
@@ -1303,14 +910,14 @@ func TestCharset(t *testing.T) {
defer rows.Close()
if !rows.Next() {
- dbt.Fatalf("error getting connection charset: %s", rows.Err())
+ dbt.Fatalf("Error getting connection charset: %s", rows.Err())
}
var got string
rows.Scan(&got)
if got != expected {
- dbt.Fatalf("expected connection charset %s but got %s", expected, got)
+ dbt.Fatalf("Expected connection charset %s but got %s", expected, got)
}
})
}
@@ -1332,14 +939,14 @@ func TestFailingCharset(t *testing.T) {
_, err := dbt.db.Exec("SELECT 1")
if err == nil {
dbt.db.Close()
- t.Fatalf("connection must not succeed without a valid charset")
+ t.Fatalf("Connection must not succeed without a valid charset")
}
})
}
func TestCollation(t *testing.T) {
if !available {
- t.Skipf("MySQL server not running on %s", netAddr)
+ t.Skipf("MySQL-Server not running on %s", netAddr)
}
defaultCollation := "utf8_general_ci"
@@ -1349,7 +956,7 @@ func TestCollation(t *testing.T) {
"latin1_general_ci",
"binary",
"utf8_unicode_ci",
- "cp1257_bin",
+ "utf8mb4_general_ci",
}
for _, collation := range testCollations {
@@ -1369,36 +976,12 @@ func TestCollation(t *testing.T) {
}
if got != expected {
- dbt.Fatalf("expected connection collation %s but got %s", expected, got)
+ dbt.Fatalf("Expected connection collation %s but got %s", expected, got)
}
})
}
}
-func TestColumnsWithAlias(t *testing.T) {
- runTests(t, dsn+"&columnsWithAlias=true", func(dbt *DBTest) {
- rows := dbt.mustQuery("SELECT 1 AS A")
- defer rows.Close()
- cols, _ := rows.Columns()
- if len(cols) != 1 {
- t.Fatalf("expected 1 column, got %d", len(cols))
- }
- if cols[0] != "A" {
- t.Fatalf("expected column name \"A\", got \"%s\"", cols[0])
- }
- rows.Close()
-
- rows = dbt.mustQuery("SELECT * FROM (SELECT 1 AS one) AS A")
- cols, _ = rows.Columns()
- if len(cols) != 1 {
- t.Fatalf("expected 1 column, got %d", len(cols))
- }
- if cols[0] != "A.one" {
- t.Fatalf("expected column name \"A.one\", got \"%s\"", cols[0])
- }
- })
-}
-
func TestRawBytesResultExceedsBuffer(t *testing.T) {
runTests(t, dsn, func(dbt *DBTest) {
// defaultBufSize from buffer.go
@@ -1428,26 +1011,26 @@ func TestTimezoneConversion(t *testing.T) {
// Insert local time into database (should be converted)
usCentral, _ := time.LoadLocation("US/Central")
- reftime := time.Date(2014, 05, 30, 18, 03, 17, 0, time.UTC).In(usCentral)
- dbt.mustExec("INSERT INTO test VALUE (?)", reftime)
+ now := time.Now().In(usCentral)
+ dbt.mustExec("INSERT INTO test VALUE (?)", now)
// Retrieve time from DB
rows := dbt.mustQuery("SELECT ts FROM test")
if !rows.Next() {
- dbt.Fatal("did not get any rows out")
+ dbt.Fatal("Didn't get any rows out")
}
- var dbTime time.Time
- err := rows.Scan(&dbTime)
+ var nowDB time.Time
+ err := rows.Scan(&nowDB)
if err != nil {
dbt.Fatal("Err", err)
}
// Check that dates match
- if reftime.Unix() != dbTime.Unix() {
- dbt.Errorf("times do not match.\n")
- dbt.Errorf(" Now(%v)=%v\n", usCentral, reftime)
- dbt.Errorf(" Now(UTC)=%v\n", dbTime)
+ if now.Unix() != nowDB.Unix() {
+ dbt.Errorf("Times don't match.\n")
+ dbt.Errorf(" Now(%v)=%v\n", usCentral, now)
+ dbt.Errorf(" Now(UTC)=%v\n", nowDB)
}
}
@@ -1456,6 +1039,42 @@ func TestTimezoneConversion(t *testing.T) {
}
}
+// This tests for https://github.com/go-sql-driver/mysql/pull/139
+//
+// An extra (invisible) nil byte was being added to the beginning of positive
+// time strings.
+func TestTimeSign(t *testing.T) {
+ runTests(t, dsn, func(dbt *DBTest) {
+ var sTimes = []struct {
+ value string
+ fieldType string
+ }{
+ {"12:34:56", "TIME"},
+ {"-12:34:56", "TIME"},
+ // As described in http://dev.mysql.com/doc/refman/5.6/en/fractional-seconds.html
+ // they *should* work, but only in 5.6+.
+ // { "12:34:56.789", "TIME(3)" },
+ // { "-12:34:56.789", "TIME(3)" },
+ }
+
+ for _, sTime := range sTimes {
+ dbt.db.Exec("DROP TABLE IF EXISTS test")
+ dbt.mustExec("CREATE TABLE test (id INT, time_field " + sTime.fieldType + ")")
+ dbt.mustExec("INSERT INTO test (id, time_field) VALUES(1, '" + sTime.value + "')")
+ rows := dbt.mustQuery("SELECT time_field FROM test WHERE id = ?", 1)
+ if rows.Next() {
+ var oTime string
+ rows.Scan(&oTime)
+ if oTime != sTime.value {
+ dbt.Errorf(`time values differ: got %q, expected %q.`, oTime, sTime.value)
+ }
+ } else {
+ dbt.Error("expecting at least one row.")
+ }
+ }
+ })
+}
+
// Special cases
func TestRowsClose(t *testing.T) {
@@ -1471,7 +1090,7 @@ func TestRowsClose(t *testing.T) {
}
if rows.Next() {
- dbt.Fatal("unexpected row after rows.Close()")
+ dbt.Fatal("Unexpected row after rows.Close()")
}
err = rows.Err()
@@ -1503,7 +1122,7 @@ func TestCloseStmtBeforeRows(t *testing.T) {
}
if !rows.Next() {
- dbt.Fatal("getting row failed")
+ dbt.Fatal("Getting row failed")
} else {
err = rows.Err()
if err != nil {
@@ -1513,7 +1132,7 @@ func TestCloseStmtBeforeRows(t *testing.T) {
var out bool
err = rows.Scan(&out)
if err != nil {
- dbt.Fatalf("error on rows.Scan(): %s", err.Error())
+ dbt.Fatalf("Error on rows.Scan(): %s", err.Error())
}
if out != true {
dbt.Errorf("true != %t", out)
@@ -1549,7 +1168,7 @@ func TestStmtMultiRows(t *testing.T) {
// 1
if !rows1.Next() {
- dbt.Fatal("first rows1.Next failed")
+ dbt.Fatal("1st rows1.Next failed")
} else {
err = rows1.Err()
if err != nil {
@@ -1558,7 +1177,7 @@ func TestStmtMultiRows(t *testing.T) {
err = rows1.Scan(&out)
if err != nil {
- dbt.Fatalf("error on rows.Scan(): %s", err.Error())
+ dbt.Fatalf("Error on rows.Scan(): %s", err.Error())
}
if out != true {
dbt.Errorf("true != %t", out)
@@ -1566,7 +1185,7 @@ func TestStmtMultiRows(t *testing.T) {
}
if !rows2.Next() {
- dbt.Fatal("first rows2.Next failed")
+ dbt.Fatal("1st rows2.Next failed")
} else {
err = rows2.Err()
if err != nil {
@@ -1575,7 +1194,7 @@ func TestStmtMultiRows(t *testing.T) {
err = rows2.Scan(&out)
if err != nil {
- dbt.Fatalf("error on rows.Scan(): %s", err.Error())
+ dbt.Fatalf("Error on rows.Scan(): %s", err.Error())
}
if out != true {
dbt.Errorf("true != %t", out)
@@ -1584,7 +1203,7 @@ func TestStmtMultiRows(t *testing.T) {
// 2
if !rows1.Next() {
- dbt.Fatal("second rows1.Next failed")
+ dbt.Fatal("2nd rows1.Next failed")
} else {
err = rows1.Err()
if err != nil {
@@ -1593,14 +1212,14 @@ func TestStmtMultiRows(t *testing.T) {
err = rows1.Scan(&out)
if err != nil {
- dbt.Fatalf("error on rows.Scan(): %s", err.Error())
+ dbt.Fatalf("Error on rows.Scan(): %s", err.Error())
}
if out != false {
dbt.Errorf("false != %t", out)
}
if rows1.Next() {
- dbt.Fatal("unexpected row on rows1")
+ dbt.Fatal("Unexpected row on rows1")
}
err = rows1.Close()
if err != nil {
@@ -1609,7 +1228,7 @@ func TestStmtMultiRows(t *testing.T) {
}
if !rows2.Next() {
- dbt.Fatal("second rows2.Next failed")
+ dbt.Fatal("2nd rows2.Next failed")
} else {
err = rows2.Err()
if err != nil {
@@ -1618,14 +1237,14 @@ func TestStmtMultiRows(t *testing.T) {
err = rows2.Scan(&out)
if err != nil {
- dbt.Fatalf("error on rows.Scan(): %s", err.Error())
+ dbt.Fatalf("Error on rows.Scan(): %s", err.Error())
}
if out != false {
dbt.Errorf("false != %t", out)
}
if rows2.Next() {
- dbt.Fatal("unexpected row on rows2")
+ dbt.Fatal("Unexpected row on rows2")
}
err = rows2.Close()
if err != nil {
@@ -1670,7 +1289,7 @@ func TestConcurrent(t *testing.T) {
if err != nil {
dbt.Fatalf("%s", err.Error())
}
- dbt.Logf("testing up to %d concurrent connections \r\n", max)
+ dbt.Logf("Testing up to %d concurrent connections \r\n", max)
var remaining, succeeded int32 = int32(max), 0
@@ -1694,7 +1313,7 @@ func TestConcurrent(t *testing.T) {
if err != nil {
if err.Error() != "Error 1040: Too many connections" {
- fatalf("error on conn %d: %s", id, err.Error())
+ fatalf("Error on Conn %d: %s", id, err.Error())
}
return
}
@@ -1702,13 +1321,13 @@ func TestConcurrent(t *testing.T) {
// keep the connection busy until all connections are open
for remaining > 0 {
if _, err = tx.Exec("DO 1"); err != nil {
- fatalf("error on conn %d: %s", id, err.Error())
+ fatalf("Error on Conn %d: %s", id, err.Error())
return
}
}
if err = tx.Commit(); err != nil {
- fatalf("error on conn %d: %s", id, err.Error())
+ fatalf("Error on Conn %d: %s", id, err.Error())
return
}
@@ -1724,14 +1343,14 @@ func TestConcurrent(t *testing.T) {
dbt.Fatal(fatalError)
}
- dbt.Logf("reached %d concurrent connections\r\n", succeeded)
+ dbt.Logf("Reached %d concurrent connections\r\n", succeeded)
})
}
// Tests custom dial functions
func TestCustomDial(t *testing.T) {
if !available {
- t.Skipf("MySQL server not running on %s", netAddr)
+ t.Skipf("MySQL-Server not running on %s", netAddr)
}
// our custom dial function which justs wraps net.Dial here
@@ -1741,117 +1360,11 @@ func TestCustomDial(t *testing.T) {
db, err := sql.Open("mysql", fmt.Sprintf("%s:%s@mydial(%s)/%s?timeout=30s&strict=true", user, pass, addr, dbname))
if err != nil {
- t.Fatalf("error connecting: %s", err.Error())
+ t.Fatalf("Error connecting: %s", err.Error())
}
defer db.Close()
if _, err = db.Exec("DO 1"); err != nil {
- t.Fatalf("connection failed: %s", err.Error())
- }
-}
-
-func TestSQLInjection(t *testing.T) {
- createTest := func(arg string) func(dbt *DBTest) {
- return func(dbt *DBTest) {
- dbt.mustExec("CREATE TABLE test (v INTEGER)")
- dbt.mustExec("INSERT INTO test VALUES (?)", 1)
-
- var v int
- // NULL can't be equal to anything, the idea here is to inject query so it returns row
- // This test verifies that escapeQuotes and escapeBackslash are working properly
- err := dbt.db.QueryRow("SELECT v FROM test WHERE NULL = ?", arg).Scan(&v)
- if err == sql.ErrNoRows {
- return // success, sql injection failed
- } else if err == nil {
- dbt.Errorf("sql injection successful with arg: %s", arg)
- } else {
- dbt.Errorf("error running query with arg: %s; err: %s", arg, err.Error())
- }
- }
- }
-
- dsns := []string{
- dsn,
- dsn + "&sql_mode='NO_BACKSLASH_ESCAPES,NO_AUTO_CREATE_USER'",
- }
- for _, testdsn := range dsns {
- runTests(t, testdsn, createTest("1 OR 1=1"))
- runTests(t, testdsn, createTest("' OR '1'='1"))
- }
-}
-
-// Test if inserted data is correctly retrieved after being escaped
-func TestInsertRetrieveEscapedData(t *testing.T) {
- testData := func(dbt *DBTest) {
- dbt.mustExec("CREATE TABLE test (v VARCHAR(255))")
-
- // All sequences that are escaped by escapeQuotes and escapeBackslash
- v := "foo \x00\n\r\x1a\"'\\"
- dbt.mustExec("INSERT INTO test VALUES (?)", v)
-
- var out string
- err := dbt.db.QueryRow("SELECT v FROM test").Scan(&out)
- if err != nil {
- dbt.Fatalf("%s", err.Error())
- }
-
- if out != v {
- dbt.Errorf("%q != %q", out, v)
- }
+ t.Fatalf("Connection failed: %s", err.Error())
}
-
- dsns := []string{
- dsn,
- dsn + "&sql_mode='NO_BACKSLASH_ESCAPES,NO_AUTO_CREATE_USER'",
- }
- for _, testdsn := range dsns {
- runTests(t, testdsn, testData)
- }
-}
-
-func TestUnixSocketAuthFail(t *testing.T) {
- runTests(t, dsn, func(dbt *DBTest) {
- // Save the current logger so we can restore it.
- oldLogger := errLog
-
- // Set a new logger so we can capture its output.
- buffer := bytes.NewBuffer(make([]byte, 0, 64))
- newLogger := log.New(buffer, "prefix: ", 0)
- SetLogger(newLogger)
-
- // Restore the logger.
- defer SetLogger(oldLogger)
-
- // Make a new DSN that uses the MySQL socket file and a bad password, which
- // we can make by simply appending any character to the real password.
- badPass := pass + "x"
- socket := ""
- if prot == "unix" {
- socket = addr
- } else {
- // Get socket file from MySQL.
- err := dbt.db.QueryRow("SELECT @@socket").Scan(&socket)
- if err != nil {
- t.Fatalf("error on SELECT @@socket: %s", err.Error())
- }
- }
- t.Logf("socket: %s", socket)
- badDSN := fmt.Sprintf("%s:%s@unix(%s)/%s?timeout=30s&strict=true", user, badPass, socket, dbname)
- db, err := sql.Open("mysql", badDSN)
- if err != nil {
- t.Fatalf("error connecting: %s", err.Error())
- }
- defer db.Close()
-
- // Connect to MySQL for real. This will cause an auth failure.
- err = db.Ping()
- if err == nil {
- t.Error("expected Ping() to return an error")
- }
-
- // The driver should not log anything.
- if actual := buffer.String(); actual != "" {
- t.Errorf("expected no output, got %q", actual)
- }
- })
}
diff --git a/vendor/github.com/go-sql-driver/mysql/dsn.go b/vendor/github.com/go-sql-driver/mysql/dsn.go
deleted file mode 100644
index 73138bc57..000000000
--- a/vendor/github.com/go-sql-driver/mysql/dsn.go
+++ /dev/null
@@ -1,513 +0,0 @@
-// Go MySQL Driver - A MySQL-Driver for Go's database/sql package
-//
-// Copyright 2016 The Go-MySQL-Driver Authors. All rights reserved.
-//
-// This Source Code Form is subject to the terms of the Mozilla Public
-// License, v. 2.0. If a copy of the MPL was not distributed with this file,
-// You can obtain one at http://mozilla.org/MPL/2.0/.
-
-package mysql
-
-import (
- "bytes"
- "crypto/tls"
- "errors"
- "fmt"
- "net"
- "net/url"
- "strings"
- "time"
-)
-
-var (
- errInvalidDSNUnescaped = errors.New("invalid DSN: did you forget to escape a param value?")
- errInvalidDSNAddr = errors.New("invalid DSN: network address not terminated (missing closing brace)")
- errInvalidDSNNoSlash = errors.New("invalid DSN: missing the slash separating the database name")
- errInvalidDSNUnsafeCollation = errors.New("invalid DSN: interpolateParams can not be used with unsafe collations")
-)
-
-// Config is a configuration parsed from a DSN string
-type Config struct {
- User string // Username
- Passwd string // Password (requires User)
- Net string // Network type
- Addr string // Network address (requires Net)
- DBName string // Database name
- Params map[string]string // Connection parameters
- Collation string // Connection collation
- Loc *time.Location // Location for time.Time values
- TLSConfig string // TLS configuration name
- tls *tls.Config // TLS configuration
- Timeout time.Duration // Dial timeout
- ReadTimeout time.Duration // I/O read timeout
- WriteTimeout time.Duration // I/O write timeout
-
- AllowAllFiles bool // Allow all files to be used with LOAD DATA LOCAL INFILE
- AllowCleartextPasswords bool // Allows the cleartext client side plugin
- AllowOldPasswords bool // Allows the old insecure password method
- ClientFoundRows bool // Return number of matching rows instead of rows changed
- ColumnsWithAlias bool // Prepend table alias to column names
- InterpolateParams bool // Interpolate placeholders into query string
- MultiStatements bool // Allow multiple statements in one query
- ParseTime bool // Parse time values to time.Time
- Strict bool // Return warnings as errors
-}
-
-// FormatDSN formats the given Config into a DSN string which can be passed to
-// the driver.
-func (cfg *Config) FormatDSN() string {
- var buf bytes.Buffer
-
- // [username[:password]@]
- if len(cfg.User) > 0 {
- buf.WriteString(cfg.User)
- if len(cfg.Passwd) > 0 {
- buf.WriteByte(':')
- buf.WriteString(cfg.Passwd)
- }
- buf.WriteByte('@')
- }
-
- // [protocol[(address)]]
- if len(cfg.Net) > 0 {
- buf.WriteString(cfg.Net)
- if len(cfg.Addr) > 0 {
- buf.WriteByte('(')
- buf.WriteString(cfg.Addr)
- buf.WriteByte(')')
- }
- }
-
- // /dbname
- buf.WriteByte('/')
- buf.WriteString(cfg.DBName)
-
- // [?param1=value1&...&paramN=valueN]
- hasParam := false
-
- if cfg.AllowAllFiles {
- hasParam = true
- buf.WriteString("?allowAllFiles=true")
- }
-
- if cfg.AllowCleartextPasswords {
- if hasParam {
- buf.WriteString("&allowCleartextPasswords=true")
- } else {
- hasParam = true
- buf.WriteString("?allowCleartextPasswords=true")
- }
- }
-
- if cfg.AllowOldPasswords {
- if hasParam {
- buf.WriteString("&allowOldPasswords=true")
- } else {
- hasParam = true
- buf.WriteString("?allowOldPasswords=true")
- }
- }
-
- if cfg.ClientFoundRows {
- if hasParam {
- buf.WriteString("&clientFoundRows=true")
- } else {
- hasParam = true
- buf.WriteString("?clientFoundRows=true")
- }
- }
-
- if col := cfg.Collation; col != defaultCollation && len(col) > 0 {
- if hasParam {
- buf.WriteString("&collation=")
- } else {
- hasParam = true
- buf.WriteString("?collation=")
- }
- buf.WriteString(col)
- }
-
- if cfg.ColumnsWithAlias {
- if hasParam {
- buf.WriteString("&columnsWithAlias=true")
- } else {
- hasParam = true
- buf.WriteString("?columnsWithAlias=true")
- }
- }
-
- if cfg.InterpolateParams {
- if hasParam {
- buf.WriteString("&interpolateParams=true")
- } else {
- hasParam = true
- buf.WriteString("?interpolateParams=true")
- }
- }
-
- if cfg.Loc != time.UTC && cfg.Loc != nil {
- if hasParam {
- buf.WriteString("&loc=")
- } else {
- hasParam = true
- buf.WriteString("?loc=")
- }
- buf.WriteString(url.QueryEscape(cfg.Loc.String()))
- }
-
- if cfg.MultiStatements {
- if hasParam {
- buf.WriteString("&multiStatements=true")
- } else {
- hasParam = true
- buf.WriteString("?multiStatements=true")
- }
- }
-
- if cfg.ParseTime {
- if hasParam {
- buf.WriteString("&parseTime=true")
- } else {
- hasParam = true
- buf.WriteString("?parseTime=true")
- }
- }
-
- if cfg.ReadTimeout > 0 {
- if hasParam {
- buf.WriteString("&readTimeout=")
- } else {
- hasParam = true
- buf.WriteString("?readTimeout=")
- }
- buf.WriteString(cfg.ReadTimeout.String())
- }
-
- if cfg.Strict {
- if hasParam {
- buf.WriteString("&strict=true")
- } else {
- hasParam = true
- buf.WriteString("?strict=true")
- }
- }
-
- if cfg.Timeout > 0 {
- if hasParam {
- buf.WriteString("&timeout=")
- } else {
- hasParam = true
- buf.WriteString("?timeout=")
- }
- buf.WriteString(cfg.Timeout.String())
- }
-
- if len(cfg.TLSConfig) > 0 {
- if hasParam {
- buf.WriteString("&tls=")
- } else {
- hasParam = true
- buf.WriteString("?tls=")
- }
- buf.WriteString(url.QueryEscape(cfg.TLSConfig))
- }
-
- if cfg.WriteTimeout > 0 {
- if hasParam {
- buf.WriteString("&writeTimeout=")
- } else {
- hasParam = true
- buf.WriteString("?writeTimeout=")
- }
- buf.WriteString(cfg.WriteTimeout.String())
- }
-
- // other params
- if cfg.Params != nil {
- for param, value := range cfg.Params {
- if hasParam {
- buf.WriteByte('&')
- } else {
- hasParam = true
- buf.WriteByte('?')
- }
-
- buf.WriteString(param)
- buf.WriteByte('=')
- buf.WriteString(url.QueryEscape(value))
- }
- }
-
- return buf.String()
-}
-
-// ParseDSN parses the DSN string to a Config
-func ParseDSN(dsn string) (cfg *Config, err error) {
- // New config with some default values
- cfg = &Config{
- Loc: time.UTC,
- Collation: defaultCollation,
- }
-
- // [user[:password]@][net[(addr)]]/dbname[?param1=value1&paramN=valueN]
- // Find the last '/' (since the password or the net addr might contain a '/')
- foundSlash := false
- for i := len(dsn) - 1; i >= 0; i-- {
- if dsn[i] == '/' {
- foundSlash = true
- var j, k int
-
- // left part is empty if i <= 0
- if i > 0 {
- // [username[:password]@][protocol[(address)]]
- // Find the last '@' in dsn[:i]
- for j = i; j >= 0; j-- {
- if dsn[j] == '@' {
- // username[:password]
- // Find the first ':' in dsn[:j]
- for k = 0; k < j; k++ {
- if dsn[k] == ':' {
- cfg.Passwd = dsn[k+1 : j]
- break
- }
- }
- cfg.User = dsn[:k]
-
- break
- }
- }
-
- // [protocol[(address)]]
- // Find the first '(' in dsn[j+1:i]
- for k = j + 1; k < i; k++ {
- if dsn[k] == '(' {
- // dsn[i-1] must be == ')' if an address is specified
- if dsn[i-1] != ')' {
- if strings.ContainsRune(dsn[k+1:i], ')') {
- return nil, errInvalidDSNUnescaped
- }
- return nil, errInvalidDSNAddr
- }
- cfg.Addr = dsn[k+1 : i-1]
- break
- }
- }
- cfg.Net = dsn[j+1 : k]
- }
-
- // dbname[?param1=value1&...&paramN=valueN]
- // Find the first '?' in dsn[i+1:]
- for j = i + 1; j < len(dsn); j++ {
- if dsn[j] == '?' {
- if err = parseDSNParams(cfg, dsn[j+1:]); err != nil {
- return
- }
- break
- }
- }
- cfg.DBName = dsn[i+1 : j]
-
- break
- }
- }
-
- if !foundSlash && len(dsn) > 0 {
- return nil, errInvalidDSNNoSlash
- }
-
- if cfg.InterpolateParams && unsafeCollations[cfg.Collation] {
- return nil, errInvalidDSNUnsafeCollation
- }
-
- // Set default network if empty
- if cfg.Net == "" {
- cfg.Net = "tcp"
- }
-
- // Set default address if empty
- if cfg.Addr == "" {
- switch cfg.Net {
- case "tcp":
- cfg.Addr = "127.0.0.1:3306"
- case "unix":
- cfg.Addr = "/tmp/mysql.sock"
- default:
- return nil, errors.New("default addr for network '" + cfg.Net + "' unknown")
- }
-
- }
-
- return
-}
-
-// parseDSNParams parses the DSN "query string"
-// Values must be url.QueryEscape'ed
-func parseDSNParams(cfg *Config, params string) (err error) {
- for _, v := range strings.Split(params, "&") {
- param := strings.SplitN(v, "=", 2)
- if len(param) != 2 {
- continue
- }
-
- // cfg params
- switch value := param[1]; param[0] {
-
- // Disable INFILE whitelist / enable all files
- case "allowAllFiles":
- var isBool bool
- cfg.AllowAllFiles, isBool = readBool(value)
- if !isBool {
- return errors.New("invalid bool value: " + value)
- }
-
- // Use cleartext authentication mode (MySQL 5.5.10+)
- case "allowCleartextPasswords":
- var isBool bool
- cfg.AllowCleartextPasswords, isBool = readBool(value)
- if !isBool {
- return errors.New("invalid bool value: " + value)
- }
-
- // Use old authentication mode (pre MySQL 4.1)
- case "allowOldPasswords":
- var isBool bool
- cfg.AllowOldPasswords, isBool = readBool(value)
- if !isBool {
- return errors.New("invalid bool value: " + value)
- }
-
- // Switch "rowsAffected" mode
- case "clientFoundRows":
- var isBool bool
- cfg.ClientFoundRows, isBool = readBool(value)
- if !isBool {
- return errors.New("invalid bool value: " + value)
- }
-
- // Collation
- case "collation":
- cfg.Collation = value
- break
-
- case "columnsWithAlias":
- var isBool bool
- cfg.ColumnsWithAlias, isBool = readBool(value)
- if !isBool {
- return errors.New("invalid bool value: " + value)
- }
-
- // Compression
- case "compress":
- return errors.New("compression not implemented yet")
-
- // Enable client side placeholder substitution
- case "interpolateParams":
- var isBool bool
- cfg.InterpolateParams, isBool = readBool(value)
- if !isBool {
- return errors.New("invalid bool value: " + value)
- }
-
- // Time Location
- case "loc":
- if value, err = url.QueryUnescape(value); err != nil {
- return
- }
- cfg.Loc, err = time.LoadLocation(value)
- if err != nil {
- return
- }
-
- // multiple statements in one query
- case "multiStatements":
- var isBool bool
- cfg.MultiStatements, isBool = readBool(value)
- if !isBool {
- return errors.New("invalid bool value: " + value)
- }
-
- // time.Time parsing
- case "parseTime":
- var isBool bool
- cfg.ParseTime, isBool = readBool(value)
- if !isBool {
- return errors.New("invalid bool value: " + value)
- }
-
- // I/O read Timeout
- case "readTimeout":
- cfg.ReadTimeout, err = time.ParseDuration(value)
- if err != nil {
- return
- }
-
- // Strict mode
- case "strict":
- var isBool bool
- cfg.Strict, isBool = readBool(value)
- if !isBool {
- return errors.New("invalid bool value: " + value)
- }
-
- // Dial Timeout
- case "timeout":
- cfg.Timeout, err = time.ParseDuration(value)
- if err != nil {
- return
- }
-
- // TLS-Encryption
- case "tls":
- boolValue, isBool := readBool(value)
- if isBool {
- if boolValue {
- cfg.TLSConfig = "true"
- cfg.tls = &tls.Config{}
- } else {
- cfg.TLSConfig = "false"
- }
- } else if vl := strings.ToLower(value); vl == "skip-verify" {
- cfg.TLSConfig = vl
- cfg.tls = &tls.Config{InsecureSkipVerify: true}
- } else {
- name, err := url.QueryUnescape(value)
- if err != nil {
- return fmt.Errorf("invalid value for TLS config name: %v", err)
- }
-
- if tlsConfig, ok := tlsConfigRegister[name]; ok {
- if len(tlsConfig.ServerName) == 0 && !tlsConfig.InsecureSkipVerify {
- host, _, err := net.SplitHostPort(cfg.Addr)
- if err == nil {
- tlsConfig.ServerName = host
- }
- }
-
- cfg.TLSConfig = name
- cfg.tls = tlsConfig
- } else {
- return errors.New("invalid value / unknown config name: " + name)
- }
- }
-
- // I/O write Timeout
- case "writeTimeout":
- cfg.WriteTimeout, err = time.ParseDuration(value)
- if err != nil {
- return
- }
-
- default:
- // lazy init
- if cfg.Params == nil {
- cfg.Params = make(map[string]string)
- }
-
- if cfg.Params[param[0]], err = url.QueryUnescape(value); err != nil {
- return
- }
- }
- }
-
- return
-}
diff --git a/vendor/github.com/go-sql-driver/mysql/dsn_test.go b/vendor/github.com/go-sql-driver/mysql/dsn_test.go
deleted file mode 100644
index 80949e18a..000000000
--- a/vendor/github.com/go-sql-driver/mysql/dsn_test.go
+++ /dev/null
@@ -1,207 +0,0 @@
-// Go MySQL Driver - A MySQL-Driver for Go's database/sql package
-//
-// Copyright 2016 The Go-MySQL-Driver Authors. All rights reserved.
-//
-// This Source Code Form is subject to the terms of the Mozilla Public
-// License, v. 2.0. If a copy of the MPL was not distributed with this file,
-// You can obtain one at http://mozilla.org/MPL/2.0/.
-
-package mysql
-
-import (
- "crypto/tls"
- "fmt"
- "net/url"
- "testing"
-)
-
-var testDSNs = []struct {
- in string
- out string
-}{
- {"username:password@protocol(address)/dbname?param=value", "&{User:username Passwd:password Net:protocol Addr:address DBName:dbname Params:map[param:value] Collation:utf8_general_ci Loc:UTC TLSConfig: tls:<nil> Timeout:0 ReadTimeout:0 WriteTimeout:0 AllowAllFiles:false AllowCleartextPasswords:false AllowOldPasswords:false ClientFoundRows:false ColumnsWithAlias:false InterpolateParams:false MultiStatements:false ParseTime:false Strict:false}"},
- {"username:password@protocol(address)/dbname?param=value&columnsWithAlias=true", "&{User:username Passwd:password Net:protocol Addr:address DBName:dbname Params:map[param:value] Collation:utf8_general_ci Loc:UTC TLSConfig: tls:<nil> Timeout:0 ReadTimeout:0 WriteTimeout:0 AllowAllFiles:false AllowCleartextPasswords:false AllowOldPasswords:false ClientFoundRows:false ColumnsWithAlias:true InterpolateParams:false MultiStatements:false ParseTime:false Strict:false}"},
- {"username:password@protocol(address)/dbname?param=value&columnsWithAlias=true&multiStatements=true", "&{User:username Passwd:password Net:protocol Addr:address DBName:dbname Params:map[param:value] Collation:utf8_general_ci Loc:UTC TLSConfig: tls:<nil> Timeout:0 ReadTimeout:0 WriteTimeout:0 AllowAllFiles:false AllowCleartextPasswords:false AllowOldPasswords:false ClientFoundRows:false ColumnsWithAlias:true InterpolateParams:false MultiStatements:true ParseTime:false Strict:false}"},
- {"user@unix(/path/to/socket)/dbname?charset=utf8", "&{User:user Passwd: Net:unix Addr:/path/to/socket DBName:dbname Params:map[charset:utf8] Collation:utf8_general_ci Loc:UTC TLSConfig: tls:<nil> Timeout:0 ReadTimeout:0 WriteTimeout:0 AllowAllFiles:false AllowCleartextPasswords:false AllowOldPasswords:false ClientFoundRows:false ColumnsWithAlias:false InterpolateParams:false MultiStatements:false ParseTime:false Strict:false}"},
- {"user:password@tcp(localhost:5555)/dbname?charset=utf8&tls=true", "&{User:user Passwd:password Net:tcp Addr:localhost:5555 DBName:dbname Params:map[charset:utf8] Collation:utf8_general_ci Loc:UTC TLSConfig:true tls:<nil> Timeout:0 ReadTimeout:0 WriteTimeout:0 AllowAllFiles:false AllowCleartextPasswords:false AllowOldPasswords:false ClientFoundRows:false ColumnsWithAlias:false InterpolateParams:false MultiStatements:false ParseTime:false Strict:false}"},
- {"user:password@tcp(localhost:5555)/dbname?charset=utf8mb4,utf8&tls=skip-verify", "&{User:user Passwd:password Net:tcp Addr:localhost:5555 DBName:dbname Params:map[charset:utf8mb4,utf8] Collation:utf8_general_ci Loc:UTC TLSConfig:skip-verify tls:<nil> Timeout:0 ReadTimeout:0 WriteTimeout:0 AllowAllFiles:false AllowCleartextPasswords:false AllowOldPasswords:false ClientFoundRows:false ColumnsWithAlias:false InterpolateParams:false MultiStatements:false ParseTime:false Strict:false}"},
- {"user:password@/dbname?loc=UTC&timeout=30s&readTimeout=1s&writeTimeout=1s&allowAllFiles=1&clientFoundRows=true&allowOldPasswords=TRUE&collation=utf8mb4_unicode_ci", "&{User:user Passwd:password Net:tcp Addr:127.0.0.1:3306 DBName:dbname Params:map[] Collation:utf8mb4_unicode_ci Loc:UTC TLSConfig: tls:<nil> Timeout:30s ReadTimeout:1s WriteTimeout:1s AllowAllFiles:true AllowCleartextPasswords:false AllowOldPasswords:true ClientFoundRows:true ColumnsWithAlias:false InterpolateParams:false MultiStatements:false ParseTime:false Strict:false}"},
- {"user:p@ss(word)@tcp([de:ad:be:ef::ca:fe]:80)/dbname?loc=Local", "&{User:user Passwd:p@ss(word) Net:tcp Addr:[de:ad:be:ef::ca:fe]:80 DBName:dbname Params:map[] Collation:utf8_general_ci Loc:Local TLSConfig: tls:<nil> Timeout:0 ReadTimeout:0 WriteTimeout:0 AllowAllFiles:false AllowCleartextPasswords:false AllowOldPasswords:false ClientFoundRows:false ColumnsWithAlias:false InterpolateParams:false MultiStatements:false ParseTime:false Strict:false}"},
- {"/dbname", "&{User: Passwd: Net:tcp Addr:127.0.0.1:3306 DBName:dbname Params:map[] Collation:utf8_general_ci Loc:UTC TLSConfig: tls:<nil> Timeout:0 ReadTimeout:0 WriteTimeout:0 AllowAllFiles:false AllowCleartextPasswords:false AllowOldPasswords:false ClientFoundRows:false ColumnsWithAlias:false InterpolateParams:false MultiStatements:false ParseTime:false Strict:false}"},
- {"@/", "&{User: Passwd: Net:tcp Addr:127.0.0.1:3306 DBName: Params:map[] Collation:utf8_general_ci Loc:UTC TLSConfig: tls:<nil> Timeout:0 ReadTimeout:0 WriteTimeout:0 AllowAllFiles:false AllowCleartextPasswords:false AllowOldPasswords:false ClientFoundRows:false ColumnsWithAlias:false InterpolateParams:false MultiStatements:false ParseTime:false Strict:false}"},
- {"/", "&{User: Passwd: Net:tcp Addr:127.0.0.1:3306 DBName: Params:map[] Collation:utf8_general_ci Loc:UTC TLSConfig: tls:<nil> Timeout:0 ReadTimeout:0 WriteTimeout:0 AllowAllFiles:false AllowCleartextPasswords:false AllowOldPasswords:false ClientFoundRows:false ColumnsWithAlias:false InterpolateParams:false MultiStatements:false ParseTime:false Strict:false}"},
- {"", "&{User: Passwd: Net:tcp Addr:127.0.0.1:3306 DBName: Params:map[] Collation:utf8_general_ci Loc:UTC TLSConfig: tls:<nil> Timeout:0 ReadTimeout:0 WriteTimeout:0 AllowAllFiles:false AllowCleartextPasswords:false AllowOldPasswords:false ClientFoundRows:false ColumnsWithAlias:false InterpolateParams:false MultiStatements:false ParseTime:false Strict:false}"},
- {"user:p@/ssword@/", "&{User:user Passwd:p@/ssword Net:tcp Addr:127.0.0.1:3306 DBName: Params:map[] Collation:utf8_general_ci Loc:UTC TLSConfig: tls:<nil> Timeout:0 ReadTimeout:0 WriteTimeout:0 AllowAllFiles:false AllowCleartextPasswords:false AllowOldPasswords:false ClientFoundRows:false ColumnsWithAlias:false InterpolateParams:false MultiStatements:false ParseTime:false Strict:false}"},
- {"unix/?arg=%2Fsome%2Fpath.ext", "&{User: Passwd: Net:unix Addr:/tmp/mysql.sock DBName: Params:map[arg:/some/path.ext] Collation:utf8_general_ci Loc:UTC TLSConfig: tls:<nil> Timeout:0 ReadTimeout:0 WriteTimeout:0 AllowAllFiles:false AllowCleartextPasswords:false AllowOldPasswords:false ClientFoundRows:false ColumnsWithAlias:false InterpolateParams:false MultiStatements:false ParseTime:false Strict:false}"},
-}
-
-func TestDSNParser(t *testing.T) {
- var cfg *Config
- var err error
- var res string
-
- for i, tst := range testDSNs {
- cfg, err = ParseDSN(tst.in)
- if err != nil {
- t.Error(err.Error())
- }
-
- // pointer not static
- cfg.tls = nil
-
- res = fmt.Sprintf("%+v", cfg)
- if res != tst.out {
- t.Errorf("%d. ParseDSN(%q) => %q, want %q", i, tst.in, res, tst.out)
- }
- }
-}
-
-func TestDSNParserInvalid(t *testing.T) {
- var invalidDSNs = []string{
- "@net(addr/", // no closing brace
- "@tcp(/", // no closing brace
- "tcp(/", // no closing brace
- "(/", // no closing brace
- "net(addr)//", // unescaped
- "User:pass@tcp(1.2.3.4:3306)", // no trailing slash
- //"/dbname?arg=/some/unescaped/path",
- }
-
- for i, tst := range invalidDSNs {
- if _, err := ParseDSN(tst); err == nil {
- t.Errorf("invalid DSN #%d. (%s) didn't error!", i, tst)
- }
- }
-}
-
-func TestDSNReformat(t *testing.T) {
- for i, tst := range testDSNs {
- dsn1 := tst.in
- cfg1, err := ParseDSN(dsn1)
- if err != nil {
- t.Error(err.Error())
- continue
- }
- cfg1.tls = nil // pointer not static
- res1 := fmt.Sprintf("%+v", cfg1)
-
- dsn2 := cfg1.FormatDSN()
- cfg2, err := ParseDSN(dsn2)
- if err != nil {
- t.Error(err.Error())
- continue
- }
- cfg2.tls = nil // pointer not static
- res2 := fmt.Sprintf("%+v", cfg2)
-
- if res1 != res2 {
- t.Errorf("%d. %q does not match %q", i, res2, res1)
- }
- }
-}
-
-func TestDSNWithCustomTLS(t *testing.T) {
- baseDSN := "User:password@tcp(localhost:5555)/dbname?tls="
- tlsCfg := tls.Config{}
-
- RegisterTLSConfig("utils_test", &tlsCfg)
-
- // Custom TLS is missing
- tst := baseDSN + "invalid_tls"
- cfg, err := ParseDSN(tst)
- if err == nil {
- t.Errorf("invalid custom TLS in DSN (%s) but did not error. Got config: %#v", tst, cfg)
- }
-
- tst = baseDSN + "utils_test"
-
- // Custom TLS with a server name
- name := "foohost"
- tlsCfg.ServerName = name
- cfg, err = ParseDSN(tst)
-
- if err != nil {
- t.Error(err.Error())
- } else if cfg.tls.ServerName != name {
- t.Errorf("did not get the correct TLS ServerName (%s) parsing DSN (%s).", name, tst)
- }
-
- // Custom TLS without a server name
- name = "localhost"
- tlsCfg.ServerName = ""
- cfg, err = ParseDSN(tst)
-
- if err != nil {
- t.Error(err.Error())
- } else if cfg.tls.ServerName != name {
- t.Errorf("did not get the correct ServerName (%s) parsing DSN (%s).", name, tst)
- }
-
- DeregisterTLSConfig("utils_test")
-}
-
-func TestDSNWithCustomTLSQueryEscape(t *testing.T) {
- const configKey = "&%!:"
- dsn := "User:password@tcp(localhost:5555)/dbname?tls=" + url.QueryEscape(configKey)
- name := "foohost"
- tlsCfg := tls.Config{ServerName: name}
-
- RegisterTLSConfig(configKey, &tlsCfg)
-
- cfg, err := ParseDSN(dsn)
-
- if err != nil {
- t.Error(err.Error())
- } else if cfg.tls.ServerName != name {
- t.Errorf("did not get the correct TLS ServerName (%s) parsing DSN (%s).", name, dsn)
- }
-}
-
-func TestDSNUnsafeCollation(t *testing.T) {
- _, err := ParseDSN("/dbname?collation=gbk_chinese_ci&interpolateParams=true")
- if err != errInvalidDSNUnsafeCollation {
- t.Errorf("expected %v, got %v", errInvalidDSNUnsafeCollation, err)
- }
-
- _, err = ParseDSN("/dbname?collation=gbk_chinese_ci&interpolateParams=false")
- if err != nil {
- t.Errorf("expected %v, got %v", nil, err)
- }
-
- _, err = ParseDSN("/dbname?collation=gbk_chinese_ci")
- if err != nil {
- t.Errorf("expected %v, got %v", nil, err)
- }
-
- _, err = ParseDSN("/dbname?collation=ascii_bin&interpolateParams=true")
- if err != nil {
- t.Errorf("expected %v, got %v", nil, err)
- }
-
- _, err = ParseDSN("/dbname?collation=latin1_german1_ci&interpolateParams=true")
- if err != nil {
- t.Errorf("expected %v, got %v", nil, err)
- }
-
- _, err = ParseDSN("/dbname?collation=utf8_general_ci&interpolateParams=true")
- if err != nil {
- t.Errorf("expected %v, got %v", nil, err)
- }
-
- _, err = ParseDSN("/dbname?collation=utf8mb4_general_ci&interpolateParams=true")
- if err != nil {
- t.Errorf("expected %v, got %v", nil, err)
- }
-}
-
-func BenchmarkParseDSN(b *testing.B) {
- b.ReportAllocs()
-
- for i := 0; i < b.N; i++ {
- for _, tst := range testDSNs {
- if _, err := ParseDSN(tst.in); err != nil {
- b.Error(err.Error())
- }
- }
- }
-}
diff --git a/vendor/github.com/go-sql-driver/mysql/errors.go b/vendor/github.com/go-sql-driver/mysql/errors.go
index 1543a8054..97d7b3996 100644
--- a/vendor/github.com/go-sql-driver/mysql/errors.go
+++ b/vendor/github.com/go-sql-driver/mysql/errors.go
@@ -19,20 +19,18 @@ import (
// Various errors the driver might return. Can change between driver versions.
var (
- ErrInvalidConn = errors.New("invalid connection")
- ErrMalformPkt = errors.New("malformed packet")
- ErrNoTLS = errors.New("TLS requested but server does not support TLS")
- ErrOldPassword = errors.New("this user requires old password authentication. If you still want to use it, please add 'allowOldPasswords=1' to your DSN. See also https://github.com/go-sql-driver/mysql/wiki/old_passwords")
- ErrCleartextPassword = errors.New("this user requires clear text authentication. If you still want to use it, please add 'allowCleartextPasswords=1' to your DSN")
- ErrUnknownPlugin = errors.New("this authentication plugin is not supported")
- ErrOldProtocol = errors.New("MySQL server does not support required protocol 41+")
- ErrPktSync = errors.New("commands out of sync. You can't run this command now")
- ErrPktSyncMul = errors.New("commands out of sync. Did you run multiple statements at once?")
- ErrPktTooLarge = errors.New("packet for query is too large. Try adjusting the 'max_allowed_packet' variable on the server")
- ErrBusyBuffer = errors.New("busy buffer")
+ ErrInvalidConn = errors.New("Invalid Connection")
+ ErrMalformPkt = errors.New("Malformed Packet")
+ ErrNoTLS = errors.New("TLS encryption requested but server does not support TLS")
+ ErrOldPassword = errors.New("This server only supports the insecure old password authentication. If you still want to use it, please add 'allowOldPasswords=1' to your DSN. See also https://github.com/go-sql-driver/mysql/wiki/old_passwords")
+ ErrOldProtocol = errors.New("MySQL-Server does not support required Protocol 41+")
+ ErrPktSync = errors.New("Commands out of sync. You can't run this command now")
+ ErrPktSyncMul = errors.New("Commands out of sync. Did you run multiple statements at once?")
+ ErrPktTooLarge = errors.New("Packet for query is too large. You can change this value on the server by adjusting the 'max_allowed_packet' variable.")
+ ErrBusyBuffer = errors.New("Busy buffer")
)
-var errLog = Logger(log.New(os.Stderr, "[mysql] ", log.Ldate|log.Ltime|log.Lshortfile))
+var errLog Logger = log.New(os.Stderr, "[MySQL] ", log.Ldate|log.Ltime|log.Lshortfile)
// Logger is used to log critical error messages.
type Logger interface {
diff --git a/vendor/github.com/go-sql-driver/mysql/infile.go b/vendor/github.com/go-sql-driver/mysql/infile.go
index 0f975bbc2..121a04c71 100644
--- a/vendor/github.com/go-sql-driver/mysql/infile.go
+++ b/vendor/github.com/go-sql-driver/mysql/infile.go
@@ -13,14 +13,11 @@ import (
"io"
"os"
"strings"
- "sync"
)
var (
- fileRegister map[string]bool
- fileRegisterLock sync.RWMutex
- readerRegister map[string]func() io.Reader
- readerRegisterLock sync.RWMutex
+ fileRegister map[string]bool
+ readerRegister map[string]func() io.Reader
)
// RegisterLocalFile adds the given file to the file whitelist,
@@ -35,21 +32,17 @@ var (
// ...
//
func RegisterLocalFile(filePath string) {
- fileRegisterLock.Lock()
// lazy map init
if fileRegister == nil {
fileRegister = make(map[string]bool)
}
fileRegister[strings.Trim(filePath, `"`)] = true
- fileRegisterLock.Unlock()
}
// DeregisterLocalFile removes the given filepath from the whitelist.
func DeregisterLocalFile(filePath string) {
- fileRegisterLock.Lock()
delete(fileRegister, strings.Trim(filePath, `"`))
- fileRegisterLock.Unlock()
}
// RegisterReaderHandler registers a handler function which is used
@@ -68,22 +61,18 @@ func DeregisterLocalFile(filePath string) {
// ...
//
func RegisterReaderHandler(name string, handler func() io.Reader) {
- readerRegisterLock.Lock()
// lazy map init
if readerRegister == nil {
readerRegister = make(map[string]func() io.Reader)
}
readerRegister[name] = handler
- readerRegisterLock.Unlock()
}
// DeregisterReaderHandler removes the ReaderHandler function with
// the given name from the registry.
func DeregisterReaderHandler(name string) {
- readerRegisterLock.Lock()
delete(readerRegister, name)
- readerRegisterLock.Unlock()
}
func deferredClose(err *error, closer io.Closer) {
@@ -96,22 +85,14 @@ func deferredClose(err *error, closer io.Closer) {
func (mc *mysqlConn) handleInFileRequest(name string) (err error) {
var rdr io.Reader
var data []byte
- packetSize := 16 * 1024 // 16KB is small enough for disk readahead and large enough for TCP
- if mc.maxWriteSize < packetSize {
- packetSize = mc.maxWriteSize
- }
-
- if idx := strings.Index(name, "Reader::"); idx == 0 || (idx > 0 && name[idx-1] == '/') { // io.Reader
- // The server might return an an absolute path. See issue #355.
- name = name[idx+8:]
-
- readerRegisterLock.RLock()
- handler, inMap := readerRegister[name]
- readerRegisterLock.RUnlock()
- if inMap {
+ if strings.HasPrefix(name, "Reader::") { // io.Reader
+ name = name[8:]
+ if handler, inMap := readerRegister[name]; inMap {
rdr = handler()
if rdr != nil {
+ data = make([]byte, 4+mc.maxWriteSize)
+
if cl, ok := rdr.(io.Closer); ok {
defer deferredClose(&err, cl)
}
@@ -123,10 +104,7 @@ func (mc *mysqlConn) handleInFileRequest(name string) (err error) {
}
} else { // File
name = strings.Trim(name, `"`)
- fileRegisterLock.RLock()
- fr := fileRegister[name]
- fileRegisterLock.RUnlock()
- if mc.cfg.AllowAllFiles || fr {
+ if mc.cfg.allowAllFiles || fileRegister[name] {
var file *os.File
var fi os.FileInfo
@@ -136,19 +114,22 @@ func (mc *mysqlConn) handleInFileRequest(name string) (err error) {
// get file size
if fi, err = file.Stat(); err == nil {
rdr = file
- if fileSize := int(fi.Size()); fileSize < packetSize {
- packetSize = fileSize
+ if fileSize := int(fi.Size()); fileSize <= mc.maxWriteSize {
+ data = make([]byte, 4+fileSize)
+ } else if fileSize <= mc.maxPacketAllowed {
+ data = make([]byte, 4+mc.maxWriteSize)
+ } else {
+ err = fmt.Errorf("Local File '%s' too large: Size: %d, Max: %d", name, fileSize, mc.maxPacketAllowed)
}
}
}
} else {
- err = fmt.Errorf("local file '%s' is not registered", name)
+ err = fmt.Errorf("Local File '%s' is not registered. Use the DSN parameter 'allowAllFiles=true' to allow all files", name)
}
}
// send content packets
if err == nil {
- data := make([]byte, 4+packetSize)
var n int
for err == nil {
n, err = rdr.Read(data[4:])
@@ -174,8 +155,8 @@ func (mc *mysqlConn) handleInFileRequest(name string) (err error) {
// read OK packet
if err == nil {
return mc.readResultOK()
+ } else {
+ mc.readPacket()
}
-
- mc.readPacket()
return err
}
diff --git a/vendor/github.com/go-sql-driver/mysql/packets.go b/vendor/github.com/go-sql-driver/mysql/packets.go
index 8d9166578..618098146 100644
--- a/vendor/github.com/go-sql-driver/mysql/packets.go
+++ b/vendor/github.com/go-sql-driver/mysql/packets.go
@@ -13,7 +13,6 @@ import (
"crypto/tls"
"database/sql/driver"
"encoding/binary"
- "errors"
"fmt"
"io"
"math"
@@ -48,8 +47,9 @@ func (mc *mysqlConn) readPacket() ([]byte, error) {
if data[3] != mc.sequence {
if data[3] > mc.sequence {
return nil, ErrPktSyncMul
+ } else {
+ return nil, ErrPktSync
}
- return nil, ErrPktSync
}
mc.sequence++
@@ -100,12 +100,6 @@ func (mc *mysqlConn) writePacket(data []byte) error {
data[3] = mc.sequence
// Write packet
- if mc.writeTimeout > 0 {
- if err := mc.netConn.SetWriteDeadline(time.Now().Add(mc.writeTimeout)); err != nil {
- return err
- }
- }
-
n, err := mc.netConn.Write(data[:4+size])
if err == nil && n == 4+size {
mc.sequence++
@@ -146,7 +140,7 @@ func (mc *mysqlConn) readInitPacket() ([]byte, error) {
// protocol version [1 byte]
if data[0] < minProtocolVersion {
return nil, fmt.Errorf(
- "unsupported protocol version %d. Version %d or higher is required",
+ "Unsupported MySQL Protocol Version %d. Protocol Version %d or higher is required",
data[0],
minProtocolVersion,
)
@@ -202,11 +196,7 @@ func (mc *mysqlConn) readInitPacket() ([]byte, error) {
// return
//}
//return ErrMalformPkt
-
- // make a memory safe copy of the cipher slice
- var b [20]byte
- copy(b[:], cipher)
- return b[:], nil
+ return cipher, nil
}
// make a memory safe copy of the cipher slice
@@ -224,11 +214,9 @@ func (mc *mysqlConn) writeAuthPacket(cipher []byte) error {
clientLongPassword |
clientTransactions |
clientLocalFiles |
- clientPluginAuth |
- clientMultiResults |
mc.flags&clientLongFlag
- if mc.cfg.ClientFoundRows {
+ if mc.cfg.clientFoundRows {
clientFlags |= clientFoundRows
}
@@ -237,17 +225,13 @@ func (mc *mysqlConn) writeAuthPacket(cipher []byte) error {
clientFlags |= clientSSL
}
- if mc.cfg.MultiStatements {
- clientFlags |= clientMultiStatements
- }
-
// User Password
- scrambleBuff := scramblePassword(cipher, []byte(mc.cfg.Passwd))
+ scrambleBuff := scramblePassword(cipher, []byte(mc.cfg.passwd))
- pktLen := 4 + 4 + 1 + 23 + len(mc.cfg.User) + 1 + 1 + len(scrambleBuff) + 21 + 1
+ pktLen := 4 + 4 + 1 + 23 + len(mc.cfg.user) + 1 + 1 + len(scrambleBuff)
// To specify a db name
- if n := len(mc.cfg.DBName); n > 0 {
+ if n := len(mc.cfg.dbname); n > 0 {
clientFlags |= clientConnectWithDB
pktLen += n + 1
}
@@ -273,14 +257,7 @@ func (mc *mysqlConn) writeAuthPacket(cipher []byte) error {
data[11] = 0x00
// Charset [1 byte]
- var found bool
- data[12], found = collations[mc.cfg.Collation]
- if !found {
- // Note possibility for false negatives:
- // could be triggered although the collation is valid if the
- // collations map does not contain entries the server supports.
- return errors.New("unknown collation")
- }
+ data[12] = mc.cfg.collation
// SSL Connection Request Packet
// http://dev.mysql.com/doc/internals/en/connection-phase-packets.html#packet-Protocol::SSLRequest
@@ -296,18 +273,15 @@ func (mc *mysqlConn) writeAuthPacket(cipher []byte) error {
return err
}
mc.netConn = tlsConn
- mc.buf.nc = tlsConn
+ mc.buf.rd = tlsConn
}
// Filler [23 bytes] (all 0x00)
- pos := 13
- for ; pos < 13+23; pos++ {
- data[pos] = 0
- }
+ pos := 13 + 23
// User [null terminated string]
- if len(mc.cfg.User) > 0 {
- pos += copy(data[pos:], mc.cfg.User)
+ if len(mc.cfg.user) > 0 {
+ pos += copy(data[pos:], mc.cfg.user)
}
data[pos] = 0x00
pos++
@@ -317,16 +291,11 @@ func (mc *mysqlConn) writeAuthPacket(cipher []byte) error {
pos += 1 + copy(data[pos+1:], scrambleBuff)
// Databasename [null terminated string]
- if len(mc.cfg.DBName) > 0 {
- pos += copy(data[pos:], mc.cfg.DBName)
+ if len(mc.cfg.dbname) > 0 {
+ pos += copy(data[pos:], mc.cfg.dbname)
data[pos] = 0x00
- pos++
}
- // Assume native client during response
- pos += copy(data[pos:], "mysql_native_password")
- data[pos] = 0x00
-
// Send Auth packet
return mc.writePacket(data)
}
@@ -335,9 +304,9 @@ func (mc *mysqlConn) writeAuthPacket(cipher []byte) error {
// http://dev.mysql.com/doc/internals/en/connection-phase-packets.html#packet-Protocol::AuthSwitchResponse
func (mc *mysqlConn) writeOldAuthPacket(cipher []byte) error {
// User password
- scrambleBuff := scrambleOldPassword(cipher, []byte(mc.cfg.Passwd))
+ scrambleBuff := scrambleOldPassword(cipher, []byte(mc.cfg.passwd))
- // Calculate the packet length and add a tailing 0
+ // Calculate the packet lenght and add a tailing 0
pktLen := len(scrambleBuff) + 1
data := mc.buf.takeSmallBuffer(4 + pktLen)
if data == nil {
@@ -353,25 +322,6 @@ func (mc *mysqlConn) writeOldAuthPacket(cipher []byte) error {
return mc.writePacket(data)
}
-// Client clear text authentication packet
-// http://dev.mysql.com/doc/internals/en/connection-phase-packets.html#packet-Protocol::AuthSwitchResponse
-func (mc *mysqlConn) writeClearAuthPacket() error {
- // Calculate the packet length and add a tailing 0
- pktLen := len(mc.cfg.Passwd) + 1
- data := mc.buf.takeSmallBuffer(4 + pktLen)
- if data == nil {
- // can not take the buffer. Something must be wrong with the connection
- errLog.Print(ErrBusyBuffer)
- return driver.ErrBadConn
- }
-
- // Add the clear password [null terminated string]
- copy(data[4:], mc.cfg.Passwd)
- data[4+pktLen-1] = 0x00
-
- return mc.writePacket(data)
-}
-
/******************************************************************************
* Command Packets *
******************************************************************************/
@@ -455,20 +405,8 @@ func (mc *mysqlConn) readResultOK() error {
return mc.handleOkPacket(data)
case iEOF:
- if len(data) > 1 {
- plugin := string(data[1:bytes.IndexByte(data, 0x00)])
- if plugin == "mysql_old_password" {
- // using old_passwords
- return ErrOldPassword
- } else if plugin == "mysql_clear_password" {
- // using clear text password
- return ErrCleartextPassword
- } else {
- return ErrUnknownPlugin
- }
- } else {
- return ErrOldPassword
- }
+ // someone is using old_passwords
+ return ErrOldPassword
default: // Error otherwise
return mc.handleErrorPacket(data)
@@ -532,10 +470,6 @@ func (mc *mysqlConn) handleErrorPacket(data []byte) error {
}
}
-func readStatus(b []byte) statusFlag {
- return statusFlag(b[0]) | statusFlag(b[1])<<8
-}
-
// Ok Packet
// http://dev.mysql.com/doc/internals/en/generic-response-packets.html#packet-OK_Packet
func (mc *mysqlConn) handleOkPacket(data []byte) error {
@@ -550,21 +484,17 @@ func (mc *mysqlConn) handleOkPacket(data []byte) error {
mc.insertId, _, m = readLengthEncodedInteger(data[1+n:])
// server_status [2 bytes]
- mc.status = readStatus(data[1+n+m : 1+n+m+2])
- if err := mc.discardResults(); err != nil {
- return err
- }
// warning count [2 bytes]
if !mc.strict {
return nil
+ } else {
+ pos := 1 + n + m + 2
+ if binary.LittleEndian.Uint16(data[pos:pos+2]) > 0 {
+ return mc.getWarnings()
+ }
+ return nil
}
-
- pos := 1 + n + m + 2
- if binary.LittleEndian.Uint16(data[pos:pos+2]) > 0 {
- return mc.getWarnings()
- }
- return nil
}
// Read Packets as Field Packets until EOF-Packet or an Error appears
@@ -583,7 +513,7 @@ func (mc *mysqlConn) readColumns(count int) ([]mysqlField, error) {
if i == count {
return columns, nil
}
- return nil, fmt.Errorf("column count mismatch n:%d len:%d", count, len(columns))
+ return nil, fmt.Errorf("ColumnsCount mismatch n:%d len:%d", count, len(columns))
}
// Catalog
@@ -600,20 +530,11 @@ func (mc *mysqlConn) readColumns(count int) ([]mysqlField, error) {
pos += n
// Table [len coded string]
- if mc.cfg.ColumnsWithAlias {
- tableName, _, n, err := readLengthEncodedString(data[pos:])
- if err != nil {
- return nil, err
- }
- pos += n
- columns[i].tableName = string(tableName)
- } else {
- n, err = skipLengthEncodedString(data[pos:])
- if err != nil {
- return nil, err
- }
- pos += n
+ n, err = skipLengthEncodedString(data[pos:])
+ if err != nil {
+ return nil, err
}
+ pos += n
// Original table [len coded string]
n, err = skipLengthEncodedString(data[pos:])
@@ -636,21 +557,20 @@ func (mc *mysqlConn) readColumns(count int) ([]mysqlField, error) {
return nil, err
}
- // Filler [uint8]
- // Charset [charset, collation uint8]
- // Length [uint32]
+ // Filler [1 byte]
+ // Charset [16 bit uint]
+ // Length [32 bit uint]
pos += n + 1 + 2 + 4
- // Field type [uint8]
+ // Field type [byte]
columns[i].fieldType = data[pos]
pos++
- // Flags [uint16]
+ // Flags [16 bit uint]
columns[i].flags = fieldFlag(binary.LittleEndian.Uint16(data[pos : pos+2]))
- pos += 2
+ //pos += 2
- // Decimals [uint8]
- columns[i].decimals = data[pos]
+ // Decimals [8 bit uint]
//pos++
// Default value [len coded binary]
@@ -672,18 +592,8 @@ func (rows *textRows) readRow(dest []driver.Value) error {
// EOF Packet
if data[0] == iEOF && len(data) == 5 {
- // server_status [2 bytes]
- rows.mc.status = readStatus(data[3:])
- if err := rows.mc.discardResults(); err != nil {
- return err
- }
- rows.mc = nil
return io.EOF
}
- if data[0] == iERR {
- rows.mc = nil
- return mc.handleErrorPacket(data)
- }
// RowSet Packet
var n int
@@ -704,7 +614,7 @@ func (rows *textRows) readRow(dest []driver.Value) error {
fieldTypeDate, fieldTypeNewDate:
dest[i], err = parseDateTime(
string(dest[i].([]byte)),
- mc.cfg.Loc,
+ mc.cfg.loc,
)
if err == nil {
continue
@@ -734,10 +644,6 @@ func (mc *mysqlConn) readUntilEOF() error {
if err == nil && data[0] != iEOF {
continue
}
- if err == nil && data[0] == iEOF && len(data) == 5 {
- mc.status = readStatus(data[3:])
- }
-
return err // Err or EOF
}
}
@@ -770,13 +676,13 @@ func (stmt *mysqlStmt) readPrepareResultPacket() (uint16, error) {
// Warning count [16 bit uint]
if !stmt.mc.strict {
return columnCount, nil
+ } else {
+ // Check for warnings count > 0, only available in MySQL > 4.1
+ if len(data) >= 12 && binary.LittleEndian.Uint16(data[10:12]) > 0 {
+ return columnCount, stmt.mc.getWarnings()
+ }
+ return columnCount, nil
}
-
- // Check for warnings count > 0, only available in MySQL > 4.1
- if len(data) >= 12 && binary.LittleEndian.Uint16(data[10:12]) > 0 {
- return columnCount, stmt.mc.getWarnings()
- }
- return columnCount, nil
}
return 0, err
}
@@ -838,7 +744,7 @@ func (stmt *mysqlStmt) writeCommandLongData(paramID int, arg []byte) error {
func (stmt *mysqlStmt) writeExecutePacket(args []driver.Value) error {
if len(args) != stmt.paramCount {
return fmt.Errorf(
- "argument count mismatch (got: %d; has: %d)",
+ "Arguments count mismatch (Got: %d Has: %d)",
len(args),
stmt.paramCount,
)
@@ -1015,7 +921,7 @@ func (stmt *mysqlStmt) writeExecutePacket(args []driver.Value) error {
if v.IsZero() {
val = []byte("0000-00-00")
} else {
- val = []byte(v.In(mc.cfg.Loc).Format(timeFormat))
+ val = []byte(v.In(mc.cfg.loc).Format(timeFormat))
}
paramValues = appendLengthEncodedInteger(paramValues,
@@ -1024,7 +930,7 @@ func (stmt *mysqlStmt) writeExecutePacket(args []driver.Value) error {
paramValues = append(paramValues, val...)
default:
- return fmt.Errorf("can not convert type: %T", arg)
+ return fmt.Errorf("Can't convert type: %T", arg)
}
}
@@ -1042,28 +948,6 @@ func (stmt *mysqlStmt) writeExecutePacket(args []driver.Value) error {
return mc.writePacket(data)
}
-func (mc *mysqlConn) discardResults() error {
- for mc.status&statusMoreResultsExists != 0 {
- resLen, err := mc.readResultSetHeaderPacket()
- if err != nil {
- return err
- }
- if resLen > 0 {
- // columns
- if err := mc.readUntilEOF(); err != nil {
- return err
- }
- // rows
- if err := mc.readUntilEOF(); err != nil {
- return err
- }
- } else {
- mc.status &^= statusMoreResultsExists
- }
- }
- return nil
-}
-
// http://dev.mysql.com/doc/internals/en/binary-protocol-resultset-row.html
func (rows *binaryRows) readRow(dest []driver.Value) error {
data, err := rows.mc.readPacket()
@@ -1075,14 +959,8 @@ func (rows *binaryRows) readRow(dest []driver.Value) error {
if data[0] != iOK {
// EOF Packet
if data[0] == iEOF && len(data) == 5 {
- rows.mc.status = readStatus(data[3:])
- if err := rows.mc.discardResults(); err != nil {
- return err
- }
- rows.mc = nil
return io.EOF
}
- rows.mc = nil
// Error otherwise
return rows.mc.handleErrorPacket(data)
@@ -1149,7 +1027,7 @@ func (rows *binaryRows) readRow(dest []driver.Value) error {
continue
case fieldTypeFloat:
- dest[i] = float32(math.Float32frombits(binary.LittleEndian.Uint32(data[pos : pos+4])))
+ dest[i] = float64(math.Float32frombits(binary.LittleEndian.Uint32(data[pos : pos+4])))
pos += 4
continue
@@ -1162,7 +1040,7 @@ func (rows *binaryRows) readRow(dest []driver.Value) error {
case fieldTypeDecimal, fieldTypeNewDecimal, fieldTypeVarChar,
fieldTypeBit, fieldTypeEnum, fieldTypeSet, fieldTypeTinyBLOB,
fieldTypeMediumBLOB, fieldTypeLongBLOB, fieldTypeBLOB,
- fieldTypeVarString, fieldTypeString, fieldTypeGeometry, fieldTypeJSON:
+ fieldTypeVarString, fieldTypeString, fieldTypeGeometry:
var isNull bool
var n int
dest[i], isNull, n, err = readLengthEncodedString(data[pos:])
@@ -1177,53 +1055,88 @@ func (rows *binaryRows) readRow(dest []driver.Value) error {
}
return err
- case
- fieldTypeDate, fieldTypeNewDate, // Date YYYY-MM-DD
- fieldTypeTime, // Time [-][H]HH:MM:SS[.fractal]
- fieldTypeTimestamp, fieldTypeDateTime: // Timestamp YYYY-MM-DD HH:MM:SS[.fractal]
-
+ // Date YYYY-MM-DD
+ case fieldTypeDate, fieldTypeNewDate:
num, isNull, n := readLengthEncodedInteger(data[pos:])
pos += n
- switch {
- case isNull:
+ if isNull {
dest[i] = nil
continue
- case rows.columns[i].fieldType == fieldTypeTime:
- // database/sql does not support an equivalent to TIME, return a string
- var dstlen uint8
- switch decimals := rows.columns[i].decimals; decimals {
- case 0x00, 0x1f:
- dstlen = 8
- case 1, 2, 3, 4, 5, 6:
- dstlen = 8 + 1 + decimals
- default:
- return fmt.Errorf(
- "protocol error, illegal decimals value %d",
- rows.columns[i].decimals,
- )
- }
- dest[i], err = formatBinaryDateTime(data[pos:pos+int(num)], dstlen, true)
- case rows.mc.parseTime:
- dest[i], err = parseBinaryDateTime(num, data[pos:], rows.mc.cfg.Loc)
- default:
- var dstlen uint8
- if rows.columns[i].fieldType == fieldTypeDate {
- dstlen = 10
+ }
+
+ if rows.mc.parseTime {
+ dest[i], err = parseBinaryDateTime(num, data[pos:], rows.mc.cfg.loc)
+ } else {
+ dest[i], err = formatBinaryDateTime(data[pos:pos+int(num)], false)
+ }
+
+ if err == nil {
+ pos += int(num)
+ continue
+ } else {
+ return err
+ }
+
+ // Time [-][H]HH:MM:SS[.fractal]
+ case fieldTypeTime:
+ num, isNull, n := readLengthEncodedInteger(data[pos:])
+ pos += n
+
+ if num == 0 {
+ if isNull {
+ dest[i] = nil
+ continue
} else {
- switch decimals := rows.columns[i].decimals; decimals {
- case 0x00, 0x1f:
- dstlen = 19
- case 1, 2, 3, 4, 5, 6:
- dstlen = 19 + 1 + decimals
- default:
- return fmt.Errorf(
- "protocol error, illegal decimals value %d",
- rows.columns[i].decimals,
- )
- }
+ dest[i] = []byte("00:00:00")
+ continue
}
- dest[i], err = formatBinaryDateTime(data[pos:pos+int(num)], dstlen, false)
+ }
+
+ var sign string
+ if data[pos] == 1 {
+ sign = "-"
+ }
+
+ switch num {
+ case 8:
+ dest[i] = []byte(fmt.Sprintf(
+ sign+"%02d:%02d:%02d",
+ uint16(data[pos+1])*24+uint16(data[pos+5]),
+ data[pos+6],
+ data[pos+7],
+ ))
+ pos += 8
+ continue
+ case 12:
+ dest[i] = []byte(fmt.Sprintf(
+ sign+"%02d:%02d:%02d.%06d",
+ uint16(data[pos+1])*24+uint16(data[pos+5]),
+ data[pos+6],
+ data[pos+7],
+ binary.LittleEndian.Uint32(data[pos+8:pos+12]),
+ ))
+ pos += 12
+ continue
+ default:
+ return fmt.Errorf("Invalid TIME-packet length %d", num)
+ }
+
+ // Timestamp YYYY-MM-DD HH:MM:SS[.fractal]
+ case fieldTypeTimestamp, fieldTypeDateTime:
+ num, isNull, n := readLengthEncodedInteger(data[pos:])
+
+ pos += n
+
+ if isNull {
+ dest[i] = nil
+ continue
+ }
+
+ if rows.mc.parseTime {
+ dest[i], err = parseBinaryDateTime(num, data[pos:], rows.mc.cfg.loc)
+ } else {
+ dest[i], err = formatBinaryDateTime(data[pos:pos+int(num)], true)
}
if err == nil {
@@ -1235,7 +1148,7 @@ func (rows *binaryRows) readRow(dest []driver.Value) error {
// Please report if this happens!
default:
- return fmt.Errorf("unknown field type %d", rows.columns[i].fieldType)
+ return fmt.Errorf("Unknown FieldType %d", rows.columns[i].fieldType)
}
}
diff --git a/vendor/github.com/go-sql-driver/mysql/rows.go b/vendor/github.com/go-sql-driver/mysql/rows.go
index c08255eee..df4ef06cb 100644
--- a/vendor/github.com/go-sql-driver/mysql/rows.go
+++ b/vendor/github.com/go-sql-driver/mysql/rows.go
@@ -14,11 +14,9 @@ import (
)
type mysqlField struct {
- tableName string
- name string
- flags fieldFlag
fieldType byte
- decimals byte
+ flags fieldFlag
+ name string
}
type mysqlRows struct {
@@ -34,22 +32,10 @@ type textRows struct {
mysqlRows
}
-type emptyRows struct{}
-
func (rows *mysqlRows) Columns() []string {
columns := make([]string, len(rows.columns))
- if rows.mc != nil && rows.mc.cfg.ColumnsWithAlias {
- for i := range columns {
- if tableName := rows.columns[i].tableName; len(tableName) > 0 {
- columns[i] = tableName + "." + rows.columns[i].name
- } else {
- columns[i] = rows.columns[i].name
- }
- }
- } else {
- for i := range columns {
- columns[i] = rows.columns[i].name
- }
+ for i := range columns {
+ columns[i] = rows.columns[i].name
}
return columns
}
@@ -65,12 +51,6 @@ func (rows *mysqlRows) Close() error {
// Remove unread packets from stream
err := mc.readUntilEOF()
- if err == nil {
- if err = mc.discardResults(); err != nil {
- return err
- }
- }
-
rows.mc = nil
return err
}
@@ -82,7 +62,10 @@ func (rows *binaryRows) Next(dest []driver.Value) error {
}
// Fetch next row from stream
- return rows.readRow(dest)
+ if err := rows.readRow(dest); err != io.EOF {
+ return err
+ }
+ rows.mc = nil
}
return io.EOF
}
@@ -94,19 +77,10 @@ func (rows *textRows) Next(dest []driver.Value) error {
}
// Fetch next row from stream
- return rows.readRow(dest)
+ if err := rows.readRow(dest); err != io.EOF {
+ return err
+ }
+ rows.mc = nil
}
return io.EOF
}
-
-func (rows emptyRows) Columns() []string {
- return nil
-}
-
-func (rows emptyRows) Close() error {
- return nil
-}
-
-func (rows emptyRows) Next(dest []driver.Value) error {
- return io.EOF
-}
diff --git a/vendor/github.com/go-sql-driver/mysql/statement.go b/vendor/github.com/go-sql-driver/mysql/statement.go
index ead9a6bf4..142ef5416 100644
--- a/vendor/github.com/go-sql-driver/mysql/statement.go
+++ b/vendor/github.com/go-sql-driver/mysql/statement.go
@@ -10,9 +10,6 @@ package mysql
import (
"database/sql/driver"
- "fmt"
- "reflect"
- "strconv"
)
type mysqlStmt struct {
@@ -37,10 +34,6 @@ func (stmt *mysqlStmt) NumInput() int {
return stmt.paramCount
}
-func (stmt *mysqlStmt) ColumnConverter(idx int) driver.ValueConverter {
- return converter{}
-}
-
func (stmt *mysqlStmt) Exec(args []driver.Value) (driver.Result, error) {
if stmt.mc.netConn == nil {
errLog.Print(ErrInvalidConn)
@@ -101,9 +94,9 @@ func (stmt *mysqlStmt) Query(args []driver.Value) (driver.Rows, error) {
}
rows := new(binaryRows)
+ rows.mc = mc
if resLen > 0 {
- rows.mc = mc
// Columns
// If not cached, read them and cache them
if stmt.columns == nil {
@@ -117,34 +110,3 @@ func (stmt *mysqlStmt) Query(args []driver.Value) (driver.Rows, error) {
return rows, err
}
-
-type converter struct{}
-
-func (c converter) ConvertValue(v interface{}) (driver.Value, error) {
- if driver.IsValue(v) {
- return v, nil
- }
-
- rv := reflect.ValueOf(v)
- switch rv.Kind() {
- case reflect.Ptr:
- // indirect pointers
- if rv.IsNil() {
- return nil, nil
- }
- return c.ConvertValue(rv.Elem().Interface())
- case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
- return rv.Int(), nil
- case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32:
- return int64(rv.Uint()), nil
- case reflect.Uint64:
- u64 := rv.Uint()
- if u64 >= 1<<63 {
- return strconv.FormatUint(u64, 10), nil
- }
- return int64(u64), nil
- case reflect.Float32, reflect.Float64:
- return rv.Float(), nil
- }
- return nil, fmt.Errorf("unsupported type %T, a %s", v, rv.Kind())
-}
diff --git a/vendor/github.com/go-sql-driver/mysql/utils.go b/vendor/github.com/go-sql-driver/mysql/utils.go
index d523b7ffd..b6f200389 100644
--- a/vendor/github.com/go-sql-driver/mysql/utils.go
+++ b/vendor/github.com/go-sql-driver/mysql/utils.go
@@ -13,16 +13,26 @@ import (
"crypto/tls"
"database/sql/driver"
"encoding/binary"
+ "errors"
"fmt"
"io"
+ "net/url"
"strings"
"time"
)
var (
tlsConfigRegister map[string]*tls.Config // Register for custom tls.Configs
+
+ errInvalidDSNUnescaped = errors.New("Invalid DSN: Did you forget to escape a param value?")
+ errInvalidDSNAddr = errors.New("Invalid DSN: Network Address not terminated (missing closing brace)")
+ errInvalidDSNNoSlash = errors.New("Invalid DSN: Missing the slash separating the database name")
)
+func init() {
+ tlsConfigRegister = make(map[string]*tls.Config)
+}
+
// RegisterTLSConfig registers a custom tls.Config to be used with sql.Open.
// Use the key as a value in the DSN where tls=value.
//
@@ -48,11 +58,7 @@ var (
//
func RegisterTLSConfig(key string, config *tls.Config) error {
if _, isBool := readBool(key); isBool || strings.ToLower(key) == "skip-verify" {
- return fmt.Errorf("key '%s' is reserved", key)
- }
-
- if tlsConfigRegister == nil {
- tlsConfigRegister = make(map[string]*tls.Config)
+ return fmt.Errorf("Key '%s' is reserved", key)
}
tlsConfigRegister[key] = config
@@ -61,9 +67,202 @@ func RegisterTLSConfig(key string, config *tls.Config) error {
// DeregisterTLSConfig removes the tls.Config associated with key.
func DeregisterTLSConfig(key string) {
- if tlsConfigRegister != nil {
- delete(tlsConfigRegister, key)
+ delete(tlsConfigRegister, key)
+}
+
+// parseDSN parses the DSN string to a config
+func parseDSN(dsn string) (cfg *config, err error) {
+ // New config with some default values
+ cfg = &config{
+ loc: time.UTC,
+ collation: defaultCollation,
+ }
+
+ // TODO: use strings.IndexByte when we can depend on Go 1.2
+
+ // [user[:password]@][net[(addr)]]/dbname[?param1=value1&paramN=valueN]
+ // Find the last '/' (since the password or the net addr might contain a '/')
+ foundSlash := false
+ for i := len(dsn) - 1; i >= 0; i-- {
+ if dsn[i] == '/' {
+ foundSlash = true
+ var j, k int
+
+ // left part is empty if i <= 0
+ if i > 0 {
+ // [username[:password]@][protocol[(address)]]
+ // Find the last '@' in dsn[:i]
+ for j = i; j >= 0; j-- {
+ if dsn[j] == '@' {
+ // username[:password]
+ // Find the first ':' in dsn[:j]
+ for k = 0; k < j; k++ {
+ if dsn[k] == ':' {
+ cfg.passwd = dsn[k+1 : j]
+ break
+ }
+ }
+ cfg.user = dsn[:k]
+
+ break
+ }
+ }
+
+ // [protocol[(address)]]
+ // Find the first '(' in dsn[j+1:i]
+ for k = j + 1; k < i; k++ {
+ if dsn[k] == '(' {
+ // dsn[i-1] must be == ')' if an address is specified
+ if dsn[i-1] != ')' {
+ if strings.ContainsRune(dsn[k+1:i], ')') {
+ return nil, errInvalidDSNUnescaped
+ }
+ return nil, errInvalidDSNAddr
+ }
+ cfg.addr = dsn[k+1 : i-1]
+ break
+ }
+ }
+ cfg.net = dsn[j+1 : k]
+ }
+
+ // dbname[?param1=value1&...&paramN=valueN]
+ // Find the first '?' in dsn[i+1:]
+ for j = i + 1; j < len(dsn); j++ {
+ if dsn[j] == '?' {
+ if err = parseDSNParams(cfg, dsn[j+1:]); err != nil {
+ return
+ }
+ break
+ }
+ }
+ cfg.dbname = dsn[i+1 : j]
+
+ break
+ }
+ }
+
+ if !foundSlash && len(dsn) > 0 {
+ return nil, errInvalidDSNNoSlash
+ }
+
+ // Set default network if empty
+ if cfg.net == "" {
+ cfg.net = "tcp"
+ }
+
+ // Set default address if empty
+ if cfg.addr == "" {
+ switch cfg.net {
+ case "tcp":
+ cfg.addr = "127.0.0.1:3306"
+ case "unix":
+ cfg.addr = "/tmp/mysql.sock"
+ default:
+ return nil, errors.New("Default addr for network '" + cfg.net + "' unknown")
+ }
+
+ }
+
+ return
+}
+
+// parseDSNParams parses the DSN "query string"
+// Values must be url.QueryEscape'ed
+func parseDSNParams(cfg *config, params string) (err error) {
+ for _, v := range strings.Split(params, "&") {
+ param := strings.SplitN(v, "=", 2)
+ if len(param) != 2 {
+ continue
+ }
+
+ // cfg params
+ switch value := param[1]; param[0] {
+
+ // Disable INFILE whitelist / enable all files
+ case "allowAllFiles":
+ var isBool bool
+ cfg.allowAllFiles, isBool = readBool(value)
+ if !isBool {
+ return fmt.Errorf("Invalid Bool value: %s", value)
+ }
+
+ // Use old authentication mode (pre MySQL 4.1)
+ case "allowOldPasswords":
+ var isBool bool
+ cfg.allowOldPasswords, isBool = readBool(value)
+ if !isBool {
+ return fmt.Errorf("Invalid Bool value: %s", value)
+ }
+
+ // Switch "rowsAffected" mode
+ case "clientFoundRows":
+ var isBool bool
+ cfg.clientFoundRows, isBool = readBool(value)
+ if !isBool {
+ return fmt.Errorf("Invalid Bool value: %s", value)
+ }
+
+ // Collation
+ case "collation":
+ collation, ok := collations[value]
+ if !ok {
+ // Note possibility for false negatives:
+ // could be triggered although the collation is valid if the
+ // collations map does not contain entries the server supports.
+ err = errors.New("unknown collation")
+ return
+ }
+ cfg.collation = collation
+ break
+
+ // Time Location
+ case "loc":
+ if value, err = url.QueryUnescape(value); err != nil {
+ return
+ }
+ cfg.loc, err = time.LoadLocation(value)
+ if err != nil {
+ return
+ }
+
+ // Dial Timeout
+ case "timeout":
+ cfg.timeout, err = time.ParseDuration(value)
+ if err != nil {
+ return
+ }
+
+ // TLS-Encryption
+ case "tls":
+ boolValue, isBool := readBool(value)
+ if isBool {
+ if boolValue {
+ cfg.tls = &tls.Config{}
+ }
+ } else {
+ if strings.ToLower(value) == "skip-verify" {
+ cfg.tls = &tls.Config{InsecureSkipVerify: true}
+ } else if tlsConfig, ok := tlsConfigRegister[value]; ok {
+ cfg.tls = tlsConfig
+ } else {
+ return fmt.Errorf("Invalid value / unknown config name: %s", value)
+ }
+ }
+
+ default:
+ // lazy init
+ if cfg.params == nil {
+ cfg.params = make(map[string]string)
+ }
+
+ if cfg.params[param[0]], err = url.QueryUnescape(value); err != nil {
+ return
+ }
+ }
}
+
+ return
}
// Returns the bool value of the input.
@@ -252,15 +451,19 @@ func (nt NullTime) Value() (driver.Value, error) {
}
func parseDateTime(str string, loc *time.Location) (t time.Time, err error) {
- base := "0000-00-00 00:00:00.0000000"
switch len(str) {
- case 10, 19, 21, 22, 23, 24, 25, 26: // up to "YYYY-MM-DD HH:MM:SS.MMMMMM"
- if str == base[:len(str)] {
+ case 10: // YYYY-MM-DD
+ if str == "0000-00-00" {
return
}
- t, err = time.Parse(timeFormat[:len(str)], str)
+ t, err = time.Parse(timeFormat[:10], str)
+ case 19: // YYYY-MM-DD HH:MM:SS
+ if str == "0000-00-00 00:00:00" {
+ return
+ }
+ t, err = time.Parse(timeFormat, str)
default:
- err = fmt.Errorf("invalid time string: %s", str)
+ err = fmt.Errorf("Invalid Time-String: %s", str)
return
}
@@ -309,151 +512,87 @@ func parseBinaryDateTime(num uint64, data []byte, loc *time.Location) (driver.Va
loc,
), nil
}
- return nil, fmt.Errorf("invalid DATETIME packet length %d", num)
+ return nil, fmt.Errorf("Invalid DATETIME-packet length %d", num)
}
// zeroDateTime is used in formatBinaryDateTime to avoid an allocation
// if the DATE or DATETIME has the zero value.
// It must never be changed.
// The current behavior depends on database/sql copying the result.
-var zeroDateTime = []byte("0000-00-00 00:00:00.000000")
-
-const digits01 = "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"
-const digits10 = "0000000000111111111122222222223333333333444444444455555555556666666666777777777788888888889999999999"
+var zeroDateTime = []byte("0000-00-00 00:00:00")
-func formatBinaryDateTime(src []byte, length uint8, justTime bool) (driver.Value, error) {
- // length expects the deterministic length of the zero value,
- // negative time and 100+ hours are automatically added if needed
+func formatBinaryDateTime(src []byte, withTime bool) (driver.Value, error) {
if len(src) == 0 {
- if justTime {
- return zeroDateTime[11 : 11+length], nil
+ if withTime {
+ return zeroDateTime, nil
}
- return zeroDateTime[:length], nil
- }
- var dst []byte // return value
- var pt, p1, p2, p3 byte // current digit pair
- var zOffs byte // offset of value in zeroDateTime
- if justTime {
- switch length {
- case
- 8, // time (can be up to 10 when negative and 100+ hours)
- 10, 11, 12, 13, 14, 15: // time with fractional seconds
- default:
- return nil, fmt.Errorf("illegal TIME length %d", length)
- }
- switch len(src) {
- case 8, 12:
- default:
- return nil, fmt.Errorf("invalid TIME packet length %d", len(src))
- }
- // +2 to enable negative time and 100+ hours
- dst = make([]byte, 0, length+2)
- if src[0] == 1 {
- dst = append(dst, '-')
- }
- if src[1] != 0 {
- hour := uint16(src[1])*24 + uint16(src[5])
- pt = byte(hour / 100)
- p1 = byte(hour - 100*uint16(pt))
- dst = append(dst, digits01[pt])
+ return zeroDateTime[:10], nil
+ }
+ var dst []byte
+ if withTime {
+ if len(src) == 11 {
+ dst = []byte("0000-00-00 00:00:00.000000")
} else {
- p1 = src[5]
+ dst = []byte("0000-00-00 00:00:00")
}
- zOffs = 11
- src = src[6:]
} else {
- switch length {
- case 10, 19, 21, 22, 23, 24, 25, 26:
- default:
- t := "DATE"
- if length > 10 {
- t += "TIME"
- }
- return nil, fmt.Errorf("illegal %s length %d", t, length)
- }
- switch len(src) {
- case 4, 7, 11:
- default:
- t := "DATE"
- if length > 10 {
- t += "TIME"
- }
- return nil, fmt.Errorf("illegal %s packet length %d", t, len(src))
- }
- dst = make([]byte, 0, length)
- // start with the date
+ dst = []byte("0000-00-00")
+ }
+ switch len(src) {
+ case 11:
+ microsecs := binary.LittleEndian.Uint32(src[7:11])
+ tmp32 := microsecs / 10
+ dst[25] += byte(microsecs - 10*tmp32)
+ tmp32, microsecs = tmp32/10, tmp32
+ dst[24] += byte(microsecs - 10*tmp32)
+ tmp32, microsecs = tmp32/10, tmp32
+ dst[23] += byte(microsecs - 10*tmp32)
+ tmp32, microsecs = tmp32/10, tmp32
+ dst[22] += byte(microsecs - 10*tmp32)
+ tmp32, microsecs = tmp32/10, tmp32
+ dst[21] += byte(microsecs - 10*tmp32)
+ dst[20] += byte(microsecs / 10)
+ fallthrough
+ case 7:
+ second := src[6]
+ tmp := second / 10
+ dst[18] += second - 10*tmp
+ dst[17] += tmp
+ minute := src[5]
+ tmp = minute / 10
+ dst[15] += minute - 10*tmp
+ dst[14] += tmp
+ hour := src[4]
+ tmp = hour / 10
+ dst[12] += hour - 10*tmp
+ dst[11] += tmp
+ fallthrough
+ case 4:
+ day := src[3]
+ tmp := day / 10
+ dst[9] += day - 10*tmp
+ dst[8] += tmp
+ month := src[2]
+ tmp = month / 10
+ dst[6] += month - 10*tmp
+ dst[5] += tmp
year := binary.LittleEndian.Uint16(src[:2])
- pt = byte(year / 100)
- p1 = byte(year - 100*uint16(pt))
- p2, p3 = src[2], src[3]
- dst = append(dst,
- digits10[pt], digits01[pt],
- digits10[p1], digits01[p1], '-',
- digits10[p2], digits01[p2], '-',
- digits10[p3], digits01[p3],
- )
- if length == 10 {
- return dst, nil
- }
- if len(src) == 4 {
- return append(dst, zeroDateTime[10:length]...), nil
- }
- dst = append(dst, ' ')
- p1 = src[4] // hour
- src = src[5:]
- }
- // p1 is 2-digit hour, src is after hour
- p2, p3 = src[0], src[1]
- dst = append(dst,
- digits10[p1], digits01[p1], ':',
- digits10[p2], digits01[p2], ':',
- digits10[p3], digits01[p3],
- )
- if length <= byte(len(dst)) {
+ tmp16 := year / 10
+ dst[3] += byte(year - 10*tmp16)
+ tmp16, year = tmp16/10, tmp16
+ dst[2] += byte(year - 10*tmp16)
+ tmp16, year = tmp16/10, tmp16
+ dst[1] += byte(year - 10*tmp16)
+ dst[0] += byte(tmp16)
return dst, nil
}
- src = src[2:]
- if len(src) == 0 {
- return append(dst, zeroDateTime[19:zOffs+length]...), nil
- }
- microsecs := binary.LittleEndian.Uint32(src[:4])
- p1 = byte(microsecs / 10000)
- microsecs -= 10000 * uint32(p1)
- p2 = byte(microsecs / 100)
- microsecs -= 100 * uint32(p2)
- p3 = byte(microsecs)
- switch decimals := zOffs + length - 20; decimals {
- default:
- return append(dst, '.',
- digits10[p1], digits01[p1],
- digits10[p2], digits01[p2],
- digits10[p3], digits01[p3],
- ), nil
- case 1:
- return append(dst, '.',
- digits10[p1],
- ), nil
- case 2:
- return append(dst, '.',
- digits10[p1], digits01[p1],
- ), nil
- case 3:
- return append(dst, '.',
- digits10[p1], digits01[p1],
- digits10[p2],
- ), nil
- case 4:
- return append(dst, '.',
- digits10[p1], digits01[p1],
- digits10[p2], digits01[p2],
- ), nil
- case 5:
- return append(dst, '.',
- digits10[p1], digits01[p1],
- digits10[p2], digits01[p2],
- digits10[p3],
- ), nil
+ var t string
+ if withTime {
+ t = "DATETIME"
+ } else {
+ t = "DATE"
}
+ return nil, fmt.Errorf("invalid %s-packet length %d", t, len(src))
}
/******************************************************************************
@@ -544,10 +683,6 @@ func skipLengthEncodedString(b []byte) (int, error) {
// returns the number read, whether the value is NULL and the number of bytes read
func readLengthEncodedInteger(b []byte) (uint64, bool, int) {
- // See issue #349
- if len(b) == 0 {
- return 0, true, 1
- }
switch b[0] {
// 251: NULL
@@ -589,152 +724,3 @@ func appendLengthEncodedInteger(b []byte, n uint64) []byte {
return append(b, 0xfe, byte(n), byte(n>>8), byte(n>>16), byte(n>>24),
byte(n>>32), byte(n>>40), byte(n>>48), byte(n>>56))
}
-
-// reserveBuffer checks cap(buf) and expand buffer to len(buf) + appendSize.
-// If cap(buf) is not enough, reallocate new buffer.
-func reserveBuffer(buf []byte, appendSize int) []byte {
- newSize := len(buf) + appendSize
- if cap(buf) < newSize {
- // Grow buffer exponentially
- newBuf := make([]byte, len(buf)*2+appendSize)
- copy(newBuf, buf)
- buf = newBuf
- }
- return buf[:newSize]
-}
-
-// escapeBytesBackslash escapes []byte with backslashes (\)
-// This escapes the contents of a string (provided as []byte) by adding backslashes before special
-// characters, and turning others into specific escape sequences, such as
-// turning newlines into \n and null bytes into \0.
-// https://github.com/mysql/mysql-server/blob/mysql-5.7.5/mysys/charset.c#L823-L932
-func escapeBytesBackslash(buf, v []byte) []byte {
- pos := len(buf)
- buf = reserveBuffer(buf, len(v)*2)
-
- for _, c := range v {
- switch c {
- case '\x00':
- buf[pos] = '\\'
- buf[pos+1] = '0'
- pos += 2
- case '\n':
- buf[pos] = '\\'
- buf[pos+1] = 'n'
- pos += 2
- case '\r':
- buf[pos] = '\\'
- buf[pos+1] = 'r'
- pos += 2
- case '\x1a':
- buf[pos] = '\\'
- buf[pos+1] = 'Z'
- pos += 2
- case '\'':
- buf[pos] = '\\'
- buf[pos+1] = '\''
- pos += 2
- case '"':
- buf[pos] = '\\'
- buf[pos+1] = '"'
- pos += 2
- case '\\':
- buf[pos] = '\\'
- buf[pos+1] = '\\'
- pos += 2
- default:
- buf[pos] = c
- pos++
- }
- }
-
- return buf[:pos]
-}
-
-// escapeStringBackslash is similar to escapeBytesBackslash but for string.
-func escapeStringBackslash(buf []byte, v string) []byte {
- pos := len(buf)
- buf = reserveBuffer(buf, len(v)*2)
-
- for i := 0; i < len(v); i++ {
- c := v[i]
- switch c {
- case '\x00':
- buf[pos] = '\\'
- buf[pos+1] = '0'
- pos += 2
- case '\n':
- buf[pos] = '\\'
- buf[pos+1] = 'n'
- pos += 2
- case '\r':
- buf[pos] = '\\'
- buf[pos+1] = 'r'
- pos += 2
- case '\x1a':
- buf[pos] = '\\'
- buf[pos+1] = 'Z'
- pos += 2
- case '\'':
- buf[pos] = '\\'
- buf[pos+1] = '\''
- pos += 2
- case '"':
- buf[pos] = '\\'
- buf[pos+1] = '"'
- pos += 2
- case '\\':
- buf[pos] = '\\'
- buf[pos+1] = '\\'
- pos += 2
- default:
- buf[pos] = c
- pos++
- }
- }
-
- return buf[:pos]
-}
-
-// escapeBytesQuotes escapes apostrophes in []byte by doubling them up.
-// This escapes the contents of a string by doubling up any apostrophes that
-// it contains. This is used when the NO_BACKSLASH_ESCAPES SQL_MODE is in
-// effect on the server.
-// https://github.com/mysql/mysql-server/blob/mysql-5.7.5/mysys/charset.c#L963-L1038
-func escapeBytesQuotes(buf, v []byte) []byte {
- pos := len(buf)
- buf = reserveBuffer(buf, len(v)*2)
-
- for _, c := range v {
- if c == '\'' {
- buf[pos] = '\''
- buf[pos+1] = '\''
- pos += 2
- } else {
- buf[pos] = c
- pos++
- }
- }
-
- return buf[:pos]
-}
-
-// escapeStringQuotes is similar to escapeBytesQuotes but for string.
-func escapeStringQuotes(buf []byte, v string) []byte {
- pos := len(buf)
- buf = reserveBuffer(buf, len(v)*2)
-
- for i := 0; i < len(v); i++ {
- c := v[i]
- if c == '\'' {
- buf[pos] = '\''
- buf[pos+1] = '\''
- pos += 2
- } else {
- buf[pos] = c
- pos++
- }
- }
-
- return buf[:pos]
-}
diff --git a/vendor/github.com/go-sql-driver/mysql/utils_test.go b/vendor/github.com/go-sql-driver/mysql/utils_test.go
index 0d6c6684f..301d81a62 100644
--- a/vendor/github.com/go-sql-driver/mysql/utils_test.go
+++ b/vendor/github.com/go-sql-driver/mysql/utils_test.go
@@ -16,6 +16,76 @@ import (
"time"
)
+var testDSNs = []struct {
+ in string
+ out string
+ loc *time.Location
+}{
+ {"username:password@protocol(address)/dbname?param=value", "&{user:username passwd:password net:protocol addr:address dbname:dbname params:map[param:value] loc:%p tls:<nil> timeout:0 collation:33 allowAllFiles:false allowOldPasswords:false clientFoundRows:false}", time.UTC},
+ {"user@unix(/path/to/socket)/dbname?charset=utf8", "&{user:user passwd: net:unix addr:/path/to/socket dbname:dbname params:map[charset:utf8] loc:%p tls:<nil> timeout:0 collation:33 allowAllFiles:false allowOldPasswords:false clientFoundRows:false}", time.UTC},
+ {"user:password@tcp(localhost:5555)/dbname?charset=utf8&tls=true", "&{user:user passwd:password net:tcp addr:localhost:5555 dbname:dbname params:map[charset:utf8] loc:%p tls:<nil> timeout:0 collation:33 allowAllFiles:false allowOldPasswords:false clientFoundRows:false}", time.UTC},
+ {"user:password@tcp(localhost:5555)/dbname?charset=utf8mb4,utf8&tls=skip-verify", "&{user:user passwd:password net:tcp addr:localhost:5555 dbname:dbname params:map[charset:utf8mb4,utf8] loc:%p tls:<nil> timeout:0 collation:33 allowAllFiles:false allowOldPasswords:false clientFoundRows:false}", time.UTC},
+ {"user:password@/dbname?loc=UTC&timeout=30s&allowAllFiles=1&clientFoundRows=true&allowOldPasswords=TRUE&collation=utf8mb4_unicode_ci", "&{user:user passwd:password net:tcp addr:127.0.0.1:3306 dbname:dbname params:map[] loc:%p tls:<nil> timeout:30000000000 collation:224 allowAllFiles:true allowOldPasswords:true clientFoundRows:true}", time.UTC},
+ {"user:p@ss(word)@tcp([de:ad:be:ef::ca:fe]:80)/dbname?loc=Local", "&{user:user passwd:p@ss(word) net:tcp addr:[de:ad:be:ef::ca:fe]:80 dbname:dbname params:map[] loc:%p tls:<nil> timeout:0 collation:33 allowAllFiles:false allowOldPasswords:false clientFoundRows:false}", time.Local},
+ {"/dbname", "&{user: passwd: net:tcp addr:127.0.0.1:3306 dbname:dbname params:map[] loc:%p tls:<nil> timeout:0 collation:33 allowAllFiles:false allowOldPasswords:false clientFoundRows:false}", time.UTC},
+ {"@/", "&{user: passwd: net:tcp addr:127.0.0.1:3306 dbname: params:map[] loc:%p tls:<nil> timeout:0 collation:33 allowAllFiles:false allowOldPasswords:false clientFoundRows:false}", time.UTC},
+ {"/", "&{user: passwd: net:tcp addr:127.0.0.1:3306 dbname: params:map[] loc:%p tls:<nil> timeout:0 collation:33 allowAllFiles:false allowOldPasswords:false clientFoundRows:false}", time.UTC},
+ {"", "&{user: passwd: net:tcp addr:127.0.0.1:3306 dbname: params:map[] loc:%p tls:<nil> timeout:0 collation:33 allowAllFiles:false allowOldPasswords:false clientFoundRows:false}", time.UTC},
+ {"user:p@/ssword@/", "&{user:user passwd:p@/ssword net:tcp addr:127.0.0.1:3306 dbname: params:map[] loc:%p tls:<nil> timeout:0 collation:33 allowAllFiles:false allowOldPasswords:false clientFoundRows:false}", time.UTC},
+ {"unix/?arg=%2Fsome%2Fpath.ext", "&{user: passwd: net:unix addr:/tmp/mysql.sock dbname: params:map[arg:/some/path.ext] loc:%p tls:<nil> timeout:0 collation:33 allowAllFiles:false allowOldPasswords:false clientFoundRows:false}", time.UTC},
+}
+
+func TestDSNParser(t *testing.T) {
+ var cfg *config
+ var err error
+ var res string
+
+ for i, tst := range testDSNs {
+ cfg, err = parseDSN(tst.in)
+ if err != nil {
+ t.Error(err.Error())
+ }
+
+ // pointer not static
+ cfg.tls = nil
+
+ res = fmt.Sprintf("%+v", cfg)
+ if res != fmt.Sprintf(tst.out, tst.loc) {
+ t.Errorf("%d. parseDSN(%q) => %q, want %q", i, tst.in, res, fmt.Sprintf(tst.out, tst.loc))
+ }
+ }
+}
+
+func TestDSNParserInvalid(t *testing.T) {
+ var invalidDSNs = []string{
+ "@net(addr/", // no closing brace
+ "@tcp(/", // no closing brace
+ "tcp(/", // no closing brace
+ "(/", // no closing brace
+ "net(addr)//", // unescaped
+ "user:pass@tcp(1.2.3.4:3306)", // no trailing slash
+ //"/dbname?arg=/some/unescaped/path",
+ }
+
+ for i, tst := range invalidDSNs {
+ if _, err := parseDSN(tst); err == nil {
+ t.Errorf("invalid DSN #%d. (%s) didn't error!", i, tst)
+ }
+ }
+}
+
+func BenchmarkParseDSN(b *testing.B) {
+ b.ReportAllocs()
+
+ for i := 0; i < b.N; i++ {
+ for _, tst := range testDSNs {
+ if _, err := parseDSN(tst.in); err != nil {
+ b.Error(err.Error())
+ }
+ }
+ }
+}
+
func TestScanNullTime(t *testing.T) {
var scanTests = []struct {
in interface{}
@@ -121,77 +191,22 @@ func TestFormatBinaryDateTime(t *testing.T) {
rawDate[5] = 46 // minutes
rawDate[6] = 23 // seconds
binary.LittleEndian.PutUint32(rawDate[7:], 987654) // microseconds
- expect := func(expected string, inlen, outlen uint8) {
- actual, _ := formatBinaryDateTime(rawDate[:inlen], outlen, false)
+ expect := func(expected string, length int, withTime bool) {
+ actual, _ := formatBinaryDateTime(rawDate[:length], withTime)
bytes, ok := actual.([]byte)
if !ok {
t.Errorf("formatBinaryDateTime must return []byte, was %T", actual)
}
if string(bytes) != expected {
t.Errorf(
- "expected %q, got %q for length in %d, out %d",
- bytes, actual, inlen, outlen,
+ "expected %q, got %q for length %d, withTime %v",
+ bytes, actual, length, withTime,
)
}
}
- expect("0000-00-00", 0, 10)
- expect("0000-00-00 00:00:00", 0, 19)
- expect("1978-12-30", 4, 10)
- expect("1978-12-30 15:46:23", 7, 19)
- expect("1978-12-30 15:46:23.987654", 11, 26)
-}
-
-func TestEscapeBackslash(t *testing.T) {
- expect := func(expected, value string) {
- actual := string(escapeBytesBackslash([]byte{}, []byte(value)))
- if actual != expected {
- t.Errorf(
- "expected %s, got %s",
- expected, actual,
- )
- }
-
- actual = string(escapeStringBackslash([]byte{}, value))
- if actual != expected {
- t.Errorf(
- "expected %s, got %s",
- expected, actual,
- )
- }
- }
-
- expect("foo\\0bar", "foo\x00bar")
- expect("foo\\nbar", "foo\nbar")
- expect("foo\\rbar", "foo\rbar")
- expect("foo\\Zbar", "foo\x1abar")
- expect("foo\\\"bar", "foo\"bar")
- expect("foo\\\\bar", "foo\\bar")
- expect("foo\\'bar", "foo'bar")
-}
-
-func TestEscapeQuotes(t *testing.T) {
- expect := func(expected, value string) {
- actual := string(escapeBytesQuotes([]byte{}, []byte(value)))
- if actual != expected {
- t.Errorf(
- "expected %s, got %s",
- expected, actual,
- )
- }
-
- actual = string(escapeStringQuotes([]byte{}, value))
- if actual != expected {
- t.Errorf(
- "expected %s, got %s",
- expected, actual,
- )
- }
- }
-
- expect("foo\x00bar", "foo\x00bar") // not affected
- expect("foo\nbar", "foo\nbar") // not affected
- expect("foo\rbar", "foo\rbar") // not affected
- expect("foo\x1abar", "foo\x1abar") // not affected
- expect("foo''bar", "foo'bar") // affected
- expect("foo\"bar", "foo\"bar") // not affected
+ expect("0000-00-00", 0, false)
+ expect("0000-00-00 00:00:00", 0, true)
+ expect("1978-12-30", 4, false)
+ expect("1978-12-30 15:46:23", 7, true)
+ expect("1978-12-30 15:46:23.987654", 11, true)
}
diff --git a/vendor/github.com/goamz/goamz/aws/aws.go b/vendor/github.com/goamz/goamz/aws/aws.go
index 77bf563d6..49eed632e 100644
--- a/vendor/github.com/goamz/goamz/aws/aws.go
+++ b/vendor/github.com/goamz/goamz/aws/aws.go
@@ -65,6 +65,7 @@ type Region struct {
var Regions = map[string]Region{
APNortheast.Name: APNortheast,
+ APNortheast2.Name: APNortheast2,
APSoutheast.Name: APSoutheast,
APSoutheast2.Name: APSoutheast2,
EUCentral.Name: EUCentral,
@@ -390,6 +391,7 @@ func SharedAuth() (auth Auth, err error) {
auth.AccessKey = profile["aws_access_key_id"]
auth.SecretKey = profile["aws_secret_access_key"]
+ auth.token = profile["aws_session_token"]
if auth.AccessKey == "" {
err = errors.New("AWS_ACCESS_KEY_ID not found in environment in credentials file")
diff --git a/vendor/github.com/goamz/goamz/aws/regions.go b/vendor/github.com/goamz/goamz/aws/regions.go
index 5e18f023d..94d79d46d 100644
--- a/vendor/github.com/goamz/goamz/aws/regions.go
+++ b/vendor/github.com/goamz/goamz/aws/regions.go
@@ -207,6 +207,29 @@ var APNortheast = Region{
"https://streams.dynamodb.ap-northeast-1.amazonaws.com",
}
+var APNortheast2 = Region{
+ "ap-northeast-2",
+ "https://ec2.ap-northeast-2.amazonaws.com",
+ "https://s3-ap-northeast-2.amazonaws.com",
+ "",
+ true,
+ true,
+ "https://sdb.ap-northeast-2.amazonaws.com",
+ "",
+ "https://sns.ap-northeast-2.amazonaws.com",
+ "https://sqs.ap-northeast-2.amazonaws.com",
+ "https://iam.amazonaws.com",
+ "https://elasticloadbalancing.ap-northeast-2.amazonaws.com",
+ "https://dynamodb.ap-northeast-2.amazonaws.com",
+ ServiceInfo{"https://monitoring.ap-northeast-2.amazonaws.com", V2Signature},
+ "https://autoscaling.ap-northeast-2.amazonaws.com",
+ ServiceInfo{"https://rds.ap-northeast-2.amazonaws.com", V2Signature},
+ "https://sts.amazonaws.com",
+ "https://cloudformation.ap-northeast-2.amazonaws.com",
+ "https://ecs.ap-northeast-2.amazonaws.com",
+ "https://streams.dynamodb.ap-northeast-2.amazonaws.com",
+}
+
var SAEast = Region{
"sa-east-1",
"https://ec2.sa-east-1.amazonaws.com",
diff --git a/vendor/github.com/goamz/goamz/exp/ses/ses.go b/vendor/github.com/goamz/goamz/exp/ses/ses.go
index 7c9c7c352..3896c5253 100644
--- a/vendor/github.com/goamz/goamz/exp/ses/ses.go
+++ b/vendor/github.com/goamz/goamz/exp/ses/ses.go
@@ -113,6 +113,10 @@ func (ses *SES) doPost(action string, data url.Values) error {
req.URL = URL
req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
+ token := ses.auth.Token()
+ if token != "" {
+ req.Header.Set("X-Amz-Security-Token", token)
+ }
sign(ses.auth, "POST", req.Header)
data.Add("AWSAccessKeyId", ses.auth.AccessKey)
@@ -139,7 +143,7 @@ func (ses *SES) doPost(action string, data url.Values) error {
}
func buildError(r *http.Response) *SESError {
- err := SESError{}
- xml.NewDecoder(r.Body).Decode(&err)
- return &err
+ rootElem := errorResponse{}
+ xml.NewDecoder(r.Body).Decode(&rootElem)
+ return &rootElem.Error
}
diff --git a/vendor/github.com/goamz/goamz/exp/ses/ses_types.go b/vendor/github.com/goamz/goamz/exp/ses/ses_types.go
index 698fa7623..d26e83740 100644
--- a/vendor/github.com/goamz/goamz/exp/ses/ses_types.go
+++ b/vendor/github.com/goamz/goamz/exp/ses/ses_types.go
@@ -45,6 +45,10 @@ type SESError struct {
RequestId string
}
+type errorResponse struct {
+ Error SESError
+}
+
func (err *SESError) Error() string {
return err.Message
}
diff --git a/vendor/github.com/goamz/goamz/s3/s3test/server.go b/vendor/github.com/goamz/goamz/s3/s3test/server.go
index bf4dd8a3c..04808d3ad 100644
--- a/vendor/github.com/goamz/goamz/s3/s3test/server.go
+++ b/vendor/github.com/goamz/goamz/s3/s3test/server.go
@@ -497,6 +497,8 @@ type objectResource struct {
object *object // may be nil.
}
+const awsTimeFormat = "Mon, 2 Jan 2006 15:04:05 GMT"
+
// GET on an object gets the contents of the object.
// http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTObjectGET.html
func (objr objectResource) get(a *action) interface{} {
@@ -531,7 +533,7 @@ func (objr objectResource) get(a *action) interface{} {
// TODO x-amz-request-id
h.Set("Content-Length", fmt.Sprint(len(obj.data)))
h.Set("ETag", hex.EncodeToString(obj.checksum))
- h.Set("Last-Modified", obj.mtime.Format(time.RFC1123))
+ h.Set("Last-Modified", obj.mtime.Format(awsTimeFormat))
if a.req.Method == "HEAD" {
return nil
}
diff --git a/vendor/github.com/goamz/goamz/sqs/sqs.go b/vendor/github.com/goamz/goamz/sqs/sqs.go
index 4005b1b37..23f1951ab 100644
--- a/vendor/github.com/goamz/goamz/sqs/sqs.go
+++ b/vendor/github.com/goamz/goamz/sqs/sqs.go
@@ -34,7 +34,8 @@ const debug = false
type SQS struct {
aws.Auth
aws.Region
- private byte // Reserve the right of using private data.
+ private byte // Reserve the right of using private data.
+ transport *http.Transport
}
// NewFrom Create A new SQS Client given an access and secret Key
@@ -59,6 +60,8 @@ func NewFrom(accessKey, secretKey, region string) (*SQS, error) {
aws_region = aws.APSoutheast2
case "ap.northeast", "ap.northeast.1":
aws_region = aws.APNortheast
+ case "ap.northeast.2":
+ aws_region = aws.APNortheast2
case "sa.east", "sa.east.1":
aws_region = aws.SAEast
case "cn.north", "cn.north.1":
@@ -73,7 +76,12 @@ func NewFrom(accessKey, secretKey, region string) (*SQS, error) {
// NewFrom Create A new SQS Client from an exisisting aws.Auth
func New(auth aws.Auth, region aws.Region) *SQS {
- return &SQS{auth, region, 0}
+ return &SQS{auth, region, 0, nil}
+}
+
+// NewFromTransport Create A new SQS Client that uses a given &http.Transport
+func NewFromTransport(auth aws.Auth, region aws.Region, transport *http.Transport) *SQS {
+ return &SQS{auth, region, 0, transport}
}
// Queue Reference to a Queue
@@ -511,11 +519,16 @@ func (s *SQS) query(queueUrl string, params map[string]string, resp interface{})
}
signer := aws.NewV4Signer(s.Auth, "sqs", s.Region)
signer.Sign(req)
- client := http.Client{}
+ var client http.Client
+ if s.transport == nil {
+ client = http.Client{}
+ } else {
+ client = http.Client{Transport: s.transport}
+ }
r, err = client.Do(req)
if debug {
- log.Printf("GET ", url_.String())
+ log.Printf("GET %s\n", url_.String())
}
if err != nil {
@@ -526,7 +539,7 @@ func (s *SQS) query(queueUrl string, params map[string]string, resp interface{})
if debug {
dump, _ := httputil.DumpResponse(r, true)
- log.Printf("DUMP:\n", string(dump))
+ log.Printf("DUMP:%s\n", string(dump))
}
if r.StatusCode != 200 {
diff --git a/vendor/github.com/golang/freetype/example/genbasicfont/main.go b/vendor/github.com/golang/freetype/example/genbasicfont/main.go
new file mode 100644
index 000000000..5b2f2bc6f
--- /dev/null
+++ b/vendor/github.com/golang/freetype/example/genbasicfont/main.go
@@ -0,0 +1,237 @@
+// Copyright 2016 The Freetype-Go Authors. All rights reserved.
+// Use of this source code is governed by your choice of either the
+// FreeType License or the GNU General Public License version 2 (or
+// any later version), both of which can be found in the LICENSE file.
+
+// +build example
+//
+// This build tag means that "go install github.com/golang/freetype/..."
+// doesn't install this example program. Use "go run main.go" to run it or "go
+// install -tags=example" to install it.
+
+// Program genbasicfont generates Go source code that imports
+// golang.org/x/image/font/basicfont to provide a fixed width font face.
+package main
+
+import (
+ "bytes"
+ "flag"
+ "fmt"
+ "go/format"
+ "image"
+ "image/draw"
+ "io/ioutil"
+ "log"
+ "net/http"
+ "strings"
+ "unicode"
+
+ "github.com/golang/freetype/truetype"
+ "golang.org/x/image/font"
+ "golang.org/x/image/math/fixed"
+)
+
+var (
+ fontfile = flag.String("fontfile", "../../testdata/luxisr.ttf", "filename or URL of the TTF font")
+ hinting = flag.String("hinting", "none", "none, vertical or full")
+ pkg = flag.String("pkg", "example", "the package name for the generated code")
+ size = flag.Float64("size", 12, "the number of pixels in 1 em")
+ vr = flag.String("var", "example", "the variable name for the generated code")
+)
+
+func loadFontFile() ([]byte, error) {
+ if strings.HasPrefix(*fontfile, "http://") || strings.HasPrefix(*fontfile, "https://") {
+ resp, err := http.Get(*fontfile)
+ if err != nil {
+ return nil, err
+ }
+ defer resp.Body.Close()
+ return ioutil.ReadAll(resp.Body)
+ }
+ return ioutil.ReadFile(*fontfile)
+}
+
+func parseHinting(h string) font.Hinting {
+ switch h {
+ case "full":
+ return font.HintingFull
+ case "vertical":
+ log.Fatal("TODO: have package truetype implement vertical hinting")
+ return font.HintingVertical
+ }
+ return font.HintingNone
+}
+
+func privateUseArea(r rune) bool {
+ return 0xe000 <= r && r <= 0xf8ff ||
+ 0xf0000 <= r && r <= 0xffffd ||
+ 0x100000 <= r && r <= 0x10fffd
+}
+
+func loadRanges(f *truetype.Font) (ret [][2]rune) {
+ rr := [2]rune{-1, -1}
+ for r := rune(0); r <= unicode.MaxRune; r++ {
+ if privateUseArea(r) {
+ continue
+ }
+ if f.Index(r) == 0 {
+ continue
+ }
+ if rr[1] == r {
+ rr[1] = r + 1
+ continue
+ }
+ if rr[0] != -1 {
+ ret = append(ret, rr)
+ }
+ rr = [2]rune{r, r + 1}
+ }
+ if rr[0] != -1 {
+ ret = append(ret, rr)
+ }
+ return ret
+}
+
+func emptyCol(m *image.Gray, r image.Rectangle, x int) bool {
+ for y := r.Min.Y; y < r.Max.Y; y++ {
+ if m.GrayAt(x, y).Y > 0 {
+ return false
+ }
+ }
+ return true
+}
+
+func emptyRow(m *image.Gray, r image.Rectangle, y int) bool {
+ for x := r.Min.X; x < r.Max.X; x++ {
+ if m.GrayAt(x, y).Y > 0 {
+ return false
+ }
+ }
+ return true
+}
+
+func tightBounds(m *image.Gray) (r image.Rectangle) {
+ r = m.Bounds()
+ for ; r.Min.Y < r.Max.Y && emptyRow(m, r, r.Min.Y+0); r.Min.Y++ {
+ }
+ for ; r.Min.Y < r.Max.Y && emptyRow(m, r, r.Max.Y-1); r.Max.Y-- {
+ }
+ for ; r.Min.X < r.Max.X && emptyCol(m, r, r.Min.X+0); r.Min.X++ {
+ }
+ for ; r.Min.X < r.Max.X && emptyCol(m, r, r.Max.X-1); r.Max.X-- {
+ }
+ return r
+}
+
+func printPix(ranges [][2]rune, glyphs map[rune]*image.Gray, b image.Rectangle) []byte {
+ buf := new(bytes.Buffer)
+ for _, rr := range ranges {
+ for r := rr[0]; r < rr[1]; r++ {
+ m := glyphs[r]
+ fmt.Fprintf(buf, "// U+%08x '%c'\n", r, r)
+ for y := b.Min.Y; y < b.Max.Y; y++ {
+ for x := b.Min.X; x < b.Max.X; x++ {
+ fmt.Fprintf(buf, "%#02x, ", m.GrayAt(x, y).Y)
+ }
+ fmt.Fprintln(buf)
+ }
+ fmt.Fprintln(buf)
+ }
+ }
+ return buf.Bytes()
+}
+
+func printRanges(ranges [][2]rune) []byte {
+ buf := new(bytes.Buffer)
+ offset := 0
+ for _, rr := range ranges {
+ fmt.Fprintf(buf, "{'\\U%08x', '\\U%08x', %d},\n", rr[0], rr[1], offset)
+ offset += int(rr[1] - rr[0])
+ }
+ return buf.Bytes()
+}
+
+func main() {
+ flag.Parse()
+ b, err := loadFontFile()
+ if err != nil {
+ log.Fatal(err)
+ }
+ f, err := truetype.Parse(b)
+ if err != nil {
+ log.Fatal(err)
+ }
+ face := truetype.NewFace(f, &truetype.Options{
+ Size: *size,
+ Hinting: parseHinting(*hinting),
+ })
+ defer face.Close()
+
+ fBounds := f.Bounds(fixed.Int26_6(*size * 64))
+ iBounds := image.Rect(
+ +fBounds.Min.X.Floor(),
+ -fBounds.Max.Y.Ceil(),
+ +fBounds.Max.X.Ceil(),
+ -fBounds.Min.Y.Floor(),
+ )
+
+ tBounds := image.Rectangle{}
+ glyphs := map[rune]*image.Gray{}
+ advance := fixed.Int26_6(-1)
+
+ ranges := loadRanges(f)
+ for _, rr := range ranges {
+ for r := rr[0]; r < rr[1]; r++ {
+ dr, mask, maskp, adv, ok := face.Glyph(fixed.Point26_6{}, r)
+ if !ok {
+ log.Fatalf("could not load glyph for %U", r)
+ }
+ if advance < 0 {
+ advance = adv
+ } else if advance != adv {
+ log.Fatalf("advance was not constant: got %v and %v", advance, adv)
+ }
+ dst := image.NewGray(iBounds)
+ draw.DrawMask(dst, dr, image.White, image.Point{}, mask, maskp, draw.Src)
+ glyphs[r] = dst
+ tBounds = tBounds.Union(tightBounds(dst))
+ }
+ }
+
+ // height is the glyph image height, not the inter-line spacing.
+ width, height := tBounds.Dx(), tBounds.Dy()
+
+ buf := new(bytes.Buffer)
+ fmt.Fprintf(buf, "// generated by go generate; DO NOT EDIT.\n\npackage %s\n\n", *pkg)
+ fmt.Fprintf(buf, "import (\n\"image\"\n\n\"golang.org/x/image/font/basicfont\"\n)\n\n")
+ fmt.Fprintf(buf, "// %s contains %d %d×%d glyphs in %d Pix bytes.\n",
+ *vr, len(glyphs), width, height, len(glyphs)*width*height)
+ fmt.Fprintf(buf, `var %s = basicfont.Face{
+ Advance: %d,
+ Width: %d,
+ Height: %d,
+ Ascent: %d,
+ Descent: %d,
+ Left: %d,
+ Mask: &image.Alpha{
+ Stride: %d,
+ Rect: image.Rectangle{Max: image.Point{%d, %d*%d}},
+ Pix: []byte{
+ %s
+ },
+ },
+ Ranges: []basicfont.Range{
+ %s
+ },
+ }`, *vr, advance.Ceil(), width, face.Metrics().Height.Ceil(), -tBounds.Min.Y, +tBounds.Max.Y, tBounds.Min.X,
+ width, width, len(glyphs), height,
+ printPix(ranges, glyphs, tBounds), printRanges(ranges))
+
+ fmted, err := format.Source(buf.Bytes())
+ if err != nil {
+ log.Fatalf("format.Source: %v", err)
+ }
+ if err := ioutil.WriteFile(*vr+".go", fmted, 0644); err != nil {
+ log.Fatalf("ioutil.WriteFile: %v", err)
+ }
+}
diff --git a/vendor/github.com/golang/freetype/truetype/hint.go b/vendor/github.com/golang/freetype/truetype/hint.go
index 0315de511..13f785bc3 100644
--- a/vendor/github.com/golang/freetype/truetype/hint.go
+++ b/vendor/github.com/golang/freetype/truetype/hint.go
@@ -341,7 +341,14 @@ func (h *hinter) run(program []byte, pCurrent, pUnhinted, pInFontUnits []Point,
case opSLOOP:
top--
- if h.stack[top] <= 0 {
+ // https://developer.apple.com/fonts/TrueType-Reference-Manual/RM05/Chap5.html#SLOOP
+ // says that "Setting the loop variable to zero is an error". In
+ // theory, the inequality on the next line should be "<=" instead
+ // of "<". In practice, some font files' bytecode, such as the '2'
+ // glyph in the DejaVuSansMono.ttf that comes with Ubuntu 14.04,
+ // issue SLOOP with a zero on top of the stack. Just like the C
+ // Freetype code, we allow the zero.
+ if h.stack[top] < 0 {
return errors.New("truetype: hinting: invalid data")
}
h.gs.loop = h.stack[top]
diff --git a/vendor/github.com/golang/groupcache/.gitignore b/vendor/github.com/golang/groupcache/.gitignore
deleted file mode 100644
index b25c15b81..000000000
--- a/vendor/github.com/golang/groupcache/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-*~
diff --git a/vendor/github.com/golang/groupcache/LICENSE b/vendor/github.com/golang/groupcache/LICENSE
deleted file mode 100644
index 37ec93a14..000000000
--- a/vendor/github.com/golang/groupcache/LICENSE
+++ /dev/null
@@ -1,191 +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:
-
-You must give any other recipients of the Work or Derivative Works a copy of
-this License; and
-You must cause any modified files to carry prominent notices stating that You
-changed the files; and
-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
-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/golang/groupcache/README.md b/vendor/github.com/golang/groupcache/README.md
deleted file mode 100644
index 70c29da16..000000000
--- a/vendor/github.com/golang/groupcache/README.md
+++ /dev/null
@@ -1,73 +0,0 @@
-# groupcache
-
-## Summary
-
-groupcache is a caching and cache-filling library, intended as a
-replacement for memcached in many cases.
-
-For API docs and examples, see http://godoc.org/github.com/golang/groupcache
-
-## Comparison to memcached
-
-### **Like memcached**, groupcache:
-
- * shards by key to select which peer is responsible for that key
-
-### **Unlike memcached**, groupcache:
-
- * does not require running a separate set of servers, thus massively
- reducing deployment/configuration pain. groupcache is a client
- library as well as a server. It connects to its own peers.
-
- * comes with a cache filling mechanism. Whereas memcached just says
- "Sorry, cache miss", often resulting in a thundering herd of
- database (or whatever) loads from an unbounded number of clients
- (which has resulted in several fun outages), groupcache coordinates
- cache fills such that only one load in one process of an entire
- replicated set of processes populates the cache, then multiplexes
- the loaded value to all callers.
-
- * does not support versioned values. If key "foo" is value "bar",
- key "foo" must always be "bar". There are neither cache expiration
- times, nor explicit cache evictions. Thus there is also no CAS,
- nor Increment/Decrement. This also means that groupcache....
-
- * ... supports automatic mirroring of super-hot items to multiple
- processes. This prevents memcached hot spotting where a machine's
- CPU and/or NIC are overloaded by very popular keys/values.
-
- * is currently only available for Go. It's very unlikely that I
- (bradfitz@) will port the code to any other language.
-
-## Loading process
-
-In a nutshell, a groupcache lookup of **Get("foo")** looks like:
-
-(On machine #5 of a set of N machines running the same code)
-
- 1. Is the value of "foo" in local memory because it's super hot? If so, use it.
-
- 2. Is the value of "foo" in local memory because peer #5 (the current
- peer) is the owner of it? If so, use it.
-
- 3. Amongst all the peers in my set of N, am I the owner of the key
- "foo"? (e.g. does it consistent hash to 5?) If so, load it. If
- other callers come in, via the same process or via RPC requests
- from peers, they block waiting for the load to finish and get the
- same answer. If not, RPC to the peer that's the owner and get
- the answer. If the RPC fails, just load it locally (still with
- local dup suppression).
-
-## Users
-
-groupcache is in production use by dl.google.com (its original user),
-parts of Blogger, parts of Google Code, parts of Google Fiber, parts
-of Google production monitoring systems, etc.
-
-## Presentations
-
-See http://talks.golang.org/2013/oscon-dl.slide
-
-## Help
-
-Use the golang-nuts mailing list for any discussion or questions.
diff --git a/vendor/github.com/golang/groupcache/byteview.go b/vendor/github.com/golang/groupcache/byteview.go
deleted file mode 100644
index 035a9ee44..000000000
--- a/vendor/github.com/golang/groupcache/byteview.go
+++ /dev/null
@@ -1,160 +0,0 @@
-/*
-Copyright 2012 Google 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 groupcache
-
-import (
- "bytes"
- "errors"
- "io"
- "strings"
-)
-
-// A ByteView holds an immutable view of bytes.
-// Internally it wraps either a []byte or a string,
-// but that detail is invisible to callers.
-//
-// A ByteView is meant to be used as a value type, not
-// a pointer (like a time.Time).
-type ByteView struct {
- // If b is non-nil, b is used, else s is used.
- b []byte
- s string
-}
-
-// Len returns the view's length.
-func (v ByteView) Len() int {
- if v.b != nil {
- return len(v.b)
- }
- return len(v.s)
-}
-
-// ByteSlice returns a copy of the data as a byte slice.
-func (v ByteView) ByteSlice() []byte {
- if v.b != nil {
- return cloneBytes(v.b)
- }
- return []byte(v.s)
-}
-
-// String returns the data as a string, making a copy if necessary.
-func (v ByteView) String() string {
- if v.b != nil {
- return string(v.b)
- }
- return v.s
-}
-
-// At returns the byte at index i.
-func (v ByteView) At(i int) byte {
- if v.b != nil {
- return v.b[i]
- }
- return v.s[i]
-}
-
-// Slice slices the view between the provided from and to indices.
-func (v ByteView) Slice(from, to int) ByteView {
- if v.b != nil {
- return ByteView{b: v.b[from:to]}
- }
- return ByteView{s: v.s[from:to]}
-}
-
-// SliceFrom slices the view from the provided index until the end.
-func (v ByteView) SliceFrom(from int) ByteView {
- if v.b != nil {
- return ByteView{b: v.b[from:]}
- }
- return ByteView{s: v.s[from:]}
-}
-
-// Copy copies b into dest and returns the number of bytes copied.
-func (v ByteView) Copy(dest []byte) int {
- if v.b != nil {
- return copy(dest, v.b)
- }
- return copy(dest, v.s)
-}
-
-// Equal returns whether the bytes in b are the same as the bytes in
-// b2.
-func (v ByteView) Equal(b2 ByteView) bool {
- if b2.b == nil {
- return v.EqualString(b2.s)
- }
- return v.EqualBytes(b2.b)
-}
-
-// EqualString returns whether the bytes in b are the same as the bytes
-// in s.
-func (v ByteView) EqualString(s string) bool {
- if v.b == nil {
- return v.s == s
- }
- l := v.Len()
- if len(s) != l {
- return false
- }
- for i, bi := range v.b {
- if bi != s[i] {
- return false
- }
- }
- return true
-}
-
-// EqualBytes returns whether the bytes in b are the same as the bytes
-// in b2.
-func (v ByteView) EqualBytes(b2 []byte) bool {
- if v.b != nil {
- return bytes.Equal(v.b, b2)
- }
- l := v.Len()
- if len(b2) != l {
- return false
- }
- for i, bi := range b2 {
- if bi != v.s[i] {
- return false
- }
- }
- return true
-}
-
-// Reader returns an io.ReadSeeker for the bytes in v.
-func (v ByteView) Reader() io.ReadSeeker {
- if v.b != nil {
- return bytes.NewReader(v.b)
- }
- return strings.NewReader(v.s)
-}
-
-// ReadAt implements io.ReaderAt on the bytes in v.
-func (v ByteView) ReadAt(p []byte, off int64) (n int, err error) {
- if off < 0 {
- return 0, errors.New("view: invalid offset")
- }
- if off >= int64(v.Len()) {
- return 0, io.EOF
- }
- n = v.SliceFrom(int(off)).Copy(p)
- if n < len(p) {
- err = io.EOF
- }
- return
-}
diff --git a/vendor/github.com/golang/groupcache/byteview_test.go b/vendor/github.com/golang/groupcache/byteview_test.go
deleted file mode 100644
index 9ece00f45..000000000
--- a/vendor/github.com/golang/groupcache/byteview_test.go
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
-Copyright 2012 Google 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 groupcache
-
-import (
- "fmt"
- "io"
- "io/ioutil"
- "testing"
-)
-
-func TestByteView(t *testing.T) {
- for _, s := range []string{"", "x", "yy"} {
- for _, v := range []ByteView{of([]byte(s)), of(s)} {
- name := fmt.Sprintf("string %q, view %+v", s, v)
- if v.Len() != len(s) {
- t.Errorf("%s: Len = %d; want %d", name, v.Len(), len(s))
- }
- if v.String() != s {
- t.Errorf("%s: String = %q; want %q", name, v.String(), s)
- }
- var longDest [3]byte
- if n := v.Copy(longDest[:]); n != len(s) {
- t.Errorf("%s: long Copy = %d; want %d", name, n, len(s))
- }
- var shortDest [1]byte
- if n := v.Copy(shortDest[:]); n != min(len(s), 1) {
- t.Errorf("%s: short Copy = %d; want %d", name, n, min(len(s), 1))
- }
- if got, err := ioutil.ReadAll(v.Reader()); err != nil || string(got) != s {
- t.Errorf("%s: Reader = %q, %v; want %q", name, got, err, s)
- }
- if got, err := ioutil.ReadAll(io.NewSectionReader(v, 0, int64(len(s)))); err != nil || string(got) != s {
- t.Errorf("%s: SectionReader of ReaderAt = %q, %v; want %q", name, got, err, s)
- }
- }
- }
-}
-
-// of returns a byte view of the []byte or string in x.
-func of(x interface{}) ByteView {
- if bytes, ok := x.([]byte); ok {
- return ByteView{b: bytes}
- }
- return ByteView{s: x.(string)}
-}
-
-func TestByteViewEqual(t *testing.T) {
- tests := []struct {
- a interface{} // string or []byte
- b interface{} // string or []byte
- want bool
- }{
- {"x", "x", true},
- {"x", "y", false},
- {"x", "yy", false},
- {[]byte("x"), []byte("x"), true},
- {[]byte("x"), []byte("y"), false},
- {[]byte("x"), []byte("yy"), false},
- {[]byte("x"), "x", true},
- {[]byte("x"), "y", false},
- {[]byte("x"), "yy", false},
- {"x", []byte("x"), true},
- {"x", []byte("y"), false},
- {"x", []byte("yy"), false},
- }
- for i, tt := range tests {
- va := of(tt.a)
- if bytes, ok := tt.b.([]byte); ok {
- if got := va.EqualBytes(bytes); got != tt.want {
- t.Errorf("%d. EqualBytes = %v; want %v", i, got, tt.want)
- }
- } else {
- if got := va.EqualString(tt.b.(string)); got != tt.want {
- t.Errorf("%d. EqualString = %v; want %v", i, got, tt.want)
- }
- }
- if got := va.Equal(of(tt.b)); got != tt.want {
- t.Errorf("%d. Equal = %v; want %v", i, got, tt.want)
- }
- }
-}
-
-func TestByteViewSlice(t *testing.T) {
- tests := []struct {
- in string
- from int
- to interface{} // nil to mean the end (SliceFrom); else int
- want string
- }{
- {
- in: "abc",
- from: 1,
- to: 2,
- want: "b",
- },
- {
- in: "abc",
- from: 1,
- want: "bc",
- },
- {
- in: "abc",
- to: 2,
- want: "ab",
- },
- }
- for i, tt := range tests {
- for _, v := range []ByteView{of([]byte(tt.in)), of(tt.in)} {
- name := fmt.Sprintf("test %d, view %+v", i, v)
- if tt.to != nil {
- v = v.Slice(tt.from, tt.to.(int))
- } else {
- v = v.SliceFrom(tt.from)
- }
- if v.String() != tt.want {
- t.Errorf("%s: got %q; want %q", name, v.String(), tt.want)
- }
- }
- }
-}
-
-func min(a, b int) int {
- if a < b {
- return a
- }
- return b
-}
diff --git a/vendor/github.com/golang/groupcache/consistenthash/consistenthash.go b/vendor/github.com/golang/groupcache/consistenthash/consistenthash.go
deleted file mode 100644
index a9c56f076..000000000
--- a/vendor/github.com/golang/groupcache/consistenthash/consistenthash.go
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
-Copyright 2013 Google 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 consistenthash provides an implementation of a ring hash.
-package consistenthash
-
-import (
- "hash/crc32"
- "sort"
- "strconv"
-)
-
-type Hash func(data []byte) uint32
-
-type Map struct {
- hash Hash
- replicas int
- keys []int // Sorted
- hashMap map[int]string
-}
-
-func New(replicas int, fn Hash) *Map {
- m := &Map{
- replicas: replicas,
- hash: fn,
- hashMap: make(map[int]string),
- }
- if m.hash == nil {
- m.hash = crc32.ChecksumIEEE
- }
- return m
-}
-
-// Returns true if there are no items available.
-func (m *Map) IsEmpty() bool {
- return len(m.keys) == 0
-}
-
-// Adds some keys to the hash.
-func (m *Map) Add(keys ...string) {
- for _, key := range keys {
- for i := 0; i < m.replicas; i++ {
- hash := int(m.hash([]byte(strconv.Itoa(i) + key)))
- m.keys = append(m.keys, hash)
- m.hashMap[hash] = key
- }
- }
- sort.Ints(m.keys)
-}
-
-// Gets the closest item in the hash to the provided key.
-func (m *Map) Get(key string) string {
- if m.IsEmpty() {
- return ""
- }
-
- hash := int(m.hash([]byte(key)))
-
- // Binary search for appropriate replica.
- idx := sort.Search(len(m.keys), func(i int) bool { return m.keys[i] >= hash })
-
- // Means we have cycled back to the first replica.
- if idx == len(m.keys) {
- idx = 0
- }
-
- return m.hashMap[m.keys[idx]]
-}
diff --git a/vendor/github.com/golang/groupcache/consistenthash/consistenthash_test.go b/vendor/github.com/golang/groupcache/consistenthash/consistenthash_test.go
deleted file mode 100644
index 1a37fd7ff..000000000
--- a/vendor/github.com/golang/groupcache/consistenthash/consistenthash_test.go
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
-Copyright 2013 Google 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 consistenthash
-
-import (
- "fmt"
- "strconv"
- "testing"
-)
-
-func TestHashing(t *testing.T) {
-
- // Override the hash function to return easier to reason about values. Assumes
- // the keys can be converted to an integer.
- hash := New(3, func(key []byte) uint32 {
- i, err := strconv.Atoi(string(key))
- if err != nil {
- panic(err)
- }
- return uint32(i)
- })
-
- // Given the above hash function, this will give replicas with "hashes":
- // 2, 4, 6, 12, 14, 16, 22, 24, 26
- hash.Add("6", "4", "2")
-
- testCases := map[string]string{
- "2": "2",
- "11": "2",
- "23": "4",
- "27": "2",
- }
-
- for k, v := range testCases {
- if hash.Get(k) != v {
- t.Errorf("Asking for %s, should have yielded %s", k, v)
- }
- }
-
- // Adds 8, 18, 28
- hash.Add("8")
-
- // 27 should now map to 8.
- testCases["27"] = "8"
-
- for k, v := range testCases {
- if hash.Get(k) != v {
- t.Errorf("Asking for %s, should have yielded %s", k, v)
- }
- }
-
-}
-
-func TestConsistency(t *testing.T) {
- hash1 := New(1, nil)
- hash2 := New(1, nil)
-
- hash1.Add("Bill", "Bob", "Bonny")
- hash2.Add("Bob", "Bonny", "Bill")
-
- if hash1.Get("Ben") != hash2.Get("Ben") {
- t.Errorf("Fetching 'Ben' from both hashes should be the same")
- }
-
- hash2.Add("Becky", "Ben", "Bobby")
-
- if hash1.Get("Ben") != hash2.Get("Ben") ||
- hash1.Get("Bob") != hash2.Get("Bob") ||
- hash1.Get("Bonny") != hash2.Get("Bonny") {
- t.Errorf("Direct matches should always return the same entry")
- }
-
-}
-
-func BenchmarkGet8(b *testing.B) { benchmarkGet(b, 8) }
-func BenchmarkGet32(b *testing.B) { benchmarkGet(b, 32) }
-func BenchmarkGet128(b *testing.B) { benchmarkGet(b, 128) }
-func BenchmarkGet512(b *testing.B) { benchmarkGet(b, 512) }
-
-func benchmarkGet(b *testing.B, shards int) {
-
- hash := New(50, nil)
-
- var buckets []string
- for i := 0; i < shards; i++ {
- buckets = append(buckets, fmt.Sprintf("shard-%d", i))
- }
-
- hash.Add(buckets...)
-
- b.ResetTimer()
-
- for i := 0; i < b.N; i++ {
- hash.Get(buckets[i&(shards-1)])
- }
-}
diff --git a/vendor/github.com/golang/groupcache/groupcache.go b/vendor/github.com/golang/groupcache/groupcache.go
deleted file mode 100644
index 40410a0cc..000000000
--- a/vendor/github.com/golang/groupcache/groupcache.go
+++ /dev/null
@@ -1,489 +0,0 @@
-/*
-Copyright 2012 Google 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 groupcache provides a data loading mechanism with caching
-// and de-duplication that works across a set of peer processes.
-//
-// Each data Get first consults its local cache, otherwise delegates
-// to the requested key's canonical owner, which then checks its cache
-// or finally gets the data. In the common case, many concurrent
-// cache misses across a set of peers for the same key result in just
-// one cache fill.
-package groupcache
-
-import (
- "errors"
- "math/rand"
- "strconv"
- "sync"
- "sync/atomic"
-
- pb "github.com/golang/groupcache/groupcachepb"
- "github.com/golang/groupcache/lru"
- "github.com/golang/groupcache/singleflight"
-)
-
-// A Getter loads data for a key.
-type Getter interface {
- // Get returns the value identified by key, populating dest.
- //
- // The returned data must be unversioned. That is, key must
- // uniquely describe the loaded data, without an implicit
- // current time, and without relying on cache expiration
- // mechanisms.
- Get(ctx Context, key string, dest Sink) error
-}
-
-// A GetterFunc implements Getter with a function.
-type GetterFunc func(ctx Context, key string, dest Sink) error
-
-func (f GetterFunc) Get(ctx Context, key string, dest Sink) error {
- return f(ctx, key, dest)
-}
-
-var (
- mu sync.RWMutex
- groups = make(map[string]*Group)
-
- initPeerServerOnce sync.Once
- initPeerServer func()
-)
-
-// GetGroup returns the named group previously created with NewGroup, or
-// nil if there's no such group.
-func GetGroup(name string) *Group {
- mu.RLock()
- g := groups[name]
- mu.RUnlock()
- return g
-}
-
-// NewGroup creates a coordinated group-aware Getter from a Getter.
-//
-// The returned Getter tries (but does not guarantee) to run only one
-// Get call at once for a given key across an entire set of peer
-// processes. Concurrent callers both in the local process and in
-// other processes receive copies of the answer once the original Get
-// completes.
-//
-// The group name must be unique for each getter.
-func NewGroup(name string, cacheBytes int64, getter Getter) *Group {
- return newGroup(name, cacheBytes, getter, nil)
-}
-
-// If peers is nil, the peerPicker is called via a sync.Once to initialize it.
-func newGroup(name string, cacheBytes int64, getter Getter, peers PeerPicker) *Group {
- if getter == nil {
- panic("nil Getter")
- }
- mu.Lock()
- defer mu.Unlock()
- initPeerServerOnce.Do(callInitPeerServer)
- if _, dup := groups[name]; dup {
- panic("duplicate registration of group " + name)
- }
- g := &Group{
- name: name,
- getter: getter,
- peers: peers,
- cacheBytes: cacheBytes,
- loadGroup: &singleflight.Group{},
- }
- if fn := newGroupHook; fn != nil {
- fn(g)
- }
- groups[name] = g
- return g
-}
-
-// newGroupHook, if non-nil, is called right after a new group is created.
-var newGroupHook func(*Group)
-
-// RegisterNewGroupHook registers a hook that is run each time
-// a group is created.
-func RegisterNewGroupHook(fn func(*Group)) {
- if newGroupHook != nil {
- panic("RegisterNewGroupHook called more than once")
- }
- newGroupHook = fn
-}
-
-// RegisterServerStart registers a hook that is run when the first
-// group is created.
-func RegisterServerStart(fn func()) {
- if initPeerServer != nil {
- panic("RegisterServerStart called more than once")
- }
- initPeerServer = fn
-}
-
-func callInitPeerServer() {
- if initPeerServer != nil {
- initPeerServer()
- }
-}
-
-// A Group is a cache namespace and associated data loaded spread over
-// a group of 1 or more machines.
-type Group struct {
- name string
- getter Getter
- peersOnce sync.Once
- peers PeerPicker
- cacheBytes int64 // limit for sum of mainCache and hotCache size
-
- // mainCache is a cache of the keys for which this process
- // (amongst its peers) is authorative. That is, this cache
- // contains keys which consistent hash on to this process's
- // peer number.
- mainCache cache
-
- // hotCache contains keys/values for which this peer is not
- // authorative (otherwise they would be in mainCache), but
- // are popular enough to warrant mirroring in this process to
- // avoid going over the network to fetch from a peer. Having
- // a hotCache avoids network hotspotting, where a peer's
- // network card could become the bottleneck on a popular key.
- // This cache is used sparingly to maximize the total number
- // of key/value pairs that can be stored globally.
- hotCache cache
-
- // loadGroup ensures that each key is only fetched once
- // (either locally or remotely), regardless of the number of
- // concurrent callers.
- loadGroup flightGroup
-
- // Stats are statistics on the group.
- Stats Stats
-}
-
-// flightGroup is defined as an interface which flightgroup.Group
-// satisfies. We define this so that we may test with an alternate
-// implementation.
-type flightGroup interface {
- // Done is called when Do is done.
- Do(key string, fn func() (interface{}, error)) (interface{}, error)
-}
-
-// Stats are per-group statistics.
-type Stats struct {
- Gets AtomicInt // any Get request, including from peers
- CacheHits AtomicInt // either cache was good
- PeerLoads AtomicInt // either remote load or remote cache hit (not an error)
- PeerErrors AtomicInt
- Loads AtomicInt // (gets - cacheHits)
- LoadsDeduped AtomicInt // after singleflight
- LocalLoads AtomicInt // total good local loads
- LocalLoadErrs AtomicInt // total bad local loads
- ServerRequests AtomicInt // gets that came over the network from peers
-}
-
-// Name returns the name of the group.
-func (g *Group) Name() string {
- return g.name
-}
-
-func (g *Group) initPeers() {
- if g.peers == nil {
- g.peers = getPeers()
- }
-}
-
-func (g *Group) Get(ctx Context, key string, dest Sink) error {
- g.peersOnce.Do(g.initPeers)
- g.Stats.Gets.Add(1)
- if dest == nil {
- return errors.New("groupcache: nil dest Sink")
- }
- value, cacheHit := g.lookupCache(key)
-
- if cacheHit {
- g.Stats.CacheHits.Add(1)
- return setSinkView(dest, value)
- }
-
- // Optimization to avoid double unmarshalling or copying: keep
- // track of whether the dest was already populated. One caller
- // (if local) will set this; the losers will not. The common
- // case will likely be one caller.
- destPopulated := false
- value, destPopulated, err := g.load(ctx, key, dest)
- if err != nil {
- return err
- }
- if destPopulated {
- return nil
- }
- return setSinkView(dest, value)
-}
-
-// load loads key either by invoking the getter locally or by sending it to another machine.
-func (g *Group) load(ctx Context, key string, dest Sink) (value ByteView, destPopulated bool, err error) {
- g.Stats.Loads.Add(1)
- viewi, err := g.loadGroup.Do(key, func() (interface{}, error) {
- // Check the cache again because singleflight can only dedup calls
- // that overlap concurrently. It's possible for 2 concurrent
- // requests to miss the cache, resulting in 2 load() calls. An
- // unfortunate goroutine scheduling would result in this callback
- // being run twice, serially. If we don't check the cache again,
- // cache.nbytes would be incremented below even though there will
- // be only one entry for this key.
- //
- // Consider the following serialized event ordering for two
- // goroutines in which this callback gets called twice for hte
- // same key:
- // 1: Get("key")
- // 2: Get("key")
- // 1: lookupCache("key")
- // 2: lookupCache("key")
- // 1: load("key")
- // 2: load("key")
- // 1: loadGroup.Do("key", fn)
- // 1: fn()
- // 2: loadGroup.Do("key", fn)
- // 2: fn()
- if value, cacheHit := g.lookupCache(key); cacheHit {
- g.Stats.CacheHits.Add(1)
- return value, nil
- }
- g.Stats.LoadsDeduped.Add(1)
- var value ByteView
- var err error
- if peer, ok := g.peers.PickPeer(key); ok {
- value, err = g.getFromPeer(ctx, peer, key)
- if err == nil {
- g.Stats.PeerLoads.Add(1)
- return value, nil
- }
- g.Stats.PeerErrors.Add(1)
- // TODO(bradfitz): log the peer's error? keep
- // log of the past few for /groupcachez? It's
- // probably boring (normal task movement), so not
- // worth logging I imagine.
- }
- value, err = g.getLocally(ctx, key, dest)
- if err != nil {
- g.Stats.LocalLoadErrs.Add(1)
- return nil, err
- }
- g.Stats.LocalLoads.Add(1)
- destPopulated = true // only one caller of load gets this return value
- g.populateCache(key, value, &g.mainCache)
- return value, nil
- })
- if err == nil {
- value = viewi.(ByteView)
- }
- return
-}
-
-func (g *Group) getLocally(ctx Context, key string, dest Sink) (ByteView, error) {
- err := g.getter.Get(ctx, key, dest)
- if err != nil {
- return ByteView{}, err
- }
- return dest.view()
-}
-
-func (g *Group) getFromPeer(ctx Context, peer ProtoGetter, key string) (ByteView, error) {
- req := &pb.GetRequest{
- Group: &g.name,
- Key: &key,
- }
- res := &pb.GetResponse{}
- err := peer.Get(ctx, req, res)
- if err != nil {
- return ByteView{}, err
- }
- value := ByteView{b: res.Value}
- // TODO(bradfitz): use res.MinuteQps or something smart to
- // conditionally populate hotCache. For now just do it some
- // percentage of the time.
- if rand.Intn(10) == 0 {
- g.populateCache(key, value, &g.hotCache)
- }
- return value, nil
-}
-
-func (g *Group) lookupCache(key string) (value ByteView, ok bool) {
- if g.cacheBytes <= 0 {
- return
- }
- value, ok = g.mainCache.get(key)
- if ok {
- return
- }
- value, ok = g.hotCache.get(key)
- return
-}
-
-func (g *Group) populateCache(key string, value ByteView, cache *cache) {
- if g.cacheBytes <= 0 {
- return
- }
- cache.add(key, value)
-
- // Evict items from cache(s) if necessary.
- for {
- mainBytes := g.mainCache.bytes()
- hotBytes := g.hotCache.bytes()
- if mainBytes+hotBytes <= g.cacheBytes {
- return
- }
-
- // TODO(bradfitz): this is good-enough-for-now logic.
- // It should be something based on measurements and/or
- // respecting the costs of different resources.
- victim := &g.mainCache
- if hotBytes > mainBytes/8 {
- victim = &g.hotCache
- }
- victim.removeOldest()
- }
-}
-
-// CacheType represents a type of cache.
-type CacheType int
-
-const (
- // The MainCache is the cache for items that this peer is the
- // owner for.
- MainCache CacheType = iota + 1
-
- // The HotCache is the cache for items that seem popular
- // enough to replicate to this node, even though it's not the
- // owner.
- HotCache
-)
-
-// CacheStats returns stats about the provided cache within the group.
-func (g *Group) CacheStats(which CacheType) CacheStats {
- switch which {
- case MainCache:
- return g.mainCache.stats()
- case HotCache:
- return g.hotCache.stats()
- default:
- return CacheStats{}
- }
-}
-
-// cache is a wrapper around an *lru.Cache that adds synchronization,
-// makes values always be ByteView, and counts the size of all keys and
-// values.
-type cache struct {
- mu sync.RWMutex
- nbytes int64 // of all keys and values
- lru *lru.Cache
- nhit, nget int64
- nevict int64 // number of evictions
-}
-
-func (c *cache) stats() CacheStats {
- c.mu.RLock()
- defer c.mu.RUnlock()
- return CacheStats{
- Bytes: c.nbytes,
- Items: c.itemsLocked(),
- Gets: c.nget,
- Hits: c.nhit,
- Evictions: c.nevict,
- }
-}
-
-func (c *cache) add(key string, value ByteView) {
- c.mu.Lock()
- defer c.mu.Unlock()
- if c.lru == nil {
- c.lru = &lru.Cache{
- OnEvicted: func(key lru.Key, value interface{}) {
- val := value.(ByteView)
- c.nbytes -= int64(len(key.(string))) + int64(val.Len())
- c.nevict++
- },
- }
- }
- c.lru.Add(key, value)
- c.nbytes += int64(len(key)) + int64(value.Len())
-}
-
-func (c *cache) get(key string) (value ByteView, ok bool) {
- c.mu.Lock()
- defer c.mu.Unlock()
- c.nget++
- if c.lru == nil {
- return
- }
- vi, ok := c.lru.Get(key)
- if !ok {
- return
- }
- c.nhit++
- return vi.(ByteView), true
-}
-
-func (c *cache) removeOldest() {
- c.mu.Lock()
- defer c.mu.Unlock()
- if c.lru != nil {
- c.lru.RemoveOldest()
- }
-}
-
-func (c *cache) bytes() int64 {
- c.mu.RLock()
- defer c.mu.RUnlock()
- return c.nbytes
-}
-
-func (c *cache) items() int64 {
- c.mu.RLock()
- defer c.mu.RUnlock()
- return c.itemsLocked()
-}
-
-func (c *cache) itemsLocked() int64 {
- if c.lru == nil {
- return 0
- }
- return int64(c.lru.Len())
-}
-
-// An AtomicInt is an int64 to be accessed atomically.
-type AtomicInt int64
-
-// Add atomically adds n to i.
-func (i *AtomicInt) Add(n int64) {
- atomic.AddInt64((*int64)(i), n)
-}
-
-// Get atomically gets the value of i.
-func (i *AtomicInt) Get() int64 {
- return atomic.LoadInt64((*int64)(i))
-}
-
-func (i *AtomicInt) String() string {
- return strconv.FormatInt(i.Get(), 10)
-}
-
-// CacheStats are returned by stats accessors on Group.
-type CacheStats struct {
- Bytes int64
- Items int64
- Gets int64
- Hits int64
- Evictions int64
-}
diff --git a/vendor/github.com/golang/groupcache/groupcache_test.go b/vendor/github.com/golang/groupcache/groupcache_test.go
deleted file mode 100644
index 3a4ecc2cc..000000000
--- a/vendor/github.com/golang/groupcache/groupcache_test.go
+++ /dev/null
@@ -1,447 +0,0 @@
-/*
-Copyright 2012 Google 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.
-*/
-
-// Tests for groupcache.
-
-package groupcache
-
-import (
- "errors"
- "fmt"
- "hash/crc32"
- "math/rand"
- "reflect"
- "sync"
- "testing"
- "time"
-
- "github.com/golang/protobuf/proto"
-
- pb "github.com/golang/groupcache/groupcachepb"
- testpb "github.com/golang/groupcache/testpb"
-)
-
-var (
- once sync.Once
- stringGroup, protoGroup Getter
-
- stringc = make(chan string)
-
- dummyCtx Context
-
- // cacheFills is the number of times stringGroup or
- // protoGroup's Getter have been called. Read using the
- // cacheFills function.
- cacheFills AtomicInt
-)
-
-const (
- stringGroupName = "string-group"
- protoGroupName = "proto-group"
- testMessageType = "google3/net/groupcache/go/test_proto.TestMessage"
- fromChan = "from-chan"
- cacheSize = 1 << 20
-)
-
-func testSetup() {
- stringGroup = NewGroup(stringGroupName, cacheSize, GetterFunc(func(_ Context, key string, dest Sink) error {
- if key == fromChan {
- key = <-stringc
- }
- cacheFills.Add(1)
- return dest.SetString("ECHO:" + key)
- }))
-
- protoGroup = NewGroup(protoGroupName, cacheSize, GetterFunc(func(_ Context, key string, dest Sink) error {
- if key == fromChan {
- key = <-stringc
- }
- cacheFills.Add(1)
- return dest.SetProto(&testpb.TestMessage{
- Name: proto.String("ECHO:" + key),
- City: proto.String("SOME-CITY"),
- })
- }))
-}
-
-// tests that a Getter's Get method is only called once with two
-// outstanding callers. This is the string variant.
-func TestGetDupSuppressString(t *testing.T) {
- once.Do(testSetup)
- // Start two getters. The first should block (waiting reading
- // from stringc) and the second should latch on to the first
- // one.
- resc := make(chan string, 2)
- for i := 0; i < 2; i++ {
- go func() {
- var s string
- if err := stringGroup.Get(dummyCtx, fromChan, StringSink(&s)); err != nil {
- resc <- "ERROR:" + err.Error()
- return
- }
- resc <- s
- }()
- }
-
- // Wait a bit so both goroutines get merged together via
- // singleflight.
- // TODO(bradfitz): decide whether there are any non-offensive
- // debug/test hooks that could be added to singleflight to
- // make a sleep here unnecessary.
- time.Sleep(250 * time.Millisecond)
-
- // Unblock the first getter, which should unblock the second
- // as well.
- stringc <- "foo"
-
- for i := 0; i < 2; i++ {
- select {
- case v := <-resc:
- if v != "ECHO:foo" {
- t.Errorf("got %q; want %q", v, "ECHO:foo")
- }
- case <-time.After(5 * time.Second):
- t.Errorf("timeout waiting on getter #%d of 2", i+1)
- }
- }
-}
-
-// tests that a Getter's Get method is only called once with two
-// outstanding callers. This is the proto variant.
-func TestGetDupSuppressProto(t *testing.T) {
- once.Do(testSetup)
- // Start two getters. The first should block (waiting reading
- // from stringc) and the second should latch on to the first
- // one.
- resc := make(chan *testpb.TestMessage, 2)
- for i := 0; i < 2; i++ {
- go func() {
- tm := new(testpb.TestMessage)
- if err := protoGroup.Get(dummyCtx, fromChan, ProtoSink(tm)); err != nil {
- tm.Name = proto.String("ERROR:" + err.Error())
- }
- resc <- tm
- }()
- }
-
- // Wait a bit so both goroutines get merged together via
- // singleflight.
- // TODO(bradfitz): decide whether there are any non-offensive
- // debug/test hooks that could be added to singleflight to
- // make a sleep here unnecessary.
- time.Sleep(250 * time.Millisecond)
-
- // Unblock the first getter, which should unblock the second
- // as well.
- stringc <- "Fluffy"
- want := &testpb.TestMessage{
- Name: proto.String("ECHO:Fluffy"),
- City: proto.String("SOME-CITY"),
- }
- for i := 0; i < 2; i++ {
- select {
- case v := <-resc:
- if !reflect.DeepEqual(v, want) {
- t.Errorf(" Got: %v\nWant: %v", proto.CompactTextString(v), proto.CompactTextString(want))
- }
- case <-time.After(5 * time.Second):
- t.Errorf("timeout waiting on getter #%d of 2", i+1)
- }
- }
-}
-
-func countFills(f func()) int64 {
- fills0 := cacheFills.Get()
- f()
- return cacheFills.Get() - fills0
-}
-
-func TestCaching(t *testing.T) {
- once.Do(testSetup)
- fills := countFills(func() {
- for i := 0; i < 10; i++ {
- var s string
- if err := stringGroup.Get(dummyCtx, "TestCaching-key", StringSink(&s)); err != nil {
- t.Fatal(err)
- }
- }
- })
- if fills != 1 {
- t.Errorf("expected 1 cache fill; got %d", fills)
- }
-}
-
-func TestCacheEviction(t *testing.T) {
- once.Do(testSetup)
- testKey := "TestCacheEviction-key"
- getTestKey := func() {
- var res string
- for i := 0; i < 10; i++ {
- if err := stringGroup.Get(dummyCtx, testKey, StringSink(&res)); err != nil {
- t.Fatal(err)
- }
- }
- }
- fills := countFills(getTestKey)
- if fills != 1 {
- t.Fatalf("expected 1 cache fill; got %d", fills)
- }
-
- g := stringGroup.(*Group)
- evict0 := g.mainCache.nevict
-
- // Trash the cache with other keys.
- var bytesFlooded int64
- // cacheSize/len(testKey) is approximate
- for bytesFlooded < cacheSize+1024 {
- var res string
- key := fmt.Sprintf("dummy-key-%d", bytesFlooded)
- stringGroup.Get(dummyCtx, key, StringSink(&res))
- bytesFlooded += int64(len(key) + len(res))
- }
- evicts := g.mainCache.nevict - evict0
- if evicts <= 0 {
- t.Errorf("evicts = %v; want more than 0", evicts)
- }
-
- // Test that the key is gone.
- fills = countFills(getTestKey)
- if fills != 1 {
- t.Fatalf("expected 1 cache fill after cache trashing; got %d", fills)
- }
-}
-
-type fakePeer struct {
- hits int
- fail bool
-}
-
-func (p *fakePeer) Get(_ Context, in *pb.GetRequest, out *pb.GetResponse) error {
- p.hits++
- if p.fail {
- return errors.New("simulated error from peer")
- }
- out.Value = []byte("got:" + in.GetKey())
- return nil
-}
-
-type fakePeers []ProtoGetter
-
-func (p fakePeers) PickPeer(key string) (peer ProtoGetter, ok bool) {
- if len(p) == 0 {
- return
- }
- n := crc32.Checksum([]byte(key), crc32.IEEETable) % uint32(len(p))
- return p[n], p[n] != nil
-}
-
-// tests that peers (virtual, in-process) are hit, and how much.
-func TestPeers(t *testing.T) {
- once.Do(testSetup)
- rand.Seed(123)
- peer0 := &fakePeer{}
- peer1 := &fakePeer{}
- peer2 := &fakePeer{}
- peerList := fakePeers([]ProtoGetter{peer0, peer1, peer2, nil})
- const cacheSize = 0 // disabled
- localHits := 0
- getter := func(_ Context, key string, dest Sink) error {
- localHits++
- return dest.SetString("got:" + key)
- }
- testGroup := newGroup("TestPeers-group", cacheSize, GetterFunc(getter), peerList)
- run := func(name string, n int, wantSummary string) {
- // Reset counters
- localHits = 0
- for _, p := range []*fakePeer{peer0, peer1, peer2} {
- p.hits = 0
- }
-
- for i := 0; i < n; i++ {
- key := fmt.Sprintf("key-%d", i)
- want := "got:" + key
- var got string
- err := testGroup.Get(dummyCtx, key, StringSink(&got))
- if err != nil {
- t.Errorf("%s: error on key %q: %v", name, key, err)
- continue
- }
- if got != want {
- t.Errorf("%s: for key %q, got %q; want %q", name, key, got, want)
- }
- }
- summary := func() string {
- return fmt.Sprintf("localHits = %d, peers = %d %d %d", localHits, peer0.hits, peer1.hits, peer2.hits)
- }
- if got := summary(); got != wantSummary {
- t.Errorf("%s: got %q; want %q", name, got, wantSummary)
- }
- }
- resetCacheSize := func(maxBytes int64) {
- g := testGroup
- g.cacheBytes = maxBytes
- g.mainCache = cache{}
- g.hotCache = cache{}
- }
-
- // Base case; peers all up, with no problems.
- resetCacheSize(1 << 20)
- run("base", 200, "localHits = 49, peers = 51 49 51")
-
- // Verify cache was hit. All localHits are gone, and some of
- // the peer hits (the ones randomly selected to be maybe hot)
- run("cached_base", 200, "localHits = 0, peers = 49 47 48")
- resetCacheSize(0)
-
- // With one of the peers being down.
- // TODO(bradfitz): on a peer number being unavailable, the
- // consistent hashing should maybe keep trying others to
- // spread the load out. Currently it fails back to local
- // execution if the first consistent-hash slot is unavailable.
- peerList[0] = nil
- run("one_peer_down", 200, "localHits = 100, peers = 0 49 51")
-
- // Failing peer
- peerList[0] = peer0
- peer0.fail = true
- run("peer0_failing", 200, "localHits = 100, peers = 51 49 51")
-}
-
-func TestTruncatingByteSliceTarget(t *testing.T) {
- var buf [100]byte
- s := buf[:]
- if err := stringGroup.Get(dummyCtx, "short", TruncatingByteSliceSink(&s)); err != nil {
- t.Fatal(err)
- }
- if want := "ECHO:short"; string(s) != want {
- t.Errorf("short key got %q; want %q", s, want)
- }
-
- s = buf[:6]
- if err := stringGroup.Get(dummyCtx, "truncated", TruncatingByteSliceSink(&s)); err != nil {
- t.Fatal(err)
- }
- if want := "ECHO:t"; string(s) != want {
- t.Errorf("truncated key got %q; want %q", s, want)
- }
-}
-
-func TestAllocatingByteSliceTarget(t *testing.T) {
- var dst []byte
- sink := AllocatingByteSliceSink(&dst)
-
- inBytes := []byte("some bytes")
- sink.SetBytes(inBytes)
- if want := "some bytes"; string(dst) != want {
- t.Errorf("SetBytes resulted in %q; want %q", dst, want)
- }
- v, err := sink.view()
- if err != nil {
- t.Fatalf("view after SetBytes failed: %v", err)
- }
- if &inBytes[0] == &dst[0] {
- t.Error("inBytes and dst share memory")
- }
- if &inBytes[0] == &v.b[0] {
- t.Error("inBytes and view share memory")
- }
- if &dst[0] == &v.b[0] {
- t.Error("dst and view share memory")
- }
-}
-
-// orderedFlightGroup allows the caller to force the schedule of when
-// orig.Do will be called. This is useful to serialize calls such
-// that singleflight cannot dedup them.
-type orderedFlightGroup struct {
- mu sync.Mutex
- stage1 chan bool
- stage2 chan bool
- orig flightGroup
-}
-
-func (g *orderedFlightGroup) Do(key string, fn func() (interface{}, error)) (interface{}, error) {
- <-g.stage1
- <-g.stage2
- g.mu.Lock()
- defer g.mu.Unlock()
- return g.orig.Do(key, fn)
-}
-
-// TestNoDedup tests invariants on the cache size when singleflight is
-// unable to dedup calls.
-func TestNoDedup(t *testing.T) {
- const testkey = "testkey"
- const testval = "testval"
- g := newGroup("testgroup", 1024, GetterFunc(func(_ Context, key string, dest Sink) error {
- return dest.SetString(testval)
- }), nil)
-
- orderedGroup := &orderedFlightGroup{
- stage1: make(chan bool),
- stage2: make(chan bool),
- orig: g.loadGroup,
- }
- // Replace loadGroup with our wrapper so we can control when
- // loadGroup.Do is entered for each concurrent request.
- g.loadGroup = orderedGroup
-
- // Issue two idential requests concurrently. Since the cache is
- // empty, it will miss. Both will enter load(), but we will only
- // allow one at a time to enter singleflight.Do, so the callback
- // function will be called twice.
- resc := make(chan string, 2)
- for i := 0; i < 2; i++ {
- go func() {
- var s string
- if err := g.Get(dummyCtx, testkey, StringSink(&s)); err != nil {
- resc <- "ERROR:" + err.Error()
- return
- }
- resc <- s
- }()
- }
-
- // Ensure both goroutines have entered the Do routine. This implies
- // both concurrent requests have checked the cache, found it empty,
- // and called load().
- orderedGroup.stage1 <- true
- orderedGroup.stage1 <- true
- orderedGroup.stage2 <- true
- orderedGroup.stage2 <- true
-
- for i := 0; i < 2; i++ {
- if s := <-resc; s != testval {
- t.Errorf("result is %s want %s", s, testval)
- }
- }
-
- const wantItems = 1
- if g.mainCache.items() != wantItems {
- t.Errorf("mainCache has %d items, want %d", g.mainCache.items(), wantItems)
- }
-
- // If the singleflight callback doesn't double-check the cache again
- // upon entry, we would increment nbytes twice but the entry would
- // only be in the cache once.
- const wantBytes = int64(len(testkey) + len(testval))
- if g.mainCache.nbytes != wantBytes {
- t.Errorf("cache has %d bytes, want %d", g.mainCache.nbytes, wantBytes)
- }
-}
-
-// TODO(bradfitz): port the Google-internal full integration test into here,
-// using HTTP requests instead of our RPC system.
diff --git a/vendor/github.com/golang/groupcache/groupcachepb/groupcache.pb.go b/vendor/github.com/golang/groupcache/groupcachepb/groupcache.pb.go
deleted file mode 100644
index 520d1ee9a..000000000
--- a/vendor/github.com/golang/groupcache/groupcachepb/groupcache.pb.go
+++ /dev/null
@@ -1,65 +0,0 @@
-// Code generated by protoc-gen-go.
-// source: groupcache.proto
-// DO NOT EDIT!
-
-package groupcachepb
-
-import proto "github.com/golang/protobuf/proto"
-import json "encoding/json"
-import math "math"
-
-// Reference proto, json, and math imports to suppress error if they are not otherwise used.
-var _ = proto.Marshal
-var _ = &json.SyntaxError{}
-var _ = math.Inf
-
-type GetRequest struct {
- Group *string `protobuf:"bytes,1,req,name=group" json:"group,omitempty"`
- Key *string `protobuf:"bytes,2,req,name=key" json:"key,omitempty"`
- XXX_unrecognized []byte `json:"-"`
-}
-
-func (m *GetRequest) Reset() { *m = GetRequest{} }
-func (m *GetRequest) String() string { return proto.CompactTextString(m) }
-func (*GetRequest) ProtoMessage() {}
-
-func (m *GetRequest) GetGroup() string {
- if m != nil && m.Group != nil {
- return *m.Group
- }
- return ""
-}
-
-func (m *GetRequest) GetKey() string {
- if m != nil && m.Key != nil {
- return *m.Key
- }
- return ""
-}
-
-type GetResponse struct {
- Value []byte `protobuf:"bytes,1,opt,name=value" json:"value,omitempty"`
- MinuteQps *float64 `protobuf:"fixed64,2,opt,name=minute_qps" json:"minute_qps,omitempty"`
- XXX_unrecognized []byte `json:"-"`
-}
-
-func (m *GetResponse) Reset() { *m = GetResponse{} }
-func (m *GetResponse) String() string { return proto.CompactTextString(m) }
-func (*GetResponse) ProtoMessage() {}
-
-func (m *GetResponse) GetValue() []byte {
- if m != nil {
- return m.Value
- }
- return nil
-}
-
-func (m *GetResponse) GetMinuteQps() float64 {
- if m != nil && m.MinuteQps != nil {
- return *m.MinuteQps
- }
- return 0
-}
-
-func init() {
-}
diff --git a/vendor/github.com/golang/groupcache/groupcachepb/groupcache.proto b/vendor/github.com/golang/groupcache/groupcachepb/groupcache.proto
deleted file mode 100644
index b5bdff94f..000000000
--- a/vendor/github.com/golang/groupcache/groupcachepb/groupcache.proto
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
-Copyright 2012 Google 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.
-*/
-
-syntax = "proto2";
-
-package groupcachepb;
-
-message GetRequest {
- required string group = 1;
- required string key = 2; // not actually required/guaranteed to be UTF-8
-}
-
-message GetResponse {
- optional bytes value = 1;
- optional double minute_qps = 2;
-}
-
-service GroupCache {
- rpc Get(GetRequest) returns (GetResponse) {
- };
-}
diff --git a/vendor/github.com/golang/groupcache/http.go b/vendor/github.com/golang/groupcache/http.go
deleted file mode 100644
index 14eb345a8..000000000
--- a/vendor/github.com/golang/groupcache/http.go
+++ /dev/null
@@ -1,227 +0,0 @@
-/*
-Copyright 2013 Google 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 groupcache
-
-import (
- "bytes"
- "fmt"
- "io"
- "net/http"
- "net/url"
- "strings"
- "sync"
-
- "github.com/golang/groupcache/consistenthash"
- pb "github.com/golang/groupcache/groupcachepb"
- "github.com/golang/protobuf/proto"
-)
-
-const defaultBasePath = "/_groupcache/"
-
-const defaultReplicas = 50
-
-// HTTPPool implements PeerPicker for a pool of HTTP peers.
-type HTTPPool struct {
- // Context optionally specifies a context for the server to use when it
- // receives a request.
- // If nil, the server uses a nil Context.
- Context func(*http.Request) Context
-
- // Transport optionally specifies an http.RoundTripper for the client
- // to use when it makes a request.
- // If nil, the client uses http.DefaultTransport.
- Transport func(Context) http.RoundTripper
-
- // this peer's base URL, e.g. "https://example.net:8000"
- self string
-
- // opts specifies the options.
- opts HTTPPoolOptions
-
- mu sync.Mutex // guards peers and httpGetters
- peers *consistenthash.Map
- httpGetters map[string]*httpGetter // keyed by e.g. "http://10.0.0.2:8008"
-}
-
-// HTTPPoolOptions are the configurations of a HTTPPool.
-type HTTPPoolOptions struct {
- // BasePath specifies the HTTP path that will serve groupcache requests.
- // If blank, it defaults to "/_groupcache/".
- BasePath string
-
- // Replicas specifies the number of key replicas on the consistent hash.
- // If blank, it defaults to 50.
- Replicas int
-
- // HashFn specifies the hash function of the consistent hash.
- // If blank, it defaults to crc32.ChecksumIEEE.
- HashFn consistenthash.Hash
-}
-
-// NewHTTPPool initializes an HTTP pool of peers, and registers itself as a PeerPicker.
-// For convenience, it also registers itself as an http.Handler with http.DefaultServeMux.
-// The self argument be a valid base URL that points to the current server,
-// for example "http://example.net:8000".
-func NewHTTPPool(self string) *HTTPPool {
- p := NewHTTPPoolOpts(self, nil)
- http.Handle(p.opts.BasePath, p)
- return p
-}
-
-var httpPoolMade bool
-
-// NewHTTPPoolOpts initializes an HTTP pool of peers with the given options.
-// Unlike NewHTTPPool, this function does not register the created pool as an HTTP handler.
-// The returned *HTTPPool implements http.Handler and must be registered using http.Handle.
-func NewHTTPPoolOpts(self string, o *HTTPPoolOptions) *HTTPPool {
- if httpPoolMade {
- panic("groupcache: NewHTTPPool must be called only once")
- }
- httpPoolMade = true
-
- p := &HTTPPool{
- self: self,
- httpGetters: make(map[string]*httpGetter),
- }
- if o != nil {
- p.opts = *o
- }
- if p.opts.BasePath == "" {
- p.opts.BasePath = defaultBasePath
- }
- if p.opts.Replicas == 0 {
- p.opts.Replicas = defaultReplicas
- }
- p.peers = consistenthash.New(p.opts.Replicas, p.opts.HashFn)
-
- RegisterPeerPicker(func() PeerPicker { return p })
- return p
-}
-
-// Set updates the pool's list of peers.
-// Each peer value should be a valid base URL,
-// for example "http://example.net:8000".
-func (p *HTTPPool) Set(peers ...string) {
- p.mu.Lock()
- defer p.mu.Unlock()
- p.peers = consistenthash.New(p.opts.Replicas, p.opts.HashFn)
- p.peers.Add(peers...)
- p.httpGetters = make(map[string]*httpGetter, len(peers))
- for _, peer := range peers {
- p.httpGetters[peer] = &httpGetter{transport: p.Transport, baseURL: peer + p.opts.BasePath}
- }
-}
-
-func (p *HTTPPool) PickPeer(key string) (ProtoGetter, bool) {
- p.mu.Lock()
- defer p.mu.Unlock()
- if p.peers.IsEmpty() {
- return nil, false
- }
- if peer := p.peers.Get(key); peer != p.self {
- return p.httpGetters[peer], true
- }
- return nil, false
-}
-
-func (p *HTTPPool) ServeHTTP(w http.ResponseWriter, r *http.Request) {
- // Parse request.
- if !strings.HasPrefix(r.URL.Path, p.opts.BasePath) {
- panic("HTTPPool serving unexpected path: " + r.URL.Path)
- }
- parts := strings.SplitN(r.URL.Path[len(p.opts.BasePath):], "/", 2)
- if len(parts) != 2 {
- http.Error(w, "bad request", http.StatusBadRequest)
- return
- }
- groupName := parts[0]
- key := parts[1]
-
- // Fetch the value for this group/key.
- group := GetGroup(groupName)
- if group == nil {
- http.Error(w, "no such group: "+groupName, http.StatusNotFound)
- return
- }
- var ctx Context
- if p.Context != nil {
- ctx = p.Context(r)
- }
-
- group.Stats.ServerRequests.Add(1)
- var value []byte
- err := group.Get(ctx, key, AllocatingByteSliceSink(&value))
- if err != nil {
- http.Error(w, err.Error(), http.StatusInternalServerError)
- return
- }
-
- // Write the value to the response body as a proto message.
- body, err := proto.Marshal(&pb.GetResponse{Value: value})
- if err != nil {
- http.Error(w, err.Error(), http.StatusInternalServerError)
- return
- }
- w.Header().Set("Content-Type", "application/x-protobuf")
- w.Write(body)
-}
-
-type httpGetter struct {
- transport func(Context) http.RoundTripper
- baseURL string
-}
-
-var bufferPool = sync.Pool{
- New: func() interface{} { return new(bytes.Buffer) },
-}
-
-func (h *httpGetter) Get(context Context, in *pb.GetRequest, out *pb.GetResponse) error {
- u := fmt.Sprintf(
- "%v%v/%v",
- h.baseURL,
- url.QueryEscape(in.GetGroup()),
- url.QueryEscape(in.GetKey()),
- )
- req, err := http.NewRequest("GET", u, nil)
- if err != nil {
- return err
- }
- tr := http.DefaultTransport
- if h.transport != nil {
- tr = h.transport(context)
- }
- res, err := tr.RoundTrip(req)
- if err != nil {
- return err
- }
- defer res.Body.Close()
- if res.StatusCode != http.StatusOK {
- return fmt.Errorf("server returned: %v", res.Status)
- }
- b := bufferPool.Get().(*bytes.Buffer)
- b.Reset()
- defer bufferPool.Put(b)
- _, err = io.Copy(b, res.Body)
- if err != nil {
- return fmt.Errorf("reading response body: %v", err)
- }
- err = proto.Unmarshal(b.Bytes(), out)
- if err != nil {
- return fmt.Errorf("decoding response body: %v", err)
- }
- return nil
-}
diff --git a/vendor/github.com/golang/groupcache/http_test.go b/vendor/github.com/golang/groupcache/http_test.go
deleted file mode 100644
index b42edd7f0..000000000
--- a/vendor/github.com/golang/groupcache/http_test.go
+++ /dev/null
@@ -1,166 +0,0 @@
-/*
-Copyright 2013 Google 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 groupcache
-
-import (
- "errors"
- "flag"
- "log"
- "net"
- "net/http"
- "os"
- "os/exec"
- "strconv"
- "strings"
- "sync"
- "testing"
- "time"
-)
-
-var (
- peerAddrs = flag.String("test_peer_addrs", "", "Comma-separated list of peer addresses; used by TestHTTPPool")
- peerIndex = flag.Int("test_peer_index", -1, "Index of which peer this child is; used by TestHTTPPool")
- peerChild = flag.Bool("test_peer_child", false, "True if running as a child process; used by TestHTTPPool")
-)
-
-func TestHTTPPool(t *testing.T) {
- if *peerChild {
- beChildForTestHTTPPool()
- os.Exit(0)
- }
-
- const (
- nChild = 4
- nGets = 100
- )
-
- var childAddr []string
- for i := 0; i < nChild; i++ {
- childAddr = append(childAddr, pickFreeAddr(t))
- }
-
- var cmds []*exec.Cmd
- var wg sync.WaitGroup
- for i := 0; i < nChild; i++ {
- cmd := exec.Command(os.Args[0],
- "--test.run=TestHTTPPool",
- "--test_peer_child",
- "--test_peer_addrs="+strings.Join(childAddr, ","),
- "--test_peer_index="+strconv.Itoa(i),
- )
- cmds = append(cmds, cmd)
- wg.Add(1)
- if err := cmd.Start(); err != nil {
- t.Fatal("failed to start child process: ", err)
- }
- go awaitAddrReady(t, childAddr[i], &wg)
- }
- defer func() {
- for i := 0; i < nChild; i++ {
- if cmds[i].Process != nil {
- cmds[i].Process.Kill()
- }
- }
- }()
- wg.Wait()
-
- // Use a dummy self address so that we don't handle gets in-process.
- p := NewHTTPPool("should-be-ignored")
- p.Set(addrToURL(childAddr)...)
-
- // Dummy getter function. Gets should go to children only.
- // The only time this process will handle a get is when the
- // children can't be contacted for some reason.
- getter := GetterFunc(func(ctx Context, key string, dest Sink) error {
- return errors.New("parent getter called; something's wrong")
- })
- g := NewGroup("httpPoolTest", 1<<20, getter)
-
- for _, key := range testKeys(nGets) {
- var value string
- if err := g.Get(nil, key, StringSink(&value)); err != nil {
- t.Fatal(err)
- }
- if suffix := ":" + key; !strings.HasSuffix(value, suffix) {
- t.Errorf("Get(%q) = %q, want value ending in %q", key, value, suffix)
- }
- t.Logf("Get key=%q, value=%q (peer:key)", key, value)
- }
-}
-
-func testKeys(n int) (keys []string) {
- keys = make([]string, n)
- for i := range keys {
- keys[i] = strconv.Itoa(i)
- }
- return
-}
-
-func beChildForTestHTTPPool() {
- addrs := strings.Split(*peerAddrs, ",")
-
- p := NewHTTPPool("http://" + addrs[*peerIndex])
- p.Set(addrToURL(addrs)...)
-
- getter := GetterFunc(func(ctx Context, key string, dest Sink) error {
- dest.SetString(strconv.Itoa(*peerIndex) + ":" + key)
- return nil
- })
- NewGroup("httpPoolTest", 1<<20, getter)
-
- log.Fatal(http.ListenAndServe(addrs[*peerIndex], p))
-}
-
-// This is racy. Another process could swoop in and steal the port between the
-// call to this function and the next listen call. Should be okay though.
-// The proper way would be to pass the l.File() as ExtraFiles to the child
-// process, and then close your copy once the child starts.
-func pickFreeAddr(t *testing.T) string {
- l, err := net.Listen("tcp", "127.0.0.1:0")
- if err != nil {
- t.Fatal(err)
- }
- defer l.Close()
- return l.Addr().String()
-}
-
-func addrToURL(addr []string) []string {
- url := make([]string, len(addr))
- for i := range addr {
- url[i] = "http://" + addr[i]
- }
- return url
-}
-
-func awaitAddrReady(t *testing.T, addr string, wg *sync.WaitGroup) {
- defer wg.Done()
- const max = 1 * time.Second
- tries := 0
- for {
- tries++
- c, err := net.Dial("tcp", addr)
- if err == nil {
- c.Close()
- return
- }
- delay := time.Duration(tries) * 25 * time.Millisecond
- if delay > max {
- delay = max
- }
- time.Sleep(delay)
- }
-}
diff --git a/vendor/github.com/golang/groupcache/lru/lru.go b/vendor/github.com/golang/groupcache/lru/lru.go
deleted file mode 100644
index cdfe2991f..000000000
--- a/vendor/github.com/golang/groupcache/lru/lru.go
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
-Copyright 2013 Google 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 lru implements an LRU cache.
-package lru
-
-import "container/list"
-
-// Cache is an LRU cache. It is not safe for concurrent access.
-type Cache struct {
- // MaxEntries is the maximum number of cache entries before
- // an item is evicted. Zero means no limit.
- MaxEntries int
-
- // OnEvicted optionally specificies a callback function to be
- // executed when an entry is purged from the cache.
- OnEvicted func(key Key, value interface{})
-
- ll *list.List
- cache map[interface{}]*list.Element
-}
-
-// A Key may be any value that is comparable. See http://golang.org/ref/spec#Comparison_operators
-type Key interface{}
-
-type entry struct {
- key Key
- value interface{}
-}
-
-// New creates a new Cache.
-// If maxEntries is zero, the cache has no limit and it's assumed
-// that eviction is done by the caller.
-func New(maxEntries int) *Cache {
- return &Cache{
- MaxEntries: maxEntries,
- ll: list.New(),
- cache: make(map[interface{}]*list.Element),
- }
-}
-
-// Add adds a value to the cache.
-func (c *Cache) Add(key Key, value interface{}) {
- if c.cache == nil {
- c.cache = make(map[interface{}]*list.Element)
- c.ll = list.New()
- }
- if ee, ok := c.cache[key]; ok {
- c.ll.MoveToFront(ee)
- ee.Value.(*entry).value = value
- return
- }
- ele := c.ll.PushFront(&entry{key, value})
- c.cache[key] = ele
- if c.MaxEntries != 0 && c.ll.Len() > c.MaxEntries {
- c.RemoveOldest()
- }
-}
-
-// Get looks up a key's value from the cache.
-func (c *Cache) Get(key Key) (value interface{}, ok bool) {
- if c.cache == nil {
- return
- }
- if ele, hit := c.cache[key]; hit {
- c.ll.MoveToFront(ele)
- return ele.Value.(*entry).value, true
- }
- return
-}
-
-// Remove removes the provided key from the cache.
-func (c *Cache) Remove(key Key) {
- if c.cache == nil {
- return
- }
- if ele, hit := c.cache[key]; hit {
- c.removeElement(ele)
- }
-}
-
-// RemoveOldest removes the oldest item from the cache.
-func (c *Cache) RemoveOldest() {
- if c.cache == nil {
- return
- }
- ele := c.ll.Back()
- if ele != nil {
- c.removeElement(ele)
- }
-}
-
-func (c *Cache) removeElement(e *list.Element) {
- c.ll.Remove(e)
- kv := e.Value.(*entry)
- delete(c.cache, kv.key)
- if c.OnEvicted != nil {
- c.OnEvicted(kv.key, kv.value)
- }
-}
-
-// Len returns the number of items in the cache.
-func (c *Cache) Len() int {
- if c.cache == nil {
- return 0
- }
- return c.ll.Len()
-}
diff --git a/vendor/github.com/golang/groupcache/lru/lru_test.go b/vendor/github.com/golang/groupcache/lru/lru_test.go
deleted file mode 100644
index 98a2656e8..000000000
--- a/vendor/github.com/golang/groupcache/lru/lru_test.go
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
-Copyright 2013 Google 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 lru
-
-import (
- "testing"
-)
-
-type simpleStruct struct {
- int
- string
-}
-
-type complexStruct struct {
- int
- simpleStruct
-}
-
-var getTests = []struct {
- name string
- keyToAdd interface{}
- keyToGet interface{}
- expectedOk bool
-}{
- {"string_hit", "myKey", "myKey", true},
- {"string_miss", "myKey", "nonsense", false},
- {"simple_struct_hit", simpleStruct{1, "two"}, simpleStruct{1, "two"}, true},
- {"simeple_struct_miss", simpleStruct{1, "two"}, simpleStruct{0, "noway"}, false},
- {"complex_struct_hit", complexStruct{1, simpleStruct{2, "three"}},
- complexStruct{1, simpleStruct{2, "three"}}, true},
-}
-
-func TestGet(t *testing.T) {
- for _, tt := range getTests {
- lru := New(0)
- lru.Add(tt.keyToAdd, 1234)
- val, ok := lru.Get(tt.keyToGet)
- if ok != tt.expectedOk {
- t.Fatalf("%s: cache hit = %v; want %v", tt.name, ok, !ok)
- } else if ok && val != 1234 {
- t.Fatalf("%s expected get to return 1234 but got %v", tt.name, val)
- }
- }
-}
-
-func TestRemove(t *testing.T) {
- lru := New(0)
- lru.Add("myKey", 1234)
- if val, ok := lru.Get("myKey"); !ok {
- t.Fatal("TestRemove returned no match")
- } else if val != 1234 {
- t.Fatalf("TestRemove failed. Expected %d, got %v", 1234, val)
- }
-
- lru.Remove("myKey")
- if _, ok := lru.Get("myKey"); ok {
- t.Fatal("TestRemove returned a removed entry")
- }
-}
diff --git a/vendor/github.com/golang/groupcache/peers.go b/vendor/github.com/golang/groupcache/peers.go
deleted file mode 100644
index a74a79b8f..000000000
--- a/vendor/github.com/golang/groupcache/peers.go
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
-Copyright 2012 Google 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.
-*/
-
-// peers.go defines how processes find and communicate with their peers.
-
-package groupcache
-
-import (
- pb "github.com/golang/groupcache/groupcachepb"
-)
-
-// Context is an opaque value passed through calls to the
-// ProtoGetter. It may be nil if your ProtoGetter implementation does
-// not require a context.
-type Context interface{}
-
-// ProtoGetter is the interface that must be implemented by a peer.
-type ProtoGetter interface {
- Get(context Context, in *pb.GetRequest, out *pb.GetResponse) error
-}
-
-// PeerPicker is the interface that must be implemented to locate
-// the peer that owns a specific key.
-type PeerPicker interface {
- // PickPeer returns the peer that owns the specific key
- // and true to indicate that a remote peer was nominated.
- // It returns nil, false if the key owner is the current peer.
- PickPeer(key string) (peer ProtoGetter, ok bool)
-}
-
-// NoPeers is an implementation of PeerPicker that never finds a peer.
-type NoPeers struct{}
-
-func (NoPeers) PickPeer(key string) (peer ProtoGetter, ok bool) { return }
-
-var (
- portPicker func() PeerPicker
-)
-
-// RegisterPeerPicker registers the peer initialization function.
-// It is called once, when the first group is created.
-func RegisterPeerPicker(fn func() PeerPicker) {
- if portPicker != nil {
- panic("RegisterPeerPicker called more than once")
- }
- portPicker = fn
-}
-
-func getPeers() PeerPicker {
- if portPicker == nil {
- return NoPeers{}
- }
- pk := portPicker()
- if pk == nil {
- pk = NoPeers{}
- }
- return pk
-}
diff --git a/vendor/github.com/golang/groupcache/singleflight/singleflight.go b/vendor/github.com/golang/groupcache/singleflight/singleflight.go
deleted file mode 100644
index ff2c2ee4f..000000000
--- a/vendor/github.com/golang/groupcache/singleflight/singleflight.go
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
-Copyright 2012 Google 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 singleflight provides a duplicate function call suppression
-// mechanism.
-package singleflight
-
-import "sync"
-
-// call is an in-flight or completed Do call
-type call struct {
- wg sync.WaitGroup
- val interface{}
- err error
-}
-
-// Group represents a class of work and forms a namespace in which
-// units of work can be executed with duplicate suppression.
-type Group struct {
- mu sync.Mutex // protects m
- m map[string]*call // lazily initialized
-}
-
-// Do executes and returns the results of the given function, making
-// sure that only one execution is in-flight for a given key at a
-// time. If a duplicate comes in, the duplicate caller waits for the
-// original to complete and receives the same results.
-func (g *Group) Do(key string, fn func() (interface{}, error)) (interface{}, error) {
- g.mu.Lock()
- if g.m == nil {
- g.m = make(map[string]*call)
- }
- if c, ok := g.m[key]; ok {
- g.mu.Unlock()
- c.wg.Wait()
- return c.val, c.err
- }
- c := new(call)
- c.wg.Add(1)
- g.m[key] = c
- g.mu.Unlock()
-
- c.val, c.err = fn()
- c.wg.Done()
-
- g.mu.Lock()
- delete(g.m, key)
- g.mu.Unlock()
-
- return c.val, c.err
-}
diff --git a/vendor/github.com/golang/groupcache/singleflight/singleflight_test.go b/vendor/github.com/golang/groupcache/singleflight/singleflight_test.go
deleted file mode 100644
index 47b4d3dc0..000000000
--- a/vendor/github.com/golang/groupcache/singleflight/singleflight_test.go
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
-Copyright 2012 Google 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 singleflight
-
-import (
- "errors"
- "fmt"
- "sync"
- "sync/atomic"
- "testing"
- "time"
-)
-
-func TestDo(t *testing.T) {
- var g Group
- v, err := g.Do("key", func() (interface{}, error) {
- return "bar", nil
- })
- if got, want := fmt.Sprintf("%v (%T)", v, v), "bar (string)"; got != want {
- t.Errorf("Do = %v; want %v", got, want)
- }
- if err != nil {
- t.Errorf("Do error = %v", err)
- }
-}
-
-func TestDoErr(t *testing.T) {
- var g Group
- someErr := errors.New("Some error")
- v, err := g.Do("key", func() (interface{}, error) {
- return nil, someErr
- })
- if err != someErr {
- t.Errorf("Do error = %v; want someErr", err)
- }
- if v != nil {
- t.Errorf("unexpected non-nil value %#v", v)
- }
-}
-
-func TestDoDupSuppress(t *testing.T) {
- var g Group
- c := make(chan string)
- var calls int32
- fn := func() (interface{}, error) {
- atomic.AddInt32(&calls, 1)
- return <-c, nil
- }
-
- const n = 10
- var wg sync.WaitGroup
- for i := 0; i < n; i++ {
- wg.Add(1)
- go func() {
- v, err := g.Do("key", fn)
- if err != nil {
- t.Errorf("Do error: %v", err)
- }
- if v.(string) != "bar" {
- t.Errorf("got %q; want %q", v, "bar")
- }
- wg.Done()
- }()
- }
- time.Sleep(100 * time.Millisecond) // let goroutines above block
- c <- "bar"
- wg.Wait()
- if got := atomic.LoadInt32(&calls); got != 1 {
- t.Errorf("number of calls = %d; want 1", got)
- }
-}
diff --git a/vendor/github.com/golang/groupcache/sinks.go b/vendor/github.com/golang/groupcache/sinks.go
deleted file mode 100644
index cb42b41b4..000000000
--- a/vendor/github.com/golang/groupcache/sinks.go
+++ /dev/null
@@ -1,322 +0,0 @@
-/*
-Copyright 2012 Google 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 groupcache
-
-import (
- "errors"
-
- "github.com/golang/protobuf/proto"
-)
-
-// A Sink receives data from a Get call.
-//
-// Implementation of Getter must call exactly one of the Set methods
-// on success.
-type Sink interface {
- // SetString sets the value to s.
- SetString(s string) error
-
- // SetBytes sets the value to the contents of v.
- // The caller retains ownership of v.
- SetBytes(v []byte) error
-
- // SetProto sets the value to the encoded version of m.
- // The caller retains ownership of m.
- SetProto(m proto.Message) error
-
- // view returns a frozen view of the bytes for caching.
- view() (ByteView, error)
-}
-
-func cloneBytes(b []byte) []byte {
- c := make([]byte, len(b))
- copy(c, b)
- return c
-}
-
-func setSinkView(s Sink, v ByteView) error {
- // A viewSetter is a Sink that can also receive its value from
- // a ByteView. This is a fast path to minimize copies when the
- // item was already cached locally in memory (where it's
- // cached as a ByteView)
- type viewSetter interface {
- setView(v ByteView) error
- }
- if vs, ok := s.(viewSetter); ok {
- return vs.setView(v)
- }
- if v.b != nil {
- return s.SetBytes(v.b)
- }
- return s.SetString(v.s)
-}
-
-// StringSink returns a Sink that populates the provided string pointer.
-func StringSink(sp *string) Sink {
- return &stringSink{sp: sp}
-}
-
-type stringSink struct {
- sp *string
- v ByteView
- // TODO(bradfitz): track whether any Sets were called.
-}
-
-func (s *stringSink) view() (ByteView, error) {
- // TODO(bradfitz): return an error if no Set was called
- return s.v, nil
-}
-
-func (s *stringSink) SetString(v string) error {
- s.v.b = nil
- s.v.s = v
- *s.sp = v
- return nil
-}
-
-func (s *stringSink) SetBytes(v []byte) error {
- return s.SetString(string(v))
-}
-
-func (s *stringSink) SetProto(m proto.Message) error {
- b, err := proto.Marshal(m)
- if err != nil {
- return err
- }
- s.v.b = b
- *s.sp = string(b)
- return nil
-}
-
-// ByteViewSink returns a Sink that populates a ByteView.
-func ByteViewSink(dst *ByteView) Sink {
- if dst == nil {
- panic("nil dst")
- }
- return &byteViewSink{dst: dst}
-}
-
-type byteViewSink struct {
- dst *ByteView
-
- // if this code ever ends up tracking that at least one set*
- // method was called, don't make it an error to call set
- // methods multiple times. Lorry's payload.go does that, and
- // it makes sense. The comment at the top of this file about
- // "exactly one of the Set methods" is overly strict. We
- // really care about at least once (in a handler), but if
- // multiple handlers fail (or multiple functions in a program
- // using a Sink), it's okay to re-use the same one.
-}
-
-func (s *byteViewSink) setView(v ByteView) error {
- *s.dst = v
- return nil
-}
-
-func (s *byteViewSink) view() (ByteView, error) {
- return *s.dst, nil
-}
-
-func (s *byteViewSink) SetProto(m proto.Message) error {
- b, err := proto.Marshal(m)
- if err != nil {
- return err
- }
- *s.dst = ByteView{b: b}
- return nil
-}
-
-func (s *byteViewSink) SetBytes(b []byte) error {
- *s.dst = ByteView{b: cloneBytes(b)}
- return nil
-}
-
-func (s *byteViewSink) SetString(v string) error {
- *s.dst = ByteView{s: v}
- return nil
-}
-
-// ProtoSink returns a sink that unmarshals binary proto values into m.
-func ProtoSink(m proto.Message) Sink {
- return &protoSink{
- dst: m,
- }
-}
-
-type protoSink struct {
- dst proto.Message // authorative value
- typ string
-
- v ByteView // encoded
-}
-
-func (s *protoSink) view() (ByteView, error) {
- return s.v, nil
-}
-
-func (s *protoSink) SetBytes(b []byte) error {
- err := proto.Unmarshal(b, s.dst)
- if err != nil {
- return err
- }
- s.v.b = cloneBytes(b)
- s.v.s = ""
- return nil
-}
-
-func (s *protoSink) SetString(v string) error {
- b := []byte(v)
- err := proto.Unmarshal(b, s.dst)
- if err != nil {
- return err
- }
- s.v.b = b
- s.v.s = ""
- return nil
-}
-
-func (s *protoSink) SetProto(m proto.Message) error {
- b, err := proto.Marshal(m)
- if err != nil {
- return err
- }
- // TODO(bradfitz): optimize for same-task case more and write
- // right through? would need to document ownership rules at
- // the same time. but then we could just assign *dst = *m
- // here. This works for now:
- err = proto.Unmarshal(b, s.dst)
- if err != nil {
- return err
- }
- s.v.b = b
- s.v.s = ""
- return nil
-}
-
-// AllocatingByteSliceSink returns a Sink that allocates
-// a byte slice to hold the received value and assigns
-// it to *dst. The memory is not retained by groupcache.
-func AllocatingByteSliceSink(dst *[]byte) Sink {
- return &allocBytesSink{dst: dst}
-}
-
-type allocBytesSink struct {
- dst *[]byte
- v ByteView
-}
-
-func (s *allocBytesSink) view() (ByteView, error) {
- return s.v, nil
-}
-
-func (s *allocBytesSink) setView(v ByteView) error {
- if v.b != nil {
- *s.dst = cloneBytes(v.b)
- } else {
- *s.dst = []byte(v.s)
- }
- s.v = v
- return nil
-}
-
-func (s *allocBytesSink) SetProto(m proto.Message) error {
- b, err := proto.Marshal(m)
- if err != nil {
- return err
- }
- return s.setBytesOwned(b)
-}
-
-func (s *allocBytesSink) SetBytes(b []byte) error {
- return s.setBytesOwned(cloneBytes(b))
-}
-
-func (s *allocBytesSink) setBytesOwned(b []byte) error {
- if s.dst == nil {
- return errors.New("nil AllocatingByteSliceSink *[]byte dst")
- }
- *s.dst = cloneBytes(b) // another copy, protecting the read-only s.v.b view
- s.v.b = b
- s.v.s = ""
- return nil
-}
-
-func (s *allocBytesSink) SetString(v string) error {
- if s.dst == nil {
- return errors.New("nil AllocatingByteSliceSink *[]byte dst")
- }
- *s.dst = []byte(v)
- s.v.b = nil
- s.v.s = v
- return nil
-}
-
-// TruncatingByteSliceSink returns a Sink that writes up to len(*dst)
-// bytes to *dst. If more bytes are available, they're silently
-// truncated. If fewer bytes are available than len(*dst), *dst
-// is shrunk to fit the number of bytes available.
-func TruncatingByteSliceSink(dst *[]byte) Sink {
- return &truncBytesSink{dst: dst}
-}
-
-type truncBytesSink struct {
- dst *[]byte
- v ByteView
-}
-
-func (s *truncBytesSink) view() (ByteView, error) {
- return s.v, nil
-}
-
-func (s *truncBytesSink) SetProto(m proto.Message) error {
- b, err := proto.Marshal(m)
- if err != nil {
- return err
- }
- return s.setBytesOwned(b)
-}
-
-func (s *truncBytesSink) SetBytes(b []byte) error {
- return s.setBytesOwned(cloneBytes(b))
-}
-
-func (s *truncBytesSink) setBytesOwned(b []byte) error {
- if s.dst == nil {
- return errors.New("nil TruncatingByteSliceSink *[]byte dst")
- }
- n := copy(*s.dst, b)
- if n < len(*s.dst) {
- *s.dst = (*s.dst)[:n]
- }
- s.v.b = b
- s.v.s = ""
- return nil
-}
-
-func (s *truncBytesSink) SetString(v string) error {
- if s.dst == nil {
- return errors.New("nil TruncatingByteSliceSink *[]byte dst")
- }
- n := copy(*s.dst, v)
- if n < len(*s.dst) {
- *s.dst = (*s.dst)[:n]
- }
- s.v.b = nil
- s.v.s = v
- return nil
-}
diff --git a/vendor/github.com/golang/groupcache/testpb/test.pb.go b/vendor/github.com/golang/groupcache/testpb/test.pb.go
deleted file mode 100644
index 038040d15..000000000
--- a/vendor/github.com/golang/groupcache/testpb/test.pb.go
+++ /dev/null
@@ -1,235 +0,0 @@
-// Code generated by protoc-gen-go.
-// source: test.proto
-// DO NOT EDIT!
-
-package testpb
-
-import proto "github.com/golang/protobuf/proto"
-import json "encoding/json"
-import math "math"
-
-// Reference proto, json, and math imports to suppress error if they are not otherwise used.
-var _ = proto.Marshal
-var _ = &json.SyntaxError{}
-var _ = math.Inf
-
-type TestMessage struct {
- Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"`
- City *string `protobuf:"bytes,2,opt,name=city" json:"city,omitempty"`
- XXX_unrecognized []byte `json:"-"`
-}
-
-func (m *TestMessage) Reset() { *m = TestMessage{} }
-func (m *TestMessage) String() string { return proto.CompactTextString(m) }
-func (*TestMessage) ProtoMessage() {}
-
-func (m *TestMessage) GetName() string {
- if m != nil && m.Name != nil {
- return *m.Name
- }
- return ""
-}
-
-func (m *TestMessage) GetCity() string {
- if m != nil && m.City != nil {
- return *m.City
- }
- return ""
-}
-
-type TestRequest struct {
- Lower *string `protobuf:"bytes,1,req,name=lower" json:"lower,omitempty"`
- RepeatCount *int32 `protobuf:"varint,2,opt,name=repeat_count,def=1" json:"repeat_count,omitempty"`
- XXX_unrecognized []byte `json:"-"`
-}
-
-func (m *TestRequest) Reset() { *m = TestRequest{} }
-func (m *TestRequest) String() string { return proto.CompactTextString(m) }
-func (*TestRequest) ProtoMessage() {}
-
-const Default_TestRequest_RepeatCount int32 = 1
-
-func (m *TestRequest) GetLower() string {
- if m != nil && m.Lower != nil {
- return *m.Lower
- }
- return ""
-}
-
-func (m *TestRequest) GetRepeatCount() int32 {
- if m != nil && m.RepeatCount != nil {
- return *m.RepeatCount
- }
- return Default_TestRequest_RepeatCount
-}
-
-type TestResponse struct {
- Value *string `protobuf:"bytes,1,opt,name=value" json:"value,omitempty"`
- XXX_unrecognized []byte `json:"-"`
-}
-
-func (m *TestResponse) Reset() { *m = TestResponse{} }
-func (m *TestResponse) String() string { return proto.CompactTextString(m) }
-func (*TestResponse) ProtoMessage() {}
-
-func (m *TestResponse) GetValue() string {
- if m != nil && m.Value != nil {
- return *m.Value
- }
- return ""
-}
-
-type CacheStats struct {
- Items *int64 `protobuf:"varint,1,opt,name=items" json:"items,omitempty"`
- Bytes *int64 `protobuf:"varint,2,opt,name=bytes" json:"bytes,omitempty"`
- Gets *int64 `protobuf:"varint,3,opt,name=gets" json:"gets,omitempty"`
- Hits *int64 `protobuf:"varint,4,opt,name=hits" json:"hits,omitempty"`
- Evicts *int64 `protobuf:"varint,5,opt,name=evicts" json:"evicts,omitempty"`
- XXX_unrecognized []byte `json:"-"`
-}
-
-func (m *CacheStats) Reset() { *m = CacheStats{} }
-func (m *CacheStats) String() string { return proto.CompactTextString(m) }
-func (*CacheStats) ProtoMessage() {}
-
-func (m *CacheStats) GetItems() int64 {
- if m != nil && m.Items != nil {
- return *m.Items
- }
- return 0
-}
-
-func (m *CacheStats) GetBytes() int64 {
- if m != nil && m.Bytes != nil {
- return *m.Bytes
- }
- return 0
-}
-
-func (m *CacheStats) GetGets() int64 {
- if m != nil && m.Gets != nil {
- return *m.Gets
- }
- return 0
-}
-
-func (m *CacheStats) GetHits() int64 {
- if m != nil && m.Hits != nil {
- return *m.Hits
- }
- return 0
-}
-
-func (m *CacheStats) GetEvicts() int64 {
- if m != nil && m.Evicts != nil {
- return *m.Evicts
- }
- return 0
-}
-
-type StatsResponse struct {
- Gets *int64 `protobuf:"varint,1,opt,name=gets" json:"gets,omitempty"`
- CacheHits *int64 `protobuf:"varint,12,opt,name=cache_hits" json:"cache_hits,omitempty"`
- Fills *int64 `protobuf:"varint,2,opt,name=fills" json:"fills,omitempty"`
- TotalAlloc *uint64 `protobuf:"varint,3,opt,name=total_alloc" json:"total_alloc,omitempty"`
- MainCache *CacheStats `protobuf:"bytes,4,opt,name=main_cache" json:"main_cache,omitempty"`
- HotCache *CacheStats `protobuf:"bytes,5,opt,name=hot_cache" json:"hot_cache,omitempty"`
- ServerIn *int64 `protobuf:"varint,6,opt,name=server_in" json:"server_in,omitempty"`
- Loads *int64 `protobuf:"varint,8,opt,name=loads" json:"loads,omitempty"`
- PeerLoads *int64 `protobuf:"varint,9,opt,name=peer_loads" json:"peer_loads,omitempty"`
- PeerErrors *int64 `protobuf:"varint,10,opt,name=peer_errors" json:"peer_errors,omitempty"`
- LocalLoads *int64 `protobuf:"varint,11,opt,name=local_loads" json:"local_loads,omitempty"`
- XXX_unrecognized []byte `json:"-"`
-}
-
-func (m *StatsResponse) Reset() { *m = StatsResponse{} }
-func (m *StatsResponse) String() string { return proto.CompactTextString(m) }
-func (*StatsResponse) ProtoMessage() {}
-
-func (m *StatsResponse) GetGets() int64 {
- if m != nil && m.Gets != nil {
- return *m.Gets
- }
- return 0
-}
-
-func (m *StatsResponse) GetCacheHits() int64 {
- if m != nil && m.CacheHits != nil {
- return *m.CacheHits
- }
- return 0
-}
-
-func (m *StatsResponse) GetFills() int64 {
- if m != nil && m.Fills != nil {
- return *m.Fills
- }
- return 0
-}
-
-func (m *StatsResponse) GetTotalAlloc() uint64 {
- if m != nil && m.TotalAlloc != nil {
- return *m.TotalAlloc
- }
- return 0
-}
-
-func (m *StatsResponse) GetMainCache() *CacheStats {
- if m != nil {
- return m.MainCache
- }
- return nil
-}
-
-func (m *StatsResponse) GetHotCache() *CacheStats {
- if m != nil {
- return m.HotCache
- }
- return nil
-}
-
-func (m *StatsResponse) GetServerIn() int64 {
- if m != nil && m.ServerIn != nil {
- return *m.ServerIn
- }
- return 0
-}
-
-func (m *StatsResponse) GetLoads() int64 {
- if m != nil && m.Loads != nil {
- return *m.Loads
- }
- return 0
-}
-
-func (m *StatsResponse) GetPeerLoads() int64 {
- if m != nil && m.PeerLoads != nil {
- return *m.PeerLoads
- }
- return 0
-}
-
-func (m *StatsResponse) GetPeerErrors() int64 {
- if m != nil && m.PeerErrors != nil {
- return *m.PeerErrors
- }
- return 0
-}
-
-func (m *StatsResponse) GetLocalLoads() int64 {
- if m != nil && m.LocalLoads != nil {
- return *m.LocalLoads
- }
- return 0
-}
-
-type Empty struct {
- XXX_unrecognized []byte `json:"-"`
-}
-
-func (m *Empty) Reset() { *m = Empty{} }
-func (m *Empty) String() string { return proto.CompactTextString(m) }
-func (*Empty) ProtoMessage() {}
-
-func init() {
-}
diff --git a/vendor/github.com/golang/groupcache/testpb/test.proto b/vendor/github.com/golang/groupcache/testpb/test.proto
deleted file mode 100644
index b9dc6c9a0..000000000
--- a/vendor/github.com/golang/groupcache/testpb/test.proto
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
-Copyright 2012 Google 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.
-*/
-
-syntax = "proto2";
-
-package testpb;
-
-message TestMessage {
- optional string name = 1;
- optional string city = 2;
-}
-
-message TestRequest {
- required string lower = 1; // to be returned upper case
- optional int32 repeat_count = 2 [default = 1]; // .. this many times
-}
-
-message TestResponse {
- optional string value = 1;
-}
-
-message CacheStats {
- optional int64 items = 1;
- optional int64 bytes = 2;
- optional int64 gets = 3;
- optional int64 hits = 4;
- optional int64 evicts = 5;
-}
-
-message StatsResponse {
- optional int64 gets = 1;
- optional int64 cache_hits = 12;
- optional int64 fills = 2;
- optional uint64 total_alloc = 3;
- optional CacheStats main_cache = 4;
- optional CacheStats hot_cache = 5;
- optional int64 server_in = 6;
- optional int64 loads = 8;
- optional int64 peer_loads = 9;
- optional int64 peer_errors = 10;
- optional int64 local_loads = 11;
-}
-
-message Empty {}
-
-service GroupCacheTest {
- rpc InitPeers(Empty) returns (Empty) {};
- rpc Get(TestRequest) returns (TestResponse) {};
- rpc GetStats(Empty) returns (StatsResponse) {};
-}
diff --git a/vendor/github.com/gorilla/context/.travis.yml b/vendor/github.com/gorilla/context/.travis.yml
index 24882fc7b..6f440f1e4 100644
--- a/vendor/github.com/gorilla/context/.travis.yml
+++ b/vendor/github.com/gorilla/context/.travis.yml
@@ -7,6 +7,7 @@ matrix:
- go: 1.4
- go: 1.5
- go: 1.6
+ - go: 1.7
- go: tip
allow_failures:
- go: tip
diff --git a/vendor/github.com/gorilla/context/README.md b/vendor/github.com/gorilla/context/README.md
index c60a31b05..08f86693b 100644
--- a/vendor/github.com/gorilla/context/README.md
+++ b/vendor/github.com/gorilla/context/README.md
@@ -4,4 +4,7 @@ context
gorilla/context is a general purpose registry for global request variables.
+> Note: gorilla/context, having been born well before `context.Context` existed, does not play well
+> with the shallow copying of the request that [`http.Request.WithContext`](https://golang.org/pkg/net/http/#Request.WithContext) (added to net/http Go 1.7 onwards) performs. You should either use *just* gorilla/context, or moving forward, the new `http.Request.Context()`.
+
Read the full documentation here: http://www.gorillatoolkit.org/pkg/context
diff --git a/vendor/github.com/gorilla/context/context_test.go b/vendor/github.com/gorilla/context/context_test.go
index 9814c501e..d70e91a23 100644
--- a/vendor/github.com/gorilla/context/context_test.go
+++ b/vendor/github.com/gorilla/context/context_test.go
@@ -69,7 +69,7 @@ func TestContext(t *testing.T) {
// GetAllOk() for empty request
values, ok = GetAllOk(emptyR)
- assertEqual(value, nil)
+ assertEqual(len(values), 0)
assertEqual(ok, false)
// Delete()
diff --git a/vendor/github.com/gorilla/context/doc.go b/vendor/github.com/gorilla/context/doc.go
index 73c740031..448d1bfca 100644
--- a/vendor/github.com/gorilla/context/doc.go
+++ b/vendor/github.com/gorilla/context/doc.go
@@ -5,6 +5,12 @@
/*
Package context stores values shared during a request lifetime.
+Note: gorilla/context, having been born well before `context.Context` existed,
+does not play well > with the shallow copying of the request that
+[`http.Request.WithContext`](https://golang.org/pkg/net/http/#Request.WithContext)
+(added to net/http Go 1.7 onwards) performs. You should either use *just*
+gorilla/context, or moving forward, the new `http.Request.Context()`.
+
For example, a router can set variables extracted from the URL and later
application handlers can access those values, or it can be used to store
sessions values to be saved at the end of a request. There are several
diff --git a/vendor/github.com/gorilla/handlers/.travis.yml b/vendor/github.com/gorilla/handlers/.travis.yml
index 66435ac0b..783020996 100644
--- a/vendor/github.com/gorilla/handlers/.travis.yml
+++ b/vendor/github.com/gorilla/handlers/.travis.yml
@@ -7,11 +7,12 @@ matrix:
- go: 1.5
- go: 1.6
- go: tip
- allow_failures:
- - go: tip
+
+install:
+ - go get golang.org/x/tools/cmd/vet
script:
- go get -t -v ./...
- diff -u <(echo -n) <(gofmt -d .)
- - go vet $(go list ./... | grep -v /vendor/)
+ - go tool vet .
- go test -v -race ./...
diff --git a/vendor/github.com/gorilla/handlers/cors.go b/vendor/github.com/gorilla/handlers/cors.go
index 1f92d1ad4..d4229a5d9 100644
--- a/vendor/github.com/gorilla/handlers/cors.go
+++ b/vendor/github.com/gorilla/handlers/cors.go
@@ -112,9 +112,6 @@ func (ch *cors) ServeHTTP(w http.ResponseWriter, r *http.Request) {
w.Header().Set(corsAllowOriginHeader, origin)
- if r.Method == corsOptionMethod {
- return
- }
ch.h.ServeHTTP(w, r)
}
diff --git a/vendor/github.com/gorilla/handlers/cors_test.go b/vendor/github.com/gorilla/handlers/cors_test.go
index c63913eee..ff7eebf48 100644
--- a/vendor/github.com/gorilla/handlers/cors_test.go
+++ b/vendor/github.com/gorilla/handlers/cors_test.go
@@ -104,24 +104,6 @@ func TestCORSHandlerInvalidRequestMethodForPreflightMethodNotAllowed(t *testing.
}
}
-func TestCORSHandlerOptionsRequestMustNotBePassedToNextHandler(t *testing.T) {
- r := newRequest("OPTIONS", "http://www.example.com/")
- r.Header.Set("Origin", r.URL.String())
- r.Header.Set(corsRequestMethodHeader, "GET")
-
- rr := httptest.NewRecorder()
-
- testHandler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
- t.Fatal("Options request must not be passed to next handler")
- })
-
- CORS()(testHandler).ServeHTTP(rr, r)
-
- if status := rr.Code; status != http.StatusOK {
- t.Fatalf("bad status: got %v want %v", status, http.StatusOK)
- }
-}
-
func TestCORSHandlerAllowedMethodForPreflight(t *testing.T) {
r := newRequest("OPTIONS", "http://www.example.com/")
r.Header.Set("Origin", r.URL.String())
diff --git a/vendor/github.com/gorilla/mux/.travis.yml b/vendor/github.com/gorilla/mux/.travis.yml
index f4084bd81..4dcdacb65 100644
--- a/vendor/github.com/gorilla/mux/.travis.yml
+++ b/vendor/github.com/gorilla/mux/.travis.yml
@@ -10,6 +10,9 @@ matrix:
- go: 1.6
- go: tip
+install:
+ - go get golang.org/x/tools/cmd/vet
+
script:
- go get -t -v ./...
- diff -u <(echo -n) <(gofmt -d .)
diff --git a/vendor/github.com/gorilla/mux/mux.go b/vendor/github.com/gorilla/mux/mux.go
index 94f5ddd9c..fbb7f19ad 100644
--- a/vendor/github.com/gorilla/mux/mux.go
+++ b/vendor/github.com/gorilla/mux/mux.go
@@ -48,8 +48,6 @@ type Router struct {
namedRoutes map[string]*Route
// See Router.StrictSlash(). This defines the flag for new routes.
strictSlash bool
- // See Router.SkipClean(). This defines the flag for new routes.
- skipClean bool
// If true, do not clear the request context after handling the request
KeepContext bool
}
@@ -75,21 +73,19 @@ func (r *Router) Match(req *http.Request, match *RouteMatch) bool {
// When there is a match, the route variables can be retrieved calling
// mux.Vars(request).
func (r *Router) ServeHTTP(w http.ResponseWriter, req *http.Request) {
- if !r.skipClean {
- // Clean path to canonical form and redirect.
- if p := cleanPath(req.URL.Path); p != req.URL.Path {
-
- // Added 3 lines (Philip Schlump) - It was dropping the query string and #whatever from query.
- // This matches with fix in go 1.2 r.c. 4 for same problem. Go Issue:
- // http://code.google.com/p/go/issues/detail?id=5252
- url := *req.URL
- url.Path = p
- p = url.String()
-
- w.Header().Set("Location", p)
- w.WriteHeader(http.StatusMovedPermanently)
- return
- }
+ // Clean path to canonical form and redirect.
+ if p := cleanPath(req.URL.Path); p != req.URL.Path {
+
+ // Added 3 lines (Philip Schlump) - It was dropping the query string and #whatever from query.
+ // This matches with fix in go 1.2 r.c. 4 for same problem. Go Issue:
+ // http://code.google.com/p/go/issues/detail?id=5252
+ url := *req.URL
+ url.Path = p
+ p = url.String()
+
+ w.Header().Set("Location", p)
+ w.WriteHeader(http.StatusMovedPermanently)
+ return
}
var match RouteMatch
var handler http.Handler
@@ -137,19 +133,6 @@ func (r *Router) StrictSlash(value bool) *Router {
return r
}
-// SkipClean defines the path cleaning behaviour for new routes. The initial
-// value is false. Users should be careful about which routes are not cleaned
-//
-// When true, if the route path is "/path//to", it will remain with the double
-// slash. This is helpful if you have a route like: /fetch/http://xkcd.com/534/
-//
-// When false, the path will be cleaned, so /fetch/http://xkcd.com/534/ will
-// become /fetch/http/xkcd.com/534
-func (r *Router) SkipClean(value bool) *Router {
- r.skipClean = value
- return r
-}
-
// ----------------------------------------------------------------------------
// parentRoute
// ----------------------------------------------------------------------------
@@ -187,7 +170,7 @@ func (r *Router) buildVars(m map[string]string) map[string]string {
// NewRoute registers an empty route.
func (r *Router) NewRoute() *Route {
- route := &Route{parent: r, strictSlash: r.strictSlash, skipClean: r.skipClean}
+ route := &Route{parent: r, strictSlash: r.strictSlash}
r.routes = append(r.routes, route)
return route
}
@@ -374,7 +357,6 @@ func cleanPath(p string) string {
if p[len(p)-1] == '/' && np != "/" {
np += "/"
}
-
return np
}
diff --git a/vendor/github.com/gorilla/mux/mux_test.go b/vendor/github.com/gorilla/mux/mux_test.go
index 777d063c0..a44d03f80 100644
--- a/vendor/github.com/gorilla/mux/mux_test.go
+++ b/vendor/github.com/gorilla/mux/mux_test.go
@@ -1386,24 +1386,6 @@ func Test301Redirect(t *testing.T) {
}
}
-func TestSkipClean(t *testing.T) {
- func1 := func(w http.ResponseWriter, r *http.Request) {}
- func2 := func(w http.ResponseWriter, r *http.Request) {}
-
- r := NewRouter()
- r.SkipClean(true)
- r.HandleFunc("/api/", func2).Name("func2")
- r.HandleFunc("/", func1).Name("func1")
-
- req, _ := http.NewRequest("GET", "http://localhost//api/?abc=def", nil)
- res := NewRecorder()
- r.ServeHTTP(res, req)
-
- if len(res.HeaderMap["Location"]) != 0 {
- t.Errorf("Shouldn't redirect since skip clean is disabled")
- }
-}
-
// https://plus.google.com/101022900381697718949/posts/eWy6DjFJ6uW
func TestSubrouterHeader(t *testing.T) {
expected := "func1 response"
diff --git a/vendor/github.com/gorilla/mux/route.go b/vendor/github.com/gorilla/mux/route.go
index 6c53f9f1d..bf92af261 100644
--- a/vendor/github.com/gorilla/mux/route.go
+++ b/vendor/github.com/gorilla/mux/route.go
@@ -26,9 +26,6 @@ type Route struct {
// If true, when the path pattern is "/path/", accessing "/path" will
// redirect to the former and vice versa.
strictSlash bool
- // If true, when the path pattern is "/path//to", accessing "/path//to"
- // will not redirect
- skipClean bool
// If true, this route never matches: it is only used to build URLs.
buildOnly bool
// The name used to build URLs.
@@ -39,10 +36,6 @@ type Route struct {
buildVarsFunc BuildVarsFunc
}
-func (r *Route) SkipClean() bool {
- return r.skipClean
-}
-
// Match matches the route against the request.
func (r *Route) Match(req *http.Request, match *RouteMatch) bool {
if r.buildOnly || r.err != nil {
diff --git a/vendor/github.com/hashicorp/golang-lru/.gitignore b/vendor/github.com/hashicorp/golang-lru/.gitignore
new file mode 100644
index 000000000..836562412
--- /dev/null
+++ b/vendor/github.com/hashicorp/golang-lru/.gitignore
@@ -0,0 +1,23 @@
+# Compiled Object files, Static and Dynamic libs (Shared Objects)
+*.o
+*.a
+*.so
+
+# Folders
+_obj
+_test
+
+# Architecture specific extensions/prefixes
+*.[568vq]
+[568vq].out
+
+*.cgo1.go
+*.cgo2.c
+_cgo_defun.c
+_cgo_gotypes.go
+_cgo_export.*
+
+_testmain.go
+
+*.exe
+*.test
diff --git a/vendor/github.com/hashicorp/golang-lru/2q.go b/vendor/github.com/hashicorp/golang-lru/2q.go
new file mode 100644
index 000000000..337d96329
--- /dev/null
+++ b/vendor/github.com/hashicorp/golang-lru/2q.go
@@ -0,0 +1,212 @@
+package lru
+
+import (
+ "fmt"
+ "sync"
+
+ "github.com/hashicorp/golang-lru/simplelru"
+)
+
+const (
+ // Default2QRecentRatio is the ratio of the 2Q cache dedicated
+ // to recently added entries that have only been accessed once.
+ Default2QRecentRatio = 0.25
+
+ // Default2QGhostEntries is the default ratio of ghost
+ // entries kept to track entries recently evicted
+ Default2QGhostEntries = 0.50
+)
+
+// TwoQueueCache is a thread-safe fixed size 2Q cache.
+// 2Q is an enhancement over the standard LRU cache
+// in that it tracks both frequently and recently used
+// entries separately. This avoids a burst in access to new
+// entries from evicting frequently used entries. It adds some
+// additional tracking overhead to the standard LRU cache, and is
+// computationally about 2x the cost, and adds some metadata over
+// head. The ARCCache is similar, but does not require setting any
+// parameters.
+type TwoQueueCache struct {
+ size int
+ recentSize int
+
+ recent *simplelru.LRU
+ frequent *simplelru.LRU
+ recentEvict *simplelru.LRU
+ lock sync.RWMutex
+}
+
+// New2Q creates a new TwoQueueCache using the default
+// values for the parameters.
+func New2Q(size int) (*TwoQueueCache, error) {
+ return New2QParams(size, Default2QRecentRatio, Default2QGhostEntries)
+}
+
+// New2QParams creates a new TwoQueueCache using the provided
+// parameter values.
+func New2QParams(size int, recentRatio float64, ghostRatio float64) (*TwoQueueCache, error) {
+ if size <= 0 {
+ return nil, fmt.Errorf("invalid size")
+ }
+ if recentRatio < 0.0 || recentRatio > 1.0 {
+ return nil, fmt.Errorf("invalid recent ratio")
+ }
+ if ghostRatio < 0.0 || ghostRatio > 1.0 {
+ return nil, fmt.Errorf("invalid ghost ratio")
+ }
+
+ // Determine the sub-sizes
+ recentSize := int(float64(size) * recentRatio)
+ evictSize := int(float64(size) * ghostRatio)
+
+ // Allocate the LRUs
+ recent, err := simplelru.NewLRU(size, nil)
+ if err != nil {
+ return nil, err
+ }
+ frequent, err := simplelru.NewLRU(size, nil)
+ if err != nil {
+ return nil, err
+ }
+ recentEvict, err := simplelru.NewLRU(evictSize, nil)
+ if err != nil {
+ return nil, err
+ }
+
+ // Initialize the cache
+ c := &TwoQueueCache{
+ size: size,
+ recentSize: recentSize,
+ recent: recent,
+ frequent: frequent,
+ recentEvict: recentEvict,
+ }
+ return c, nil
+}
+
+func (c *TwoQueueCache) Get(key interface{}) (interface{}, bool) {
+ c.lock.Lock()
+ defer c.lock.Unlock()
+
+ // Check if this is a frequent value
+ if val, ok := c.frequent.Get(key); ok {
+ return val, ok
+ }
+
+ // If the value is contained in recent, then we
+ // promote it to frequent
+ if val, ok := c.recent.Peek(key); ok {
+ c.recent.Remove(key)
+ c.frequent.Add(key, val)
+ return val, ok
+ }
+
+ // No hit
+ return nil, false
+}
+
+func (c *TwoQueueCache) Add(key, value interface{}) {
+ c.lock.Lock()
+ defer c.lock.Unlock()
+
+ // Check if the value is frequently used already,
+ // and just update the value
+ if c.frequent.Contains(key) {
+ c.frequent.Add(key, value)
+ return
+ }
+
+ // Check if the value is recently used, and promote
+ // the value into the frequent list
+ if c.recent.Contains(key) {
+ c.recent.Remove(key)
+ c.frequent.Add(key, value)
+ return
+ }
+
+ // If the value was recently evicted, add it to the
+ // frequently used list
+ if c.recentEvict.Contains(key) {
+ c.ensureSpace(true)
+ c.recentEvict.Remove(key)
+ c.frequent.Add(key, value)
+ return
+ }
+
+ // Add to the recently seen list
+ c.ensureSpace(false)
+ c.recent.Add(key, value)
+ return
+}
+
+// ensureSpace is used to ensure we have space in the cache
+func (c *TwoQueueCache) ensureSpace(recentEvict bool) {
+ // If we have space, nothing to do
+ recentLen := c.recent.Len()
+ freqLen := c.frequent.Len()
+ if recentLen+freqLen < c.size {
+ return
+ }
+
+ // If the recent buffer is larger than
+ // the target, evict from there
+ if recentLen > 0 && (recentLen > c.recentSize || (recentLen == c.recentSize && !recentEvict)) {
+ k, _, _ := c.recent.RemoveOldest()
+ c.recentEvict.Add(k, nil)
+ return
+ }
+
+ // Remove from the frequent list otherwise
+ c.frequent.RemoveOldest()
+}
+
+func (c *TwoQueueCache) Len() int {
+ c.lock.RLock()
+ defer c.lock.RUnlock()
+ return c.recent.Len() + c.frequent.Len()
+}
+
+func (c *TwoQueueCache) Keys() []interface{} {
+ c.lock.RLock()
+ defer c.lock.RUnlock()
+ k1 := c.frequent.Keys()
+ k2 := c.recent.Keys()
+ return append(k1, k2...)
+}
+
+func (c *TwoQueueCache) Remove(key interface{}) {
+ c.lock.Lock()
+ defer c.lock.Unlock()
+ if c.frequent.Remove(key) {
+ return
+ }
+ if c.recent.Remove(key) {
+ return
+ }
+ if c.recentEvict.Remove(key) {
+ return
+ }
+}
+
+func (c *TwoQueueCache) Purge() {
+ c.lock.Lock()
+ defer c.lock.Unlock()
+ c.recent.Purge()
+ c.frequent.Purge()
+ c.recentEvict.Purge()
+}
+
+func (c *TwoQueueCache) Contains(key interface{}) bool {
+ c.lock.RLock()
+ defer c.lock.RUnlock()
+ return c.frequent.Contains(key) || c.recent.Contains(key)
+}
+
+func (c *TwoQueueCache) Peek(key interface{}) (interface{}, bool) {
+ c.lock.RLock()
+ defer c.lock.RUnlock()
+ if val, ok := c.frequent.Peek(key); ok {
+ return val, ok
+ }
+ return c.recent.Peek(key)
+}
diff --git a/vendor/github.com/hashicorp/golang-lru/2q_test.go b/vendor/github.com/hashicorp/golang-lru/2q_test.go
new file mode 100644
index 000000000..1b0f35181
--- /dev/null
+++ b/vendor/github.com/hashicorp/golang-lru/2q_test.go
@@ -0,0 +1,306 @@
+package lru
+
+import (
+ "math/rand"
+ "testing"
+)
+
+func Benchmark2Q_Rand(b *testing.B) {
+ l, err := New2Q(8192)
+ if err != nil {
+ b.Fatalf("err: %v", err)
+ }
+
+ trace := make([]int64, b.N*2)
+ for i := 0; i < b.N*2; i++ {
+ trace[i] = rand.Int63() % 32768
+ }
+
+ b.ResetTimer()
+
+ var hit, miss int
+ for i := 0; i < 2*b.N; i++ {
+ if i%2 == 0 {
+ l.Add(trace[i], trace[i])
+ } else {
+ _, ok := l.Get(trace[i])
+ if ok {
+ hit++
+ } else {
+ miss++
+ }
+ }
+ }
+ b.Logf("hit: %d miss: %d ratio: %f", hit, miss, float64(hit)/float64(miss))
+}
+
+func Benchmark2Q_Freq(b *testing.B) {
+ l, err := New2Q(8192)
+ if err != nil {
+ b.Fatalf("err: %v", err)
+ }
+
+ trace := make([]int64, b.N*2)
+ for i := 0; i < b.N*2; i++ {
+ if i%2 == 0 {
+ trace[i] = rand.Int63() % 16384
+ } else {
+ trace[i] = rand.Int63() % 32768
+ }
+ }
+
+ b.ResetTimer()
+
+ for i := 0; i < b.N; i++ {
+ l.Add(trace[i], trace[i])
+ }
+ var hit, miss int
+ for i := 0; i < b.N; i++ {
+ _, ok := l.Get(trace[i])
+ if ok {
+ hit++
+ } else {
+ miss++
+ }
+ }
+ b.Logf("hit: %d miss: %d ratio: %f", hit, miss, float64(hit)/float64(miss))
+}
+
+func Test2Q_RandomOps(t *testing.T) {
+ size := 128
+ l, err := New2Q(128)
+ if err != nil {
+ t.Fatalf("err: %v", err)
+ }
+
+ n := 200000
+ for i := 0; i < n; i++ {
+ key := rand.Int63() % 512
+ r := rand.Int63()
+ switch r % 3 {
+ case 0:
+ l.Add(key, key)
+ case 1:
+ l.Get(key)
+ case 2:
+ l.Remove(key)
+ }
+
+ if l.recent.Len()+l.frequent.Len() > size {
+ t.Fatalf("bad: recent: %d freq: %d",
+ l.recent.Len(), l.frequent.Len())
+ }
+ }
+}
+
+func Test2Q_Get_RecentToFrequent(t *testing.T) {
+ l, err := New2Q(128)
+ if err != nil {
+ t.Fatalf("err: %v", err)
+ }
+
+ // Touch all the entries, should be in t1
+ for i := 0; i < 128; i++ {
+ l.Add(i, i)
+ }
+ if n := l.recent.Len(); n != 128 {
+ t.Fatalf("bad: %d", n)
+ }
+ if n := l.frequent.Len(); n != 0 {
+ t.Fatalf("bad: %d", n)
+ }
+
+ // Get should upgrade to t2
+ for i := 0; i < 128; i++ {
+ _, ok := l.Get(i)
+ if !ok {
+ t.Fatalf("missing: %d", i)
+ }
+ }
+ if n := l.recent.Len(); n != 0 {
+ t.Fatalf("bad: %d", n)
+ }
+ if n := l.frequent.Len(); n != 128 {
+ t.Fatalf("bad: %d", n)
+ }
+
+ // Get be from t2
+ for i := 0; i < 128; i++ {
+ _, ok := l.Get(i)
+ if !ok {
+ t.Fatalf("missing: %d", i)
+ }
+ }
+ if n := l.recent.Len(); n != 0 {
+ t.Fatalf("bad: %d", n)
+ }
+ if n := l.frequent.Len(); n != 128 {
+ t.Fatalf("bad: %d", n)
+ }
+}
+
+func Test2Q_Add_RecentToFrequent(t *testing.T) {
+ l, err := New2Q(128)
+ if err != nil {
+ t.Fatalf("err: %v", err)
+ }
+
+ // Add initially to recent
+ l.Add(1, 1)
+ if n := l.recent.Len(); n != 1 {
+ t.Fatalf("bad: %d", n)
+ }
+ if n := l.frequent.Len(); n != 0 {
+ t.Fatalf("bad: %d", n)
+ }
+
+ // Add should upgrade to frequent
+ l.Add(1, 1)
+ if n := l.recent.Len(); n != 0 {
+ t.Fatalf("bad: %d", n)
+ }
+ if n := l.frequent.Len(); n != 1 {
+ t.Fatalf("bad: %d", n)
+ }
+
+ // Add should remain in frequent
+ l.Add(1, 1)
+ if n := l.recent.Len(); n != 0 {
+ t.Fatalf("bad: %d", n)
+ }
+ if n := l.frequent.Len(); n != 1 {
+ t.Fatalf("bad: %d", n)
+ }
+}
+
+func Test2Q_Add_RecentEvict(t *testing.T) {
+ l, err := New2Q(4)
+ if err != nil {
+ t.Fatalf("err: %v", err)
+ }
+
+ // Add 1,2,3,4,5 -> Evict 1
+ l.Add(1, 1)
+ l.Add(2, 2)
+ l.Add(3, 3)
+ l.Add(4, 4)
+ l.Add(5, 5)
+ if n := l.recent.Len(); n != 4 {
+ t.Fatalf("bad: %d", n)
+ }
+ if n := l.recentEvict.Len(); n != 1 {
+ t.Fatalf("bad: %d", n)
+ }
+ if n := l.frequent.Len(); n != 0 {
+ t.Fatalf("bad: %d", n)
+ }
+
+ // Pull in the recently evicted
+ l.Add(1, 1)
+ if n := l.recent.Len(); n != 3 {
+ t.Fatalf("bad: %d", n)
+ }
+ if n := l.recentEvict.Len(); n != 1 {
+ t.Fatalf("bad: %d", n)
+ }
+ if n := l.frequent.Len(); n != 1 {
+ t.Fatalf("bad: %d", n)
+ }
+
+ // Add 6, should cause another recent evict
+ l.Add(6, 6)
+ if n := l.recent.Len(); n != 3 {
+ t.Fatalf("bad: %d", n)
+ }
+ if n := l.recentEvict.Len(); n != 2 {
+ t.Fatalf("bad: %d", n)
+ }
+ if n := l.frequent.Len(); n != 1 {
+ t.Fatalf("bad: %d", n)
+ }
+}
+
+func Test2Q(t *testing.T) {
+ l, err := New2Q(128)
+ if err != nil {
+ t.Fatalf("err: %v", err)
+ }
+
+ for i := 0; i < 256; i++ {
+ l.Add(i, i)
+ }
+ if l.Len() != 128 {
+ t.Fatalf("bad len: %v", l.Len())
+ }
+
+ for i, k := range l.Keys() {
+ if v, ok := l.Get(k); !ok || v != k || v != i+128 {
+ t.Fatalf("bad key: %v", k)
+ }
+ }
+ for i := 0; i < 128; i++ {
+ _, ok := l.Get(i)
+ if ok {
+ t.Fatalf("should be evicted")
+ }
+ }
+ for i := 128; i < 256; i++ {
+ _, ok := l.Get(i)
+ if !ok {
+ t.Fatalf("should not be evicted")
+ }
+ }
+ for i := 128; i < 192; i++ {
+ l.Remove(i)
+ _, ok := l.Get(i)
+ if ok {
+ t.Fatalf("should be deleted")
+ }
+ }
+
+ l.Purge()
+ if l.Len() != 0 {
+ t.Fatalf("bad len: %v", l.Len())
+ }
+ if _, ok := l.Get(200); ok {
+ t.Fatalf("should contain nothing")
+ }
+}
+
+// Test that Contains doesn't update recent-ness
+func Test2Q_Contains(t *testing.T) {
+ l, err := New2Q(2)
+ if err != nil {
+ t.Fatalf("err: %v", err)
+ }
+
+ l.Add(1, 1)
+ l.Add(2, 2)
+ if !l.Contains(1) {
+ t.Errorf("1 should be contained")
+ }
+
+ l.Add(3, 3)
+ if l.Contains(1) {
+ t.Errorf("Contains should not have updated recent-ness of 1")
+ }
+}
+
+// Test that Peek doesn't update recent-ness
+func Test2Q_Peek(t *testing.T) {
+ l, err := New2Q(2)
+ if err != nil {
+ t.Fatalf("err: %v", err)
+ }
+
+ l.Add(1, 1)
+ l.Add(2, 2)
+ if v, ok := l.Peek(1); !ok || v != 1 {
+ t.Errorf("1 should be set to 1: %v, %v", v, ok)
+ }
+
+ l.Add(3, 3)
+ if l.Contains(1) {
+ t.Errorf("should not have updated recent-ness of 1")
+ }
+}
diff --git a/vendor/github.com/hashicorp/golang-lru/LICENSE b/vendor/github.com/hashicorp/golang-lru/LICENSE
new file mode 100644
index 000000000..be2cc4dfb
--- /dev/null
+++ b/vendor/github.com/hashicorp/golang-lru/LICENSE
@@ -0,0 +1,362 @@
+Mozilla Public License, version 2.0
+
+1. Definitions
+
+1.1. "Contributor"
+
+ means each individual or legal entity that creates, contributes to the
+ creation of, or owns Covered Software.
+
+1.2. "Contributor Version"
+
+ means the combination of the Contributions of others (if any) used by a
+ Contributor and that particular Contributor's Contribution.
+
+1.3. "Contribution"
+
+ means Covered Software of a particular Contributor.
+
+1.4. "Covered Software"
+
+ means Source Code Form to which the initial Contributor has attached the
+ notice in Exhibit A, the Executable Form of such Source Code Form, and
+ Modifications of such Source Code Form, in each case including portions
+ thereof.
+
+1.5. "Incompatible With Secondary Licenses"
+ means
+
+ a. that the initial Contributor has attached the notice described in
+ Exhibit B to the Covered Software; or
+
+ b. that the Covered Software was made available under the terms of
+ version 1.1 or earlier of the License, but not also under the terms of
+ a Secondary License.
+
+1.6. "Executable Form"
+
+ means any form of the work other than Source Code Form.
+
+1.7. "Larger Work"
+
+ means a work that combines Covered Software with other material, in a
+ separate file or files, that is not Covered Software.
+
+1.8. "License"
+
+ means this document.
+
+1.9. "Licensable"
+
+ means having the right to grant, to the maximum extent possible, whether
+ at the time of the initial grant or subsequently, any and all of the
+ rights conveyed by this License.
+
+1.10. "Modifications"
+
+ means any of the following:
+
+ a. any file in Source Code Form that results from an addition to,
+ deletion from, or modification of the contents of Covered Software; or
+
+ b. any new file in Source Code Form that contains any Covered Software.
+
+1.11. "Patent Claims" of a Contributor
+
+ means any patent claim(s), including without limitation, method,
+ process, and apparatus claims, in any patent Licensable by such
+ Contributor that would be infringed, but for the grant of the License,
+ by the making, using, selling, offering for sale, having made, import,
+ or transfer of either its Contributions or its Contributor Version.
+
+1.12. "Secondary License"
+
+ means either the GNU General Public License, Version 2.0, the GNU Lesser
+ General Public License, Version 2.1, the GNU Affero General Public
+ License, Version 3.0, or any later versions of those licenses.
+
+1.13. "Source Code Form"
+
+ means the form of the work preferred for making modifications.
+
+1.14. "You" (or "Your")
+
+ means an individual or a legal entity exercising rights under this
+ License. For legal entities, "You" includes any entity that controls, is
+ controlled by, or is under common control with You. For purposes of this
+ definition, "control" means (a) the power, direct or indirect, to cause
+ the direction or management of such entity, whether by contract or
+ otherwise, or (b) ownership of more than fifty percent (50%) of the
+ outstanding shares or beneficial ownership of such entity.
+
+
+2. License Grants and Conditions
+
+2.1. Grants
+
+ Each Contributor hereby grants You a world-wide, royalty-free,
+ non-exclusive license:
+
+ a. under intellectual property rights (other than patent or trademark)
+ Licensable by such Contributor to use, reproduce, make available,
+ modify, display, perform, distribute, and otherwise exploit its
+ Contributions, either on an unmodified basis, with Modifications, or
+ as part of a Larger Work; and
+
+ b. under Patent Claims of such Contributor to make, use, sell, offer for
+ sale, have made, import, and otherwise transfer either its
+ Contributions or its Contributor Version.
+
+2.2. Effective Date
+
+ The licenses granted in Section 2.1 with respect to any Contribution
+ become effective for each Contribution on the date the Contributor first
+ distributes such Contribution.
+
+2.3. Limitations on Grant Scope
+
+ The licenses granted in this Section 2 are the only rights granted under
+ this License. No additional rights or licenses will be implied from the
+ distribution or licensing of Covered Software under this License.
+ Notwithstanding Section 2.1(b) above, no patent license is granted by a
+ Contributor:
+
+ a. for any code that a Contributor has removed from Covered Software; or
+
+ b. for infringements caused by: (i) Your and any other third party's
+ modifications of Covered Software, or (ii) the combination of its
+ Contributions with other software (except as part of its Contributor
+ Version); or
+
+ c. under Patent Claims infringed by Covered Software in the absence of
+ its Contributions.
+
+ This License does not grant any rights in the trademarks, service marks,
+ or logos of any Contributor (except as may be necessary to comply with
+ the notice requirements in Section 3.4).
+
+2.4. Subsequent Licenses
+
+ No Contributor makes additional grants as a result of Your choice to
+ distribute the Covered Software under a subsequent version of this
+ License (see Section 10.2) or under the terms of a Secondary License (if
+ permitted under the terms of Section 3.3).
+
+2.5. Representation
+
+ Each Contributor represents that the Contributor believes its
+ Contributions are its original creation(s) or it has sufficient rights to
+ grant the rights to its Contributions conveyed by this License.
+
+2.6. Fair Use
+
+ This License is not intended to limit any rights You have under
+ applicable copyright doctrines of fair use, fair dealing, or other
+ equivalents.
+
+2.7. Conditions
+
+ Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in
+ Section 2.1.
+
+
+3. Responsibilities
+
+3.1. Distribution of Source Form
+
+ All distribution of Covered Software in Source Code Form, including any
+ Modifications that You create or to which You contribute, must be under
+ the terms of this License. You must inform recipients that the Source
+ Code Form of the Covered Software is governed by the terms of this
+ License, and how they can obtain a copy of this License. You may not
+ attempt to alter or restrict the recipients' rights in the Source Code
+ Form.
+
+3.2. Distribution of Executable Form
+
+ If You distribute Covered Software in Executable Form then:
+
+ a. such Covered Software must also be made available in Source Code Form,
+ as described in Section 3.1, and You must inform recipients of the
+ Executable Form how they can obtain a copy of such Source Code Form by
+ reasonable means in a timely manner, at a charge no more than the cost
+ of distribution to the recipient; and
+
+ b. You may distribute such Executable Form under the terms of this
+ License, or sublicense it under different terms, provided that the
+ license for the Executable Form does not attempt to limit or alter the
+ recipients' rights in the Source Code Form under this License.
+
+3.3. Distribution of a Larger Work
+
+ You may create and distribute a Larger Work under terms of Your choice,
+ provided that You also comply with the requirements of this License for
+ the Covered Software. If the Larger Work is a combination of Covered
+ Software with a work governed by one or more Secondary Licenses, and the
+ Covered Software is not Incompatible With Secondary Licenses, this
+ License permits You to additionally distribute such Covered Software
+ under the terms of such Secondary License(s), so that the recipient of
+ the Larger Work may, at their option, further distribute the Covered
+ Software under the terms of either this License or such Secondary
+ License(s).
+
+3.4. Notices
+
+ You may not remove or alter the substance of any license notices
+ (including copyright notices, patent notices, disclaimers of warranty, or
+ limitations of liability) contained within the Source Code Form of the
+ Covered Software, except that You may alter any license notices to the
+ extent required to remedy known factual inaccuracies.
+
+3.5. Application of Additional Terms
+
+ You may choose to offer, and to charge a fee for, warranty, support,
+ indemnity or liability obligations to one or more recipients of Covered
+ Software. However, You may do so only on Your own behalf, and not on
+ behalf of any Contributor. You must make it absolutely clear that any
+ such warranty, support, indemnity, or liability obligation is offered by
+ You alone, and You hereby agree to indemnify every Contributor for any
+ liability incurred by such Contributor as a result of warranty, support,
+ indemnity or liability terms You offer. You may include additional
+ disclaimers of warranty and limitations of liability specific to any
+ jurisdiction.
+
+4. Inability to Comply Due to Statute or Regulation
+
+ If it is impossible for You to comply with any of the terms of this License
+ with respect to some or all of the Covered Software due to statute,
+ judicial order, or regulation then You must: (a) comply with the terms of
+ this License to the maximum extent possible; and (b) describe the
+ limitations and the code they affect. Such description must be placed in a
+ text file included with all distributions of the Covered Software under
+ this License. Except to the extent prohibited by statute or regulation,
+ such description must be sufficiently detailed for a recipient of ordinary
+ skill to be able to understand it.
+
+5. Termination
+
+5.1. The rights granted under this License will terminate automatically if You
+ fail to comply with any of its terms. However, if You become compliant,
+ then the rights granted under this License from a particular Contributor
+ are reinstated (a) provisionally, unless and until such Contributor
+ explicitly and finally terminates Your grants, and (b) on an ongoing
+ basis, if such Contributor fails to notify You of the non-compliance by
+ some reasonable means prior to 60 days after You have come back into
+ compliance. Moreover, Your grants from a particular Contributor are
+ reinstated on an ongoing basis if such Contributor notifies You of the
+ non-compliance by some reasonable means, this is the first time You have
+ received notice of non-compliance with this License from such
+ Contributor, and You become compliant prior to 30 days after Your receipt
+ of the notice.
+
+5.2. If You initiate litigation against any entity by asserting a patent
+ infringement claim (excluding declaratory judgment actions,
+ counter-claims, and cross-claims) alleging that a Contributor Version
+ directly or indirectly infringes any patent, then the rights granted to
+ You by any and all Contributors for the Covered Software under Section
+ 2.1 of this License shall terminate.
+
+5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user
+ license agreements (excluding distributors and resellers) which have been
+ validly granted by You or Your distributors under this License prior to
+ termination shall survive termination.
+
+6. Disclaimer of Warranty
+
+ Covered Software is provided under this License on an "as is" basis,
+ without warranty of any kind, either expressed, implied, or statutory,
+ including, without limitation, warranties that the Covered Software is free
+ of defects, merchantable, fit for a particular purpose or non-infringing.
+ The entire risk as to the quality and performance of the Covered Software
+ is with You. Should any Covered Software prove defective in any respect,
+ You (not any Contributor) assume the cost of any necessary servicing,
+ repair, or correction. This disclaimer of warranty constitutes an essential
+ part of this License. No use of any Covered Software is authorized under
+ this License except under this disclaimer.
+
+7. Limitation of Liability
+
+ Under no circumstances and under no legal theory, whether tort (including
+ negligence), contract, or otherwise, shall any Contributor, or anyone who
+ distributes Covered Software as permitted above, be liable to You for any
+ direct, indirect, special, incidental, or consequential damages of any
+ character including, without limitation, damages for lost profits, loss of
+ goodwill, work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses, even if such party shall have been
+ informed of the possibility of such damages. This limitation of liability
+ shall not apply to liability for death or personal injury resulting from
+ such party's negligence to the extent applicable law prohibits such
+ limitation. Some jurisdictions do not allow the exclusion or limitation of
+ incidental or consequential damages, so this exclusion and limitation may
+ not apply to You.
+
+8. Litigation
+
+ Any litigation relating to this License may be brought only in the courts
+ of a jurisdiction where the defendant maintains its principal place of
+ business and such litigation shall be governed by laws of that
+ jurisdiction, without reference to its conflict-of-law provisions. Nothing
+ in this Section shall prevent a party's ability to bring cross-claims or
+ counter-claims.
+
+9. Miscellaneous
+
+ This License represents the complete agreement concerning the subject
+ matter hereof. If any provision of this License is held to be
+ unenforceable, such provision shall be reformed only to the extent
+ necessary to make it enforceable. Any law or regulation which provides that
+ the language of a contract shall be construed against the drafter shall not
+ be used to construe this License against a Contributor.
+
+
+10. Versions of the License
+
+10.1. New Versions
+
+ Mozilla Foundation is the license steward. Except as provided in Section
+ 10.3, no one other than the license steward has the right to modify or
+ publish new versions of this License. Each version will be given a
+ distinguishing version number.
+
+10.2. Effect of New Versions
+
+ You may distribute the Covered Software under the terms of the version
+ of the License under which You originally received the Covered Software,
+ or under the terms of any subsequent version published by the license
+ steward.
+
+10.3. Modified Versions
+
+ If you create software not governed by this License, and you want to
+ create a new license for such software, you may create and use a
+ modified version of this License if you rename the license and remove
+ any references to the name of the license steward (except to note that
+ such modified license differs from this License).
+
+10.4. Distributing Source Code Form that is Incompatible With Secondary
+ Licenses If You choose to distribute Source Code Form that is
+ Incompatible With Secondary Licenses under the terms of this version of
+ the License, the notice described in Exhibit B of this License must be
+ attached.
+
+Exhibit A - Source Code Form License Notice
+
+ This Source Code Form is subject to the
+ terms of the Mozilla Public License, v.
+ 2.0. If a copy of the MPL was not
+ distributed with this file, You can
+ obtain one at
+ http://mozilla.org/MPL/2.0/.
+
+If it is not possible or desirable to put the notice in a particular file,
+then You may include the notice in a location (such as a LICENSE file in a
+relevant directory) where a recipient would be likely to look for such a
+notice.
+
+You may add additional accurate notices of copyright ownership.
+
+Exhibit B - "Incompatible With Secondary Licenses" Notice
+
+ This Source Code Form is "Incompatible
+ With Secondary Licenses", as defined by
+ the Mozilla Public License, v. 2.0.
diff --git a/vendor/github.com/hashicorp/golang-lru/README.md b/vendor/github.com/hashicorp/golang-lru/README.md
new file mode 100644
index 000000000..33e58cfaf
--- /dev/null
+++ b/vendor/github.com/hashicorp/golang-lru/README.md
@@ -0,0 +1,25 @@
+golang-lru
+==========
+
+This provides the `lru` package which implements a fixed-size
+thread safe LRU cache. It is based on the cache in Groupcache.
+
+Documentation
+=============
+
+Full docs are available on [Godoc](http://godoc.org/github.com/hashicorp/golang-lru)
+
+Example
+=======
+
+Using the LRU is very simple:
+
+```go
+l, _ := New(128)
+for i := 0; i < 256; i++ {
+ l.Add(i, nil)
+}
+if l.Len() != 128 {
+ panic(fmt.Sprintf("bad len: %v", l.Len()))
+}
+```
diff --git a/vendor/github.com/hashicorp/golang-lru/arc.go b/vendor/github.com/hashicorp/golang-lru/arc.go
new file mode 100644
index 000000000..a2a252817
--- /dev/null
+++ b/vendor/github.com/hashicorp/golang-lru/arc.go
@@ -0,0 +1,257 @@
+package lru
+
+import (
+ "sync"
+
+ "github.com/hashicorp/golang-lru/simplelru"
+)
+
+// ARCCache is a thread-safe fixed size Adaptive Replacement Cache (ARC).
+// ARC is an enhancement over the standard LRU cache in that tracks both
+// frequency and recency of use. This avoids a burst in access to new
+// entries from evicting the frequently used older entries. It adds some
+// additional tracking overhead to a standard LRU cache, computationally
+// it is roughly 2x the cost, and the extra memory overhead is linear
+// with the size of the cache. ARC has been patented by IBM, but is
+// similar to the TwoQueueCache (2Q) which requires setting parameters.
+type ARCCache struct {
+ size int // Size is the total capacity of the cache
+ p int // P is the dynamic preference towards T1 or T2
+
+ t1 *simplelru.LRU // T1 is the LRU for recently accessed items
+ b1 *simplelru.LRU // B1 is the LRU for evictions from t1
+
+ t2 *simplelru.LRU // T2 is the LRU for frequently accessed items
+ b2 *simplelru.LRU // B2 is the LRU for evictions from t2
+
+ lock sync.RWMutex
+}
+
+// NewARC creates an ARC of the given size
+func NewARC(size int) (*ARCCache, error) {
+ // Create the sub LRUs
+ b1, err := simplelru.NewLRU(size, nil)
+ if err != nil {
+ return nil, err
+ }
+ b2, err := simplelru.NewLRU(size, nil)
+ if err != nil {
+ return nil, err
+ }
+ t1, err := simplelru.NewLRU(size, nil)
+ if err != nil {
+ return nil, err
+ }
+ t2, err := simplelru.NewLRU(size, nil)
+ if err != nil {
+ return nil, err
+ }
+
+ // Initialize the ARC
+ c := &ARCCache{
+ size: size,
+ p: 0,
+ t1: t1,
+ b1: b1,
+ t2: t2,
+ b2: b2,
+ }
+ return c, nil
+}
+
+// Get looks up a key's value from the cache.
+func (c *ARCCache) Get(key interface{}) (interface{}, bool) {
+ c.lock.Lock()
+ defer c.lock.Unlock()
+
+ // Ff the value is contained in T1 (recent), then
+ // promote it to T2 (frequent)
+ if val, ok := c.t1.Peek(key); ok {
+ c.t1.Remove(key)
+ c.t2.Add(key, val)
+ return val, ok
+ }
+
+ // Check if the value is contained in T2 (frequent)
+ if val, ok := c.t2.Get(key); ok {
+ return val, ok
+ }
+
+ // No hit
+ return nil, false
+}
+
+// Add adds a value to the cache.
+func (c *ARCCache) Add(key, value interface{}) {
+ c.lock.Lock()
+ defer c.lock.Unlock()
+
+ // Check if the value is contained in T1 (recent), and potentially
+ // promote it to frequent T2
+ if c.t1.Contains(key) {
+ c.t1.Remove(key)
+ c.t2.Add(key, value)
+ return
+ }
+
+ // Check if the value is already in T2 (frequent) and update it
+ if c.t2.Contains(key) {
+ c.t2.Add(key, value)
+ return
+ }
+
+ // Check if this value was recently evicted as part of the
+ // recently used list
+ if c.b1.Contains(key) {
+ // T1 set is too small, increase P appropriately
+ delta := 1
+ b1Len := c.b1.Len()
+ b2Len := c.b2.Len()
+ if b2Len > b1Len {
+ delta = b2Len / b1Len
+ }
+ if c.p+delta >= c.size {
+ c.p = c.size
+ } else {
+ c.p += delta
+ }
+
+ // Potentially need to make room in the cache
+ if c.t1.Len()+c.t2.Len() >= c.size {
+ c.replace(false)
+ }
+
+ // Remove from B1
+ c.b1.Remove(key)
+
+ // Add the key to the frequently used list
+ c.t2.Add(key, value)
+ return
+ }
+
+ // Check if this value was recently evicted as part of the
+ // frequently used list
+ if c.b2.Contains(key) {
+ // T2 set is too small, decrease P appropriately
+ delta := 1
+ b1Len := c.b1.Len()
+ b2Len := c.b2.Len()
+ if b1Len > b2Len {
+ delta = b1Len / b2Len
+ }
+ if delta >= c.p {
+ c.p = 0
+ } else {
+ c.p -= delta
+ }
+
+ // Potentially need to make room in the cache
+ if c.t1.Len()+c.t2.Len() >= c.size {
+ c.replace(true)
+ }
+
+ // Remove from B2
+ c.b2.Remove(key)
+
+ // Add the key to the frequntly used list
+ c.t2.Add(key, value)
+ return
+ }
+
+ // Potentially need to make room in the cache
+ if c.t1.Len()+c.t2.Len() >= c.size {
+ c.replace(false)
+ }
+
+ // Keep the size of the ghost buffers trim
+ if c.b1.Len() > c.size-c.p {
+ c.b1.RemoveOldest()
+ }
+ if c.b2.Len() > c.p {
+ c.b2.RemoveOldest()
+ }
+
+ // Add to the recently seen list
+ c.t1.Add(key, value)
+ return
+}
+
+// replace is used to adaptively evict from either T1 or T2
+// based on the current learned value of P
+func (c *ARCCache) replace(b2ContainsKey bool) {
+ t1Len := c.t1.Len()
+ if t1Len > 0 && (t1Len > c.p || (t1Len == c.p && b2ContainsKey)) {
+ k, _, ok := c.t1.RemoveOldest()
+ if ok {
+ c.b1.Add(k, nil)
+ }
+ } else {
+ k, _, ok := c.t2.RemoveOldest()
+ if ok {
+ c.b2.Add(k, nil)
+ }
+ }
+}
+
+// Len returns the number of cached entries
+func (c *ARCCache) Len() int {
+ c.lock.RLock()
+ defer c.lock.RUnlock()
+ return c.t1.Len() + c.t2.Len()
+}
+
+// Keys returns all the cached keys
+func (c *ARCCache) Keys() []interface{} {
+ c.lock.RLock()
+ defer c.lock.RUnlock()
+ k1 := c.t1.Keys()
+ k2 := c.t2.Keys()
+ return append(k1, k2...)
+}
+
+// Remove is used to purge a key from the cache
+func (c *ARCCache) Remove(key interface{}) {
+ c.lock.Lock()
+ defer c.lock.Unlock()
+ if c.t1.Remove(key) {
+ return
+ }
+ if c.t2.Remove(key) {
+ return
+ }
+ if c.b1.Remove(key) {
+ return
+ }
+ if c.b2.Remove(key) {
+ return
+ }
+}
+
+// Purge is used to clear the cache
+func (c *ARCCache) Purge() {
+ c.lock.Lock()
+ defer c.lock.Unlock()
+ c.t1.Purge()
+ c.t2.Purge()
+ c.b1.Purge()
+ c.b2.Purge()
+}
+
+// Contains is used to check if the cache contains a key
+// without updating recency or frequency.
+func (c *ARCCache) Contains(key interface{}) bool {
+ c.lock.RLock()
+ defer c.lock.RUnlock()
+ return c.t1.Contains(key) || c.t2.Contains(key)
+}
+
+// Peek is used to inspect the cache value of a key
+// without updating recency or frequency.
+func (c *ARCCache) Peek(key interface{}) (interface{}, bool) {
+ c.lock.RLock()
+ defer c.lock.RUnlock()
+ if val, ok := c.t1.Peek(key); ok {
+ return val, ok
+ }
+ return c.t2.Peek(key)
+}
diff --git a/vendor/github.com/hashicorp/golang-lru/arc_test.go b/vendor/github.com/hashicorp/golang-lru/arc_test.go
new file mode 100644
index 000000000..e2d9b68c6
--- /dev/null
+++ b/vendor/github.com/hashicorp/golang-lru/arc_test.go
@@ -0,0 +1,377 @@
+package lru
+
+import (
+ "math/rand"
+ "testing"
+ "time"
+)
+
+func init() {
+ rand.Seed(time.Now().Unix())
+}
+
+func BenchmarkARC_Rand(b *testing.B) {
+ l, err := NewARC(8192)
+ if err != nil {
+ b.Fatalf("err: %v", err)
+ }
+
+ trace := make([]int64, b.N*2)
+ for i := 0; i < b.N*2; i++ {
+ trace[i] = rand.Int63() % 32768
+ }
+
+ b.ResetTimer()
+
+ var hit, miss int
+ for i := 0; i < 2*b.N; i++ {
+ if i%2 == 0 {
+ l.Add(trace[i], trace[i])
+ } else {
+ _, ok := l.Get(trace[i])
+ if ok {
+ hit++
+ } else {
+ miss++
+ }
+ }
+ }
+ b.Logf("hit: %d miss: %d ratio: %f", hit, miss, float64(hit)/float64(miss))
+}
+
+func BenchmarkARC_Freq(b *testing.B) {
+ l, err := NewARC(8192)
+ if err != nil {
+ b.Fatalf("err: %v", err)
+ }
+
+ trace := make([]int64, b.N*2)
+ for i := 0; i < b.N*2; i++ {
+ if i%2 == 0 {
+ trace[i] = rand.Int63() % 16384
+ } else {
+ trace[i] = rand.Int63() % 32768
+ }
+ }
+
+ b.ResetTimer()
+
+ for i := 0; i < b.N; i++ {
+ l.Add(trace[i], trace[i])
+ }
+ var hit, miss int
+ for i := 0; i < b.N; i++ {
+ _, ok := l.Get(trace[i])
+ if ok {
+ hit++
+ } else {
+ miss++
+ }
+ }
+ b.Logf("hit: %d miss: %d ratio: %f", hit, miss, float64(hit)/float64(miss))
+}
+
+func TestARC_RandomOps(t *testing.T) {
+ size := 128
+ l, err := NewARC(128)
+ if err != nil {
+ t.Fatalf("err: %v", err)
+ }
+
+ n := 200000
+ for i := 0; i < n; i++ {
+ key := rand.Int63() % 512
+ r := rand.Int63()
+ switch r % 3 {
+ case 0:
+ l.Add(key, key)
+ case 1:
+ l.Get(key)
+ case 2:
+ l.Remove(key)
+ }
+
+ if l.t1.Len()+l.t2.Len() > size {
+ t.Fatalf("bad: t1: %d t2: %d b1: %d b2: %d p: %d",
+ l.t1.Len(), l.t2.Len(), l.b1.Len(), l.b2.Len(), l.p)
+ }
+ if l.b1.Len()+l.b2.Len() > size {
+ t.Fatalf("bad: t1: %d t2: %d b1: %d b2: %d p: %d",
+ l.t1.Len(), l.t2.Len(), l.b1.Len(), l.b2.Len(), l.p)
+ }
+ }
+}
+
+func TestARC_Get_RecentToFrequent(t *testing.T) {
+ l, err := NewARC(128)
+ if err != nil {
+ t.Fatalf("err: %v", err)
+ }
+
+ // Touch all the entries, should be in t1
+ for i := 0; i < 128; i++ {
+ l.Add(i, i)
+ }
+ if n := l.t1.Len(); n != 128 {
+ t.Fatalf("bad: %d", n)
+ }
+ if n := l.t2.Len(); n != 0 {
+ t.Fatalf("bad: %d", n)
+ }
+
+ // Get should upgrade to t2
+ for i := 0; i < 128; i++ {
+ _, ok := l.Get(i)
+ if !ok {
+ t.Fatalf("missing: %d", i)
+ }
+ }
+ if n := l.t1.Len(); n != 0 {
+ t.Fatalf("bad: %d", n)
+ }
+ if n := l.t2.Len(); n != 128 {
+ t.Fatalf("bad: %d", n)
+ }
+
+ // Get be from t2
+ for i := 0; i < 128; i++ {
+ _, ok := l.Get(i)
+ if !ok {
+ t.Fatalf("missing: %d", i)
+ }
+ }
+ if n := l.t1.Len(); n != 0 {
+ t.Fatalf("bad: %d", n)
+ }
+ if n := l.t2.Len(); n != 128 {
+ t.Fatalf("bad: %d", n)
+ }
+}
+
+func TestARC_Add_RecentToFrequent(t *testing.T) {
+ l, err := NewARC(128)
+ if err != nil {
+ t.Fatalf("err: %v", err)
+ }
+
+ // Add initially to t1
+ l.Add(1, 1)
+ if n := l.t1.Len(); n != 1 {
+ t.Fatalf("bad: %d", n)
+ }
+ if n := l.t2.Len(); n != 0 {
+ t.Fatalf("bad: %d", n)
+ }
+
+ // Add should upgrade to t2
+ l.Add(1, 1)
+ if n := l.t1.Len(); n != 0 {
+ t.Fatalf("bad: %d", n)
+ }
+ if n := l.t2.Len(); n != 1 {
+ t.Fatalf("bad: %d", n)
+ }
+
+ // Add should remain in t2
+ l.Add(1, 1)
+ if n := l.t1.Len(); n != 0 {
+ t.Fatalf("bad: %d", n)
+ }
+ if n := l.t2.Len(); n != 1 {
+ t.Fatalf("bad: %d", n)
+ }
+}
+
+func TestARC_Adaptive(t *testing.T) {
+ l, err := NewARC(4)
+ if err != nil {
+ t.Fatalf("err: %v", err)
+ }
+
+ // Fill t1
+ for i := 0; i < 4; i++ {
+ l.Add(i, i)
+ }
+ if n := l.t1.Len(); n != 4 {
+ t.Fatalf("bad: %d", n)
+ }
+
+ // Move to t2
+ l.Get(0)
+ l.Get(1)
+ if n := l.t2.Len(); n != 2 {
+ t.Fatalf("bad: %d", n)
+ }
+
+ // Evict from t1
+ l.Add(4, 4)
+ if n := l.b1.Len(); n != 1 {
+ t.Fatalf("bad: %d", n)
+ }
+
+ // Current state
+ // t1 : (MRU) [4, 3] (LRU)
+ // t2 : (MRU) [1, 0] (LRU)
+ // b1 : (MRU) [2] (LRU)
+ // b2 : (MRU) [] (LRU)
+
+ // Add 2, should cause hit on b1
+ l.Add(2, 2)
+ if n := l.b1.Len(); n != 1 {
+ t.Fatalf("bad: %d", n)
+ }
+ if l.p != 1 {
+ t.Fatalf("bad: %d", l.p)
+ }
+ if n := l.t2.Len(); n != 3 {
+ t.Fatalf("bad: %d", n)
+ }
+
+ // Current state
+ // t1 : (MRU) [4] (LRU)
+ // t2 : (MRU) [2, 1, 0] (LRU)
+ // b1 : (MRU) [3] (LRU)
+ // b2 : (MRU) [] (LRU)
+
+ // Add 4, should migrate to t2
+ l.Add(4, 4)
+ if n := l.t1.Len(); n != 0 {
+ t.Fatalf("bad: %d", n)
+ }
+ if n := l.t2.Len(); n != 4 {
+ t.Fatalf("bad: %d", n)
+ }
+
+ // Current state
+ // t1 : (MRU) [] (LRU)
+ // t2 : (MRU) [4, 2, 1, 0] (LRU)
+ // b1 : (MRU) [3] (LRU)
+ // b2 : (MRU) [] (LRU)
+
+ // Add 4, should evict to b2
+ l.Add(5, 5)
+ if n := l.t1.Len(); n != 1 {
+ t.Fatalf("bad: %d", n)
+ }
+ if n := l.t2.Len(); n != 3 {
+ t.Fatalf("bad: %d", n)
+ }
+ if n := l.b2.Len(); n != 1 {
+ t.Fatalf("bad: %d", n)
+ }
+
+ // Current state
+ // t1 : (MRU) [5] (LRU)
+ // t2 : (MRU) [4, 2, 1] (LRU)
+ // b1 : (MRU) [3] (LRU)
+ // b2 : (MRU) [0] (LRU)
+
+ // Add 0, should decrease p
+ l.Add(0, 0)
+ if n := l.t1.Len(); n != 0 {
+ t.Fatalf("bad: %d", n)
+ }
+ if n := l.t2.Len(); n != 4 {
+ t.Fatalf("bad: %d", n)
+ }
+ if n := l.b1.Len(); n != 2 {
+ t.Fatalf("bad: %d", n)
+ }
+ if n := l.b2.Len(); n != 0 {
+ t.Fatalf("bad: %d", n)
+ }
+ if l.p != 0 {
+ t.Fatalf("bad: %d", l.p)
+ }
+
+ // Current state
+ // t1 : (MRU) [] (LRU)
+ // t2 : (MRU) [0, 4, 2, 1] (LRU)
+ // b1 : (MRU) [5, 3] (LRU)
+ // b2 : (MRU) [0] (LRU)
+}
+
+func TestARC(t *testing.T) {
+ l, err := NewARC(128)
+ if err != nil {
+ t.Fatalf("err: %v", err)
+ }
+
+ for i := 0; i < 256; i++ {
+ l.Add(i, i)
+ }
+ if l.Len() != 128 {
+ t.Fatalf("bad len: %v", l.Len())
+ }
+
+ for i, k := range l.Keys() {
+ if v, ok := l.Get(k); !ok || v != k || v != i+128 {
+ t.Fatalf("bad key: %v", k)
+ }
+ }
+ for i := 0; i < 128; i++ {
+ _, ok := l.Get(i)
+ if ok {
+ t.Fatalf("should be evicted")
+ }
+ }
+ for i := 128; i < 256; i++ {
+ _, ok := l.Get(i)
+ if !ok {
+ t.Fatalf("should not be evicted")
+ }
+ }
+ for i := 128; i < 192; i++ {
+ l.Remove(i)
+ _, ok := l.Get(i)
+ if ok {
+ t.Fatalf("should be deleted")
+ }
+ }
+
+ l.Purge()
+ if l.Len() != 0 {
+ t.Fatalf("bad len: %v", l.Len())
+ }
+ if _, ok := l.Get(200); ok {
+ t.Fatalf("should contain nothing")
+ }
+}
+
+// Test that Contains doesn't update recent-ness
+func TestARC_Contains(t *testing.T) {
+ l, err := NewARC(2)
+ if err != nil {
+ t.Fatalf("err: %v", err)
+ }
+
+ l.Add(1, 1)
+ l.Add(2, 2)
+ if !l.Contains(1) {
+ t.Errorf("1 should be contained")
+ }
+
+ l.Add(3, 3)
+ if l.Contains(1) {
+ t.Errorf("Contains should not have updated recent-ness of 1")
+ }
+}
+
+// Test that Peek doesn't update recent-ness
+func TestARC_Peek(t *testing.T) {
+ l, err := NewARC(2)
+ if err != nil {
+ t.Fatalf("err: %v", err)
+ }
+
+ l.Add(1, 1)
+ l.Add(2, 2)
+ if v, ok := l.Peek(1); !ok || v != 1 {
+ t.Errorf("1 should be set to 1: %v, %v", v, ok)
+ }
+
+ l.Add(3, 3)
+ if l.Contains(1) {
+ t.Errorf("should not have updated recent-ness of 1")
+ }
+}
diff --git a/vendor/github.com/hashicorp/golang-lru/lru.go b/vendor/github.com/hashicorp/golang-lru/lru.go
new file mode 100644
index 000000000..a6285f989
--- /dev/null
+++ b/vendor/github.com/hashicorp/golang-lru/lru.go
@@ -0,0 +1,114 @@
+// This package provides a simple LRU cache. It is based on the
+// LRU implementation in groupcache:
+// https://github.com/golang/groupcache/tree/master/lru
+package lru
+
+import (
+ "sync"
+
+ "github.com/hashicorp/golang-lru/simplelru"
+)
+
+// Cache is a thread-safe fixed size LRU cache.
+type Cache struct {
+ lru *simplelru.LRU
+ lock sync.RWMutex
+}
+
+// New creates an LRU of the given size
+func New(size int) (*Cache, error) {
+ return NewWithEvict(size, nil)
+}
+
+// NewWithEvict constructs a fixed size cache with the given eviction
+// callback.
+func NewWithEvict(size int, onEvicted func(key interface{}, value interface{})) (*Cache, error) {
+ lru, err := simplelru.NewLRU(size, simplelru.EvictCallback(onEvicted))
+ if err != nil {
+ return nil, err
+ }
+ c := &Cache{
+ lru: lru,
+ }
+ return c, nil
+}
+
+// Purge is used to completely clear the cache
+func (c *Cache) Purge() {
+ c.lock.Lock()
+ c.lru.Purge()
+ c.lock.Unlock()
+}
+
+// Add adds a value to the cache. Returns true if an eviction occurred.
+func (c *Cache) Add(key, value interface{}) bool {
+ c.lock.Lock()
+ defer c.lock.Unlock()
+ return c.lru.Add(key, value)
+}
+
+// Get looks up a key's value from the cache.
+func (c *Cache) Get(key interface{}) (interface{}, bool) {
+ c.lock.Lock()
+ defer c.lock.Unlock()
+ return c.lru.Get(key)
+}
+
+// Check if a key is in the cache, without updating the recent-ness
+// or deleting it for being stale.
+func (c *Cache) Contains(key interface{}) bool {
+ c.lock.RLock()
+ defer c.lock.RUnlock()
+ return c.lru.Contains(key)
+}
+
+// Returns the key value (or undefined if not found) without updating
+// the "recently used"-ness of the key.
+func (c *Cache) Peek(key interface{}) (interface{}, bool) {
+ c.lock.RLock()
+ defer c.lock.RUnlock()
+ return c.lru.Peek(key)
+}
+
+// ContainsOrAdd checks if a key is in the cache without updating the
+// recent-ness or deleting it for being stale, and if not, adds the value.
+// Returns whether found and whether an eviction occurred.
+func (c *Cache) ContainsOrAdd(key, value interface{}) (ok, evict bool) {
+ c.lock.Lock()
+ defer c.lock.Unlock()
+
+ if c.lru.Contains(key) {
+ return true, false
+ } else {
+ evict := c.lru.Add(key, value)
+ return false, evict
+ }
+}
+
+// Remove removes the provided key from the cache.
+func (c *Cache) Remove(key interface{}) {
+ c.lock.Lock()
+ c.lru.Remove(key)
+ c.lock.Unlock()
+}
+
+// RemoveOldest removes the oldest item from the cache.
+func (c *Cache) RemoveOldest() {
+ c.lock.Lock()
+ c.lru.RemoveOldest()
+ c.lock.Unlock()
+}
+
+// Keys returns a slice of the keys in the cache, from oldest to newest.
+func (c *Cache) Keys() []interface{} {
+ c.lock.RLock()
+ defer c.lock.RUnlock()
+ return c.lru.Keys()
+}
+
+// Len returns the number of items in the cache.
+func (c *Cache) Len() int {
+ c.lock.RLock()
+ defer c.lock.RUnlock()
+ return c.lru.Len()
+}
diff --git a/vendor/github.com/hashicorp/golang-lru/lru_test.go b/vendor/github.com/hashicorp/golang-lru/lru_test.go
new file mode 100644
index 000000000..2b31218b0
--- /dev/null
+++ b/vendor/github.com/hashicorp/golang-lru/lru_test.go
@@ -0,0 +1,221 @@
+package lru
+
+import (
+ "math/rand"
+ "testing"
+)
+
+func BenchmarkLRU_Rand(b *testing.B) {
+ l, err := New(8192)
+ if err != nil {
+ b.Fatalf("err: %v", err)
+ }
+
+ trace := make([]int64, b.N*2)
+ for i := 0; i < b.N*2; i++ {
+ trace[i] = rand.Int63() % 32768
+ }
+
+ b.ResetTimer()
+
+ var hit, miss int
+ for i := 0; i < 2*b.N; i++ {
+ if i%2 == 0 {
+ l.Add(trace[i], trace[i])
+ } else {
+ _, ok := l.Get(trace[i])
+ if ok {
+ hit++
+ } else {
+ miss++
+ }
+ }
+ }
+ b.Logf("hit: %d miss: %d ratio: %f", hit, miss, float64(hit)/float64(miss))
+}
+
+func BenchmarkLRU_Freq(b *testing.B) {
+ l, err := New(8192)
+ if err != nil {
+ b.Fatalf("err: %v", err)
+ }
+
+ trace := make([]int64, b.N*2)
+ for i := 0; i < b.N*2; i++ {
+ if i%2 == 0 {
+ trace[i] = rand.Int63() % 16384
+ } else {
+ trace[i] = rand.Int63() % 32768
+ }
+ }
+
+ b.ResetTimer()
+
+ for i := 0; i < b.N; i++ {
+ l.Add(trace[i], trace[i])
+ }
+ var hit, miss int
+ for i := 0; i < b.N; i++ {
+ _, ok := l.Get(trace[i])
+ if ok {
+ hit++
+ } else {
+ miss++
+ }
+ }
+ b.Logf("hit: %d miss: %d ratio: %f", hit, miss, float64(hit)/float64(miss))
+}
+
+func TestLRU(t *testing.T) {
+ evictCounter := 0
+ onEvicted := func(k interface{}, v interface{}) {
+ if k != v {
+ t.Fatalf("Evict values not equal (%v!=%v)", k, v)
+ }
+ evictCounter += 1
+ }
+ l, err := NewWithEvict(128, onEvicted)
+ if err != nil {
+ t.Fatalf("err: %v", err)
+ }
+
+ for i := 0; i < 256; i++ {
+ l.Add(i, i)
+ }
+ if l.Len() != 128 {
+ t.Fatalf("bad len: %v", l.Len())
+ }
+
+ if evictCounter != 128 {
+ t.Fatalf("bad evict count: %v", evictCounter)
+ }
+
+ for i, k := range l.Keys() {
+ if v, ok := l.Get(k); !ok || v != k || v != i+128 {
+ t.Fatalf("bad key: %v", k)
+ }
+ }
+ for i := 0; i < 128; i++ {
+ _, ok := l.Get(i)
+ if ok {
+ t.Fatalf("should be evicted")
+ }
+ }
+ for i := 128; i < 256; i++ {
+ _, ok := l.Get(i)
+ if !ok {
+ t.Fatalf("should not be evicted")
+ }
+ }
+ for i := 128; i < 192; i++ {
+ l.Remove(i)
+ _, ok := l.Get(i)
+ if ok {
+ t.Fatalf("should be deleted")
+ }
+ }
+
+ l.Get(192) // expect 192 to be last key in l.Keys()
+
+ for i, k := range l.Keys() {
+ if (i < 63 && k != i+193) || (i == 63 && k != 192) {
+ t.Fatalf("out of order key: %v", k)
+ }
+ }
+
+ l.Purge()
+ if l.Len() != 0 {
+ t.Fatalf("bad len: %v", l.Len())
+ }
+ if _, ok := l.Get(200); ok {
+ t.Fatalf("should contain nothing")
+ }
+}
+
+// test that Add returns true/false if an eviction occurred
+func TestLRUAdd(t *testing.T) {
+ evictCounter := 0
+ onEvicted := func(k interface{}, v interface{}) {
+ evictCounter += 1
+ }
+
+ l, err := NewWithEvict(1, onEvicted)
+ if err != nil {
+ t.Fatalf("err: %v", err)
+ }
+
+ if l.Add(1, 1) == true || evictCounter != 0 {
+ t.Errorf("should not have an eviction")
+ }
+ if l.Add(2, 2) == false || evictCounter != 1 {
+ t.Errorf("should have an eviction")
+ }
+}
+
+// test that Contains doesn't update recent-ness
+func TestLRUContains(t *testing.T) {
+ l, err := New(2)
+ if err != nil {
+ t.Fatalf("err: %v", err)
+ }
+
+ l.Add(1, 1)
+ l.Add(2, 2)
+ if !l.Contains(1) {
+ t.Errorf("1 should be contained")
+ }
+
+ l.Add(3, 3)
+ if l.Contains(1) {
+ t.Errorf("Contains should not have updated recent-ness of 1")
+ }
+}
+
+// test that Contains doesn't update recent-ness
+func TestLRUContainsOrAdd(t *testing.T) {
+ l, err := New(2)
+ if err != nil {
+ t.Fatalf("err: %v", err)
+ }
+
+ l.Add(1, 1)
+ l.Add(2, 2)
+ contains, evict := l.ContainsOrAdd(1, 1)
+ if !contains {
+ t.Errorf("1 should be contained")
+ }
+ if evict {
+ t.Errorf("nothing should be evicted here")
+ }
+
+ l.Add(3, 3)
+ contains, evict = l.ContainsOrAdd(1, 1)
+ if contains {
+ t.Errorf("1 should not have been contained")
+ }
+ if !evict {
+ t.Errorf("an eviction should have occurred")
+ }
+ if !l.Contains(1) {
+ t.Errorf("now 1 should be contained")
+ }
+}
+
+// test that Peek doesn't update recent-ness
+func TestLRUPeek(t *testing.T) {
+ l, err := New(2)
+ if err != nil {
+ t.Fatalf("err: %v", err)
+ }
+
+ l.Add(1, 1)
+ l.Add(2, 2)
+ if v, ok := l.Peek(1); !ok || v != 1 {
+ t.Errorf("1 should be set to 1: %v, %v", v, ok)
+ }
+
+ l.Add(3, 3)
+ if l.Contains(1) {
+ t.Errorf("should not have updated recent-ness of 1")
+ }
+}
diff --git a/vendor/github.com/hashicorp/golang-lru/simplelru/lru.go b/vendor/github.com/hashicorp/golang-lru/simplelru/lru.go
new file mode 100644
index 000000000..cb416b394
--- /dev/null
+++ b/vendor/github.com/hashicorp/golang-lru/simplelru/lru.go
@@ -0,0 +1,160 @@
+package simplelru
+
+import (
+ "container/list"
+ "errors"
+)
+
+// EvictCallback is used to get a callback when a cache entry is evicted
+type EvictCallback func(key interface{}, value interface{})
+
+// LRU implements a non-thread safe fixed size LRU cache
+type LRU struct {
+ size int
+ evictList *list.List
+ items map[interface{}]*list.Element
+ onEvict EvictCallback
+}
+
+// entry is used to hold a value in the evictList
+type entry struct {
+ key interface{}
+ value interface{}
+}
+
+// NewLRU constructs an LRU of the given size
+func NewLRU(size int, onEvict EvictCallback) (*LRU, error) {
+ if size <= 0 {
+ return nil, errors.New("Must provide a positive size")
+ }
+ c := &LRU{
+ size: size,
+ evictList: list.New(),
+ items: make(map[interface{}]*list.Element),
+ onEvict: onEvict,
+ }
+ return c, nil
+}
+
+// Purge is used to completely clear the cache
+func (c *LRU) Purge() {
+ for k, v := range c.items {
+ if c.onEvict != nil {
+ c.onEvict(k, v.Value.(*entry).value)
+ }
+ delete(c.items, k)
+ }
+ c.evictList.Init()
+}
+
+// Add adds a value to the cache. Returns true if an eviction occurred.
+func (c *LRU) Add(key, value interface{}) bool {
+ // Check for existing item
+ if ent, ok := c.items[key]; ok {
+ c.evictList.MoveToFront(ent)
+ ent.Value.(*entry).value = value
+ return false
+ }
+
+ // Add new item
+ ent := &entry{key, value}
+ entry := c.evictList.PushFront(ent)
+ c.items[key] = entry
+
+ evict := c.evictList.Len() > c.size
+ // Verify size not exceeded
+ if evict {
+ c.removeOldest()
+ }
+ return evict
+}
+
+// Get looks up a key's value from the cache.
+func (c *LRU) Get(key interface{}) (value interface{}, ok bool) {
+ if ent, ok := c.items[key]; ok {
+ c.evictList.MoveToFront(ent)
+ return ent.Value.(*entry).value, true
+ }
+ return
+}
+
+// Check if a key is in the cache, without updating the recent-ness
+// or deleting it for being stale.
+func (c *LRU) Contains(key interface{}) (ok bool) {
+ _, ok = c.items[key]
+ return ok
+}
+
+// Returns the key value (or undefined if not found) without updating
+// the "recently used"-ness of the key.
+func (c *LRU) Peek(key interface{}) (value interface{}, ok bool) {
+ if ent, ok := c.items[key]; ok {
+ return ent.Value.(*entry).value, true
+ }
+ return nil, ok
+}
+
+// Remove removes the provided key from the cache, returning if the
+// key was contained.
+func (c *LRU) Remove(key interface{}) bool {
+ if ent, ok := c.items[key]; ok {
+ c.removeElement(ent)
+ return true
+ }
+ return false
+}
+
+// RemoveOldest removes the oldest item from the cache.
+func (c *LRU) RemoveOldest() (interface{}, interface{}, bool) {
+ ent := c.evictList.Back()
+ if ent != nil {
+ c.removeElement(ent)
+ kv := ent.Value.(*entry)
+ return kv.key, kv.value, true
+ }
+ return nil, nil, false
+}
+
+// GetOldest returns the oldest entry
+func (c *LRU) GetOldest() (interface{}, interface{}, bool) {
+ ent := c.evictList.Back()
+ if ent != nil {
+ kv := ent.Value.(*entry)
+ return kv.key, kv.value, true
+ }
+ return nil, nil, false
+}
+
+// Keys returns a slice of the keys in the cache, from oldest to newest.
+func (c *LRU) Keys() []interface{} {
+ keys := make([]interface{}, len(c.items))
+ i := 0
+ for ent := c.evictList.Back(); ent != nil; ent = ent.Prev() {
+ keys[i] = ent.Value.(*entry).key
+ i++
+ }
+ return keys
+}
+
+// Len returns the number of items in the cache.
+func (c *LRU) Len() int {
+ return c.evictList.Len()
+}
+
+// removeOldest removes the oldest item from the cache.
+func (c *LRU) removeOldest() {
+ ent := c.evictList.Back()
+ if ent != nil {
+ c.removeElement(ent)
+ }
+}
+
+// removeElement is used to remove a given list element from the cache
+func (c *LRU) removeElement(e *list.Element) {
+ c.evictList.Remove(e)
+ kv := e.Value.(*entry)
+ delete(c.items, kv.key)
+ if c.onEvict != nil {
+ c.onEvict(kv.key, kv.value)
+ }
+}
diff --git a/vendor/github.com/hashicorp/golang-lru/simplelru/lru_test.go b/vendor/github.com/hashicorp/golang-lru/simplelru/lru_test.go
new file mode 100644
index 000000000..a958934f6
--- /dev/null
+++ b/vendor/github.com/hashicorp/golang-lru/simplelru/lru_test.go
@@ -0,0 +1,167 @@
+package simplelru
+
+import "testing"
+
+func TestLRU(t *testing.T) {
+ evictCounter := 0
+ onEvicted := func(k interface{}, v interface{}) {
+ if k != v {
+ t.Fatalf("Evict values not equal (%v!=%v)", k, v)
+ }
+ evictCounter += 1
+ }
+ l, err := NewLRU(128, onEvicted)
+ if err != nil {
+ t.Fatalf("err: %v", err)
+ }
+
+ for i := 0; i < 256; i++ {
+ l.Add(i, i)
+ }
+ if l.Len() != 128 {
+ t.Fatalf("bad len: %v", l.Len())
+ }
+
+ if evictCounter != 128 {
+ t.Fatalf("bad evict count: %v", evictCounter)
+ }
+
+ for i, k := range l.Keys() {
+ if v, ok := l.Get(k); !ok || v != k || v != i+128 {
+ t.Fatalf("bad key: %v", k)
+ }
+ }
+ for i := 0; i < 128; i++ {
+ _, ok := l.Get(i)
+ if ok {
+ t.Fatalf("should be evicted")
+ }
+ }
+ for i := 128; i < 256; i++ {
+ _, ok := l.Get(i)
+ if !ok {
+ t.Fatalf("should not be evicted")
+ }
+ }
+ for i := 128; i < 192; i++ {
+ ok := l.Remove(i)
+ if !ok {
+ t.Fatalf("should be contained")
+ }
+ ok = l.Remove(i)
+ if ok {
+ t.Fatalf("should not be contained")
+ }
+ _, ok = l.Get(i)
+ if ok {
+ t.Fatalf("should be deleted")
+ }
+ }
+
+ l.Get(192) // expect 192 to be last key in l.Keys()
+
+ for i, k := range l.Keys() {
+ if (i < 63 && k != i+193) || (i == 63 && k != 192) {
+ t.Fatalf("out of order key: %v", k)
+ }
+ }
+
+ l.Purge()
+ if l.Len() != 0 {
+ t.Fatalf("bad len: %v", l.Len())
+ }
+ if _, ok := l.Get(200); ok {
+ t.Fatalf("should contain nothing")
+ }
+}
+
+func TestLRU_GetOldest_RemoveOldest(t *testing.T) {
+ l, err := NewLRU(128, nil)
+ if err != nil {
+ t.Fatalf("err: %v", err)
+ }
+ for i := 0; i < 256; i++ {
+ l.Add(i, i)
+ }
+ k, _, ok := l.GetOldest()
+ if !ok {
+ t.Fatalf("missing")
+ }
+ if k.(int) != 128 {
+ t.Fatalf("bad: %v", k)
+ }
+
+ k, _, ok = l.RemoveOldest()
+ if !ok {
+ t.Fatalf("missing")
+ }
+ if k.(int) != 128 {
+ t.Fatalf("bad: %v", k)
+ }
+
+ k, _, ok = l.RemoveOldest()
+ if !ok {
+ t.Fatalf("missing")
+ }
+ if k.(int) != 129 {
+ t.Fatalf("bad: %v", k)
+ }
+}
+
+// Test that Add returns true/false if an eviction occurred
+func TestLRU_Add(t *testing.T) {
+ evictCounter := 0
+ onEvicted := func(k interface{}, v interface{}) {
+ evictCounter += 1
+ }
+
+ l, err := NewLRU(1, onEvicted)
+ if err != nil {
+ t.Fatalf("err: %v", err)
+ }
+
+ if l.Add(1, 1) == true || evictCounter != 0 {
+ t.Errorf("should not have an eviction")
+ }
+ if l.Add(2, 2) == false || evictCounter != 1 {
+ t.Errorf("should have an eviction")
+ }
+}
+
+// Test that Contains doesn't update recent-ness
+func TestLRU_Contains(t *testing.T) {
+ l, err := NewLRU(2, nil)
+ if err != nil {
+ t.Fatalf("err: %v", err)
+ }
+
+ l.Add(1, 1)
+ l.Add(2, 2)
+ if !l.Contains(1) {
+ t.Errorf("1 should be contained")
+ }
+
+ l.Add(3, 3)
+ if l.Contains(1) {
+ t.Errorf("Contains should not have updated recent-ness of 1")
+ }
+}
+
+// Test that Peek doesn't update recent-ness
+func TestLRU_Peek(t *testing.T) {
+ l, err := NewLRU(2, nil)
+ if err != nil {
+ t.Fatalf("err: %v", err)
+ }
+
+ l.Add(1, 1)
+ l.Add(2, 2)
+ if v, ok := l.Peek(1); !ok || v != 1 {
+ t.Errorf("1 should be set to 1: %v, %v", v, ok)
+ }
+
+ l.Add(3, 3)
+ if l.Contains(1) {
+ t.Errorf("should not have updated recent-ness of 1")
+ }
+}
diff --git a/vendor/github.com/jehiah/go-strftime/.gitignore b/vendor/github.com/jehiah/go-strftime/.gitignore
new file mode 100644
index 000000000..00268614f
--- /dev/null
+++ b/vendor/github.com/jehiah/go-strftime/.gitignore
@@ -0,0 +1,22 @@
+# Compiled Object files, Static and Dynamic libs (Shared Objects)
+*.o
+*.a
+*.so
+
+# Folders
+_obj
+_test
+
+# Architecture specific extensions/prefixes
+*.[568vq]
+[568vq].out
+
+*.cgo1.go
+*.cgo2.c
+_cgo_defun.c
+_cgo_gotypes.go
+_cgo_export.*
+
+_testmain.go
+
+*.exe
diff --git a/vendor/github.com/lib/pq/.travis.sh b/vendor/github.com/lib/pq/.travis.sh
new file mode 100755
index 000000000..ebf447030
--- /dev/null
+++ b/vendor/github.com/lib/pq/.travis.sh
@@ -0,0 +1,73 @@
+#!/bin/bash
+
+set -eu
+
+client_configure() {
+ sudo chmod 600 $PQSSLCERTTEST_PATH/postgresql.key
+}
+
+pgdg_repository() {
+ local sourcelist='sources.list.d/postgresql.list'
+
+ curl -sS 'https://www.postgresql.org/media/keys/ACCC4CF8.asc' | sudo apt-key add -
+ echo deb http://apt.postgresql.org/pub/repos/apt/ $(lsb_release -cs)-pgdg main $PGVERSION | sudo tee "/etc/apt/$sourcelist"
+ sudo apt-get -o Dir::Etc::sourcelist="$sourcelist" -o Dir::Etc::sourceparts='-' -o APT::Get::List-Cleanup='0' update
+}
+
+postgresql_configure() {
+ sudo tee /etc/postgresql/$PGVERSION/main/pg_hba.conf > /dev/null <<-config
+ local all all trust
+ hostnossl all pqgossltest 127.0.0.1/32 reject
+ hostnossl all pqgosslcert 127.0.0.1/32 reject
+ hostssl all pqgossltest 127.0.0.1/32 trust
+ hostssl all pqgosslcert 127.0.0.1/32 cert
+ host all all 127.0.0.1/32 trust
+ hostnossl all pqgossltest ::1/128 reject
+ hostnossl all pqgosslcert ::1/128 reject
+ hostssl all pqgossltest ::1/128 trust
+ hostssl all pqgosslcert ::1/128 cert
+ host all all ::1/128 trust
+ config
+
+ xargs sudo install -o postgres -g postgres -m 600 -t /var/lib/postgresql/$PGVERSION/main/ <<-certificates
+ certs/root.crt
+ certs/server.crt
+ certs/server.key
+ certificates
+
+ sort -VCu <<-versions ||
+ $PGVERSION
+ 9.2
+ versions
+ sudo tee -a /etc/postgresql/$PGVERSION/main/postgresql.conf > /dev/null <<-config
+ ssl_ca_file = 'root.crt'
+ ssl_cert_file = 'server.crt'
+ ssl_key_file = 'server.key'
+ config
+
+ echo 127.0.0.1 postgres | sudo tee -a /etc/hosts > /dev/null
+
+ sudo service postgresql restart
+}
+
+postgresql_install() {
+ xargs sudo apt-get -y -o Dpkg::Options::='--force-confdef' -o Dpkg::Options::='--force-confnew' install <<-packages
+ postgresql-$PGVERSION
+ postgresql-server-dev-$PGVERSION
+ postgresql-contrib-$PGVERSION
+ packages
+}
+
+postgresql_uninstall() {
+ sudo service postgresql stop
+ xargs sudo apt-get -y --purge remove <<-packages
+ libpq-dev
+ libpq5
+ postgresql
+ postgresql-client-common
+ postgresql-common
+ packages
+ sudo rm -rf /var/lib/postgresql
+}
+
+$1
diff --git a/vendor/github.com/lib/pq/.travis.yml b/vendor/github.com/lib/pq/.travis.yml
index d63afcb9f..d7b60f899 100644
--- a/vendor/github.com/lib/pq/.travis.yml
+++ b/vendor/github.com/lib/pq/.travis.yml
@@ -1,43 +1,12 @@
language: go
go:
- - 1.4
- 1.5
- 1.6
+ - 1.7
- tip
-before_install:
- - psql --version
- - sudo /etc/init.d/postgresql stop
- - sudo apt-get -y --purge remove postgresql libpq-dev libpq5 postgresql-client-common postgresql-common
- - sudo rm -rf /var/lib/postgresql
- - wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
- - sudo sh -c "echo deb http://apt.postgresql.org/pub/repos/apt/ $(lsb_release -cs)-pgdg main $PGVERSION >> /etc/apt/sources.list.d/postgresql.list"
- - sudo apt-get update -qq
- - sudo apt-get -y -o Dpkg::Options::=--force-confdef -o Dpkg::Options::="--force-confnew" install postgresql-$PGVERSION postgresql-server-dev-$PGVERSION postgresql-contrib-$PGVERSION
- - sudo chmod 777 /etc/postgresql/$PGVERSION/main/pg_hba.conf
- - echo "local all postgres trust" > /etc/postgresql/$PGVERSION/main/pg_hba.conf
- - echo "local all all trust" >> /etc/postgresql/$PGVERSION/main/pg_hba.conf
- - echo "hostnossl all pqgossltest 127.0.0.1/32 reject" >> /etc/postgresql/$PGVERSION/main/pg_hba.conf
- - echo "hostnossl all pqgosslcert 127.0.0.1/32 reject" >> /etc/postgresql/$PGVERSION/main/pg_hba.conf
- - echo "hostssl all pqgossltest 127.0.0.1/32 trust" >> /etc/postgresql/$PGVERSION/main/pg_hba.conf
- - echo "hostssl all pqgosslcert 127.0.0.1/32 cert" >> /etc/postgresql/$PGVERSION/main/pg_hba.conf
- - echo "host all all 127.0.0.1/32 trust" >> /etc/postgresql/$PGVERSION/main/pg_hba.conf
- - echo "hostnossl all pqgossltest ::1/128 reject" >> /etc/postgresql/$PGVERSION/main/pg_hba.conf
- - echo "hostnossl all pqgosslcert ::1/128 reject" >> /etc/postgresql/$PGVERSION/main/pg_hba.conf
- - echo "hostssl all pqgossltest ::1/128 trust" >> /etc/postgresql/$PGVERSION/main/pg_hba.conf
- - echo "hostssl all pqgosslcert ::1/128 cert" >> /etc/postgresql/$PGVERSION/main/pg_hba.conf
- - echo "host all all ::1/128 trust" >> /etc/postgresql/$PGVERSION/main/pg_hba.conf
- - sudo install -o postgres -g postgres -m 600 -t /var/lib/postgresql/$PGVERSION/main/ certs/server.key certs/server.crt certs/root.crt
- - sudo bash -c "[[ '${PGVERSION}' < '9.2' ]] || (echo \"ssl_cert_file = 'server.crt'\" >> /etc/postgresql/$PGVERSION/main/postgresql.conf)"
- - sudo bash -c "[[ '${PGVERSION}' < '9.2' ]] || (echo \"ssl_key_file = 'server.key'\" >> /etc/postgresql/$PGVERSION/main/postgresql.conf)"
- - sudo bash -c "[[ '${PGVERSION}' < '9.2' ]] || (echo \"ssl_ca_file = 'root.crt'\" >> /etc/postgresql/$PGVERSION/main/postgresql.conf)"
- - sudo sh -c "echo 127.0.0.1 postgres >> /etc/hosts"
- - sudo ls -l /var/lib/postgresql/$PGVERSION/main/
- - sudo cat /etc/postgresql/$PGVERSION/main/postgresql.conf
- - sudo chmod 600 $PQSSLCERTTEST_PATH/postgresql.key
- - sudo /etc/init.d/postgresql restart
- - go get golang.org/x/tools/cmd/goimports
+sudo: true
env:
global:
@@ -46,23 +15,29 @@ env:
- PQSSLCERTTEST_PATH=$PWD/certs
- PGHOST=127.0.0.1
matrix:
- - PGVERSION=9.5 PQTEST_BINARY_PARAMETERS=yes
- - PGVERSION=9.4 PQTEST_BINARY_PARAMETERS=yes
- - PGVERSION=9.3 PQTEST_BINARY_PARAMETERS=yes
- - PGVERSION=9.2 PQTEST_BINARY_PARAMETERS=yes
- - PGVERSION=9.1 PQTEST_BINARY_PARAMETERS=yes
- - PGVERSION=9.0 PQTEST_BINARY_PARAMETERS=yes
- - PGVERSION=9.5 PQTEST_BINARY_PARAMETERS=no
- - PGVERSION=9.4 PQTEST_BINARY_PARAMETERS=no
- - PGVERSION=9.3 PQTEST_BINARY_PARAMETERS=no
- - PGVERSION=9.2 PQTEST_BINARY_PARAMETERS=no
- - PGVERSION=9.1 PQTEST_BINARY_PARAMETERS=no
- - PGVERSION=9.0 PQTEST_BINARY_PARAMETERS=no
+ - PGVERSION=9.5
+ - PGVERSION=9.4
+ - PGVERSION=9.3
+ - PGVERSION=9.2
+ - PGVERSION=9.1
+ - PGVERSION=9.0
-script:
- - result=$(goimports -d -e $(find -name \*.go)); test -z "$result" || (echo "$result" && false) && go vet ./... && go test -v ./...
+before_install:
+ - ./.travis.sh postgresql_uninstall
+ - ./.travis.sh pgdg_repository
+ - ./.travis.sh postgresql_install
+ - ./.travis.sh postgresql_configure
+ - ./.travis.sh client_configure
+ - go get golang.org/x/tools/cmd/goimports
before_script:
- - psql -c 'create database pqgotest' -U postgres
- - psql -c 'create user pqgossltest' -U postgres
- - psql -c 'create user pqgosslcert' -U postgres
+ - createdb pqgotest
+ - createuser -DRS pqgossltest
+ - createuser -DRS pqgosslcert
+
+script:
+ - >
+ goimports -d -e $(find -name '*.go') | awk '{ print } END { exit NR == 0 ? 0 : 1 }'
+ - go vet ./...
+ - PQTEST_BINARY_PARAMETERS=no go test -v ./...
+ - PQTEST_BINARY_PARAMETERS=yes go test -v ./...
diff --git a/vendor/github.com/lib/pq/README.md b/vendor/github.com/lib/pq/README.md
index 148451e80..5eb9e1445 100644
--- a/vendor/github.com/lib/pq/README.md
+++ b/vendor/github.com/lib/pq/README.md
@@ -85,7 +85,7 @@ code still exists in here.
* Keith Rarick (kr)
* Kir Shatrov (kirs)
* Lann Martin (lann)
-* Maciek Sakrejda (deafbybeheading)
+* Maciek Sakrejda (uhoh-itsmaciek)
* Marc Brinkmann (mbr)
* Marko Tiikkaja (johto)
* Matt Newberry (MattNewberry)
diff --git a/vendor/github.com/lib/pq/array.go b/vendor/github.com/lib/pq/array.go
new file mode 100644
index 000000000..27eb07a9e
--- /dev/null
+++ b/vendor/github.com/lib/pq/array.go
@@ -0,0 +1,727 @@
+package pq
+
+import (
+ "bytes"
+ "database/sql"
+ "database/sql/driver"
+ "encoding/hex"
+ "fmt"
+ "reflect"
+ "strconv"
+ "strings"
+)
+
+var typeByteSlice = reflect.TypeOf([]byte{})
+var typeDriverValuer = reflect.TypeOf((*driver.Valuer)(nil)).Elem()
+var typeSqlScanner = reflect.TypeOf((*sql.Scanner)(nil)).Elem()
+
+// Array returns the optimal driver.Valuer and sql.Scanner for an array or
+// slice of any dimension.
+//
+// For example:
+// db.Query(`SELECT * FROM t WHERE id = ANY($1)`, pq.Array([]int{235, 401}))
+//
+// var x []sql.NullInt64
+// db.QueryRow('SELECT ARRAY[235, 401]').Scan(pq.Array(&x))
+//
+// Scanning multi-dimensional arrays is not supported. Arrays where the lower
+// bound is not one (such as `[0:0]={1}') are not supported.
+func Array(a interface{}) interface {
+ driver.Valuer
+ sql.Scanner
+} {
+ switch a := a.(type) {
+ case []bool:
+ return (*BoolArray)(&a)
+ case []float64:
+ return (*Float64Array)(&a)
+ case []int64:
+ return (*Int64Array)(&a)
+ case []string:
+ return (*StringArray)(&a)
+
+ case *[]bool:
+ return (*BoolArray)(a)
+ case *[]float64:
+ return (*Float64Array)(a)
+ case *[]int64:
+ return (*Int64Array)(a)
+ case *[]string:
+ return (*StringArray)(a)
+ }
+
+ return GenericArray{a}
+}
+
+// ArrayDelimiter may be optionally implemented by driver.Valuer or sql.Scanner
+// to override the array delimiter used by GenericArray.
+type ArrayDelimiter interface {
+ // ArrayDelimiter returns the delimiter character(s) for this element's type.
+ ArrayDelimiter() string
+}
+
+// BoolArray represents a one-dimensional array of the PostgreSQL boolean type.
+type BoolArray []bool
+
+// Scan implements the sql.Scanner interface.
+func (a *BoolArray) Scan(src interface{}) error {
+ switch src := src.(type) {
+ case []byte:
+ return a.scanBytes(src)
+ case string:
+ return a.scanBytes([]byte(src))
+ }
+
+ return fmt.Errorf("pq: cannot convert %T to BoolArray", src)
+}
+
+func (a *BoolArray) scanBytes(src []byte) error {
+ elems, err := scanLinearArray(src, []byte{','}, "BoolArray")
+ if err != nil {
+ return err
+ }
+ if len(elems) == 0 {
+ *a = (*a)[:0]
+ } else {
+ b := make(BoolArray, len(elems))
+ for i, v := range elems {
+ if len(v) != 1 {
+ return fmt.Errorf("pq: could not parse boolean array index %d: invalid boolean %q", i, v)
+ }
+ switch v[0] {
+ case 't':
+ b[i] = true
+ case 'f':
+ b[i] = false
+ default:
+ return fmt.Errorf("pq: could not parse boolean array index %d: invalid boolean %q", i, v)
+ }
+ }
+ *a = b
+ }
+ return nil
+}
+
+// Value implements the driver.Valuer interface.
+func (a BoolArray) Value() (driver.Value, error) {
+ if a == nil {
+ return nil, nil
+ }
+
+ if n := len(a); n > 0 {
+ // There will be exactly two curly brackets, N bytes of values,
+ // and N-1 bytes of delimiters.
+ b := make([]byte, 1+2*n)
+
+ for i := 0; i < n; i++ {
+ b[2*i] = ','
+ if a[i] {
+ b[1+2*i] = 't'
+ } else {
+ b[1+2*i] = 'f'
+ }
+ }
+
+ b[0] = '{'
+ b[2*n] = '}'
+
+ return string(b), nil
+ }
+
+ return "{}", nil
+}
+
+// ByteaArray represents a one-dimensional array of the PostgreSQL bytea type.
+type ByteaArray [][]byte
+
+// Scan implements the sql.Scanner interface.
+func (a *ByteaArray) Scan(src interface{}) error {
+ switch src := src.(type) {
+ case []byte:
+ return a.scanBytes(src)
+ case string:
+ return a.scanBytes([]byte(src))
+ }
+
+ return fmt.Errorf("pq: cannot convert %T to ByteaArray", src)
+}
+
+func (a *ByteaArray) scanBytes(src []byte) error {
+ elems, err := scanLinearArray(src, []byte{','}, "ByteaArray")
+ if err != nil {
+ return err
+ }
+ if len(elems) == 0 {
+ *a = (*a)[:0]
+ } else {
+ b := make(ByteaArray, len(elems))
+ for i, v := range elems {
+ b[i], err = parseBytea(v)
+ if err != nil {
+ return fmt.Errorf("could not parse bytea array index %d: %s", i, err.Error())
+ }
+ }
+ *a = b
+ }
+ return nil
+}
+
+// Value implements the driver.Valuer interface. It uses the "hex" format which
+// is only supported on PostgreSQL 9.0 or newer.
+func (a ByteaArray) Value() (driver.Value, error) {
+ if a == nil {
+ return nil, nil
+ }
+
+ if n := len(a); n > 0 {
+ // There will be at least two curly brackets, 2*N bytes of quotes,
+ // 3*N bytes of hex formatting, and N-1 bytes of delimiters.
+ size := 1 + 6*n
+ for _, x := range a {
+ size += hex.EncodedLen(len(x))
+ }
+
+ b := make([]byte, size)
+
+ for i, s := 0, b; i < n; i++ {
+ o := copy(s, `,"\\x`)
+ o += hex.Encode(s[o:], a[i])
+ s[o] = '"'
+ s = s[o+1:]
+ }
+
+ b[0] = '{'
+ b[size-1] = '}'
+
+ return string(b), nil
+ }
+
+ return "{}", nil
+}
+
+// Float64Array represents a one-dimensional array of the PostgreSQL double
+// precision type.
+type Float64Array []float64
+
+// Scan implements the sql.Scanner interface.
+func (a *Float64Array) Scan(src interface{}) error {
+ switch src := src.(type) {
+ case []byte:
+ return a.scanBytes(src)
+ case string:
+ return a.scanBytes([]byte(src))
+ }
+
+ return fmt.Errorf("pq: cannot convert %T to Float64Array", src)
+}
+
+func (a *Float64Array) scanBytes(src []byte) error {
+ elems, err := scanLinearArray(src, []byte{','}, "Float64Array")
+ if err != nil {
+ return err
+ }
+ if len(elems) == 0 {
+ *a = (*a)[:0]
+ } else {
+ b := make(Float64Array, len(elems))
+ for i, v := range elems {
+ if b[i], err = strconv.ParseFloat(string(v), 64); err != nil {
+ return fmt.Errorf("pq: parsing array element index %d: %v", i, err)
+ }
+ }
+ *a = b
+ }
+ return nil
+}
+
+// Value implements the driver.Valuer interface.
+func (a Float64Array) Value() (driver.Value, error) {
+ if a == nil {
+ return nil, nil
+ }
+
+ if n := len(a); n > 0 {
+ // There will be at least two curly brackets, N bytes of values,
+ // and N-1 bytes of delimiters.
+ b := make([]byte, 1, 1+2*n)
+ b[0] = '{'
+
+ b = strconv.AppendFloat(b, a[0], 'f', -1, 64)
+ for i := 1; i < n; i++ {
+ b = append(b, ',')
+ b = strconv.AppendFloat(b, a[i], 'f', -1, 64)
+ }
+
+ return string(append(b, '}')), nil
+ }
+
+ return "{}", nil
+}
+
+// GenericArray implements the driver.Valuer and sql.Scanner interfaces for
+// an array or slice of any dimension.
+type GenericArray struct{ A interface{} }
+
+func (GenericArray) evaluateDestination(rt reflect.Type) (reflect.Type, func([]byte, reflect.Value) error, string) {
+ var assign func([]byte, reflect.Value) error
+ var del = ","
+
+ // TODO calculate the assign function for other types
+ // TODO repeat this section on the element type of arrays or slices (multidimensional)
+ {
+ if reflect.PtrTo(rt).Implements(typeSqlScanner) {
+ // dest is always addressable because it is an element of a slice.
+ assign = func(src []byte, dest reflect.Value) (err error) {
+ ss := dest.Addr().Interface().(sql.Scanner)
+ if src == nil {
+ err = ss.Scan(nil)
+ } else {
+ err = ss.Scan(src)
+ }
+ return
+ }
+ goto FoundType
+ }
+
+ assign = func([]byte, reflect.Value) error {
+ return fmt.Errorf("pq: scanning to %s is not implemented; only sql.Scanner", rt)
+ }
+ }
+
+FoundType:
+
+ if ad, ok := reflect.Zero(rt).Interface().(ArrayDelimiter); ok {
+ del = ad.ArrayDelimiter()
+ }
+
+ return rt, assign, del
+}
+
+// Scan implements the sql.Scanner interface.
+func (a GenericArray) Scan(src interface{}) error {
+ dpv := reflect.ValueOf(a.A)
+ switch {
+ case dpv.Kind() != reflect.Ptr:
+ return fmt.Errorf("pq: destination %T is not a pointer to array or slice", a.A)
+ case dpv.IsNil():
+ return fmt.Errorf("pq: destination %T is nil", a.A)
+ }
+
+ dv := dpv.Elem()
+ switch dv.Kind() {
+ case reflect.Slice:
+ case reflect.Array:
+ default:
+ return fmt.Errorf("pq: destination %T is not a pointer to array or slice", a.A)
+ }
+
+ switch src := src.(type) {
+ case []byte:
+ return a.scanBytes(src, dv)
+ case string:
+ return a.scanBytes([]byte(src), dv)
+ }
+
+ return fmt.Errorf("pq: cannot convert %T to %s", src, dv.Type())
+}
+
+func (a GenericArray) scanBytes(src []byte, dv reflect.Value) error {
+ dtype, assign, del := a.evaluateDestination(dv.Type().Elem())
+ dims, elems, err := parseArray(src, []byte(del))
+ if err != nil {
+ return err
+ }
+
+ // TODO allow multidimensional
+
+ if len(dims) > 1 {
+ return fmt.Errorf("pq: scanning from multidimensional ARRAY%s is not implemented",
+ strings.Replace(fmt.Sprint(dims), " ", "][", -1))
+ }
+
+ // Treat a zero-dimensional array like an array with a single dimension of zero.
+ if len(dims) == 0 {
+ dims = append(dims, 0)
+ }
+
+ for i, rt := 0, dv.Type(); i < len(dims); i, rt = i+1, rt.Elem() {
+ switch rt.Kind() {
+ case reflect.Slice:
+ case reflect.Array:
+ if rt.Len() != dims[i] {
+ return fmt.Errorf("pq: cannot convert ARRAY%s to %s",
+ strings.Replace(fmt.Sprint(dims), " ", "][", -1), dv.Type())
+ }
+ default:
+ // TODO handle multidimensional
+ }
+ }
+
+ values := reflect.MakeSlice(reflect.SliceOf(dtype), len(elems), len(elems))
+ for i, e := range elems {
+ if err := assign(e, values.Index(i)); err != nil {
+ return fmt.Errorf("pq: parsing array element index %d: %v", i, err)
+ }
+ }
+
+ // TODO handle multidimensional
+
+ switch dv.Kind() {
+ case reflect.Slice:
+ dv.Set(values.Slice(0, dims[0]))
+ case reflect.Array:
+ for i := 0; i < dims[0]; i++ {
+ dv.Index(i).Set(values.Index(i))
+ }
+ }
+
+ return nil
+}
+
+// Value implements the driver.Valuer interface.
+func (a GenericArray) Value() (driver.Value, error) {
+ if a.A == nil {
+ return nil, nil
+ }
+
+ rv := reflect.ValueOf(a.A)
+
+ if k := rv.Kind(); k != reflect.Array && k != reflect.Slice {
+ return nil, fmt.Errorf("pq: Unable to convert %T to array", a.A)
+ }
+
+ if n := rv.Len(); n > 0 {
+ // There will be at least two curly brackets, N bytes of values,
+ // and N-1 bytes of delimiters.
+ b := make([]byte, 0, 1+2*n)
+
+ b, _, err := appendArray(b, rv, n)
+ return string(b), err
+ }
+
+ return "{}", nil
+}
+
+// Int64Array represents a one-dimensional array of the PostgreSQL integer types.
+type Int64Array []int64
+
+// Scan implements the sql.Scanner interface.
+func (a *Int64Array) Scan(src interface{}) error {
+ switch src := src.(type) {
+ case []byte:
+ return a.scanBytes(src)
+ case string:
+ return a.scanBytes([]byte(src))
+ }
+
+ return fmt.Errorf("pq: cannot convert %T to Int64Array", src)
+}
+
+func (a *Int64Array) scanBytes(src []byte) error {
+ elems, err := scanLinearArray(src, []byte{','}, "Int64Array")
+ if err != nil {
+ return err
+ }
+ if len(elems) == 0 {
+ *a = (*a)[:0]
+ } else {
+ b := make(Int64Array, len(elems))
+ for i, v := range elems {
+ if b[i], err = strconv.ParseInt(string(v), 10, 64); err != nil {
+ return fmt.Errorf("pq: parsing array element index %d: %v", i, err)
+ }
+ }
+ *a = b
+ }
+ return nil
+}
+
+// Value implements the driver.Valuer interface.
+func (a Int64Array) Value() (driver.Value, error) {
+ if a == nil {
+ return nil, nil
+ }
+
+ if n := len(a); n > 0 {
+ // There will be at least two curly brackets, N bytes of values,
+ // and N-1 bytes of delimiters.
+ b := make([]byte, 1, 1+2*n)
+ b[0] = '{'
+
+ b = strconv.AppendInt(b, a[0], 10)
+ for i := 1; i < n; i++ {
+ b = append(b, ',')
+ b = strconv.AppendInt(b, a[i], 10)
+ }
+
+ return string(append(b, '}')), nil
+ }
+
+ return "{}", nil
+}
+
+// StringArray represents a one-dimensional array of the PostgreSQL character types.
+type StringArray []string
+
+// Scan implements the sql.Scanner interface.
+func (a *StringArray) Scan(src interface{}) error {
+ switch src := src.(type) {
+ case []byte:
+ return a.scanBytes(src)
+ case string:
+ return a.scanBytes([]byte(src))
+ }
+
+ return fmt.Errorf("pq: cannot convert %T to StringArray", src)
+}
+
+func (a *StringArray) scanBytes(src []byte) error {
+ elems, err := scanLinearArray(src, []byte{','}, "StringArray")
+ if err != nil {
+ return err
+ }
+ if len(elems) == 0 {
+ *a = (*a)[:0]
+ } else {
+ b := make(StringArray, len(elems))
+ for i, v := range elems {
+ if b[i] = string(v); v == nil {
+ return fmt.Errorf("pq: parsing array element index %d: cannot convert nil to string", i)
+ }
+ }
+ *a = b
+ }
+ return nil
+}
+
+// Value implements the driver.Valuer interface.
+func (a StringArray) Value() (driver.Value, error) {
+ if a == nil {
+ return nil, nil
+ }
+
+ if n := len(a); n > 0 {
+ // There will be at least two curly brackets, 2*N bytes of quotes,
+ // and N-1 bytes of delimiters.
+ b := make([]byte, 1, 1+3*n)
+ b[0] = '{'
+
+ b = appendArrayQuotedBytes(b, []byte(a[0]))
+ for i := 1; i < n; i++ {
+ b = append(b, ',')
+ b = appendArrayQuotedBytes(b, []byte(a[i]))
+ }
+
+ return string(append(b, '}')), nil
+ }
+
+ return "{}", nil
+}
+
+// appendArray appends rv to the buffer, returning the extended buffer and
+// the delimiter used between elements.
+//
+// It panics when n <= 0 or rv's Kind is not reflect.Array nor reflect.Slice.
+func appendArray(b []byte, rv reflect.Value, n int) ([]byte, string, error) {
+ var del string
+ var err error
+
+ b = append(b, '{')
+
+ if b, del, err = appendArrayElement(b, rv.Index(0)); err != nil {
+ return b, del, err
+ }
+
+ for i := 1; i < n; i++ {
+ b = append(b, del...)
+ if b, del, err = appendArrayElement(b, rv.Index(i)); err != nil {
+ return b, del, err
+ }
+ }
+
+ return append(b, '}'), del, nil
+}
+
+// appendArrayElement appends rv to the buffer, returning the extended buffer
+// and the delimiter to use before the next element.
+//
+// When rv's Kind is neither reflect.Array nor reflect.Slice, it is converted
+// using driver.DefaultParameterConverter and the resulting []byte or string
+// is double-quoted.
+//
+// See http://www.postgresql.org/docs/current/static/arrays.html#ARRAYS-IO
+func appendArrayElement(b []byte, rv reflect.Value) ([]byte, string, error) {
+ if k := rv.Kind(); k == reflect.Array || k == reflect.Slice {
+ if t := rv.Type(); t != typeByteSlice && !t.Implements(typeDriverValuer) {
+ if n := rv.Len(); n > 0 {
+ return appendArray(b, rv, n)
+ }
+
+ return b, "", nil
+ }
+ }
+
+ var del string = ","
+ var err error
+ var iv interface{} = rv.Interface()
+
+ if ad, ok := iv.(ArrayDelimiter); ok {
+ del = ad.ArrayDelimiter()
+ }
+
+ if iv, err = driver.DefaultParameterConverter.ConvertValue(iv); err != nil {
+ return b, del, err
+ }
+
+ switch v := iv.(type) {
+ case nil:
+ return append(b, "NULL"...), del, nil
+ case []byte:
+ return appendArrayQuotedBytes(b, v), del, nil
+ case string:
+ return appendArrayQuotedBytes(b, []byte(v)), del, nil
+ }
+
+ b, err = appendValue(b, iv)
+ return b, del, err
+}
+
+func appendArrayQuotedBytes(b, v []byte) []byte {
+ b = append(b, '"')
+ for {
+ i := bytes.IndexAny(v, `"\`)
+ if i < 0 {
+ b = append(b, v...)
+ break
+ }
+ if i > 0 {
+ b = append(b, v[:i]...)
+ }
+ b = append(b, '\\', v[i])
+ v = v[i+1:]
+ }
+ return append(b, '"')
+}
+
+func appendValue(b []byte, v driver.Value) ([]byte, error) {
+ return append(b, encode(nil, v, 0)...), nil
+}
+
+// parseArray extracts the dimensions and elements of an array represented in
+// text format. Only representations emitted by the backend are supported.
+// Notably, whitespace around brackets and delimiters is significant, and NULL
+// is case-sensitive.
+//
+// See http://www.postgresql.org/docs/current/static/arrays.html#ARRAYS-IO
+func parseArray(src, del []byte) (dims []int, elems [][]byte, err error) {
+ var depth, i int
+
+ if len(src) < 1 || src[0] != '{' {
+ return nil, nil, fmt.Errorf("pq: unable to parse array; expected %q at offset %d", '{', 0)
+ }
+
+Open:
+ for i < len(src) {
+ switch src[i] {
+ case '{':
+ depth++
+ i++
+ case '}':
+ elems = make([][]byte, 0)
+ goto Close
+ default:
+ break Open
+ }
+ }
+ dims = make([]int, i)
+
+Element:
+ for i < len(src) {
+ switch src[i] {
+ case '{':
+ depth++
+ dims[depth-1] = 0
+ i++
+ case '"':
+ var elem = []byte{}
+ var escape bool
+ for i++; i < len(src); i++ {
+ if escape {
+ elem = append(elem, src[i])
+ escape = false
+ } else {
+ switch src[i] {
+ default:
+ elem = append(elem, src[i])
+ case '\\':
+ escape = true
+ case '"':
+ elems = append(elems, elem)
+ i++
+ break Element
+ }
+ }
+ }
+ default:
+ for start := i; i < len(src); i++ {
+ if bytes.HasPrefix(src[i:], del) || src[i] == '}' {
+ elem := src[start:i]
+ if len(elem) == 0 {
+ return nil, nil, fmt.Errorf("pq: unable to parse array; unexpected %q at offset %d", src[i], i)
+ }
+ if bytes.Equal(elem, []byte("NULL")) {
+ elem = nil
+ }
+ elems = append(elems, elem)
+ break Element
+ }
+ }
+ }
+ }
+
+ for i < len(src) {
+ if bytes.HasPrefix(src[i:], del) {
+ dims[depth-1]++
+ i += len(del)
+ goto Element
+ } else if src[i] == '}' {
+ dims[depth-1]++
+ depth--
+ i++
+ } else {
+ return nil, nil, fmt.Errorf("pq: unable to parse array; unexpected %q at offset %d", src[i], i)
+ }
+ }
+
+Close:
+ for i < len(src) {
+ if src[i] == '}' && depth > 0 {
+ depth--
+ i++
+ } else {
+ return nil, nil, fmt.Errorf("pq: unable to parse array; unexpected %q at offset %d", src[i], i)
+ }
+ }
+ if depth > 0 {
+ err = fmt.Errorf("pq: unable to parse array; expected %q at offset %d", '}', i)
+ }
+ if err == nil {
+ for _, d := range dims {
+ if (len(elems) % d) != 0 {
+ err = fmt.Errorf("pq: multidimensional arrays must have elements with matching dimensions")
+ }
+ }
+ }
+ return
+}
+
+func scanLinearArray(src, del []byte, typ string) (elems [][]byte, err error) {
+ dims, elems, err := parseArray(src, del)
+ if err != nil {
+ return nil, err
+ }
+ if len(dims) > 1 {
+ return nil, fmt.Errorf("pq: cannot convert ARRAY%s to %s", strings.Replace(fmt.Sprint(dims), " ", "][", -1), typ)
+ }
+ return elems, err
+}
diff --git a/vendor/github.com/lib/pq/array_test.go b/vendor/github.com/lib/pq/array_test.go
new file mode 100644
index 000000000..96402fd4a
--- /dev/null
+++ b/vendor/github.com/lib/pq/array_test.go
@@ -0,0 +1,1153 @@
+package pq
+
+import (
+ "bytes"
+ "database/sql"
+ "database/sql/driver"
+ "math/rand"
+ "reflect"
+ "strings"
+ "testing"
+)
+
+func TestParseArray(t *testing.T) {
+ for _, tt := range []struct {
+ input string
+ delim string
+ dims []int
+ elems [][]byte
+ }{
+ {`{}`, `,`, nil, [][]byte{}},
+ {`{NULL}`, `,`, []int{1}, [][]byte{nil}},
+ {`{a}`, `,`, []int{1}, [][]byte{{'a'}}},
+ {`{a,b}`, `,`, []int{2}, [][]byte{{'a'}, {'b'}}},
+ {`{{a,b}}`, `,`, []int{1, 2}, [][]byte{{'a'}, {'b'}}},
+ {`{{a},{b}}`, `,`, []int{2, 1}, [][]byte{{'a'}, {'b'}}},
+ {`{{{a,b},{c,d},{e,f}}}`, `,`, []int{1, 3, 2}, [][]byte{
+ {'a'}, {'b'}, {'c'}, {'d'}, {'e'}, {'f'},
+ }},
+ {`{""}`, `,`, []int{1}, [][]byte{{}}},
+ {`{","}`, `,`, []int{1}, [][]byte{{','}}},
+ {`{",",","}`, `,`, []int{2}, [][]byte{{','}, {','}}},
+ {`{{",",","}}`, `,`, []int{1, 2}, [][]byte{{','}, {','}}},
+ {`{{","},{","}}`, `,`, []int{2, 1}, [][]byte{{','}, {','}}},
+ {`{{{",",","},{",",","},{",",","}}}`, `,`, []int{1, 3, 2}, [][]byte{
+ {','}, {','}, {','}, {','}, {','}, {','},
+ }},
+ {`{"\"}"}`, `,`, []int{1}, [][]byte{{'"', '}'}}},
+ {`{"\"","\""}`, `,`, []int{2}, [][]byte{{'"'}, {'"'}}},
+ {`{{"\"","\""}}`, `,`, []int{1, 2}, [][]byte{{'"'}, {'"'}}},
+ {`{{"\""},{"\""}}`, `,`, []int{2, 1}, [][]byte{{'"'}, {'"'}}},
+ {`{{{"\"","\""},{"\"","\""},{"\"","\""}}}`, `,`, []int{1, 3, 2}, [][]byte{
+ {'"'}, {'"'}, {'"'}, {'"'}, {'"'}, {'"'},
+ }},
+ {`{axyzb}`, `xyz`, []int{2}, [][]byte{{'a'}, {'b'}}},
+ } {
+ dims, elems, err := parseArray([]byte(tt.input), []byte(tt.delim))
+
+ if err != nil {
+ t.Fatalf("Expected no error for %q, got %q", tt.input, err)
+ }
+ if !reflect.DeepEqual(dims, tt.dims) {
+ t.Errorf("Expected %v dimensions for %q, got %v", tt.dims, tt.input, dims)
+ }
+ if !reflect.DeepEqual(elems, tt.elems) {
+ t.Errorf("Expected %v elements for %q, got %v", tt.elems, tt.input, elems)
+ }
+ }
+}
+
+func TestParseArrayError(t *testing.T) {
+ for _, tt := range []struct {
+ input, err string
+ }{
+ {``, "expected '{' at offset 0"},
+ {`x`, "expected '{' at offset 0"},
+ {`}`, "expected '{' at offset 0"},
+ {`{`, "expected '}' at offset 1"},
+ {`{{}`, "expected '}' at offset 3"},
+ {`{}}`, "unexpected '}' at offset 2"},
+ {`{,}`, "unexpected ',' at offset 1"},
+ {`{,x}`, "unexpected ',' at offset 1"},
+ {`{x,}`, "unexpected '}' at offset 3"},
+ {`{""x}`, "unexpected 'x' at offset 3"},
+ {`{{a},{b,c}}`, "multidimensional arrays must have elements with matching dimensions"},
+ } {
+ _, _, err := parseArray([]byte(tt.input), []byte{','})
+
+ if err == nil {
+ t.Fatalf("Expected error for %q, got none", tt.input)
+ }
+ if !strings.Contains(err.Error(), tt.err) {
+ t.Errorf("Expected error to contain %q for %q, got %q", tt.err, tt.input, err)
+ }
+ }
+}
+
+func TestArrayScanner(t *testing.T) {
+ var s sql.Scanner
+
+ s = Array(&[]bool{})
+ if _, ok := s.(*BoolArray); !ok {
+ t.Errorf("Expected *BoolArray, got %T", s)
+ }
+
+ s = Array(&[]float64{})
+ if _, ok := s.(*Float64Array); !ok {
+ t.Errorf("Expected *Float64Array, got %T", s)
+ }
+
+ s = Array(&[]int64{})
+ if _, ok := s.(*Int64Array); !ok {
+ t.Errorf("Expected *Int64Array, got %T", s)
+ }
+
+ s = Array(&[]string{})
+ if _, ok := s.(*StringArray); !ok {
+ t.Errorf("Expected *StringArray, got %T", s)
+ }
+
+ for _, tt := range []interface{}{
+ &[]sql.Scanner{},
+ &[][]bool{},
+ &[][]float64{},
+ &[][]int64{},
+ &[][]string{},
+ } {
+ s = Array(tt)
+ if _, ok := s.(GenericArray); !ok {
+ t.Errorf("Expected GenericArray for %T, got %T", tt, s)
+ }
+ }
+}
+
+func TestArrayValuer(t *testing.T) {
+ var v driver.Valuer
+
+ v = Array([]bool{})
+ if _, ok := v.(*BoolArray); !ok {
+ t.Errorf("Expected *BoolArray, got %T", v)
+ }
+
+ v = Array([]float64{})
+ if _, ok := v.(*Float64Array); !ok {
+ t.Errorf("Expected *Float64Array, got %T", v)
+ }
+
+ v = Array([]int64{})
+ if _, ok := v.(*Int64Array); !ok {
+ t.Errorf("Expected *Int64Array, got %T", v)
+ }
+
+ v = Array([]string{})
+ if _, ok := v.(*StringArray); !ok {
+ t.Errorf("Expected *StringArray, got %T", v)
+ }
+
+ for _, tt := range []interface{}{
+ nil,
+ []driver.Value{},
+ [][]bool{},
+ [][]float64{},
+ [][]int64{},
+ [][]string{},
+ } {
+ v = Array(tt)
+ if _, ok := v.(GenericArray); !ok {
+ t.Errorf("Expected GenericArray for %T, got %T", tt, v)
+ }
+ }
+}
+
+func TestBoolArrayScanUnsupported(t *testing.T) {
+ var arr BoolArray
+ err := arr.Scan(1)
+
+ if err == nil {
+ t.Fatal("Expected error when scanning from int")
+ }
+ if !strings.Contains(err.Error(), "int to BoolArray") {
+ t.Errorf("Expected type to be mentioned when scanning, got %q", err)
+ }
+}
+
+var BoolArrayStringTests = []struct {
+ str string
+ arr BoolArray
+}{
+ {`{}`, BoolArray{}},
+ {`{t}`, BoolArray{true}},
+ {`{f,t}`, BoolArray{false, true}},
+}
+
+func TestBoolArrayScanBytes(t *testing.T) {
+ for _, tt := range BoolArrayStringTests {
+ bytes := []byte(tt.str)
+ arr := BoolArray{true, true, true}
+ err := arr.Scan(bytes)
+
+ if err != nil {
+ t.Fatalf("Expected no error for %q, got %v", bytes, err)
+ }
+ if !reflect.DeepEqual(arr, tt.arr) {
+ t.Errorf("Expected %+v for %q, got %+v", tt.arr, bytes, arr)
+ }
+ }
+}
+
+func BenchmarkBoolArrayScanBytes(b *testing.B) {
+ var a BoolArray
+ var x interface{} = []byte(`{t,f,t,f,t,f,t,f,t,f}`)
+
+ for i := 0; i < b.N; i++ {
+ a = BoolArray{}
+ a.Scan(x)
+ }
+}
+
+func TestBoolArrayScanString(t *testing.T) {
+ for _, tt := range BoolArrayStringTests {
+ arr := BoolArray{true, true, true}
+ err := arr.Scan(tt.str)
+
+ if err != nil {
+ t.Fatalf("Expected no error for %q, got %v", tt.str, err)
+ }
+ if !reflect.DeepEqual(arr, tt.arr) {
+ t.Errorf("Expected %+v for %q, got %+v", tt.arr, tt.str, arr)
+ }
+ }
+}
+
+func TestBoolArrayScanError(t *testing.T) {
+ for _, tt := range []struct {
+ input, err string
+ }{
+ {``, "unable to parse array"},
+ {`{`, "unable to parse array"},
+ {`{{t},{f}}`, "cannot convert ARRAY[2][1] to BoolArray"},
+ {`{NULL}`, `could not parse boolean array index 0: invalid boolean ""`},
+ {`{a}`, `could not parse boolean array index 0: invalid boolean "a"`},
+ {`{t,b}`, `could not parse boolean array index 1: invalid boolean "b"`},
+ {`{t,f,cd}`, `could not parse boolean array index 2: invalid boolean "cd"`},
+ } {
+ arr := BoolArray{true, true, true}
+ err := arr.Scan(tt.input)
+
+ if err == nil {
+ t.Fatalf("Expected error for %q, got none", tt.input)
+ }
+ if !strings.Contains(err.Error(), tt.err) {
+ t.Errorf("Expected error to contain %q for %q, got %q", tt.err, tt.input, err)
+ }
+ if !reflect.DeepEqual(arr, BoolArray{true, true, true}) {
+ t.Errorf("Expected destination not to change for %q, got %+v", tt.input, arr)
+ }
+ }
+}
+
+func TestBoolArrayValue(t *testing.T) {
+ result, err := BoolArray(nil).Value()
+
+ if err != nil {
+ t.Fatalf("Expected no error for nil, got %v", err)
+ }
+ if result != nil {
+ t.Errorf("Expected nil, got %q", result)
+ }
+
+ result, err = BoolArray([]bool{}).Value()
+
+ if err != nil {
+ t.Fatalf("Expected no error for empty, got %v", err)
+ }
+ if expected := `{}`; !reflect.DeepEqual(result, expected) {
+ t.Errorf("Expected empty, got %q", result)
+ }
+
+ result, err = BoolArray([]bool{false, true, false}).Value()
+
+ if err != nil {
+ t.Fatalf("Expected no error, got %v", err)
+ }
+ if expected := `{f,t,f}`; !reflect.DeepEqual(result, expected) {
+ t.Errorf("Expected %q, got %q", expected, result)
+ }
+}
+
+func BenchmarkBoolArrayValue(b *testing.B) {
+ rand.Seed(1)
+ x := make([]bool, 10)
+ for i := 0; i < len(x); i++ {
+ x[i] = rand.Intn(2) == 0
+ }
+ a := BoolArray(x)
+
+ for i := 0; i < b.N; i++ {
+ a.Value()
+ }
+}
+
+func TestByteaArrayScanUnsupported(t *testing.T) {
+ var arr ByteaArray
+ err := arr.Scan(1)
+
+ if err == nil {
+ t.Fatal("Expected error when scanning from int")
+ }
+ if !strings.Contains(err.Error(), "int to ByteaArray") {
+ t.Errorf("Expected type to be mentioned when scanning, got %q", err)
+ }
+}
+
+var ByteaArrayStringTests = []struct {
+ str string
+ arr ByteaArray
+}{
+ {`{}`, ByteaArray{}},
+ {`{NULL}`, ByteaArray{nil}},
+ {`{"\\xfeff"}`, ByteaArray{{'\xFE', '\xFF'}}},
+ {`{"\\xdead","\\xbeef"}`, ByteaArray{{'\xDE', '\xAD'}, {'\xBE', '\xEF'}}},
+}
+
+func TestByteaArrayScanBytes(t *testing.T) {
+ for _, tt := range ByteaArrayStringTests {
+ bytes := []byte(tt.str)
+ arr := ByteaArray{{2}, {6}, {0, 0}}
+ err := arr.Scan(bytes)
+
+ if err != nil {
+ t.Fatalf("Expected no error for %q, got %v", bytes, err)
+ }
+ if !reflect.DeepEqual(arr, tt.arr) {
+ t.Errorf("Expected %+v for %q, got %+v", tt.arr, bytes, arr)
+ }
+ }
+}
+
+func BenchmarkByteaArrayScanBytes(b *testing.B) {
+ var a ByteaArray
+ var x interface{} = []byte(`{"\\xfe","\\xff","\\xdead","\\xbeef","\\xfe","\\xff","\\xdead","\\xbeef","\\xfe","\\xff"}`)
+
+ for i := 0; i < b.N; i++ {
+ a = ByteaArray{}
+ a.Scan(x)
+ }
+}
+
+func TestByteaArrayScanString(t *testing.T) {
+ for _, tt := range ByteaArrayStringTests {
+ arr := ByteaArray{{2}, {6}, {0, 0}}
+ err := arr.Scan(tt.str)
+
+ if err != nil {
+ t.Fatalf("Expected no error for %q, got %v", tt.str, err)
+ }
+ if !reflect.DeepEqual(arr, tt.arr) {
+ t.Errorf("Expected %+v for %q, got %+v", tt.arr, tt.str, arr)
+ }
+ }
+}
+
+func TestByteaArrayScanError(t *testing.T) {
+ for _, tt := range []struct {
+ input, err string
+ }{
+ {``, "unable to parse array"},
+ {`{`, "unable to parse array"},
+ {`{{"\\xfeff"},{"\\xbeef"}}`, "cannot convert ARRAY[2][1] to ByteaArray"},
+ {`{"\\abc"}`, "could not parse bytea array index 0: could not parse bytea value"},
+ } {
+ arr := ByteaArray{{2}, {6}, {0, 0}}
+ err := arr.Scan(tt.input)
+
+ if err == nil {
+ t.Fatalf("Expected error for %q, got none", tt.input)
+ }
+ if !strings.Contains(err.Error(), tt.err) {
+ t.Errorf("Expected error to contain %q for %q, got %q", tt.err, tt.input, err)
+ }
+ if !reflect.DeepEqual(arr, ByteaArray{{2}, {6}, {0, 0}}) {
+ t.Errorf("Expected destination not to change for %q, got %+v", tt.input, arr)
+ }
+ }
+}
+
+func TestByteaArrayValue(t *testing.T) {
+ result, err := ByteaArray(nil).Value()
+
+ if err != nil {
+ t.Fatalf("Expected no error for nil, got %v", err)
+ }
+ if result != nil {
+ t.Errorf("Expected nil, got %q", result)
+ }
+
+ result, err = ByteaArray([][]byte{}).Value()
+
+ if err != nil {
+ t.Fatalf("Expected no error for empty, got %v", err)
+ }
+ if expected := `{}`; !reflect.DeepEqual(result, expected) {
+ t.Errorf("Expected empty, got %q", result)
+ }
+
+ result, err = ByteaArray([][]byte{{'\xDE', '\xAD', '\xBE', '\xEF'}, {'\xFE', '\xFF'}, {}}).Value()
+
+ if err != nil {
+ t.Fatalf("Expected no error, got %v", err)
+ }
+ if expected := `{"\\xdeadbeef","\\xfeff","\\x"}`; !reflect.DeepEqual(result, expected) {
+ t.Errorf("Expected %q, got %q", expected, result)
+ }
+}
+
+func BenchmarkByteaArrayValue(b *testing.B) {
+ rand.Seed(1)
+ x := make([][]byte, 10)
+ for i := 0; i < len(x); i++ {
+ x[i] = make([]byte, len(x))
+ for j := 0; j < len(x); j++ {
+ x[i][j] = byte(rand.Int())
+ }
+ }
+ a := ByteaArray(x)
+
+ for i := 0; i < b.N; i++ {
+ a.Value()
+ }
+}
+
+func TestFloat64ArrayScanUnsupported(t *testing.T) {
+ var arr Float64Array
+ err := arr.Scan(true)
+
+ if err == nil {
+ t.Fatal("Expected error when scanning from bool")
+ }
+ if !strings.Contains(err.Error(), "bool to Float64Array") {
+ t.Errorf("Expected type to be mentioned when scanning, got %q", err)
+ }
+}
+
+var Float64ArrayStringTests = []struct {
+ str string
+ arr Float64Array
+}{
+ {`{}`, Float64Array{}},
+ {`{1.2}`, Float64Array{1.2}},
+ {`{3.456,7.89}`, Float64Array{3.456, 7.89}},
+ {`{3,1,2}`, Float64Array{3, 1, 2}},
+}
+
+func TestFloat64ArrayScanBytes(t *testing.T) {
+ for _, tt := range Float64ArrayStringTests {
+ bytes := []byte(tt.str)
+ arr := Float64Array{5, 5, 5}
+ err := arr.Scan(bytes)
+
+ if err != nil {
+ t.Fatalf("Expected no error for %q, got %v", bytes, err)
+ }
+ if !reflect.DeepEqual(arr, tt.arr) {
+ t.Errorf("Expected %+v for %q, got %+v", tt.arr, bytes, arr)
+ }
+ }
+}
+
+func BenchmarkFloat64ArrayScanBytes(b *testing.B) {
+ var a Float64Array
+ var x interface{} = []byte(`{1.2,3.4,5.6,7.8,9.01,2.34,5.67,8.90,1.234,5.678}`)
+
+ for i := 0; i < b.N; i++ {
+ a = Float64Array{}
+ a.Scan(x)
+ }
+}
+
+func TestFloat64ArrayScanString(t *testing.T) {
+ for _, tt := range Float64ArrayStringTests {
+ arr := Float64Array{5, 5, 5}
+ err := arr.Scan(tt.str)
+
+ if err != nil {
+ t.Fatalf("Expected no error for %q, got %v", tt.str, err)
+ }
+ if !reflect.DeepEqual(arr, tt.arr) {
+ t.Errorf("Expected %+v for %q, got %+v", tt.arr, tt.str, arr)
+ }
+ }
+}
+
+func TestFloat64ArrayScanError(t *testing.T) {
+ for _, tt := range []struct {
+ input, err string
+ }{
+ {``, "unable to parse array"},
+ {`{`, "unable to parse array"},
+ {`{{5.6},{7.8}}`, "cannot convert ARRAY[2][1] to Float64Array"},
+ {`{NULL}`, "parsing array element index 0:"},
+ {`{a}`, "parsing array element index 0:"},
+ {`{5.6,a}`, "parsing array element index 1:"},
+ {`{5.6,7.8,a}`, "parsing array element index 2:"},
+ } {
+ arr := Float64Array{5, 5, 5}
+ err := arr.Scan(tt.input)
+
+ if err == nil {
+ t.Fatalf("Expected error for %q, got none", tt.input)
+ }
+ if !strings.Contains(err.Error(), tt.err) {
+ t.Errorf("Expected error to contain %q for %q, got %q", tt.err, tt.input, err)
+ }
+ if !reflect.DeepEqual(arr, Float64Array{5, 5, 5}) {
+ t.Errorf("Expected destination not to change for %q, got %+v", tt.input, arr)
+ }
+ }
+}
+
+func TestFloat64ArrayValue(t *testing.T) {
+ result, err := Float64Array(nil).Value()
+
+ if err != nil {
+ t.Fatalf("Expected no error for nil, got %v", err)
+ }
+ if result != nil {
+ t.Errorf("Expected nil, got %q", result)
+ }
+
+ result, err = Float64Array([]float64{}).Value()
+
+ if err != nil {
+ t.Fatalf("Expected no error for empty, got %v", err)
+ }
+ if expected := `{}`; !reflect.DeepEqual(result, expected) {
+ t.Errorf("Expected empty, got %q", result)
+ }
+
+ result, err = Float64Array([]float64{1.2, 3.4, 5.6}).Value()
+
+ if err != nil {
+ t.Fatalf("Expected no error, got %v", err)
+ }
+ if expected := `{1.2,3.4,5.6}`; !reflect.DeepEqual(result, expected) {
+ t.Errorf("Expected %q, got %q", expected, result)
+ }
+}
+
+func BenchmarkFloat64ArrayValue(b *testing.B) {
+ rand.Seed(1)
+ x := make([]float64, 10)
+ for i := 0; i < len(x); i++ {
+ x[i] = rand.NormFloat64()
+ }
+ a := Float64Array(x)
+
+ for i := 0; i < b.N; i++ {
+ a.Value()
+ }
+}
+
+func TestInt64ArrayScanUnsupported(t *testing.T) {
+ var arr Int64Array
+ err := arr.Scan(true)
+
+ if err == nil {
+ t.Fatal("Expected error when scanning from bool")
+ }
+ if !strings.Contains(err.Error(), "bool to Int64Array") {
+ t.Errorf("Expected type to be mentioned when scanning, got %q", err)
+ }
+}
+
+var Int64ArrayStringTests = []struct {
+ str string
+ arr Int64Array
+}{
+ {`{}`, Int64Array{}},
+ {`{12}`, Int64Array{12}},
+ {`{345,678}`, Int64Array{345, 678}},
+}
+
+func TestInt64ArrayScanBytes(t *testing.T) {
+ for _, tt := range Int64ArrayStringTests {
+ bytes := []byte(tt.str)
+ arr := Int64Array{5, 5, 5}
+ err := arr.Scan(bytes)
+
+ if err != nil {
+ t.Fatalf("Expected no error for %q, got %v", bytes, err)
+ }
+ if !reflect.DeepEqual(arr, tt.arr) {
+ t.Errorf("Expected %+v for %q, got %+v", tt.arr, bytes, arr)
+ }
+ }
+}
+
+func BenchmarkInt64ArrayScanBytes(b *testing.B) {
+ var a Int64Array
+ var x interface{} = []byte(`{1,2,3,4,5,6,7,8,9,0}`)
+
+ for i := 0; i < b.N; i++ {
+ a = Int64Array{}
+ a.Scan(x)
+ }
+}
+
+func TestInt64ArrayScanString(t *testing.T) {
+ for _, tt := range Int64ArrayStringTests {
+ arr := Int64Array{5, 5, 5}
+ err := arr.Scan(tt.str)
+
+ if err != nil {
+ t.Fatalf("Expected no error for %q, got %v", tt.str, err)
+ }
+ if !reflect.DeepEqual(arr, tt.arr) {
+ t.Errorf("Expected %+v for %q, got %+v", tt.arr, tt.str, arr)
+ }
+ }
+}
+
+func TestInt64ArrayScanError(t *testing.T) {
+ for _, tt := range []struct {
+ input, err string
+ }{
+ {``, "unable to parse array"},
+ {`{`, "unable to parse array"},
+ {`{{5},{6}}`, "cannot convert ARRAY[2][1] to Int64Array"},
+ {`{NULL}`, "parsing array element index 0:"},
+ {`{a}`, "parsing array element index 0:"},
+ {`{5,a}`, "parsing array element index 1:"},
+ {`{5,6,a}`, "parsing array element index 2:"},
+ } {
+ arr := Int64Array{5, 5, 5}
+ err := arr.Scan(tt.input)
+
+ if err == nil {
+ t.Fatalf("Expected error for %q, got none", tt.input)
+ }
+ if !strings.Contains(err.Error(), tt.err) {
+ t.Errorf("Expected error to contain %q for %q, got %q", tt.err, tt.input, err)
+ }
+ if !reflect.DeepEqual(arr, Int64Array{5, 5, 5}) {
+ t.Errorf("Expected destination not to change for %q, got %+v", tt.input, arr)
+ }
+ }
+}
+
+func TestInt64ArrayValue(t *testing.T) {
+ result, err := Int64Array(nil).Value()
+
+ if err != nil {
+ t.Fatalf("Expected no error for nil, got %v", err)
+ }
+ if result != nil {
+ t.Errorf("Expected nil, got %q", result)
+ }
+
+ result, err = Int64Array([]int64{}).Value()
+
+ if err != nil {
+ t.Fatalf("Expected no error for empty, got %v", err)
+ }
+ if expected := `{}`; !reflect.DeepEqual(result, expected) {
+ t.Errorf("Expected empty, got %q", result)
+ }
+
+ result, err = Int64Array([]int64{1, 2, 3}).Value()
+
+ if err != nil {
+ t.Fatalf("Expected no error, got %v", err)
+ }
+ if expected := `{1,2,3}`; !reflect.DeepEqual(result, expected) {
+ t.Errorf("Expected %q, got %q", expected, result)
+ }
+}
+
+func BenchmarkInt64ArrayValue(b *testing.B) {
+ rand.Seed(1)
+ x := make([]int64, 10)
+ for i := 0; i < len(x); i++ {
+ x[i] = rand.Int63()
+ }
+ a := Int64Array(x)
+
+ for i := 0; i < b.N; i++ {
+ a.Value()
+ }
+}
+
+func TestStringArrayScanUnsupported(t *testing.T) {
+ var arr StringArray
+ err := arr.Scan(true)
+
+ if err == nil {
+ t.Fatal("Expected error when scanning from bool")
+ }
+ if !strings.Contains(err.Error(), "bool to StringArray") {
+ t.Errorf("Expected type to be mentioned when scanning, got %q", err)
+ }
+}
+
+var StringArrayStringTests = []struct {
+ str string
+ arr StringArray
+}{
+ {`{}`, StringArray{}},
+ {`{t}`, StringArray{"t"}},
+ {`{f,1}`, StringArray{"f", "1"}},
+ {`{"a\\b","c d",","}`, StringArray{"a\\b", "c d", ","}},
+}
+
+func TestStringArrayScanBytes(t *testing.T) {
+ for _, tt := range StringArrayStringTests {
+ bytes := []byte(tt.str)
+ arr := StringArray{"x", "x", "x"}
+ err := arr.Scan(bytes)
+
+ if err != nil {
+ t.Fatalf("Expected no error for %q, got %v", bytes, err)
+ }
+ if !reflect.DeepEqual(arr, tt.arr) {
+ t.Errorf("Expected %+v for %q, got %+v", tt.arr, bytes, arr)
+ }
+ }
+}
+
+func BenchmarkStringArrayScanBytes(b *testing.B) {
+ var a StringArray
+ var x interface{} = []byte(`{a,b,c,d,e,f,g,h,i,j}`)
+ var y interface{} = []byte(`{"\a","\b","\c","\d","\e","\f","\g","\h","\i","\j"}`)
+
+ for i := 0; i < b.N; i++ {
+ a = StringArray{}
+ a.Scan(x)
+ a = StringArray{}
+ a.Scan(y)
+ }
+}
+
+func TestStringArrayScanString(t *testing.T) {
+ for _, tt := range StringArrayStringTests {
+ arr := StringArray{"x", "x", "x"}
+ err := arr.Scan(tt.str)
+
+ if err != nil {
+ t.Fatalf("Expected no error for %q, got %v", tt.str, err)
+ }
+ if !reflect.DeepEqual(arr, tt.arr) {
+ t.Errorf("Expected %+v for %q, got %+v", tt.arr, tt.str, arr)
+ }
+ }
+}
+
+func TestStringArrayScanError(t *testing.T) {
+ for _, tt := range []struct {
+ input, err string
+ }{
+ {``, "unable to parse array"},
+ {`{`, "unable to parse array"},
+ {`{{a},{b}}`, "cannot convert ARRAY[2][1] to StringArray"},
+ {`{NULL}`, "parsing array element index 0: cannot convert nil to string"},
+ {`{a,NULL}`, "parsing array element index 1: cannot convert nil to string"},
+ {`{a,b,NULL}`, "parsing array element index 2: cannot convert nil to string"},
+ } {
+ arr := StringArray{"x", "x", "x"}
+ err := arr.Scan(tt.input)
+
+ if err == nil {
+ t.Fatalf("Expected error for %q, got none", tt.input)
+ }
+ if !strings.Contains(err.Error(), tt.err) {
+ t.Errorf("Expected error to contain %q for %q, got %q", tt.err, tt.input, err)
+ }
+ if !reflect.DeepEqual(arr, StringArray{"x", "x", "x"}) {
+ t.Errorf("Expected destination not to change for %q, got %+v", tt.input, arr)
+ }
+ }
+}
+
+func TestStringArrayValue(t *testing.T) {
+ result, err := StringArray(nil).Value()
+
+ if err != nil {
+ t.Fatalf("Expected no error for nil, got %v", err)
+ }
+ if result != nil {
+ t.Errorf("Expected nil, got %q", result)
+ }
+
+ result, err = StringArray([]string{}).Value()
+
+ if err != nil {
+ t.Fatalf("Expected no error for empty, got %v", err)
+ }
+ if expected := `{}`; !reflect.DeepEqual(result, expected) {
+ t.Errorf("Expected empty, got %q", result)
+ }
+
+ result, err = StringArray([]string{`a`, `\b`, `c"`, `d,e`}).Value()
+
+ if err != nil {
+ t.Fatalf("Expected no error, got %v", err)
+ }
+ if expected := `{"a","\\b","c\"","d,e"}`; !reflect.DeepEqual(result, expected) {
+ t.Errorf("Expected %q, got %q", expected, result)
+ }
+}
+
+func BenchmarkStringArrayValue(b *testing.B) {
+ x := make([]string, 10)
+ for i := 0; i < len(x); i++ {
+ x[i] = strings.Repeat(`abc"def\ghi`, 5)
+ }
+ a := StringArray(x)
+
+ for i := 0; i < b.N; i++ {
+ a.Value()
+ }
+}
+
+func TestGenericArrayScanUnsupported(t *testing.T) {
+ var s string
+ var ss []string
+
+ for _, tt := range []struct {
+ src, dest interface{}
+ err string
+ }{
+ {nil, nil, "destination <nil> is not a pointer to array or slice"},
+ {nil, true, "destination bool is not a pointer to array or slice"},
+ {nil, &s, "destination *string is not a pointer to array or slice"},
+ {nil, ss, "destination []string is not a pointer to array or slice"},
+ {true, &ss, "bool to []string"},
+ {`{{x}}`, &ss, "multidimensional ARRAY[1][1] is not implemented"},
+ {`{{x},{x}}`, &ss, "multidimensional ARRAY[2][1] is not implemented"},
+ {`{x}`, &ss, "scanning to string is not implemented"},
+ } {
+ err := GenericArray{tt.dest}.Scan(tt.src)
+
+ if err == nil {
+ t.Fatalf("Expected error for [%#v %#v]", tt.src, tt.dest)
+ }
+ if !strings.Contains(err.Error(), tt.err) {
+ t.Errorf("Expected error to contain %q for [%#v %#v], got %q", tt.err, tt.src, tt.dest, err)
+ }
+ }
+}
+
+func TestGenericArrayScanScannerArrayBytes(t *testing.T) {
+ src, expected, nsa := []byte(`{NULL,abc,"\""}`),
+ [3]sql.NullString{{}, {String: `abc`, Valid: true}, {String: `"`, Valid: true}},
+ [3]sql.NullString{{String: ``, Valid: true}, {}, {}}
+
+ if err := (GenericArray{&nsa}).Scan(src); err != nil {
+ t.Fatalf("Expected no error, got %v", err)
+ }
+ if !reflect.DeepEqual(nsa, expected) {
+ t.Errorf("Expected %v, got %v", expected, nsa)
+ }
+}
+
+func TestGenericArrayScanScannerArrayString(t *testing.T) {
+ src, expected, nsa := `{NULL,"\"",xyz}`,
+ [3]sql.NullString{{}, {String: `"`, Valid: true}, {String: `xyz`, Valid: true}},
+ [3]sql.NullString{{String: ``, Valid: true}, {}, {}}
+
+ if err := (GenericArray{&nsa}).Scan(src); err != nil {
+ t.Fatalf("Expected no error, got %v", err)
+ }
+ if !reflect.DeepEqual(nsa, expected) {
+ t.Errorf("Expected %v, got %v", expected, nsa)
+ }
+}
+
+func TestGenericArrayScanScannerSliceBytes(t *testing.T) {
+ src, expected, nss := []byte(`{NULL,abc,"\""}`),
+ []sql.NullString{{}, {String: `abc`, Valid: true}, {String: `"`, Valid: true}},
+ []sql.NullString{{String: ``, Valid: true}, {}, {}, {}, {}}
+
+ if err := (GenericArray{&nss}).Scan(src); err != nil {
+ t.Fatalf("Expected no error, got %v", err)
+ }
+ if !reflect.DeepEqual(nss, expected) {
+ t.Errorf("Expected %v, got %v", expected, nss)
+ }
+}
+
+func BenchmarkGenericArrayScanScannerSliceBytes(b *testing.B) {
+ var a GenericArray
+ var x interface{} = []byte(`{a,b,c,d,e,f,g,h,i,j}`)
+ var y interface{} = []byte(`{"\a","\b","\c","\d","\e","\f","\g","\h","\i","\j"}`)
+
+ for i := 0; i < b.N; i++ {
+ a = GenericArray{new([]sql.NullString)}
+ a.Scan(x)
+ a = GenericArray{new([]sql.NullString)}
+ a.Scan(y)
+ }
+}
+
+func TestGenericArrayScanScannerSliceString(t *testing.T) {
+ src, expected, nss := `{NULL,"\"",xyz}`,
+ []sql.NullString{{}, {String: `"`, Valid: true}, {String: `xyz`, Valid: true}},
+ []sql.NullString{{String: ``, Valid: true}, {}, {}}
+
+ if err := (GenericArray{&nss}).Scan(src); err != nil {
+ t.Fatalf("Expected no error, got %v", err)
+ }
+ if !reflect.DeepEqual(nss, expected) {
+ t.Errorf("Expected %v, got %v", expected, nss)
+ }
+}
+
+type TildeNullInt64 struct{ sql.NullInt64 }
+
+func (TildeNullInt64) ArrayDelimiter() string { return "~" }
+
+func TestGenericArrayScanDelimiter(t *testing.T) {
+ src, expected, tnis := `{12~NULL~76}`,
+ []TildeNullInt64{{sql.NullInt64{Int64: 12, Valid: true}}, {}, {sql.NullInt64{Int64: 76, Valid: true}}},
+ []TildeNullInt64{{sql.NullInt64{Int64: 0, Valid: true}}, {}}
+
+ if err := (GenericArray{&tnis}).Scan(src); err != nil {
+ t.Fatalf("Expected no error for %#v, got %v", src, err)
+ }
+ if !reflect.DeepEqual(tnis, expected) {
+ t.Errorf("Expected %v for %#v, got %v", expected, src, tnis)
+ }
+}
+
+func TestGenericArrayScanErrors(t *testing.T) {
+ var sa [1]string
+ var nis []sql.NullInt64
+ var pss *[]string
+
+ for _, tt := range []struct {
+ src, dest interface{}
+ err string
+ }{
+ {nil, pss, "destination *[]string is nil"},
+ {`{`, &sa, "unable to parse"},
+ {`{}`, &sa, "cannot convert ARRAY[0] to [1]string"},
+ {`{x,x}`, &sa, "cannot convert ARRAY[2] to [1]string"},
+ {`{x}`, &nis, `parsing array element index 0: converting`},
+ } {
+ err := GenericArray{tt.dest}.Scan(tt.src)
+
+ if err == nil {
+ t.Fatalf("Expected error for [%#v %#v]", tt.src, tt.dest)
+ }
+ if !strings.Contains(err.Error(), tt.err) {
+ t.Errorf("Expected error to contain %q for [%#v %#v], got %q", tt.err, tt.src, tt.dest, err)
+ }
+ }
+}
+
+func TestGenericArrayValueUnsupported(t *testing.T) {
+ _, err := GenericArray{true}.Value()
+
+ if err == nil {
+ t.Fatal("Expected error for bool")
+ }
+ if !strings.Contains(err.Error(), "bool to array") {
+ t.Errorf("Expected type to be mentioned, got %q", err)
+ }
+}
+
+type ByteArrayValuer [1]byte
+type ByteSliceValuer []byte
+type FuncArrayValuer struct {
+ delimiter func() string
+ value func() (driver.Value, error)
+}
+
+func (a ByteArrayValuer) Value() (driver.Value, error) { return a[:], nil }
+func (b ByteSliceValuer) Value() (driver.Value, error) { return []byte(b), nil }
+func (f FuncArrayValuer) ArrayDelimiter() string { return f.delimiter() }
+func (f FuncArrayValuer) Value() (driver.Value, error) { return f.value() }
+
+func TestGenericArrayValue(t *testing.T) {
+ result, err := GenericArray{nil}.Value()
+
+ if err != nil {
+ t.Fatalf("Expected no error for nil, got %v", err)
+ }
+ if result != nil {
+ t.Errorf("Expected nil, got %q", result)
+ }
+
+ Tilde := func(v driver.Value) FuncArrayValuer {
+ return FuncArrayValuer{
+ func() string { return "~" },
+ func() (driver.Value, error) { return v, nil }}
+ }
+
+ for _, tt := range []struct {
+ result string
+ input interface{}
+ }{
+ {`{}`, []bool{}},
+ {`{true}`, []bool{true}},
+ {`{true,false}`, []bool{true, false}},
+ {`{true,false}`, [2]bool{true, false}},
+
+ {`{}`, [][]int{{}}},
+ {`{}`, [][]int{{}, {}}},
+ {`{{1}}`, [][]int{{1}}},
+ {`{{1},{2}}`, [][]int{{1}, {2}}},
+ {`{{1,2},{3,4}}`, [][]int{{1, 2}, {3, 4}}},
+ {`{{1,2},{3,4}}`, [2][2]int{{1, 2}, {3, 4}}},
+
+ {`{"a","\\b","c\"","d,e"}`, []string{`a`, `\b`, `c"`, `d,e`}},
+ {`{"a","\\b","c\"","d,e"}`, [][]byte{{'a'}, {'\\', 'b'}, {'c', '"'}, {'d', ',', 'e'}}},
+
+ {`{NULL}`, []*int{nil}},
+ {`{0,NULL}`, []*int{new(int), nil}},
+
+ {`{NULL}`, []sql.NullString{{}}},
+ {`{"\"",NULL}`, []sql.NullString{{String: `"`, Valid: true}, {}}},
+
+ {`{"a","b"}`, []ByteArrayValuer{{'a'}, {'b'}}},
+ {`{{"a","b"},{"c","d"}}`, [][]ByteArrayValuer{{{'a'}, {'b'}}, {{'c'}, {'d'}}}},
+
+ {`{"e","f"}`, []ByteSliceValuer{{'e'}, {'f'}}},
+ {`{{"e","f"},{"g","h"}}`, [][]ByteSliceValuer{{{'e'}, {'f'}}, {{'g'}, {'h'}}}},
+
+ {`{1~2}`, []FuncArrayValuer{Tilde(int64(1)), Tilde(int64(2))}},
+ {`{{1~2}~{3~4}}`, [][]FuncArrayValuer{{Tilde(int64(1)), Tilde(int64(2))}, {Tilde(int64(3)), Tilde(int64(4))}}},
+ } {
+ result, err := GenericArray{tt.input}.Value()
+
+ if err != nil {
+ t.Fatalf("Expected no error for %q, got %v", tt.input, err)
+ }
+ if !reflect.DeepEqual(result, tt.result) {
+ t.Errorf("Expected %q for %q, got %q", tt.result, tt.input, result)
+ }
+ }
+}
+
+func TestGenericArrayValueErrors(t *testing.T) {
+ var v []interface{}
+
+ v = []interface{}{func() {}}
+ if _, err := (GenericArray{v}).Value(); err == nil {
+ t.Errorf("Expected error for %q, got nil", v)
+ }
+
+ v = []interface{}{nil, func() {}}
+ if _, err := (GenericArray{v}).Value(); err == nil {
+ t.Errorf("Expected error for %q, got nil", v)
+ }
+}
+
+func BenchmarkGenericArrayValueBools(b *testing.B) {
+ rand.Seed(1)
+ x := make([]bool, 10)
+ for i := 0; i < len(x); i++ {
+ x[i] = rand.Intn(2) == 0
+ }
+ a := GenericArray{x}
+
+ for i := 0; i < b.N; i++ {
+ a.Value()
+ }
+}
+
+func BenchmarkGenericArrayValueFloat64s(b *testing.B) {
+ rand.Seed(1)
+ x := make([]float64, 10)
+ for i := 0; i < len(x); i++ {
+ x[i] = rand.NormFloat64()
+ }
+ a := GenericArray{x}
+
+ for i := 0; i < b.N; i++ {
+ a.Value()
+ }
+}
+
+func BenchmarkGenericArrayValueInt64s(b *testing.B) {
+ rand.Seed(1)
+ x := make([]int64, 10)
+ for i := 0; i < len(x); i++ {
+ x[i] = rand.Int63()
+ }
+ a := GenericArray{x}
+
+ for i := 0; i < b.N; i++ {
+ a.Value()
+ }
+}
+
+func BenchmarkGenericArrayValueByteSlices(b *testing.B) {
+ x := make([][]byte, 10)
+ for i := 0; i < len(x); i++ {
+ x[i] = bytes.Repeat([]byte(`abc"def\ghi`), 5)
+ }
+ a := GenericArray{x}
+
+ for i := 0; i < b.N; i++ {
+ a.Value()
+ }
+}
+
+func BenchmarkGenericArrayValueStrings(b *testing.B) {
+ x := make([]string, 10)
+ for i := 0; i < len(x); i++ {
+ x[i] = strings.Repeat(`abc"def\ghi`, 5)
+ }
+ a := GenericArray{x}
+
+ for i := 0; i < b.N; i++ {
+ a.Value()
+ }
+}
+
+func TestArrayScanBackend(t *testing.T) {
+ db := openTestConn(t)
+ defer db.Close()
+
+ for _, tt := range []struct {
+ s string
+ d sql.Scanner
+ e interface{}
+ }{
+ {`ARRAY[true, false]`, new(BoolArray), &BoolArray{true, false}},
+ {`ARRAY[E'\\xdead', E'\\xbeef']`, new(ByteaArray), &ByteaArray{{'\xDE', '\xAD'}, {'\xBE', '\xEF'}}},
+ {`ARRAY[1.2, 3.4]`, new(Float64Array), &Float64Array{1.2, 3.4}},
+ {`ARRAY[1, 2, 3]`, new(Int64Array), &Int64Array{1, 2, 3}},
+ {`ARRAY['a', E'\\b', 'c"', 'd,e']`, new(StringArray), &StringArray{`a`, `\b`, `c"`, `d,e`}},
+ } {
+ err := db.QueryRow(`SELECT ` + tt.s).Scan(tt.d)
+ if err != nil {
+ t.Errorf("Expected no error when scanning %s into %T, got %v", tt.s, tt.d, err)
+ }
+ if !reflect.DeepEqual(tt.d, tt.e) {
+ t.Errorf("Expected %v when scanning %s into %T, got %v", tt.e, tt.s, tt.d, tt.d)
+ }
+ }
+}
+
+func TestArrayValueBackend(t *testing.T) {
+ db := openTestConn(t)
+ defer db.Close()
+
+ for _, tt := range []struct {
+ s string
+ v driver.Valuer
+ }{
+ {`ARRAY[true, false]`, BoolArray{true, false}},
+ {`ARRAY[E'\\xdead', E'\\xbeef']`, ByteaArray{{'\xDE', '\xAD'}, {'\xBE', '\xEF'}}},
+ {`ARRAY[1.2, 3.4]`, Float64Array{1.2, 3.4}},
+ {`ARRAY[1, 2, 3]`, Int64Array{1, 2, 3}},
+ {`ARRAY['a', E'\\b', 'c"', 'd,e']`, StringArray{`a`, `\b`, `c"`, `d,e`}},
+ } {
+ var x int
+ err := db.QueryRow(`SELECT 1 WHERE `+tt.s+` <> $1`, tt.v).Scan(&x)
+ if err != sql.ErrNoRows {
+ t.Errorf("Expected %v to equal %s, got %v", tt.v, tt.s, err)
+ }
+ }
+}
diff --git a/vendor/github.com/lib/pq/certs/bogus_root.crt b/vendor/github.com/lib/pq/certs/bogus_root.crt
new file mode 100644
index 000000000..1239db3a4
--- /dev/null
+++ b/vendor/github.com/lib/pq/certs/bogus_root.crt
@@ -0,0 +1,19 @@
+-----BEGIN CERTIFICATE-----
+MIIDBjCCAe6gAwIBAgIQSnDYp/Naet9HOZljF5PuwDANBgkqhkiG9w0BAQsFADAr
+MRIwEAYDVQQKEwlDb2Nrcm9hY2gxFTATBgNVBAMTDENvY2tyb2FjaCBDQTAeFw0x
+NjAyMDcxNjQ0MzdaFw0xNzAyMDYxNjQ0MzdaMCsxEjAQBgNVBAoTCUNvY2tyb2Fj
+aDEVMBMGA1UEAxMMQ29ja3JvYWNoIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
+MIIBCgKCAQEAxdln3/UdgP7ayA/G1kT7upjLe4ERwQjYQ25q0e1+vgsB5jhiirxJ
+e0+WkhhYu/mwoSAXzvlsbZ2PWFyfdanZeD/Lh6SvIeWXVVaPcWVWL1TEcoN2jr5+
+E85MMHmbbmaT2he8s6br2tM/UZxyTQ2XRprIzApbDssyw1c0Yufcpu3C6267FLEl
+IfcWrzDhnluFhthhtGXv3ToD8IuMScMC5qlKBXtKmD1B5x14ngO/ecNJ+OlEi0HU
+mavK4KWgI2rDXRZ2EnCpyTZdkc3kkRnzKcg653oOjMDRZdrhfIrha+Jq38ACsUmZ
+Su7Sp5jkIHOCO8Zg+l6GKVSq37dKMapD8wIDAQABoyYwJDAOBgNVHQ8BAf8EBAMC
+AuQwEgYDVR0TAQH/BAgwBgEB/wIBATANBgkqhkiG9w0BAQsFAAOCAQEAwZ2Tu0Yu
+rrSVdMdoPEjT1IZd+5OhM/SLzL0ddtvTithRweLHsw2lDQYlXFqr24i3UGZJQ1sp
+cqSrNwswgLUQT3vWyTjmM51HEb2vMYWKmjZ+sBQYAUP1CadrN/+OTfNGnlF1+B4w
+IXOzh7EvQmJJnNybLe4a/aRvj1NE2n8Z898B76SVU9WbfKKz8VwLzuIPDqkKcZda
+lMy5yzthyztV9YjcWs2zVOUGZvGdAhDrvZuUq6mSmxrBEvR2LBOggmVf3tGRT+Ls
+lW7c9Lrva5zLHuqmoPP07A+vuI9a0D1X44jwGDuPWJ5RnTOQ63Uez12mKNjqleHw
+DnkwNanuO8dhAA==
+-----END CERTIFICATE-----
diff --git a/vendor/github.com/lib/pq/conn.go b/vendor/github.com/lib/pq/conn.go
index 336c89449..8e1aee9f0 100644
--- a/vendor/github.com/lib/pq/conn.go
+++ b/vendor/github.com/lib/pq/conn.go
@@ -968,8 +968,23 @@ func (cn *conn) ssl(o values) {
verifyCaOnly := false
tlsConf := tls.Config{}
switch mode := o.Get("sslmode"); mode {
- case "require", "":
+ // "require" is the default.
+ case "", "require":
+ // We must skip TLS's own verification since it requires full
+ // verification since Go 1.3.
tlsConf.InsecureSkipVerify = true
+
+ // From http://www.postgresql.org/docs/current/static/libpq-ssl.html:
+ // Note: For backwards compatibility with earlier versions of PostgreSQL, if a
+ // root CA file exists, the behavior of sslmode=require will be the same as
+ // that of verify-ca, meaning the server certificate is validated against the
+ // CA. Relying on this behavior is discouraged, and applications that need
+ // certificate validation should always use verify-ca or verify-full.
+ if _, err := os.Stat(o.Get("sslrootcert")); err == nil {
+ verifyCaOnly = true
+ } else {
+ o.Set("sslrootcert", "")
+ }
case "verify-ca":
// We must skip TLS's own verification since it requires full
// verification since Go 1.3.
diff --git a/vendor/github.com/lib/pq/conn_test.go b/vendor/github.com/lib/pq/conn_test.go
index 274147c27..592860f8a 100644
--- a/vendor/github.com/lib/pq/conn_test.go
+++ b/vendor/github.com/lib/pq/conn_test.go
@@ -138,6 +138,10 @@ func TestOpenURL(t *testing.T) {
const pgpass_file = "/tmp/pqgotest_pgpass"
func TestPgpass(t *testing.T) {
+ if os.Getenv("TRAVIS") != "true" {
+ t.Skip("not running under Travis, skipping pgpass tests")
+ }
+
testAssert := func(conninfo string, expected string, reason string) {
conn, err := openTestConnConninfo(conninfo)
if err != nil {
@@ -186,7 +190,17 @@ localhost:*:*:*:pass_C
pgpass.Close()
assertPassword := func(extra values, expected string) {
- o := &values{"host": "localhost", "sslmode": "disable", "connect_timeout": "20", "user": "majid", "port": "5432", "extra_float_digits": "2", "dbname": "pqgotest", "client_encoding": "UTF8", "datestyle": "ISO, MDY"}
+ o := &values{
+ "host": "localhost",
+ "sslmode": "disable",
+ "connect_timeout": "20",
+ "user": "majid",
+ "port": "5432",
+ "extra_float_digits": "2",
+ "dbname": "pqgotest",
+ "client_encoding": "UTF8",
+ "datestyle": "ISO, MDY",
+ }
for k, v := range extra {
(*o)[k] = v
}
diff --git a/vendor/github.com/lib/pq/encode.go b/vendor/github.com/lib/pq/encode.go
index 6681bd3e7..29e8f6ff7 100644
--- a/vendor/github.com/lib/pq/encode.go
+++ b/vendor/github.com/lib/pq/encode.go
@@ -56,10 +56,13 @@ func encode(parameterStatus *parameterStatus, x interface{}, pgtypOid oid.Oid) [
}
func decode(parameterStatus *parameterStatus, s []byte, typ oid.Oid, f format) interface{} {
- if f == formatBinary {
+ switch f {
+ case formatBinary:
return binaryDecode(parameterStatus, s, typ)
- } else {
+ case formatText:
return textDecode(parameterStatus, s, typ)
+ default:
+ panic("not reached")
}
}
@@ -83,8 +86,14 @@ func binaryDecode(parameterStatus *parameterStatus, s []byte, typ oid.Oid) inter
func textDecode(parameterStatus *parameterStatus, s []byte, typ oid.Oid) interface{} {
switch typ {
+ case oid.T_char, oid.T_varchar, oid.T_text:
+ return string(s)
case oid.T_bytea:
- return parseBytea(s)
+ b, err := parseBytea(s)
+ if err != nil {
+ errorf("%s", err)
+ }
+ return b
case oid.T_timestamptz:
return parseTs(parameterStatus.currentLocation, string(s))
case oid.T_timestamp, oid.T_date:
@@ -195,21 +204,21 @@ func mustParse(f string, typ oid.Oid, s []byte) time.Time {
return t
}
-var invalidTimestampErr = errors.New("invalid timestamp")
+var errInvalidTimestamp = errors.New("invalid timestamp")
type timestampParser struct {
err error
}
-func (p *timestampParser) expect(str, char string, pos int) {
+func (p *timestampParser) expect(str string, char byte, pos int) {
if p.err != nil {
return
}
if pos+1 > len(str) {
- p.err = invalidTimestampErr
+ p.err = errInvalidTimestamp
return
}
- if c := str[pos : pos+1]; c != char && p.err == nil {
+ if c := str[pos]; c != char && p.err == nil {
p.err = fmt.Errorf("expected '%v' at position %v; got '%v'", char, pos, c)
}
}
@@ -219,7 +228,7 @@ func (p *timestampParser) mustAtoi(str string, begin int, end int) int {
return 0
}
if begin < 0 || end < 0 || begin > end || end > len(str) {
- p.err = invalidTimestampErr
+ p.err = errInvalidTimestamp
return 0
}
result, err := strconv.Atoi(str[begin:end])
@@ -242,7 +251,7 @@ type locationCache struct {
// about 5% speed could be gained by putting the cache in the connection and
// losing the mutex, at the cost of a small amount of memory and a somewhat
// significant increase in code complexity.
-var globalLocationCache *locationCache = newLocationCache()
+var globalLocationCache = newLocationCache()
func newLocationCache() *locationCache {
return &locationCache{cache: make(map[int]*time.Location)}
@@ -272,26 +281,26 @@ const (
infinityTsNegativeMustBeSmaller = "pq: infinity timestamp: negative value must be smaller (before) than positive"
)
-/*
- * If EnableInfinityTs is not called, "-infinity" and "infinity" will return
- * []byte("-infinity") and []byte("infinity") respectively, and potentially
- * cause error "sql: Scan error on column index 0: unsupported driver -> Scan pair: []uint8 -> *time.Time",
- * when scanning into a time.Time value.
- *
- * Once EnableInfinityTs has been called, all connections created using this
- * driver will decode Postgres' "-infinity" and "infinity" for "timestamp",
- * "timestamp with time zone" and "date" types to the predefined minimum and
- * maximum times, respectively. When encoding time.Time values, any time which
- * equals or precedes the predefined minimum time will be encoded to
- * "-infinity". Any values at or past the maximum time will similarly be
- * encoded to "infinity".
- *
- *
- * If EnableInfinityTs is called with negative >= positive, it will panic.
- * Calling EnableInfinityTs after a connection has been established results in
- * undefined behavior. If EnableInfinityTs is called more than once, it will
- * panic.
- */
+// EnableInfinityTs controls the handling of Postgres' "-infinity" and
+// "infinity" "timestamp"s.
+//
+// If EnableInfinityTs is not called, "-infinity" and "infinity" will return
+// []byte("-infinity") and []byte("infinity") respectively, and potentially
+// cause error "sql: Scan error on column index 0: unsupported driver -> Scan
+// pair: []uint8 -> *time.Time", when scanning into a time.Time value.
+//
+// Once EnableInfinityTs has been called, all connections created using this
+// driver will decode Postgres' "-infinity" and "infinity" for "timestamp",
+// "timestamp with time zone" and "date" types to the predefined minimum and
+// maximum times, respectively. When encoding time.Time values, any time which
+// equals or precedes the predefined minimum time will be encoded to
+// "-infinity". Any values at or past the maximum time will similarly be
+// encoded to "infinity".
+//
+// If EnableInfinityTs is called with negative >= positive, it will panic.
+// Calling EnableInfinityTs after a connection has been established results in
+// undefined behavior. If EnableInfinityTs is called more than once, it will
+// panic.
func EnableInfinityTs(negative time.Time, positive time.Time) {
if infinityTsEnabled {
panic(infinityTsEnabledAlready)
@@ -335,6 +344,10 @@ func parseTs(currentLocation *time.Location, str string) interface{} {
return t
}
+// ParseTimestamp parses Postgres' text format. It returns a time.Time in
+// currentLocation iff that time's offset agrees with the offset sent from the
+// Postgres server. Otherwise, ParseTimestamp returns a time.Time with the
+// fixed offset offset provided by the Postgres server.
func ParseTimestamp(currentLocation *time.Location, str string) (time.Time, error) {
p := timestampParser{}
@@ -344,18 +357,18 @@ func ParseTimestamp(currentLocation *time.Location, str string) (time.Time, erro
year := p.mustAtoi(str, 0, monSep)
daySep := monSep + 3
month := p.mustAtoi(str, monSep+1, daySep)
- p.expect(str, "-", daySep)
+ p.expect(str, '-', daySep)
timeSep := daySep + 3
day := p.mustAtoi(str, daySep+1, timeSep)
var hour, minute, second int
if len(str) > monSep+len("01-01")+1 {
- p.expect(str, " ", timeSep)
+ p.expect(str, ' ', timeSep)
minSep := timeSep + 3
- p.expect(str, ":", minSep)
+ p.expect(str, ':', minSep)
hour = p.mustAtoi(str, timeSep+1, minSep)
secSep := minSep + 3
- p.expect(str, ":", secSep)
+ p.expect(str, ':', secSep)
minute = p.mustAtoi(str, minSep+1, secSep)
secEnd := secSep + 3
second = p.mustAtoi(str, secSep+1, secEnd)
@@ -369,7 +382,7 @@ func ParseTimestamp(currentLocation *time.Location, str string) (time.Time, erro
nanoSec := 0
tzOff := 0
- if remainderIdx+1 <= len(str) && str[remainderIdx:remainderIdx+1] == "." {
+ if remainderIdx < len(str) && str[remainderIdx] == '.' {
fracStart := remainderIdx + 1
fracOff := strings.IndexAny(str[fracStart:], "-+ ")
if fracOff < 0 {
@@ -380,25 +393,26 @@ func ParseTimestamp(currentLocation *time.Location, str string) (time.Time, erro
remainderIdx += fracOff + 1
}
- if tzStart := remainderIdx; tzStart+1 <= len(str) && (str[tzStart:tzStart+1] == "-" || str[tzStart:tzStart+1] == "+") {
+ if tzStart := remainderIdx; tzStart < len(str) && (str[tzStart] == '-' || str[tzStart] == '+') {
// time zone separator is always '-' or '+' (UTC is +00)
var tzSign int
- if c := str[tzStart : tzStart+1]; c == "-" {
+ switch c := str[tzStart]; c {
+ case '-':
tzSign = -1
- } else if c == "+" {
+ case '+':
tzSign = +1
- } else {
+ default:
return time.Time{}, fmt.Errorf("expected '-' or '+' at position %v; got %v", tzStart, c)
}
tzHours := p.mustAtoi(str, tzStart+1, tzStart+3)
remainderIdx += 3
var tzMin, tzSec int
- if tzStart+4 <= len(str) && str[tzStart+3:tzStart+4] == ":" {
- tzMin = p.mustAtoi(str, tzStart+4, tzStart+6)
+ if remainderIdx < len(str) && str[remainderIdx] == ':' {
+ tzMin = p.mustAtoi(str, remainderIdx+1, remainderIdx+3)
remainderIdx += 3
}
- if tzStart+7 <= len(str) && str[tzStart+6:tzStart+7] == ":" {
- tzSec = p.mustAtoi(str, tzStart+7, tzStart+9)
+ if remainderIdx < len(str) && str[remainderIdx] == ':' {
+ tzSec = p.mustAtoi(str, remainderIdx+1, remainderIdx+3)
remainderIdx += 3
}
tzOff = tzSign * ((tzHours * 60 * 60) + (tzMin * 60) + tzSec)
@@ -432,7 +446,7 @@ func ParseTimestamp(currentLocation *time.Location, str string) (time.Time, erro
}
// formatTs formats t into a format postgres understands.
-func formatTs(t time.Time) (b []byte) {
+func formatTs(t time.Time) []byte {
if infinityTsEnabled {
// t <= -infinity : ! (t > -infinity)
if !t.After(infinityTsNegative) {
@@ -443,6 +457,11 @@ func formatTs(t time.Time) (b []byte) {
return []byte("infinity")
}
}
+ return FormatTimestamp(t)
+}
+
+// FormatTimestamp formats t into Postgres' text format for timestamps.
+func FormatTimestamp(t time.Time) []byte {
// Need to send dates before 0001 A.D. with " BC" suffix, instead of the
// minus sign preferred by Go.
// Beware, "0000" in ISO is "1 BC", "-0001" is "2 BC" and so on
@@ -452,7 +471,7 @@ func formatTs(t time.Time) (b []byte) {
t = t.AddDate((-t.Year())*2+1, 0, 0)
bc = true
}
- b = []byte(t.Format(time.RFC3339Nano))
+ b := []byte(t.Format(time.RFC3339Nano))
_, offset := t.Zone()
offset = offset % 60
@@ -477,14 +496,14 @@ func formatTs(t time.Time) (b []byte) {
// Parse a bytea value received from the server. Both "hex" and the legacy
// "escape" format are supported.
-func parseBytea(s []byte) (result []byte) {
+func parseBytea(s []byte) (result []byte, err error) {
if len(s) >= 2 && bytes.Equal(s[:2], []byte("\\x")) {
// bytea_output = hex
s = s[2:] // trim off leading "\\x"
result = make([]byte, hex.DecodedLen(len(s)))
_, err := hex.Decode(result, s)
if err != nil {
- errorf("%s", err)
+ return nil, err
}
} else {
// bytea_output = escape
@@ -499,11 +518,11 @@ func parseBytea(s []byte) (result []byte) {
// '\\' followed by an octal number
if len(s) < 4 {
- errorf("invalid bytea sequence %v", s)
+ return nil, fmt.Errorf("invalid bytea sequence %v", s)
}
r, err := strconv.ParseInt(string(s[1:4]), 8, 9)
if err != nil {
- errorf("could not parse bytea value: %s", err.Error())
+ return nil, fmt.Errorf("could not parse bytea value: %s", err.Error())
}
result = append(result, byte(r))
s = s[4:]
@@ -521,7 +540,7 @@ func parseBytea(s []byte) (result []byte) {
}
}
- return result
+ return result, nil
}
func encodeBytea(serverVersion int, v []byte) (result []byte) {
diff --git a/vendor/github.com/lib/pq/encode_test.go b/vendor/github.com/lib/pq/encode_test.go
index 984abbc94..1e89f7f6f 100644
--- a/vendor/github.com/lib/pq/encode_test.go
+++ b/vendor/github.com/lib/pq/encode_test.go
@@ -575,6 +575,17 @@ func TestBinaryByteSliceToInt(t *testing.T) {
}
}
+func TestTextDecodeIntoString(t *testing.T) {
+ input := []byte("hello world")
+ want := string(input)
+ for _, typ := range []oid.Oid{oid.T_char, oid.T_varchar, oid.T_text} {
+ got := decode(&parameterStatus{}, input, typ, formatText)
+ if got != want {
+ t.Errorf("invalid string decoding output for %T(%+v), got %v but expected %v", typ, typ, got, want)
+ }
+ }
+}
+
func TestByteaOutputFormatEncoding(t *testing.T) {
input := []byte("\\x\x00\x01\x02\xFF\xFEabcdefg0123")
want := []byte("\\x5c78000102fffe6162636465666730313233")
diff --git a/vendor/github.com/lib/pq/ssl_test.go b/vendor/github.com/lib/pq/ssl_test.go
index 932b336f5..f70a5fd57 100644
--- a/vendor/github.com/lib/pq/ssl_test.go
+++ b/vendor/github.com/lib/pq/ssl_test.go
@@ -100,6 +100,49 @@ func TestSSLVerifyFull(t *testing.T) {
}
}
+// Test sslmode=require sslrootcert=rootCertPath
+func TestSSLRequireWithRootCert(t *testing.T) {
+ maybeSkipSSLTests(t)
+ // Environment sanity check: should fail without SSL
+ checkSSLSetup(t, "sslmode=disable user=pqgossltest")
+
+ bogusRootCertPath := filepath.Join(os.Getenv("PQSSLCERTTEST_PATH"), "bogus_root.crt")
+ bogusRootCert := "sslrootcert=" + bogusRootCertPath + " "
+
+ // Not OK according to the bogus CA
+ _, err := openSSLConn(t, bogusRootCert+"host=postgres sslmode=require user=pqgossltest")
+ if err == nil {
+ t.Fatal("expected error")
+ }
+ _, ok := err.(x509.UnknownAuthorityError)
+ if !ok {
+ t.Fatalf("expected x509.UnknownAuthorityError, got %s, %#+v", err, err)
+ }
+
+ nonExistentCertPath := filepath.Join(os.Getenv("PQSSLCERTTEST_PATH"), "non_existent.crt")
+ nonExistentCert := "sslrootcert=" + nonExistentCertPath + " "
+
+ // No match on Common Name, but that's OK because we're not validating anything.
+ _, err = openSSLConn(t, nonExistentCert+"host=127.0.0.1 sslmode=require user=pqgossltest")
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ rootCertPath := filepath.Join(os.Getenv("PQSSLCERTTEST_PATH"), "root.crt")
+ rootCert := "sslrootcert=" + rootCertPath + " "
+
+ // No match on Common Name, but that's OK because we're not validating the CN.
+ _, err = openSSLConn(t, rootCert+"host=127.0.0.1 sslmode=require user=pqgossltest")
+ if err != nil {
+ t.Fatal(err)
+ }
+ // Everything OK
+ _, err = openSSLConn(t, rootCert+"host=postgres sslmode=require user=pqgossltest")
+ if err != nil {
+ t.Fatal(err)
+ }
+}
+
// Test sslmode=verify-ca
func TestSSLVerifyCA(t *testing.T) {
maybeSkipSSLTests(t)
diff --git a/vendor/github.com/mssola/user_agent/.travis.yml b/vendor/github.com/mssola/user_agent/.travis.yml
index 33c596acb..add0c8a6c 100644
--- a/vendor/github.com/mssola/user_agent/.travis.yml
+++ b/vendor/github.com/mssola/user_agent/.travis.yml
@@ -4,8 +4,6 @@ go:
- 1.1
- 1.2
- 1.3
- - 1.4
- - 1.5
- tip
matrix:
allow_failures:
diff --git a/vendor/github.com/mssola/user_agent/LICENSE b/vendor/github.com/mssola/user_agent/LICENSE
index 2784cdcac..c02b64473 100644
--- a/vendor/github.com/mssola/user_agent/LICENSE
+++ b/vendor/github.com/mssola/user_agent/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2012-2016 Miquel Sabaté Solà
+Copyright (c) 2012-2014 Miquel Sabaté Solà
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
diff --git a/vendor/github.com/mssola/user_agent/README.md b/vendor/github.com/mssola/user_agent/README.md
index 5c5e77276..971902560 100644
--- a/vendor/github.com/mssola/user_agent/README.md
+++ b/vendor/github.com/mssola/user_agent/README.md
@@ -48,4 +48,4 @@ func main() {
}
~~~
-Copyright &copy; 2012-2016 Miquel Sabaté Solà, released under the MIT License.
+Copyright &copy; 2012-2014 Miquel Sabaté Solà, released under the MIT License.
diff --git a/vendor/github.com/mssola/user_agent/all_test.go b/vendor/github.com/mssola/user_agent/all_test.go
index f76f2882f..4f3c03198 100644
--- a/vendor/github.com/mssola/user_agent/all_test.go
+++ b/vendor/github.com/mssola/user_agent/all_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2012-2016 Miquel Sabaté Solà <mikisabate@gmail.com>
+// Copyright (C) 2012-2014 Miquel Sabaté Solà <mikisabate@gmail.com>
// This file is licensed under the MIT license.
// See the LICENSE file.
@@ -10,457 +10,185 @@ import (
)
// Slice that contains all the tests. Each test is contained in a struct
-// that groups the title of the test, the User-Agent string to be tested and the expected value.
+// that groups the name of the test and the User-Agent string to be tested.
var uastrings = []struct {
- title string
- ua string
- expected string
+ name string
+ ua string
}{
// Bots
- {
- title: "GoogleBot",
- ua: "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)",
- expected: "Mozilla:5.0 Browser:Googlebot-2.1 Bot:true Mobile:false",
- },
- {
- title: "GoogleBotSmartphone",
- ua: "Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5376e Safari/8536.25 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)",
- expected: "Mozilla:5.0 Browser:Googlebot-2.1 Bot:true Mobile:true",
- },
- {
- title: "BingBot",
- ua: "Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)",
- expected: "Mozilla:5.0 Browser:bingbot-2.0 Bot:true Mobile:false",
- },
- {
- title: "BaiduBot",
- ua: "Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)",
- expected: "Mozilla:5.0 Browser:Baiduspider-2.0 Bot:true Mobile:false",
- },
- {
- title: "Twitterbot",
- ua: "Twitterbot",
- expected: "Browser:Twitterbot Bot:true Mobile:false",
- },
- {
- title: "YahooBot",
- ua: "Mozilla/5.0 (compatible; Yahoo! Slurp; http://help.yahoo.com/help/us/ysearch/slurp)",
- expected: "Mozilla:5.0 Browser:Yahoo! Slurp Bot:true Mobile:false",
- },
- {
- title: "FacebookExternalHit",
- ua: "facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)",
- expected: "Browser:facebookexternalhit-1.1 Bot:true Mobile:false",
- },
- {
- title: "FacebookPlatform",
- ua: "facebookplatform/1.0 (+http://developers.facebook.com)",
- expected: "Browser:facebookplatform-1.0 Bot:true Mobile:false",
- },
- {
- title: "FaceBot",
- ua: "Facebot",
- expected: "Browser:Facebot Bot:true Mobile:false",
- },
- {
- title: "NutchCVS",
- ua: "NutchCVS/0.8-dev (Nutch; http://lucene.apache.org/nutch/bot.html; nutch-agent@lucene.apache.org)",
- expected: "Browser:NutchCVS Bot:true Mobile:false",
- },
- {
- title: "MJ12bot",
- ua: "Mozilla/5.0 (compatible; MJ12bot/v1.2.4; http://www.majestic12.co.uk/bot.php?+)",
- expected: "Mozilla:5.0 Browser:MJ12bot-v1.2.4 Bot:true Mobile:false",
- },
- {
- title: "MJ12bot",
- ua: "MJ12bot/v1.0.8 (http://majestic12.co.uk/bot.php?+)",
- expected: "Browser:MJ12bot Bot:true Mobile:false",
- },
- {
- title: "AhrefsBot",
- ua: "Mozilla/5.0 (compatible; AhrefsBot/4.0; +http://ahrefs.com/robot/)",
- expected: "Mozilla:5.0 Browser:AhrefsBot-4.0 Bot:true Mobile:false",
- },
+ {"GoogleBot", "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"},
+ {"GoogleBotSmartphone", "Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5376e Safari/8536.25 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"},
+ {"BingBot", "Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)"},
+ {"BaiduBot", "Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)"},
+ {"Twitterbot", "Twitterbot"},
+ {"YahooBot", "Mozilla/5.0 (compatible; Yahoo! Slurp; http://help.yahoo.com/help/us/ysearch/slurp)"},
+ {"FacebookExternalHit", "facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)"},
+ {"FacebookPlatform", "facebookplatform/1.0 (+http://developers.facebook.com)"},
+ {"FaceBot", "Facebot"},
// Internet Explorer
- {
- title: "IE10",
- ua: "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0)",
- expected: "Mozilla:5.0 Platform:Windows OS:Windows 8 Browser:Internet Explorer-10.0 Engine:Trident Bot:false Mobile:false",
- },
- {
- title: "Tablet",
- ua: "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.2; ARM; Trident/6.0; Touch; .NET4.0E; .NET4.0C; Tablet PC 2.0)",
- expected: "Mozilla:4.0 Platform:Windows OS:Windows 8 Browser:Internet Explorer-10.0 Engine:Trident Bot:false Mobile:false",
- },
- {
- title: "Touch",
- ua: "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; ARM; Trident/6.0; Touch)",
- expected: "Mozilla:5.0 Platform:Windows OS:Windows 8 Browser:Internet Explorer-10.0 Engine:Trident Bot:false Mobile:false",
- },
- {
- title: "Phone",
- ua: "Mozilla/4.0 (compatible; MSIE 7.0; Windows Phone OS 7.0; Trident/3.1; IEMobile/7.0; SAMSUNG; SGH-i917)",
- expected: "Mozilla:4.0 Platform:Windows OS:Windows Phone OS 7.0 Browser:Internet Explorer-7.0 Engine:Trident Bot:false Mobile:true",
- },
- {
- title: "IE6",
- ua: "Mozilla/4.0 (compatible; MSIE6.0; Windows NT 5.0; .NET CLR 1.1.4322)",
- expected: "Mozilla:4.0 Platform:Windows OS:Windows 2000 Browser:Internet Explorer-6.0 Engine:Trident Bot:false Mobile:false",
- },
- {
- title: "IE8Compatibility",
- ua: "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; InfoPath.3; MS-RTC LM 8)",
- expected: "Mozilla:4.0 Platform:Windows OS:Windows 7 Browser:Internet Explorer-8.0 Engine:Trident Bot:false Mobile:false",
- },
- {
- title: "IE10Compatibility",
- ua: "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/6.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; InfoPath.3; MS-RTC LM 8)",
- expected: "Mozilla:4.0 Platform:Windows OS:Windows 7 Browser:Internet Explorer-10.0 Engine:Trident Bot:false Mobile:false",
- },
- {
- title: "IE11Win81",
- ua: "Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko",
- expected: "Mozilla:5.0 Platform:Windows OS:Windows 8.1 Browser:Internet Explorer-11.0 Engine:Trident Bot:false Mobile:false",
- },
- {
- title: "IE11Win7",
- ua: "Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko",
- expected: "Mozilla:5.0 Platform:Windows OS:Windows 7 Browser:Internet Explorer-11.0 Engine:Trident Bot:false Mobile:false",
- },
- {
- title: "IE11b32Win7b64",
- ua: "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko",
- expected: "Mozilla:5.0 Platform:Windows OS:Windows 7 Browser:Internet Explorer-11.0 Engine:Trident Bot:false Mobile:false",
- },
- {
- title: "IE11b32Win7b64MDDRJS",
- ua: "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; MDDRJS; rv:11.0) like Gecko",
- expected: "Mozilla:5.0 Platform:Windows OS:Windows 7 Browser:Internet Explorer-11.0 Engine:Trident Bot:false Mobile:false",
- },
- {
- title: "IE11Compatibility",
- ua: "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.3; Trident/7.0)",
- expected: "Mozilla:4.0 Platform:Windows OS:Windows 8.1 Browser:Internet Explorer-7.0 Engine:Trident Bot:false Mobile:false",
- },
-
- // Microsoft Edge
- {
- title: "EdgeDesktop",
- ua: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.10240",
- expected: "Mozilla:5.0 Platform:Windows OS:Windows 10 Browser:Edge-12.10240 Engine:EdgeHTML Bot:false Mobile:false",
- },
- {
- title: "EdgeMobile",
- ua: "Mozilla/5.0 (Windows Phone 10.0; Android 4.2.1; DEVICE INFO) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Mobile Safari/537.36 Edge/12.10240",
- expected: "Mozilla:5.0 Platform:Windows OS:Windows Phone 10.0 Browser:Edge-12.10240 Engine:EdgeHTML Bot:false Mobile:true",
- },
+ {"IE10", "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0)"},
+ {"Tablet", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.2; ARM; Trident/6.0; Touch; .NET4.0E; .NET4.0C; Tablet PC 2.0)"},
+ {"Touch", "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; ARM; Trident/6.0; Touch)"},
+ {"Phone", "Mozilla/4.0 (compatible; MSIE 7.0; Windows Phone OS 7.0; Trident/3.1; IEMobile/7.0; SAMSUNG; SGH-i917)"},
+ {"IE6", "Mozilla/4.0 (compatible; MSIE6.0; Windows NT 5.0; .NET CLR 1.1.4322)"},
+ {"IE8Compatibility", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; InfoPath.3; MS-RTC LM 8)"},
+ {"IE10Compatibility", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/6.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; InfoPath.3; MS-RTC LM 8)"},
+ {"IE11Win81", "Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko"},
+ {"IE11Win7", "Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko"},
+ {"IE11b32Win7b64", "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko"},
+ {"IE11b32Win7b64MDDRJS", "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; MDDRJS; rv:11.0) like Gecko"},
+ {"IE11Compatibility", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.3; Trident/7.0)"},
// Gecko
- {
- title: "FirefoxMac",
- ua: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0b8) Gecko/20100101 Firefox/4.0b8",
- expected: "Mozilla:5.0 Platform:Macintosh OS:Intel Mac OS X 10.6 Browser:Firefox-4.0b8 Engine:Gecko-20100101 Bot:false Mobile:false",
- },
- {
- title: "FirefoxMacLoc",
- ua: "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13",
- expected: "Mozilla:5.0 Platform:Macintosh OS:Intel Mac OS X 10.6 Localization:en-US Browser:Firefox-3.6.13 Engine:Gecko-20101203 Bot:false Mobile:false",
- },
- {
- title: "FirefoxLinux",
- ua: "Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20100101 Firefox/17.0",
- expected: "Mozilla:5.0 Platform:X11 OS:Linux x86_64 Browser:Firefox-17.0 Engine:Gecko-20100101 Bot:false Mobile:false",
- },
- {
- title: "FirefoxWin",
- ua: "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14",
- expected: "Mozilla:5.0 Platform:Windows OS:Windows XP Localization:en-US Browser:Firefox-2.0.0.14 Engine:Gecko-20080404 Bot:false Mobile:false",
- },
- {
- title: "Firefox29Win7",
- ua: "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:29.0) Gecko/20100101 Firefox/29.0",
- expected: "Mozilla:5.0 Platform:Windows OS:Windows 7 Browser:Firefox-29.0 Engine:Gecko-20100101 Bot:false Mobile:false",
- },
- {
- title: "CaminoMac",
- ua: "Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en; rv:1.8.1.14) Gecko/20080409 Camino/1.6 (like Firefox/2.0.0.14)",
- expected: "Mozilla:5.0 Platform:Macintosh OS:Intel Mac OS X Localization:en Browser:Camino-1.6 Engine:Gecko-20080409 Bot:false Mobile:false",
- },
- {
- title: "Iceweasel",
- ua: "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1) Gecko/20061024 Iceweasel/2.0 (Debian-2.0+dfsg-1)",
- expected: "Mozilla:5.0 Platform:X11 OS:Linux i686 Localization:en-US Browser:Iceweasel-2.0 Engine:Gecko-20061024 Bot:false Mobile:false",
- },
- {
- title: "SeaMonkey",
- ua: "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.1.4) Gecko/20091017 SeaMonkey/2.0",
- expected: "Mozilla:5.0 Platform:Macintosh OS:Intel Mac OS X 10.6 Localization:en-US Browser:SeaMonkey-2.0 Engine:Gecko-20091017 Bot:false Mobile:false",
- },
- {
- title: "AndroidFirefox",
- ua: "Mozilla/5.0 (Android; Mobile; rv:17.0) Gecko/17.0 Firefox/17.0",
- expected: "Mozilla:5.0 Platform:Mobile OS:Android Browser:Firefox-17.0 Engine:Gecko-17.0 Bot:false Mobile:true",
- },
- {
- title: "AndroidFirefoxTablet",
- ua: "Mozilla/5.0 (Android; Tablet; rv:26.0) Gecko/26.0 Firefox/26.0",
- expected: "Mozilla:5.0 Platform:Tablet OS:Android Browser:Firefox-26.0 Engine:Gecko-26.0 Bot:false Mobile:true",
- },
- {
- title: "FirefoxOS",
- ua: "Mozilla/5.0 (Mobile; rv:26.0) Gecko/26.0 Firefox/26.0",
- expected: "Mozilla:5.0 Platform:Mobile OS:FirefoxOS Browser:Firefox-26.0 Engine:Gecko-26.0 Bot:false Mobile:true",
- },
- {
- title: "FirefoxOSTablet",
- ua: "Mozilla/5.0 (Tablet; rv:26.0) Gecko/26.0 Firefox/26.0",
- expected: "Mozilla:5.0 Platform:Tablet OS:FirefoxOS Browser:Firefox-26.0 Engine:Gecko-26.0 Bot:false Mobile:true",
- },
- {
- title: "FirefoxWinXP",
- ua: "Mozilla/5.0 (Windows NT 5.2; rv:31.0) Gecko/20100101 Firefox/31.0",
- expected: "Mozilla:5.0 Platform:Windows OS:Windows XP x64 Edition Browser:Firefox-31.0 Engine:Gecko-20100101 Bot:false Mobile:false",
- },
- {
- title: "FirefoxMRA",
- ua: "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:24.0) Gecko/20130405 MRA 5.5 (build 02842) Firefox/24.0 (.NET CLR 3.5.30729)",
- expected: "Mozilla:5.0 Platform:Windows OS:Windows XP Localization:en-US Browser:Firefox-24.0 Engine:Gecko-20130405 Bot:false Mobile:false",
- },
+ {"FirefoxMac", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0b8) Gecko/20100101 Firefox/4.0b8"},
+ {"FirefoxMacLoc", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13"},
+ {"FirefoxLinux", "Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20100101 Firefox/17.0"},
+ {"FirefoxWin", "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14"},
+ {"Firefox29Win7", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:29.0) Gecko/20100101 Firefox/29.0"},
+ {"CaminoMac", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en; rv:1.8.1.14) Gecko/20080409 Camino/1.6 (like Firefox/2.0.0.14)"},
+ {"Iceweasel", "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1) Gecko/20061024 Iceweasel/2.0 (Debian-2.0+dfsg-1)"},
+ {"SeaMonkey", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.1.4) Gecko/20091017 SeaMonkey/2.0"},
+ {"AndroidFirefox", "Mozilla/5.0 (Android; Mobile; rv:17.0) Gecko/17.0 Firefox/17.0"},
+ {"AndroidFirefoxTablet", "Mozilla/5.0 (Android; Tablet; rv:26.0) Gecko/26.0 Firefox/26.0"},
+ {"FirefoxOS", "Mozilla/5.0 (Mobile; rv:26.0) Gecko/26.0 Firefox/26.0"},
+ {"FirefoxOSTablet", "Mozilla/5.0 (Tablet; rv:26.0) Gecko/26.0 Firefox/26.0"},
+ {"FirefoxWinXP", "Mozilla/5.0 (Windows NT 5.2; rv:31.0) Gecko/20100101 Firefox/31.0"},
+ {"FirefoxMRA", "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:24.0) Gecko/20130405 MRA 5.5 (build 02842) Firefox/24.0 (.NET CLR 3.5.30729)"},
// Opera
- {
- title: "OperaMac",
- ua: "Opera/9.27 (Macintosh; Intel Mac OS X; U; en)",
- expected: "Platform:Macintosh OS:Intel Mac OS X Localization:en Browser:Opera-9.27 Engine:Presto Bot:false Mobile:false",
- },
- {
- title: "OperaWin",
- ua: "Opera/9.27 (Windows NT 5.1; U; en)",
- expected: "Platform:Windows OS:Windows XP Localization:en Browser:Opera-9.27 Engine:Presto Bot:false Mobile:false",
- },
- {
- title: "OperaWinNoLocale",
- ua: "Opera/9.80 (Windows NT 5.1) Presto/2.12.388 Version/12.10",
- expected: "Platform:Windows OS:Windows XP Browser:Opera-9.80 Engine:Presto-2.12.388 Bot:false Mobile:false",
- },
- {
- title: "OperaWin2Comment",
- ua: "Opera/9.80 (Windows NT 6.0; WOW64) Presto/2.12.388 Version/12.15",
- expected: "Platform:Windows OS:Windows Vista Browser:Opera-9.80 Engine:Presto-2.12.388 Bot:false Mobile:false",
- },
- {
- title: "OperaMinimal",
- ua: "Opera/9.80",
- expected: "Browser:Opera-9.80 Engine:Presto Bot:false Mobile:false",
- },
- {
- title: "OperaFull",
- ua: "Opera/9.80 (Windows NT 6.0; U; en) Presto/2.2.15 Version/10.10",
- expected: "Platform:Windows OS:Windows Vista Localization:en Browser:Opera-9.80 Engine:Presto-2.2.15 Bot:false Mobile:false",
- },
- {
- title: "OperaLinux",
- ua: "Opera/9.80 (X11; Linux x86_64) Presto/2.12.388 Version/12.10",
- expected: "Platform:X11 OS:Linux x86_64 Browser:Opera-9.80 Engine:Presto-2.12.388 Bot:false Mobile:false",
- },
- {
- title: "OperaAndroid",
- ua: "Opera/9.80 (Android 4.2.1; Linux; Opera Mobi/ADR-1212030829) Presto/2.11.355 Version/12.10",
- expected: "Platform:Android 4.2.1 OS:Linux Browser:Opera-9.80 Engine:Presto-2.11.355 Bot:false Mobile:true",
- },
- {
- title: "OperaNested",
- ua: "Opera/9.80 (Windows NT 5.1; MRA 6.0 (build 5831)) Presto/2.12.388 Version/12.10",
- expected: "Platform:Windows OS:Windows XP Browser:Opera-9.80 Engine:Presto-2.12.388 Bot:false Mobile:false",
- },
- {
- title: "OperaMRA",
- ua: "Opera/9.80 (Windows NT 6.1; U; MRA 5.8 (build 4139); en) Presto/2.9.168 Version/11.50",
- expected: "Platform:Windows OS:Windows 7 Localization:en Browser:Opera-9.80 Engine:Presto-2.9.168 Bot:false Mobile:false",
- },
+ {"OperaMac", "Opera/9.27 (Macintosh; Intel Mac OS X; U; en)"},
+ {"OperaWin", "Opera/9.27 (Windows NT 5.1; U; en)"},
+ {"OperaWinNoLocale", "Opera/9.80 (Windows NT 5.1) Presto/2.12.388 Version/12.10"},
+ {"OperaWin2Comment", "Opera/9.80 (Windows NT 6.0; WOW64) Presto/2.12.388 Version/12.15"},
+ {"OperaMinimal", "Opera/9.80"},
+ {"OperaFull", "Opera/9.80 (Windows NT 6.0; U; en) Presto/2.2.15 Version/10.10"},
+ {"OperaLinux", "Opera/9.80 (X11; Linux x86_64) Presto/2.12.388 Version/12.10"},
+ {"OperaAndroid", "Opera/9.80 (Android 4.2.1; Linux; Opera Mobi/ADR-1212030829) Presto/2.11.355 Version/12.10"},
+ {"OperaNested", "Opera/9.80 (Windows NT 5.1; MRA 6.0 (build 5831)) Presto/2.12.388 Version/12.10"},
+ {"OperaMRA", "Opera/9.80 (Windows NT 6.1; U; MRA 5.8 (build 4139); en) Presto/2.9.168 Version/11.50"},
// Other
- {
- title: "Empty",
- ua: "",
- expected: "Bot:false Mobile:false",
- },
- {
- title: "Nil",
- ua: "nil",
- expected: "Browser:nil Bot:false Mobile:false",
- },
- {
- title: "Compatible",
- ua: "Mozilla/4.0 (compatible)",
- expected: "Browser:Mozilla-4.0 Bot:false Mobile:false",
- },
- {
- title: "Mozilla",
- ua: "Mozilla/5.0",
- expected: "Browser:Mozilla-5.0 Bot:false Mobile:false",
- },
- {
- title: "Amaya",
- ua: "amaya/9.51 libwww/5.4.0",
- expected: "Browser:amaya-9.51 Engine:libwww-5.4.0 Bot:false Mobile:false",
- },
- {
- title: "Rails",
- ua: "Rails Testing",
- expected: "Browser:Rails Engine:Testing Bot:false Mobile:false",
- },
- {
- title: "Python",
- ua: "Python-urllib/2.7",
- expected: "Browser:Python-urllib-2.7 Bot:false Mobile:false",
- },
- {
- title: "Curl",
- ua: "curl/7.28.1",
- expected: "Browser:curl-7.28.1 Bot:false Mobile:false",
- },
+ {"Empty", ""},
+ {"Nil", "nil"},
+ {"Compatible", "Mozilla/4.0 (compatible)"},
+ {"Mozilla", "Mozilla/5.0"},
+ {"Amaya", "amaya/9.51 libwww/5.4.0"},
+ {"Rails", "Rails Testing"},
+ {"Python", "Python-urllib/2.7"},
+ {"Curl", "curl/7.28.1"},
// WebKit
- {
- title: "ChromeLinux",
- ua: "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11",
- expected: "Mozilla:5.0 Platform:X11 OS:Linux x86_64 Browser:Chrome-23.0.1271.97 Engine:AppleWebKit-537.11 Bot:false Mobile:false",
- },
- {
- title: "ChromeWin7",
- ua: "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.168 Safari/535.19",
- expected: "Mozilla:5.0 Platform:Windows OS:Windows 7 Browser:Chrome-18.0.1025.168 Engine:AppleWebKit-535.19 Bot:false Mobile:false",
- },
- {
- title: "ChromeMinimal",
- ua: "Mozilla/5.0 AppleWebKit/534.10 Chrome/8.0.552.215 Safari/534.10",
- expected: "Mozilla:5.0 Browser:Chrome-8.0.552.215 Engine:AppleWebKit-534.10 Bot:false Mobile:false",
- },
- {
- title: "ChromeMac",
- ua: "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_5; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.231 Safari/534.10",
- expected: "Mozilla:5.0 Platform:Macintosh OS:Intel Mac OS X 10_6_5 Localization:en-US Browser:Chrome-8.0.552.231 Engine:AppleWebKit-534.10 Bot:false Mobile:false",
- },
- {
- title: "SafariMac",
- ua: "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; en-us) AppleWebKit/533.16 (KHTML, like Gecko) Version/5.0 Safari/533.16",
- expected: "Mozilla:5.0 Platform:Macintosh OS:Intel Mac OS X 10_6_3 Localization:en-us Browser:Safari-5.0 Engine:AppleWebKit-533.16 Bot:false Mobile:false",
- },
- {
- title: "SafariWin",
- ua: "Mozilla/5.0 (Windows; U; Windows NT 5.1; en) AppleWebKit/526.9 (KHTML, like Gecko) Version/4.0dp1 Safari/526.8",
- expected: "Mozilla:5.0 Platform:Windows OS:Windows XP Localization:en Browser:Safari-4.0dp1 Engine:AppleWebKit-526.9 Bot:false Mobile:false",
- },
- {
- title: "iPhone7",
- ua: "Mozilla/5.0 (iPhone; CPU iPhone OS 7_0_3 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11B511 Safari/9537.53",
- expected: "Mozilla:5.0 Platform:iPhone OS:CPU iPhone OS 7_0_3 like Mac OS X Browser:Safari-7.0 Engine:AppleWebKit-537.51.1 Bot:false Mobile:true",
- },
- {
- title: "iPhone",
- ua: "Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420.1 (KHTML, like Gecko) Version/3.0 Mobile/4A102 Safari/419",
- expected: "Mozilla:5.0 Platform:iPhone OS:CPU like Mac OS X Localization:en Browser:Safari-3.0 Engine:AppleWebKit-420.1 Bot:false Mobile:true",
- },
- {
- title: "iPod",
- ua: "Mozilla/5.0 (iPod; U; CPU like Mac OS X; en) AppleWebKit/420.1 (KHTML, like Gecko) Version/3.0 Mobile/4A102 Safari/419",
- expected: "Mozilla:5.0 Platform:iPod OS:CPU like Mac OS X Localization:en Browser:Safari-3.0 Engine:AppleWebKit-420.1 Bot:false Mobile:true",
- },
- {
- title: "iPad",
- ua: "Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B367 Safari/531.21.10",
- expected: "Mozilla:5.0 Platform:iPad OS:CPU OS 3_2 like Mac OS X Localization:en-us Browser:Safari-4.0.4 Engine:AppleWebKit-531.21.10 Bot:false Mobile:true",
- },
- {
- title: "webOS",
- ua: "Mozilla/5.0 (webOS/1.4.0; U; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Version/1.0 Safari/532.2 Pre/1.1",
- expected: "Mozilla:5.0 Platform:webOS OS:Palm Localization:en-US Browser:webOS-1.0 Engine:AppleWebKit-532.2 Bot:false Mobile:true",
- },
- {
- title: "Android",
- ua: "Mozilla/5.0 (Linux; U; Android 1.5; de-; HTC Magic Build/PLAT-RC33) AppleWebKit/528.5+ (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1",
- expected: "Mozilla:5.0 Platform:Linux OS:Android 1.5 Localization:de- Browser:Android-3.1.2 Engine:AppleWebKit-528.5+ Bot:false Mobile:true",
- },
- {
- title: "BlackBerry",
- ua: "Mozilla/5.0 (BlackBerry; U; BlackBerry 9800; en) AppleWebKit/534.1+ (KHTML, Like Gecko) Version/6.0.0.141 Mobile Safari/534.1+",
- expected: "Mozilla:5.0 Platform:BlackBerry OS:BlackBerry 9800 Localization:en Browser:BlackBerry-6.0.0.141 Engine:AppleWebKit-534.1+ Bot:false Mobile:true",
- },
- {
- title: "BB10",
- ua: "Mozilla/5.0 (BB10; Touch) AppleWebKit/537.3+ (KHTML, like Gecko) Version/10.0.9.388 Mobile Safari/537.3+",
- expected: "Mozilla:5.0 Platform:BlackBerry OS:BlackBerry Browser:BlackBerry-10.0.9.388 Engine:AppleWebKit-537.3+ Bot:false Mobile:true",
- },
- {
- title: "Ericsson",
- ua: "Mozilla/5.0 (SymbianOS/9.4; U; Series60/5.0 Profile/MIDP-2.1 Configuration/CLDC-1.1) AppleWebKit/525 (KHTML, like Gecko) Version/3.0 Safari/525",
- expected: "Mozilla:5.0 Platform:Symbian OS:SymbianOS/9.4 Browser:Symbian-3.0 Engine:AppleWebKit-525 Bot:false Mobile:true",
- },
- {
- title: "ChromeAndroid",
- ua: "Mozilla/5.0 (Linux; Android 4.2.1; Galaxy Nexus Build/JOP40D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19",
- expected: "Mozilla:5.0 Platform:Linux OS:Android 4.2.1 Browser:Chrome-18.0.1025.166 Engine:AppleWebKit-535.19 Bot:false Mobile:true",
- },
- {
- title: "WebkitNoPlatform",
- ua: "Mozilla/5.0 (en-us) AppleWebKit/525.13 (KHTML, like Gecko; Google Web Preview) Version/3.1 Safari/525.13",
- expected: "Mozilla:5.0 Platform:en-us Localization:en-us Browser:Safari-3.1 Engine:AppleWebKit-525.13 Bot:false Mobile:false",
- },
- {
- title: "OperaWebkitMobile",
- ua: "Mozilla/5.0 (Linux; Android 4.2.2; Galaxy Nexus Build/JDQ39) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.58 Mobile Safari/537.31 OPR/14.0.1074.57453",
- expected: "Mozilla:5.0 Platform:Linux OS:Android 4.2.2 Browser:Opera-14.0.1074.57453 Engine:AppleWebKit-537.31 Bot:false Mobile:true",
- },
- {
- title: "OperaWebkitDesktop",
- ua: "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.58 Safari/537.31 OPR/14.0.1074.57453",
- expected: "Mozilla:5.0 Platform:X11 OS:Linux x86_64 Browser:Opera-14.0.1074.57453 Engine:AppleWebKit-537.31 Bot:false Mobile:false",
- },
- {
- title: "ChromeNothingAfterU",
- ua: "Mozilla/5.0 (Linux; U) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.79 Safari/537.4",
- expected: "Mozilla:5.0 Platform:Linux OS:Linux Browser:Chrome-22.0.1229.79 Engine:AppleWebKit-537.4 Bot:false Mobile:false",
- },
- {
- title: "SafariOnSymbian",
- ua: "Mozilla/5.0 (SymbianOS/9.1; U; [en-us]) AppleWebKit/413 (KHTML, like Gecko) Safari/413",
- expected: "Mozilla:5.0 Platform:Symbian OS:SymbianOS/9.1 Browser:Symbian-413 Engine:AppleWebKit-413 Bot:false Mobile:true",
- },
+ {"ChromeLinux", "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11"},
+ {"ChromeWin7", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.168 Safari/535.19"},
+ {"ChromeMinimal", "Mozilla/5.0 AppleWebKit/534.10 Chrome/8.0.552.215 Safari/534.10"},
+ {"ChromeMac", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_5; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.231 Safari/534.10"},
+ {"SafariMac", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; en-us) AppleWebKit/533.16 (KHTML, like Gecko) Version/5.0 Safari/533.16"},
+ {"SafariWin", "Mozilla/5.0 (Windows; U; Windows NT 5.1; en) AppleWebKit/526.9 (KHTML, like Gecko) Version/4.0dp1 Safari/526.8"},
+ {"iPhone7", "Mozilla/5.0 (iPhone; CPU iPhone OS 7_0_3 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11B511 Safari/9537.53"},
+ {"iPhone", "Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420.1 (KHTML, like Gecko) Version/3.0 Mobile/4A102 Safari/419"},
+ {"iPod", "Mozilla/5.0 (iPod; U; CPU like Mac OS X; en) AppleWebKit/420.1 (KHTML, like Gecko) Version/3.0 Mobile/4A102 Safari/419"},
+ {"iPad", "Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B367 Safari/531.21.10"},
+ {"webOS", "Mozilla/5.0 (webOS/1.4.0; U; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Version/1.0 Safari/532.2 Pre/1.1"},
+ {"Android", "Mozilla/5.0 (Linux; U; Android 1.5; de-; HTC Magic Build/PLAT-RC33) AppleWebKit/528.5+ (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1"},
+ {"BlackBerry", "Mozilla/5.0 (BlackBerry; U; BlackBerry 9800; en) AppleWebKit/534.1+ (KHTML, Like Gecko) Version/6.0.0.141 Mobile Safari/534.1+"},
+ {"BB10", "Mozilla/5.0 (BB10; Touch) AppleWebKit/537.3+ (KHTML, like Gecko) Version/10.0.9.388 Mobile Safari/537.3+"},
+ {"Ericsson", "Mozilla/5.0 (SymbianOS/9.4; U; Series60/5.0 Profile/MIDP-2.1 Configuration/CLDC-1.1) AppleWebKit/525 (KHTML, like Gecko) Version/3.0 Safari/525"},
+ {"ChromeAndroid", "Mozilla/5.0 (Linux; Android 4.2.1; Galaxy Nexus Build/JOP40D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19"},
+ {"WebkitNoPlatform", "Mozilla/5.0 (en-us) AppleWebKit/525.13 (KHTML, like Gecko; Google Web Preview) Version/3.1 Safari/525.13"},
+ {"OperaWebkitMobile", "Mozilla/5.0 (Linux; Android 4.2.2; Galaxy Nexus Build/JDQ39) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.58 Mobile Safari/537.31 OPR/14.0.1074.57453"},
+ {"OperaWebkitDesktop", "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.58 Safari/537.31 OPR/14.0.1074.57453"},
+ {"ChromeNothingAfterU", "Mozilla/5.0 (Linux; U) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.79 Safari/537.4"},
+ {"SafariOnSymbian", "Mozilla/5.0 (SymbianOS/9.1; U; [en-us]) AppleWebKit/413 (KHTML, like Gecko) Safari/413"},
+}
+
+// Slice of the expected results from the previous slice.
+var expected = []string{
+ // Bots
+ "Mozilla:5.0 Browser:Googlebot-2.1 Bot:true Mobile:false",
+ "Mozilla:5.0 Browser:Googlebot-2.1 Bot:true Mobile:true",
+ "Mozilla:5.0 Browser:bingbot-2.0 Bot:true Mobile:false",
+ "Mozilla:5.0 Browser:Baiduspider-2.0 Bot:true Mobile:false",
+ "Browser:Twitterbot Bot:true Mobile:false",
+ "Mozilla:5.0 Browser:Yahoo! Slurp Bot:true Mobile:false",
+ "Browser:facebookexternalhit-1.1 Bot:true Mobile:false",
+ "Browser:facebookplatform-1.0 Bot:true Mobile:false",
+ "Browser:Facebot Bot:true Mobile:false",
- // Dalvik
- {
- title: "Dalvik - Dell:001DL",
- ua: "Dalvik/1.2.0 (Linux; U; Android 2.2.2; 001DL Build/FRG83G)",
- expected: "Mozilla:5.0 Platform:Linux OS:Android 2.2.2 Bot:false Mobile:true",
- },
- {
- title: "Dalvik - HTC:001HT",
- ua: "Dalvik/1.4.0 (Linux; U; Android 2.3.3; 001HT Build/GRI40)",
- expected: "Mozilla:5.0 Platform:Linux OS:Android 2.3.3 Bot:false Mobile:true",
- },
- {
- title: "Dalvik - ZTE:009Z",
- ua: "Dalvik/1.4.0 (Linux; U; Android 2.3.4; 009Z Build/GINGERBREAD)",
- expected: "Mozilla:5.0 Platform:Linux OS:Android 2.3.4 Bot:false Mobile:true",
- },
- {
- title: "Dalvik - A850",
- ua: "Dalvik/1.6.0 (Linux; U; Android 4.2.2; A850 Build/JDQ39) Configuration/CLDC-1.1; Opera Mini/att/4.2",
- expected: "Mozilla:5.0 Platform:Linux OS:Android 4.2.2 Bot:false Mobile:true",
- },
- {
- title: "Dalvik - Asus:T00Q",
- ua: "Dalvik/1.6.0 (Linux; U; Android 4.4.2; ASUS_T00Q Build/KVT49L)/CLDC-1.1",
- expected: "Mozilla:5.0 Platform:Linux OS:Android 4.4.2 Bot:false Mobile:true",
- },
- {
- title: "Dalvik - W2430",
- ua: "Dalvik/1.6.0 (Linux; U; Android 4.0.4; W2430 Build/IMM76D)014; Profile/MIDP-2.1 Configuration/CLDC-1",
- expected: "Mozilla:5.0 Platform:Linux OS:Android 4.0.4 Bot:false Mobile:true",
- },
+ // Internet Explorer
+ "Mozilla:5.0 Platform:Windows OS:Windows 8 Browser:Internet Explorer-10.0 Engine:Trident Bot:false Mobile:false",
+ "Mozilla:4.0 Platform:Windows OS:Windows 8 Browser:Internet Explorer-10.0 Engine:Trident Bot:false Mobile:false",
+ "Mozilla:5.0 Platform:Windows OS:Windows 8 Browser:Internet Explorer-10.0 Engine:Trident Bot:false Mobile:false",
+ "Mozilla:4.0 Platform:Windows OS:Windows Phone OS 7.0 Browser:Internet Explorer-7.0 Engine:Trident Bot:false Mobile:true",
+ "Mozilla:4.0 Platform:Windows OS:Windows 2000 Browser:Internet Explorer-6.0 Engine:Trident Bot:false Mobile:false",
+ "Mozilla:4.0 Platform:Windows OS:Windows 7 Browser:Internet Explorer-8.0 Engine:Trident Bot:false Mobile:false",
+ "Mozilla:4.0 Platform:Windows OS:Windows 7 Browser:Internet Explorer-10.0 Engine:Trident Bot:false Mobile:false",
+ "Mozilla:5.0 Platform:Windows OS:Windows 8.1 Browser:Internet Explorer-11.0 Engine:Trident Bot:false Mobile:false",
+ "Mozilla:5.0 Platform:Windows OS:Windows 7 Browser:Internet Explorer-11.0 Engine:Trident Bot:false Mobile:false",
+ "Mozilla:5.0 Platform:Windows OS:Windows 7 Browser:Internet Explorer-11.0 Engine:Trident Bot:false Mobile:false",
+ "Mozilla:5.0 Platform:Windows OS:Windows 7 Browser:Internet Explorer-11.0 Engine:Trident Bot:false Mobile:false",
+ "Mozilla:4.0 Platform:Windows OS:Windows 8.1 Browser:Internet Explorer-7.0 Engine:Trident Bot:false Mobile:false",
+
+ // Gecko
+ "Mozilla:5.0 Platform:Macintosh OS:Intel Mac OS X 10.6 Browser:Firefox-4.0b8 Engine:Gecko-20100101 Bot:false Mobile:false",
+ "Mozilla:5.0 Platform:Macintosh OS:Intel Mac OS X 10.6 Localization:en-US Browser:Firefox-3.6.13 Engine:Gecko-20101203 Bot:false Mobile:false",
+ "Mozilla:5.0 Platform:X11 OS:Linux x86_64 Browser:Firefox-17.0 Engine:Gecko-20100101 Bot:false Mobile:false",
+ "Mozilla:5.0 Platform:Windows OS:Windows XP Localization:en-US Browser:Firefox-2.0.0.14 Engine:Gecko-20080404 Bot:false Mobile:false",
+ "Mozilla:5.0 Platform:Windows OS:Windows 7 Browser:Firefox-29.0 Engine:Gecko-20100101 Bot:false Mobile:false",
+ "Mozilla:5.0 Platform:Macintosh OS:Intel Mac OS X Localization:en Browser:Camino-1.6 Engine:Gecko-20080409 Bot:false Mobile:false",
+ "Mozilla:5.0 Platform:X11 OS:Linux i686 Localization:en-US Browser:Iceweasel-2.0 Engine:Gecko-20061024 Bot:false Mobile:false",
+ "Mozilla:5.0 Platform:Macintosh OS:Intel Mac OS X 10.6 Localization:en-US Browser:SeaMonkey-2.0 Engine:Gecko-20091017 Bot:false Mobile:false",
+ "Mozilla:5.0 Platform:Mobile OS:Android Browser:Firefox-17.0 Engine:Gecko-17.0 Bot:false Mobile:true",
+ "Mozilla:5.0 Platform:Tablet OS:Android Browser:Firefox-26.0 Engine:Gecko-26.0 Bot:false Mobile:true",
+ "Mozilla:5.0 Platform:Mobile OS:FirefoxOS Browser:Firefox-26.0 Engine:Gecko-26.0 Bot:false Mobile:true",
+ "Mozilla:5.0 Platform:Tablet OS:FirefoxOS Browser:Firefox-26.0 Engine:Gecko-26.0 Bot:false Mobile:true",
+ "Mozilla:5.0 Platform:Windows OS:Windows XP x64 Edition Browser:Firefox-31.0 Engine:Gecko-20100101 Bot:false Mobile:false",
+ "Mozilla:5.0 Platform:Windows OS:Windows XP Localization:en-US Browser:Firefox-24.0 Engine:Gecko-20130405 Bot:false Mobile:false",
+
+ // Opera
+ "Platform:Macintosh OS:Intel Mac OS X Localization:en Browser:Opera-9.27 Engine:Presto Bot:false Mobile:false",
+ "Platform:Windows OS:Windows XP Localization:en Browser:Opera-9.27 Engine:Presto Bot:false Mobile:false",
+ "Platform:Windows OS:Windows XP Browser:Opera-9.80 Engine:Presto-2.12.388 Bot:false Mobile:false",
+ "Platform:Windows OS:Windows Vista Browser:Opera-9.80 Engine:Presto-2.12.388 Bot:false Mobile:false",
+ "Browser:Opera-9.80 Engine:Presto Bot:false Mobile:false",
+ "Platform:Windows OS:Windows Vista Localization:en Browser:Opera-9.80 Engine:Presto-2.2.15 Bot:false Mobile:false",
+ "Platform:X11 OS:Linux x86_64 Browser:Opera-9.80 Engine:Presto-2.12.388 Bot:false Mobile:false",
+ "Platform:Android 4.2.1 OS:Linux Browser:Opera-9.80 Engine:Presto-2.11.355 Bot:false Mobile:true",
+ "Platform:Windows OS:Windows XP Browser:Opera-9.80 Engine:Presto-2.12.388 Bot:false Mobile:false",
+ "Platform:Windows OS:Windows 7 Localization:en Browser:Opera-9.80 Engine:Presto-2.9.168 Bot:false Mobile:false",
+
+ // Other
+ "Bot:false Mobile:false",
+ "Browser:nil Bot:false Mobile:false",
+ "Browser:Mozilla-4.0 Bot:false Mobile:false",
+ "Browser:Mozilla-5.0 Bot:false Mobile:false",
+ "Browser:amaya-9.51 Engine:libwww-5.4.0 Bot:false Mobile:false",
+ "Browser:Rails Engine:Testing Bot:false Mobile:false",
+ "Browser:Python-urllib-2.7 Bot:false Mobile:false",
+ "Browser:curl-7.28.1 Bot:false Mobile:false",
+
+ // WebKit
+ "Mozilla:5.0 Platform:X11 OS:Linux x86_64 Browser:Chrome-23.0.1271.97 Engine:AppleWebKit-537.11 Bot:false Mobile:false",
+ "Mozilla:5.0 Platform:Windows OS:Windows 7 Browser:Chrome-18.0.1025.168 Engine:AppleWebKit-535.19 Bot:false Mobile:false",
+ "Mozilla:5.0 Browser:Chrome-8.0.552.215 Engine:AppleWebKit-534.10 Bot:false Mobile:false",
+ "Mozilla:5.0 Platform:Macintosh OS:Intel Mac OS X 10_6_5 Localization:en-US Browser:Chrome-8.0.552.231 Engine:AppleWebKit-534.10 Bot:false Mobile:false",
+ "Mozilla:5.0 Platform:Macintosh OS:Intel Mac OS X 10_6_3 Localization:en-us Browser:Safari-5.0 Engine:AppleWebKit-533.16 Bot:false Mobile:false",
+ "Mozilla:5.0 Platform:Windows OS:Windows XP Localization:en Browser:Safari-4.0dp1 Engine:AppleWebKit-526.9 Bot:false Mobile:false",
+ "Mozilla:5.0 Platform:iPhone OS:CPU iPhone OS 7_0_3 like Mac OS X Browser:Safari-7.0 Engine:AppleWebKit-537.51.1 Bot:false Mobile:true",
+ "Mozilla:5.0 Platform:iPhone OS:CPU like Mac OS X Localization:en Browser:Safari-3.0 Engine:AppleWebKit-420.1 Bot:false Mobile:true",
+ "Mozilla:5.0 Platform:iPod OS:CPU like Mac OS X Localization:en Browser:Safari-3.0 Engine:AppleWebKit-420.1 Bot:false Mobile:true",
+ "Mozilla:5.0 Platform:iPad OS:CPU OS 3_2 like Mac OS X Localization:en-us Browser:Safari-4.0.4 Engine:AppleWebKit-531.21.10 Bot:false Mobile:true",
+ "Mozilla:5.0 Platform:webOS OS:Palm Localization:en-US Browser:webOS-1.0 Engine:AppleWebKit-532.2 Bot:false Mobile:true",
+ "Mozilla:5.0 Platform:Linux OS:Android 1.5 Localization:de- Browser:Android-3.1.2 Engine:AppleWebKit-528.5+ Bot:false Mobile:true",
+ "Mozilla:5.0 Platform:BlackBerry OS:BlackBerry 9800 Localization:en Browser:BlackBerry-6.0.0.141 Engine:AppleWebKit-534.1+ Bot:false Mobile:true",
+ "Mozilla:5.0 Platform:BlackBerry OS:BlackBerry Browser:BlackBerry-10.0.9.388 Engine:AppleWebKit-537.3+ Bot:false Mobile:true",
+ "Mozilla:5.0 Platform:Symbian OS:SymbianOS/9.4 Browser:Symbian-3.0 Engine:AppleWebKit-525 Bot:false Mobile:true",
+ "Mozilla:5.0 Platform:Linux OS:Android 4.2.1 Browser:Chrome-18.0.1025.166 Engine:AppleWebKit-535.19 Bot:false Mobile:true",
+ "Mozilla:5.0 Platform:en-us Localization:en-us Browser:Safari-3.1 Engine:AppleWebKit-525.13 Bot:false Mobile:false",
+ "Mozilla:5.0 Platform:Linux OS:Android 4.2.2 Browser:Opera-14.0.1074.57453 Engine:AppleWebKit-537.31 Bot:false Mobile:true",
+ "Mozilla:5.0 Platform:X11 OS:Linux x86_64 Browser:Opera-14.0.1074.57453 Engine:AppleWebKit-537.31 Bot:false Mobile:false",
+ "Mozilla:5.0 Platform:Linux OS:Linux Browser:Chrome-22.0.1229.79 Engine:AppleWebKit-537.4 Bot:false Mobile:false",
+ "Mozilla:5.0 Platform:Symbian OS:SymbianOS/9.1 Browser:Symbian-413 Engine:AppleWebKit-413 Bot:false Mobile:true",
}
// Internal: beautify the UserAgent reference into a string so it can be
@@ -507,11 +235,11 @@ func beautify(ua *UserAgent) (s string) {
// The test suite.
func TestUserAgent(t *testing.T) {
- for _, tt := range uastrings {
+ for i, tt := range uastrings {
ua := New(tt.ua)
got := beautify(ua)
- if tt.expected != got {
- t.Errorf("\nTest %v\ngot: %q\nexpected %q\n", tt.title, got, tt.expected)
+ if expected[i] != got {
+ t.Errorf("Test %v => %q, expected %q", tt.name, got, expected[i])
}
}
}
diff --git a/vendor/github.com/mssola/user_agent/bot.go b/vendor/github.com/mssola/user_agent/bot.go
index 2b118d661..efcab9253 100644
--- a/vendor/github.com/mssola/user_agent/bot.go
+++ b/vendor/github.com/mssola/user_agent/bot.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2014-2016 Miquel Sabaté Solà <mikisabate@gmail.com>
+// Copyright (C) 2014 Miquel Sabaté Solà <mikisabate@gmail.com>
// This file is licensed under the MIT license.
// See the LICENSE file.
@@ -9,8 +9,6 @@ import (
"strings"
)
-var botFromSiteRegexp = regexp.MustCompile("http://.+\\.\\w+")
-
// Get the name of the bot from the website that may be in the given comment. If
// there is no website in the comment, then an empty string is returned.
func getFromSite(comment []string) string {
@@ -25,7 +23,8 @@ func getFromSite(comment []string) string {
}
// Pick the site.
- results := botFromSiteRegexp.FindStringSubmatch(comment[idx])
+ re := regexp.MustCompile("http://.+\\.\\w+")
+ results := re.FindStringSubmatch(comment[idx])
if len(results) == 1 {
// If it's a simple comment, just return the name of the site.
if idx == 0 {
@@ -75,8 +74,6 @@ func (p *UserAgent) fixOther(sections []section) {
}
}
-var botRegex = regexp.MustCompile("(?i)(bot|crawler|sp(i|y)der|search|worm|fetch|nutch)")
-
// Check if we're dealing with a bot or with some weird browser. If that is the
// case, the receiver will be modified accordingly.
func (p *UserAgent) checkBot(sections []section) {
@@ -85,8 +82,9 @@ func (p *UserAgent) checkBot(sections []section) {
if len(sections) == 1 && sections[0].name != "Mozilla" {
p.mozilla = ""
- // Check whether the name has some suspicious "bot" or "crawler" in his name.
- if botRegex.Match([]byte(sections[0].name)) {
+ // Check whether the name has some suspicious "bot" in his name.
+ reg, _ := regexp.Compile("(?i)bot")
+ if reg.Match([]byte(sections[0].name)) {
p.setSimple(sections[0].name, "", true)
return
}
diff --git a/vendor/github.com/mssola/user_agent/browser.go b/vendor/github.com/mssola/user_agent/browser.go
index 17a243c36..74fb931ef 100644
--- a/vendor/github.com/mssola/user_agent/browser.go
+++ b/vendor/github.com/mssola/user_agent/browser.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2012-2016 Miquel Sabaté Solà <mikisabate@gmail.com>
+// Copyright (C) 2012-2014 Miquel Sabaté Solà <mikisabate@gmail.com>
// This file is licensed under the MIT license.
// See the LICENSE file.
@@ -9,8 +9,6 @@ import (
"strings"
)
-var ie11Regexp = regexp.MustCompile("^rv:(.+)$")
-
// A struct containing all the information that we might be
// interested from the browser.
type Browser struct {
@@ -36,16 +34,13 @@ func (p *UserAgent) detectBrowser(sections []section) {
slen := len(sections)
if sections[0].name == "Opera" {
+ p.mozilla = ""
p.browser.Name = "Opera"
p.browser.Version = sections[0].version
p.browser.Engine = "Presto"
if slen > 1 {
p.browser.EngineVersion = sections[1].version
}
- } else if sections[0].name == "Dalvik" {
- // When Dalvik VM is in use, there is no browser info attached to ua.
- // Although browser is still a Mozilla/5.0 compatible.
- p.mozilla = "5.0"
} else if slen > 1 {
engine := sections[1]
p.browser.Engine = engine.name
@@ -53,21 +48,13 @@ func (p *UserAgent) detectBrowser(sections []section) {
if slen > 2 {
p.browser.Version = sections[2].version
if engine.name == "AppleWebKit" {
- switch sections[slen-1].name {
- case "Edge":
- p.browser.Name = "Edge"
- p.browser.Version = sections[slen-1].version
- p.browser.Engine = "EdgeHTML"
- p.browser.EngineVersion = ""
- case "OPR":
+ if sections[slen-1].name == "OPR" {
p.browser.Name = "Opera"
p.browser.Version = sections[slen-1].version
- default:
- if sections[2].name == "Chrome" {
- p.browser.Name = "Chrome"
- } else {
- p.browser.Name = "Safari"
- }
+ } else if sections[2].name == "Chrome" {
+ p.browser.Name = "Chrome"
+ } else {
+ p.browser.Name = "Safari"
}
} else if engine.name == "Gecko" {
name := sections[2].name
@@ -80,8 +67,9 @@ func (p *UserAgent) detectBrowser(sections []section) {
// This is the new user agent from Internet Explorer 11.
p.browser.Engine = "Trident"
p.browser.Name = "Internet Explorer"
+ reg, _ := regexp.Compile("^rv:(.+)$")
for _, c := range sections[0].comment {
- version := ie11Regexp.FindStringSubmatch(c)
+ version := reg.FindStringSubmatch(c)
if len(version) > 0 {
p.browser.Version = version[1]
return
diff --git a/vendor/github.com/mssola/user_agent/operating_systems.go b/vendor/github.com/mssola/user_agent/operating_systems.go
index c4720a75a..0b1e93d29 100644
--- a/vendor/github.com/mssola/user_agent/operating_systems.go
+++ b/vendor/github.com/mssola/user_agent/operating_systems.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2012-2016 Miquel Sabaté Solà <mikisabate@gmail.com>
+// Copyright (C) 2012-2014 Miquel Sabaté Solà <mikisabate@gmail.com>
// This file is licensed under the MIT license.
// See the LICENSE file.
@@ -7,12 +7,12 @@ package user_agent
import "strings"
// Normalize the name of the operating system. By now, this just
-// affects to Windows NT.
+// affects to Windows.
//
// Returns a string containing the normalized name for the Operating System.
func normalizeOS(name string) string {
sp := strings.SplitN(name, " ", 3)
- if len(sp) != 3 || sp[1] != "NT" {
+ if len(sp) != 3 {
return name
}
@@ -33,7 +33,7 @@ func normalizeOS(name string) string {
return "Windows 8"
case "6.3":
return "Windows 8.1"
- case "10.0":
+ case "6.4":
return "Windows 10"
}
return name
@@ -193,23 +193,6 @@ func opera(p *UserAgent, comment []string) {
}
}
-// Guess the OS. Android browsers send Dalvik as the user agent in the
-// request header.
-//
-// The first argument p is a reference to the current UserAgent and the second
-// argument is a slice of strings containing the comment.
-func dalvik(p *UserAgent, comment []string) {
- slen := len(comment)
-
- if strings.HasPrefix(comment[0], "Linux") {
- p.platform = comment[0]
- if slen > 2 {
- p.os = comment[2]
- }
- p.mobile = true
- }
-}
-
// Given the comment of the first section of the UserAgent string,
// get the platform.
func getPlatform(comment []string) string {
@@ -255,10 +238,6 @@ func (p *UserAgent) detectOS(s section) {
if len(s.comment) > 0 {
opera(p, s.comment)
}
- } else if s.name == "Dalvik" {
- if len(s.comment) > 0 {
- dalvik(p, s.comment)
- }
} else {
// Check whether this is a bot or just a weird browser.
p.undecided = true
diff --git a/vendor/github.com/mssola/user_agent/user_agent.go b/vendor/github.com/mssola/user_agent/user_agent.go
index 18a673eef..74ddf273c 100644
--- a/vendor/github.com/mssola/user_agent/user_agent.go
+++ b/vendor/github.com/mssola/user_agent/user_agent.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2012-2016 Miquel Sabaté Solà <mikisabate@gmail.com>
+// Copyright (C) 2012-2014 Miquel Sabaté Solà <mikisabate@gmail.com>
// This file is licensed under the MIT license.
// See the LICENSE file.
@@ -8,7 +8,9 @@
// information that has been extracted from a parsed User Agent string.
package user_agent
-import "strings"
+import (
+ "strings"
+)
// A section contains the name of the product, its version and
// an optional comment.
@@ -139,9 +141,7 @@ func (p *UserAgent) Parse(ua string) {
}
if len(sections) > 0 {
- if sections[0].name == "Mozilla" {
- p.mozilla = sections[0].version
- }
+ p.mozilla = sections[0].version
p.detectBrowser(sections)
p.detectOS(sections[0])
@@ -167,8 +167,3 @@ func (p *UserAgent) Bot() bool {
func (p *UserAgent) Mobile() bool {
return p.mobile
}
-
-// Returns the original given user agent.
-func (p *UserAgent) UA() string {
- return p.ua
-}
diff --git a/vendor/github.com/pborman/uuid/CONTRIBUTING.md b/vendor/github.com/pborman/uuid/CONTRIBUTING.md
deleted file mode 100644
index 04fdf09f1..000000000
--- a/vendor/github.com/pborman/uuid/CONTRIBUTING.md
+++ /dev/null
@@ -1,10 +0,0 @@
-# How to contribute
-
-We definitely welcome patches and contribution to this project!
-
-### Legal requirements
-
-In order to protect both you and ourselves, you will need to sign the
-[Contributor License Agreement](https://cla.developers.google.com/clas).
-
-You may have already signed it for other Google projects.
diff --git a/vendor/github.com/pborman/uuid/sql.go b/vendor/github.com/pborman/uuid/sql.go
index d015bfd13..c84f900d5 100644
--- a/vendor/github.com/pborman/uuid/sql.go
+++ b/vendor/github.com/pborman/uuid/sql.go
@@ -5,7 +5,6 @@
package uuid
import (
- "database/sql/driver"
"errors"
"fmt"
)
@@ -57,10 +56,3 @@ func (uuid *UUID) Scan(src interface{}) error {
return nil
}
-
-// Value implements sql.Valuer so that UUIDs can be written to databases
-// transparently. Currently, UUIDs map to strings. Please consult
-// database-specific driver documentation for matching types.
-func (uuid UUID) Value() (driver.Value, error) {
- return uuid.String(), nil
-}
diff --git a/vendor/github.com/pborman/uuid/sql_test.go b/vendor/github.com/pborman/uuid/sql_test.go
index 103095156..4d26392af 100644
--- a/vendor/github.com/pborman/uuid/sql_test.go
+++ b/vendor/github.com/pborman/uuid/sql_test.go
@@ -85,12 +85,3 @@ func TestScan(t *testing.T) {
t.Error("UUID was not nil after scanning empty string")
}
}
-
-func TestValue(t *testing.T) {
- stringTest := "f47ac10b-58cc-0372-8567-0e02b2c3d479"
- uuid := Parse(stringTest)
- val, _ := uuid.Value()
- if val != stringTest {
- t.Error("Value() did not return expected string")
- }
-}
diff --git a/vendor/github.com/pborman/uuid/uuid.go b/vendor/github.com/pborman/uuid/uuid.go
index 82c9e7ee7..c4482cd87 100644
--- a/vendor/github.com/pborman/uuid/uuid.go
+++ b/vendor/github.com/pborman/uuid/uuid.go
@@ -13,20 +13,6 @@ import (
"strings"
)
-// Array is a pass-by-value UUID that can be used as an effecient key in a map.
-type Array [16]byte
-
-// UUID converts uuid into a slice.
-func (uuid Array) UUID() UUID {
- return uuid[:]
-}
-
-// String returns the string representation of uuid,
-// xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.
-func (uuid Array) String() string {
- return uuid.UUID().String()
-}
-
// A UUID is a 128 bit (16 byte) Universal Unique IDentifier as defined in RFC
// 4122.
type UUID []byte
@@ -90,17 +76,6 @@ func Equal(uuid1, uuid2 UUID) bool {
return bytes.Equal(uuid1, uuid2)
}
-// Array returns an array representation of uuid that can be used as a map key.
-// Array panics if uuid is not valid.
-func (uuid UUID) Array() Array {
- if len(uuid) != 16 {
- panic("invalid uuid")
- }
- var a Array
- copy(a[:], uuid)
- return a
-}
-
// String returns the string form of uuid, xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
// , or "" if uuid is invalid.
func (uuid UUID) String() string {
diff --git a/vendor/github.com/pborman/uuid/uuid_test.go b/vendor/github.com/pborman/uuid/uuid_test.go
index cb1cd5cf9..3835cc808 100644
--- a/vendor/github.com/pborman/uuid/uuid_test.go
+++ b/vendor/github.com/pborman/uuid/uuid_test.go
@@ -300,7 +300,7 @@ func TestNode(t *testing.T) {
t.Error("nodeid is all zeros")
}
- id := []byte{1, 2, 3, 4, 5, 6, 7, 8}
+ id := []byte{1,2,3,4,5,6,7,8}
SetNodeID(id)
ni = NodeID()
if !bytes.Equal(ni, id[:6]) {
@@ -431,40 +431,6 @@ func TestBadRand(t *testing.T) {
}
}
-func TestUUID_Array(t *testing.T) {
- expect := Array{
- 0xf4, 0x7a, 0xc1, 0x0b,
- 0x58, 0xcc,
- 0x03, 0x72,
- 0x85, 0x67,
- 0x0e, 0x02, 0xb2, 0xc3, 0xd4, 0x79,
- }
- uuid := Parse("f47ac10b-58cc-0372-8567-0e02b2c3d479")
- if uuid == nil {
- t.Fatal("invalid uuid")
- }
- if uuid.Array() != expect {
- t.Fatal("invalid array")
- }
-}
-
-func TestArray_UUID(t *testing.T) {
- array := Array{
- 0xf4, 0x7a, 0xc1, 0x0b,
- 0x58, 0xcc,
- 0x03, 0x72,
- 0x85, 0x67,
- 0x0e, 0x02, 0xb2, 0xc3, 0xd4, 0x79,
- }
- expect := Parse("f47ac10b-58cc-0372-8567-0e02b2c3d479")
- if expect == nil {
- t.Fatal("invalid uuid")
- }
- if !bytes.Equal(array.UUID(), expect) {
- t.Fatal("invalid uuid")
- }
-}
-
func BenchmarkParse(b *testing.B) {
for i := 0; i < b.N; i++ {
uuid := Parse("f47ac10b-58cc-0372-8567-0e02b2c3d479")
@@ -503,41 +469,3 @@ func BenchmarkUUID_URN(b *testing.B) {
}
}
}
-
-func BenchmarkUUID_Array(b *testing.B) {
- expect := Array{
- 0xf4, 0x7a, 0xc1, 0x0b,
- 0x58, 0xcc,
- 0x03, 0x72,
- 0x85, 0x67,
- 0x0e, 0x02, 0xb2, 0xc3, 0xd4, 0x79,
- }
- uuid := Parse("f47ac10b-58cc-0372-8567-0e02b2c3d479")
- if uuid == nil {
- b.Fatal("invalid uuid")
- }
- for i := 0; i < b.N; i++ {
- if uuid.Array() != expect {
- b.Fatal("invalid array")
- }
- }
-}
-
-func BenchmarkArray_UUID(b *testing.B) {
- array := Array{
- 0xf4, 0x7a, 0xc1, 0x0b,
- 0x58, 0xcc,
- 0x03, 0x72,
- 0x85, 0x67,
- 0x0e, 0x02, 0xb2, 0xc3, 0xd4, 0x79,
- }
- expect := Parse("f47ac10b-58cc-0372-8567-0e02b2c3d479")
- if expect == nil {
- b.Fatal("invalid uuid")
- }
- for i := 0; i < b.N; i++ {
- if !bytes.Equal(array.UUID(), expect) {
- b.Fatal("invalid uuid")
- }
- }
-}
diff --git a/vendor/github.com/segmentio/analytics-go/cli/cli.go b/vendor/github.com/segmentio/analytics-go/cli/cli.go
deleted file mode 100644
index 9d1f940c9..000000000
--- a/vendor/github.com/segmentio/analytics-go/cli/cli.go
+++ /dev/null
@@ -1,174 +0,0 @@
-package main
-
-import (
- "encoding/json"
- "log"
- "os"
- "reflect"
-
- "github.com/segmentio/analytics-go"
- "github.com/tj/docopt"
-)
-
-const Usage = `
-Analytics Go CLI
-
-Usage:
- analytics track <event> [--properties=<properties>] [--context=<context>] [--writeKey=<writeKey>] [--userId=<userId>] [--anonymousId=<anonymousId>] [--integrations=<integrations>] [--timestamp=<timestamp>]
- analytics screen <name> [--properties=<properties>] [--context=<context>] [--writeKey=<writeKey>] [--userId=<userId>] [--anonymousId=<anonymousId>] [--integrations=<integrations>] [--timestamp=<timestamp>]
- analytics page <name> [--properties=<properties>] [--context=<context>] [--writeKey=<writeKey>] [--userId=<userId>] [--anonymousId=<anonymousId>] [--integrations=<integrations>] [--timestamp=<timestamp>]
- analytics identify [--traits=<traits>] [--context=<context>] [--writeKey=<writeKey>] [--userId=<userId>] [--anonymousId=<anonymousId>] [--integrations=<integrations>] [--timestamp=<timestamp>]
- analytics group --groupId=<groupId> [--traits=<traits>] [--properties=<properties>] [--context=<context>] [--writeKey=<writeKey>] [--userId=<userId>] [--anonymousId=<anonymousId>] [--integrations=<integrations>] [--timestamp=<timestamp>]
- analytics alias --userId=<userId> --previousId=<previousId> [--traits=<traits>] [--properties=<properties>] [--context=<context>] [--writeKey=<writeKey>] [--anonymousId=<anonymousId>] [--integrations=<integrations>] [--timestamp=<timestamp>]
- analytics -h | --help
- analytics --version
-
-Options:
- -h --help Show this screen.
- --version Show version.
-`
-
-func main() {
- arguments, err := docopt.Parse(Usage, nil, true, "Anaytics Go CLI", false)
- check(err)
-
- writeKey := getOptionalString(arguments, "--writeKey")
- if writeKey == "" {
- writeKey = os.Getenv("SEGMENT_WRITE_KEY")
- if writeKey == "" {
- log.Fatal("either $SEGMENT_WRITE_KEY or --writeKey must be provided")
- }
- }
-
- client := analytics.New(writeKey)
- client.Size = 1
- client.Verbose = true
-
- if arguments["track"].(bool) {
- m := &analytics.Track{
- Event: arguments["<event>"].(string),
- }
- properties := getOptionalString(arguments, "--properties")
- if properties != "" {
- var parsedProperties map[string]interface{}
- err := json.Unmarshal([]byte(properties), &parsedProperties)
- check(err)
- m.Properties = parsedProperties
- }
-
- setCommonFields(m, arguments)
-
- check(client.Track(m))
- }
-
- if arguments["screen"].(bool) || arguments["page"].(bool) {
- m := &analytics.Page{
- Name: arguments["<name>"].(string),
- }
- /* Bug in Go library - page has traits not properties.
- properties := getOptionalString(arguments, "--properties")
- if properties != "" {
- var parsedProperties map[string]interface{}
- err := json.Unmarshal([]byte(properties), &parsedProperties)
- check(err)
- t.Properties = parsedProperties
- }
- */
-
- setCommonFields(m, arguments)
-
- check(client.Page(m))
- }
-
- if arguments["identify"].(bool) {
- m := &analytics.Identify{}
- traits := getOptionalString(arguments, "--traits")
- if traits != "" {
- var parsedTraits map[string]interface{}
- err := json.Unmarshal([]byte(traits), &parsedTraits)
- check(err)
- m.Traits = parsedTraits
- }
-
- setCommonFields(m, arguments)
-
- check(client.Identify(m))
- }
-
- if arguments["group"].(bool) {
- m := &analytics.Group{
- GroupId: arguments["--groupId"].(string),
- }
- traits := getOptionalString(arguments, "--traits")
- if traits != "" {
- var parsedTraits map[string]interface{}
- err := json.Unmarshal([]byte(traits), &parsedTraits)
- check(err)
- m.Traits = parsedTraits
- }
-
- setCommonFields(m, arguments)
-
- check(client.Group(m))
- }
-
- if arguments["alias"].(bool) {
- m := &analytics.Alias{
- PreviousId: arguments["--previousId"].(string),
- }
-
- setCommonFields(m, arguments)
-
- check(client.Alias(m))
- }
-
- client.Close()
-}
-
-func setCommonFields(message interface{}, arguments map[string]interface{}) {
- userId := getOptionalString(arguments, "--userId")
- if userId != "" {
- setFieldValue(message, "UserId", userId)
- }
- anonymousId := getOptionalString(arguments, "--anonymousId")
- if anonymousId != "" {
- setFieldValue(message, "AnonymousId", anonymousId)
- }
- integrations := getOptionalString(arguments, "--integrations")
- if integrations != "" {
- var parsedIntegrations map[string]interface{}
- err := json.Unmarshal([]byte(integrations), &parsedIntegrations)
- check(err)
- setFieldValue(message, "Integrations", parsedIntegrations)
- }
- context := getOptionalString(arguments, "--context")
- if context != "" {
- var parsedContext map[string]interface{}
- err := json.Unmarshal([]byte(context), &parsedContext)
- check(err)
- setFieldValue(message, "Context", parsedContext)
-
- }
- timestamp := getOptionalString(arguments, "--timestamp")
- if timestamp != "" {
- setFieldValue(message, "Timestamp", timestamp)
- }
-}
-
-func setFieldValue(target interface{}, field string, value interface{}) {
- reflect.ValueOf(target).Elem().FieldByName(field).Set(reflect.ValueOf(value))
-}
-
-func getOptionalString(m map[string]interface{}, k string) string {
- v := m[k]
- if v == nil {
- return ""
- }
- return v.(string)
-}
-
-func check(err error) {
- if err != nil {
- log.Fatal(err)
- }
-}
diff --git a/vendor/github.com/segmentio/backo-go/.gitmodules b/vendor/github.com/segmentio/backo-go/.gitmodules
new file mode 100644
index 000000000..36de92977
--- /dev/null
+++ b/vendor/github.com/segmentio/backo-go/.gitmodules
@@ -0,0 +1,3 @@
+[submodule "vendor/github.com/bmizerany/assert"]
+ path = vendor/github.com/bmizerany/assert
+ url = https://github.com/bmizerany/assert
diff --git a/vendor/golang.org/x/crypto/acme/acme.go b/vendor/golang.org/x/crypto/acme/acme.go
new file mode 100644
index 000000000..be18ad73b
--- /dev/null
+++ b/vendor/golang.org/x/crypto/acme/acme.go
@@ -0,0 +1,944 @@
+// Copyright 2015 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package acme provides an implementation of the
+// Automatic Certificate Management Environment (ACME) spec.
+// See https://tools.ietf.org/html/draft-ietf-acme-acme-02 for details.
+//
+// Most common scenarios will want to use autocert subdirectory instead,
+// which provides automatic access to certificates from Let's Encrypt
+// and any other ACME-based CA.
+//
+// This package is a work in progress and makes no API stability promises.
+package acme
+
+import (
+ "bytes"
+ "crypto"
+ "crypto/ecdsa"
+ "crypto/elliptic"
+ "crypto/rand"
+ "crypto/sha256"
+ "crypto/tls"
+ "crypto/x509"
+ "encoding/base64"
+ "encoding/hex"
+ "encoding/json"
+ "encoding/pem"
+ "errors"
+ "fmt"
+ "io"
+ "io/ioutil"
+ "math/big"
+ "net/http"
+ "strconv"
+ "strings"
+ "sync"
+ "time"
+
+ "golang.org/x/net/context"
+ "golang.org/x/net/context/ctxhttp"
+)
+
+// LetsEncryptURL is the Directory endpoint of Let's Encrypt CA.
+const LetsEncryptURL = "https://acme-v01.api.letsencrypt.org/directory"
+
+const (
+ maxChainLen = 5 // max depth and breadth of a certificate chain
+ maxCertSize = 1 << 20 // max size of a certificate, in bytes
+)
+
+// CertOption is an optional argument type for Client methods which manipulate
+// certificate data.
+type CertOption interface {
+ privateCertOpt()
+}
+
+// WithKey creates an option holding a private/public key pair.
+// The private part signs a certificate, and the public part represents the signee.
+func WithKey(key crypto.Signer) CertOption {
+ return &certOptKey{key}
+}
+
+type certOptKey struct {
+ key crypto.Signer
+}
+
+func (*certOptKey) privateCertOpt() {}
+
+// WithTemplate creates an option for specifying a certificate template.
+// See x509.CreateCertificate for template usage details.
+//
+// In TLSSNIxChallengeCert methods, the template is also used as parent,
+// resulting in a self-signed certificate.
+// The DNSNames field of t is always overwritten for tls-sni challenge certs.
+func WithTemplate(t *x509.Certificate) CertOption {
+ return (*certOptTemplate)(t)
+}
+
+type certOptTemplate x509.Certificate
+
+func (*certOptTemplate) privateCertOpt() {}
+
+// Client is an ACME client.
+// The only required field is Key. An example of creating a client with a new key
+// is as follows:
+//
+// key, err := rsa.GenerateKey(rand.Reader, 2048)
+// if err != nil {
+// log.Fatal(err)
+// }
+// client := &Client{Key: key}
+//
+type Client struct {
+ // Key is the account key used to register with a CA and sign requests.
+ // Key.Public() must return a *rsa.PublicKey or *ecdsa.PublicKey.
+ Key crypto.Signer
+
+ // HTTPClient optionally specifies an HTTP client to use
+ // instead of http.DefaultClient.
+ HTTPClient *http.Client
+
+ // DirectoryURL points to the CA directory endpoint.
+ // If empty, LetsEncryptURL is used.
+ // Mutating this value after a successful call of Client's Discover method
+ // will have no effect.
+ DirectoryURL string
+
+ dirMu sync.Mutex // guards writes to dir
+ dir *Directory // cached result of Client's Discover method
+}
+
+// Discover performs ACME server discovery using c.DirectoryURL.
+//
+// It caches successful result. So, subsequent calls will not result in
+// a network round-trip. This also means mutating c.DirectoryURL after successful call
+// of this method will have no effect.
+func (c *Client) Discover(ctx context.Context) (Directory, error) {
+ c.dirMu.Lock()
+ defer c.dirMu.Unlock()
+ if c.dir != nil {
+ return *c.dir, nil
+ }
+
+ dirURL := c.DirectoryURL
+ if dirURL == "" {
+ dirURL = LetsEncryptURL
+ }
+ res, err := ctxhttp.Get(ctx, c.HTTPClient, dirURL)
+ if err != nil {
+ return Directory{}, err
+ }
+ defer res.Body.Close()
+ if res.StatusCode != http.StatusOK {
+ return Directory{}, responseError(res)
+ }
+
+ var v struct {
+ Reg string `json:"new-reg"`
+ Authz string `json:"new-authz"`
+ Cert string `json:"new-cert"`
+ Revoke string `json:"revoke-cert"`
+ Meta struct {
+ Terms string `json:"terms-of-service"`
+ Website string `json:"website"`
+ CAA []string `json:"caa-identities"`
+ }
+ }
+ if json.NewDecoder(res.Body).Decode(&v); err != nil {
+ return Directory{}, err
+ }
+ c.dir = &Directory{
+ RegURL: v.Reg,
+ AuthzURL: v.Authz,
+ CertURL: v.Cert,
+ RevokeURL: v.Revoke,
+ Terms: v.Meta.Terms,
+ Website: v.Meta.Website,
+ CAA: v.Meta.CAA,
+ }
+ return *c.dir, nil
+}
+
+// CreateCert requests a new certificate using the Certificate Signing Request csr encoded in DER format.
+// The exp argument indicates the desired certificate validity duration. CA may issue a certificate
+// with a different duration.
+// If the bundle argument is true, the returned value will also contain the CA (issuer) certificate chain.
+//
+// In the case where CA server does not provide the issued certificate in the response,
+// CreateCert will poll certURL using c.FetchCert, which will result in additional round-trips.
+// In such scenario the caller can cancel the polling with ctx.
+//
+// CreateCert returns an error if the CA's response or chain was unreasonably large.
+// Callers are encouraged to parse the returned value to ensure the certificate is valid and has the expected features.
+func (c *Client) CreateCert(ctx context.Context, csr []byte, exp time.Duration, bundle bool) (der [][]byte, certURL string, err error) {
+ if _, err := c.Discover(ctx); err != nil {
+ return nil, "", err
+ }
+
+ req := struct {
+ Resource string `json:"resource"`
+ CSR string `json:"csr"`
+ NotBefore string `json:"notBefore,omitempty"`
+ NotAfter string `json:"notAfter,omitempty"`
+ }{
+ Resource: "new-cert",
+ CSR: base64.RawURLEncoding.EncodeToString(csr),
+ }
+ now := timeNow()
+ req.NotBefore = now.Format(time.RFC3339)
+ if exp > 0 {
+ req.NotAfter = now.Add(exp).Format(time.RFC3339)
+ }
+
+ res, err := postJWS(ctx, c.HTTPClient, c.Key, c.dir.CertURL, req)
+ if err != nil {
+ return nil, "", err
+ }
+ defer res.Body.Close()
+ if res.StatusCode != http.StatusCreated {
+ return nil, "", responseError(res)
+ }
+
+ curl := res.Header.Get("location") // cert permanent URL
+ if res.ContentLength == 0 {
+ // no cert in the body; poll until we get it
+ cert, err := c.FetchCert(ctx, curl, bundle)
+ return cert, curl, err
+ }
+ // slurp issued cert and CA chain, if requested
+ cert, err := responseCert(ctx, c.HTTPClient, res, bundle)
+ return cert, curl, err
+}
+
+// FetchCert retrieves already issued certificate from the given url, in DER format.
+// It retries the request until the certificate is successfully retrieved,
+// context is cancelled by the caller or an error response is received.
+//
+// The returned value will also contain the CA (issuer) certificate if the bundle argument is true.
+//
+// FetchCert returns an error if the CA's response or chain was unreasonably large.
+// Callers are encouraged to parse the returned value to ensure the certificate is valid
+// and has expected features.
+func (c *Client) FetchCert(ctx context.Context, url string, bundle bool) ([][]byte, error) {
+ for {
+ res, err := ctxhttp.Get(ctx, c.HTTPClient, url)
+ if err != nil {
+ return nil, err
+ }
+ defer res.Body.Close()
+ if res.StatusCode == http.StatusOK {
+ return responseCert(ctx, c.HTTPClient, res, bundle)
+ }
+ if res.StatusCode > 299 {
+ return nil, responseError(res)
+ }
+ d := retryAfter(res.Header.Get("retry-after"), 3*time.Second)
+ select {
+ case <-time.After(d):
+ // retry
+ case <-ctx.Done():
+ return nil, ctx.Err()
+ }
+ }
+}
+
+// RevokeCert revokes a previously issued certificate cert, provided in DER format.
+//
+// The key argument, used to sign the request, must be authorized
+// to revoke the certificate. It's up to the CA to decide which keys are authorized.
+// For instance, the key pair of the certificate may be authorized.
+// If the key is nil, c.Key is used instead.
+func (c *Client) RevokeCert(ctx context.Context, key crypto.Signer, cert []byte, reason CRLReasonCode) error {
+ if _, err := c.Discover(ctx); err != nil {
+ return err
+ }
+
+ body := &struct {
+ Resource string `json:"resource"`
+ Cert string `json:"certificate"`
+ Reason int `json:"reason"`
+ }{
+ Resource: "revoke-cert",
+ Cert: base64.RawURLEncoding.EncodeToString(cert),
+ Reason: int(reason),
+ }
+ if key == nil {
+ key = c.Key
+ }
+ res, err := postJWS(ctx, c.HTTPClient, key, c.dir.RevokeURL, body)
+ if err != nil {
+ return err
+ }
+ defer res.Body.Close()
+ if res.StatusCode != http.StatusOK {
+ return responseError(res)
+ }
+ return nil
+}
+
+// AcceptTOS always returns true to indicate the acceptance of a CA's Terms of Service
+// during account registration. See Register method of Client for more details.
+func AcceptTOS(tosURL string) bool { return true }
+
+// Register creates a new account registration by following the "new-reg" flow.
+// It returns registered account. The a argument is not modified.
+//
+// The registration may require the caller to agree to the CA's Terms of Service (TOS).
+// If so, and the account has not indicated the acceptance of the terms (see Account for details),
+// Register calls prompt with a TOS URL provided by the CA. Prompt should report
+// whether the caller agrees to the terms. To always accept the terms, the caller can use AcceptTOS.
+func (c *Client) Register(ctx context.Context, a *Account, prompt func(tosURL string) bool) (*Account, error) {
+ if _, err := c.Discover(ctx); err != nil {
+ return nil, err
+ }
+
+ var err error
+ if a, err = c.doReg(ctx, c.dir.RegURL, "new-reg", a); err != nil {
+ return nil, err
+ }
+ var accept bool
+ if a.CurrentTerms != "" && a.CurrentTerms != a.AgreedTerms {
+ accept = prompt(a.CurrentTerms)
+ }
+ if accept {
+ a.AgreedTerms = a.CurrentTerms
+ a, err = c.UpdateReg(ctx, a)
+ }
+ return a, err
+}
+
+// GetReg retrieves an existing registration.
+// The url argument is an Account URI.
+func (c *Client) GetReg(ctx context.Context, url string) (*Account, error) {
+ a, err := c.doReg(ctx, url, "reg", nil)
+ if err != nil {
+ return nil, err
+ }
+ a.URI = url
+ return a, nil
+}
+
+// UpdateReg updates an existing registration.
+// It returns an updated account copy. The provided account is not modified.
+func (c *Client) UpdateReg(ctx context.Context, a *Account) (*Account, error) {
+ uri := a.URI
+ a, err := c.doReg(ctx, uri, "reg", a)
+ if err != nil {
+ return nil, err
+ }
+ a.URI = uri
+ return a, nil
+}
+
+// Authorize performs the initial step in an authorization flow.
+// The caller will then need to choose from and perform a set of returned
+// challenges using c.Accept in order to successfully complete authorization.
+//
+// If an authorization has been previously granted, the CA may return
+// a valid authorization (Authorization.Status is StatusValid). If so, the caller
+// need not fulfill any challenge and can proceed to requesting a certificate.
+func (c *Client) Authorize(ctx context.Context, domain string) (*Authorization, error) {
+ if _, err := c.Discover(ctx); err != nil {
+ return nil, err
+ }
+
+ type authzID struct {
+ Type string `json:"type"`
+ Value string `json:"value"`
+ }
+ req := struct {
+ Resource string `json:"resource"`
+ Identifier authzID `json:"identifier"`
+ }{
+ Resource: "new-authz",
+ Identifier: authzID{Type: "dns", Value: domain},
+ }
+ res, err := postJWS(ctx, c.HTTPClient, c.Key, c.dir.AuthzURL, req)
+ if err != nil {
+ return nil, err
+ }
+ defer res.Body.Close()
+ if res.StatusCode != http.StatusCreated {
+ return nil, responseError(res)
+ }
+
+ var v wireAuthz
+ if err := json.NewDecoder(res.Body).Decode(&v); err != nil {
+ return nil, fmt.Errorf("acme: invalid response: %v", err)
+ }
+ if v.Status != StatusPending && v.Status != StatusValid {
+ return nil, fmt.Errorf("acme: unexpected status: %s", v.Status)
+ }
+ return v.authorization(res.Header.Get("Location")), nil
+}
+
+// GetAuthorization retrieves an authorization identified by the given URL.
+//
+// If a caller needs to poll an authorization until its status is final,
+// see the WaitAuthorization method.
+func (c *Client) GetAuthorization(ctx context.Context, url string) (*Authorization, error) {
+ res, err := ctxhttp.Get(ctx, c.HTTPClient, url)
+ if err != nil {
+ return nil, err
+ }
+ defer res.Body.Close()
+ if res.StatusCode != http.StatusOK && res.StatusCode != http.StatusAccepted {
+ return nil, responseError(res)
+ }
+ var v wireAuthz
+ if err := json.NewDecoder(res.Body).Decode(&v); err != nil {
+ return nil, fmt.Errorf("acme: invalid response: %v", err)
+ }
+ return v.authorization(url), nil
+}
+
+// RevokeAuthorization relinquishes an existing authorization identified
+// by the given URL.
+// The url argument is an Authorization.URI value.
+//
+// If successful, the caller will be required to obtain a new authorization
+// using the Authorize method before being able to request a new certificate
+// for the domain associated with the authorization.
+//
+// It does not revoke existing certificates.
+func (c *Client) RevokeAuthorization(ctx context.Context, url string) error {
+ req := struct {
+ Resource string `json:"resource"`
+ Delete bool `json:"delete"`
+ }{
+ Resource: "authz",
+ Delete: true,
+ }
+ res, err := postJWS(ctx, c.HTTPClient, c.Key, url, req)
+ if err != nil {
+ return err
+ }
+ defer res.Body.Close()
+ if res.StatusCode != http.StatusOK {
+ return responseError(res)
+ }
+ return nil
+}
+
+// WaitAuthorization polls an authorization at the given URL
+// until it is in one of the final states, StatusValid or StatusInvalid,
+// or the context is done.
+//
+// It returns a non-nil Authorization only if its Status is StatusValid.
+// In all other cases WaitAuthorization returns an error.
+// If the Status is StatusInvalid, the returned error is ErrAuthorizationFailed.
+func (c *Client) WaitAuthorization(ctx context.Context, url string) (*Authorization, error) {
+ var count int
+ sleep := func(v string, inc int) error {
+ count += inc
+ d := backoff(count, 10*time.Second)
+ d = retryAfter(v, d)
+ wakeup := time.NewTimer(d)
+ defer wakeup.Stop()
+ select {
+ case <-ctx.Done():
+ return ctx.Err()
+ case <-wakeup.C:
+ return nil
+ }
+ }
+
+ for {
+ res, err := ctxhttp.Get(ctx, c.HTTPClient, url)
+ if err != nil {
+ return nil, err
+ }
+ retry := res.Header.Get("retry-after")
+ if res.StatusCode != http.StatusOK && res.StatusCode != http.StatusAccepted {
+ res.Body.Close()
+ if err := sleep(retry, 1); err != nil {
+ return nil, err
+ }
+ continue
+ }
+ var raw wireAuthz
+ err = json.NewDecoder(res.Body).Decode(&raw)
+ res.Body.Close()
+ if err != nil {
+ if err := sleep(retry, 0); err != nil {
+ return nil, err
+ }
+ continue
+ }
+ if raw.Status == StatusValid {
+ return raw.authorization(url), nil
+ }
+ if raw.Status == StatusInvalid {
+ return nil, ErrAuthorizationFailed
+ }
+ if err := sleep(retry, 0); err != nil {
+ return nil, err
+ }
+ }
+}
+
+// GetChallenge retrieves the current status of an challenge.
+//
+// A client typically polls a challenge status using this method.
+func (c *Client) GetChallenge(ctx context.Context, url string) (*Challenge, error) {
+ res, err := ctxhttp.Get(ctx, c.HTTPClient, url)
+ if err != nil {
+ return nil, err
+ }
+ defer res.Body.Close()
+ if res.StatusCode != http.StatusOK && res.StatusCode != http.StatusAccepted {
+ return nil, responseError(res)
+ }
+ v := wireChallenge{URI: url}
+ if err := json.NewDecoder(res.Body).Decode(&v); err != nil {
+ return nil, fmt.Errorf("acme: invalid response: %v", err)
+ }
+ return v.challenge(), nil
+}
+
+// Accept informs the server that the client accepts one of its challenges
+// previously obtained with c.Authorize.
+//
+// The server will then perform the validation asynchronously.
+func (c *Client) Accept(ctx context.Context, chal *Challenge) (*Challenge, error) {
+ auth, err := keyAuth(c.Key.Public(), chal.Token)
+ if err != nil {
+ return nil, err
+ }
+
+ req := struct {
+ Resource string `json:"resource"`
+ Type string `json:"type"`
+ Auth string `json:"keyAuthorization"`
+ }{
+ Resource: "challenge",
+ Type: chal.Type,
+ Auth: auth,
+ }
+ res, err := postJWS(ctx, c.HTTPClient, c.Key, chal.URI, req)
+ if err != nil {
+ return nil, err
+ }
+ defer res.Body.Close()
+ // Note: the protocol specifies 200 as the expected response code, but
+ // letsencrypt seems to be returning 202.
+ if res.StatusCode != http.StatusOK && res.StatusCode != http.StatusAccepted {
+ return nil, responseError(res)
+ }
+
+ var v wireChallenge
+ if err := json.NewDecoder(res.Body).Decode(&v); err != nil {
+ return nil, fmt.Errorf("acme: invalid response: %v", err)
+ }
+ return v.challenge(), nil
+}
+
+// DNS01ChallengeRecord returns a DNS record value for a dns-01 challenge response.
+// A TXT record containing the returned value must be provisioned under
+// "_acme-challenge" name of the domain being validated.
+//
+// The token argument is a Challenge.Token value.
+func (c *Client) DNS01ChallengeRecord(token string) (string, error) {
+ ka, err := keyAuth(c.Key.Public(), token)
+ if err != nil {
+ return "", err
+ }
+ b := sha256.Sum256([]byte(ka))
+ return base64.RawURLEncoding.EncodeToString(b[:]), nil
+}
+
+// HTTP01ChallengeResponse returns the response for an http-01 challenge.
+// Servers should respond with the value to HTTP requests at the URL path
+// provided by HTTP01ChallengePath to validate the challenge and prove control
+// over a domain name.
+//
+// The token argument is a Challenge.Token value.
+func (c *Client) HTTP01ChallengeResponse(token string) (string, error) {
+ return keyAuth(c.Key.Public(), token)
+}
+
+// HTTP01ChallengePath returns the URL path at which the response for an http-01 challenge
+// should be provided by the servers.
+// The response value can be obtained with HTTP01ChallengeResponse.
+//
+// The token argument is a Challenge.Token value.
+func (c *Client) HTTP01ChallengePath(token string) string {
+ return "/.well-known/acme-challenge/" + token
+}
+
+// TLSSNI01ChallengeCert creates a certificate for TLS-SNI-01 challenge response.
+// Servers can present the certificate to validate the challenge and prove control
+// over a domain name.
+//
+// The implementation is incomplete in that the returned value is a single certificate,
+// computed only for Z0 of the key authorization. ACME CAs are expected to update
+// their implementations to use the newer version, TLS-SNI-02.
+// For more details on TLS-SNI-01 see https://tools.ietf.org/html/draft-ietf-acme-acme-01#section-7.3.
+//
+// The token argument is a Challenge.Token value.
+// If a WithKey option is provided, its private part signs the returned cert,
+// and the public part is used to specify the signee.
+// If no WithKey option is provided, a new ECDSA key is generated using P-256 curve.
+//
+// The returned certificate is valid for the next 24 hours and must be presented only when
+// the server name of the client hello matches exactly the returned name value.
+func (c *Client) TLSSNI01ChallengeCert(token string, opt ...CertOption) (cert tls.Certificate, name string, err error) {
+ ka, err := keyAuth(c.Key.Public(), token)
+ if err != nil {
+ return tls.Certificate{}, "", err
+ }
+ b := sha256.Sum256([]byte(ka))
+ h := hex.EncodeToString(b[:])
+ name = fmt.Sprintf("%s.%s.acme.invalid", h[:32], h[32:])
+ cert, err = tlsChallengeCert([]string{name}, opt)
+ if err != nil {
+ return tls.Certificate{}, "", err
+ }
+ return cert, name, nil
+}
+
+// TLSSNI02ChallengeCert creates a certificate for TLS-SNI-02 challenge response.
+// Servers can present the certificate to validate the challenge and prove control
+// over a domain name. For more details on TLS-SNI-02 see
+// https://tools.ietf.org/html/draft-ietf-acme-acme-03#section-7.3.
+//
+// The token argument is a Challenge.Token value.
+// If a WithKey option is provided, its private part signs the returned cert,
+// and the public part is used to specify the signee.
+// If no WithKey option is provided, a new ECDSA key is generated using P-256 curve.
+//
+// The returned certificate is valid for the next 24 hours and must be presented only when
+// the server name in the client hello matches exactly the returned name value.
+func (c *Client) TLSSNI02ChallengeCert(token string, opt ...CertOption) (cert tls.Certificate, name string, err error) {
+ b := sha256.Sum256([]byte(token))
+ h := hex.EncodeToString(b[:])
+ sanA := fmt.Sprintf("%s.%s.token.acme.invalid", h[:32], h[32:])
+
+ ka, err := keyAuth(c.Key.Public(), token)
+ if err != nil {
+ return tls.Certificate{}, "", err
+ }
+ b = sha256.Sum256([]byte(ka))
+ h = hex.EncodeToString(b[:])
+ sanB := fmt.Sprintf("%s.%s.ka.acme.invalid", h[:32], h[32:])
+
+ cert, err = tlsChallengeCert([]string{sanA, sanB}, opt)
+ if err != nil {
+ return tls.Certificate{}, "", err
+ }
+ return cert, sanA, nil
+}
+
+// doReg sends all types of registration requests.
+// The type of request is identified by typ argument, which is a "resource"
+// in the ACME spec terms.
+//
+// A non-nil acct argument indicates whether the intention is to mutate data
+// of the Account. Only Contact and Agreement of its fields are used
+// in such cases.
+func (c *Client) doReg(ctx context.Context, url string, typ string, acct *Account) (*Account, error) {
+ req := struct {
+ Resource string `json:"resource"`
+ Contact []string `json:"contact,omitempty"`
+ Agreement string `json:"agreement,omitempty"`
+ }{
+ Resource: typ,
+ }
+ if acct != nil {
+ req.Contact = acct.Contact
+ req.Agreement = acct.AgreedTerms
+ }
+ res, err := postJWS(ctx, c.HTTPClient, c.Key, url, req)
+ if err != nil {
+ return nil, err
+ }
+ defer res.Body.Close()
+ if res.StatusCode < 200 || res.StatusCode > 299 {
+ return nil, responseError(res)
+ }
+
+ var v struct {
+ Contact []string
+ Agreement string
+ Authorizations string
+ Certificates string
+ }
+ if err := json.NewDecoder(res.Body).Decode(&v); err != nil {
+ return nil, fmt.Errorf("acme: invalid response: %v", err)
+ }
+ var tos string
+ if v := linkHeader(res.Header, "terms-of-service"); len(v) > 0 {
+ tos = v[0]
+ }
+ var authz string
+ if v := linkHeader(res.Header, "next"); len(v) > 0 {
+ authz = v[0]
+ }
+ return &Account{
+ URI: res.Header.Get("Location"),
+ Contact: v.Contact,
+ AgreedTerms: v.Agreement,
+ CurrentTerms: tos,
+ Authz: authz,
+ Authorizations: v.Authorizations,
+ Certificates: v.Certificates,
+ }, nil
+}
+
+func responseCert(ctx context.Context, client *http.Client, res *http.Response, bundle bool) ([][]byte, error) {
+ b, err := ioutil.ReadAll(io.LimitReader(res.Body, maxCertSize+1))
+ if err != nil {
+ return nil, fmt.Errorf("acme: response stream: %v", err)
+ }
+ if len(b) > maxCertSize {
+ return nil, errors.New("acme: certificate is too big")
+ }
+ cert := [][]byte{b}
+ if !bundle {
+ return cert, nil
+ }
+
+ // Append CA chain cert(s).
+ // At least one is required according to the spec:
+ // https://tools.ietf.org/html/draft-ietf-acme-acme-03#section-6.3.1
+ up := linkHeader(res.Header, "up")
+ if len(up) == 0 {
+ return nil, errors.New("acme: rel=up link not found")
+ }
+ if len(up) > maxChainLen {
+ return nil, errors.New("acme: rel=up link is too large")
+ }
+ for _, url := range up {
+ cc, err := chainCert(ctx, client, url, 0)
+ if err != nil {
+ return nil, err
+ }
+ cert = append(cert, cc...)
+ }
+ return cert, nil
+}
+
+// responseError creates an error of Error type from resp.
+func responseError(resp *http.Response) error {
+ // don't care if ReadAll returns an error:
+ // json.Unmarshal will fail in that case anyway
+ b, _ := ioutil.ReadAll(resp.Body)
+ e := struct {
+ Status int
+ Type string
+ Detail string
+ }{
+ Status: resp.StatusCode,
+ }
+ if err := json.Unmarshal(b, &e); err != nil {
+ // this is not a regular error response:
+ // populate detail with anything we received,
+ // e.Status will already contain HTTP response code value
+ e.Detail = string(b)
+ if e.Detail == "" {
+ e.Detail = resp.Status
+ }
+ }
+ return &Error{
+ StatusCode: e.Status,
+ ProblemType: e.Type,
+ Detail: e.Detail,
+ Header: resp.Header,
+ }
+}
+
+// chainCert fetches CA certificate chain recursively by following "up" links.
+// Each recursive call increments the depth by 1, resulting in an error
+// if the recursion level reaches maxChainLen.
+//
+// First chainCert call starts with depth of 0.
+func chainCert(ctx context.Context, client *http.Client, url string, depth int) ([][]byte, error) {
+ if depth >= maxChainLen {
+ return nil, errors.New("acme: certificate chain is too deep")
+ }
+
+ res, err := ctxhttp.Get(ctx, client, url)
+ if err != nil {
+ return nil, err
+ }
+ defer res.Body.Close()
+ if res.StatusCode != http.StatusOK {
+ return nil, responseError(res)
+ }
+ b, err := ioutil.ReadAll(io.LimitReader(res.Body, maxCertSize+1))
+ if err != nil {
+ return nil, err
+ }
+ if len(b) > maxCertSize {
+ return nil, errors.New("acme: certificate is too big")
+ }
+ chain := [][]byte{b}
+
+ uplink := linkHeader(res.Header, "up")
+ if len(uplink) > maxChainLen {
+ return nil, errors.New("acme: certificate chain is too large")
+ }
+ for _, up := range uplink {
+ cc, err := chainCert(ctx, client, up, depth+1)
+ if err != nil {
+ return nil, err
+ }
+ chain = append(chain, cc...)
+ }
+
+ return chain, nil
+}
+
+// postJWS signs the body with the given key and POSTs it to the provided url.
+// The body argument must be JSON-serializable.
+func postJWS(ctx context.Context, client *http.Client, key crypto.Signer, url string, body interface{}) (*http.Response, error) {
+ nonce, err := fetchNonce(ctx, client, url)
+ if err != nil {
+ return nil, err
+ }
+ b, err := jwsEncodeJSON(body, key, nonce)
+ if err != nil {
+ return nil, err
+ }
+ return ctxhttp.Post(ctx, client, url, "application/jose+json", bytes.NewReader(b))
+}
+
+func fetchNonce(ctx context.Context, client *http.Client, url string) (string, error) {
+ resp, err := ctxhttp.Head(ctx, client, url)
+ if err != nil {
+ return "", nil
+ }
+ defer resp.Body.Close()
+ enc := resp.Header.Get("replay-nonce")
+ if enc == "" {
+ return "", errors.New("acme: nonce not found")
+ }
+ return enc, nil
+}
+
+// linkHeader returns URI-Reference values of all Link headers
+// with relation-type rel.
+// See https://tools.ietf.org/html/rfc5988#section-5 for details.
+func linkHeader(h http.Header, rel string) []string {
+ var links []string
+ for _, v := range h["Link"] {
+ parts := strings.Split(v, ";")
+ for _, p := range parts {
+ p = strings.TrimSpace(p)
+ if !strings.HasPrefix(p, "rel=") {
+ continue
+ }
+ if v := strings.Trim(p[4:], `"`); v == rel {
+ links = append(links, strings.Trim(parts[0], "<>"))
+ }
+ }
+ }
+ return links
+}
+
+// retryAfter parses a Retry-After HTTP header value,
+// trying to convert v into an int (seconds) or use http.ParseTime otherwise.
+// It returns d if v cannot be parsed.
+func retryAfter(v string, d time.Duration) time.Duration {
+ if i, err := strconv.Atoi(v); err == nil {
+ return time.Duration(i) * time.Second
+ }
+ t, err := http.ParseTime(v)
+ if err != nil {
+ return d
+ }
+ return t.Sub(timeNow())
+}
+
+// backoff computes a duration after which an n+1 retry iteration should occur
+// using truncated exponential backoff algorithm.
+//
+// The n argument is always bounded between 0 and 30.
+// The max argument defines upper bound for the returned value.
+func backoff(n int, max time.Duration) time.Duration {
+ if n < 0 {
+ n = 0
+ }
+ if n > 30 {
+ n = 30
+ }
+ var d time.Duration
+ if x, err := rand.Int(rand.Reader, big.NewInt(1000)); err == nil {
+ d = time.Duration(x.Int64()) * time.Millisecond
+ }
+ d += time.Duration(1<<uint(n)) * time.Second
+ if d > max {
+ return max
+ }
+ return d
+}
+
+// keyAuth generates a key authorization string for a given token.
+func keyAuth(pub crypto.PublicKey, token string) (string, error) {
+ th, err := JWKThumbprint(pub)
+ if err != nil {
+ return "", err
+ }
+ return fmt.Sprintf("%s.%s", token, th), nil
+}
+
+// tlsChallengeCert creates a temporary certificate for TLS-SNI challenges
+// with the given SANs and auto-generated public/private key pair.
+// To create a cert with a custom key pair, specify WithKey option.
+func tlsChallengeCert(san []string, opt []CertOption) (tls.Certificate, error) {
+ var (
+ key crypto.Signer
+ tmpl *x509.Certificate
+ )
+ for _, o := range opt {
+ switch o := o.(type) {
+ case *certOptKey:
+ if key != nil {
+ return tls.Certificate{}, errors.New("acme: duplicate key option")
+ }
+ key = o.key
+ case *certOptTemplate:
+ var t = *(*x509.Certificate)(o) // shallow copy is ok
+ tmpl = &t
+ default:
+ // package's fault, if we let this happen:
+ panic(fmt.Sprintf("unsupported option type %T", o))
+ }
+ }
+ if key == nil {
+ var err error
+ if key, err = ecdsa.GenerateKey(elliptic.P256(), rand.Reader); err != nil {
+ return tls.Certificate{}, err
+ }
+ }
+ if tmpl == nil {
+ tmpl = &x509.Certificate{
+ SerialNumber: big.NewInt(1),
+ NotBefore: time.Now(),
+ NotAfter: time.Now().Add(24 * time.Hour),
+ BasicConstraintsValid: true,
+ KeyUsage: x509.KeyUsageKeyEncipherment,
+ }
+ }
+ tmpl.DNSNames = san
+
+ der, err := x509.CreateCertificate(rand.Reader, tmpl, tmpl, key.Public(), key)
+ if err != nil {
+ return tls.Certificate{}, err
+ }
+ return tls.Certificate{
+ Certificate: [][]byte{der},
+ PrivateKey: key,
+ }, nil
+}
+
+// encodePEM returns b encoded as PEM with block of type typ.
+func encodePEM(typ string, b []byte) []byte {
+ pb := &pem.Block{Type: typ, Bytes: b}
+ return pem.EncodeToMemory(pb)
+}
+
+// timeNow is useful for testing for fixed current time.
+var timeNow = time.Now
diff --git a/vendor/golang.org/x/crypto/acme/internal/acme/acme_test.go b/vendor/golang.org/x/crypto/acme/acme_test.go
index f9d17c339..e552984b9 100644
--- a/vendor/golang.org/x/crypto/acme/internal/acme/acme_test.go
+++ b/vendor/golang.org/x/crypto/acme/acme_test.go
@@ -5,7 +5,10 @@
package acme
import (
+ "bytes"
"crypto/rand"
+ "crypto/rsa"
+ "crypto/tls"
"crypto/x509"
"crypto/x509/pkix"
"encoding/base64"
@@ -16,6 +19,7 @@ import (
"net/http"
"net/http/httptest"
"reflect"
+ "sort"
"strings"
"testing"
"time"
@@ -58,21 +62,22 @@ func TestDiscover(t *testing.T) {
}`, reg, authz, cert, revoke)
}))
defer ts.Close()
- ep, err := (&Client{}).Discover(ts.URL)
+ c := Client{DirectoryURL: ts.URL}
+ dir, err := c.Discover(context.Background())
if err != nil {
t.Fatal(err)
}
- if ep.RegURL != reg {
- t.Errorf("RegURL = %q; want %q", ep.RegURL, reg)
+ if dir.RegURL != reg {
+ t.Errorf("dir.RegURL = %q; want %q", dir.RegURL, reg)
}
- if ep.AuthzURL != authz {
- t.Errorf("authzURL = %q; want %q", ep.AuthzURL, authz)
+ if dir.AuthzURL != authz {
+ t.Errorf("dir.AuthzURL = %q; want %q", dir.AuthzURL, authz)
}
- if ep.CertURL != cert {
- t.Errorf("certURL = %q; want %q", ep.CertURL, cert)
+ if dir.CertURL != cert {
+ t.Errorf("dir.CertURL = %q; want %q", dir.CertURL, cert)
}
- if ep.RevokeURL != revoke {
- t.Errorf("revokeURL = %q; want %q", ep.RevokeURL, revoke)
+ if dir.RevokeURL != revoke {
+ t.Errorf("dir.RevokeURL = %q; want %q", dir.RevokeURL, revoke)
}
}
@@ -109,17 +114,22 @@ func TestRegister(t *testing.T) {
w.Header().Add("Link", `<https://ca.tld/acme/terms>;rel="terms-of-service"`)
w.WriteHeader(http.StatusCreated)
b, _ := json.Marshal(contacts)
- fmt.Fprintf(w, `{
- "key":%q,
- "contact":%s
- }`, testKeyThumbprint, b)
+ fmt.Fprintf(w, `{"contact": %s}`, b)
}))
defer ts.Close()
- c := Client{Key: testKey}
+ prompt := func(url string) bool {
+ const terms = "https://ca.tld/acme/terms"
+ if url != terms {
+ t.Errorf("prompt url = %q; want %q", url, terms)
+ }
+ return false
+ }
+
+ c := Client{Key: testKeyEC, dir: &Directory{RegURL: ts.URL}}
a := &Account{Contact: contacts}
var err error
- if a, err = c.Register(ts.URL, a); err != nil {
+ if a, err = c.Register(context.Background(), a, prompt); err != nil {
t.Fatal(err)
}
if a.URI != "https://ca.tld/acme/reg/1" {
@@ -172,18 +182,14 @@ func TestUpdateReg(t *testing.T) {
w.Header().Add("Link", fmt.Sprintf(`<%s>;rel="terms-of-service"`, terms))
w.WriteHeader(http.StatusOK)
b, _ := json.Marshal(contacts)
- fmt.Fprintf(w, `{
- "key":%q,
- "contact":%s,
- "agreement":%q
- }`, testKeyThumbprint, b, terms)
+ fmt.Fprintf(w, `{"contact":%s, "agreement":%q}`, b, terms)
}))
defer ts.Close()
- c := Client{Key: testKey}
- a := &Account{Contact: contacts, AgreedTerms: terms}
+ c := Client{Key: testKeyEC}
+ a := &Account{URI: ts.URL, Contact: contacts, AgreedTerms: terms}
var err error
- if a, err = c.UpdateReg(ts.URL, a); err != nil {
+ if a, err = c.UpdateReg(context.Background(), a); err != nil {
t.Fatal(err)
}
if a.Authz != "https://ca.tld/acme/new-authz" {
@@ -195,6 +201,9 @@ func TestUpdateReg(t *testing.T) {
if a.CurrentTerms != terms {
t.Errorf("a.CurrentTerms = %q; want %q", a.CurrentTerms, terms)
}
+ if a.URI != ts.URL {
+ t.Errorf("a.URI = %q; want %q", a.URI, ts.URL)
+ }
}
func TestGetReg(t *testing.T) {
@@ -234,16 +243,12 @@ func TestGetReg(t *testing.T) {
w.Header().Add("Link", fmt.Sprintf(`<%s>;rel="terms-of-service"`, newTerms))
w.WriteHeader(http.StatusOK)
b, _ := json.Marshal(contacts)
- fmt.Fprintf(w, `{
- "key":%q,
- "contact":%s,
- "agreement":%q
- }`, testKeyThumbprint, b, terms)
+ fmt.Fprintf(w, `{"contact":%s, "agreement":%q}`, b, terms)
}))
defer ts.Close()
- c := Client{Key: testKey}
- a, err := c.GetReg(ts.URL)
+ c := Client{Key: testKeyEC}
+ a, err := c.GetReg(context.Background(), ts.URL)
if err != nil {
t.Fatal(err)
}
@@ -256,6 +261,9 @@ func TestGetReg(t *testing.T) {
if a.CurrentTerms != newTerms {
t.Errorf("a.CurrentTerms = %q; want %q", a.CurrentTerms, newTerms)
}
+ if a.URI != ts.URL {
+ t.Errorf("a.URI = %q; want %q", a.URI, ts.URL)
+ }
}
func TestAuthorize(t *testing.T) {
@@ -311,8 +319,8 @@ func TestAuthorize(t *testing.T) {
}))
defer ts.Close()
- cl := Client{Key: testKey}
- auth, err := cl.Authorize(ts.URL, "example.com")
+ cl := Client{Key: testKeyEC, dir: &Directory{AuthzURL: ts.URL}}
+ auth, err := cl.Authorize(context.Background(), "example.com")
if err != nil {
t.Fatal(err)
}
@@ -362,7 +370,24 @@ func TestAuthorize(t *testing.T) {
}
}
-func TestPollAuthz(t *testing.T) {
+func TestAuthorizeValid(t *testing.T) {
+ ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ if r.Method == "HEAD" {
+ w.Header().Set("replay-nonce", "nonce")
+ return
+ }
+ w.WriteHeader(http.StatusCreated)
+ w.Write([]byte(`{"status":"valid"}`))
+ }))
+ defer ts.Close()
+ client := Client{Key: testKey, dir: &Directory{AuthzURL: ts.URL}}
+ _, err := client.Authorize(context.Background(), "example.com")
+ if err != nil {
+ t.Errorf("err = %v", err)
+ }
+}
+
+func TestGetAuthorization(t *testing.T) {
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.Method != "GET" {
t.Errorf("r.Method = %q; want GET", r.Method)
@@ -390,8 +415,8 @@ func TestPollAuthz(t *testing.T) {
}))
defer ts.Close()
- cl := Client{Key: testKey}
- auth, err := cl.GetAuthz(ts.URL)
+ cl := Client{Key: testKeyEC}
+ auth, err := cl.GetAuthorization(context.Background(), ts.URL)
if err != nil {
t.Fatal(err)
}
@@ -438,6 +463,129 @@ func TestPollAuthz(t *testing.T) {
}
}
+func TestWaitAuthorization(t *testing.T) {
+ var count int
+ ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ count++
+ w.Header().Set("retry-after", "0")
+ if count > 1 {
+ fmt.Fprintf(w, `{"status":"valid"}`)
+ return
+ }
+ fmt.Fprintf(w, `{"status":"pending"}`)
+ }))
+ defer ts.Close()
+
+ type res struct {
+ authz *Authorization
+ err error
+ }
+ done := make(chan res)
+ defer close(done)
+ go func() {
+ var client Client
+ a, err := client.WaitAuthorization(context.Background(), ts.URL)
+ done <- res{a, err}
+ }()
+
+ select {
+ case <-time.After(5 * time.Second):
+ t.Fatal("WaitAuthz took too long to return")
+ case res := <-done:
+ if res.err != nil {
+ t.Fatalf("res.err = %v", res.err)
+ }
+ if res.authz == nil {
+ t.Fatal("res.authz is nil")
+ }
+ }
+}
+
+func TestWaitAuthorizationInvalid(t *testing.T) {
+ ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ fmt.Fprintf(w, `{"status":"invalid"}`)
+ }))
+ defer ts.Close()
+
+ res := make(chan error)
+ defer close(res)
+ go func() {
+ var client Client
+ _, err := client.WaitAuthorization(context.Background(), ts.URL)
+ res <- err
+ }()
+
+ select {
+ case <-time.After(3 * time.Second):
+ t.Fatal("WaitAuthz took too long to return")
+ case err := <-res:
+ if err == nil {
+ t.Error("err is nil")
+ }
+ }
+}
+
+func TestWaitAuthorizationCancel(t *testing.T) {
+ ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ w.Header().Set("retry-after", "60")
+ fmt.Fprintf(w, `{"status":"pending"}`)
+ }))
+ defer ts.Close()
+
+ res := make(chan error)
+ defer close(res)
+ go func() {
+ var client Client
+ ctx, cancel := context.WithTimeout(context.Background(), 200*time.Millisecond)
+ defer cancel()
+ _, err := client.WaitAuthorization(ctx, ts.URL)
+ res <- err
+ }()
+
+ select {
+ case <-time.After(time.Second):
+ t.Fatal("WaitAuthz took too long to return")
+ case err := <-res:
+ if err == nil {
+ t.Error("err is nil")
+ }
+ }
+}
+
+func TestRevokeAuthorization(t *testing.T) {
+ ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ if r.Method == "HEAD" {
+ w.Header().Set("replay-nonce", "nonce")
+ return
+ }
+ switch r.URL.Path {
+ case "/1":
+ var req struct {
+ Resource string
+ Delete bool
+ }
+ decodeJWSRequest(t, &req, r)
+ if req.Resource != "authz" {
+ t.Errorf("req.Resource = %q; want authz", req.Resource)
+ }
+ if !req.Delete {
+ t.Errorf("req.Delete is false")
+ }
+ case "/2":
+ w.WriteHeader(http.StatusInternalServerError)
+ }
+ }))
+ defer ts.Close()
+ client := &Client{Key: testKey}
+ ctx := context.Background()
+ if err := client.RevokeAuthorization(ctx, ts.URL+"/1"); err != nil {
+ t.Errorf("err = %v", err)
+ }
+ if client.RevokeAuthorization(ctx, ts.URL+"/2") == nil {
+ t.Error("nil error")
+ }
+}
+
func TestPollChallenge(t *testing.T) {
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.Method != "GET" {
@@ -453,8 +601,8 @@ func TestPollChallenge(t *testing.T) {
}))
defer ts.Close()
- cl := Client{Key: testKey}
- chall, err := cl.GetChallenge(ts.URL)
+ cl := Client{Key: testKeyEC}
+ chall, err := cl.GetChallenge(context.Background(), ts.URL)
if err != nil {
t.Fatal(err)
}
@@ -497,7 +645,7 @@ func TestAcceptChallenge(t *testing.T) {
if j.Type != "http-01" {
t.Errorf(`type = %q; want "http-01"`, j.Type)
}
- keyAuth := "token1." + testKeyThumbprint
+ keyAuth := "token1." + testKeyECThumbprint
if j.Auth != keyAuth {
t.Errorf(`keyAuthorization = %q; want %q`, j.Auth, keyAuth)
}
@@ -514,8 +662,8 @@ func TestAcceptChallenge(t *testing.T) {
}))
defer ts.Close()
- cl := Client{Key: testKey}
- c, err := cl.Accept(&Challenge{
+ cl := Client{Key: testKeyEC}
+ c, err := cl.Accept(context.Background(), &Challenge{
URI: ts.URL,
Token: "token1",
Type: "http-01",
@@ -582,7 +730,7 @@ func TestNewCert(t *testing.T) {
BasicConstraintsValid: true,
}
- sampleCert, err := x509.CreateCertificate(rand.Reader, &template, &template, &testKey.PublicKey, testKey)
+ sampleCert, err := x509.CreateCertificate(rand.Reader, &template, &template, &testKeyEC.PublicKey, testKeyEC)
if err != nil {
t.Fatalf("Error creating certificate: %v", err)
}
@@ -600,13 +748,13 @@ func TestNewCert(t *testing.T) {
Organization: []string{"goacme"},
},
}
- csrb, err := x509.CreateCertificateRequest(rand.Reader, &csr, testKey)
+ csrb, err := x509.CreateCertificateRequest(rand.Reader, &csr, testKeyEC)
if err != nil {
t.Fatal(err)
}
- c := Client{Key: testKey}
- cert, certURL, err := c.CreateCert(context.Background(), ts.URL, csrb, notAfter.Sub(notBefore), false)
+ c := Client{Key: testKeyEC, dir: &Directory{CertURL: ts.URL}}
+ cert, certURL, err := c.CreateCert(context.Background(), csrb, notAfter.Sub(notBefore), false)
if err != nil {
t.Fatal(err)
}
@@ -619,15 +767,22 @@ func TestNewCert(t *testing.T) {
}
func TestFetchCert(t *testing.T) {
- ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
- w.Write([]byte{1})
+ var count byte
+ var ts *httptest.Server
+ ts = httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ count++
+ if count < 3 {
+ up := fmt.Sprintf("<%s>;rel=up", ts.URL)
+ w.Header().Set("link", up)
+ }
+ w.Write([]byte{count})
}))
defer ts.Close()
- res, err := (&Client{}).FetchCert(context.Background(), ts.URL, false)
+ res, err := (&Client{}).FetchCert(context.Background(), ts.URL, true)
if err != nil {
t.Fatalf("FetchCert: %v", err)
}
- cert := [][]byte{{1}}
+ cert := [][]byte{{1}, {2}, {3}}
if !reflect.DeepEqual(res, cert) {
t.Errorf("res = %v; want %v", res, cert)
}
@@ -675,6 +830,88 @@ func TestFetchCertCancel(t *testing.T) {
}
}
+func TestFetchCertDepth(t *testing.T) {
+ var count byte
+ var ts *httptest.Server
+ ts = httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ count++
+ if count > maxChainLen+1 {
+ t.Errorf("count = %d; want at most %d", count, maxChainLen+1)
+ w.WriteHeader(http.StatusInternalServerError)
+ }
+ w.Header().Set("link", fmt.Sprintf("<%s>;rel=up", ts.URL))
+ w.Write([]byte{count})
+ }))
+ defer ts.Close()
+ _, err := (&Client{}).FetchCert(context.Background(), ts.URL, true)
+ if err == nil {
+ t.Errorf("err is nil")
+ }
+}
+
+func TestFetchCertBreadth(t *testing.T) {
+ var ts *httptest.Server
+ ts = httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ for i := 0; i < maxChainLen+1; i++ {
+ w.Header().Add("link", fmt.Sprintf("<%s>;rel=up", ts.URL))
+ }
+ w.Write([]byte{1})
+ }))
+ defer ts.Close()
+ _, err := (&Client{}).FetchCert(context.Background(), ts.URL, true)
+ if err == nil {
+ t.Errorf("err is nil")
+ }
+}
+
+func TestFetchCertSize(t *testing.T) {
+ ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ b := bytes.Repeat([]byte{1}, maxCertSize+1)
+ w.Write(b)
+ }))
+ defer ts.Close()
+ _, err := (&Client{}).FetchCert(context.Background(), ts.URL, false)
+ if err == nil {
+ t.Errorf("err is nil")
+ }
+}
+
+func TestRevokeCert(t *testing.T) {
+ ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ if r.Method == "HEAD" {
+ w.Header().Set("replay-nonce", "nonce")
+ return
+ }
+
+ var req struct {
+ Resource string
+ Certificate string
+ Reason int
+ }
+ decodeJWSRequest(t, &req, r)
+ if req.Resource != "revoke-cert" {
+ t.Errorf("req.Resource = %q; want revoke-cert", req.Resource)
+ }
+ if req.Reason != 1 {
+ t.Errorf("req.Reason = %d; want 1", req.Reason)
+ }
+ // echo -n cert | base64 | tr -d '=' | tr '/+' '_-'
+ cert := "Y2VydA"
+ if req.Certificate != cert {
+ t.Errorf("req.Certificate = %q; want %q", req.Certificate, cert)
+ }
+ }))
+ defer ts.Close()
+ client := &Client{
+ Key: testKeyEC,
+ dir: &Directory{RevokeURL: ts.URL},
+ }
+ ctx := context.Background()
+ if err := client.RevokeCert(ctx, nil, []byte("cert"), CRLReasonKeyCompromise); err != nil {
+ t.Fatal(err)
+ }
+}
+
func TestFetchNonce(t *testing.T) {
tests := []struct {
code int
@@ -695,7 +932,7 @@ func TestFetchNonce(t *testing.T) {
defer ts.Close()
for ; i < len(tests); i++ {
test := tests[i]
- n, err := fetchNonce(http.DefaultClient, ts.URL)
+ n, err := fetchNonce(context.Background(), http.DefaultClient, ts.URL)
if n != test.nonce {
t.Errorf("%d: n=%q; want %q", i, n, test.nonce)
}
@@ -713,16 +950,20 @@ func TestLinkHeader(t *testing.T) {
`<https://example.com/acme/new-authz>;rel="next"`,
`<https://example.com/acme/recover-reg>; rel=recover`,
`<https://example.com/acme/terms>; foo=bar; rel="terms-of-service"`,
+ `<dup>;rel="next"`,
}}
- tests := []struct{ in, out string }{
- {"next", "https://example.com/acme/new-authz"},
- {"recover", "https://example.com/acme/recover-reg"},
- {"terms-of-service", "https://example.com/acme/terms"},
- {"empty", ""},
+ tests := []struct {
+ rel string
+ out []string
+ }{
+ {"next", []string{"https://example.com/acme/new-authz", "dup"}},
+ {"recover", []string{"https://example.com/acme/recover-reg"}},
+ {"terms-of-service", []string{"https://example.com/acme/terms"}},
+ {"empty", nil},
}
for i, test := range tests {
- if v := linkHeader(h, test.in); v != test.out {
- t.Errorf("%d: parseLinkHeader(%q): %q; want %q", i, test.in, v, test.out)
+ if v := linkHeader(h, test.rel); !reflect.DeepEqual(v, test.out) {
+ t.Errorf("%d: linkHeader(%q): %v; want %v", i, test.rel, v, test.out)
}
}
}
@@ -757,3 +998,188 @@ func TestErrorResponse(t *testing.T) {
t.Errorf("v.Header = %+v; want %+v", v.Header, res.Header)
}
}
+
+func TestTLSSNI01ChallengeCert(t *testing.T) {
+ const (
+ token = "evaGxfADs6pSRb2LAv9IZf17Dt3juxGJ-PCt92wr-oA"
+ // echo -n <token.testKeyECThumbprint> | shasum -a 256
+ san = "dbbd5eefe7b4d06eb9d1d9f5acb4c7cd.a27d320e4b30332f0b6cb441734ad7b0.acme.invalid"
+ )
+
+ client := &Client{Key: testKeyEC}
+ tlscert, name, err := client.TLSSNI01ChallengeCert(token)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ if n := len(tlscert.Certificate); n != 1 {
+ t.Fatalf("len(tlscert.Certificate) = %d; want 1", n)
+ }
+ cert, err := x509.ParseCertificate(tlscert.Certificate[0])
+ if err != nil {
+ t.Fatal(err)
+ }
+ if len(cert.DNSNames) != 1 || cert.DNSNames[0] != san {
+ t.Fatalf("cert.DNSNames = %v; want %q", cert.DNSNames, san)
+ }
+ if cert.DNSNames[0] != name {
+ t.Errorf("cert.DNSNames[0] != name: %q vs %q", cert.DNSNames[0], name)
+ }
+}
+
+func TestTLSSNI02ChallengeCert(t *testing.T) {
+ const (
+ token = "evaGxfADs6pSRb2LAv9IZf17Dt3juxGJ-PCt92wr-oA"
+ // echo -n evaGxfADs6pSRb2LAv9IZf17Dt3juxGJ-PCt92wr-oA | shasum -a 256
+ sanA = "7ea0aaa69214e71e02cebb18bb867736.09b730209baabf60e43d4999979ff139.token.acme.invalid"
+ // echo -n <token.testKeyECThumbprint> | shasum -a 256
+ sanB = "dbbd5eefe7b4d06eb9d1d9f5acb4c7cd.a27d320e4b30332f0b6cb441734ad7b0.ka.acme.invalid"
+ )
+
+ client := &Client{Key: testKeyEC}
+ tlscert, name, err := client.TLSSNI02ChallengeCert(token)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ if n := len(tlscert.Certificate); n != 1 {
+ t.Fatalf("len(tlscert.Certificate) = %d; want 1", n)
+ }
+ cert, err := x509.ParseCertificate(tlscert.Certificate[0])
+ if err != nil {
+ t.Fatal(err)
+ }
+ names := []string{sanA, sanB}
+ if !reflect.DeepEqual(cert.DNSNames, names) {
+ t.Fatalf("cert.DNSNames = %v;\nwant %v", cert.DNSNames, names)
+ }
+ sort.Strings(cert.DNSNames)
+ i := sort.SearchStrings(cert.DNSNames, name)
+ if i >= len(cert.DNSNames) || cert.DNSNames[i] != name {
+ t.Errorf("%v doesn't have %q", cert.DNSNames, name)
+ }
+}
+
+func TestTLSChallengeCertOpt(t *testing.T) {
+ key, err := rsa.GenerateKey(rand.Reader, 512)
+ if err != nil {
+ t.Fatal(err)
+ }
+ tmpl := &x509.Certificate{
+ SerialNumber: big.NewInt(2),
+ Subject: pkix.Name{Organization: []string{"Test"}},
+ DNSNames: []string{"should-be-overwritten"},
+ }
+ opts := []CertOption{WithKey(key), WithTemplate(tmpl)}
+
+ client := &Client{Key: testKeyEC}
+ cert1, _, err := client.TLSSNI01ChallengeCert("token", opts...)
+ if err != nil {
+ t.Fatal(err)
+ }
+ cert2, _, err := client.TLSSNI02ChallengeCert("token", opts...)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ for i, tlscert := range []tls.Certificate{cert1, cert2} {
+ // verify generated cert private key
+ tlskey, ok := tlscert.PrivateKey.(*rsa.PrivateKey)
+ if !ok {
+ t.Errorf("%d: tlscert.PrivateKey is %T; want *rsa.PrivateKey", i, tlscert.PrivateKey)
+ continue
+ }
+ if tlskey.D.Cmp(key.D) != 0 {
+ t.Errorf("%d: tlskey.D = %v; want %v", i, tlskey.D, key.D)
+ }
+ // verify generated cert public key
+ x509Cert, err := x509.ParseCertificate(tlscert.Certificate[0])
+ if err != nil {
+ t.Errorf("%d: %v", i, err)
+ continue
+ }
+ tlspub, ok := x509Cert.PublicKey.(*rsa.PublicKey)
+ if !ok {
+ t.Errorf("%d: x509Cert.PublicKey is %T; want *rsa.PublicKey", i, x509Cert.PublicKey)
+ continue
+ }
+ if tlspub.N.Cmp(key.N) != 0 {
+ t.Errorf("%d: tlspub.N = %v; want %v", i, tlspub.N, key.N)
+ }
+ // verify template option
+ sn := big.NewInt(2)
+ if x509Cert.SerialNumber.Cmp(sn) != 0 {
+ t.Errorf("%d: SerialNumber = %v; want %v", i, x509Cert.SerialNumber, sn)
+ }
+ org := []string{"Test"}
+ if !reflect.DeepEqual(x509Cert.Subject.Organization, org) {
+ t.Errorf("%d: Subject.Organization = %+v; want %+v", i, x509Cert.Subject.Organization, org)
+ }
+ for _, v := range x509Cert.DNSNames {
+ if !strings.HasSuffix(v, ".acme.invalid") {
+ t.Errorf("%d: invalid DNSNames element: %q", i, v)
+ }
+ }
+ }
+}
+
+func TestHTTP01Challenge(t *testing.T) {
+ const (
+ token = "xxx"
+ // thumbprint is precomputed for testKeyEC in jws_test.go
+ value = token + "." + testKeyECThumbprint
+ urlpath = "/.well-known/acme-challenge/" + token
+ )
+ client := &Client{Key: testKeyEC}
+ val, err := client.HTTP01ChallengeResponse(token)
+ if err != nil {
+ t.Fatal(err)
+ }
+ if val != value {
+ t.Errorf("val = %q; want %q", val, value)
+ }
+ if path := client.HTTP01ChallengePath(token); path != urlpath {
+ t.Errorf("path = %q; want %q", path, urlpath)
+ }
+}
+
+func TestDNS01ChallengeRecord(t *testing.T) {
+ // echo -n xxx.<testKeyECThumbprint> | \
+ // openssl dgst -binary -sha256 | \
+ // base64 | tr -d '=' | tr '/+' '_-'
+ const value = "8DERMexQ5VcdJ_prpPiA0mVdp7imgbCgjsG4SqqNMIo"
+
+ client := &Client{Key: testKeyEC}
+ val, err := client.DNS01ChallengeRecord("xxx")
+ if err != nil {
+ t.Fatal(err)
+ }
+ if val != value {
+ t.Errorf("val = %q; want %q", val, value)
+ }
+}
+
+func TestBackoff(t *testing.T) {
+ tt := []struct{ min, max time.Duration }{
+ {time.Second, 2 * time.Second},
+ {2 * time.Second, 3 * time.Second},
+ {4 * time.Second, 5 * time.Second},
+ {8 * time.Second, 9 * time.Second},
+ }
+ for i, test := range tt {
+ d := backoff(i, time.Minute)
+ if d < test.min || test.max < d {
+ t.Errorf("%d: d = %v; want between %v and %v", i, d, test.min, test.max)
+ }
+ }
+
+ min, max := time.Second, 2*time.Second
+ if d := backoff(-1, time.Minute); d < min || max < d {
+ t.Errorf("d = %v; want between %v and %v", d, min, max)
+ }
+
+ bound := 10 * time.Second
+ if d := backoff(100, bound); d != bound {
+ t.Errorf("d = %v; want %v", d, bound)
+ }
+}
diff --git a/vendor/golang.org/x/crypto/acme/autocert/autocert.go b/vendor/golang.org/x/crypto/acme/autocert/autocert.go
new file mode 100644
index 000000000..12c9010dd
--- /dev/null
+++ b/vendor/golang.org/x/crypto/acme/autocert/autocert.go
@@ -0,0 +1,776 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package autocert provides automatic access to certificates from Let's Encrypt
+// and any other ACME-based CA.
+//
+// This package is a work in progress and makes no API stability promises.
+package autocert
+
+import (
+ "bytes"
+ "crypto"
+ "crypto/ecdsa"
+ "crypto/elliptic"
+ "crypto/rand"
+ "crypto/rsa"
+ "crypto/tls"
+ "crypto/x509"
+ "crypto/x509/pkix"
+ "encoding/pem"
+ "errors"
+ "fmt"
+ "io"
+ mathrand "math/rand"
+ "net/http"
+ "strconv"
+ "strings"
+ "sync"
+ "time"
+
+ "golang.org/x/crypto/acme"
+ "golang.org/x/net/context"
+)
+
+// pseudoRand is safe for concurrent use.
+var pseudoRand *lockedMathRand
+
+func init() {
+ src := mathrand.NewSource(timeNow().UnixNano())
+ pseudoRand = &lockedMathRand{rnd: mathrand.New(src)}
+}
+
+// AcceptTOS always returns true to indicate the acceptance of a CA Terms of Service
+// during account registration.
+func AcceptTOS(tosURL string) bool { return true }
+
+// HostPolicy specifies which host names the Manager is allowed to respond to.
+// It returns a non-nil error if the host should be rejected.
+// The returned error is accessible via tls.Conn.Handshake and its callers.
+// See Manager's HostPolicy field and GetCertificate method docs for more details.
+type HostPolicy func(ctx context.Context, host string) error
+
+// HostWhitelist returns a policy where only the specified host names are allowed.
+// Only exact matches are currently supported. Subdomains, regexp or wildcard
+// will not match.
+func HostWhitelist(hosts ...string) HostPolicy {
+ whitelist := make(map[string]bool, len(hosts))
+ for _, h := range hosts {
+ whitelist[h] = true
+ }
+ return func(_ context.Context, host string) error {
+ if !whitelist[host] {
+ return errors.New("acme/autocert: host not configured")
+ }
+ return nil
+ }
+}
+
+// defaultHostPolicy is used when Manager.HostPolicy is not set.
+func defaultHostPolicy(context.Context, string) error {
+ return nil
+}
+
+// Manager is a stateful certificate manager built on top of acme.Client.
+// It obtains and refreshes certificates automatically,
+// as well as providing them to a TLS server via tls.Config.
+//
+// A simple usage example:
+//
+// m := autocert.Manager{
+// Prompt: autocert.AcceptTOS,
+// HostPolicy: autocert.HostWhitelist("example.org"),
+// }
+// s := &http.Server{
+// Addr: ":https",
+// TLSConfig: &tls.Config{GetCertificate: m.GetCertificate},
+// }
+// s.ListenAndServeTLS("", "")
+//
+// To preserve issued certificates and improve overall performance,
+// use a cache implementation of Cache. For instance, DirCache.
+type Manager struct {
+ // Prompt specifies a callback function to conditionally accept a CA's Terms of Service (TOS).
+ // The registration may require the caller to agree to the CA's TOS.
+ // If so, Manager calls Prompt with a TOS URL provided by the CA. Prompt should report
+ // whether the caller agrees to the terms.
+ //
+ // To always accept the terms, the callers can use AcceptTOS.
+ Prompt func(tosURL string) bool
+
+ // Cache optionally stores and retrieves previously-obtained certificates.
+ // If nil, certs will only be cached for the lifetime of the Manager.
+ //
+ // Manager passes the Cache certificates data encoded in PEM, with private/public
+ // parts combined in a single Cache.Put call, private key first.
+ Cache Cache
+
+ // HostPolicy controls which domains the Manager will attempt
+ // to retrieve new certificates for. It does not affect cached certs.
+ //
+ // If non-nil, HostPolicy is called before requesting a new cert.
+ // If nil, all hosts are currently allowed. This is not recommended,
+ // as it opens a potential attack where clients connect to a server
+ // by IP address and pretend to be asking for an incorrect host name.
+ // Manager will attempt to obtain a certificate for that host, incorrectly,
+ // eventually reaching the CA's rate limit for certificate requests
+ // and making it impossible to obtain actual certificates.
+ //
+ // See GetCertificate for more details.
+ HostPolicy HostPolicy
+
+ // RenewBefore optionally specifies how early certificates should
+ // be renewed before they expire.
+ //
+ // If zero, they're renewed 1 week before expiration.
+ RenewBefore time.Duration
+
+ // Client is used to perform low-level operations, such as account registration
+ // and requesting new certificates.
+ // If Client is nil, a zero-value acme.Client is used with acme.LetsEncryptURL
+ // directory endpoint and a newly-generated ECDSA P-256 key.
+ //
+ // Mutating the field after the first call of GetCertificate method will have no effect.
+ Client *acme.Client
+
+ // Email optionally specifies a contact email address.
+ // This is used by CAs, such as Let's Encrypt, to notify about problems
+ // with issued certificates.
+ //
+ // If the Client's account key is already registered, Email is not used.
+ Email string
+
+ clientMu sync.Mutex
+ client *acme.Client // initialized by acmeClient method
+
+ stateMu sync.Mutex
+ state map[string]*certState // keyed by domain name
+
+ // tokenCert is keyed by token domain name, which matches server name
+ // of ClientHello. Keys always have ".acme.invalid" suffix.
+ tokenCertMu sync.RWMutex
+ tokenCert map[string]*tls.Certificate
+
+ // renewal tracks the set of domains currently running renewal timers.
+ // It is keyed by domain name.
+ renewalMu sync.Mutex
+ renewal map[string]*domainRenewal
+}
+
+// GetCertificate implements the tls.Config.GetCertificate hook.
+// It provides a TLS certificate for hello.ServerName host, including answering
+// *.acme.invalid (TLS-SNI) challenges. All other fields of hello are ignored.
+//
+// If m.HostPolicy is non-nil, GetCertificate calls the policy before requesting
+// a new cert. A non-nil error returned from m.HostPolicy halts TLS negotiation.
+// The error is propagated back to the caller of GetCertificate and is user-visible.
+// This does not affect cached certs. See HostPolicy field description for more details.
+func (m *Manager) GetCertificate(hello *tls.ClientHelloInfo) (*tls.Certificate, error) {
+ name := hello.ServerName
+ if name == "" {
+ return nil, errors.New("acme/autocert: missing server name")
+ }
+
+ // check whether this is a token cert requested for TLS-SNI challenge
+ if strings.HasSuffix(name, ".acme.invalid") {
+ m.tokenCertMu.RLock()
+ defer m.tokenCertMu.RUnlock()
+ if cert := m.tokenCert[name]; cert != nil {
+ return cert, nil
+ }
+ if cert, err := m.cacheGet(name); err == nil {
+ return cert, nil
+ }
+ // TODO: cache error results?
+ return nil, fmt.Errorf("acme/autocert: no token cert for %q", name)
+ }
+
+ // regular domain
+ cert, err := m.cert(name)
+ if err == nil {
+ return cert, nil
+ }
+ if err != ErrCacheMiss {
+ return nil, err
+ }
+
+ // first-time
+ ctx := context.Background() // TODO: use a deadline?
+ if err := m.hostPolicy()(ctx, name); err != nil {
+ return nil, err
+ }
+ cert, err = m.createCert(ctx, name)
+ if err != nil {
+ return nil, err
+ }
+ m.cachePut(name, cert)
+ return cert, nil
+}
+
+// cert returns an existing certificate either from m.state or cache.
+// If a certificate is found in cache but not in m.state, the latter will be filled
+// with the cached value.
+func (m *Manager) cert(name string) (*tls.Certificate, error) {
+ m.stateMu.Lock()
+ if s, ok := m.state[name]; ok {
+ m.stateMu.Unlock()
+ s.RLock()
+ defer s.RUnlock()
+ return s.tlscert()
+ }
+ defer m.stateMu.Unlock()
+ cert, err := m.cacheGet(name)
+ if err != nil {
+ return nil, err
+ }
+ signer, ok := cert.PrivateKey.(crypto.Signer)
+ if !ok {
+ return nil, errors.New("acme/autocert: private key cannot sign")
+ }
+ if m.state == nil {
+ m.state = make(map[string]*certState)
+ }
+ s := &certState{
+ key: signer,
+ cert: cert.Certificate,
+ leaf: cert.Leaf,
+ }
+ m.state[name] = s
+ go m.renew(name, s.key, s.leaf.NotAfter)
+ return cert, nil
+}
+
+// cacheGet always returns a valid certificate, or an error otherwise.
+func (m *Manager) cacheGet(domain string) (*tls.Certificate, error) {
+ if m.Cache == nil {
+ return nil, ErrCacheMiss
+ }
+ // TODO: might want to define a cache timeout on m
+ ctx := context.Background()
+ data, err := m.Cache.Get(ctx, domain)
+ if err != nil {
+ return nil, err
+ }
+
+ // private
+ priv, pub := pem.Decode(data)
+ if priv == nil || !strings.Contains(priv.Type, "PRIVATE") {
+ return nil, errors.New("acme/autocert: no private key found in cache")
+ }
+ privKey, err := parsePrivateKey(priv.Bytes)
+ if err != nil {
+ return nil, err
+ }
+
+ // public
+ var pubDER [][]byte
+ for len(pub) > 0 {
+ var b *pem.Block
+ b, pub = pem.Decode(pub)
+ if b == nil {
+ break
+ }
+ pubDER = append(pubDER, b.Bytes)
+ }
+ if len(pub) > 0 {
+ return nil, errors.New("acme/autocert: invalid public key")
+ }
+
+ // verify and create TLS cert
+ leaf, err := validCert(domain, pubDER, privKey)
+ if err != nil {
+ return nil, err
+ }
+ tlscert := &tls.Certificate{
+ Certificate: pubDER,
+ PrivateKey: privKey,
+ Leaf: leaf,
+ }
+ return tlscert, nil
+}
+
+func (m *Manager) cachePut(domain string, tlscert *tls.Certificate) error {
+ if m.Cache == nil {
+ return nil
+ }
+
+ // contains PEM-encoded data
+ var buf bytes.Buffer
+
+ // private
+ switch key := tlscert.PrivateKey.(type) {
+ case *ecdsa.PrivateKey:
+ if err := encodeECDSAKey(&buf, key); err != nil {
+ return err
+ }
+ case *rsa.PrivateKey:
+ b := x509.MarshalPKCS1PrivateKey(key)
+ pb := &pem.Block{Type: "RSA PRIVATE KEY", Bytes: b}
+ if err := pem.Encode(&buf, pb); err != nil {
+ return err
+ }
+ default:
+ return errors.New("acme/autocert: unknown private key type")
+ }
+
+ // public
+ for _, b := range tlscert.Certificate {
+ pb := &pem.Block{Type: "CERTIFICATE", Bytes: b}
+ if err := pem.Encode(&buf, pb); err != nil {
+ return err
+ }
+ }
+
+ // TODO: might want to define a cache timeout on m
+ ctx := context.Background()
+ return m.Cache.Put(ctx, domain, buf.Bytes())
+}
+
+func encodeECDSAKey(w io.Writer, key *ecdsa.PrivateKey) error {
+ b, err := x509.MarshalECPrivateKey(key)
+ if err != nil {
+ return err
+ }
+ pb := &pem.Block{Type: "EC PRIVATE KEY", Bytes: b}
+ return pem.Encode(w, pb)
+}
+
+// createCert starts the domain ownership verification and returns a certificate
+// for that domain upon success.
+//
+// If the domain is already being verified, it waits for the existing verification to complete.
+// Either way, createCert blocks for the duration of the whole process.
+func (m *Manager) createCert(ctx context.Context, domain string) (*tls.Certificate, error) {
+ // TODO: maybe rewrite this whole piece using sync.Once
+ state, err := m.certState(domain)
+ if err != nil {
+ return nil, err
+ }
+ // state may exist if another goroutine is already working on it
+ // in which case just wait for it to finish
+ if !state.locked {
+ state.RLock()
+ defer state.RUnlock()
+ return state.tlscert()
+ }
+
+ // We are the first; state is locked.
+ // Unblock the readers when domain ownership is verified
+ // and the we got the cert or the process failed.
+ defer state.Unlock()
+ state.locked = false
+
+ der, leaf, err := m.authorizedCert(ctx, state.key, domain)
+ if err != nil {
+ return nil, err
+ }
+ state.cert = der
+ state.leaf = leaf
+ go m.renew(domain, state.key, state.leaf.NotAfter)
+ return state.tlscert()
+}
+
+// certState returns a new or existing certState.
+// If a new certState is returned, state.exist is false and the state is locked.
+// The returned error is non-nil only in the case where a new state could not be created.
+func (m *Manager) certState(domain string) (*certState, error) {
+ m.stateMu.Lock()
+ defer m.stateMu.Unlock()
+ if m.state == nil {
+ m.state = make(map[string]*certState)
+ }
+ // existing state
+ if state, ok := m.state[domain]; ok {
+ return state, nil
+ }
+ // new locked state
+ key, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
+ if err != nil {
+ return nil, err
+ }
+ state := &certState{
+ key: key,
+ locked: true,
+ }
+ state.Lock() // will be unlocked by m.certState caller
+ m.state[domain] = state
+ return state, nil
+}
+
+// authorizedCert starts domain ownership verification process and requests a new cert upon success.
+// The key argument is the certificate private key.
+func (m *Manager) authorizedCert(ctx context.Context, key crypto.Signer, domain string) (der [][]byte, leaf *x509.Certificate, err error) {
+ // TODO: make m.verify retry or retry m.verify calls here
+ if err := m.verify(ctx, domain); err != nil {
+ return nil, nil, err
+ }
+ client, err := m.acmeClient(ctx)
+ if err != nil {
+ return nil, nil, err
+ }
+ csr, err := certRequest(key, domain)
+ if err != nil {
+ return nil, nil, err
+ }
+ der, _, err = client.CreateCert(ctx, csr, 0, true)
+ if err != nil {
+ return nil, nil, err
+ }
+ leaf, err = validCert(domain, der, key)
+ if err != nil {
+ return nil, nil, err
+ }
+ return der, leaf, nil
+}
+
+// verify starts a new identifier (domain) authorization flow.
+// It prepares a challenge response and then blocks until the authorization
+// is marked as "completed" by the CA (either succeeded or failed).
+//
+// verify returns nil iff the verification was successful.
+func (m *Manager) verify(ctx context.Context, domain string) error {
+ client, err := m.acmeClient(ctx)
+ if err != nil {
+ return err
+ }
+
+ // start domain authorization and get the challenge
+ authz, err := client.Authorize(ctx, domain)
+ if err != nil {
+ return err
+ }
+ // maybe don't need to at all
+ if authz.Status == acme.StatusValid {
+ return nil
+ }
+
+ // pick a challenge: prefer tls-sni-02 over tls-sni-01
+ // TODO: consider authz.Combinations
+ var chal *acme.Challenge
+ for _, c := range authz.Challenges {
+ if c.Type == "tls-sni-02" {
+ chal = c
+ break
+ }
+ if c.Type == "tls-sni-01" {
+ chal = c
+ }
+ }
+ if chal == nil {
+ return errors.New("acme/autocert: no supported challenge type found")
+ }
+
+ // create a token cert for the challenge response
+ var (
+ cert tls.Certificate
+ name string
+ )
+ switch chal.Type {
+ case "tls-sni-01":
+ cert, name, err = client.TLSSNI01ChallengeCert(chal.Token)
+ case "tls-sni-02":
+ cert, name, err = client.TLSSNI02ChallengeCert(chal.Token)
+ default:
+ err = fmt.Errorf("acme/autocert: unknown challenge type %q", chal.Type)
+ }
+ if err != nil {
+ return err
+ }
+ m.putTokenCert(name, &cert)
+ defer func() {
+ // verification has ended at this point
+ // don't need token cert anymore
+ go m.deleteTokenCert(name)
+ }()
+
+ // ready to fulfill the challenge
+ if _, err := client.Accept(ctx, chal); err != nil {
+ return err
+ }
+ // wait for the CA to validate
+ _, err = client.WaitAuthorization(ctx, authz.URI)
+ return err
+}
+
+// putTokenCert stores the cert under the named key in both m.tokenCert map
+// and m.Cache.
+func (m *Manager) putTokenCert(name string, cert *tls.Certificate) {
+ m.tokenCertMu.Lock()
+ defer m.tokenCertMu.Unlock()
+ if m.tokenCert == nil {
+ m.tokenCert = make(map[string]*tls.Certificate)
+ }
+ m.tokenCert[name] = cert
+ m.cachePut(name, cert)
+}
+
+// deleteTokenCert removes the token certificate for the specified domain name
+// from both m.tokenCert map and m.Cache.
+func (m *Manager) deleteTokenCert(name string) {
+ m.tokenCertMu.Lock()
+ defer m.tokenCertMu.Unlock()
+ delete(m.tokenCert, name)
+ if m.Cache != nil {
+ m.Cache.Delete(context.Background(), name)
+ }
+}
+
+// renew starts a cert renewal timer loop, one per domain.
+//
+// The loop is scheduled in two cases:
+// - a cert was fetched from cache for the first time (wasn't in m.state)
+// - a new cert was created by m.createCert
+//
+// The key argument is a certificate private key.
+// The exp argument is the cert expiration time (NotAfter).
+func (m *Manager) renew(domain string, key crypto.Signer, exp time.Time) {
+ m.renewalMu.Lock()
+ defer m.renewalMu.Unlock()
+ if m.renewal[domain] != nil {
+ // another goroutine is already on it
+ return
+ }
+ if m.renewal == nil {
+ m.renewal = make(map[string]*domainRenewal)
+ }
+ dr := &domainRenewal{m: m, domain: domain, key: key}
+ m.renewal[domain] = dr
+ dr.start(exp)
+}
+
+// stopRenew stops all currently running cert renewal timers.
+// The timers are not restarted during the lifetime of the Manager.
+func (m *Manager) stopRenew() {
+ m.renewalMu.Lock()
+ defer m.renewalMu.Unlock()
+ for name, dr := range m.renewal {
+ delete(m.renewal, name)
+ dr.stop()
+ }
+}
+
+func (m *Manager) accountKey(ctx context.Context) (crypto.Signer, error) {
+ const keyName = "acme_account.key"
+
+ genKey := func() (*ecdsa.PrivateKey, error) {
+ return ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
+ }
+
+ if m.Cache == nil {
+ return genKey()
+ }
+
+ data, err := m.Cache.Get(ctx, keyName)
+ if err == ErrCacheMiss {
+ key, err := genKey()
+ if err != nil {
+ return nil, err
+ }
+ var buf bytes.Buffer
+ if err := encodeECDSAKey(&buf, key); err != nil {
+ return nil, err
+ }
+ if err := m.Cache.Put(ctx, keyName, buf.Bytes()); err != nil {
+ return nil, err
+ }
+ return key, nil
+ }
+ if err != nil {
+ return nil, err
+ }
+
+ priv, _ := pem.Decode(data)
+ if priv == nil || !strings.Contains(priv.Type, "PRIVATE") {
+ return nil, errors.New("acme/autocert: invalid account key found in cache")
+ }
+ return parsePrivateKey(priv.Bytes)
+}
+
+func (m *Manager) acmeClient(ctx context.Context) (*acme.Client, error) {
+ m.clientMu.Lock()
+ defer m.clientMu.Unlock()
+ if m.client != nil {
+ return m.client, nil
+ }
+
+ client := m.Client
+ if client == nil {
+ client = &acme.Client{DirectoryURL: acme.LetsEncryptURL}
+ }
+ if client.Key == nil {
+ var err error
+ client.Key, err = m.accountKey(ctx)
+ if err != nil {
+ return nil, err
+ }
+ }
+ var contact []string
+ if m.Email != "" {
+ contact = []string{"mailto:" + m.Email}
+ }
+ a := &acme.Account{Contact: contact}
+ _, err := client.Register(ctx, a, m.Prompt)
+ if ae, ok := err.(*acme.Error); err == nil || ok && ae.StatusCode == http.StatusConflict {
+ // conflict indicates the key is already registered
+ m.client = client
+ err = nil
+ }
+ return m.client, err
+}
+
+func (m *Manager) hostPolicy() HostPolicy {
+ if m.HostPolicy != nil {
+ return m.HostPolicy
+ }
+ return defaultHostPolicy
+}
+
+func (m *Manager) renewBefore() time.Duration {
+ if m.RenewBefore > maxRandRenew {
+ return m.RenewBefore
+ }
+ return 7 * 24 * time.Hour // 1 week
+}
+
+// certState is ready when its mutex is unlocked for reading.
+type certState struct {
+ sync.RWMutex
+ locked bool // locked for read/write
+ key crypto.Signer // private key for cert
+ cert [][]byte // DER encoding
+ leaf *x509.Certificate // parsed cert[0]; always non-nil if cert != nil
+}
+
+// tlscert creates a tls.Certificate from s.key and s.cert.
+// Callers should wrap it in s.RLock() and s.RUnlock().
+func (s *certState) tlscert() (*tls.Certificate, error) {
+ if s.key == nil {
+ return nil, errors.New("acme/autocert: missing signer")
+ }
+ if len(s.cert) == 0 {
+ return nil, errors.New("acme/autocert: missing certificate")
+ }
+ return &tls.Certificate{
+ PrivateKey: s.key,
+ Certificate: s.cert,
+ Leaf: s.leaf,
+ }, nil
+}
+
+// certRequest creates a certificate request for the given common name cn
+// and optional SANs.
+func certRequest(key crypto.Signer, cn string, san ...string) ([]byte, error) {
+ req := &x509.CertificateRequest{
+ Subject: pkix.Name{CommonName: cn},
+ DNSNames: san,
+ }
+ return x509.CreateCertificateRequest(rand.Reader, req, key)
+}
+
+// Attempt to parse the given private key DER block. OpenSSL 0.9.8 generates
+// PKCS#1 private keys by default, while OpenSSL 1.0.0 generates PKCS#8 keys.
+// OpenSSL ecparam generates SEC1 EC private keys for ECDSA. We try all three.
+//
+// Inspired by parsePrivateKey in crypto/tls/tls.go.
+func parsePrivateKey(der []byte) (crypto.Signer, error) {
+ if key, err := x509.ParsePKCS1PrivateKey(der); err == nil {
+ return key, nil
+ }
+ if key, err := x509.ParsePKCS8PrivateKey(der); err == nil {
+ switch key := key.(type) {
+ case *rsa.PrivateKey:
+ return key, nil
+ case *ecdsa.PrivateKey:
+ return key, nil
+ default:
+ return nil, errors.New("acme/autocert: unknown private key type in PKCS#8 wrapping")
+ }
+ }
+ if key, err := x509.ParseECPrivateKey(der); err == nil {
+ return key, nil
+ }
+
+ return nil, errors.New("acme/autocert: failed to parse private key")
+}
+
+// validCert parses a cert chain provided as der argument and verifies the leaf, der[0],
+// corresponds to the private key, as well as the domain match and expiration dates.
+// It doesn't do any revocation checking.
+//
+// The returned value is the verified leaf cert.
+func validCert(domain string, der [][]byte, key crypto.Signer) (leaf *x509.Certificate, err error) {
+ // parse public part(s)
+ var n int
+ for _, b := range der {
+ n += len(b)
+ }
+ pub := make([]byte, n)
+ n = 0
+ for _, b := range der {
+ n += copy(pub[n:], b)
+ }
+ x509Cert, err := x509.ParseCertificates(pub)
+ if len(x509Cert) == 0 {
+ return nil, errors.New("acme/autocert: no public key found")
+ }
+ // verify the leaf is not expired and matches the domain name
+ leaf = x509Cert[0]
+ now := timeNow()
+ if now.Before(leaf.NotBefore) {
+ return nil, errors.New("acme/autocert: certificate is not valid yet")
+ }
+ if now.After(leaf.NotAfter) {
+ return nil, errors.New("acme/autocert: expired certificate")
+ }
+ if err := leaf.VerifyHostname(domain); err != nil {
+ return nil, err
+ }
+ // ensure the leaf corresponds to the private key
+ switch pub := leaf.PublicKey.(type) {
+ case *rsa.PublicKey:
+ prv, ok := key.(*rsa.PrivateKey)
+ if !ok {
+ return nil, errors.New("acme/autocert: private key type does not match public key type")
+ }
+ if pub.N.Cmp(prv.N) != 0 {
+ return nil, errors.New("acme/autocert: private key does not match public key")
+ }
+ case *ecdsa.PublicKey:
+ prv, ok := key.(*ecdsa.PrivateKey)
+ if !ok {
+ return nil, errors.New("acme/autocert: private key type does not match public key type")
+ }
+ if pub.X.Cmp(prv.X) != 0 || pub.Y.Cmp(prv.Y) != 0 {
+ return nil, errors.New("acme/autocert: private key does not match public key")
+ }
+ default:
+ return nil, errors.New("acme/autocert: unknown public key algorithm")
+ }
+ return leaf, nil
+}
+
+func retryAfter(v string) time.Duration {
+ if i, err := strconv.Atoi(v); err == nil {
+ return time.Duration(i) * time.Second
+ }
+ if t, err := http.ParseTime(v); err == nil {
+ return t.Sub(timeNow())
+ }
+ return time.Second
+}
+
+type lockedMathRand struct {
+ sync.Mutex
+ rnd *mathrand.Rand
+}
+
+func (r *lockedMathRand) int63n(max int64) int64 {
+ r.Lock()
+ n := r.rnd.Int63n(max)
+ r.Unlock()
+ return n
+}
+
+// for easier testing
+var timeNow = time.Now
diff --git a/vendor/golang.org/x/crypto/acme/autocert/autocert_test.go b/vendor/golang.org/x/crypto/acme/autocert/autocert_test.go
new file mode 100644
index 000000000..3a9daa10c
--- /dev/null
+++ b/vendor/golang.org/x/crypto/acme/autocert/autocert_test.go
@@ -0,0 +1,390 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package autocert
+
+import (
+ "crypto"
+ "crypto/ecdsa"
+ "crypto/elliptic"
+ "crypto/rand"
+ "crypto/rsa"
+ "crypto/tls"
+ "crypto/x509"
+ "crypto/x509/pkix"
+ "encoding/base64"
+ "encoding/json"
+ "fmt"
+ "html/template"
+ "io"
+ "math/big"
+ "net/http"
+ "net/http/httptest"
+ "reflect"
+ "testing"
+ "time"
+
+ "golang.org/x/crypto/acme"
+ "golang.org/x/net/context"
+)
+
+var discoTmpl = template.Must(template.New("disco").Parse(`{
+ "new-reg": "{{.}}/new-reg",
+ "new-authz": "{{.}}/new-authz",
+ "new-cert": "{{.}}/new-cert"
+}`))
+
+var authzTmpl = template.Must(template.New("authz").Parse(`{
+ "status": "pending",
+ "challenges": [
+ {
+ "uri": "{{.}}/challenge/1",
+ "type": "tls-sni-01",
+ "token": "token-01"
+ },
+ {
+ "uri": "{{.}}/challenge/2",
+ "type": "tls-sni-02",
+ "token": "token-02"
+ }
+ ]
+}`))
+
+type memCache map[string][]byte
+
+func (m memCache) Get(ctx context.Context, key string) ([]byte, error) {
+ v, ok := m[key]
+ if !ok {
+ return nil, ErrCacheMiss
+ }
+ return v, nil
+}
+
+func (m memCache) Put(ctx context.Context, key string, data []byte) error {
+ m[key] = data
+ return nil
+}
+
+func (m memCache) Delete(ctx context.Context, key string) error {
+ delete(m, key)
+ return nil
+}
+
+func dummyCert(pub interface{}, san ...string) ([]byte, error) {
+ return dateDummyCert(pub, time.Now(), time.Now().Add(90*24*time.Hour), san...)
+}
+
+func dateDummyCert(pub interface{}, start, end time.Time, san ...string) ([]byte, error) {
+ // use EC key to run faster on 386
+ key, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
+ if err != nil {
+ return nil, err
+ }
+ t := &x509.Certificate{
+ SerialNumber: big.NewInt(1),
+ NotBefore: start,
+ NotAfter: end,
+ BasicConstraintsValid: true,
+ KeyUsage: x509.KeyUsageKeyEncipherment,
+ DNSNames: san,
+ }
+ if pub == nil {
+ pub = &key.PublicKey
+ }
+ return x509.CreateCertificate(rand.Reader, t, t, pub, key)
+}
+
+func decodePayload(v interface{}, r io.Reader) error {
+ var req struct{ Payload string }
+ if err := json.NewDecoder(r).Decode(&req); err != nil {
+ return err
+ }
+ payload, err := base64.RawURLEncoding.DecodeString(req.Payload)
+ if err != nil {
+ return err
+ }
+ return json.Unmarshal(payload, v)
+}
+
+func TestGetCertificate(t *testing.T) {
+ const domain = "example.org"
+ man := &Manager{Prompt: AcceptTOS}
+ defer man.stopRenew()
+
+ // echo token-02 | shasum -a 256
+ // then divide result in 2 parts separated by dot
+ tokenCertName := "4e8eb87631187e9ff2153b56b13a4dec.13a35d002e485d60ff37354b32f665d9.token.acme.invalid"
+ verifyTokenCert := func() {
+ hello := &tls.ClientHelloInfo{ServerName: tokenCertName}
+ _, err := man.GetCertificate(hello)
+ if err != nil {
+ t.Errorf("verifyTokenCert: GetCertificate(%q): %v", tokenCertName, err)
+ return
+ }
+ }
+
+ // ACME CA server stub
+ var ca *httptest.Server
+ ca = httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ w.Header().Set("replay-nonce", "nonce")
+ if r.Method == "HEAD" {
+ // a nonce request
+ return
+ }
+
+ switch r.URL.Path {
+ // discovery
+ case "/":
+ if err := discoTmpl.Execute(w, ca.URL); err != nil {
+ t.Fatalf("discoTmpl: %v", err)
+ }
+ // client key registration
+ case "/new-reg":
+ w.Write([]byte("{}"))
+ // domain authorization
+ case "/new-authz":
+ w.Header().Set("location", ca.URL+"/authz/1")
+ w.WriteHeader(http.StatusCreated)
+ if err := authzTmpl.Execute(w, ca.URL); err != nil {
+ t.Fatalf("authzTmpl: %v", err)
+ }
+ // accept tls-sni-02 challenge
+ case "/challenge/2":
+ verifyTokenCert()
+ w.Write([]byte("{}"))
+ // authorization status
+ case "/authz/1":
+ w.Write([]byte(`{"status": "valid"}`))
+ // cert request
+ case "/new-cert":
+ var req struct {
+ CSR string `json:"csr"`
+ }
+ decodePayload(&req, r.Body)
+ b, _ := base64.RawURLEncoding.DecodeString(req.CSR)
+ csr, err := x509.ParseCertificateRequest(b)
+ if err != nil {
+ t.Fatalf("new-cert: CSR: %v", err)
+ }
+ der, err := dummyCert(csr.PublicKey, domain)
+ if err != nil {
+ t.Fatalf("new-cert: dummyCert: %v", err)
+ }
+ chainUp := fmt.Sprintf("<%s/ca-cert>; rel=up", ca.URL)
+ w.Header().Set("link", chainUp)
+ w.WriteHeader(http.StatusCreated)
+ w.Write(der)
+ // CA chain cert
+ case "/ca-cert":
+ der, err := dummyCert(nil, "ca")
+ if err != nil {
+ t.Fatalf("ca-cert: dummyCert: %v", err)
+ }
+ w.Write(der)
+ default:
+ t.Errorf("unrecognized r.URL.Path: %s", r.URL.Path)
+ }
+ }))
+ defer ca.Close()
+
+ // use EC key to run faster on 386
+ key, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
+ if err != nil {
+ t.Fatal(err)
+ }
+ man.Client = &acme.Client{
+ Key: key,
+ DirectoryURL: ca.URL,
+ }
+
+ // simulate tls.Config.GetCertificate
+ var tlscert *tls.Certificate
+ done := make(chan struct{})
+ go func() {
+ hello := &tls.ClientHelloInfo{ServerName: domain}
+ tlscert, err = man.GetCertificate(hello)
+ close(done)
+ }()
+ select {
+ case <-time.After(time.Minute):
+ t.Fatal("man.GetCertificate took too long to return")
+ case <-done:
+ }
+ if err != nil {
+ t.Fatalf("man.GetCertificate: %v", err)
+ }
+
+ // verify the tlscert is the same we responded with from the CA stub
+ if len(tlscert.Certificate) == 0 {
+ t.Fatal("len(tlscert.Certificate) is 0")
+ }
+ cert, err := x509.ParseCertificate(tlscert.Certificate[0])
+ if err != nil {
+ t.Fatalf("x509.ParseCertificate: %v", err)
+ }
+ if len(cert.DNSNames) == 0 || cert.DNSNames[0] != domain {
+ t.Errorf("cert.DNSNames = %v; want %q", cert.DNSNames, domain)
+ }
+
+ // make sure token cert was removed
+ done = make(chan struct{})
+ go func() {
+ for {
+ hello := &tls.ClientHelloInfo{ServerName: tokenCertName}
+ if _, err := man.GetCertificate(hello); err != nil {
+ break
+ }
+ time.Sleep(100 * time.Millisecond)
+ }
+ close(done)
+ }()
+ select {
+ case <-time.After(5 * time.Second):
+ t.Error("token cert was not removed")
+ case <-done:
+ }
+}
+
+func TestAccountKeyCache(t *testing.T) {
+ cache := make(memCache)
+ m := Manager{Cache: cache}
+ ctx := context.Background()
+ k1, err := m.accountKey(ctx)
+ if err != nil {
+ t.Fatal(err)
+ }
+ k2, err := m.accountKey(ctx)
+ if err != nil {
+ t.Fatal(err)
+ }
+ if !reflect.DeepEqual(k1, k2) {
+ t.Errorf("account keys don't match: k1 = %#v; k2 = %#v", k1, k2)
+ }
+}
+
+func TestCache(t *testing.T) {
+ privKey, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
+ if err != nil {
+ t.Fatal(err)
+ }
+ tmpl := &x509.Certificate{
+ SerialNumber: big.NewInt(1),
+ Subject: pkix.Name{CommonName: "example.org"},
+ NotAfter: time.Now().Add(time.Hour),
+ }
+ pub, err := x509.CreateCertificate(rand.Reader, tmpl, tmpl, &privKey.PublicKey, privKey)
+ if err != nil {
+ t.Fatal(err)
+ }
+ tlscert := &tls.Certificate{
+ Certificate: [][]byte{pub},
+ PrivateKey: privKey,
+ }
+
+ cache := make(memCache)
+ man := &Manager{Cache: cache}
+ defer man.stopRenew()
+ if err := man.cachePut("example.org", tlscert); err != nil {
+ t.Fatalf("man.cachePut: %v", err)
+ }
+ res, err := man.cacheGet("example.org")
+ if err != nil {
+ t.Fatalf("man.cacheGet: %v", err)
+ }
+ if res == nil {
+ t.Fatal("res is nil")
+ }
+}
+
+func TestHostWhitelist(t *testing.T) {
+ policy := HostWhitelist("example.com", "example.org", "*.example.net")
+ tt := []struct {
+ host string
+ allow bool
+ }{
+ {"example.com", true},
+ {"example.org", true},
+ {"one.example.com", false},
+ {"two.example.org", false},
+ {"three.example.net", false},
+ {"dummy", false},
+ }
+ for i, test := range tt {
+ err := policy(nil, test.host)
+ if err != nil && test.allow {
+ t.Errorf("%d: policy(%q): %v; want nil", i, test.host, err)
+ }
+ if err == nil && !test.allow {
+ t.Errorf("%d: policy(%q): nil; want an error", i, test.host)
+ }
+ }
+}
+
+func TestValidCert(t *testing.T) {
+ key1, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
+ if err != nil {
+ t.Fatal(err)
+ }
+ key2, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
+ if err != nil {
+ t.Fatal(err)
+ }
+ key3, err := rsa.GenerateKey(rand.Reader, 512)
+ if err != nil {
+ t.Fatal(err)
+ }
+ cert1, err := dummyCert(key1.Public(), "example.org")
+ if err != nil {
+ t.Fatal(err)
+ }
+ cert2, err := dummyCert(key2.Public(), "example.org")
+ if err != nil {
+ t.Fatal(err)
+ }
+ cert3, err := dummyCert(key3.Public(), "example.org")
+ if err != nil {
+ t.Fatal(err)
+ }
+ now := time.Now()
+ early, err := dateDummyCert(key1.Public(), now.Add(time.Hour), now.Add(2*time.Hour), "example.org")
+ if err != nil {
+ t.Fatal(err)
+ }
+ expired, err := dateDummyCert(key1.Public(), now.Add(-2*time.Hour), now.Add(-time.Hour), "example.org")
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ tt := []struct {
+ domain string
+ key crypto.Signer
+ cert [][]byte
+ ok bool
+ }{
+ {"example.org", key1, [][]byte{cert1}, true},
+ {"example.org", key3, [][]byte{cert3}, true},
+ {"example.org", key1, [][]byte{cert1, cert2, cert3}, true},
+ {"example.org", key1, [][]byte{cert1, {1}}, false},
+ {"example.org", key1, [][]byte{{1}}, false},
+ {"example.org", key1, [][]byte{cert2}, false},
+ {"example.org", key2, [][]byte{cert1}, false},
+ {"example.org", key1, [][]byte{cert3}, false},
+ {"example.org", key3, [][]byte{cert1}, false},
+ {"example.net", key1, [][]byte{cert1}, false},
+ {"example.org", key1, [][]byte{early}, false},
+ {"example.org", key1, [][]byte{expired}, false},
+ }
+ for i, test := range tt {
+ leaf, err := validCert(test.domain, test.cert, test.key)
+ if err != nil && test.ok {
+ t.Errorf("%d: err = %v", i, err)
+ }
+ if err == nil && !test.ok {
+ t.Errorf("%d: err is nil", i)
+ }
+ if err == nil && test.ok && leaf == nil {
+ t.Errorf("%d: leaf is nil", i)
+ }
+ }
+}
diff --git a/vendor/golang.org/x/crypto/acme/autocert/cache.go b/vendor/golang.org/x/crypto/acme/autocert/cache.go
new file mode 100644
index 000000000..1c67f6ce5
--- /dev/null
+++ b/vendor/golang.org/x/crypto/acme/autocert/cache.go
@@ -0,0 +1,130 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package autocert
+
+import (
+ "errors"
+ "io/ioutil"
+ "os"
+ "path/filepath"
+
+ "golang.org/x/net/context"
+)
+
+// ErrCacheMiss is returned when a certificate is not found in cache.
+var ErrCacheMiss = errors.New("acme/autocert: certificate cache miss")
+
+// Cache is used by Manager to store and retrieve previously obtained certificates
+// as opaque data.
+//
+// The key argument of the methods refers to a domain name but need not be an FQDN.
+// Cache implementations should not rely on the key naming pattern.
+type Cache interface {
+ // Get returns a certificate data for the specified key.
+ // If there's no such key, Get returns ErrCacheMiss.
+ Get(ctx context.Context, key string) ([]byte, error)
+
+ // Put stores the data in the cache under the specified key.
+ // Inderlying implementations may use any data storage format,
+ // as long as the reverse operation, Get, results in the original data.
+ Put(ctx context.Context, key string, data []byte) error
+
+ // Delete removes a certificate data from the cache under the specified key.
+ // If there's no such key in the cache, Delete returns nil.
+ Delete(ctx context.Context, key string) error
+}
+
+// DirCache implements Cache using a directory on the local filesystem.
+// If the directory does not exist, it will be created with 0700 permissions.
+type DirCache string
+
+// Get reads a certificate data from the specified file name.
+func (d DirCache) Get(ctx context.Context, name string) ([]byte, error) {
+ name = filepath.Join(string(d), name)
+ var (
+ data []byte
+ err error
+ done = make(chan struct{})
+ )
+ go func() {
+ data, err = ioutil.ReadFile(name)
+ close(done)
+ }()
+ select {
+ case <-ctx.Done():
+ return nil, ctx.Err()
+ case <-done:
+ }
+ if os.IsNotExist(err) {
+ return nil, ErrCacheMiss
+ }
+ return data, err
+}
+
+// Put writes the certificate data to the specified file name.
+// The file will be created with 0600 permissions.
+func (d DirCache) Put(ctx context.Context, name string, data []byte) error {
+ if err := os.MkdirAll(string(d), 0700); err != nil {
+ return err
+ }
+
+ done := make(chan struct{})
+ var err error
+ go func() {
+ defer close(done)
+ var tmp string
+ if tmp, err = d.writeTempFile(name, data); err != nil {
+ return
+ }
+ // prevent overwriting the file if the context was cancelled
+ if ctx.Err() != nil {
+ return // no need to set err
+ }
+ name = filepath.Join(string(d), name)
+ err = os.Rename(tmp, name)
+ }()
+ select {
+ case <-ctx.Done():
+ return ctx.Err()
+ case <-done:
+ }
+ return err
+}
+
+// Delete removes the specified file name.
+func (d DirCache) Delete(ctx context.Context, name string) error {
+ name = filepath.Join(string(d), name)
+ var (
+ err error
+ done = make(chan struct{})
+ )
+ go func() {
+ err = os.Remove(name)
+ close(done)
+ }()
+ select {
+ case <-ctx.Done():
+ return ctx.Err()
+ case <-done:
+ }
+ if err != nil && !os.IsNotExist(err) {
+ return err
+ }
+ return nil
+}
+
+// writeTempFile writes b to a temporary file, closes the file and returns its path.
+func (d DirCache) writeTempFile(prefix string, b []byte) (string, error) {
+ // TempFile uses 0600 permissions
+ f, err := ioutil.TempFile(string(d), prefix)
+ if err != nil {
+ return "", err
+ }
+ if _, err := f.Write(b); err != nil {
+ f.Close()
+ return "", err
+ }
+ return f.Name(), f.Close()
+}
diff --git a/vendor/golang.org/x/crypto/acme/autocert/cache_test.go b/vendor/golang.org/x/crypto/acme/autocert/cache_test.go
new file mode 100644
index 000000000..ad6d4a464
--- /dev/null
+++ b/vendor/golang.org/x/crypto/acme/autocert/cache_test.go
@@ -0,0 +1,58 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package autocert
+
+import (
+ "io/ioutil"
+ "os"
+ "path/filepath"
+ "reflect"
+ "testing"
+
+ "golang.org/x/net/context"
+)
+
+// make sure DirCache satisfies Cache interface
+var _ Cache = DirCache("/")
+
+func TestDirCache(t *testing.T) {
+ dir, err := ioutil.TempDir("", "autocert")
+ if err != nil {
+ t.Fatal(err)
+ }
+ dir = filepath.Join(dir, "certs") // a nonexistent dir
+ cache := DirCache(dir)
+ ctx := context.Background()
+
+ // test cache miss
+ if _, err := cache.Get(ctx, "nonexistent"); err != ErrCacheMiss {
+ t.Errorf("get: %v; want ErrCacheMiss", err)
+ }
+
+ // test put/get
+ b1 := []byte{1}
+ if err := cache.Put(ctx, "dummy", b1); err != nil {
+ t.Fatalf("put: %v", err)
+ }
+ b2, err := cache.Get(ctx, "dummy")
+ if err != nil {
+ t.Fatalf("get: %v", err)
+ }
+ if !reflect.DeepEqual(b1, b2) {
+ t.Errorf("b1 = %v; want %v", b1, b2)
+ }
+ name := filepath.Join(dir, "dummy")
+ if _, err := os.Stat(name); err != nil {
+ t.Error(err)
+ }
+
+ // test delete
+ if err := cache.Delete(ctx, "dummy"); err != nil {
+ t.Fatalf("delete: %v", err)
+ }
+ if _, err := cache.Get(ctx, "dummy"); err != ErrCacheMiss {
+ t.Errorf("get: %v; want ErrCacheMiss", err)
+ }
+}
diff --git a/vendor/golang.org/x/crypto/acme/autocert/renewal.go b/vendor/golang.org/x/crypto/acme/autocert/renewal.go
new file mode 100644
index 000000000..1a5018c8b
--- /dev/null
+++ b/vendor/golang.org/x/crypto/acme/autocert/renewal.go
@@ -0,0 +1,125 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package autocert
+
+import (
+ "crypto"
+ "sync"
+ "time"
+
+ "golang.org/x/net/context"
+)
+
+// maxRandRenew is a maximum deviation from Manager.RenewBefore.
+const maxRandRenew = time.Hour
+
+// domainRenewal tracks the state used by the periodic timers
+// renewing a single domain's cert.
+type domainRenewal struct {
+ m *Manager
+ domain string
+ key crypto.Signer
+
+ timerMu sync.Mutex
+ timer *time.Timer
+}
+
+// start starts a cert renewal timer at the time
+// defined by the certificate expiration time exp.
+//
+// If the timer is already started, calling start is a noop.
+func (dr *domainRenewal) start(exp time.Time) {
+ dr.timerMu.Lock()
+ defer dr.timerMu.Unlock()
+ if dr.timer != nil {
+ return
+ }
+ dr.timer = time.AfterFunc(dr.next(exp), dr.renew)
+}
+
+// stop stops the cert renewal timer.
+// If the timer is already stopped, calling stop is a noop.
+func (dr *domainRenewal) stop() {
+ dr.timerMu.Lock()
+ defer dr.timerMu.Unlock()
+ if dr.timer == nil {
+ return
+ }
+ dr.timer.Stop()
+ dr.timer = nil
+}
+
+// renew is called periodically by a timer.
+// The first renew call is kicked off by dr.start.
+func (dr *domainRenewal) renew() {
+ dr.timerMu.Lock()
+ defer dr.timerMu.Unlock()
+ if dr.timer == nil {
+ return
+ }
+
+ ctx, cancel := context.WithTimeout(context.Background(), 10*time.Minute)
+ defer cancel()
+ // TODO: rotate dr.key at some point?
+ next, err := dr.do(ctx)
+ if err != nil {
+ next = maxRandRenew / 2
+ next += time.Duration(pseudoRand.int63n(int64(next)))
+ }
+ dr.timer = time.AfterFunc(next, dr.renew)
+ testDidRenewLoop(next, err)
+}
+
+// do is similar to Manager.createCert but it doesn't lock a Manager.state item.
+// Instead, it requests a new certificate independently and, upon success,
+// replaces dr.m.state item with a new one and updates cache for the given domain.
+//
+// It may return immediately if the expiration date of the currently cached cert
+// is far enough in the future.
+//
+// The returned value is a time interval after which the renewal should occur again.
+func (dr *domainRenewal) do(ctx context.Context) (time.Duration, error) {
+ // a race is likely unavoidable in a distributed environment
+ // but we try nonetheless
+ if tlscert, err := dr.m.cacheGet(dr.domain); err == nil {
+ next := dr.next(tlscert.Leaf.NotAfter)
+ if next > dr.m.renewBefore()+maxRandRenew {
+ return next, nil
+ }
+ }
+
+ der, leaf, err := dr.m.authorizedCert(ctx, dr.key, dr.domain)
+ if err != nil {
+ return 0, err
+ }
+ state := &certState{
+ key: dr.key,
+ cert: der,
+ leaf: leaf,
+ }
+ tlscert, err := state.tlscert()
+ if err != nil {
+ return 0, err
+ }
+ dr.m.cachePut(dr.domain, tlscert)
+ dr.m.stateMu.Lock()
+ defer dr.m.stateMu.Unlock()
+ // m.state is guaranteed to be non-nil at this point
+ dr.m.state[dr.domain] = state
+ return dr.next(leaf.NotAfter), nil
+}
+
+func (dr *domainRenewal) next(expiry time.Time) time.Duration {
+ d := expiry.Sub(timeNow()) - dr.m.renewBefore()
+ // add a bit of randomness to renew deadline
+ n := pseudoRand.int63n(int64(maxRandRenew))
+ d -= time.Duration(n)
+ if d < 0 {
+ return 0
+ }
+ return d
+}
+
+var testDidRenewLoop = func(next time.Duration, err error) {}
diff --git a/vendor/golang.org/x/crypto/acme/autocert/renewal_test.go b/vendor/golang.org/x/crypto/acme/autocert/renewal_test.go
new file mode 100644
index 000000000..d1ec52f4d
--- /dev/null
+++ b/vendor/golang.org/x/crypto/acme/autocert/renewal_test.go
@@ -0,0 +1,190 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package autocert
+
+import (
+ "crypto/ecdsa"
+ "crypto/elliptic"
+ "crypto/rand"
+ "crypto/tls"
+ "crypto/x509"
+ "encoding/base64"
+ "fmt"
+ "net/http"
+ "net/http/httptest"
+ "testing"
+ "time"
+
+ "golang.org/x/crypto/acme"
+)
+
+func TestRenewalNext(t *testing.T) {
+ now := time.Now()
+ timeNow = func() time.Time { return now }
+ defer func() { timeNow = time.Now }()
+
+ man := &Manager{RenewBefore: 7 * 24 * time.Hour}
+ defer man.stopRenew()
+ tt := []struct {
+ expiry time.Time
+ min, max time.Duration
+ }{
+ {now.Add(90 * 24 * time.Hour), 83*24*time.Hour - maxRandRenew, 83 * 24 * time.Hour},
+ {now.Add(time.Hour), 0, 1},
+ {now, 0, 1},
+ {now.Add(-time.Hour), 0, 1},
+ }
+
+ dr := &domainRenewal{m: man}
+ for i, test := range tt {
+ next := dr.next(test.expiry)
+ if next < test.min || test.max < next {
+ t.Errorf("%d: next = %v; want between %v and %v", i, next, test.min, test.max)
+ }
+ }
+}
+
+func TestRenewFromCache(t *testing.T) {
+ const domain = "example.org"
+
+ // ACME CA server stub
+ var ca *httptest.Server
+ ca = httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ w.Header().Set("replay-nonce", "nonce")
+ if r.Method == "HEAD" {
+ // a nonce request
+ return
+ }
+
+ switch r.URL.Path {
+ // discovery
+ case "/":
+ if err := discoTmpl.Execute(w, ca.URL); err != nil {
+ t.Fatalf("discoTmpl: %v", err)
+ }
+ // client key registration
+ case "/new-reg":
+ w.Write([]byte("{}"))
+ // domain authorization
+ case "/new-authz":
+ w.Header().Set("location", ca.URL+"/authz/1")
+ w.WriteHeader(http.StatusCreated)
+ w.Write([]byte(`{"status": "valid"}`))
+ // cert request
+ case "/new-cert":
+ var req struct {
+ CSR string `json:"csr"`
+ }
+ decodePayload(&req, r.Body)
+ b, _ := base64.RawURLEncoding.DecodeString(req.CSR)
+ csr, err := x509.ParseCertificateRequest(b)
+ if err != nil {
+ t.Fatalf("new-cert: CSR: %v", err)
+ }
+ der, err := dummyCert(csr.PublicKey, domain)
+ if err != nil {
+ t.Fatalf("new-cert: dummyCert: %v", err)
+ }
+ chainUp := fmt.Sprintf("<%s/ca-cert>; rel=up", ca.URL)
+ w.Header().Set("link", chainUp)
+ w.WriteHeader(http.StatusCreated)
+ w.Write(der)
+ // CA chain cert
+ case "/ca-cert":
+ der, err := dummyCert(nil, "ca")
+ if err != nil {
+ t.Fatalf("ca-cert: dummyCert: %v", err)
+ }
+ w.Write(der)
+ default:
+ t.Errorf("unrecognized r.URL.Path: %s", r.URL.Path)
+ }
+ }))
+ defer ca.Close()
+
+ // use EC key to run faster on 386
+ key, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
+ if err != nil {
+ t.Fatal(err)
+ }
+ man := &Manager{
+ Prompt: AcceptTOS,
+ Cache: make(memCache),
+ RenewBefore: 24 * time.Hour,
+ Client: &acme.Client{
+ Key: key,
+ DirectoryURL: ca.URL,
+ },
+ }
+ defer man.stopRenew()
+
+ // cache an almost expired cert
+ now := time.Now()
+ cert, err := dateDummyCert(key.Public(), now.Add(-2*time.Hour), now.Add(time.Minute), domain)
+ if err != nil {
+ t.Fatal(err)
+ }
+ tlscert := &tls.Certificate{PrivateKey: key, Certificate: [][]byte{cert}}
+ if err := man.cachePut(domain, tlscert); err != nil {
+ t.Fatal(err)
+ }
+
+ // veriy the renewal happened
+ defer func() {
+ testDidRenewLoop = func(next time.Duration, err error) {}
+ }()
+ done := make(chan struct{})
+ testDidRenewLoop = func(next time.Duration, err error) {
+ defer close(done)
+ if err != nil {
+ t.Errorf("testDidRenewLoop: %v", err)
+ }
+ // Next should be about 90 days:
+ // dummyCert creates 90days expiry + account for man.RenewBefore.
+ // Previous expiration was within 1 min.
+ future := 88 * 24 * time.Hour
+ if next < future {
+ t.Errorf("testDidRenewLoop: next = %v; want >= %v", next, future)
+ }
+
+ // ensure the new cert is cached
+ after := time.Now().Add(future)
+ tlscert, err := man.cacheGet(domain)
+ if err != nil {
+ t.Fatalf("man.cacheGet: %v", err)
+ }
+ if !tlscert.Leaf.NotAfter.After(after) {
+ t.Errorf("cache leaf.NotAfter = %v; want > %v", tlscert.Leaf.NotAfter, after)
+ }
+
+ // verify the old cert is also replaced in memory
+ man.stateMu.Lock()
+ defer man.stateMu.Unlock()
+ s := man.state[domain]
+ if s == nil {
+ t.Fatalf("m.state[%q] is nil", domain)
+ }
+ tlscert, err = s.tlscert()
+ if err != nil {
+ t.Fatalf("s.tlscert: %v", err)
+ }
+ if !tlscert.Leaf.NotAfter.After(after) {
+ t.Errorf("state leaf.NotAfter = %v; want > %v", tlscert.Leaf.NotAfter, after)
+ }
+ }
+
+ // trigger renew
+ hello := &tls.ClientHelloInfo{ServerName: domain}
+ if _, err := man.GetCertificate(hello); err != nil {
+ t.Fatal(err)
+ }
+
+ // wait for renew loop
+ select {
+ case <-time.After(10 * time.Second):
+ t.Fatal("renew took too long to occur")
+ case <-done:
+ }
+}
diff --git a/vendor/golang.org/x/crypto/acme/internal/acme/acme.go b/vendor/golang.org/x/crypto/acme/internal/acme/acme.go
deleted file mode 100644
index 2732999f3..000000000
--- a/vendor/golang.org/x/crypto/acme/internal/acme/acme.go
+++ /dev/null
@@ -1,473 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package acme provides an ACME client implementation.
-// See https://ietf-wg-acme.github.io/acme/ for details.
-//
-// This package is a work in progress and makes no API stability promises.
-package acme
-
-import (
- "bytes"
- "crypto/rsa"
- "encoding/base64"
- "encoding/json"
- "errors"
- "fmt"
- "io/ioutil"
- "net/http"
- "strconv"
- "strings"
- "time"
-
- "golang.org/x/net/context"
-)
-
-// Client is an ACME client.
-type Client struct {
- // HTTPClient optionally specifies an HTTP client to use
- // instead of http.DefaultClient.
- HTTPClient *http.Client
-
- // Key is the account key used to register with a CA
- // and sign requests.
- Key *rsa.PrivateKey
-}
-
-// Discover performs ACME server discovery using the provided discovery endpoint URL.
-func (c *Client) Discover(url string) (*Directory, error) {
- res, err := c.httpClient().Get(url)
- if err != nil {
- return nil, err
- }
- defer res.Body.Close()
- if res.StatusCode != http.StatusOK {
- return nil, responseError(res)
- }
- var v struct {
- Reg string `json:"new-reg"`
- Authz string `json:"new-authz"`
- Cert string `json:"new-cert"`
- Revoke string `json:"revoke-cert"`
- Meta struct {
- Terms string `json:"terms-of-service"`
- Website string `json:"website"`
- CAA []string `json:"caa-identities"`
- }
- }
- if json.NewDecoder(res.Body).Decode(&v); err != nil {
- return nil, err
- }
- return &Directory{
- RegURL: v.Reg,
- AuthzURL: v.Authz,
- CertURL: v.Cert,
- RevokeURL: v.Revoke,
- Terms: v.Meta.Terms,
- Website: v.Meta.Website,
- CAA: v.Meta.CAA,
- }, nil
-}
-
-// CreateCert requests a new certificate.
-// In the case where CA server does not provide the issued certificate in the response,
-// CreateCert will poll certURL using c.FetchCert, which will result in additional round-trips.
-// In such scenario the caller can cancel the polling with ctx.
-//
-// If the bundle is true, the returned value will also contain CA (the issuer) certificate.
-// The url argument is an Directory.CertURL value, typically obtained from c.Discover.
-// The csr is a DER encoded certificate signing request.
-func (c *Client) CreateCert(ctx context.Context, url string, csr []byte, exp time.Duration, bundle bool) (der [][]byte, certURL string, err error) {
- req := struct {
- Resource string `json:"resource"`
- CSR string `json:"csr"`
- NotBefore string `json:"notBefore,omitempty"`
- NotAfter string `json:"notAfter,omitempty"`
- }{
- Resource: "new-cert",
- CSR: base64.RawURLEncoding.EncodeToString(csr),
- }
- now := timeNow()
- req.NotBefore = now.Format(time.RFC3339)
- if exp > 0 {
- req.NotAfter = now.Add(exp).Format(time.RFC3339)
- }
-
- res, err := c.postJWS(url, req)
- if err != nil {
- return nil, "", err
- }
- defer res.Body.Close()
- if res.StatusCode != http.StatusCreated {
- return nil, "", responseError(res)
- }
-
- curl := res.Header.Get("location") // cert permanent URL
- if res.ContentLength == 0 {
- // no cert in the body; poll until we get it
- cert, err := c.FetchCert(ctx, curl, bundle)
- return cert, curl, err
- }
- // slurp issued cert and ca, if requested
- cert, err := responseCert(c.httpClient(), res, bundle)
- return cert, curl, err
-}
-
-// FetchCert retrieves already issued certificate from the given url, in DER format.
-// It retries the request until the certificate is successfully retrieved,
-// context is cancelled by the caller or an error response is received.
-//
-// The returned value will also contain CA (the issuer) certificate if bundle == true.
-//
-// http.DefaultClient is used if client argument is nil.
-func (c *Client) FetchCert(ctx context.Context, url string, bundle bool) ([][]byte, error) {
- for {
- res, err := c.httpClient().Get(url)
- if err != nil {
- return nil, err
- }
- defer res.Body.Close()
- if res.StatusCode == http.StatusOK {
- return responseCert(c.httpClient(), res, bundle)
- }
- if res.StatusCode > 299 {
- return nil, responseError(res)
- }
- d, err := retryAfter(res.Header.Get("retry-after"))
- if err != nil {
- d = 3 * time.Second
- }
- select {
- case <-time.After(d):
- // retry
- case <-ctx.Done():
- return nil, ctx.Err()
- }
- }
-}
-
-// Register creates a new account registration by following the "new-reg" flow.
-// It returns registered account. The a argument is not modified.
-//
-// The url argument is typically an Directory.RegURL obtained from c.Discover.
-func (c *Client) Register(url string, a *Account) (*Account, error) {
- return c.doReg(url, "new-reg", a)
-}
-
-// GetReg retrieves an existing registration.
-// The url argument is an Account.URI, typically obtained from c.Register.
-func (c *Client) GetReg(url string) (*Account, error) {
- a := &Account{URI: url}
- return c.doReg(url, "reg", a)
-}
-
-// UpdateReg updates an existing registration.
-// It returns an updated account copy. The provided account is not modified.
-//
-// The url argument is an Account.URI, usually obtained with c.Register.
-func (c *Client) UpdateReg(url string, a *Account) (*Account, error) {
- return c.doReg(url, "reg", a)
-}
-
-// Authorize performs the initial step in an authorization flow.
-// The caller will then need to choose from and perform a set of returned
-// challenges using c.Accept in order to successfully complete authorization.
-//
-// The url argument is an authz URL, usually obtained with c.Register.
-func (c *Client) Authorize(url, domain string) (*Authorization, error) {
- type authzID struct {
- Type string `json:"type"`
- Value string `json:"value"`
- }
- req := struct {
- Resource string `json:"resource"`
- Identifier authzID `json:"identifier"`
- }{
- Resource: "new-authz",
- Identifier: authzID{Type: "dns", Value: domain},
- }
- res, err := c.postJWS(url, req)
- if err != nil {
- return nil, err
- }
- defer res.Body.Close()
- if res.StatusCode != http.StatusCreated {
- return nil, responseError(res)
- }
-
- var v wireAuthz
- if err := json.NewDecoder(res.Body).Decode(&v); err != nil {
- return nil, fmt.Errorf("Decode: %v", err)
- }
- if v.Status != StatusPending {
- return nil, fmt.Errorf("Unexpected status: %s", v.Status)
- }
- return v.authorization(res.Header.Get("Location")), nil
-}
-
-// GetAuthz retrieves the current status of an authorization flow.
-//
-// A client typically polls an authz status using this method.
-func (c *Client) GetAuthz(url string) (*Authorization, error) {
- res, err := c.httpClient().Get(url)
- if err != nil {
- return nil, err
- }
- defer res.Body.Close()
- if res.StatusCode != http.StatusOK && res.StatusCode != http.StatusAccepted {
- return nil, responseError(res)
- }
- var v wireAuthz
- if err := json.NewDecoder(res.Body).Decode(&v); err != nil {
- return nil, fmt.Errorf("Decode: %v", err)
- }
- return v.authorization(url), nil
-}
-
-// GetChallenge retrieves the current status of an challenge.
-//
-// A client typically polls a challenge status using this method.
-func (c *Client) GetChallenge(url string) (*Challenge, error) {
- res, err := c.httpClient().Get(url)
- if err != nil {
- return nil, err
- }
- defer res.Body.Close()
- if res.StatusCode != http.StatusOK && res.StatusCode != http.StatusAccepted {
- return nil, responseError(res)
- }
- v := wireChallenge{URI: url}
- if err := json.NewDecoder(res.Body).Decode(&v); err != nil {
- return nil, fmt.Errorf("Decode: %v", err)
- }
- return v.challenge(), nil
-}
-
-// Accept informs the server that the client accepts one of its challenges
-// previously obtained with c.Authorize.
-//
-// The server will then perform the validation asynchronously.
-func (c *Client) Accept(chal *Challenge) (*Challenge, error) {
- req := struct {
- Resource string `json:"resource"`
- Type string `json:"type"`
- Auth string `json:"keyAuthorization"`
- }{
- Resource: "challenge",
- Type: chal.Type,
- Auth: keyAuth(&c.Key.PublicKey, chal.Token),
- }
- res, err := c.postJWS(chal.URI, req)
- if err != nil {
- return nil, err
- }
- defer res.Body.Close()
- // Note: the protocol specifies 200 as the expected response code, but
- // letsencrypt seems to be returning 202.
- if res.StatusCode != http.StatusOK && res.StatusCode != http.StatusAccepted {
- return nil, responseError(res)
- }
-
- var v wireChallenge
- if err := json.NewDecoder(res.Body).Decode(&v); err != nil {
- return nil, fmt.Errorf("Decode: %v", err)
- }
- return v.challenge(), nil
-}
-
-// HTTP01Handler creates a new handler which responds to a http-01 challenge.
-// The token argument is a Challenge.Token value.
-func (c *Client) HTTP01Handler(token string) http.Handler {
- return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
- if !strings.HasSuffix(r.URL.Path, token) {
- w.WriteHeader(http.StatusNotFound)
- return
- }
- w.Header().Set("content-type", "text/plain")
- w.Write([]byte(keyAuth(&c.Key.PublicKey, token)))
- })
-}
-
-func (c *Client) httpClient() *http.Client {
- if c.HTTPClient != nil {
- return c.HTTPClient
- }
- return http.DefaultClient
-}
-
-// postJWS signs body and posts it to the provided url.
-// The body argument must be JSON-serializable.
-func (c *Client) postJWS(url string, body interface{}) (*http.Response, error) {
- nonce, err := fetchNonce(c.httpClient(), url)
- if err != nil {
- return nil, err
- }
- b, err := jwsEncodeJSON(body, c.Key, nonce)
- if err != nil {
- return nil, err
- }
- req, err := http.NewRequest("POST", url, bytes.NewReader(b))
- if err != nil {
- return nil, err
- }
- return c.httpClient().Do(req)
-}
-
-// doReg sends all types of registration requests.
-// The type of request is identified by typ argument, which is a "resource"
-// in the ACME spec terms.
-//
-// A non-nil acct argument indicates whether the intention is to mutate data
-// of the Account. Only Contact and Agreement of its fields are used
-// in such cases.
-//
-// The fields of acct will be populate with the server response
-// and may be overwritten.
-func (c *Client) doReg(url string, typ string, acct *Account) (*Account, error) {
- req := struct {
- Resource string `json:"resource"`
- Contact []string `json:"contact,omitempty"`
- Agreement string `json:"agreement,omitempty"`
- }{
- Resource: typ,
- }
- if acct != nil {
- req.Contact = acct.Contact
- req.Agreement = acct.AgreedTerms
- }
- res, err := c.postJWS(url, req)
- if err != nil {
- return nil, err
- }
- defer res.Body.Close()
- if res.StatusCode < 200 || res.StatusCode > 299 {
- return nil, responseError(res)
- }
-
- var v struct {
- Contact []string
- Agreement string
- Authorizations string
- Certificates string
- }
- if err := json.NewDecoder(res.Body).Decode(&v); err != nil {
- return nil, fmt.Errorf("Decode: %v", err)
- }
- return &Account{
- URI: res.Header.Get("Location"),
- Contact: v.Contact,
- AgreedTerms: v.Agreement,
- CurrentTerms: linkHeader(res.Header, "terms-of-service"),
- Authz: linkHeader(res.Header, "next"),
- Authorizations: v.Authorizations,
- Certificates: v.Certificates,
- }, nil
-}
-
-func responseCert(client *http.Client, res *http.Response, bundle bool) ([][]byte, error) {
- b, err := ioutil.ReadAll(res.Body)
- if err != nil {
- return nil, fmt.Errorf("ReadAll: %v", err)
- }
- cert := [][]byte{b}
- if !bundle {
- return cert, nil
- }
-
- // append ca cert
- up := linkHeader(res.Header, "up")
- if up == "" {
- return nil, errors.New("rel=up link not found")
- }
- res, err = client.Get(up)
- if err != nil {
- return nil, err
- }
- defer res.Body.Close()
- if res.StatusCode != http.StatusOK {
- return nil, responseError(res)
- }
- b, err = ioutil.ReadAll(res.Body)
- if err != nil {
- return nil, err
- }
- return append(cert, b), nil
-}
-
-// responseError creates an error of Error type from resp.
-func responseError(resp *http.Response) error {
- // don't care if ReadAll returns an error:
- // json.Unmarshal will fail in that case anyway
- b, _ := ioutil.ReadAll(resp.Body)
- e := struct {
- Status int
- Type string
- Detail string
- }{
- Status: resp.StatusCode,
- }
- if err := json.Unmarshal(b, &e); err != nil {
- // this is not a regular error response:
- // populate detail with anything we received,
- // e.Status will already contain HTTP response code value
- e.Detail = string(b)
- if e.Detail == "" {
- e.Detail = resp.Status
- }
- }
- return &Error{
- StatusCode: e.Status,
- ProblemType: e.Type,
- Detail: e.Detail,
- Header: resp.Header,
- }
-}
-
-func fetchNonce(client *http.Client, url string) (string, error) {
- resp, err := client.Head(url)
- if err != nil {
- return "", nil
- }
- defer resp.Body.Close()
- enc := resp.Header.Get("replay-nonce")
- if enc == "" {
- return "", errors.New("nonce not found")
- }
- return enc, nil
-}
-
-func linkHeader(h http.Header, rel string) string {
- for _, v := range h["Link"] {
- parts := strings.Split(v, ";")
- for _, p := range parts {
- p = strings.TrimSpace(p)
- if !strings.HasPrefix(p, "rel=") {
- continue
- }
- if v := strings.Trim(p[4:], `"`); v == rel {
- return strings.Trim(parts[0], "<>")
- }
- }
- }
- return ""
-}
-
-func retryAfter(v string) (time.Duration, error) {
- if i, err := strconv.Atoi(v); err == nil {
- return time.Duration(i) * time.Second, nil
- }
- t, err := http.ParseTime(v)
- if err != nil {
- return 0, err
- }
- return t.Sub(timeNow()), nil
-}
-
-// keyAuth generates a key authorization string for a given token.
-func keyAuth(pub *rsa.PublicKey, token string) string {
- return fmt.Sprintf("%s.%s", token, JWKThumbprint(pub))
-}
-
-// timeNow is useful for testing for fixed current time.
-var timeNow = time.Now
diff --git a/vendor/golang.org/x/crypto/acme/internal/acme/jws.go b/vendor/golang.org/x/crypto/acme/internal/acme/jws.go
deleted file mode 100644
index c27752977..000000000
--- a/vendor/golang.org/x/crypto/acme/internal/acme/jws.go
+++ /dev/null
@@ -1,67 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package acme
-
-import (
- "crypto"
- "crypto/rand"
- "crypto/rsa"
- "crypto/sha256"
- "encoding/base64"
- "encoding/json"
- "fmt"
- "math/big"
-)
-
-// jwsEncodeJSON signs claimset using provided key and a nonce.
-// The result is serialized in JSON format.
-// See https://tools.ietf.org/html/rfc7515#section-7.
-func jwsEncodeJSON(claimset interface{}, key *rsa.PrivateKey, nonce string) ([]byte, error) {
- jwk := jwkEncode(&key.PublicKey)
- phead := fmt.Sprintf(`{"alg":"RS256","jwk":%s,"nonce":%q}`, jwk, nonce)
- phead = base64.RawURLEncoding.EncodeToString([]byte(phead))
- cs, err := json.Marshal(claimset)
- if err != nil {
- return nil, err
- }
- payload := base64.RawURLEncoding.EncodeToString(cs)
- h := sha256.New()
- h.Write([]byte(phead + "." + payload))
- sig, err := rsa.SignPKCS1v15(rand.Reader, key, crypto.SHA256, h.Sum(nil))
- if err != nil {
- return nil, err
- }
- enc := struct {
- Protected string `json:"protected"`
- Payload string `json:"payload"`
- Sig string `json:"signature"`
- }{
- Protected: phead,
- Payload: payload,
- Sig: base64.RawURLEncoding.EncodeToString(sig),
- }
- return json.Marshal(&enc)
-}
-
-// jwkEncode encodes public part of an RSA key into a JWK.
-// The result is also suitable for creating a JWK thumbprint.
-func jwkEncode(pub *rsa.PublicKey) string {
- n := pub.N
- e := big.NewInt(int64(pub.E))
- // fields order is important
- // see https://tools.ietf.org/html/rfc7638#section-3.3 for details
- return fmt.Sprintf(`{"e":"%s","kty":"RSA","n":"%s"}`,
- base64.RawURLEncoding.EncodeToString(e.Bytes()),
- base64.RawURLEncoding.EncodeToString(n.Bytes()),
- )
-}
-
-// JWKThumbprint creates a JWK thumbprint out of pub
-// as specified in https://tools.ietf.org/html/rfc7638.
-func JWKThumbprint(pub *rsa.PublicKey) string {
- jwk := jwkEncode(pub)
- b := sha256.Sum256([]byte(jwk))
- return base64.RawURLEncoding.EncodeToString(b[:])
-}
diff --git a/vendor/golang.org/x/crypto/acme/jws.go b/vendor/golang.org/x/crypto/acme/jws.go
new file mode 100644
index 000000000..49ba313ca
--- /dev/null
+++ b/vendor/golang.org/x/crypto/acme/jws.go
@@ -0,0 +1,153 @@
+// Copyright 2015 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package acme
+
+import (
+ "crypto"
+ "crypto/ecdsa"
+ "crypto/rand"
+ "crypto/rsa"
+ "crypto/sha256"
+ _ "crypto/sha512" // need for EC keys
+ "encoding/base64"
+ "encoding/json"
+ "fmt"
+ "math/big"
+)
+
+// jwsEncodeJSON signs claimset using provided key and a nonce.
+// The result is serialized in JSON format.
+// See https://tools.ietf.org/html/rfc7515#section-7.
+func jwsEncodeJSON(claimset interface{}, key crypto.Signer, nonce string) ([]byte, error) {
+ jwk, err := jwkEncode(key.Public())
+ if err != nil {
+ return nil, err
+ }
+ alg, sha := jwsHasher(key)
+ if alg == "" || !sha.Available() {
+ return nil, ErrUnsupportedKey
+ }
+ phead := fmt.Sprintf(`{"alg":%q,"jwk":%s,"nonce":%q}`, alg, jwk, nonce)
+ phead = base64.RawURLEncoding.EncodeToString([]byte(phead))
+ cs, err := json.Marshal(claimset)
+ if err != nil {
+ return nil, err
+ }
+ payload := base64.RawURLEncoding.EncodeToString(cs)
+ hash := sha.New()
+ hash.Write([]byte(phead + "." + payload))
+ sig, err := jwsSign(key, sha, hash.Sum(nil))
+ if err != nil {
+ return nil, err
+ }
+
+ enc := struct {
+ Protected string `json:"protected"`
+ Payload string `json:"payload"`
+ Sig string `json:"signature"`
+ }{
+ Protected: phead,
+ Payload: payload,
+ Sig: base64.RawURLEncoding.EncodeToString(sig),
+ }
+ return json.Marshal(&enc)
+}
+
+// jwkEncode encodes public part of an RSA or ECDSA key into a JWK.
+// The result is also suitable for creating a JWK thumbprint.
+// https://tools.ietf.org/html/rfc7517
+func jwkEncode(pub crypto.PublicKey) (string, error) {
+ switch pub := pub.(type) {
+ case *rsa.PublicKey:
+ // https://tools.ietf.org/html/rfc7518#section-6.3.1
+ n := pub.N
+ e := big.NewInt(int64(pub.E))
+ // Field order is important.
+ // See https://tools.ietf.org/html/rfc7638#section-3.3 for details.
+ return fmt.Sprintf(`{"e":"%s","kty":"RSA","n":"%s"}`,
+ base64.RawURLEncoding.EncodeToString(e.Bytes()),
+ base64.RawURLEncoding.EncodeToString(n.Bytes()),
+ ), nil
+ case *ecdsa.PublicKey:
+ // https://tools.ietf.org/html/rfc7518#section-6.2.1
+ p := pub.Curve.Params()
+ n := p.BitSize / 8
+ if p.BitSize%8 != 0 {
+ n++
+ }
+ x := pub.X.Bytes()
+ if n > len(x) {
+ x = append(make([]byte, n-len(x)), x...)
+ }
+ y := pub.Y.Bytes()
+ if n > len(y) {
+ y = append(make([]byte, n-len(y)), y...)
+ }
+ // Field order is important.
+ // See https://tools.ietf.org/html/rfc7638#section-3.3 for details.
+ return fmt.Sprintf(`{"crv":"%s","kty":"EC","x":"%s","y":"%s"}`,
+ p.Name,
+ base64.RawURLEncoding.EncodeToString(x),
+ base64.RawURLEncoding.EncodeToString(y),
+ ), nil
+ }
+ return "", ErrUnsupportedKey
+}
+
+// jwsSign signs the digest using the given key.
+// It returns ErrUnsupportedKey if the key type is unknown.
+// The hash is used only for RSA keys.
+func jwsSign(key crypto.Signer, hash crypto.Hash, digest []byte) ([]byte, error) {
+ switch key := key.(type) {
+ case *rsa.PrivateKey:
+ return key.Sign(rand.Reader, digest, hash)
+ case *ecdsa.PrivateKey:
+ r, s, err := ecdsa.Sign(rand.Reader, key, digest)
+ if err != nil {
+ return nil, err
+ }
+ rb, sb := r.Bytes(), s.Bytes()
+ size := key.Params().BitSize / 8
+ if size%8 > 0 {
+ size++
+ }
+ sig := make([]byte, size*2)
+ copy(sig[size-len(rb):], rb)
+ copy(sig[size*2-len(sb):], sb)
+ return sig, nil
+ }
+ return nil, ErrUnsupportedKey
+}
+
+// jwsHasher indicates suitable JWS algorithm name and a hash function
+// to use for signing a digest with the provided key.
+// It returns ("", 0) if the key is not supported.
+func jwsHasher(key crypto.Signer) (string, crypto.Hash) {
+ switch key := key.(type) {
+ case *rsa.PrivateKey:
+ return "RS256", crypto.SHA256
+ case *ecdsa.PrivateKey:
+ switch key.Params().Name {
+ case "P-256":
+ return "ES256", crypto.SHA256
+ case "P-384":
+ return "ES384", crypto.SHA384
+ case "P-512":
+ return "ES512", crypto.SHA512
+ }
+ }
+ return "", 0
+}
+
+// JWKThumbprint creates a JWK thumbprint out of pub
+// as specified in https://tools.ietf.org/html/rfc7638.
+func JWKThumbprint(pub crypto.PublicKey) (string, error) {
+ jwk, err := jwkEncode(pub)
+ if err != nil {
+ return "", err
+ }
+ b := sha256.Sum256([]byte(jwk))
+ return base64.RawURLEncoding.EncodeToString(b[:]), nil
+}
diff --git a/vendor/golang.org/x/crypto/acme/internal/acme/jws_test.go b/vendor/golang.org/x/crypto/acme/jws_test.go
index 7afd9507b..1def87397 100644
--- a/vendor/golang.org/x/crypto/acme/internal/acme/jws_test.go
+++ b/vendor/golang.org/x/crypto/acme/jws_test.go
@@ -5,6 +5,8 @@
package acme
import (
+ "crypto/ecdsa"
+ "crypto/elliptic"
"crypto/rsa"
"crypto/x509"
"encoding/base64"
@@ -47,7 +49,29 @@ EQeIP6dZtv8IMgtGIb91QX9pXvP0aznzQKwYIA8nZgoENCPfiMTPiEDT9e/0lObO
// This thumbprint is for the testKey defined above.
const testKeyThumbprint = "6nicxzh6WETQlrvdchkz-U3e3DOQZ4heJKU63rfqMqQ"
-var testKey *rsa.PrivateKey
+const (
+ // openssl ecparam -name secp256k1 -genkey -noout
+ testKeyECPEM = `
+-----BEGIN EC PRIVATE KEY-----
+MHcCAQEEIK07hGLr0RwyUdYJ8wbIiBS55CjnkMD23DWr+ccnypWLoAoGCCqGSM49
+AwEHoUQDQgAE5lhEug5xK4xBDZ2nAbaxLtaLiv85bxJ7ePd1dkO23HThqIrvawF5
+QAaS/RNouybCiRhRjI3EaxLkQwgrCw0gqQ==
+-----END EC PRIVATE KEY-----
+`
+ // 1. opnessl ec -in key.pem -noout -text
+ // 2. remove first byte, 04 (the header); the rest is X and Y
+ // 3. covert each with: echo <val> | xxd -r -p | base64 | tr -d '=' | tr '/+' '_-'
+ testKeyECPubX = "5lhEug5xK4xBDZ2nAbaxLtaLiv85bxJ7ePd1dkO23HQ"
+ testKeyECPubY = "4aiK72sBeUAGkv0TaLsmwokYUYyNxGsS5EMIKwsNIKk"
+ // echo -n '{"crv":"P-256","kty":"EC","x":"<testKeyECPubX>","y":"<testKeyECPubY>"}' | \
+ // openssl dgst -binary -sha256 | base64 | tr -d '=' | tr '/+' '_-'
+ testKeyECThumbprint = "zedj-Bd1Zshp8KLePv2MB-lJ_Hagp7wAwdkA0NUTniU"
+)
+
+var (
+ testKey *rsa.PrivateKey
+ testKeyEC *ecdsa.PrivateKey
+)
func init() {
d, _ := pem.Decode([]byte(testKeyPEM))
@@ -59,6 +83,14 @@ func init() {
if err != nil {
panic(err.Error())
}
+
+ if d, _ = pem.Decode([]byte(testKeyECPEM)); d == nil {
+ panic("no block found in testKeyECPEM")
+ }
+ testKeyEC, err = x509.ParseECPrivateKey(d.Bytes)
+ if err != nil {
+ panic(err.Error())
+ }
}
func TestJWSEncodeJSON(t *testing.T) {
@@ -108,7 +140,55 @@ func TestJWSEncodeJSON(t *testing.T) {
}
}
-func TestJWKThumbprint(t *testing.T) {
+func TestJWSEncodeJSONEC(t *testing.T) {
+ claims := struct{ Msg string }{"Hello JWS"}
+
+ b, err := jwsEncodeJSON(claims, testKeyEC, "nonce")
+ if err != nil {
+ t.Fatal(err)
+ }
+ var jws struct{ Protected, Payload, Signature string }
+ if err := json.Unmarshal(b, &jws); err != nil {
+ t.Fatal(err)
+ }
+
+ if b, err = base64.RawURLEncoding.DecodeString(jws.Protected); err != nil {
+ t.Fatalf("jws.Protected: %v", err)
+ }
+ var head struct {
+ Alg string
+ Nonce string
+ JWK struct {
+ Crv string
+ Kty string
+ X string
+ Y string
+ } `json:"jwk"`
+ }
+ if err := json.Unmarshal(b, &head); err != nil {
+ t.Fatalf("jws.Protected: %v", err)
+ }
+ if head.Alg != "ES256" {
+ t.Errorf("head.Alg = %q; want ES256", head.Alg)
+ }
+ if head.Nonce != "nonce" {
+ t.Errorf("head.Nonce = %q; want nonce", head.Nonce)
+ }
+ if head.JWK.Crv != "P-256" {
+ t.Errorf("head.JWK.Crv = %q; want P-256", head.JWK.Crv)
+ }
+ if head.JWK.Kty != "EC" {
+ t.Errorf("head.JWK.Kty = %q; want EC", head.JWK.Kty)
+ }
+ if head.JWK.X != testKeyECPubX {
+ t.Errorf("head.JWK.X = %q; want %q", head.JWK.X, testKeyECPubX)
+ }
+ if head.JWK.Y != testKeyECPubY {
+ t.Errorf("head.JWK.Y = %q; want %q", head.JWK.Y, testKeyECPubY)
+ }
+}
+
+func TestJWKThumbprintRSA(t *testing.T) {
// Key example from RFC 7638
const base64N = "0vx7agoebGcQSuuPiLJXZptN9nndrQmbXEps2aiAFbWhM78LhWx4cbbfAAt" +
"VT86zwu1RK7aPFFxuhDR1L6tSoc_BJECPebWKRXjBZCiFV4n3oknjhMstn6" +
@@ -119,21 +199,68 @@ func TestJWKThumbprint(t *testing.T) {
const base64E = "AQAB"
const expected = "NzbLsXh8uDCcd-6MNwXF4W_7noWXFZAfHkxZsRGC9Xs"
- bytes, err := base64.RawURLEncoding.DecodeString(base64N)
+ b, err := base64.RawURLEncoding.DecodeString(base64N)
if err != nil {
t.Fatalf("Error parsing example key N: %v", err)
}
- n := new(big.Int).SetBytes(bytes)
+ n := new(big.Int).SetBytes(b)
- bytes, err = base64.RawURLEncoding.DecodeString(base64E)
+ b, err = base64.RawURLEncoding.DecodeString(base64E)
if err != nil {
t.Fatalf("Error parsing example key E: %v", err)
}
- e := new(big.Int).SetBytes(bytes)
+ e := new(big.Int).SetBytes(b)
pub := &rsa.PublicKey{N: n, E: int(e.Uint64())}
- th := JWKThumbprint(pub)
+ th, err := JWKThumbprint(pub)
+ if err != nil {
+ t.Error(err)
+ }
if th != expected {
- t.Errorf("th = %q; want %q", th, expected)
+ t.Errorf("thumbprint = %q; want %q", th, expected)
+ }
+}
+
+func TestJWKThumbprintEC(t *testing.T) {
+ // Key example from RFC 7520
+ // expected was computed with
+ // echo -n '{"crv":"P-521","kty":"EC","x":"<base64X>","y":"<base64Y>"}' | \
+ // openssl dgst -binary -sha256 | \
+ // base64 | \
+ // tr -d '=' | tr '/+' '_-'
+ const (
+ base64X = "AHKZLLOsCOzz5cY97ewNUajB957y-C-U88c3v13nmGZx6sYl_oJXu9A5RkT" +
+ "KqjqvjyekWF-7ytDyRXYgCF5cj0Kt"
+ base64Y = "AdymlHvOiLxXkEhayXQnNCvDX4h9htZaCJN34kfmC6pV5OhQHiraVySsUda" +
+ "QkAgDPrwQrJmbnX9cwlGfP-HqHZR1"
+ expected = "dHri3SADZkrush5HU_50AoRhcKFryN-PI6jPBtPL55M"
+ )
+
+ b, err := base64.RawURLEncoding.DecodeString(base64X)
+ if err != nil {
+ t.Fatalf("Error parsing example key X: %v", err)
+ }
+ x := new(big.Int).SetBytes(b)
+
+ b, err = base64.RawURLEncoding.DecodeString(base64Y)
+ if err != nil {
+ t.Fatalf("Error parsing example key Y: %v", err)
+ }
+ y := new(big.Int).SetBytes(b)
+
+ pub := &ecdsa.PublicKey{Curve: elliptic.P521(), X: x, Y: y}
+ th, err := JWKThumbprint(pub)
+ if err != nil {
+ t.Error(err)
+ }
+ if th != expected {
+ t.Errorf("thumbprint = %q; want %q", th, expected)
+ }
+}
+
+func TestJWKThumbprintErrUnsupportedKey(t *testing.T) {
+ _, err := JWKThumbprint(struct{}{})
+ if err != ErrUnsupportedKey {
+ t.Errorf("err = %q; want %q", err, ErrUnsupportedKey)
}
}
diff --git a/vendor/golang.org/x/crypto/acme/internal/acme/types.go b/vendor/golang.org/x/crypto/acme/types.go
index e64dc118c..0513b2e55 100644
--- a/vendor/golang.org/x/crypto/acme/internal/acme/types.go
+++ b/vendor/golang.org/x/crypto/acme/types.go
@@ -1,6 +1,7 @@
package acme
import (
+ "errors"
"fmt"
"net/http"
)
@@ -15,6 +16,50 @@ const (
StatusRevoked = "revoked"
)
+// CRLReasonCode identifies the reason for a certificate revocation.
+type CRLReasonCode int
+
+// CRL reason codes as defined in RFC 5280.
+const (
+ CRLReasonUnspecified CRLReasonCode = 0
+ CRLReasonKeyCompromise CRLReasonCode = 1
+ CRLReasonCACompromise CRLReasonCode = 2
+ CRLReasonAffiliationChanged CRLReasonCode = 3
+ CRLReasonSuperseded CRLReasonCode = 4
+ CRLReasonCessationOfOperation CRLReasonCode = 5
+ CRLReasonCertificateHold CRLReasonCode = 6
+ CRLReasonRemoveFromCRL CRLReasonCode = 8
+ CRLReasonPrivilegeWithdrawn CRLReasonCode = 9
+ CRLReasonAACompromise CRLReasonCode = 10
+)
+
+var (
+ // ErrAuthorizationFailed indicates that an authorization for an identifier
+ // did not succeed.
+ ErrAuthorizationFailed = errors.New("acme: identifier authorization failed")
+
+ // ErrUnsupportedKey is returned when an unsupported key type is encountered.
+ ErrUnsupportedKey = errors.New("acme: unknown key type; only RSA and ECDSA are supported")
+)
+
+// Error is an ACME error, defined in Problem Details for HTTP APIs doc
+// http://tools.ietf.org/html/draft-ietf-appsawg-http-problem.
+type Error struct {
+ // StatusCode is The HTTP status code generated by the origin server.
+ StatusCode int
+ // ProblemType is a URI reference that identifies the problem type,
+ // typically in a "urn:acme:error:xxx" form.
+ ProblemType string
+ // Detail is a human-readable explanation specific to this occurrence of the problem.
+ Detail string
+ // Header is the original server error response headers.
+ Header http.Header
+}
+
+func (e *Error) Error() string {
+ return fmt.Sprintf("%d %s: %s", e.StatusCode, e.ProblemType, e.Detail)
+}
+
// Account is a user account. It is associated with a private key.
type Account struct {
// URI is the account unique ID, which is also a URL used to retrieve
@@ -25,7 +70,8 @@ type Account struct {
Contact []string
// The terms user has agreed to.
- // Zero value indicates that the user hasn't agreed yet.
+ // A value not matching CurrentTerms indicates that the user hasn't agreed
+ // to the actual Terms of Service of the CA.
AgreedTerms string
// Actual terms of a CA.
@@ -116,24 +162,6 @@ type AuthzID struct {
Value string // The identifier itself, e.g. "example.org".
}
-// Error is an ACME error, defined in Problem Details for HTTP APIs doc
-// http://tools.ietf.org/html/draft-ietf-appsawg-http-problem.
-type Error struct {
- // StatusCode is The HTTP status code generated by the origin server.
- StatusCode int
- // ProblemType is a URI reference that identifies the problem type,
- // typically in a "urn:acme:error:xxx" form.
- ProblemType string
- // Detail is a human-readable explanation specific to this occurrence of the problem.
- Detail string
- // Header is the original server error response headers.
- Header http.Header
-}
-
-func (e *Error) Error() string {
- return fmt.Sprintf("%d %s: %s", e.StatusCode, e.ProblemType, e.Detail)
-}
-
// wireAuthz is ACME JSON representation of Authorization objects.
type wireAuthz struct {
Status string
diff --git a/vendor/golang.org/x/crypto/blowfish/cipher.go b/vendor/golang.org/x/crypto/blowfish/cipher.go
index 542984aa8..a73954f39 100644
--- a/vendor/golang.org/x/crypto/blowfish/cipher.go
+++ b/vendor/golang.org/x/crypto/blowfish/cipher.go
@@ -39,7 +39,7 @@ func NewCipher(key []byte) (*Cipher, error) {
// NewSaltedCipher creates a returns a Cipher that folds a salt into its key
// schedule. For most purposes, NewCipher, instead of NewSaltedCipher, is
-// sufficient and desirable. For bcrypt compatiblity, the key can be over 56
+// sufficient and desirable. For bcrypt compatibility, the key can be over 56
// bytes.
func NewSaltedCipher(key, salt []byte) (*Cipher, error) {
if len(salt) == 0 {
diff --git a/vendor/golang.org/x/crypto/nacl/box/box.go b/vendor/golang.org/x/crypto/nacl/box/box.go
index ca48a6dbf..7ed1864f7 100644
--- a/vendor/golang.org/x/crypto/nacl/box/box.go
+++ b/vendor/golang.org/x/crypto/nacl/box/box.go
@@ -13,15 +13,16 @@ example, by using nonce 1 for the first message, nonce 2 for the second
message, etc. Nonces are long enough that randomly generated nonces have
negligible risk of collision.
-This package is interoperable with NaCl: http://nacl.cr.yp.to/box.html.
+This package is interoperable with NaCl: https://nacl.cr.yp.to/box.html.
*/
package box // import "golang.org/x/crypto/nacl/box"
import (
+ "io"
+
"golang.org/x/crypto/curve25519"
"golang.org/x/crypto/nacl/secretbox"
"golang.org/x/crypto/salsa20/salsa"
- "io"
)
// Overhead is the number of bytes of overhead when boxing a message.
diff --git a/vendor/golang.org/x/crypto/nacl/secretbox/example_test.go b/vendor/golang.org/x/crypto/nacl/secretbox/example_test.go
new file mode 100644
index 000000000..b25e663a8
--- /dev/null
+++ b/vendor/golang.org/x/crypto/nacl/secretbox/example_test.go
@@ -0,0 +1,53 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package secretbox_test
+
+import (
+ "crypto/rand"
+ "encoding/hex"
+ "fmt"
+ "io"
+
+ "golang.org/x/crypto/nacl/secretbox"
+)
+
+func Example() {
+ // Load your secret key from a safe place and reuse it across multiple
+ // Seal calls. (Obviously don't use this example key for anything
+ // real.) If you want to convert a passphrase to a key, use a suitable
+ // package like bcrypt or scrypt.
+ secretKeyBytes, err := hex.DecodeString("6368616e676520746869732070617373776f726420746f206120736563726574")
+ if err != nil {
+ panic(err)
+ }
+
+ var secretKey [32]byte
+ copy(secretKey[:], secretKeyBytes)
+
+ // You must use a different nonce for each message you encrypt with the
+ // same key. Since the nonce here is 192 bits long, a random value
+ // provides a sufficiently small probability of repeats.
+ var nonce [24]byte
+ if _, err := io.ReadFull(rand.Reader, nonce[:]); err != nil {
+ panic(err)
+ }
+
+ // This encrypts "hello world" and appends the result to the nonce.
+ encrypted := secretbox.Seal(nonce[:], []byte("hello world"), &nonce, &secretKey)
+
+ // When you decrypt, you must use the same nonce and key you used to
+ // encrypt the message. One way to achieve this is to store the nonce
+ // alongside the encrypted message. Above, we stored the nonce in the first
+ // 24 bytes of the encrypted text.
+ var decryptNonce [24]byte
+ copy(decryptNonce[:], encrypted[:24])
+ decrypted, ok := secretbox.Open([]byte{}, encrypted[24:], &decryptNonce, &secretKey)
+ if !ok {
+ panic("decryption error")
+ }
+
+ fmt.Println(string(decrypted))
+ // Output: hello world
+}
diff --git a/vendor/golang.org/x/crypto/nacl/secretbox/secretbox.go b/vendor/golang.org/x/crypto/nacl/secretbox/secretbox.go
index dbf31bbf4..1e1dff506 100644
--- a/vendor/golang.org/x/crypto/nacl/secretbox/secretbox.go
+++ b/vendor/golang.org/x/crypto/nacl/secretbox/secretbox.go
@@ -13,7 +13,7 @@ example, by using nonce 1 for the first message, nonce 2 for the second
message, etc. Nonces are long enough that randomly generated nonces have
negligible risk of collision.
-This package is interoperable with NaCl: http://nacl.cr.yp.to/secretbox.html.
+This package is interoperable with NaCl: https://nacl.cr.yp.to/secretbox.html.
*/
package secretbox // import "golang.org/x/crypto/nacl/secretbox"
diff --git a/vendor/golang.org/x/crypto/ocsp/ocsp.go b/vendor/golang.org/x/crypto/ocsp/ocsp.go
index 6bfbd5da9..09367c0b7 100644
--- a/vendor/golang.org/x/crypto/ocsp/ocsp.go
+++ b/vendor/golang.org/x/crypto/ocsp/ocsp.go
@@ -30,11 +30,11 @@ var idPKIXOCSPBasic = asn1.ObjectIdentifier([]int{1, 3, 6, 1, 5, 5, 7, 48, 1, 1}
type ResponseStatus int
const (
- Success ResponseStatus = 0
- Malformed ResponseStatus = 1
- InternalError ResponseStatus = 2
- TryLater ResponseStatus = 3
- // Status code four is ununsed in OCSP. See
+ Success ResponseStatus = 0
+ Malformed ResponseStatus = 1
+ InternalError ResponseStatus = 2
+ TryLater ResponseStatus = 3
+ // Status code four is unused in OCSP. See
// https://tools.ietf.org/html/rfc6960#section-4.2.1
SignatureRequired ResponseStatus = 5
Unauthorized ResponseStatus = 6
@@ -114,7 +114,7 @@ type basicResponse struct {
type responseData struct {
Raw asn1.RawContent
- Version int `asn1:"optional,default:1,explicit,tag:0"`
+ Version int `asn1:"optional,default:0,explicit,tag:0"`
RawResponderName asn1.RawValue `asn1:"optional,explicit,tag:1"`
KeyHash []byte `asn1:"optional,explicit,tag:2"`
ProducedAt time.Time `asn1:"generalized"`
diff --git a/vendor/golang.org/x/crypto/openpgp/keys.go b/vendor/golang.org/x/crypto/openpgp/keys.go
index bfe326031..fd9bbd29b 100644
--- a/vendor/golang.org/x/crypto/openpgp/keys.go
+++ b/vendor/golang.org/x/crypto/openpgp/keys.go
@@ -504,6 +504,12 @@ func NewEntity(name, comment, email string, config *packet.Config) (*Entity, err
},
}
+ // If the user passes in a DefaultHash via packet.Config,
+ // set the PreferredHash for the SelfSignature.
+ if config != nil && config.DefaultHash != 0 {
+ e.Identities[uid.Id].SelfSignature.PreferredHash = []uint8{hashToHashId(config.DefaultHash)}
+ }
+
e.Subkeys = make([]Subkey, 1)
e.Subkeys[0] = Subkey{
PublicKey: packet.NewRSAPublicKey(currentTime, &encryptingPriv.PublicKey),
diff --git a/vendor/golang.org/x/crypto/openpgp/keys_test.go b/vendor/golang.org/x/crypto/openpgp/keys_test.go
index d5e2056bb..fbc8fc240 100644
--- a/vendor/golang.org/x/crypto/openpgp/keys_test.go
+++ b/vendor/golang.org/x/crypto/openpgp/keys_test.go
@@ -2,6 +2,7 @@ package openpgp
import (
"bytes"
+ "crypto"
"strings"
"testing"
"time"
@@ -271,6 +272,39 @@ func TestIdVerification(t *testing.T) {
}
}
+func TestNewEntityWithPreferredHash(t *testing.T) {
+ c := &packet.Config{
+ DefaultHash: crypto.SHA256,
+ }
+ entity, err := NewEntity("Golang Gopher", "Test Key", "no-reply@golang.com", c)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ for _, identity := range entity.Identities {
+ if len(identity.SelfSignature.PreferredHash) == 0 {
+ t.Fatal("didn't find a preferred hash in self signature")
+ }
+ ph := hashToHashId(c.DefaultHash)
+ if identity.SelfSignature.PreferredHash[0] != ph {
+ t.Fatalf("Expected preferred hash to be %d, got %d", ph, identity.SelfSignature.PreferredHash[0])
+ }
+ }
+}
+
+func TestNewEntityWithoutPreferredHash(t *testing.T) {
+ entity, err := NewEntity("Golang Gopher", "Test Key", "no-reply@golang.com", nil)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ for _, identity := range entity.Identities {
+ if len(identity.SelfSignature.PreferredHash) != 0 {
+ t.Fatal("Expected preferred hash to be empty but got length %d", len(identity.SelfSignature.PreferredHash))
+ }
+ }
+}
+
const expiringKeyHex = "988d0451d1ec5d010400ba3385721f2dc3f4ab096b2ee867ab77213f0a27a8538441c35d2fa225b08798a1439a66a5150e6bdc3f40f5d28d588c712394c632b6299f77db8c0d48d37903fb72ebd794d61be6aa774688839e5fdecfe06b2684cc115d240c98c66cb1ef22ae84e3aa0c2b0c28665c1e7d4d044e7f270706193f5223c8d44e0d70b7b8da830011010001b40f4578706972792074657374206b657988be041301020028050251d1ec5d021b03050900278d00060b090807030206150802090a0b0416020301021e01021780000a091072589ad75e237d8c033503fd10506d72837834eb7f994117740723adc39227104b0d326a1161871c0b415d25b4aedef946ca77ea4c05af9c22b32cf98be86ab890111fced1ee3f75e87b7cc3c00dc63bbc85dfab91c0dc2ad9de2c4d13a34659333a85c6acc1a669c5e1d6cecb0cf1e56c10e72d855ae177ddc9e766f9b2dda57ccbb75f57156438bbdb4e42b88d0451d1ec5d0104009c64906559866c5cb61578f5846a94fcee142a489c9b41e67b12bb54cfe86eb9bc8566460f9a720cb00d6526fbccfd4f552071a8e3f7744b1882d01036d811ee5a3fb91a1c568055758f43ba5d2c6a9676b012f3a1a89e47bbf624f1ad571b208f3cc6224eb378f1645dd3d47584463f9eadeacfd1ce6f813064fbfdcc4b5a53001101000188a504180102000f021b0c050251d1f06b050900093e89000a091072589ad75e237d8c20e00400ab8310a41461425b37889c4da28129b5fae6084fafbc0a47dd1adc74a264c6e9c9cc125f40462ee1433072a58384daef88c961c390ed06426a81b464a53194c4e291ddd7e2e2ba3efced01537d713bd111f48437bde2363446200995e8e0d4e528dda377fd1e8f8ede9c8e2198b393bd86852ce7457a7e3daf74d510461a5b77b88d0451d1ece8010400b3a519f83ab0010307e83bca895170acce8964a044190a2b368892f7a244758d9fc193482648acb1fb9780d28cc22d171931f38bb40279389fc9bf2110876d4f3db4fcfb13f22f7083877fe56592b3b65251312c36f83ffcb6d313c6a17f197dd471f0712aad15a8537b435a92471ba2e5b0c72a6c72536c3b567c558d7b6051001101000188a504180102000f021b0c050251d1f07b050900279091000a091072589ad75e237d8ce69e03fe286026afacf7c97ee20673864d4459a2240b5655219950643c7dba0ac384b1d4359c67805b21d98211f7b09c2a0ccf6410c8c04d4ff4a51293725d8d6570d9d8bb0e10c07d22357caeb49626df99c180be02d77d1fe8ed25e7a54481237646083a9f89a11566cd20b9e995b1487c5f9e02aeb434f3a1897cd416dd0a87861838da3e9e"
const subkeyUsageHex = "988d04533a52bc010400d26af43085558f65b9e7dbc90cb9238015259aed5e954637adcfa2181548b2d0b60c65f1f42ec5081cbf1bc0a8aa4900acfb77070837c58f26012fbce297d70afe96e759ad63531f0037538e70dbf8e384569b9720d99d8eb39d8d0a2947233ed242436cb6ac7dfe74123354b3d0119b5c235d3dd9c9d6c004f8ffaf67ad8583001101000188b7041f010200210502533b8552170c8001ce094aa433f7040bb2ddf0be3893cb843d0fe70c020700000a0910a42704b92866382aa98404009d63d916a27543da4221c60087c33f1c44bec9998c5438018ed370cca4962876c748e94b73eb39c58eb698063f3fd6346d58dd2a11c0247934c4a9d71f24754f7468f96fb24c3e791dd2392b62f626148ad724189498cbf993db2df7c0cdc2d677c35da0f16cb16c9ce7c33b4de65a4a91b1d21a130ae9cc26067718910ef8e2b417556d627261203c756d627261407379642e65642e61753e88b80413010200220502533a52bc021b03060b090807030206150802090a0b0416020301021e01021780000a0910a42704b92866382a47840400c0c2bd04f5fca586de408b395b3c280a278259c93eaaa8b79a53b97003f8ed502a8a00446dd9947fb462677e4fcac0dac2f0701847d15130aadb6cd9e0705ea0cf5f92f129136c7be21a718d46c8e641eb7f044f2adae573e11ae423a0a9ca51324f03a8a2f34b91fa40c3cc764bee4dccadedb54c768ba0469b683ea53f1c29b88d04533a52bc01040099c92a5d6f8b744224da27bc2369127c35269b58bec179de6bbc038f749344222f85a31933224f26b70243c4e4b2d242f0c4777eaef7b5502f9dad6d8bf3aaeb471210674b74de2d7078af497d55f5cdad97c7bedfbc1b41e8065a97c9c3d344b21fc81d27723af8e374bc595da26ea242dccb6ae497be26eea57e563ed517e90011010001889f0418010200090502533a52bc021b0c000a0910a42704b92866382afa1403ff70284c2de8a043ff51d8d29772602fa98009b7861c540535f874f2c230af8caf5638151a636b21f8255003997ccd29747fdd06777bb24f9593bd7d98a3e887689bf902f999915fcc94625ae487e5d13e6616f89090ebc4fdc7eb5cad8943e4056995bb61c6af37f8043016876a958ec7ebf39c43d20d53b7f546cfa83e8d2604b88d04533b8283010400c0b529316dbdf58b4c54461e7e669dc11c09eb7f73819f178ccd4177b9182b91d138605fcf1e463262fabefa73f94a52b5e15d1904635541c7ea540f07050ce0fb51b73e6f88644cec86e91107c957a114f69554548a85295d2b70bd0b203992f76eb5d493d86d9eabcaa7ef3fc7db7e458438db3fcdb0ca1cc97c638439a9170011010001889f0418010200090502533b8283021b0c000a0910a42704b92866382adc6d0400cfff6258485a21675adb7a811c3e19ebca18851533f75a7ba317950b9997fda8d1a4c8c76505c08c04b6c2cc31dc704d33da36a21273f2b388a1a706f7c3378b66d887197a525936ed9a69acb57fe7f718133da85ec742001c5d1864e9c6c8ea1b94f1c3759cebfd93b18606066c063a63be86085b7e37bdbc65f9a915bf084bb901a204533b85cd110400aed3d2c52af2b38b5b67904b0ef73d6dd7aef86adb770e2b153cd22489654dcc91730892087bb9856ae2d9f7ed1eb48f214243fe86bfe87b349ebd7c30e630e49c07b21fdabf78b7a95c8b7f969e97e3d33f2e074c63552ba64a2ded7badc05ce0ea2be6d53485f6900c7860c7aa76560376ce963d7271b9b54638a4028b573f00a0d8854bfcdb04986141568046202192263b9b67350400aaa1049dbc7943141ef590a70dcb028d730371d92ea4863de715f7f0f16d168bd3dc266c2450457d46dcbbf0b071547e5fbee7700a820c3750b236335d8d5848adb3c0da010e998908dfd93d961480084f3aea20b247034f8988eccb5546efaa35a92d0451df3aaf1aee5aa36a4c4d462c760ecd9cebcabfbe1412b1f21450f203fd126687cd486496e971a87fd9e1a8a765fe654baa219a6871ab97768596ab05c26c1aeea8f1a2c72395a58dbc12ef9640d2b95784e974a4d2d5a9b17c25fedacfe551bda52602de8f6d2e48443f5dd1a2a2a8e6a5e70ecdb88cd6e766ad9745c7ee91d78cc55c3d06536b49c3fee6c3d0b6ff0fb2bf13a314f57c953b8f4d93bf88e70418010200090502533b85cd021b0200520910a42704b92866382a47200419110200060502533b85cd000a091042ce2c64bc0ba99214b2009e26b26852c8b13b10c35768e40e78fbbb48bd084100a0c79d9ea0844fa5853dd3c85ff3ecae6f2c9dd6c557aa04008bbbc964cd65b9b8299d4ebf31f41cc7264b8cf33a00e82c5af022331fac79efc9563a822497ba012953cefe2629f1242fcdcb911dbb2315985bab060bfd58261ace3c654bdbbe2e8ed27a46e836490145c86dc7bae15c011f7e1ffc33730109b9338cd9f483e7cef3d2f396aab5bd80efb6646d7e778270ee99d934d187dd98"
const revokedKeyHex = "988d045331ce82010400c4fdf7b40a5477f206e6ee278eaef888ca73bf9128a9eef9f2f1ddb8b7b71a4c07cfa241f028a04edb405e4d916c61d6beabc333813dc7b484d2b3c52ee233c6a79b1eea4e9cc51596ba9cd5ac5aeb9df62d86ea051055b79d03f8a4fa9f38386f5bd17529138f3325d46801514ea9047977e0829ed728e68636802796801be10011010001889f04200102000905025331d0e3021d03000a0910a401d9f09a34f7c042aa040086631196405b7e6af71026b88e98012eab44aa9849f6ef3fa930c7c9f23deaedba9db1538830f8652fb7648ec3fcade8dbcbf9eaf428e83c6cbcc272201bfe2fbb90d41963397a7c0637a1a9d9448ce695d9790db2dc95433ad7be19eb3de72dacf1d6db82c3644c13eae2a3d072b99bb341debba012c5ce4006a7d34a1f4b94b444526567205265766f6b657220283c52656727732022424d204261726973746122204b657920262530305c303e5c29203c72656740626d626172697374612e636f2e61753e88b704130102002205025331ce82021b03060b090807030206150802090a0b0416020301021e01021780000a0910a401d9f09a34f7c0019c03f75edfbeb6a73e7225ad3cc52724e2872e04260d7daf0d693c170d8c4b243b8767bc7785763533febc62ec2600c30603c433c095453ede59ff2fcabeb84ce32e0ed9d5cf15ffcbc816202b64370d4d77c1e9077d74e94a16fb4fa2e5bec23a56d7a73cf275f91691ae1801a976fcde09e981a2f6327ac27ea1fecf3185df0d56889c04100102000605025331cfb5000a0910fe9645554e8266b64b4303fc084075396674fb6f778d302ac07cef6bc0b5d07b66b2004c44aef711cbac79617ef06d836b4957522d8772dd94bf41a2f4ac8b1ee6d70c57503f837445a74765a076d07b829b8111fc2a918423ddb817ead7ca2a613ef0bfb9c6b3562aec6c3cf3c75ef3031d81d95f6563e4cdcc9960bcb386c5d757b104fcca5fe11fc709df884604101102000605025331cfe7000a09107b15a67f0b3ddc0317f6009e360beea58f29c1d963a22b962b80788c3fa6c84e009d148cfde6b351469b8eae91187eff07ad9d08fcaab88d045331ce820104009f25e20a42b904f3fa555530fe5c46737cf7bd076c35a2a0d22b11f7e0b61a69320b768f4a80fe13980ce380d1cfc4a0cd8fbe2d2e2ef85416668b77208baa65bf973fe8e500e78cc310d7c8705cdb34328bf80e24f0385fce5845c33bc7943cf6b11b02348a23da0bf6428e57c05135f2dc6bd7c1ce325d666d5a5fd2fd5e410011010001889f04180102000905025331ce82021b0c000a0910a401d9f09a34f7c0418003fe34feafcbeaef348a800a0d908a7a6809cc7304017d820f70f0474d5e23cb17e38b67dc6dca282c6ca00961f4ec9edf2738d0f087b1d81e4871ef08e1798010863afb4eac4c44a376cb343be929c5be66a78cfd4456ae9ec6a99d97f4e1c3ff3583351db2147a65c0acef5c003fb544ab3a2e2dc4d43646f58b811a6c3a369d1f"
diff --git a/vendor/golang.org/x/crypto/openpgp/packet/signature.go b/vendor/golang.org/x/crypto/openpgp/packet/signature.go
index 4368f6b9e..3fc66db52 100644
--- a/vendor/golang.org/x/crypto/openpgp/packet/signature.go
+++ b/vendor/golang.org/x/crypto/openpgp/packet/signature.go
@@ -553,7 +553,7 @@ func (sig *Signature) Sign(h hash.Hash, priv *PrivateKey, config *Config) (err e
func (sig *Signature) SignUserId(id string, pub *PublicKey, priv *PrivateKey, config *Config) error {
h, err := userIdSignatureHash(id, pub, sig.Hash)
if err != nil {
- return nil
+ return err
}
return sig.Sign(h, priv, config)
}
diff --git a/vendor/golang.org/x/crypto/openpgp/packet/signature_test.go b/vendor/golang.org/x/crypto/openpgp/packet/signature_test.go
index c1bbde8b0..56e761179 100644
--- a/vendor/golang.org/x/crypto/openpgp/packet/signature_test.go
+++ b/vendor/golang.org/x/crypto/openpgp/packet/signature_test.go
@@ -39,4 +39,40 @@ func TestSignatureReserialize(t *testing.T) {
}
}
+func TestSignUserId(t *testing.T) {
+ sig := &Signature{
+ SigType: SigTypeGenericCert,
+ PubKeyAlgo: PubKeyAlgoRSA,
+ Hash: 0, // invalid hash function
+ }
+
+ packet, err := Read(readerFromHex(rsaPkDataHex))
+ if err != nil {
+ t.Fatalf("failed to deserialize public key: %v", err)
+ }
+ pubKey := packet.(*PublicKey)
+
+ packet, err = Read(readerFromHex(privKeyRSAHex))
+ if err != nil {
+ t.Fatalf("failed to deserialize private key: %v", err)
+ }
+ privKey := packet.(*PrivateKey)
+
+ err = sig.SignUserId("", pubKey, privKey, nil)
+ if err == nil {
+ t.Errorf("did not receive an error when expected")
+ }
+
+ sig.Hash = crypto.SHA256
+ err = privKey.Decrypt([]byte("testing"))
+ if err != nil {
+ t.Fatalf("failed to decrypt private key: %v", err)
+ }
+
+ err = sig.SignUserId("", pubKey, privKey, nil)
+ if err != nil {
+ t.Errorf("failed to sign user id: %v", err)
+ }
+}
+
const signatureDataHex = "c2c05c04000102000605024cb45112000a0910ab105c91af38fb158f8d07ff5596ea368c5efe015bed6e78348c0f033c931d5f2ce5db54ce7f2a7e4b4ad64db758d65a7a71773edeab7ba2a9e0908e6a94a1175edd86c1d843279f045b021a6971a72702fcbd650efc393c5474d5b59a15f96d2eaad4c4c426797e0dcca2803ef41c6ff234d403eec38f31d610c344c06f2401c262f0993b2e66cad8a81ebc4322c723e0d4ba09fe917e8777658307ad8329adacba821420741009dfe87f007759f0982275d028a392c6ed983a0d846f890b36148c7358bdb8a516007fac760261ecd06076813831a36d0459075d1befa245ae7f7fb103d92ca759e9498fe60ef8078a39a3beda510deea251ea9f0a7f0df6ef42060f20780360686f3e400e"
diff --git a/vendor/golang.org/x/crypto/openpgp/write.go b/vendor/golang.org/x/crypto/openpgp/write.go
index 15aaa1a01..65a304cc8 100644
--- a/vendor/golang.org/x/crypto/openpgp/write.go
+++ b/vendor/golang.org/x/crypto/openpgp/write.go
@@ -231,7 +231,7 @@ func Encrypt(ciphertext io.Writer, to []*Entity, signed *Entity, hints *FileHint
}
cipher := packet.CipherFunction(candidateCiphers[0])
- // If the cipher specifed by config is a candidate, we'll use that.
+ // If the cipher specified by config is a candidate, we'll use that.
configuredCipher := config.Cipher()
for _, c := range candidateCiphers {
cipherFunc := packet.CipherFunction(c)
diff --git a/vendor/golang.org/x/crypto/scrypt/scrypt.go b/vendor/golang.org/x/crypto/scrypt/scrypt.go
index dc0124b1f..7455395cf 100644
--- a/vendor/golang.org/x/crypto/scrypt/scrypt.go
+++ b/vendor/golang.org/x/crypto/scrypt/scrypt.go
@@ -218,7 +218,7 @@ func smix(b []byte, r, N int, v, xy []uint32) {
// For example, you can get a derived key for e.g. AES-256 (which needs a
// 32-byte key) by doing:
//
-// dk := scrypt.Key([]byte("some password"), salt, 16384, 8, 1, 32)
+// dk, err := scrypt.Key([]byte("some password"), salt, 16384, 8, 1, 32)
//
// The recommended parameters for interactive logins as of 2009 are N=16384,
// r=8, p=1. They should be increased as memory latency and CPU parallelism
diff --git a/vendor/golang.org/x/crypto/sha3/keccakf.go b/vendor/golang.org/x/crypto/sha3/keccakf.go
index 13e7058fa..46d03ed38 100644
--- a/vendor/golang.org/x/crypto/sha3/keccakf.go
+++ b/vendor/golang.org/x/crypto/sha3/keccakf.go
@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
+// +build !amd64 appengine gccgo
+
package sha3
// rc stores the round constants for use in the ι step.
diff --git a/vendor/golang.org/x/crypto/sha3/keccakf_amd64.go b/vendor/golang.org/x/crypto/sha3/keccakf_amd64.go
new file mode 100644
index 000000000..788679585
--- /dev/null
+++ b/vendor/golang.org/x/crypto/sha3/keccakf_amd64.go
@@ -0,0 +1,13 @@
+// Copyright 2015 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build amd64,!appengine,!gccgo
+
+package sha3
+
+// This function is implemented in keccakf_amd64.s.
+
+//go:noescape
+
+func keccakF1600(a *[25]uint64)
diff --git a/vendor/golang.org/x/crypto/sha3/keccakf_amd64.s b/vendor/golang.org/x/crypto/sha3/keccakf_amd64.s
new file mode 100644
index 000000000..a35335178
--- /dev/null
+++ b/vendor/golang.org/x/crypto/sha3/keccakf_amd64.s
@@ -0,0 +1,392 @@
+// Copyright 2015 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build amd64,!appengine,!gccgo
+
+// This code was translated into a form compatible with 6a from the public
+// domain sources at https://github.com/gvanas/KeccakCodePackage
+
+// Offsets in state
+#define _ba (0*8)
+#define _be (1*8)
+#define _bi (2*8)
+#define _bo (3*8)
+#define _bu (4*8)
+#define _ga (5*8)
+#define _ge (6*8)
+#define _gi (7*8)
+#define _go (8*8)
+#define _gu (9*8)
+#define _ka (10*8)
+#define _ke (11*8)
+#define _ki (12*8)
+#define _ko (13*8)
+#define _ku (14*8)
+#define _ma (15*8)
+#define _me (16*8)
+#define _mi (17*8)
+#define _mo (18*8)
+#define _mu (19*8)
+#define _sa (20*8)
+#define _se (21*8)
+#define _si (22*8)
+#define _so (23*8)
+#define _su (24*8)
+
+// Temporary registers
+#define rT1 AX
+
+// Round vars
+#define rpState DI
+#define rpStack SP
+
+#define rDa BX
+#define rDe CX
+#define rDi DX
+#define rDo R8
+#define rDu R9
+
+#define rBa R10
+#define rBe R11
+#define rBi R12
+#define rBo R13
+#define rBu R14
+
+#define rCa SI
+#define rCe BP
+#define rCi rBi
+#define rCo rBo
+#define rCu R15
+
+#define MOVQ_RBI_RCE MOVQ rBi, rCe
+#define XORQ_RT1_RCA XORQ rT1, rCa
+#define XORQ_RT1_RCE XORQ rT1, rCe
+#define XORQ_RBA_RCU XORQ rBa, rCu
+#define XORQ_RBE_RCU XORQ rBe, rCu
+#define XORQ_RDU_RCU XORQ rDu, rCu
+#define XORQ_RDA_RCA XORQ rDa, rCa
+#define XORQ_RDE_RCE XORQ rDe, rCe
+
+#define mKeccakRound(iState, oState, rc, B_RBI_RCE, G_RT1_RCA, G_RT1_RCE, G_RBA_RCU, K_RT1_RCA, K_RT1_RCE, K_RBA_RCU, M_RT1_RCA, M_RT1_RCE, M_RBE_RCU, S_RDU_RCU, S_RDA_RCA, S_RDE_RCE) \
+ /* Prepare round */ \
+ MOVQ rCe, rDa; \
+ ROLQ $1, rDa; \
+ \
+ MOVQ _bi(iState), rCi; \
+ XORQ _gi(iState), rDi; \
+ XORQ rCu, rDa; \
+ XORQ _ki(iState), rCi; \
+ XORQ _mi(iState), rDi; \
+ XORQ rDi, rCi; \
+ \
+ MOVQ rCi, rDe; \
+ ROLQ $1, rDe; \
+ \
+ MOVQ _bo(iState), rCo; \
+ XORQ _go(iState), rDo; \
+ XORQ rCa, rDe; \
+ XORQ _ko(iState), rCo; \
+ XORQ _mo(iState), rDo; \
+ XORQ rDo, rCo; \
+ \
+ MOVQ rCo, rDi; \
+ ROLQ $1, rDi; \
+ \
+ MOVQ rCu, rDo; \
+ XORQ rCe, rDi; \
+ ROLQ $1, rDo; \
+ \
+ MOVQ rCa, rDu; \
+ XORQ rCi, rDo; \
+ ROLQ $1, rDu; \
+ \
+ /* Result b */ \
+ MOVQ _ba(iState), rBa; \
+ MOVQ _ge(iState), rBe; \
+ XORQ rCo, rDu; \
+ MOVQ _ki(iState), rBi; \
+ MOVQ _mo(iState), rBo; \
+ MOVQ _su(iState), rBu; \
+ XORQ rDe, rBe; \
+ ROLQ $44, rBe; \
+ XORQ rDi, rBi; \
+ XORQ rDa, rBa; \
+ ROLQ $43, rBi; \
+ \
+ MOVQ rBe, rCa; \
+ MOVQ rc, rT1; \
+ ORQ rBi, rCa; \
+ XORQ rBa, rT1; \
+ XORQ rT1, rCa; \
+ MOVQ rCa, _ba(oState); \
+ \
+ XORQ rDu, rBu; \
+ ROLQ $14, rBu; \
+ MOVQ rBa, rCu; \
+ ANDQ rBe, rCu; \
+ XORQ rBu, rCu; \
+ MOVQ rCu, _bu(oState); \
+ \
+ XORQ rDo, rBo; \
+ ROLQ $21, rBo; \
+ MOVQ rBo, rT1; \
+ ANDQ rBu, rT1; \
+ XORQ rBi, rT1; \
+ MOVQ rT1, _bi(oState); \
+ \
+ NOTQ rBi; \
+ ORQ rBa, rBu; \
+ ORQ rBo, rBi; \
+ XORQ rBo, rBu; \
+ XORQ rBe, rBi; \
+ MOVQ rBu, _bo(oState); \
+ MOVQ rBi, _be(oState); \
+ B_RBI_RCE; \
+ \
+ /* Result g */ \
+ MOVQ _gu(iState), rBe; \
+ XORQ rDu, rBe; \
+ MOVQ _ka(iState), rBi; \
+ ROLQ $20, rBe; \
+ XORQ rDa, rBi; \
+ ROLQ $3, rBi; \
+ MOVQ _bo(iState), rBa; \
+ MOVQ rBe, rT1; \
+ ORQ rBi, rT1; \
+ XORQ rDo, rBa; \
+ MOVQ _me(iState), rBo; \
+ MOVQ _si(iState), rBu; \
+ ROLQ $28, rBa; \
+ XORQ rBa, rT1; \
+ MOVQ rT1, _ga(oState); \
+ G_RT1_RCA; \
+ \
+ XORQ rDe, rBo; \
+ ROLQ $45, rBo; \
+ MOVQ rBi, rT1; \
+ ANDQ rBo, rT1; \
+ XORQ rBe, rT1; \
+ MOVQ rT1, _ge(oState); \
+ G_RT1_RCE; \
+ \
+ XORQ rDi, rBu; \
+ ROLQ $61, rBu; \
+ MOVQ rBu, rT1; \
+ ORQ rBa, rT1; \
+ XORQ rBo, rT1; \
+ MOVQ rT1, _go(oState); \
+ \
+ ANDQ rBe, rBa; \
+ XORQ rBu, rBa; \
+ MOVQ rBa, _gu(oState); \
+ NOTQ rBu; \
+ G_RBA_RCU; \
+ \
+ ORQ rBu, rBo; \
+ XORQ rBi, rBo; \
+ MOVQ rBo, _gi(oState); \
+ \
+ /* Result k */ \
+ MOVQ _be(iState), rBa; \
+ MOVQ _gi(iState), rBe; \
+ MOVQ _ko(iState), rBi; \
+ MOVQ _mu(iState), rBo; \
+ MOVQ _sa(iState), rBu; \
+ XORQ rDi, rBe; \
+ ROLQ $6, rBe; \
+ XORQ rDo, rBi; \
+ ROLQ $25, rBi; \
+ MOVQ rBe, rT1; \
+ ORQ rBi, rT1; \
+ XORQ rDe, rBa; \
+ ROLQ $1, rBa; \
+ XORQ rBa, rT1; \
+ MOVQ rT1, _ka(oState); \
+ K_RT1_RCA; \
+ \
+ XORQ rDu, rBo; \
+ ROLQ $8, rBo; \
+ MOVQ rBi, rT1; \
+ ANDQ rBo, rT1; \
+ XORQ rBe, rT1; \
+ MOVQ rT1, _ke(oState); \
+ K_RT1_RCE; \
+ \
+ XORQ rDa, rBu; \
+ ROLQ $18, rBu; \
+ NOTQ rBo; \
+ MOVQ rBo, rT1; \
+ ANDQ rBu, rT1; \
+ XORQ rBi, rT1; \
+ MOVQ rT1, _ki(oState); \
+ \
+ MOVQ rBu, rT1; \
+ ORQ rBa, rT1; \
+ XORQ rBo, rT1; \
+ MOVQ rT1, _ko(oState); \
+ \
+ ANDQ rBe, rBa; \
+ XORQ rBu, rBa; \
+ MOVQ rBa, _ku(oState); \
+ K_RBA_RCU; \
+ \
+ /* Result m */ \
+ MOVQ _ga(iState), rBe; \
+ XORQ rDa, rBe; \
+ MOVQ _ke(iState), rBi; \
+ ROLQ $36, rBe; \
+ XORQ rDe, rBi; \
+ MOVQ _bu(iState), rBa; \
+ ROLQ $10, rBi; \
+ MOVQ rBe, rT1; \
+ MOVQ _mi(iState), rBo; \
+ ANDQ rBi, rT1; \
+ XORQ rDu, rBa; \
+ MOVQ _so(iState), rBu; \
+ ROLQ $27, rBa; \
+ XORQ rBa, rT1; \
+ MOVQ rT1, _ma(oState); \
+ M_RT1_RCA; \
+ \
+ XORQ rDi, rBo; \
+ ROLQ $15, rBo; \
+ MOVQ rBi, rT1; \
+ ORQ rBo, rT1; \
+ XORQ rBe, rT1; \
+ MOVQ rT1, _me(oState); \
+ M_RT1_RCE; \
+ \
+ XORQ rDo, rBu; \
+ ROLQ $56, rBu; \
+ NOTQ rBo; \
+ MOVQ rBo, rT1; \
+ ORQ rBu, rT1; \
+ XORQ rBi, rT1; \
+ MOVQ rT1, _mi(oState); \
+ \
+ ORQ rBa, rBe; \
+ XORQ rBu, rBe; \
+ MOVQ rBe, _mu(oState); \
+ \
+ ANDQ rBa, rBu; \
+ XORQ rBo, rBu; \
+ MOVQ rBu, _mo(oState); \
+ M_RBE_RCU; \
+ \
+ /* Result s */ \
+ MOVQ _bi(iState), rBa; \
+ MOVQ _go(iState), rBe; \
+ MOVQ _ku(iState), rBi; \
+ XORQ rDi, rBa; \
+ MOVQ _ma(iState), rBo; \
+ ROLQ $62, rBa; \
+ XORQ rDo, rBe; \
+ MOVQ _se(iState), rBu; \
+ ROLQ $55, rBe; \
+ \
+ XORQ rDu, rBi; \
+ MOVQ rBa, rDu; \
+ XORQ rDe, rBu; \
+ ROLQ $2, rBu; \
+ ANDQ rBe, rDu; \
+ XORQ rBu, rDu; \
+ MOVQ rDu, _su(oState); \
+ \
+ ROLQ $39, rBi; \
+ S_RDU_RCU; \
+ NOTQ rBe; \
+ XORQ rDa, rBo; \
+ MOVQ rBe, rDa; \
+ ANDQ rBi, rDa; \
+ XORQ rBa, rDa; \
+ MOVQ rDa, _sa(oState); \
+ S_RDA_RCA; \
+ \
+ ROLQ $41, rBo; \
+ MOVQ rBi, rDe; \
+ ORQ rBo, rDe; \
+ XORQ rBe, rDe; \
+ MOVQ rDe, _se(oState); \
+ S_RDE_RCE; \
+ \
+ MOVQ rBo, rDi; \
+ MOVQ rBu, rDo; \
+ ANDQ rBu, rDi; \
+ ORQ rBa, rDo; \
+ XORQ rBi, rDi; \
+ XORQ rBo, rDo; \
+ MOVQ rDi, _si(oState); \
+ MOVQ rDo, _so(oState) \
+
+// func keccakF1600(state *[25]uint64)
+TEXT ·keccakF1600(SB), 0, $200-8
+ MOVQ state+0(FP), rpState
+ SUBQ $(8*25), SP
+
+ // Convert the user state into an internal state
+ NOTQ _be(rpState)
+ NOTQ _bi(rpState)
+ NOTQ _go(rpState)
+ NOTQ _ki(rpState)
+ NOTQ _mi(rpState)
+ NOTQ _sa(rpState)
+
+ // Execute the KeccakF permutation
+ MOVQ _ba(rpState), rCa
+ MOVQ _be(rpState), rCe
+ MOVQ _bu(rpState), rCu
+
+ XORQ _ga(rpState), rCa
+ XORQ _ge(rpState), rCe
+ XORQ _gu(rpState), rCu
+
+ XORQ _ka(rpState), rCa
+ XORQ _ke(rpState), rCe
+ XORQ _ku(rpState), rCu
+
+ XORQ _ma(rpState), rCa
+ XORQ _me(rpState), rCe
+ XORQ _mu(rpState), rCu
+
+ XORQ _sa(rpState), rCa
+ XORQ _se(rpState), rCe
+ MOVQ _si(rpState), rDi
+ MOVQ _so(rpState), rDo
+ XORQ _su(rpState), rCu
+
+ mKeccakRound(rpState, rpStack, $0x0000000000000001, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)
+ mKeccakRound(rpStack, rpState, $0x0000000000008082, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)
+ mKeccakRound(rpState, rpStack, $0x800000000000808a, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)
+ mKeccakRound(rpStack, rpState, $0x8000000080008000, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)
+ mKeccakRound(rpState, rpStack, $0x000000000000808b, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)
+ mKeccakRound(rpStack, rpState, $0x0000000080000001, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)
+ mKeccakRound(rpState, rpStack, $0x8000000080008081, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)
+ mKeccakRound(rpStack, rpState, $0x8000000000008009, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)
+ mKeccakRound(rpState, rpStack, $0x000000000000008a, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)
+ mKeccakRound(rpStack, rpState, $0x0000000000000088, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)
+ mKeccakRound(rpState, rpStack, $0x0000000080008009, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)
+ mKeccakRound(rpStack, rpState, $0x000000008000000a, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)
+ mKeccakRound(rpState, rpStack, $0x000000008000808b, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)
+ mKeccakRound(rpStack, rpState, $0x800000000000008b, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)
+ mKeccakRound(rpState, rpStack, $0x8000000000008089, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)
+ mKeccakRound(rpStack, rpState, $0x8000000000008003, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)
+ mKeccakRound(rpState, rpStack, $0x8000000000008002, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)
+ mKeccakRound(rpStack, rpState, $0x8000000000000080, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)
+ mKeccakRound(rpState, rpStack, $0x000000000000800a, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)
+ mKeccakRound(rpStack, rpState, $0x800000008000000a, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)
+ mKeccakRound(rpState, rpStack, $0x8000000080008081, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)
+ mKeccakRound(rpStack, rpState, $0x8000000000008080, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)
+ mKeccakRound(rpState, rpStack, $0x0000000080000001, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)
+ mKeccakRound(rpStack, rpState, $0x8000000080008008, NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP)
+
+ // Revert the internal state to the user state
+ NOTQ _be(rpState)
+ NOTQ _bi(rpState)
+ NOTQ _go(rpState)
+ NOTQ _ki(rpState)
+ NOTQ _mi(rpState)
+ NOTQ _sa(rpState)
+
+ ADDQ $(8*25), SP
+ RET
diff --git a/vendor/golang.org/x/crypto/sha3/sha3.go b/vendor/golang.org/x/crypto/sha3/sha3.go
index c8fd31cb0..c86167c0b 100644
--- a/vendor/golang.org/x/crypto/sha3/sha3.go
+++ b/vendor/golang.org/x/crypto/sha3/sha3.go
@@ -42,7 +42,7 @@ type state struct {
storage [maxRate]byte
// Specific to SHA-3 and SHAKE.
- fixedOutput bool // whether this is a fixed-ouput-length instance
+ fixedOutput bool // whether this is a fixed-output-length instance
outputLen int // the default output size in bytes
state spongeDirection // whether the sponge is absorbing or squeezing
}
diff --git a/vendor/golang.org/x/crypto/ssh/agent/client.go b/vendor/golang.org/x/crypto/ssh/agent/client.go
index 3f798e719..ecfd7c58d 100644
--- a/vendor/golang.org/x/crypto/ssh/agent/client.go
+++ b/vendor/golang.org/x/crypto/ssh/agent/client.go
@@ -25,6 +25,7 @@ import (
"math/big"
"sync"
+ "golang.org/x/crypto/ed25519"
"golang.org/x/crypto/ssh"
)
@@ -423,6 +424,14 @@ type ecdsaKeyMsg struct {
Constraints []byte `ssh:"rest"`
}
+type ed25519KeyMsg struct {
+ Type string `sshtype:"17|25"`
+ Pub []byte
+ Priv []byte
+ Comments string
+ Constraints []byte `ssh:"rest"`
+}
+
// Insert adds a private key to the agent.
func (c *client) insertKey(s interface{}, comment string, constraints []byte) error {
var req []byte
@@ -464,6 +473,14 @@ func (c *client) insertKey(s interface{}, comment string, constraints []byte) er
Comments: comment,
Constraints: constraints,
})
+ case *ed25519.PrivateKey:
+ req = ssh.Marshal(ed25519KeyMsg{
+ Type: ssh.KeyAlgoED25519,
+ Pub: []byte(*k)[32:],
+ Priv: []byte(*k),
+ Comments: comment,
+ Constraints: constraints,
+ })
default:
return fmt.Errorf("agent: unsupported key type %T", s)
}
@@ -510,7 +527,16 @@ type ecdsaCertMsg struct {
Constraints []byte `ssh:"rest"`
}
-// Insert adds a private key to the agent. If a certificate is given,
+type ed25519CertMsg struct {
+ Type string `sshtype:"17|25"`
+ CertBytes []byte
+ Pub []byte
+ Priv []byte
+ Comments string
+ Constraints []byte `ssh:"rest"`
+}
+
+// Add adds a private key to the agent. If a certificate is given,
// that certificate is added instead as public key.
func (c *client) Add(key AddedKey) error {
var constraints []byte
@@ -554,17 +580,28 @@ func (c *client) insertCert(s interface{}, cert *ssh.Certificate, comment string
})
case *dsa.PrivateKey:
req = ssh.Marshal(dsaCertMsg{
- Type: cert.Type(),
- CertBytes: cert.Marshal(),
- X: k.X,
- Comments: comment,
+ Type: cert.Type(),
+ CertBytes: cert.Marshal(),
+ X: k.X,
+ Comments: comment,
+ Constraints: constraints,
})
case *ecdsa.PrivateKey:
req = ssh.Marshal(ecdsaCertMsg{
- Type: cert.Type(),
- CertBytes: cert.Marshal(),
- D: k.D,
- Comments: comment,
+ Type: cert.Type(),
+ CertBytes: cert.Marshal(),
+ D: k.D,
+ Comments: comment,
+ Constraints: constraints,
+ })
+ case *ed25519.PrivateKey:
+ req = ssh.Marshal(ed25519CertMsg{
+ Type: cert.Type(),
+ CertBytes: cert.Marshal(),
+ Pub: []byte(*k)[32:],
+ Priv: []byte(*k),
+ Comments: comment,
+ Constraints: constraints,
})
default:
return fmt.Errorf("agent: unsupported key type %T", s)
diff --git a/vendor/golang.org/x/crypto/ssh/agent/client_test.go b/vendor/golang.org/x/crypto/ssh/agent/client_test.go
index ec7198d54..230351fd2 100644
--- a/vendor/golang.org/x/crypto/ssh/agent/client_test.go
+++ b/vendor/golang.org/x/crypto/ssh/agent/client_test.go
@@ -14,6 +14,7 @@ import (
"path/filepath"
"strconv"
"testing"
+ "time"
"golang.org/x/crypto/ssh"
)
@@ -139,7 +140,7 @@ func testAgentInterface(t *testing.T, agent Agent, key interface{}, cert *ssh.Ce
}
func TestAgent(t *testing.T) {
- for _, keyType := range []string{"rsa", "dsa", "ecdsa"} {
+ for _, keyType := range []string{"rsa", "dsa", "ecdsa", "ed25519"} {
testAgent(t, testPrivateKeys[keyType], nil, 0)
}
}
@@ -285,3 +286,42 @@ func testLockAgent(agent Agent, t *testing.T) {
t.Errorf("Want 1 keys, got %v", keys)
}
}
+
+func TestAgentLifetime(t *testing.T) {
+ agent, _, cleanup := startAgent(t)
+ defer cleanup()
+
+ for _, keyType := range []string{"rsa", "dsa", "ecdsa"} {
+ // Add private keys to the agent.
+ err := agent.Add(AddedKey{
+ PrivateKey: testPrivateKeys[keyType],
+ Comment: "comment",
+ LifetimeSecs: 1,
+ })
+ if err != nil {
+ t.Fatalf("add: %v", err)
+ }
+ // Add certs to the agent.
+ cert := &ssh.Certificate{
+ Key: testPublicKeys[keyType],
+ ValidBefore: ssh.CertTimeInfinity,
+ CertType: ssh.UserCert,
+ }
+ cert.SignCert(rand.Reader, testSigners[keyType])
+ err = agent.Add(AddedKey{
+ PrivateKey: testPrivateKeys[keyType],
+ Certificate: cert,
+ Comment: "comment",
+ LifetimeSecs: 1,
+ })
+ if err != nil {
+ t.Fatalf("add: %v", err)
+ }
+ }
+ time.Sleep(1100 * time.Millisecond)
+ if keys, err := agent.List(); err != nil {
+ t.Errorf("List: %v", err)
+ } else if len(keys) != 0 {
+ t.Errorf("Want 0 keys, got %v", len(keys))
+ }
+}
diff --git a/vendor/golang.org/x/crypto/ssh/agent/server.go b/vendor/golang.org/x/crypto/ssh/agent/server.go
index c562fa6e8..68a333fa5 100644
--- a/vendor/golang.org/x/crypto/ssh/agent/server.go
+++ b/vendor/golang.org/x/crypto/ssh/agent/server.go
@@ -16,6 +16,7 @@ import (
"log"
"math/big"
+ "golang.org/x/crypto/ed25519"
"golang.org/x/crypto/ssh"
)
@@ -175,6 +176,15 @@ func parseRSAKey(req []byte) (*AddedKey, error) {
return &AddedKey{PrivateKey: priv, Comment: k.Comments}, nil
}
+func parseEd25519Key(req []byte) (*AddedKey, error) {
+ var k ed25519KeyMsg
+ if err := ssh.Unmarshal(req, &k); err != nil {
+ return nil, err
+ }
+ priv := ed25519.PrivateKey(k.Priv)
+ return &AddedKey{PrivateKey: &priv, Comment: k.Comments}, nil
+}
+
func parseDSAKey(req []byte) (*AddedKey, error) {
var k dsaKeyMsg
if err := ssh.Unmarshal(req, &k); err != nil {
@@ -219,6 +229,23 @@ func unmarshalECDSA(curveName string, keyBytes []byte, privScalar *big.Int) (pri
return priv, nil
}
+func parseEd25519Cert(req []byte) (*AddedKey, error) {
+ var k ed25519CertMsg
+ if err := ssh.Unmarshal(req, &k); err != nil {
+ return nil, err
+ }
+ pubKey, err := ssh.ParsePublicKey(k.CertBytes)
+ if err != nil {
+ return nil, err
+ }
+ priv := ed25519.PrivateKey(k.Priv)
+ cert, ok := pubKey.(*ssh.Certificate)
+ if !ok {
+ return nil, errors.New("agent: bad ED25519 certificate")
+ }
+ return &AddedKey{PrivateKey: &priv, Certificate: cert, Comment: k.Comments}, nil
+}
+
func parseECDSAKey(req []byte) (*AddedKey, error) {
var k ecdsaKeyMsg
if err := ssh.Unmarshal(req, &k); err != nil {
@@ -230,7 +257,7 @@ func parseECDSAKey(req []byte) (*AddedKey, error) {
return nil, err
}
- return &AddedKey{PrivateKey: &priv, Comment: k.Comments}, nil
+ return &AddedKey{PrivateKey: priv, Comment: k.Comments}, nil
}
func parseRSACert(req []byte) (*AddedKey, error) {
@@ -366,13 +393,17 @@ func (s *server) insertIdentity(req []byte) error {
case ssh.KeyAlgoDSA:
addedKey, err = parseDSAKey(req)
case ssh.KeyAlgoECDSA256, ssh.KeyAlgoECDSA384, ssh.KeyAlgoECDSA521:
- addedKey, err = parseECDSACert(req)
+ addedKey, err = parseECDSAKey(req)
+ case ssh.KeyAlgoED25519:
+ addedKey, err = parseEd25519Key(req)
case ssh.CertAlgoRSAv01:
addedKey, err = parseRSACert(req)
case ssh.CertAlgoDSAv01:
addedKey, err = parseDSACert(req)
case ssh.CertAlgoECDSA256v01, ssh.CertAlgoECDSA384v01, ssh.CertAlgoECDSA521v01:
addedKey, err = parseECDSACert(req)
+ case ssh.CertAlgoED25519v01:
+ addedKey, err = parseEd25519Cert(req)
default:
return fmt.Errorf("agent: not implemented: %q", record.Type)
}
diff --git a/vendor/golang.org/x/crypto/ssh/agent/server_test.go b/vendor/golang.org/x/crypto/ssh/agent/server_test.go
index c324d6c5a..ec9cdeeb5 100644
--- a/vendor/golang.org/x/crypto/ssh/agent/server_test.go
+++ b/vendor/golang.org/x/crypto/ssh/agent/server_test.go
@@ -150,7 +150,25 @@ func TestKeyTypes(t *testing.T) {
if err := addKeyToAgent(v); err != nil {
t.Errorf("error adding key type %s, %v", k, err)
}
+ if err := addCertToAgentSock(v, nil); err != nil {
+ t.Errorf("error adding key type %s, %v", k, err)
+ }
+ }
+}
+
+func addCertToAgentSock(key crypto.PrivateKey, cert *ssh.Certificate) error {
+ a, b, err := netPipe()
+ if err != nil {
+ return err
+ }
+ agentServer := NewKeyring()
+ go ServeAgent(agentServer, a)
+
+ agentClient := NewClient(b)
+ if err := agentClient.Add(AddedKey{PrivateKey: key, Certificate: cert}); err != nil {
+ return fmt.Errorf("add: %v", err)
}
+ return verifyKey(agentClient)
}
func addCertToAgent(key crypto.PrivateKey, cert *ssh.Certificate) error {
@@ -182,5 +200,8 @@ func TestCertTypes(t *testing.T) {
if err := addCertToAgent(testPrivateKeys[keyType], cert); err != nil {
t.Fatalf("%v", err)
}
+ if err := addCertToAgentSock(testPrivateKeys[keyType], cert); err != nil {
+ t.Fatalf("%v", err)
+ }
}
}
diff --git a/vendor/golang.org/x/crypto/ssh/agent/testdata_test.go b/vendor/golang.org/x/crypto/ssh/agent/testdata_test.go
index b7a8781e1..cc42a87cb 100644
--- a/vendor/golang.org/x/crypto/ssh/agent/testdata_test.go
+++ b/vendor/golang.org/x/crypto/ssh/agent/testdata_test.go
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
-// IMPLEMENTOR NOTE: To avoid a package loop, this file is in three places:
+// IMPLEMENTATION NOTE: To avoid a package loop, this file is in three places:
// ssh/, ssh/agent, and ssh/test/. It should be kept in sync across all three
// instances.
diff --git a/vendor/golang.org/x/crypto/ssh/channel.go b/vendor/golang.org/x/crypto/ssh/channel.go
index 6671c98c2..6d709b50b 100644
--- a/vendor/golang.org/x/crypto/ssh/channel.go
+++ b/vendor/golang.org/x/crypto/ssh/channel.go
@@ -67,6 +67,8 @@ type Channel interface {
// boolean, otherwise the return value will be false. Channel
// requests are out-of-band messages so they may be sent even
// if the data stream is closed or blocked by flow control.
+ // If the channel is closed before a reply is returned, io.EOF
+ // is returned.
SendRequest(name string, wantReply bool, payload []byte) (bool, error)
// Stderr returns an io.ReadWriter that writes to this channel
diff --git a/vendor/golang.org/x/crypto/ssh/cipher.go b/vendor/golang.org/x/crypto/ssh/cipher.go
index 2732963f3..34d3917c4 100644
--- a/vendor/golang.org/x/crypto/ssh/cipher.go
+++ b/vendor/golang.org/x/crypto/ssh/cipher.go
@@ -7,6 +7,7 @@ package ssh
import (
"crypto/aes"
"crypto/cipher"
+ "crypto/des"
"crypto/rc4"
"crypto/subtle"
"encoding/binary"
@@ -121,6 +122,9 @@ var cipherModes = map[string]*streamCipherMode{
// You should expect that an active attacker can recover plaintext if
// you do.
aes128cbcID: {16, aes.BlockSize, 0, nil},
+
+ // 3des-cbc is insecure and is disabled by default.
+ tripledescbcID: {24, des.BlockSize, 0, nil},
}
// prefixLen is the length of the packet prefix that contains the packet length
@@ -368,12 +372,7 @@ type cbcCipher struct {
oracleCamouflage uint32
}
-func newAESCBCCipher(iv, key, macKey []byte, algs directionAlgorithms) (packetCipher, error) {
- c, err := aes.NewCipher(key)
- if err != nil {
- return nil, err
- }
-
+func newCBCCipher(c cipher.Block, iv, key, macKey []byte, algs directionAlgorithms) (packetCipher, error) {
cbc := &cbcCipher{
mac: macModes[algs.MAC].new(macKey),
decrypter: cipher.NewCBCDecrypter(c, iv),
@@ -387,6 +386,34 @@ func newAESCBCCipher(iv, key, macKey []byte, algs directionAlgorithms) (packetCi
return cbc, nil
}
+func newAESCBCCipher(iv, key, macKey []byte, algs directionAlgorithms) (packetCipher, error) {
+ c, err := aes.NewCipher(key)
+ if err != nil {
+ return nil, err
+ }
+
+ cbc, err := newCBCCipher(c, iv, key, macKey, algs)
+ if err != nil {
+ return nil, err
+ }
+
+ return cbc, nil
+}
+
+func newTripleDESCBCCipher(iv, key, macKey []byte, algs directionAlgorithms) (packetCipher, error) {
+ c, err := des.NewTripleDESCipher(key)
+ if err != nil {
+ return nil, err
+ }
+
+ cbc, err := newCBCCipher(c, iv, key, macKey, algs)
+ if err != nil {
+ return nil, err
+ }
+
+ return cbc, nil
+}
+
func maxUInt32(a, b int) uint32 {
if a > b {
return uint32(a)
diff --git a/vendor/golang.org/x/crypto/ssh/cipher_test.go b/vendor/golang.org/x/crypto/ssh/cipher_test.go
index 54b92b6ed..eced8d851 100644
--- a/vendor/golang.org/x/crypto/ssh/cipher_test.go
+++ b/vendor/golang.org/x/crypto/ssh/cipher_test.go
@@ -21,7 +21,7 @@ func TestDefaultCiphersExist(t *testing.T) {
}
func TestPacketCiphers(t *testing.T) {
- // Still test aes128cbc cipher althought it's commented out.
+ // Still test aes128cbc cipher although it's commented out.
cipherModes[aes128cbcID] = &streamCipherMode{16, aes.BlockSize, 0, nil}
defer delete(cipherModes, aes128cbcID)
diff --git a/vendor/golang.org/x/crypto/ssh/client_auth.go b/vendor/golang.org/x/crypto/ssh/client_auth.go
index 6956ce451..294af0d48 100644
--- a/vendor/golang.org/x/crypto/ssh/client_auth.go
+++ b/vendor/golang.org/x/crypto/ssh/client_auth.go
@@ -437,3 +437,37 @@ func (cb KeyboardInteractiveChallenge) auth(session []byte, user string, c packe
}
}
}
+
+type retryableAuthMethod struct {
+ authMethod AuthMethod
+ maxTries int
+}
+
+func (r *retryableAuthMethod) auth(session []byte, user string, c packetConn, rand io.Reader) (ok bool, methods []string, err error) {
+ for i := 0; r.maxTries <= 0 || i < r.maxTries; i++ {
+ ok, methods, err = r.authMethod.auth(session, user, c, rand)
+ if ok || err != nil { // either success or error terminate
+ return ok, methods, err
+ }
+ }
+ return ok, methods, err
+}
+
+func (r *retryableAuthMethod) method() string {
+ return r.authMethod.method()
+}
+
+// RetryableAuthMethod is a decorator for other auth methods enabling them to
+// be retried up to maxTries before considering that AuthMethod itself failed.
+// If maxTries is <= 0, will retry indefinitely
+//
+// This is useful for interactive clients using challenge/response type
+// authentication (e.g. Keyboard-Interactive, Password, etc) where the user
+// could mistype their response resulting in the server issuing a
+// SSH_MSG_USERAUTH_FAILURE (rfc4252 #8 [password] and rfc4256 #3.4
+// [keyboard-interactive]); Without this decorator, the non-retryable
+// AuthMethod would be removed from future consideration, and never tried again
+// (and so the user would never be able to retry their entry).
+func RetryableAuthMethod(auth AuthMethod, maxTries int) AuthMethod {
+ return &retryableAuthMethod{authMethod: auth, maxTries: maxTries}
+}
diff --git a/vendor/golang.org/x/crypto/ssh/client_auth_test.go b/vendor/golang.org/x/crypto/ssh/client_auth_test.go
index 2ea44624f..55833e57d 100644
--- a/vendor/golang.org/x/crypto/ssh/client_auth_test.go
+++ b/vendor/golang.org/x/crypto/ssh/client_auth_test.go
@@ -9,6 +9,7 @@ import (
"crypto/rand"
"errors"
"fmt"
+ "os"
"strings"
"testing"
)
@@ -243,6 +244,9 @@ func TestClientUnsupportedCipher(t *testing.T) {
}
func TestClientUnsupportedKex(t *testing.T) {
+ if os.Getenv("GO_BUILDER_NAME") != "" {
+ t.Skip("skipping known-flaky test on the Go build dashboard; see golang.org/issue/15198")
+ }
config := &ClientConfig{
User: "testuser",
Auth: []AuthMethod{
@@ -296,7 +300,7 @@ func TestClientLoginCert(t *testing.T) {
t.Log("sign with wrong key")
cert.SignCert(rand.Reader, testSigners["dsa"])
if err := tryAuth(t, clientConfig); err == nil {
- t.Errorf("cert login passed with non-authoritive key")
+ t.Errorf("cert login passed with non-authoritative key")
}
t.Log("host cert")
@@ -391,3 +395,78 @@ func TestPermissionsPassing(t *testing.T) {
func TestNoPermissionsPassing(t *testing.T) {
testPermissionsPassing(false, t)
}
+
+func TestRetryableAuth(t *testing.T) {
+ n := 0
+ passwords := []string{"WRONG1", "WRONG2"}
+
+ config := &ClientConfig{
+ User: "testuser",
+ Auth: []AuthMethod{
+ RetryableAuthMethod(PasswordCallback(func() (string, error) {
+ p := passwords[n]
+ n++
+ return p, nil
+ }), 2),
+ PublicKeys(testSigners["rsa"]),
+ },
+ }
+
+ if err := tryAuth(t, config); err != nil {
+ t.Fatalf("unable to dial remote side: %s", err)
+ }
+ if n != 2 {
+ t.Fatalf("Did not try all passwords")
+ }
+}
+
+func ExampleRetryableAuthMethod(t *testing.T) {
+ user := "testuser"
+ NumberOfPrompts := 3
+
+ // Normally this would be a callback that prompts the user to answer the
+ // provided questions
+ Cb := func(user, instruction string, questions []string, echos []bool) (answers []string, err error) {
+ return []string{"answer1", "answer2"}, nil
+ }
+
+ config := &ClientConfig{
+ User: user,
+ Auth: []AuthMethod{
+ RetryableAuthMethod(KeyboardInteractiveChallenge(Cb), NumberOfPrompts),
+ },
+ }
+
+ if err := tryAuth(t, config); err != nil {
+ t.Fatalf("unable to dial remote side: %s", err)
+ }
+}
+
+// Test if username is received on server side when NoClientAuth is used
+func TestClientAuthNone(t *testing.T) {
+ user := "testuser"
+ serverConfig := &ServerConfig{
+ NoClientAuth: true,
+ }
+ serverConfig.AddHostKey(testSigners["rsa"])
+
+ clientConfig := &ClientConfig{
+ User: user,
+ }
+
+ c1, c2, err := netPipe()
+ if err != nil {
+ t.Fatalf("netPipe: %v", err)
+ }
+ defer c1.Close()
+ defer c2.Close()
+
+ go NewClientConn(c2, "", clientConfig)
+ serverConn, err := newServer(c1, serverConfig)
+ if err != nil {
+ t.Fatal("newServer: %v", err)
+ }
+ if serverConn.User() != user {
+ t.Fatalf("server: got %q, want %q", serverConn.User(), user)
+ }
+}
diff --git a/vendor/golang.org/x/crypto/ssh/common.go b/vendor/golang.org/x/crypto/ssh/common.go
index de029d6db..2c72ab544 100644
--- a/vendor/golang.org/x/crypto/ssh/common.go
+++ b/vendor/golang.org/x/crypto/ssh/common.go
@@ -44,7 +44,7 @@ var supportedKexAlgos = []string{
// of authenticating servers) in preference order.
var supportedHostKeyAlgos = []string{
CertAlgoRSAv01, CertAlgoDSAv01, CertAlgoECDSA256v01,
- CertAlgoECDSA384v01, CertAlgoECDSA521v01,
+ CertAlgoECDSA384v01, CertAlgoECDSA521v01, CertAlgoED25519v01,
KeyAlgoECDSA256, KeyAlgoECDSA384, KeyAlgoECDSA521,
KeyAlgoRSA, KeyAlgoDSA,
diff --git a/vendor/golang.org/x/crypto/ssh/connection.go b/vendor/golang.org/x/crypto/ssh/connection.go
index 979d919e8..e786f2f9a 100644
--- a/vendor/golang.org/x/crypto/ssh/connection.go
+++ b/vendor/golang.org/x/crypto/ssh/connection.go
@@ -23,7 +23,6 @@ func (e *OpenChannelError) Error() string {
// ConnMetadata holds metadata for the connection.
type ConnMetadata interface {
// User returns the user ID for this connection.
- // It is empty if no authentication is used.
User() string
// SessionID returns the sesson hash, also denoted by H.
diff --git a/vendor/golang.org/x/crypto/ssh/handshake.go b/vendor/golang.org/x/crypto/ssh/handshake.go
index 86e2755f9..37d42e47f 100644
--- a/vendor/golang.org/x/crypto/ssh/handshake.go
+++ b/vendor/golang.org/x/crypto/ssh/handshake.go
@@ -174,15 +174,7 @@ func (t *handshakeTransport) readOnePacket() ([]byte, error) {
t.mu.Lock()
- // By default, a key exchange is hidden from higher layers by
- // translating it into msgIgnore.
- successPacket := []byte{msgIgnore}
- if t.sessionID == nil {
- // sendKexInit() for the first kex waits for
- // msgNewKeys so the authentication process is
- // guaranteed to happen over an encrypted transport.
- successPacket = []byte{msgNewKeys}
- }
+ firstKex := t.sessionID == nil
err = t.enterKeyExchangeLocked(p)
if err != nil {
@@ -192,7 +184,7 @@ func (t *handshakeTransport) readOnePacket() ([]byte, error) {
}
if debugHandshake {
- log.Printf("%s exited key exchange, err %v", t.id(), err)
+ log.Printf("%s exited key exchange (first %v), err %v", t.id(), firstKex, err)
}
// Unblock writers.
@@ -207,6 +199,17 @@ func (t *handshakeTransport) readOnePacket() ([]byte, error) {
}
t.readSinceKex = 0
+
+ // By default, a key exchange is hidden from higher layers by
+ // translating it into msgIgnore.
+ successPacket := []byte{msgIgnore}
+ if firstKex {
+ // sendKexInit() for the first kex waits for
+ // msgNewKeys so the authentication process is
+ // guaranteed to happen over an encrypted transport.
+ successPacket = []byte{msgNewKeys}
+ }
+
return successPacket, nil
}
@@ -225,16 +228,15 @@ const (
// close the underlying transport. This function is safe for
// concurrent use by multiple goroutines.
func (t *handshakeTransport) sendKexInit(isFirst keyChangeCategory) error {
+ var err error
+
t.mu.Lock()
// If this is the initial key change, but we already have a sessionID,
// then do nothing because the key exchange has already completed
// asynchronously.
- if isFirst && t.sessionID != nil {
- t.mu.Unlock()
- return nil
+ if !isFirst || t.sessionID == nil {
+ _, _, err = t.sendKexInitLocked(isFirst)
}
-
- _, _, err := t.sendKexInitLocked(isFirst)
t.mu.Unlock()
if err != nil {
return err
@@ -369,7 +371,16 @@ func (t *handshakeTransport) enterKeyExchangeLocked(otherInitPacket []byte) erro
}
// We don't send FirstKexFollows, but we handle receiving it.
- if otherInit.FirstKexFollows && algs.kex != otherInit.KexAlgos[0] {
+ //
+ // RFC 4253 section 7 defines the kex and the agreement method for
+ // first_kex_packet_follows. It states that the guessed packet
+ // should be ignored if the "kex algorithm and/or the host
+ // key algorithm is guessed wrong (server and client have
+ // different preferred algorithm), or if any of the other
+ // algorithms cannot be agreed upon". The other algorithms have
+ // already been checked above so the kex algorithm and host key
+ // algorithm are checked here.
+ if otherInit.FirstKexFollows && (clientInit.KexAlgos[0] != serverInit.KexAlgos[0] || clientInit.ServerHostKeyAlgos[0] != serverInit.ServerHostKeyAlgos[0]) {
// other side sent a kex message for the wrong algorithm,
// which we have to ignore.
if _, err := t.conn.readPacket(); err != nil {
diff --git a/vendor/golang.org/x/crypto/ssh/keys.go b/vendor/golang.org/x/crypto/ssh/keys.go
index d6167e783..0324e1235 100644
--- a/vendor/golang.org/x/crypto/ssh/keys.go
+++ b/vendor/golang.org/x/crypto/ssh/keys.go
@@ -125,7 +125,7 @@ func ParseKnownHosts(in []byte) (marker string, hosts []string, pubKey PublicKey
continue
}
- // Strip out the begining of the known_host key.
+ // Strip out the beginning of the known_host key.
// This is either an optional marker or a (set of) hostname(s).
keyFields := bytes.Fields(in)
if len(keyFields) < 3 || len(keyFields) > 5 {
diff --git a/vendor/golang.org/x/crypto/ssh/server.go b/vendor/golang.org/x/crypto/ssh/server.go
index e73a1c1ae..37df1b302 100644
--- a/vendor/golang.org/x/crypto/ssh/server.go
+++ b/vendor/golang.org/x/crypto/ssh/server.go
@@ -284,7 +284,6 @@ userAuthLoop:
switch userAuthReq.Method {
case "none":
if config.NoClientAuth {
- s.user = ""
authErr = nil
}
case "password":
diff --git a/vendor/golang.org/x/crypto/ssh/session.go b/vendor/golang.org/x/crypto/ssh/session.go
index 09eb00919..17e2aa85c 100644
--- a/vendor/golang.org/x/crypto/ssh/session.go
+++ b/vendor/golang.org/x/crypto/ssh/session.go
@@ -9,6 +9,7 @@ package ssh
import (
"bytes"
+ "encoding/binary"
"errors"
"fmt"
"io"
@@ -281,9 +282,10 @@ func (s *Session) Start(cmd string) error {
// copying stdin, stdout, and stderr, and exits with a zero exit
// status.
//
-// If the command fails to run or doesn't complete successfully, the
-// error is of type *ExitError. Other error types may be
-// returned for I/O problems.
+// If the remote server does not send an exit status, an error of type
+// *ExitMissingError is returned. If the command completes
+// unsuccessfully or is interrupted by a signal, the error is of type
+// *ExitError. Other error types may be returned for I/O problems.
func (s *Session) Run(cmd string) error {
err := s.Start(cmd)
if err != nil {
@@ -370,9 +372,10 @@ func (s *Session) start() error {
// copying stdin, stdout, and stderr, and exits with a zero exit
// status.
//
-// If the command fails to run or doesn't complete successfully, the
-// error is of type *ExitError. Other error types may be
-// returned for I/O problems.
+// If the remote server does not send an exit status, an error of type
+// *ExitMissingError is returned. If the command completes
+// unsuccessfully or is interrupted by a signal, the error is of type
+// *ExitError. Other error types may be returned for I/O problems.
func (s *Session) Wait() error {
if !s.started {
return errors.New("ssh: session not started")
@@ -400,8 +403,7 @@ func (s *Session) wait(reqs <-chan *Request) error {
for msg := range reqs {
switch msg.Type {
case "exit-status":
- d := msg.Payload
- wm.status = int(d[0])<<24 | int(d[1])<<16 | int(d[2])<<8 | int(d[3])
+ wm.status = int(binary.BigEndian.Uint32(msg.Payload))
case "exit-signal":
var sigval struct {
Signal string
@@ -431,16 +433,29 @@ func (s *Session) wait(reqs <-chan *Request) error {
if wm.status == -1 {
// exit-status was never sent from server
if wm.signal == "" {
- return errors.New("wait: remote command exited without exit status or exit signal")
+ // signal was not sent either. RFC 4254
+ // section 6.10 recommends against this
+ // behavior, but it is allowed, so we let
+ // clients handle it.
+ return &ExitMissingError{}
}
wm.status = 128
if _, ok := signals[Signal(wm.signal)]; ok {
wm.status += signals[Signal(wm.signal)]
}
}
+
return &ExitError{wm}
}
+// ExitMissingError is returned if a session is torn down cleanly, but
+// the server sends no confirmation of the exit status.
+type ExitMissingError struct{}
+
+func (e *ExitMissingError) Error() string {
+ return "wait: remote command exited without exit status or exit signal"
+}
+
func (s *Session) stdin() {
if s.stdinpipe {
return
diff --git a/vendor/golang.org/x/crypto/ssh/session_test.go b/vendor/golang.org/x/crypto/ssh/session_test.go
index f7f0f7642..f35a378f2 100644
--- a/vendor/golang.org/x/crypto/ssh/session_test.go
+++ b/vendor/golang.org/x/crypto/ssh/session_test.go
@@ -297,7 +297,6 @@ func TestUnknownExitSignal(t *testing.T) {
}
}
-// Test WaitMsg is not returned if the channel closes abruptly.
func TestExitWithoutStatusOrSignal(t *testing.T) {
conn := dial(exitWithoutSignalOrStatus, t)
defer conn.Close()
@@ -313,11 +312,8 @@ func TestExitWithoutStatusOrSignal(t *testing.T) {
if err == nil {
t.Fatalf("expected command to fail but it didn't")
}
- _, ok := err.(*ExitError)
- if ok {
- // you can't actually test for errors.errorString
- // because it's not exported.
- t.Fatalf("expected *errorString but got %T", err)
+ if _, ok := err.(*ExitMissingError); !ok {
+ t.Fatalf("got %T want *ExitMissingError", err)
}
}
diff --git a/vendor/golang.org/x/crypto/ssh/terminal/util.go b/vendor/golang.org/x/crypto/ssh/terminal/util.go
index 598e3df77..c869213ec 100644
--- a/vendor/golang.org/x/crypto/ssh/terminal/util.go
+++ b/vendor/golang.org/x/crypto/ssh/terminal/util.go
@@ -44,8 +44,13 @@ func MakeRaw(fd int) (*State, error) {
}
newState := oldState.termios
- newState.Iflag &^= syscall.ISTRIP | syscall.INLCR | syscall.ICRNL | syscall.IGNCR | syscall.IXON | syscall.IXOFF
- newState.Lflag &^= syscall.ECHO | syscall.ICANON | syscall.ISIG
+ // This attempts to replicate the behaviour documented for cfmakeraw in
+ // the termios(3) manpage.
+ newState.Iflag &^= syscall.IGNBRK | syscall.BRKINT | syscall.PARMRK | syscall.ISTRIP | syscall.INLCR | syscall.IGNCR | syscall.ICRNL | syscall.IXON
+ newState.Oflag &^= syscall.OPOST
+ newState.Lflag &^= syscall.ECHO | syscall.ECHONL | syscall.ICANON | syscall.ISIG | syscall.IEXTEN
+ newState.Cflag &^= syscall.CSIZE | syscall.PARENB
+ newState.Cflag |= syscall.CS8
if _, _, err := syscall.Syscall6(syscall.SYS_IOCTL, uintptr(fd), ioctlWriteTermios, uintptr(unsafe.Pointer(&newState)), 0, 0, 0); err != 0 {
return nil, err
}
diff --git a/vendor/golang.org/x/crypto/ssh/test/session_test.go b/vendor/golang.org/x/crypto/ssh/test/session_test.go
index d27ade76b..fc7e4715b 100644
--- a/vendor/golang.org/x/crypto/ssh/test/session_test.go
+++ b/vendor/golang.org/x/crypto/ssh/test/session_test.go
@@ -280,16 +280,16 @@ func TestCiphers(t *testing.T) {
var config ssh.Config
config.SetDefaults()
cipherOrder := config.Ciphers
- // This cipher will not be tested when commented out in cipher.go it will
+ // These ciphers will not be tested when commented out in cipher.go it will
// fallback to the next available as per line 292.
- cipherOrder = append(cipherOrder, "aes128-cbc")
+ cipherOrder = append(cipherOrder, "aes128-cbc", "3des-cbc")
for _, ciph := range cipherOrder {
server := newServer(t)
defer server.Shutdown()
conf := clientConfig()
conf.Ciphers = []string{ciph}
- // Don't fail if sshd doesnt have the cipher.
+ // Don't fail if sshd doesn't have the cipher.
conf.Ciphers = append(conf.Ciphers, cipherOrder...)
conn, err := server.TryDial(conf)
if err == nil {
@@ -310,7 +310,7 @@ func TestMACs(t *testing.T) {
defer server.Shutdown()
conf := clientConfig()
conf.MACs = []string{mac}
- // Don't fail if sshd doesnt have the MAC.
+ // Don't fail if sshd doesn't have the MAC.
conf.MACs = append(conf.MACs, macOrder...)
if conn, err := server.TryDial(conf); err == nil {
conn.Close()
@@ -328,7 +328,7 @@ func TestKeyExchanges(t *testing.T) {
server := newServer(t)
defer server.Shutdown()
conf := clientConfig()
- // Don't fail if sshd doesnt have the kex.
+ // Don't fail if sshd doesn't have the kex.
conf.KeyExchanges = append([]string{kex}, kexOrder...)
conn, err := server.TryDial(conf)
if err == nil {
diff --git a/vendor/golang.org/x/crypto/ssh/test/testdata_test.go b/vendor/golang.org/x/crypto/ssh/test/testdata_test.go
index ae48c7516..a053f67ea 100644
--- a/vendor/golang.org/x/crypto/ssh/test/testdata_test.go
+++ b/vendor/golang.org/x/crypto/ssh/test/testdata_test.go
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
-// IMPLEMENTOR NOTE: To avoid a package loop, this file is in three places:
+// IMPLEMENTATION NOTE: To avoid a package loop, this file is in three places:
// ssh/, ssh/agent, and ssh/test/. It should be kept in sync across all three
// instances.
diff --git a/vendor/golang.org/x/crypto/ssh/testdata_test.go b/vendor/golang.org/x/crypto/ssh/testdata_test.go
index f2828c1b5..2da8c79dc 100644
--- a/vendor/golang.org/x/crypto/ssh/testdata_test.go
+++ b/vendor/golang.org/x/crypto/ssh/testdata_test.go
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
-// IMPLEMENTOR NOTE: To avoid a package loop, this file is in three places:
+// IMPLEMENTATION NOTE: To avoid a package loop, this file is in three places:
// ssh/, ssh/agent, and ssh/test/. It should be kept in sync across all three
// instances.
diff --git a/vendor/golang.org/x/crypto/ssh/transport.go b/vendor/golang.org/x/crypto/ssh/transport.go
index bf7dd61fc..62fba629e 100644
--- a/vendor/golang.org/x/crypto/ssh/transport.go
+++ b/vendor/golang.org/x/crypto/ssh/transport.go
@@ -11,8 +11,9 @@ import (
)
const (
- gcmCipherID = "aes128-gcm@openssh.com"
- aes128cbcID = "aes128-cbc"
+ gcmCipherID = "aes128-gcm@openssh.com"
+ aes128cbcID = "aes128-cbc"
+ tripledescbcID = "3des-cbc"
)
// packetConn represents a transport that implements packet based
@@ -219,6 +220,10 @@ func newPacketCipher(d direction, algs directionAlgorithms, kex *kexResult) (pac
return newAESCBCCipher(iv, key, macKey, algs)
}
+ if algs.Cipher == tripledescbcID {
+ return newTripleDESCBCCipher(iv, key, macKey, algs)
+ }
+
c := &streamPacketCipher{
mac: macModes[algs.MAC].new(macKey),
}
diff --git a/vendor/golang.org/x/image/colornames/gen.go b/vendor/golang.org/x/image/colornames/gen.go
index c03404cd7..d46e96862 100644
--- a/vendor/golang.org/x/image/colornames/gen.go
+++ b/vendor/golang.org/x/image/colornames/gen.go
@@ -143,8 +143,9 @@ func writeColorNames(w io.Writer, m map[string]color.RGBA) {
fmt.Fprintln(w, "// Map contains named colors defined in the SVG 1.1 spec.")
fmt.Fprintln(w, "var Map = map[string]color.RGBA{")
for _, k := range keys {
+ c := m[k]
fmt.Fprintf(w, "%q:color.RGBA{%#02x, %#02x, %#02x, %#02x}, // rgb(%d, %d, %d)\n",
- k, m[k].R, m[k].G, m[k].B, m[k].A, m[k].R, m[k].G, m[k].B)
+ k, c.R, c.G, c.B, c.A, c.R, c.G, c.B)
}
fmt.Fprintln(w, "}\n")
fmt.Fprintln(w, "// Names contains the color names defined in the SVG 1.1 spec.")
@@ -152,7 +153,16 @@ func writeColorNames(w io.Writer, m map[string]color.RGBA) {
for _, k := range keys {
fmt.Fprintf(w, "%q,\n", k)
}
- fmt.Fprintln(w, "}")
+ fmt.Fprintln(w, "}\n")
+ fmt.Fprintln(w, "var (")
+ for _, k := range keys {
+ c := m[k]
+ // Make the upper case version of k: "Darkred" instead of "darkred".
+ k = string(k[0]-0x20) + k[1:]
+ fmt.Fprintf(w, "%s=color.RGBA{%#02x, %#02x, %#02x, %#02x} // rgb(%d, %d, %d)\n",
+ k, c.R, c.G, c.B, c.A, c.R, c.G, c.B)
+ }
+ fmt.Fprintln(w, ")")
}
const url = "http://www.w3.org/TR/SVG/types.html"
diff --git a/vendor/golang.org/x/image/colornames/table.go b/vendor/golang.org/x/image/colornames/table.go
index 72ac9fe71..7b6f1f47a 100644
--- a/vendor/golang.org/x/image/colornames/table.go
+++ b/vendor/golang.org/x/image/colornames/table.go
@@ -305,3 +305,153 @@ var Names = []string{
"yellow",
"yellowgreen",
}
+
+var (
+ Aliceblue = color.RGBA{0xf0, 0xf8, 0xff, 0xff} // rgb(240, 248, 255)
+ Antiquewhite = color.RGBA{0xfa, 0xeb, 0xd7, 0xff} // rgb(250, 235, 215)
+ Aqua = color.RGBA{0x00, 0xff, 0xff, 0xff} // rgb(0, 255, 255)
+ Aquamarine = color.RGBA{0x7f, 0xff, 0xd4, 0xff} // rgb(127, 255, 212)
+ Azure = color.RGBA{0xf0, 0xff, 0xff, 0xff} // rgb(240, 255, 255)
+ Beige = color.RGBA{0xf5, 0xf5, 0xdc, 0xff} // rgb(245, 245, 220)
+ Bisque = color.RGBA{0xff, 0xe4, 0xc4, 0xff} // rgb(255, 228, 196)
+ Black = color.RGBA{0x00, 0x00, 0x00, 0xff} // rgb(0, 0, 0)
+ Blanchedalmond = color.RGBA{0xff, 0xeb, 0xcd, 0xff} // rgb(255, 235, 205)
+ Blue = color.RGBA{0x00, 0x00, 0xff, 0xff} // rgb(0, 0, 255)
+ Blueviolet = color.RGBA{0x8a, 0x2b, 0xe2, 0xff} // rgb(138, 43, 226)
+ Brown = color.RGBA{0xa5, 0x2a, 0x2a, 0xff} // rgb(165, 42, 42)
+ Burlywood = color.RGBA{0xde, 0xb8, 0x87, 0xff} // rgb(222, 184, 135)
+ Cadetblue = color.RGBA{0x5f, 0x9e, 0xa0, 0xff} // rgb(95, 158, 160)
+ Chartreuse = color.RGBA{0x7f, 0xff, 0x00, 0xff} // rgb(127, 255, 0)
+ Chocolate = color.RGBA{0xd2, 0x69, 0x1e, 0xff} // rgb(210, 105, 30)
+ Coral = color.RGBA{0xff, 0x7f, 0x50, 0xff} // rgb(255, 127, 80)
+ Cornflowerblue = color.RGBA{0x64, 0x95, 0xed, 0xff} // rgb(100, 149, 237)
+ Cornsilk = color.RGBA{0xff, 0xf8, 0xdc, 0xff} // rgb(255, 248, 220)
+ Crimson = color.RGBA{0xdc, 0x14, 0x3c, 0xff} // rgb(220, 20, 60)
+ Cyan = color.RGBA{0x00, 0xff, 0xff, 0xff} // rgb(0, 255, 255)
+ Darkblue = color.RGBA{0x00, 0x00, 0x8b, 0xff} // rgb(0, 0, 139)
+ Darkcyan = color.RGBA{0x00, 0x8b, 0x8b, 0xff} // rgb(0, 139, 139)
+ Darkgoldenrod = color.RGBA{0xb8, 0x86, 0x0b, 0xff} // rgb(184, 134, 11)
+ Darkgray = color.RGBA{0xa9, 0xa9, 0xa9, 0xff} // rgb(169, 169, 169)
+ Darkgreen = color.RGBA{0x00, 0x64, 0x00, 0xff} // rgb(0, 100, 0)
+ Darkgrey = color.RGBA{0xa9, 0xa9, 0xa9, 0xff} // rgb(169, 169, 169)
+ Darkkhaki = color.RGBA{0xbd, 0xb7, 0x6b, 0xff} // rgb(189, 183, 107)
+ Darkmagenta = color.RGBA{0x8b, 0x00, 0x8b, 0xff} // rgb(139, 0, 139)
+ Darkolivegreen = color.RGBA{0x55, 0x6b, 0x2f, 0xff} // rgb(85, 107, 47)
+ Darkorange = color.RGBA{0xff, 0x8c, 0x00, 0xff} // rgb(255, 140, 0)
+ Darkorchid = color.RGBA{0x99, 0x32, 0xcc, 0xff} // rgb(153, 50, 204)
+ Darkred = color.RGBA{0x8b, 0x00, 0x00, 0xff} // rgb(139, 0, 0)
+ Darksalmon = color.RGBA{0xe9, 0x96, 0x7a, 0xff} // rgb(233, 150, 122)
+ Darkseagreen = color.RGBA{0x8f, 0xbc, 0x8f, 0xff} // rgb(143, 188, 143)
+ Darkslateblue = color.RGBA{0x48, 0x3d, 0x8b, 0xff} // rgb(72, 61, 139)
+ Darkslategray = color.RGBA{0x2f, 0x4f, 0x4f, 0xff} // rgb(47, 79, 79)
+ Darkslategrey = color.RGBA{0x2f, 0x4f, 0x4f, 0xff} // rgb(47, 79, 79)
+ Darkturquoise = color.RGBA{0x00, 0xce, 0xd1, 0xff} // rgb(0, 206, 209)
+ Darkviolet = color.RGBA{0x94, 0x00, 0xd3, 0xff} // rgb(148, 0, 211)
+ Deeppink = color.RGBA{0xff, 0x14, 0x93, 0xff} // rgb(255, 20, 147)
+ Deepskyblue = color.RGBA{0x00, 0xbf, 0xff, 0xff} // rgb(0, 191, 255)
+ Dimgray = color.RGBA{0x69, 0x69, 0x69, 0xff} // rgb(105, 105, 105)
+ Dimgrey = color.RGBA{0x69, 0x69, 0x69, 0xff} // rgb(105, 105, 105)
+ Dodgerblue = color.RGBA{0x1e, 0x90, 0xff, 0xff} // rgb(30, 144, 255)
+ Firebrick = color.RGBA{0xb2, 0x22, 0x22, 0xff} // rgb(178, 34, 34)
+ Floralwhite = color.RGBA{0xff, 0xfa, 0xf0, 0xff} // rgb(255, 250, 240)
+ Forestgreen = color.RGBA{0x22, 0x8b, 0x22, 0xff} // rgb(34, 139, 34)
+ Fuchsia = color.RGBA{0xff, 0x00, 0xff, 0xff} // rgb(255, 0, 255)
+ Gainsboro = color.RGBA{0xdc, 0xdc, 0xdc, 0xff} // rgb(220, 220, 220)
+ Ghostwhite = color.RGBA{0xf8, 0xf8, 0xff, 0xff} // rgb(248, 248, 255)
+ Gold = color.RGBA{0xff, 0xd7, 0x00, 0xff} // rgb(255, 215, 0)
+ Goldenrod = color.RGBA{0xda, 0xa5, 0x20, 0xff} // rgb(218, 165, 32)
+ Gray = color.RGBA{0x80, 0x80, 0x80, 0xff} // rgb(128, 128, 128)
+ Green = color.RGBA{0x00, 0x80, 0x00, 0xff} // rgb(0, 128, 0)
+ Greenyellow = color.RGBA{0xad, 0xff, 0x2f, 0xff} // rgb(173, 255, 47)
+ Grey = color.RGBA{0x80, 0x80, 0x80, 0xff} // rgb(128, 128, 128)
+ Honeydew = color.RGBA{0xf0, 0xff, 0xf0, 0xff} // rgb(240, 255, 240)
+ Hotpink = color.RGBA{0xff, 0x69, 0xb4, 0xff} // rgb(255, 105, 180)
+ Indianred = color.RGBA{0xcd, 0x5c, 0x5c, 0xff} // rgb(205, 92, 92)
+ Indigo = color.RGBA{0x4b, 0x00, 0x82, 0xff} // rgb(75, 0, 130)
+ Ivory = color.RGBA{0xff, 0xff, 0xf0, 0xff} // rgb(255, 255, 240)
+ Khaki = color.RGBA{0xf0, 0xe6, 0x8c, 0xff} // rgb(240, 230, 140)
+ Lavender = color.RGBA{0xe6, 0xe6, 0xfa, 0xff} // rgb(230, 230, 250)
+ Lavenderblush = color.RGBA{0xff, 0xf0, 0xf5, 0xff} // rgb(255, 240, 245)
+ Lawngreen = color.RGBA{0x7c, 0xfc, 0x00, 0xff} // rgb(124, 252, 0)
+ Lemonchiffon = color.RGBA{0xff, 0xfa, 0xcd, 0xff} // rgb(255, 250, 205)
+ Lightblue = color.RGBA{0xad, 0xd8, 0xe6, 0xff} // rgb(173, 216, 230)
+ Lightcoral = color.RGBA{0xf0, 0x80, 0x80, 0xff} // rgb(240, 128, 128)
+ Lightcyan = color.RGBA{0xe0, 0xff, 0xff, 0xff} // rgb(224, 255, 255)
+ Lightgoldenrodyellow = color.RGBA{0xfa, 0xfa, 0xd2, 0xff} // rgb(250, 250, 210)
+ Lightgray = color.RGBA{0xd3, 0xd3, 0xd3, 0xff} // rgb(211, 211, 211)
+ Lightgreen = color.RGBA{0x90, 0xee, 0x90, 0xff} // rgb(144, 238, 144)
+ Lightgrey = color.RGBA{0xd3, 0xd3, 0xd3, 0xff} // rgb(211, 211, 211)
+ Lightpink = color.RGBA{0xff, 0xb6, 0xc1, 0xff} // rgb(255, 182, 193)
+ Lightsalmon = color.RGBA{0xff, 0xa0, 0x7a, 0xff} // rgb(255, 160, 122)
+ Lightseagreen = color.RGBA{0x20, 0xb2, 0xaa, 0xff} // rgb(32, 178, 170)
+ Lightskyblue = color.RGBA{0x87, 0xce, 0xfa, 0xff} // rgb(135, 206, 250)
+ Lightslategray = color.RGBA{0x77, 0x88, 0x99, 0xff} // rgb(119, 136, 153)
+ Lightslategrey = color.RGBA{0x77, 0x88, 0x99, 0xff} // rgb(119, 136, 153)
+ Lightsteelblue = color.RGBA{0xb0, 0xc4, 0xde, 0xff} // rgb(176, 196, 222)
+ Lightyellow = color.RGBA{0xff, 0xff, 0xe0, 0xff} // rgb(255, 255, 224)
+ Lime = color.RGBA{0x00, 0xff, 0x00, 0xff} // rgb(0, 255, 0)
+ Limegreen = color.RGBA{0x32, 0xcd, 0x32, 0xff} // rgb(50, 205, 50)
+ Linen = color.RGBA{0xfa, 0xf0, 0xe6, 0xff} // rgb(250, 240, 230)
+ Magenta = color.RGBA{0xff, 0x00, 0xff, 0xff} // rgb(255, 0, 255)
+ Maroon = color.RGBA{0x80, 0x00, 0x00, 0xff} // rgb(128, 0, 0)
+ Mediumaquamarine = color.RGBA{0x66, 0xcd, 0xaa, 0xff} // rgb(102, 205, 170)
+ Mediumblue = color.RGBA{0x00, 0x00, 0xcd, 0xff} // rgb(0, 0, 205)
+ Mediumorchid = color.RGBA{0xba, 0x55, 0xd3, 0xff} // rgb(186, 85, 211)
+ Mediumpurple = color.RGBA{0x93, 0x70, 0xdb, 0xff} // rgb(147, 112, 219)
+ Mediumseagreen = color.RGBA{0x3c, 0xb3, 0x71, 0xff} // rgb(60, 179, 113)
+ Mediumslateblue = color.RGBA{0x7b, 0x68, 0xee, 0xff} // rgb(123, 104, 238)
+ Mediumspringgreen = color.RGBA{0x00, 0xfa, 0x9a, 0xff} // rgb(0, 250, 154)
+ Mediumturquoise = color.RGBA{0x48, 0xd1, 0xcc, 0xff} // rgb(72, 209, 204)
+ Mediumvioletred = color.RGBA{0xc7, 0x15, 0x85, 0xff} // rgb(199, 21, 133)
+ Midnightblue = color.RGBA{0x19, 0x19, 0x70, 0xff} // rgb(25, 25, 112)
+ Mintcream = color.RGBA{0xf5, 0xff, 0xfa, 0xff} // rgb(245, 255, 250)
+ Mistyrose = color.RGBA{0xff, 0xe4, 0xe1, 0xff} // rgb(255, 228, 225)
+ Moccasin = color.RGBA{0xff, 0xe4, 0xb5, 0xff} // rgb(255, 228, 181)
+ Navajowhite = color.RGBA{0xff, 0xde, 0xad, 0xff} // rgb(255, 222, 173)
+ Navy = color.RGBA{0x00, 0x00, 0x80, 0xff} // rgb(0, 0, 128)
+ Oldlace = color.RGBA{0xfd, 0xf5, 0xe6, 0xff} // rgb(253, 245, 230)
+ Olive = color.RGBA{0x80, 0x80, 0x00, 0xff} // rgb(128, 128, 0)
+ Olivedrab = color.RGBA{0x6b, 0x8e, 0x23, 0xff} // rgb(107, 142, 35)
+ Orange = color.RGBA{0xff, 0xa5, 0x00, 0xff} // rgb(255, 165, 0)
+ Orangered = color.RGBA{0xff, 0x45, 0x00, 0xff} // rgb(255, 69, 0)
+ Orchid = color.RGBA{0xda, 0x70, 0xd6, 0xff} // rgb(218, 112, 214)
+ Palegoldenrod = color.RGBA{0xee, 0xe8, 0xaa, 0xff} // rgb(238, 232, 170)
+ Palegreen = color.RGBA{0x98, 0xfb, 0x98, 0xff} // rgb(152, 251, 152)
+ Paleturquoise = color.RGBA{0xaf, 0xee, 0xee, 0xff} // rgb(175, 238, 238)
+ Palevioletred = color.RGBA{0xdb, 0x70, 0x93, 0xff} // rgb(219, 112, 147)
+ Papayawhip = color.RGBA{0xff, 0xef, 0xd5, 0xff} // rgb(255, 239, 213)
+ Peachpuff = color.RGBA{0xff, 0xda, 0xb9, 0xff} // rgb(255, 218, 185)
+ Peru = color.RGBA{0xcd, 0x85, 0x3f, 0xff} // rgb(205, 133, 63)
+ Pink = color.RGBA{0xff, 0xc0, 0xcb, 0xff} // rgb(255, 192, 203)
+ Plum = color.RGBA{0xdd, 0xa0, 0xdd, 0xff} // rgb(221, 160, 221)
+ Powderblue = color.RGBA{0xb0, 0xe0, 0xe6, 0xff} // rgb(176, 224, 230)
+ Purple = color.RGBA{0x80, 0x00, 0x80, 0xff} // rgb(128, 0, 128)
+ Red = color.RGBA{0xff, 0x00, 0x00, 0xff} // rgb(255, 0, 0)
+ Rosybrown = color.RGBA{0xbc, 0x8f, 0x8f, 0xff} // rgb(188, 143, 143)
+ Royalblue = color.RGBA{0x41, 0x69, 0xe1, 0xff} // rgb(65, 105, 225)
+ Saddlebrown = color.RGBA{0x8b, 0x45, 0x13, 0xff} // rgb(139, 69, 19)
+ Salmon = color.RGBA{0xfa, 0x80, 0x72, 0xff} // rgb(250, 128, 114)
+ Sandybrown = color.RGBA{0xf4, 0xa4, 0x60, 0xff} // rgb(244, 164, 96)
+ Seagreen = color.RGBA{0x2e, 0x8b, 0x57, 0xff} // rgb(46, 139, 87)
+ Seashell = color.RGBA{0xff, 0xf5, 0xee, 0xff} // rgb(255, 245, 238)
+ Sienna = color.RGBA{0xa0, 0x52, 0x2d, 0xff} // rgb(160, 82, 45)
+ Silver = color.RGBA{0xc0, 0xc0, 0xc0, 0xff} // rgb(192, 192, 192)
+ Skyblue = color.RGBA{0x87, 0xce, 0xeb, 0xff} // rgb(135, 206, 235)
+ Slateblue = color.RGBA{0x6a, 0x5a, 0xcd, 0xff} // rgb(106, 90, 205)
+ Slategray = color.RGBA{0x70, 0x80, 0x90, 0xff} // rgb(112, 128, 144)
+ Slategrey = color.RGBA{0x70, 0x80, 0x90, 0xff} // rgb(112, 128, 144)
+ Snow = color.RGBA{0xff, 0xfa, 0xfa, 0xff} // rgb(255, 250, 250)
+ Springgreen = color.RGBA{0x00, 0xff, 0x7f, 0xff} // rgb(0, 255, 127)
+ Steelblue = color.RGBA{0x46, 0x82, 0xb4, 0xff} // rgb(70, 130, 180)
+ Tan = color.RGBA{0xd2, 0xb4, 0x8c, 0xff} // rgb(210, 180, 140)
+ Teal = color.RGBA{0x00, 0x80, 0x80, 0xff} // rgb(0, 128, 128)
+ Thistle = color.RGBA{0xd8, 0xbf, 0xd8, 0xff} // rgb(216, 191, 216)
+ Tomato = color.RGBA{0xff, 0x63, 0x47, 0xff} // rgb(255, 99, 71)
+ Turquoise = color.RGBA{0x40, 0xe0, 0xd0, 0xff} // rgb(64, 224, 208)
+ Violet = color.RGBA{0xee, 0x82, 0xee, 0xff} // rgb(238, 130, 238)
+ Wheat = color.RGBA{0xf5, 0xde, 0xb3, 0xff} // rgb(245, 222, 179)
+ White = color.RGBA{0xff, 0xff, 0xff, 0xff} // rgb(255, 255, 255)
+ Whitesmoke = color.RGBA{0xf5, 0xf5, 0xf5, 0xff} // rgb(245, 245, 245)
+ Yellow = color.RGBA{0xff, 0xff, 0x00, 0xff} // rgb(255, 255, 0)
+ Yellowgreen = color.RGBA{0x9a, 0xcd, 0x32, 0xff} // rgb(154, 205, 50)
+)
diff --git a/vendor/golang.org/x/image/font/basicfont/basicfont.go b/vendor/golang.org/x/image/font/basicfont/basicfont.go
index c6b2b68c4..1acc79f8f 100644
--- a/vendor/golang.org/x/image/font/basicfont/basicfont.go
+++ b/vendor/golang.org/x/image/font/basicfont/basicfont.go
@@ -19,8 +19,8 @@ import (
// exclusive on the high end.
//
// If Low <= r && r < High, then the rune r is mapped to the sub-image of
-// Face.Mask whose bounds are image.Rect(0, y, Face.Width, y+Face.Height),
-// where y equals (int(r-Low) + Offset) * Face.Height.
+// Face.Mask whose bounds are image.Rect(0, y*h, Face.Width, (y+1)*h),
+// where y = (int(r-Low) + Offset) and h = (Face.Ascent + Face.Descent).
type Range struct {
Low, High rune
Offset int
@@ -38,6 +38,7 @@ var Face7x13 = &Face{
Width: 6,
Height: 13,
Ascent: 11,
+ Descent: 2,
Mask: mask7x13,
Ranges: []Range{
{'\u0020', '\u007f', 0},
@@ -53,12 +54,15 @@ type Face struct {
Advance int
// Width is the glyph width, in pixels.
Width int
- // Height is the glyph height, in pixels.
+ // Height is the inter-line height, in pixels.
Height int
// Ascent is the glyph ascent, in pixels.
Ascent int
-
- // TODO: do we also need Top and Left fields?
+ // Descent is the glyph descent, in pixels.
+ Descent int
+ // Left is the left side bearing, in pixels. A positive value means that
+ // all of a glyph is to the right of the dot.
+ Left int
// Mask contains all of the glyph masks. Its width is typically the Face's
// Width, and its height a multiple of the Face's Height.
@@ -75,7 +79,7 @@ func (f *Face) Metrics() font.Metrics {
return font.Metrics{
Height: fixed.I(f.Height),
Ascent: fixed.I(f.Ascent),
- Descent: fixed.I(f.Height - f.Ascent),
+ Descent: fixed.I(f.Descent),
}
}
@@ -88,7 +92,7 @@ loop:
if rr < rng.Low || rng.High <= rr {
continue
}
- maskp.Y = (int(rr-rng.Low) + rng.Offset) * f.Height
+ maskp.Y = (int(rr-rng.Low) + rng.Offset) * (f.Ascent + f.Descent)
ok = true
break loop
}
@@ -97,16 +101,16 @@ loop:
return image.Rectangle{}, nil, image.Point{}, 0, false
}
- minX := int(dot.X+32) >> 6
- minY := int(dot.Y+32)>>6 - f.Ascent
+ x := int(dot.X+32)>>6 + f.Left
+ y := int(dot.Y+32) >> 6
dr = image.Rectangle{
Min: image.Point{
- X: minX,
- Y: minY,
+ X: x,
+ Y: y - f.Ascent,
},
Max: image.Point{
- X: minX + f.Width,
- Y: minY + f.Height,
+ X: x + f.Width,
+ Y: y + f.Descent,
},
}
@@ -114,7 +118,7 @@ loop:
}
func (f *Face) GlyphBounds(r rune) (bounds fixed.Rectangle26_6, advance fixed.Int26_6, ok bool) {
- return fixed.R(0, -f.Ascent, f.Width, -f.Ascent+f.Height), fixed.I(f.Advance), true
+ return fixed.R(0, -f.Ascent, f.Width, +f.Descent), fixed.I(f.Advance), true
}
func (f *Face) GlyphAdvance(r rune) (advance fixed.Int26_6, ok bool) {
diff --git a/vendor/golang.org/x/image/font/font.go b/vendor/golang.org/x/image/font/font.go
index a089e7798..a0a66d29f 100644
--- a/vendor/golang.org/x/image/font/font.go
+++ b/vendor/golang.org/x/image/font/font.go
@@ -13,6 +13,7 @@ import (
"image"
"image/draw"
"io"
+ "unicode/utf8"
"golang.org/x/image/math/fixed"
)
@@ -87,9 +88,6 @@ type Metrics struct {
Descent fixed.Int26_6
}
-// TODO: Drawer.Layout or Drawer.Measure methods to measure text without
-// drawing?
-
// Drawer draws text on a destination image.
//
// A Drawer is not safe for concurrent use by multiple goroutines, since its
@@ -115,19 +113,45 @@ type Drawer struct {
// TODO: should DrawString return the last rune drawn, so the next DrawString
// call can kern beforehand? Or should that be the responsibility of the caller
// if they really want to do that, since they have to explicitly shift d.Dot
-// anyway?
+// anyway? What if ligatures span more than two runes? What if grapheme
+// clusters span multiple runes?
+//
+// TODO: do we assume that the input is in any particular Unicode Normalization
+// Form?
//
-// In general, we'd have a DrawBytes([]byte) and DrawRuneReader(io.RuneReader)
-// and the last case can't assume that you can rewind the stream.
+// TODO: have DrawRunes(s []rune)? DrawRuneReader(io.RuneReader)?? If we take
+// io.RuneReader, we can't assume that we can rewind the stream.
//
// TODO: how does this work with line breaking: drawing text up until a
// vertical line? Should DrawString return the number of runes drawn?
+// DrawBytes draws s at the dot and advances the dot's location.
+func (d *Drawer) DrawBytes(s []byte) {
+ prevC := rune(-1)
+ for len(s) > 0 {
+ c, size := utf8.DecodeRune(s)
+ s = s[size:]
+ if prevC >= 0 {
+ d.Dot.X += d.Face.Kern(prevC, c)
+ }
+ dr, mask, maskp, advance, ok := d.Face.Glyph(d.Dot, c)
+ if !ok {
+ // TODO: is falling back on the U+FFFD glyph the responsibility of
+ // the Drawer or the Face?
+ // TODO: set prevC = '\ufffd'?
+ continue
+ }
+ draw.DrawMask(d.Dst, dr, d.Src, image.Point{}, mask, maskp, draw.Over)
+ d.Dot.X += advance
+ prevC = c
+ }
+}
+
// DrawString draws s at the dot and advances the dot's location.
func (d *Drawer) DrawString(s string) {
- var prevC rune
- for i, c := range s {
- if i != 0 {
+ prevC := rune(-1)
+ for _, c := range s {
+ if prevC >= 0 {
d.Dot.X += d.Face.Kern(prevC, c)
}
dr, mask, maskp, advance, ok := d.Face.Glyph(d.Dot, c)
@@ -143,16 +167,43 @@ func (d *Drawer) DrawString(s string) {
}
}
+// MeasureBytes returns how far dot would advance by drawing s.
+func (d *Drawer) MeasureBytes(s []byte) (advance fixed.Int26_6) {
+ return MeasureBytes(d.Face, s)
+}
+
// MeasureString returns how far dot would advance by drawing s.
func (d *Drawer) MeasureString(s string) (advance fixed.Int26_6) {
return MeasureString(d.Face, s)
}
+// MeasureBytes returns how far dot would advance by drawing s with f.
+func MeasureBytes(f Face, s []byte) (advance fixed.Int26_6) {
+ prevC := rune(-1)
+ for len(s) > 0 {
+ c, size := utf8.DecodeRune(s)
+ s = s[size:]
+ if prevC >= 0 {
+ advance += f.Kern(prevC, c)
+ }
+ a, ok := f.GlyphAdvance(c)
+ if !ok {
+ // TODO: is falling back on the U+FFFD glyph the responsibility of
+ // the Drawer or the Face?
+ // TODO: set prevC = '\ufffd'?
+ continue
+ }
+ advance += a
+ prevC = c
+ }
+ return advance
+}
+
// MeasureString returns how far dot would advance by drawing s with f.
func MeasureString(f Face, s string) (advance fixed.Int26_6) {
- var prevC rune
- for i, c := range s {
- if i != 0 {
+ prevC := rune(-1)
+ for _, c := range s {
+ if prevC >= 0 {
advance += f.Kern(prevC, c)
}
a, ok := f.GlyphAdvance(c)
diff --git a/vendor/golang.org/x/image/font/inconsolata/bold8x16.go b/vendor/golang.org/x/image/font/inconsolata/bold8x16.go
new file mode 100644
index 000000000..01d183446
--- /dev/null
+++ b/vendor/golang.org/x/image/font/inconsolata/bold8x16.go
@@ -0,0 +1,5557 @@
+// generated by go generate; DO NOT EDIT.
+
+package inconsolata
+
+import (
+ "image"
+
+ "golang.org/x/image/font/basicfont"
+)
+
+// bold8x16 contains 289 10×17 glyphs in 49130 Pix bytes.
+var bold8x16 = basicfont.Face{
+ Advance: 8,
+ Width: 10,
+ Height: 16,
+ Ascent: 14,
+ Descent: 3,
+ Left: -1,
+ Mask: &image.Alpha{
+ Stride: 10,
+ Rect: image.Rectangle{Max: image.Point{10, 289 * 17}},
+ Pix: []byte{
+ // U+00000020 ' '
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000021 '!'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x13, 0xe2, 0xa8, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x40, 0xff, 0xf4, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x30, 0xff, 0xea, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x19, 0xff, 0xd8, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x0e, 0xff, 0xc8, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x02, 0xff, 0xb8, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xf6, 0xa8, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe8, 0x98, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x18, 0x0a, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x42, 0xfd, 0xe2, 0x07, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x32, 0xeb, 0xc1, 0x03, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000022 '"'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x70, 0xc0, 0xa6, 0xc0, 0x36, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x90, 0xff, 0xd0, 0xff, 0x40, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x88, 0xff, 0xc0, 0xff, 0x38, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x80, 0xff, 0xae, 0xff, 0x2e, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x31, 0x68, 0x41, 0x68, 0x10, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000023 '#'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x86, 0xff, 0x29, 0xfe, 0x9e, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xaa, 0xf6, 0x2f, 0xff, 0x7a, 0x00, 0x00,
+ 0x00, 0x6c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x00,
+ 0x00, 0x3c, 0x84, 0xf5, 0xd9, 0xb8, 0xff, 0x9f, 0x51, 0x00,
+ 0x00, 0x00, 0x01, 0xfa, 0x9c, 0x80, 0xff, 0x24, 0x00, 0x00,
+ 0x00, 0x00, 0x14, 0xff, 0x84, 0x98, 0xff, 0x0c, 0x00, 0x00,
+ 0x00, 0xa0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x64, 0x00,
+ 0x00, 0x58, 0xac, 0xff, 0xa8, 0xe7, 0xea, 0x84, 0x2d, 0x00,
+ 0x00, 0x00, 0x6c, 0xff, 0x34, 0xea, 0xbc, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x8a, 0xff, 0x20, 0xff, 0x9c, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000024 '$'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x98, 0xff, 0x0c, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x0b, 0x9b, 0xf7, 0xff, 0xd7, 0x42, 0x00, 0x00,
+ 0x00, 0x00, 0x9a, 0xff, 0xe0, 0xfa, 0xe1, 0xf8, 0x16, 0x00,
+ 0x00, 0x00, 0xe5, 0xcb, 0x84, 0xf0, 0x13, 0x81, 0x00, 0x00,
+ 0x00, 0x00, 0xc8, 0xf7, 0xc0, 0xf0, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x36, 0xee, 0xff, 0xfb, 0x82, 0x0f, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x16, 0xb7, 0xff, 0xff, 0xdc, 0x11, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x84, 0xf1, 0x7f, 0xff, 0x6c, 0x00,
+ 0x00, 0x00, 0x61, 0x1b, 0x84, 0xf0, 0x34, 0xff, 0x78, 0x00,
+ 0x00, 0x0f, 0xf4, 0xde, 0xc1, 0xf9, 0xdc, 0xfb, 0x2a, 0x00,
+ 0x00, 0x00, 0x47, 0xd8, 0xff, 0xff, 0xe8, 0x54, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xa0, 0xff, 0x07, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000025 '%'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x2d, 0xd8, 0xf3, 0x75, 0x00, 0x46, 0xff, 0x5e, 0x00,
+ 0x00, 0xb2, 0xd6, 0xaf, 0xfe, 0x1d, 0xd5, 0xc8, 0x01, 0x00,
+ 0x00, 0xb1, 0xd7, 0xb1, 0xfe, 0x82, 0xff, 0x38, 0x00, 0x00,
+ 0x00, 0x2c, 0xd5, 0xf2, 0x87, 0xea, 0xa6, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x88, 0xf6, 0x1c, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x22, 0xf8, 0x93, 0x75, 0x5b, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xac, 0xe3, 0xd1, 0xff, 0xff, 0x76, 0x00,
+ 0x00, 0x00, 0x3c, 0xff, 0x78, 0xff, 0x50, 0xb1, 0xca, 0x00,
+ 0x00, 0x01, 0xca, 0xc8, 0x0c, 0xf6, 0x5e, 0xb9, 0xb1, 0x00,
+ 0x00, 0x5c, 0xff, 0x38, 0x00, 0x5f, 0xee, 0xd7, 0x2d, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000026 '&'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x0c, 0xa9, 0xf9, 0xd8, 0x39, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x81, 0xff, 0xa0, 0xe5, 0xde, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x9c, 0xff, 0x07, 0x94, 0xfb, 0x02, 0x00, 0x00,
+ 0x00, 0x00, 0x44, 0xff, 0x88, 0xe2, 0xaa, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x04, 0xcd, 0xff, 0xce, 0x14, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0xaf, 0xef, 0xdc, 0xe5, 0x17, 0x9b, 0x38, 0x00,
+ 0x00, 0x4e, 0xff, 0x62, 0x29, 0xf3, 0xcc, 0xfa, 0x8d, 0x00,
+ 0x00, 0x80, 0xff, 0x4d, 0x00, 0x6e, 0xff, 0xe4, 0x06, 0x00,
+ 0x00, 0x51, 0xff, 0xe1, 0x8f, 0xe8, 0xf4, 0xff, 0x61, 0x00,
+ 0x00, 0x00, 0x81, 0xe7, 0xf3, 0x9f, 0x1b, 0xcb, 0x46, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000027 '''
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x70, 0xc0, 0x36, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x90, 0xff, 0x40, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x88, 0xff, 0x38, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0x2e, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x31, 0x68, 0x10, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000028 '('
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x30, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0xff, 0xb3, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x82, 0xff, 0x90, 0x04, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x30, 0xfd, 0xa3, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xa1, 0xfa, 0x1b, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0xed, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x14, 0xff, 0x95, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x1c, 0xff, 0x8d, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x0b, 0xfe, 0xa3, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xd5, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x80, 0xff, 0x47, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x13, 0xef, 0xd5, 0x0a, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x55, 0xfe, 0xba, 0x0c, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0xfb, 0xac, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0x33, 0x00, 0x00,
+
+ // U+00000029 ')'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xa8, 0xb7, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x67, 0xf7, 0xe0, 0x1d, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x3c, 0xf5, 0xc6, 0x02, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x70, 0xff, 0x5a, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x07, 0xed, 0xbf, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xac, 0xf9, 0x05, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x8f, 0xff, 0x19, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x94, 0xff, 0x11, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xe7, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x1a, 0xfb, 0x9f, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x9c, 0xfd, 0x2e, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x6f, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x9d, 0xff, 0xab, 0x04, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xa7, 0x73, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000002a '*'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xca, 0xfa, 0x03, 0x00, 0x00, 0x00,
+ 0x00, 0x03, 0x56, 0x02, 0xb6, 0xdc, 0x00, 0x41, 0x06, 0x00,
+ 0x00, 0x46, 0xff, 0xd8, 0xd3, 0xe0, 0xc8, 0xff, 0x59, 0x00,
+ 0x00, 0x06, 0x4a, 0xa0, 0xff, 0xff, 0xa9, 0x4e, 0x07, 0x00,
+ 0x00, 0x00, 0x00, 0x8a, 0xf7, 0xf3, 0x9f, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x5d, 0xff, 0x7a, 0x70, 0xff, 0x6a, 0x00, 0x00,
+ 0x00, 0x00, 0x58, 0xc8, 0x04, 0x03, 0xc1, 0x5d, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000002b '+'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xb0, 0xe0, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xb0, 0xe0, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x2d, 0x84, 0x84, 0xd9, 0xf0, 0x84, 0x84, 0x37, 0x00,
+ 0x00, 0x58, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6c, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xb0, 0xe0, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xb0, 0xe0, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xb0, 0xe0, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000002c ','
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x25, 0xe9, 0xbb, 0x02, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x38, 0xfd, 0xff, 0x21, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xae, 0xe6, 0x04, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x36, 0xf9, 0x5f, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x2d, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000002d '-'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x7f, 0x84, 0x84, 0x84, 0x84, 0x84, 0x04, 0x00,
+ 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x08, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000002e '.'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x16, 0x09, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x31, 0xfb, 0xda, 0x03, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x24, 0xe7, 0xc1, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000002f '/'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0xca, 0x0c, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xeb, 0xc6, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0xff, 0x54, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xd3, 0xe0, 0x03, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x46, 0xff, 0x74, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xb8, 0xf3, 0x0f, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x29, 0xfe, 0x92, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x98, 0xfd, 0x22, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x14, 0xf6, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x7c, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x05, 0xe6, 0xcf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x04, 0x68, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000030 '0'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x7c, 0xec, 0xf2, 0x89, 0x02, 0x00, 0x00,
+ 0x00, 0x00, 0x77, 0xff, 0xb7, 0xb1, 0xff, 0x7f, 0x00, 0x00,
+ 0x00, 0x0a, 0xf1, 0xc8, 0x01, 0x04, 0xe8, 0xf6, 0x0f, 0x00,
+ 0x00, 0x4b, 0xff, 0x6e, 0x00, 0x86, 0xff, 0xff, 0x4d, 0x00,
+ 0x00, 0x6e, 0xff, 0x4a, 0x4c, 0xf9, 0x82, 0xff, 0x70, 0x00,
+ 0x00, 0x6e, 0xff, 0x67, 0xee, 0x6e, 0x3e, 0xff, 0x74, 0x00,
+ 0x00, 0x4e, 0xff, 0xf6, 0x9f, 0x00, 0x64, 0xff, 0x58, 0x00,
+ 0x00, 0x0d, 0xf4, 0xed, 0x07, 0x01, 0xc2, 0xfb, 0x18, 0x00,
+ 0x00, 0x00, 0x7d, 0xff, 0xb3, 0xb4, 0xff, 0x98, 0x00, 0x00,
+ 0x00, 0x00, 0x02, 0x80, 0xea, 0xed, 0x90, 0x06, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000031 '1'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x39, 0xc6, 0xff, 0x1c, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x87, 0xff, 0xff, 0xff, 0x1c, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x44, 0x56, 0xb4, 0xff, 0x1c, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xa8, 0xff, 0x1c, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xa8, 0xff, 0x1c, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xa8, 0xff, 0x1c, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xa8, 0xff, 0x1c, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xa8, 0xff, 0x1c, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xa8, 0xff, 0x1c, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xa8, 0xff, 0x1c, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000032 '2'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x12, 0xa9, 0xf5, 0xf3, 0xa1, 0x0f, 0x00, 0x00,
+ 0x00, 0x01, 0xc7, 0xfa, 0x96, 0xb1, 0xff, 0xb1, 0x00, 0x00,
+ 0x00, 0x03, 0x8c, 0x89, 0x00, 0x00, 0xd6, 0xfe, 0x0c, 0x00,
+ 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0xe2, 0xf5, 0x05, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0xff, 0x88, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x82, 0xff, 0xb6, 0x05, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x74, 0xff, 0xae, 0x06, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x42, 0xfd, 0xba, 0x05, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x02, 0xd9, 0xff, 0xa4, 0x8c, 0x8c, 0x9c, 0x17, 0x00,
+ 0x00, 0x14, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1c, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000033 '3'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x2e, 0xbe, 0xf7, 0xf0, 0x9f, 0x12, 0x00, 0x00,
+ 0x00, 0x00, 0x9d, 0xe0, 0x8d, 0xb3, 0xff, 0xa5, 0x00, 0x00,
+ 0x00, 0x00, 0x02, 0x0b, 0x00, 0x0c, 0xfd, 0xcf, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x46, 0x96, 0xd8, 0xf3, 0x4c, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x84, 0xff, 0xff, 0xe0, 0x2e, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x03, 0x4e, 0xf9, 0xcc, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc2, 0xff, 0x0b, 0x00,
+ 0x00, 0x00, 0x48, 0x37, 0x00, 0x06, 0xe2, 0xf7, 0x03, 0x00,
+ 0x00, 0x11, 0xf0, 0xea, 0x90, 0xc4, 0xff, 0x9c, 0x00, 0x00,
+ 0x00, 0x00, 0x54, 0xd1, 0xf9, 0xe5, 0x8e, 0x09, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000034 '4'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0xff, 0x4c, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x16, 0xeb, 0xff, 0x4c, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xaf, 0xff, 0xff, 0x4c, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x5e, 0xff, 0xb9, 0xff, 0x4c, 0x00, 0x00,
+ 0x00, 0x00, 0x1c, 0xef, 0x96, 0x70, 0xff, 0x4c, 0x00, 0x00,
+ 0x00, 0x00, 0xb9, 0xd9, 0x09, 0x70, 0xff, 0x4c, 0x00, 0x00,
+ 0x00, 0x44, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x00,
+ 0x00, 0x2d, 0x90, 0x90, 0x90, 0xc8, 0xff, 0xb1, 0x5a, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0x4c, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0x4c, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000035 '5'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x54, 0xff, 0xff, 0xff, 0xff, 0xff, 0x14, 0x00,
+ 0x00, 0x00, 0x6a, 0xff, 0xa3, 0x84, 0x84, 0x84, 0x0a, 0x00,
+ 0x00, 0x00, 0x7e, 0xff, 0x8c, 0x7d, 0x41, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x92, 0xff, 0xff, 0xff, 0xff, 0x83, 0x00, 0x00,
+ 0x00, 0x00, 0x76, 0xdc, 0x26, 0x1c, 0xdd, 0xfc, 0x19, 0x00,
+ 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x7c, 0xff, 0x4e, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6a, 0xff, 0x58, 0x00,
+ 0x00, 0x00, 0x5c, 0x7b, 0x00, 0x00, 0xa7, 0xff, 0x30, 0x00,
+ 0x00, 0x06, 0xdb, 0xfc, 0xa0, 0xa7, 0xff, 0xc3, 0x00, 0x00,
+ 0x00, 0x00, 0x1c, 0xab, 0xf1, 0xf2, 0xa7, 0x15, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000036 '6'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x46, 0xd2, 0xfa, 0xd2, 0x4a, 0x00, 0x00,
+ 0x00, 0x00, 0x34, 0xf9, 0xd9, 0x8a, 0xdb, 0xb1, 0x00, 0x00,
+ 0x00, 0x00, 0xb5, 0xee, 0x12, 0x00, 0x24, 0x08, 0x00, 0x00,
+ 0x00, 0x07, 0xfa, 0xd6, 0xd4, 0xf8, 0xb0, 0x16, 0x00, 0x00,
+ 0x00, 0x24, 0xff, 0xff, 0xb9, 0x9e, 0xff, 0xbe, 0x00, 0x00,
+ 0x00, 0x2c, 0xff, 0xbf, 0x00, 0x00, 0xb3, 0xff, 0x23, 0x00,
+ 0x00, 0x19, 0xff, 0xb1, 0x00, 0x00, 0x88, 0xff, 0x3c, 0x00,
+ 0x00, 0x00, 0xdc, 0xf1, 0x10, 0x00, 0xb5, 0xff, 0x1b, 0x00,
+ 0x00, 0x00, 0x66, 0xff, 0xcd, 0xa2, 0xff, 0xab, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x77, 0xe5, 0xf1, 0x9c, 0x0b, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000037 '7'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00,
+ 0x00, 0x00, 0x7b, 0x84, 0x84, 0x9c, 0xff, 0xca, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0x5e, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x03, 0xe3, 0xef, 0x08, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x48, 0xff, 0x98, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xa4, 0xff, 0x3a, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x0b, 0xf5, 0xde, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x58, 0xff, 0x8a, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xae, 0xff, 0x38, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x0b, 0xf6, 0xe8, 0x01, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000038 '8'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x07, 0x8e, 0xef, 0xf5, 0xa9, 0x15, 0x00, 0x00,
+ 0x00, 0x00, 0x8d, 0xff, 0xb1, 0xa4, 0xff, 0xba, 0x00, 0x00,
+ 0x00, 0x00, 0xd6, 0xfb, 0x03, 0x00, 0xda, 0xfb, 0x00, 0x00,
+ 0x00, 0x00, 0x9e, 0xff, 0x80, 0x3d, 0xfc, 0xb1, 0x00, 0x00,
+ 0x00, 0x00, 0x0e, 0xd3, 0xff, 0xff, 0xdf, 0x13, 0x00, 0x00,
+ 0x00, 0x00, 0x76, 0xfe, 0xb4, 0xce, 0xff, 0x90, 0x00, 0x00,
+ 0x00, 0x29, 0xfe, 0xc2, 0x00, 0x05, 0xcb, 0xff, 0x2e, 0x00,
+ 0x00, 0x4b, 0xff, 0xa6, 0x00, 0x00, 0xa0, 0xff, 0x4b, 0x00,
+ 0x00, 0x0d, 0xe5, 0xfe, 0xa6, 0xa0, 0xfc, 0xe3, 0x0c, 0x00,
+ 0x00, 0x00, 0x24, 0xb0, 0xf2, 0xf1, 0xaf, 0x23, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000039 '9'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x20, 0xb6, 0xf8, 0xe5, 0x67, 0x00, 0x00, 0x00,
+ 0x00, 0x05, 0xd9, 0xf7, 0x92, 0xc6, 0xff, 0x52, 0x00, 0x00,
+ 0x00, 0x41, 0xff, 0x8a, 0x00, 0x08, 0xe7, 0xc8, 0x00, 0x00,
+ 0x00, 0x47, 0xff, 0x8a, 0x00, 0x00, 0xc1, 0xfc, 0x08, 0x00,
+ 0x00, 0x0a, 0xe5, 0xf8, 0x96, 0xb7, 0xff, 0xff, 0x1a, 0x00,
+ 0x00, 0x00, 0x2b, 0xbe, 0xf8, 0xcb, 0xd7, 0xff, 0x10, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xeb, 0x00, 0x00,
+ 0x00, 0x00, 0x0f, 0x20, 0x00, 0x45, 0xff, 0x9e, 0x00, 0x00,
+ 0x00, 0x02, 0xc0, 0xd9, 0x90, 0xee, 0xf3, 0x26, 0x00, 0x00,
+ 0x00, 0x00, 0x52, 0xd6, 0xf7, 0xc7, 0x36, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000003a ':'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x1a, 0x05, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x4d, 0xff, 0xc5, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x39, 0xed, 0xa0, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x1a, 0x05, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x4d, 0xff, 0xc4, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x3b, 0xef, 0xa4, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000003b ';'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x1a, 0x05, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x4d, 0xff, 0xc5, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x39, 0xed, 0xa0, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x39, 0xf1, 0xa1, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x51, 0xff, 0xfe, 0x06, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xca, 0xcf, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x4f, 0xfd, 0x44, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x40, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000003c '<'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3a, 0x48, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0xae, 0xff, 0x71, 0x00,
+ 0x00, 0x00, 0x00, 0x13, 0x92, 0xfa, 0xe7, 0x68, 0x04, 0x00,
+ 0x00, 0x07, 0x76, 0xef, 0xf2, 0x7c, 0x0b, 0x00, 0x00, 0x00,
+ 0x00, 0x7a, 0xff, 0xd6, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x1a, 0xaa, 0xff, 0xcb, 0x38, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x47, 0xdb, 0xfe, 0xa0, 0x16, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x07, 0x80, 0xf8, 0xf1, 0x4e, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0xbb, 0x84, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000003d '='
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x58, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6c, 0x00,
+ 0x00, 0x2d, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x37, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x2d, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x37, 0x00,
+ 0x00, 0x58, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6c, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000003e '>'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x40, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x61, 0xff, 0xb6, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x03, 0x60, 0xe2, 0xfc, 0x9c, 0x18, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x08, 0x74, 0xed, 0xf4, 0x82, 0x0c, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xc7, 0xff, 0x95, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x2d, 0xc1, 0xff, 0xba, 0x24, 0x00,
+ 0x00, 0x00, 0x10, 0x94, 0xfc, 0xe5, 0x56, 0x00, 0x00, 0x00,
+ 0x00, 0x3a, 0xea, 0xfc, 0x90, 0x0d, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x68, 0xc9, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x17, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000003f '?'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x0c, 0x92, 0xed, 0xf7, 0xaf, 0x18, 0x00, 0x00,
+ 0x00, 0x03, 0xc1, 0xff, 0xaa, 0xa4, 0xff, 0xbf, 0x00, 0x00,
+ 0x00, 0x00, 0x89, 0x7b, 0x00, 0x00, 0xc3, 0xff, 0x12, 0x00,
+ 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0xd1, 0xfa, 0x0d, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0xff, 0x85, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x4e, 0xff, 0x8a, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x9b, 0xfc, 0x03, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x82, 0xc9, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x08, 0x17, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xd2, 0xfc, 0x3b, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xb2, 0xea, 0x2d, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000040 '@'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x02, 0x77, 0xe2, 0xfc, 0xd2, 0x44, 0x00, 0x00,
+ 0x00, 0x00, 0x8e, 0xff, 0xb7, 0x86, 0xb0, 0xf4, 0x19, 0x00,
+ 0x00, 0x24, 0xfd, 0x91, 0x52, 0xcd, 0xf8, 0xff, 0x6d, 0x00,
+ 0x00, 0x72, 0xfd, 0x3d, 0xfd, 0xe1, 0x90, 0xf9, 0x8d, 0x00,
+ 0x00, 0x90, 0xe6, 0x5e, 0xff, 0x32, 0x0a, 0xfd, 0x94, 0x00,
+ 0x00, 0x90, 0xe9, 0x3b, 0xff, 0xbb, 0xb6, 0xff, 0x94, 0x00,
+ 0x00, 0x6b, 0xff, 0x27, 0x83, 0xf2, 0xc6, 0xee, 0x94, 0x00,
+ 0x00, 0x1b, 0xfa, 0xb8, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00,
+ 0x00, 0x00, 0x79, 0xff, 0xda, 0x8f, 0xa4, 0xd1, 0x03, 0x00,
+ 0x00, 0x00, 0x00, 0x5a, 0xcd, 0xf7, 0xe6, 0x8c, 0x06, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000041 'A'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xd7, 0x8e, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x2e, 0xff, 0xe7, 0x03, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x82, 0xfd, 0xff, 0x46, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xd7, 0xaa, 0xe5, 0xa4, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x2e, 0xff, 0x58, 0x92, 0xf5, 0x0c, 0x00, 0x00,
+ 0x00, 0x00, 0x82, 0xfc, 0x1f, 0x4a, 0xff, 0x5e, 0x00, 0x00,
+ 0x00, 0x00, 0xd7, 0xff, 0xff, 0xff, 0xff, 0xbc, 0x00, 0x00,
+ 0x00, 0x2e, 0xff, 0xa3, 0x40, 0x40, 0xbc, 0xfd, 0x1c, 0x00,
+ 0x00, 0x82, 0xff, 0x44, 0x00, 0x00, 0x5e, 0xff, 0x76, 0x00,
+ 0x00, 0xd6, 0xf4, 0x07, 0x00, 0x00, 0x0f, 0xf8, 0xd4, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000042 'B'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x5c, 0xff, 0xff, 0xff, 0xf4, 0xba, 0x33, 0x00, 0x00,
+ 0x00, 0x5c, 0xff, 0xba, 0x84, 0xa2, 0xfc, 0xec, 0x07, 0x00,
+ 0x00, 0x5c, 0xff, 0x70, 0x00, 0x00, 0xb8, 0xff, 0x1d, 0x00,
+ 0x00, 0x5c, 0xff, 0xba, 0x85, 0xa8, 0xfc, 0xbc, 0x00, 0x00,
+ 0x00, 0x5c, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x00, 0x00,
+ 0x00, 0x5c, 0xff, 0x70, 0x00, 0x26, 0xd1, 0xfb, 0x2a, 0x00,
+ 0x00, 0x5c, 0xff, 0x70, 0x00, 0x00, 0x61, 0xff, 0x80, 0x00,
+ 0x00, 0x5c, 0xff, 0x70, 0x00, 0x00, 0x77, 0xff, 0x76, 0x00,
+ 0x00, 0x5c, 0xff, 0xba, 0x84, 0x9b, 0xf7, 0xf4, 0x21, 0x00,
+ 0x00, 0x5c, 0xff, 0xff, 0xfe, 0xed, 0xb3, 0x32, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000043 'C'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x6e, 0xde, 0xfd, 0xd3, 0x4e, 0x00, 0x00,
+ 0x00, 0x00, 0x86, 0xff, 0xcf, 0x8b, 0xdc, 0xfe, 0x4f, 0x00,
+ 0x00, 0x1c, 0xfb, 0xdc, 0x09, 0x00, 0x1b, 0xe4, 0x61, 0x00,
+ 0x00, 0x64, 0xff, 0x7e, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00,
+ 0x00, 0x83, 0xff, 0x59, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x82, 0xff, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x66, 0xff, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x20, 0xfd, 0xe5, 0x11, 0x00, 0x0c, 0x89, 0x19, 0x00,
+ 0x00, 0x00, 0x90, 0xff, 0xdc, 0x8f, 0xd6, 0xff, 0x5b, 0x00,
+ 0x00, 0x00, 0x01, 0x71, 0xd8, 0xf8, 0xd3, 0x57, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000044 'D'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x4c, 0xff, 0xff, 0xfe, 0xe3, 0x8b, 0x08, 0x00, 0x00,
+ 0x00, 0x4c, 0xff, 0xbc, 0x8a, 0xd2, 0xff, 0xa3, 0x00, 0x00,
+ 0x00, 0x4c, 0xff, 0x74, 0x00, 0x04, 0xc6, 0xff, 0x2c, 0x00,
+ 0x00, 0x4c, 0xff, 0x74, 0x00, 0x00, 0x5e, 0xff, 0x74, 0x00,
+ 0x00, 0x4c, 0xff, 0x74, 0x00, 0x00, 0x36, 0xff, 0x94, 0x00,
+ 0x00, 0x4c, 0xff, 0x74, 0x00, 0x00, 0x33, 0xff, 0x96, 0x00,
+ 0x00, 0x4c, 0xff, 0x74, 0x00, 0x00, 0x5d, 0xff, 0x79, 0x00,
+ 0x00, 0x4c, 0xff, 0x74, 0x00, 0x0a, 0xcd, 0xff, 0x34, 0x00,
+ 0x00, 0x4c, 0xff, 0xbc, 0x91, 0xde, 0xff, 0xa5, 0x00, 0x00,
+ 0x00, 0x4c, 0xff, 0xff, 0xf6, 0xd2, 0x77, 0x04, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000045 'E'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x18, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x64, 0x00,
+ 0x00, 0x18, 0xff, 0xd3, 0x84, 0x84, 0x84, 0x84, 0x33, 0x00,
+ 0x00, 0x18, 0xff, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x18, 0xff, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x18, 0xff, 0xff, 0xff, 0xff, 0xff, 0x94, 0x00, 0x00,
+ 0x00, 0x18, 0xff, 0xd3, 0x84, 0x84, 0x84, 0x4c, 0x00, 0x00,
+ 0x00, 0x18, 0xff, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x18, 0xff, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x18, 0xff, 0xd3, 0x84, 0x84, 0x84, 0x84, 0x2f, 0x00,
+ 0x00, 0x18, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5c, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000046 'F'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xe8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x48, 0x00,
+ 0x00, 0x00, 0xe8, 0xf2, 0x84, 0x84, 0x84, 0x84, 0x25, 0x00,
+ 0x00, 0x00, 0xe8, 0xe4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xe8, 0xf2, 0x84, 0x84, 0x84, 0x39, 0x00, 0x00,
+ 0x00, 0x00, 0xe8, 0xff, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00,
+ 0x00, 0x00, 0xe8, 0xe4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xe8, 0xe4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xe8, 0xe4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xe8, 0xe4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xe8, 0xe4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000047 'G'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x08, 0x84, 0xe5, 0xfb, 0xc7, 0x3c, 0x00, 0x00,
+ 0x00, 0x01, 0xb7, 0xff, 0xb9, 0x8e, 0xe9, 0xf9, 0x33, 0x00,
+ 0x00, 0x4a, 0xff, 0xab, 0x00, 0x00, 0x30, 0xc9, 0x12, 0x00,
+ 0x00, 0x98, 0xff, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xb5, 0xff, 0x21, 0x00, 0x7d, 0x84, 0x84, 0x39, 0x00,
+ 0x00, 0xb6, 0xff, 0x23, 0x00, 0xf4, 0xff, 0xff, 0x70, 0x00,
+ 0x00, 0x95, 0xff, 0x4f, 0x00, 0x00, 0x40, 0xff, 0x70, 0x00,
+ 0x00, 0x47, 0xff, 0xbf, 0x02, 0x00, 0x40, 0xff, 0x70, 0x00,
+ 0x00, 0x00, 0xb8, 0xff, 0xc4, 0x8c, 0xd0, 0xff, 0x6d, 0x00,
+ 0x00, 0x00, 0x0b, 0x8b, 0xe4, 0xf8, 0xd7, 0x75, 0x05, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000048 'H'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x50, 0xff, 0x91, 0x00, 0x00, 0x88, 0xff, 0x59, 0x00,
+ 0x00, 0x50, 0xff, 0x88, 0x00, 0x00, 0x88, 0xff, 0x50, 0x00,
+ 0x00, 0x50, 0xff, 0x88, 0x00, 0x00, 0x88, 0xff, 0x50, 0x00,
+ 0x00, 0x50, 0xff, 0x88, 0x00, 0x00, 0x88, 0xff, 0x50, 0x00,
+ 0x00, 0x50, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x00,
+ 0x00, 0x50, 0xff, 0xc9, 0x8c, 0x8c, 0xc9, 0xff, 0x50, 0x00,
+ 0x00, 0x50, 0xff, 0x88, 0x00, 0x00, 0x88, 0xff, 0x50, 0x00,
+ 0x00, 0x50, 0xff, 0x88, 0x00, 0x00, 0x88, 0xff, 0x50, 0x00,
+ 0x00, 0x50, 0xff, 0x88, 0x00, 0x00, 0x88, 0xff, 0x50, 0x00,
+ 0x00, 0x50, 0xff, 0x88, 0x00, 0x00, 0x88, 0xff, 0x50, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000049 'I'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xbc, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x00, 0x00,
+ 0x00, 0x00, 0x60, 0x84, 0xf2, 0xf4, 0x84, 0x6d, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe4, 0xe8, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe4, 0xe8, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe4, 0xe8, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe4, 0xe8, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe4, 0xe8, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe4, 0xe8, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x6d, 0x84, 0xf2, 0xf4, 0x84, 0x79, 0x00, 0x00,
+ 0x00, 0x00, 0xd4, 0xff, 0xff, 0xff, 0xff, 0xec, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000004a 'J'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xb8, 0xff, 0xff, 0xff, 0xff, 0x6c, 0x00,
+ 0x00, 0x00, 0x00, 0x5e, 0x84, 0xf0, 0xf6, 0x84, 0x37, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xec, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xec, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xec, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xec, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xe2, 0xea, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x6a, 0x00, 0x08, 0xf9, 0xd3, 0x00, 0x00, 0x00,
+ 0x00, 0x5e, 0xff, 0xa9, 0xba, 0xff, 0x81, 0x00, 0x00, 0x00,
+ 0x00, 0x08, 0x90, 0xea, 0xf0, 0x9a, 0x07, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000004b 'K'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x09, 0x00, 0x00,
+ 0x00, 0x50, 0xff, 0x91, 0x00, 0x00, 0x9e, 0xff, 0x84, 0x00,
+ 0x00, 0x50, 0xff, 0x88, 0x00, 0x78, 0xff, 0xa3, 0x00, 0x00,
+ 0x00, 0x50, 0xff, 0x88, 0x54, 0xfe, 0xc1, 0x07, 0x00, 0x00,
+ 0x00, 0x50, 0xff, 0xba, 0xf6, 0xd7, 0x11, 0x00, 0x00, 0x00,
+ 0x00, 0x50, 0xff, 0xff, 0xff, 0x73, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x50, 0xff, 0xda, 0xec, 0xf1, 0x1d, 0x00, 0x00, 0x00,
+ 0x00, 0x50, 0xff, 0x88, 0x5e, 0xff, 0xb9, 0x00, 0x00, 0x00,
+ 0x00, 0x50, 0xff, 0x88, 0x00, 0xb6, 0xff, 0x66, 0x00, 0x00,
+ 0x00, 0x50, 0xff, 0x88, 0x00, 0x1d, 0xf2, 0xf2, 0x1f, 0x00,
+ 0x00, 0x50, 0xff, 0x88, 0x00, 0x00, 0x68, 0xff, 0xbe, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000004c 'L'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x04, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x04, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x04, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x04, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x04, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x04, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x04, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x04, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x04, 0xff, 0xeb, 0x94, 0x94, 0x94, 0x94, 0x32, 0x00,
+ 0x00, 0x04, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x58, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000004d 'M'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x84, 0xff, 0x8c, 0x00, 0x00, 0x76, 0xff, 0xa0, 0x00,
+ 0x00, 0x84, 0xff, 0xe3, 0x02, 0x00, 0xd2, 0xff, 0xa0, 0x00,
+ 0x00, 0x84, 0xff, 0xfd, 0x42, 0x2e, 0xfd, 0xff, 0xa0, 0x00,
+ 0x00, 0x84, 0xff, 0xbe, 0x9c, 0x88, 0xb8, 0xff, 0xa0, 0x00,
+ 0x00, 0x84, 0xff, 0x62, 0xef, 0xe1, 0x58, 0xff, 0xa0, 0x00,
+ 0x00, 0x84, 0xff, 0x19, 0xec, 0xf0, 0x08, 0xff, 0xa0, 0x00,
+ 0x00, 0x84, 0xff, 0x14, 0x58, 0x5c, 0x00, 0xff, 0xa0, 0x00,
+ 0x00, 0x84, 0xff, 0x14, 0x00, 0x00, 0x00, 0xff, 0xa0, 0x00,
+ 0x00, 0x84, 0xff, 0x14, 0x00, 0x00, 0x00, 0xff, 0xa0, 0x00,
+ 0x00, 0x84, 0xff, 0x14, 0x00, 0x00, 0x00, 0xff, 0xa0, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000004e 'N'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x7c, 0xff, 0xe6, 0x05, 0x00, 0x20, 0xff, 0x87, 0x00,
+ 0x00, 0x7c, 0xff, 0xff, 0x5c, 0x00, 0x20, 0xff, 0x7c, 0x00,
+ 0x00, 0x7c, 0xff, 0xf1, 0xcc, 0x00, 0x20, 0xff, 0x7c, 0x00,
+ 0x00, 0x7c, 0xff, 0x8e, 0xff, 0x3c, 0x20, 0xff, 0x7c, 0x00,
+ 0x00, 0x7c, 0xff, 0x2b, 0xee, 0xae, 0x20, 0xff, 0x7c, 0x00,
+ 0x00, 0x7c, 0xff, 0x20, 0x86, 0xfd, 0x43, 0xff, 0x7c, 0x00,
+ 0x00, 0x7c, 0xff, 0x20, 0x18, 0xf8, 0xb0, 0xff, 0x7c, 0x00,
+ 0x00, 0x7c, 0xff, 0x20, 0x00, 0x9e, 0xfd, 0xff, 0x7c, 0x00,
+ 0x00, 0x7c, 0xff, 0x20, 0x00, 0x2a, 0xfe, 0xff, 0x7c, 0x00,
+ 0x00, 0x7c, 0xff, 0x20, 0x00, 0x00, 0xb6, 0xff, 0x7c, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000004f 'O'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x10, 0xa0, 0xf2, 0xf3, 0xa6, 0x14, 0x00, 0x00,
+ 0x00, 0x02, 0xc4, 0xfe, 0xa2, 0xa5, 0xff, 0xc9, 0x03, 0x00,
+ 0x00, 0x4e, 0xff, 0x93, 0x00, 0x00, 0xa4, 0xff, 0x50, 0x00,
+ 0x00, 0x94, 0xff, 0x3e, 0x00, 0x00, 0x4b, 0xff, 0x96, 0x00,
+ 0x00, 0xb2, 0xff, 0x23, 0x00, 0x00, 0x2a, 0xff, 0xb2, 0x00,
+ 0x00, 0xb2, 0xff, 0x26, 0x00, 0x00, 0x2d, 0xff, 0xb2, 0x00,
+ 0x00, 0x90, 0xff, 0x49, 0x00, 0x00, 0x4a, 0xff, 0x94, 0x00,
+ 0x00, 0x4a, 0xff, 0xa7, 0x00, 0x00, 0x9b, 0xff, 0x51, 0x00,
+ 0x00, 0x01, 0xc0, 0xff, 0xad, 0xa4, 0xfe, 0xcb, 0x02, 0x00,
+ 0x00, 0x00, 0x10, 0x9d, 0xee, 0xf2, 0xa2, 0x12, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000050 'P'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x34, 0xff, 0xff, 0xff, 0xfb, 0xd2, 0x59, 0x00, 0x00,
+ 0x00, 0x34, 0xff, 0xd1, 0x84, 0x8e, 0xeb, 0xfe, 0x39, 0x00,
+ 0x00, 0x34, 0xff, 0xa0, 0x00, 0x00, 0x5e, 0xff, 0x81, 0x00,
+ 0x00, 0x34, 0xff, 0xa0, 0x00, 0x0c, 0x9d, 0xff, 0x6f, 0x00,
+ 0x00, 0x34, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, 0x10, 0x00,
+ 0x00, 0x34, 0xff, 0xd1, 0x84, 0x7e, 0x58, 0x08, 0x00, 0x00,
+ 0x00, 0x34, 0xff, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x34, 0xff, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x34, 0xff, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x34, 0xff, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000051 'Q'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x0a, 0x96, 0xef, 0xf1, 0x9c, 0x0c, 0x00, 0x00,
+ 0x00, 0x00, 0xac, 0xff, 0xa5, 0xab, 0xff, 0xb2, 0x00, 0x00,
+ 0x00, 0x37, 0xff, 0x9f, 0x00, 0x00, 0xb2, 0xff, 0x3b, 0x00,
+ 0x00, 0x83, 0xff, 0x48, 0x00, 0x00, 0x57, 0xff, 0x87, 0x00,
+ 0x00, 0xaa, 0xff, 0x26, 0x00, 0x00, 0x31, 0xff, 0xac, 0x00,
+ 0x00, 0xb6, 0xff, 0x21, 0x00, 0x00, 0x28, 0xff, 0xb8, 0x00,
+ 0x00, 0xa8, 0xff, 0x33, 0x00, 0x00, 0x36, 0xff, 0xab, 0x00,
+ 0x00, 0x80, 0xff, 0x63, 0x00, 0x00, 0x5f, 0xff, 0x84, 0x00,
+ 0x00, 0x35, 0xff, 0xd0, 0x09, 0x04, 0xc3, 0xff, 0x36, 0x00,
+ 0x00, 0x00, 0xae, 0xff, 0xe2, 0xda, 0xff, 0xaa, 0x00, 0x00,
+ 0x00, 0x00, 0x0a, 0x97, 0xfa, 0xf9, 0x8c, 0x07, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfb, 0x8e, 0x84, 0x10, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x38, 0xd0, 0xfb, 0xff, 0x1a, 0x00,
+
+ // U+00000052 'R'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x40, 0xff, 0xff, 0xff, 0xf7, 0xc7, 0x45, 0x00, 0x00,
+ 0x00, 0x40, 0xff, 0xcb, 0x84, 0x96, 0xf3, 0xf8, 0x1c, 0x00,
+ 0x00, 0x40, 0xff, 0x94, 0x00, 0x00, 0x81, 0xff, 0x59, 0x00,
+ 0x00, 0x40, 0xff, 0x94, 0x00, 0x12, 0xb9, 0xff, 0x3e, 0x00,
+ 0x00, 0x40, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa8, 0x00, 0x00,
+ 0x00, 0x40, 0xff, 0xcb, 0x95, 0xff, 0xb3, 0x00, 0x00, 0x00,
+ 0x00, 0x40, 0xff, 0x94, 0x00, 0xcd, 0xf8, 0x1b, 0x00, 0x00,
+ 0x00, 0x40, 0xff, 0x94, 0x00, 0x58, 0xff, 0x94, 0x00, 0x00,
+ 0x00, 0x40, 0xff, 0x94, 0x00, 0x03, 0xde, 0xf8, 0x1b, 0x00,
+ 0x00, 0x40, 0xff, 0x94, 0x00, 0x00, 0x6c, 0xff, 0x94, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000053 'S'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x21, 0xb1, 0xf4, 0xf3, 0xb2, 0x27, 0x00, 0x00,
+ 0x00, 0x06, 0xdd, 0xfa, 0x96, 0x99, 0xf4, 0xdf, 0x03, 0x00,
+ 0x00, 0x32, 0xff, 0xae, 0x00, 0x00, 0x39, 0x4f, 0x00, 0x00,
+ 0x00, 0x13, 0xf6, 0xf2, 0x4a, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x53, 0xf3, 0xff, 0xcc, 0x5d, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x18, 0x83, 0xea, 0xff, 0xb1, 0x02, 0x00,
+ 0x00, 0x00, 0x02, 0x00, 0x00, 0x0c, 0xbf, 0xff, 0x42, 0x00,
+ 0x00, 0x0e, 0xbf, 0x11, 0x00, 0x00, 0x8a, 0xff, 0x50, 0x00,
+ 0x00, 0x57, 0xff, 0xe6, 0x94, 0x9e, 0xf8, 0xeb, 0x10, 0x00,
+ 0x00, 0x00, 0x58, 0xc9, 0xf5, 0xf1, 0xb2, 0x2a, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000054 'T'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xac, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xac, 0x00,
+ 0x00, 0x58, 0x84, 0x84, 0xfc, 0xee, 0x84, 0x84, 0x58, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xf8, 0xdc, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xf8, 0xdc, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xf8, 0xdc, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xf8, 0xdc, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xf8, 0xdc, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xf8, 0xdc, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xf8, 0xdc, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xf8, 0xdc, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000055 'U'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x68, 0xff, 0x6c, 0x00, 0x00, 0x58, 0xff, 0x68, 0x00,
+ 0x00, 0x68, 0xff, 0x64, 0x00, 0x00, 0x58, 0xff, 0x68, 0x00,
+ 0x00, 0x68, 0xff, 0x64, 0x00, 0x00, 0x58, 0xff, 0x68, 0x00,
+ 0x00, 0x68, 0xff, 0x64, 0x00, 0x00, 0x58, 0xff, 0x68, 0x00,
+ 0x00, 0x68, 0xff, 0x64, 0x00, 0x00, 0x58, 0xff, 0x68, 0x00,
+ 0x00, 0x68, 0xff, 0x64, 0x00, 0x00, 0x58, 0xff, 0x68, 0x00,
+ 0x00, 0x65, 0xff, 0x66, 0x00, 0x00, 0x5d, 0xff, 0x62, 0x00,
+ 0x00, 0x45, 0xff, 0x92, 0x00, 0x00, 0x8c, 0xff, 0x42, 0x00,
+ 0x00, 0x05, 0xdc, 0xfb, 0x9d, 0x9c, 0xfb, 0xd9, 0x04, 0x00,
+ 0x00, 0x00, 0x23, 0xb5, 0xf4, 0xf1, 0xb4, 0x22, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000056 'V'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xb0, 0xff, 0x30, 0x00, 0x00, 0x0b, 0xf9, 0xce, 0x00,
+ 0x00, 0x5e, 0xff, 0x7a, 0x00, 0x00, 0x4c, 0xff, 0x7c, 0x00,
+ 0x00, 0x0f, 0xf9, 0xc6, 0x00, 0x00, 0x94, 0xff, 0x2a, 0x00,
+ 0x00, 0x00, 0xb8, 0xfd, 0x15, 0x00, 0xdc, 0xd8, 0x00, 0x00,
+ 0x00, 0x00, 0x66, 0xff, 0x5e, 0x24, 0xff, 0x86, 0x00, 0x00,
+ 0x00, 0x00, 0x15, 0xfc, 0xaa, 0x6c, 0xff, 0x34, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xc0, 0xf0, 0xb8, 0xe1, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x6e, 0xff, 0xff, 0x90, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x1b, 0xfe, 0xff, 0x3e, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xc6, 0xe9, 0x02, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000057 'W'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xda, 0xe2, 0x00, 0x14, 0x24, 0x00, 0xb6, 0xec, 0x00,
+ 0x00, 0xbc, 0xf7, 0x00, 0x8e, 0xde, 0x00, 0xc8, 0xcc, 0x00,
+ 0x00, 0x9c, 0xff, 0x0e, 0xc2, 0xff, 0x12, 0xd8, 0xae, 0x00,
+ 0x00, 0x7c, 0xff, 0x26, 0xf3, 0xff, 0x46, 0xe8, 0x90, 0x00,
+ 0x00, 0x5c, 0xff, 0x64, 0xf1, 0xd2, 0x7a, 0xf8, 0x72, 0x00,
+ 0x00, 0x3e, 0xff, 0xac, 0xbc, 0x98, 0xb6, 0xff, 0x54, 0x00,
+ 0x00, 0x20, 0xff, 0xf1, 0x84, 0x60, 0xf4, 0xff, 0x34, 0x00,
+ 0x00, 0x04, 0xfc, 0xff, 0x4c, 0x28, 0xff, 0xff, 0x16, 0x00,
+ 0x00, 0x00, 0xe0, 0xff, 0x14, 0x01, 0xee, 0xf7, 0x01, 0x00,
+ 0x00, 0x00, 0xc0, 0xdc, 0x00, 0x00, 0xb8, 0xda, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000058 'X'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x5c, 0xff, 0x96, 0x00, 0x00, 0x86, 0xff, 0x56, 0x00,
+ 0x00, 0x01, 0xcf, 0xfa, 0x20, 0x15, 0xf4, 0xd2, 0x01, 0x00,
+ 0x00, 0x00, 0x48, 0xff, 0x9e, 0x8c, 0xff, 0x52, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xbd, 0xfc, 0xf6, 0xcf, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x33, 0xff, 0xff, 0x51, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x48, 0xff, 0xff, 0x6e, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0xcf, 0xfa, 0xef, 0xeb, 0x0f, 0x00, 0x00,
+ 0x00, 0x00, 0x58, 0xff, 0x96, 0x76, 0xff, 0x86, 0x00, 0x00,
+ 0x00, 0x04, 0xdb, 0xf7, 0x1a, 0x08, 0xe3, 0xf6, 0x1c, 0x00,
+ 0x00, 0x66, 0xff, 0x8e, 0x00, 0x00, 0x62, 0xff, 0xa0, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000059 'Y'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x9c, 0xff, 0x64, 0x00, 0x00, 0x36, 0xff, 0xb8, 0x00,
+ 0x00, 0x21, 0xfa, 0xde, 0x05, 0x00, 0xa8, 0xff, 0x40, 0x00,
+ 0x00, 0x00, 0x9a, 0xff, 0x64, 0x1e, 0xfb, 0xc7, 0x00, 0x00,
+ 0x00, 0x00, 0x1e, 0xf9, 0xde, 0x91, 0xff, 0x50, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x96, 0xff, 0xfe, 0xd5, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x1b, 0xf8, 0xff, 0x60, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xc8, 0xff, 0x1c, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xc8, 0xff, 0x1c, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xc8, 0xff, 0x1c, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xc8, 0xff, 0x1c, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000005a 'Z'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x2c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x00,
+ 0x00, 0x16, 0x84, 0x84, 0x84, 0x87, 0xfa, 0xf8, 0x24, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x6e, 0xff, 0x84, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x19, 0xf1, 0xdf, 0x09, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xa6, 0xff, 0x50, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x43, 0xff, 0xb7, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x06, 0xd8, 0xf9, 0x25, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x7a, 0xff, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x1e, 0xf5, 0xff, 0x8f, 0x84, 0x84, 0x84, 0x52, 0x00,
+ 0x00, 0x58, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000005b '['
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xdc, 0x00, 0x00,
+ 0x00, 0x00, 0x1c, 0xff, 0xcb, 0x84, 0x84, 0x71, 0x00, 0x00,
+ 0x00, 0x00, 0x1c, 0xff, 0x94, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x1c, 0xff, 0x94, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x1c, 0xff, 0x94, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x1c, 0xff, 0x94, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x1c, 0xff, 0x94, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x1c, 0xff, 0x94, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x1c, 0xff, 0x94, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x1c, 0xff, 0x94, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x1c, 0xff, 0x94, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xdc, 0x00, 0x00,
+ 0x00, 0x00, 0x0e, 0x84, 0x84, 0x84, 0x84, 0x71, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000005c '\'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x03, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x0c, 0xd5, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xc4, 0xee, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x52, 0xff, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x02, 0xdc, 0xda, 0x01, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x6e, 0xff, 0x4c, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x0b, 0xef, 0xbc, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x8a, 0xff, 0x2f, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x1c, 0xfb, 0xa0, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xa8, 0xf9, 0x17, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x35, 0xff, 0x80, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xe8, 0x07, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x6c, 0x06, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000005d ']'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xd4, 0xff, 0xff, 0xff, 0xff, 0x18, 0x00, 0x00,
+ 0x00, 0x00, 0x6d, 0x84, 0x84, 0xcb, 0xff, 0x18, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x94, 0xff, 0x18, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x94, 0xff, 0x18, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x94, 0xff, 0x18, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x94, 0xff, 0x18, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x94, 0xff, 0x18, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x94, 0xff, 0x18, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x94, 0xff, 0x18, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x94, 0xff, 0x18, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x94, 0xff, 0x18, 0x00, 0x00,
+ 0x00, 0x00, 0xd8, 0xff, 0xff, 0xff, 0xff, 0x18, 0x00, 0x00,
+ 0x00, 0x00, 0x6f, 0x84, 0x84, 0x84, 0x84, 0x0c, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000005e '^'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x7a, 0xac, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x20, 0xf6, 0xff, 0x35, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xb2, 0xc9, 0xbd, 0xbc, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x4e, 0xff, 0x46, 0x48, 0xff, 0x44, 0x00, 0x00,
+ 0x00, 0x00, 0x53, 0xa3, 0x00, 0x00, 0xab, 0x47, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000005f '_'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x46, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x48, 0x00,
+ 0x00, 0x88, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8c, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000060 '`'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x14, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x03, 0xea, 0xa9, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xa7, 0xf9, 0x2a, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x40, 0xff, 0xe0, 0x0a, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xa5, 0xe9, 0x13, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000061 'a'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x19, 0xa6, 0xf2, 0xf6, 0xb6, 0x1c, 0x00, 0x00,
+ 0x00, 0x00, 0x8e, 0xf3, 0x98, 0xa0, 0xfe, 0xb8, 0x00, 0x00,
+ 0x00, 0x00, 0x09, 0x25, 0x00, 0x00, 0xbf, 0xfb, 0x04, 0x00,
+ 0x00, 0x00, 0x2b, 0xb0, 0xee, 0xff, 0xff, 0xff, 0x13, 0x00,
+ 0x00, 0x13, 0xee, 0xf5, 0xa3, 0x85, 0xd1, 0xff, 0x14, 0x00,
+ 0x00, 0x53, 0xff, 0x7b, 0x00, 0x07, 0xd2, 0xff, 0x14, 0x00,
+ 0x00, 0x36, 0xff, 0xe3, 0x8d, 0xd2, 0xff, 0xff, 0x14, 0x00,
+ 0x00, 0x00, 0x79, 0xea, 0xf4, 0xac, 0xbb, 0xff, 0x14, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000062 'b'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x34, 0xff, 0xa6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x34, 0xff, 0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x34, 0xff, 0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x34, 0xff, 0xbc, 0xcc, 0xfa, 0xbf, 0x28, 0x00, 0x00,
+ 0x00, 0x34, 0xff, 0xff, 0xa5, 0xa4, 0xff, 0xdf, 0x07, 0x00,
+ 0x00, 0x34, 0xff, 0xc4, 0x00, 0x00, 0xa3, 0xff, 0x4e, 0x00,
+ 0x00, 0x34, 0xff, 0x98, 0x00, 0x00, 0x61, 0xff, 0x70, 0x00,
+ 0x00, 0x34, 0xff, 0x9a, 0x00, 0x00, 0x5e, 0xff, 0x66, 0x00,
+ 0x00, 0x34, 0xff, 0xcf, 0x00, 0x00, 0xa3, 0xff, 0x33, 0x00,
+ 0x00, 0x34, 0xff, 0xff, 0xae, 0xa7, 0xff, 0xc0, 0x00, 0x00,
+ 0x00, 0x34, 0xff, 0x7b, 0xda, 0xf4, 0xa9, 0x12, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000063 'c'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x03, 0x7b, 0xe0, 0xfc, 0xd9, 0x67, 0x00, 0x00,
+ 0x00, 0x00, 0x98, 0xff, 0xc9, 0x8a, 0xd5, 0xff, 0x2f, 0x00,
+ 0x00, 0x21, 0xfe, 0xcf, 0x05, 0x00, 0x0c, 0x6d, 0x00, 0x00,
+ 0x00, 0x59, 0xff, 0x7b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x5a, 0xff, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x22, 0xfe, 0xd3, 0x06, 0x00, 0x07, 0x3a, 0x00, 0x00,
+ 0x00, 0x00, 0x9a, 0xff, 0xcd, 0x8c, 0xd7, 0xf5, 0x1b, 0x00,
+ 0x00, 0x00, 0x03, 0x7e, 0xe0, 0xf7, 0xd0, 0x58, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000064 'd'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xff, 0x3a, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xff, 0x2c, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xff, 0x2c, 0x00,
+ 0x00, 0x00, 0x1d, 0xb8, 0xfa, 0xcd, 0xc5, 0xff, 0x2c, 0x00,
+ 0x00, 0x04, 0xd3, 0xfe, 0x9f, 0xac, 0xff, 0xff, 0x2c, 0x00,
+ 0x00, 0x4a, 0xff, 0x97, 0x00, 0x00, 0xcf, 0xff, 0x2c, 0x00,
+ 0x00, 0x79, 0xff, 0x54, 0x00, 0x00, 0xa1, 0xff, 0x2c, 0x00,
+ 0x00, 0x7c, 0xff, 0x53, 0x00, 0x00, 0xa7, 0xff, 0x2c, 0x00,
+ 0x00, 0x55, 0xff, 0x94, 0x00, 0x01, 0xda, 0xff, 0x2c, 0x00,
+ 0x00, 0x09, 0xe3, 0xfe, 0xa0, 0xb5, 0xff, 0xff, 0x2c, 0x00,
+ 0x00, 0x00, 0x2a, 0xbe, 0xf9, 0xd3, 0xb6, 0xff, 0x37, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000065 'e'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x0c, 0x97, 0xee, 0xf7, 0xad, 0x15, 0x00, 0x00,
+ 0x00, 0x00, 0xb2, 0xfd, 0xa0, 0x9b, 0xfc, 0xbe, 0x00, 0x00,
+ 0x00, 0x2b, 0xff, 0x96, 0x00, 0x00, 0x97, 0xff, 0x27, 0x00,
+ 0x00, 0x5e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x49, 0x00,
+ 0x00, 0x5f, 0xff, 0xb8, 0x84, 0x84, 0x84, 0x84, 0x25, 0x00,
+ 0x00, 0x2e, 0xff, 0xb7, 0x00, 0x00, 0x07, 0x1e, 0x00, 0x00,
+ 0x00, 0x00, 0xaf, 0xff, 0xbe, 0x8d, 0xd8, 0xde, 0x06, 0x00,
+ 0x00, 0x00, 0x08, 0x8d, 0xe2, 0xf5, 0xc4, 0x37, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000066 'f'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x30, 0xc3, 0xf9, 0xe3, 0x69, 0x00,
+ 0x00, 0x00, 0x00, 0x0c, 0xea, 0xf4, 0x91, 0xb3, 0xf8, 0x15,
+ 0x00, 0x00, 0x00, 0x46, 0xff, 0x86, 0x00, 0x00, 0x39, 0x00,
+ 0x00, 0x00, 0x7b, 0xac, 0xff, 0xb8, 0x84, 0x5c, 0x00, 0x00,
+ 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xb4, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x54, 0xff, 0x6c, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x54, 0xff, 0x6c, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x54, 0xff, 0x6c, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x54, 0xff, 0x6c, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x54, 0xff, 0x6c, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x54, 0xff, 0x6c, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000067 'g'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x15, 0xad, 0xf8, 0xe0, 0x96, 0xed, 0xa4, 0x00,
+ 0x00, 0x00, 0xb9, 0xf8, 0x91, 0xcf, 0xff, 0xbb, 0x76, 0x00,
+ 0x00, 0x0f, 0xff, 0x9e, 0x00, 0x2c, 0xff, 0x7d, 0x00, 0x00,
+ 0x00, 0x06, 0xf4, 0xcc, 0x11, 0x69, 0xff, 0x6d, 0x00, 0x00,
+ 0x00, 0x00, 0x70, 0xff, 0xff, 0xff, 0xd2, 0x0d, 0x00, 0x00,
+ 0x00, 0x00, 0xa3, 0xde, 0x7d, 0x61, 0x09, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xf3, 0xda, 0x86, 0x83, 0x6d, 0x1d, 0x00, 0x00,
+ 0x00, 0x00, 0xc5, 0xfb, 0xfd, 0xff, 0xff, 0xf3, 0x20, 0x00,
+ 0x00, 0x58, 0xff, 0x46, 0x00, 0x00, 0x64, 0xff, 0x5c, 0x00,
+ 0x00, 0x61, 0xff, 0xce, 0x8c, 0x91, 0xe2, 0xf9, 0x23, 0x00,
+ 0x00, 0x03, 0x7e, 0xd9, 0xf9, 0xf2, 0xc0, 0x40, 0x00, 0x00,
+
+ // U+00000068 'h'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x08, 0xff, 0xd2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x08, 0xff, 0xc4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x08, 0xff, 0xc4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x08, 0xff, 0xcd, 0xa0, 0xf6, 0xe2, 0x48, 0x00, 0x00,
+ 0x00, 0x08, 0xff, 0xff, 0xce, 0x91, 0xf9, 0xe8, 0x03, 0x00,
+ 0x00, 0x08, 0xff, 0xee, 0x0c, 0x00, 0xa8, 0xff, 0x25, 0x00,
+ 0x00, 0x08, 0xff, 0xc5, 0x00, 0x00, 0x91, 0xff, 0x33, 0x00,
+ 0x00, 0x08, 0xff, 0xc4, 0x00, 0x00, 0x90, 0xff, 0x34, 0x00,
+ 0x00, 0x08, 0xff, 0xc4, 0x00, 0x00, 0x90, 0xff, 0x34, 0x00,
+ 0x00, 0x08, 0xff, 0xc4, 0x00, 0x00, 0x90, 0xff, 0x34, 0x00,
+ 0x00, 0x08, 0xff, 0xc4, 0x00, 0x00, 0x90, 0xff, 0x34, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000069 'i'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x9f, 0xef, 0x2d, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xb5, 0xfc, 0x39, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x60, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x31, 0x84, 0xd5, 0xff, 0x20, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xa8, 0xff, 0x20, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xa8, 0xff, 0x20, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xa8, 0xff, 0x20, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xa8, 0xff, 0x20, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x3b, 0x84, 0xd5, 0xff, 0x93, 0x65, 0x00, 0x00,
+ 0x00, 0x00, 0x74, 0xff, 0xff, 0xff, 0xff, 0xc4, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000006a 'j'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x01, 0xc8, 0xe1, 0x14, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x03, 0xdf, 0xf4, 0x1d, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x11, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x68, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x35, 0x84, 0x84, 0xe8, 0xfc, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0xfc, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0xfc, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0xfc, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0xfc, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0xfc, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xd1, 0xfa, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x57, 0x00, 0x04, 0xeb, 0xe2, 0x00, 0x00, 0x00,
+ 0x00, 0x48, 0xff, 0xb0, 0xb5, 0xff, 0x8e, 0x00, 0x00, 0x00,
+ 0x00, 0x0b, 0x9a, 0xf1, 0xec, 0x97, 0x08, 0x00, 0x00, 0x00,
+
+ // U+0000006b 'k'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x08, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x08, 0xff, 0xc4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x08, 0xff, 0xc4, 0x00, 0x00, 0x0c, 0x04, 0x00, 0x00,
+ 0x00, 0x08, 0xff, 0xc4, 0x00, 0x19, 0xde, 0xf8, 0x45, 0x00,
+ 0x00, 0x08, 0xff, 0xc4, 0x10, 0xd1, 0xfb, 0x4e, 0x00, 0x00,
+ 0x00, 0x08, 0xff, 0xcd, 0xc4, 0xfd, 0x57, 0x00, 0x00, 0x00,
+ 0x00, 0x08, 0xff, 0xff, 0xff, 0xdf, 0x0a, 0x00, 0x00, 0x00,
+ 0x00, 0x08, 0xff, 0xf8, 0xb7, 0xff, 0x97, 0x00, 0x00, 0x00,
+ 0x00, 0x08, 0xff, 0xc4, 0x08, 0xd6, 0xff, 0x48, 0x00, 0x00,
+ 0x00, 0x08, 0xff, 0xc4, 0x00, 0x34, 0xfb, 0xe4, 0x11, 0x00,
+ 0x00, 0x08, 0xff, 0xc4, 0x00, 0x00, 0x80, 0xff, 0xa9, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000006c 'l'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xd4, 0xff, 0xff, 0xec, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x6d, 0x84, 0xf0, 0xec, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe0, 0xec, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe0, 0xec, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe0, 0xec, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe0, 0xec, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe0, 0xec, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe0, 0xec, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe0, 0xec, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x79, 0x84, 0xf0, 0xf6, 0x84, 0x7f, 0x00, 0x00,
+ 0x00, 0x00, 0xec, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000006d 'm'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x7c, 0xff, 0xc8, 0xf9, 0x97, 0xde, 0xf1, 0x3c, 0x00,
+ 0x00, 0x7c, 0xff, 0x79, 0xe7, 0xfe, 0x6b, 0xff, 0x95, 0x00,
+ 0x00, 0x7c, 0xff, 0x21, 0xc2, 0xeb, 0x05, 0xff, 0xa6, 0x00,
+ 0x00, 0x7c, 0xff, 0x20, 0xc0, 0xe8, 0x04, 0xff, 0xa8, 0x00,
+ 0x00, 0x7c, 0xff, 0x20, 0xc0, 0xe8, 0x04, 0xff, 0xa8, 0x00,
+ 0x00, 0x7c, 0xff, 0x20, 0xc0, 0xe8, 0x04, 0xff, 0xa8, 0x00,
+ 0x00, 0x7c, 0xff, 0x20, 0xc0, 0xe8, 0x04, 0xff, 0xa8, 0x00,
+ 0x00, 0x7c, 0xff, 0x20, 0xc0, 0xe8, 0x04, 0xff, 0xa8, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000006e 'n'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x08, 0xff, 0xd1, 0xa6, 0xf8, 0xe1, 0x47, 0x00, 0x00,
+ 0x00, 0x08, 0xff, 0xff, 0xce, 0x91, 0xf9, 0xe8, 0x03, 0x00,
+ 0x00, 0x08, 0xff, 0xee, 0x0c, 0x00, 0xa8, 0xff, 0x25, 0x00,
+ 0x00, 0x08, 0xff, 0xc5, 0x00, 0x00, 0x91, 0xff, 0x33, 0x00,
+ 0x00, 0x08, 0xff, 0xc4, 0x00, 0x00, 0x90, 0xff, 0x34, 0x00,
+ 0x00, 0x08, 0xff, 0xc4, 0x00, 0x00, 0x90, 0xff, 0x34, 0x00,
+ 0x00, 0x08, 0xff, 0xc4, 0x00, 0x00, 0x90, 0xff, 0x34, 0x00,
+ 0x00, 0x08, 0xff, 0xc4, 0x00, 0x00, 0x90, 0xff, 0x34, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000006f 'o'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x0d, 0x98, 0xf0, 0xf4, 0xac, 0x19, 0x00, 0x00,
+ 0x00, 0x01, 0xbc, 0xfe, 0xa2, 0xa0, 0xfe, 0xd2, 0x03, 0x00,
+ 0x00, 0x42, 0xff, 0x9e, 0x00, 0x00, 0x93, 0xff, 0x4d, 0x00,
+ 0x00, 0x7d, 0xff, 0x59, 0x00, 0x00, 0x4b, 0xff, 0x80, 0x00,
+ 0x00, 0x7e, 0xff, 0x58, 0x00, 0x00, 0x46, 0xff, 0x7e, 0x00,
+ 0x00, 0x49, 0xff, 0xa1, 0x00, 0x00, 0x8a, 0xff, 0x4e, 0x00,
+ 0x00, 0x02, 0xc3, 0xff, 0xaa, 0xa0, 0xfd, 0xd2, 0x03, 0x00,
+ 0x00, 0x00, 0x0e, 0x9a, 0xed, 0xf1, 0xa8, 0x19, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000070 'p'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x20, 0xff, 0xba, 0xca, 0xfb, 0xc3, 0x28, 0x00, 0x00,
+ 0x00, 0x20, 0xff, 0xff, 0xb1, 0x99, 0xfb, 0xe2, 0x09, 0x00,
+ 0x00, 0x20, 0xff, 0xdc, 0x01, 0x00, 0x87, 0xff, 0x56, 0x00,
+ 0x00, 0x20, 0xff, 0xb0, 0x00, 0x00, 0x47, 0xff, 0x83, 0x00,
+ 0x00, 0x20, 0xff, 0xb2, 0x00, 0x00, 0x47, 0xff, 0x87, 0x00,
+ 0x00, 0x20, 0xff, 0xe4, 0x03, 0x00, 0x8a, 0xff, 0x5f, 0x00,
+ 0x00, 0x20, 0xff, 0xff, 0xba, 0x9c, 0xfc, 0xe7, 0x0d, 0x00,
+ 0x00, 0x20, 0xff, 0xcc, 0xc6, 0xf8, 0xc2, 0x2d, 0x00, 0x00,
+ 0x00, 0x20, 0xff, 0xac, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x20, 0xff, 0xac, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x1e, 0xff, 0xac, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000071 'q'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x27, 0xbf, 0xfb, 0xd0, 0xbf, 0xff, 0x28, 0x00,
+ 0x00, 0x08, 0xde, 0xfc, 0x99, 0xbd, 0xff, 0xff, 0x28, 0x00,
+ 0x00, 0x56, 0xff, 0x8d, 0x00, 0x04, 0xe3, 0xff, 0x28, 0x00,
+ 0x00, 0x81, 0xff, 0x4d, 0x00, 0x00, 0xb4, 0xff, 0x28, 0x00,
+ 0x00, 0x7d, 0xff, 0x54, 0x00, 0x00, 0xb7, 0xff, 0x28, 0x00,
+ 0x00, 0x49, 0xff, 0xa0, 0x00, 0x05, 0xe8, 0xff, 0x28, 0x00,
+ 0x00, 0x03, 0xd2, 0xff, 0xa2, 0xbe, 0xff, 0xff, 0x28, 0x00,
+ 0x00, 0x00, 0x1e, 0xb8, 0xf8, 0xcc, 0xc8, 0xff, 0x28, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xff, 0x28, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xff, 0x28, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xff, 0x28, 0x00,
+
+ // U+00000072 'r'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x94, 0xff, 0x90, 0xdb, 0xfc, 0xcd, 0x35, 0x00,
+ 0x00, 0x00, 0x94, 0xff, 0xff, 0xb5, 0x9d, 0xfd, 0x2e, 0x00,
+ 0x00, 0x00, 0x94, 0xff, 0xa2, 0x00, 0x00, 0x47, 0x00, 0x00,
+ 0x00, 0x00, 0x94, 0xff, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x94, 0xff, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x94, 0xff, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x94, 0xff, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x94, 0xff, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000073 's'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x07, 0x8d, 0xec, 0xf7, 0xc0, 0x36, 0x00, 0x00,
+ 0x00, 0x00, 0x8e, 0xfd, 0x99, 0x91, 0xe3, 0xe4, 0x03, 0x00,
+ 0x00, 0x00, 0xbe, 0xf4, 0x2d, 0x00, 0x10, 0x4c, 0x00, 0x00,
+ 0x00, 0x00, 0x52, 0xfa, 0xff, 0xd6, 0x7f, 0x0d, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x27, 0x8d, 0xde, 0xff, 0xcf, 0x04, 0x00,
+ 0x00, 0x00, 0x86, 0x23, 0x00, 0x02, 0xbf, 0xff, 0x27, 0x00,
+ 0x00, 0x15, 0xfa, 0xf3, 0x9d, 0x93, 0xf2, 0xde, 0x04, 0x00,
+ 0x00, 0x00, 0x44, 0xbf, 0xf4, 0xf2, 0xb2, 0x23, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000074 't'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x02, 0x16, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x44, 0xf6, 0x8d, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x5e, 0xff, 0x6c, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x18, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x00, 0x00,
+ 0x00, 0x0c, 0x84, 0xc2, 0xff, 0xa7, 0x84, 0x52, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x8e, 0xff, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x99, 0xff, 0x30, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xa0, 0xff, 0x30, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x98, 0xff, 0x40, 0x00, 0x2d, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x6a, 0xff, 0xc7, 0xae, 0xfa, 0x15, 0x00,
+ 0x00, 0x00, 0x00, 0x09, 0xae, 0xf8, 0xe2, 0x80, 0x09, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000075 'u'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x30, 0xff, 0x94, 0x00, 0x00, 0xc0, 0xff, 0x10, 0x00,
+ 0x00, 0x30, 0xff, 0x94, 0x00, 0x00, 0xc0, 0xff, 0x10, 0x00,
+ 0x00, 0x30, 0xff, 0x94, 0x00, 0x00, 0xc0, 0xff, 0x10, 0x00,
+ 0x00, 0x30, 0xff, 0x94, 0x00, 0x00, 0xc0, 0xff, 0x10, 0x00,
+ 0x00, 0x30, 0xff, 0x94, 0x00, 0x00, 0xc1, 0xff, 0x10, 0x00,
+ 0x00, 0x26, 0xff, 0xab, 0x00, 0x0c, 0xec, 0xff, 0x10, 0x00,
+ 0x00, 0x03, 0xe8, 0xfb, 0x98, 0xcf, 0xff, 0xff, 0x10, 0x00,
+ 0x00, 0x00, 0x47, 0xde, 0xf8, 0xb0, 0xbc, 0xff, 0x1b, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000076 'v'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x6c, 0xff, 0x82, 0x00, 0x00, 0x55, 0xff, 0x5b, 0x00,
+ 0x00, 0x16, 0xfb, 0xbe, 0x00, 0x00, 0x94, 0xfe, 0x17, 0x00,
+ 0x00, 0x00, 0xb8, 0xfc, 0x15, 0x00, 0xdc, 0xc8, 0x00, 0x00,
+ 0x00, 0x00, 0x5e, 0xff, 0x68, 0x27, 0xff, 0x6e, 0x00, 0x00,
+ 0x00, 0x00, 0x0c, 0xf5, 0xbe, 0x7a, 0xf9, 0x12, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xa8, 0xfc, 0xdb, 0xaa, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x4e, 0xff, 0xff, 0x46, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x05, 0xec, 0xe1, 0x02, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000077 'w'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xca, 0xf8, 0x04, 0x06, 0x0a, 0x00, 0xe5, 0xbe, 0x00,
+ 0x00, 0x9e, 0xff, 0x10, 0x8a, 0xca, 0x00, 0xe9, 0x9f, 0x00,
+ 0x00, 0x70, 0xff, 0x32, 0xbe, 0xfa, 0x09, 0xf5, 0x7f, 0x00,
+ 0x00, 0x42, 0xff, 0x56, 0xef, 0xf7, 0x47, 0xff, 0x5c, 0x00,
+ 0x00, 0x16, 0xff, 0x9c, 0xe6, 0xb6, 0x9a, 0xff, 0x38, 0x00,
+ 0x00, 0x00, 0xe8, 0xed, 0xb0, 0x7c, 0xec, 0xff, 0x10, 0x00,
+ 0x00, 0x00, 0xba, 0xff, 0x7a, 0x44, 0xff, 0xe7, 0x00, 0x00,
+ 0x00, 0x00, 0x8c, 0xff, 0x46, 0x0d, 0xfc, 0xbd, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000078 'x'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x41, 0xff, 0xbc, 0x00, 0x04, 0xd7, 0xf2, 0x1a, 0x00,
+ 0x00, 0x00, 0x9c, 0xff, 0x4e, 0x6a, 0xff, 0x72, 0x00, 0x00,
+ 0x00, 0x00, 0x11, 0xe7, 0xdd, 0xe9, 0xd1, 0x03, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x52, 0xff, 0xff, 0x3c, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x5e, 0xff, 0xff, 0x5a, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x15, 0xec, 0xd9, 0xde, 0xec, 0x15, 0x00, 0x00,
+ 0x00, 0x00, 0xa6, 0xff, 0x4c, 0x4e, 0xff, 0xa9, 0x00, 0x00,
+ 0x00, 0x48, 0xff, 0xbb, 0x00, 0x00, 0xb0, 0xff, 0x54, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000079 'y'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x54, 0xff, 0xa1, 0x00, 0x00, 0x3b, 0xff, 0x75, 0x00,
+ 0x00, 0x08, 0xf0, 0xde, 0x00, 0x00, 0x78, 0xff, 0x2b, 0x00,
+ 0x00, 0x00, 0xa0, 0xff, 0x34, 0x00, 0xbe, 0xdb, 0x00, 0x00,
+ 0x00, 0x00, 0x46, 0xff, 0x8c, 0x14, 0xfc, 0x84, 0x00, 0x00,
+ 0x00, 0x00, 0x03, 0xe6, 0xe2, 0x69, 0xff, 0x29, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x90, 0xff, 0xe6, 0xce, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x36, 0xff, 0xff, 0x72, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xd9, 0xfc, 0x18, 0x00, 0x00, 0x00,
+ 0x00, 0x07, 0x1a, 0x09, 0xea, 0xba, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x78, 0xc6, 0xba, 0xff, 0x4e, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x58, 0xe0, 0xf2, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000007a 'z'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00,
+ 0x00, 0x00, 0x84, 0x84, 0x84, 0xd0, 0xff, 0xb2, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x2f, 0xf8, 0xe6, 0x14, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x09, 0xd6, 0xfe, 0x44, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x98, 0xff, 0x8c, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x50, 0xff, 0xcf, 0x06, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x1a, 0xec, 0xff, 0xaa, 0x84, 0x84, 0x84, 0x29, 0x00,
+ 0x00, 0x50, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000007b '{'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x03, 0x8b, 0xec, 0xff, 0xac, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x66, 0xff, 0xc0, 0x84, 0x58, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xa3, 0xff, 0x23, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xab, 0xff, 0x1b, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xb0, 0xfe, 0x11, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x25, 0x90, 0xf8, 0xad, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x48, 0xff, 0xff, 0x56, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x09, 0xd4, 0xe6, 0x01, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xaf, 0xff, 0x14, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xb6, 0xff, 0x11, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xae, 0xff, 0x27, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x70, 0xff, 0xd3, 0x89, 0x56, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x06, 0x97, 0xe9, 0xff, 0xa8, 0x00, 0x00,
+
+ // U+0000007c '|'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xd8, 0xe0, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xd8, 0xe0, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xd8, 0xe0, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xd8, 0xe0, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xd8, 0xe0, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xd8, 0xe0, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xd8, 0xe0, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xd8, 0xe0, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xd8, 0xe0, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xd8, 0xe0, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xd8, 0xe0, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xd8, 0xe0, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xd8, 0xe0, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xd8, 0xe0, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000007d '}'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xa8, 0xff, 0xec, 0x8e, 0x03, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x56, 0x84, 0xbe, 0xff, 0x69, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xa9, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x19, 0xff, 0xac, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xb5, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xf9, 0x90, 0x27, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0xff, 0xff, 0x4c, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x01, 0xe4, 0xd9, 0x09, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x12, 0xff, 0xb4, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xb9, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x27, 0xff, 0xb3, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x54, 0x89, 0xd2, 0xff, 0x71, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xa4, 0xff, 0xe9, 0x98, 0x06, 0x00, 0x00, 0x00,
+
+ // U+0000007e '~'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x71, 0xee, 0xe2, 0x5c, 0x1a, 0xb8, 0x43, 0x00,
+ 0x00, 0x4d, 0xff, 0xae, 0xbb, 0xff, 0xff, 0xf5, 0x41, 0x00,
+ 0x00, 0x00, 0x37, 0x00, 0x00, 0x4f, 0x7a, 0x26, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000008e 'Ž'
+ 0x00, 0x00, 0x0e, 0x41, 0x00, 0x02, 0x43, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x2f, 0xed, 0xa5, 0xcf, 0xbb, 0x06, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x28, 0xde, 0x99, 0x04, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x2c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x00,
+ 0x00, 0x16, 0x84, 0x84, 0x84, 0x87, 0xfa, 0xf8, 0x24, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x6e, 0xff, 0x84, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x19, 0xf1, 0xdf, 0x09, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xa6, 0xff, 0x50, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x43, 0xff, 0xb7, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x06, 0xd8, 0xf9, 0x25, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x7a, 0xff, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x1e, 0xf5, 0xff, 0x8f, 0x84, 0x84, 0x84, 0x52, 0x00,
+ 0x00, 0x58, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000009e 'ž'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x54, 0x20, 0x04, 0x63, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xae, 0xd2, 0x9f, 0xd2, 0x08, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x10, 0xde, 0xf2, 0x26, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x2f, 0x44, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00,
+ 0x00, 0x00, 0x84, 0x84, 0x84, 0xd0, 0xff, 0xb2, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x2f, 0xf8, 0xe6, 0x14, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x09, 0xd6, 0xfe, 0x44, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x98, 0xff, 0x8c, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x50, 0xff, 0xcf, 0x06, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x1a, 0xec, 0xff, 0xaa, 0x84, 0x84, 0x84, 0x29, 0x00,
+ 0x00, 0x50, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000a0 ' '
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000a1 '¡'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x33, 0xee, 0xc6, 0x04, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x3f, 0xfc, 0xe0, 0x06, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x15, 0x07, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe8, 0x98, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xf6, 0xa8, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x02, 0xff, 0xb8, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x0e, 0xff, 0xc8, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x19, 0xff, 0xd8, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x2e, 0xff, 0xea, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x41, 0xff, 0xf4, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x13, 0xe1, 0xa4, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000a2 '¢'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0xcb, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x18, 0xf9, 0xae, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x0d, 0xab, 0xfe, 0xff, 0xfe, 0x9f, 0x04, 0x00,
+ 0x00, 0x00, 0xaf, 0xff, 0xc8, 0xff, 0xde, 0xf7, 0x22, 0x00,
+ 0x00, 0x28, 0xff, 0xbf, 0x5a, 0xff, 0x49, 0x4d, 0x00, 0x00,
+ 0x00, 0x59, 0xff, 0x7a, 0x78, 0xff, 0x28, 0x00, 0x00, 0x00,
+ 0x00, 0x56, 0xff, 0x86, 0x96, 0xff, 0x09, 0x00, 0x00, 0x00,
+ 0x00, 0x1b, 0xfc, 0xdf, 0xc1, 0xea, 0x0a, 0x50, 0x00, 0x00,
+ 0x00, 0x00, 0x91, 0xff, 0xff, 0xf1, 0xde, 0xfd, 0x28, 0x00,
+ 0x00, 0x00, 0x03, 0x7e, 0xfe, 0xfc, 0xd7, 0x63, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x0c, 0xff, 0x8c, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x12, 0x92, 0x4b, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000a3 '£'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x52, 0xd8, 0xfd, 0xd5, 0x43, 0x00, 0x00,
+ 0x00, 0x00, 0x2a, 0xfc, 0xe0, 0x8a, 0xde, 0x8a, 0x00, 0x00,
+ 0x00, 0x00, 0x60, 0xff, 0x5d, 0x00, 0x0c, 0x00, 0x00, 0x00,
+ 0x00, 0x0c, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x06, 0x84, 0xfd, 0xe2, 0x84, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xe7, 0xd1, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xed, 0xcf, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x30, 0xff, 0xa0, 0x01, 0x00, 0x08, 0x04, 0x00,
+ 0x00, 0x3a, 0xe0, 0xff, 0xff, 0xe8, 0x99, 0xce, 0x5c, 0x00,
+ 0x00, 0x2c, 0xd3, 0x71, 0x6d, 0xb7, 0xf4, 0xd3, 0x45, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000a4 '¤'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
+ 0x00, 0x06, 0xb4, 0x75, 0x6f, 0x71, 0x79, 0xb3, 0x06, 0x00,
+ 0x00, 0x02, 0xb0, 0xff, 0xff, 0xff, 0xff, 0xae, 0x01, 0x00,
+ 0x00, 0x00, 0x80, 0xf5, 0x2a, 0x2a, 0xf6, 0x85, 0x00, 0x00,
+ 0x00, 0x00, 0x9a, 0xdf, 0x00, 0x00, 0xe0, 0x9c, 0x00, 0x00,
+ 0x00, 0x00, 0x76, 0xff, 0xaf, 0xaf, 0xff, 0x77, 0x00, 0x00,
+ 0x00, 0x08, 0xea, 0xda, 0xeb, 0xee, 0xdc, 0xe8, 0x08, 0x00,
+ 0x00, 0x00, 0x38, 0x14, 0x00, 0x00, 0x15, 0x38, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000a5 '¥'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x6c, 0xff, 0x88, 0x00, 0x00, 0x66, 0xff, 0x72, 0x00,
+ 0x00, 0x03, 0xce, 0xf6, 0x1c, 0x06, 0xe1, 0xd9, 0x05, 0x00,
+ 0x00, 0x00, 0x38, 0xfe, 0x9e, 0x6a, 0xff, 0x50, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x9e, 0xfd, 0xeb, 0xbf, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x20, 0x3c, 0xf7, 0xff, 0x5a, 0x26, 0x00, 0x00,
+ 0x00, 0x00, 0xd0, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00,
+ 0x00, 0x00, 0x44, 0x54, 0xd5, 0xff, 0x54, 0x51, 0x00, 0x00,
+ 0x00, 0x00, 0xd0, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00,
+ 0x00, 0x00, 0x6b, 0x84, 0xe1, 0xff, 0x84, 0x7f, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000a6 '¦'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xd8, 0xe0, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xd8, 0xe0, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xd8, 0xe0, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xd8, 0xe0, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xd8, 0xe0, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xd8, 0xe0, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xd8, 0xe0, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xd8, 0xe0, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xd8, 0xe0, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xd8, 0xe0, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xd8, 0xe0, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xd8, 0xe0, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000a7 '§'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x02, 0x84, 0xee, 0xf4, 0x98, 0x07, 0x00, 0x00,
+ 0x00, 0x00, 0x67, 0xff, 0xbf, 0xac, 0xff, 0x93, 0x00, 0x00,
+ 0x00, 0x00, 0xa6, 0xff, 0x2f, 0x00, 0xb2, 0x30, 0x00, 0x00,
+ 0x00, 0x00, 0x62, 0xff, 0xcf, 0x4d, 0x03, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x2e, 0xf0, 0xfe, 0xff, 0xd6, 0x21, 0x00, 0x00,
+ 0x00, 0x00, 0xc8, 0xf5, 0x16, 0x91, 0xff, 0xb0, 0x00, 0x00,
+ 0x00, 0x00, 0xcc, 0xff, 0x77, 0x17, 0xff, 0xbe, 0x00, 0x00,
+ 0x00, 0x00, 0x38, 0xe3, 0xff, 0xfd, 0xf8, 0x34, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x07, 0x53, 0xc9, 0xff, 0x6c, 0x00, 0x00,
+ 0x00, 0x00, 0x5c, 0x46, 0x00, 0x23, 0xff, 0xa6, 0x00, 0x00,
+ 0x00, 0x06, 0xe7, 0xf2, 0x95, 0xc2, 0xff, 0x63, 0x00, 0x00,
+ 0x00, 0x00, 0x2b, 0xb8, 0xf3, 0xe6, 0x7b, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000a8 '¨'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x55, 0xf6, 0x69, 0x62, 0xf6, 0x5a, 0x00, 0x00,
+ 0x00, 0x00, 0x69, 0xff, 0x82, 0x79, 0xff, 0x6f, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000a9 '©'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x15, 0xa1, 0xf1, 0xf2, 0xa4, 0x16, 0x00, 0x00,
+ 0x00, 0x0c, 0xd6, 0xec, 0x96, 0x92, 0xe8, 0xd8, 0x0d, 0x00,
+ 0x00, 0x7d, 0xdf, 0x71, 0xeb, 0xeb, 0x78, 0xd8, 0x82, 0x00,
+ 0x00, 0xce, 0x79, 0xf7, 0xbf, 0xb2, 0xfb, 0x71, 0xd4, 0x00,
+ 0x00, 0xe8, 0x7f, 0xff, 0x2e, 0x0d, 0x57, 0x33, 0xee, 0x00,
+ 0x00, 0xd1, 0x92, 0xff, 0x66, 0x29, 0x82, 0x61, 0xd3, 0x00,
+ 0x00, 0x7f, 0xe0, 0xd2, 0xff, 0xff, 0xe2, 0xe1, 0x7f, 0x00,
+ 0x00, 0x0c, 0xd9, 0xf5, 0xfa, 0xfb, 0xf7, 0xd3, 0x09, 0x00,
+ 0x00, 0x00, 0x17, 0xa2, 0xf1, 0xec, 0x9d, 0x13, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000aa 'ª'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x7a, 0xeb, 0xf7, 0xa1, 0x04, 0x00, 0x00,
+ 0x00, 0x00, 0x10, 0xbb, 0x94, 0xa7, 0xff, 0x53, 0x00, 0x00,
+ 0x00, 0x00, 0x0a, 0x98, 0xee, 0xff, 0xff, 0x72, 0x00, 0x00,
+ 0x00, 0x00, 0x77, 0xff, 0xb9, 0x94, 0xff, 0x74, 0x00, 0x00,
+ 0x00, 0x00, 0x88, 0xff, 0x29, 0x68, 0xff, 0x74, 0x00, 0x00,
+ 0x00, 0x00, 0x27, 0xe9, 0xff, 0xf5, 0xff, 0x74, 0x00, 0x00,
+ 0x00, 0x00, 0x0e, 0x1a, 0x41, 0x21, 0x48, 0x28, 0x00, 0x00,
+ 0x00, 0x00, 0xe4, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x00, 0x00,
+ 0x00, 0x00, 0x39, 0x40, 0x40, 0x40, 0x40, 0x3d, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000ab '«'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x16, 0xbb, 0x1f, 0x49, 0xa6, 0x02, 0x00,
+ 0x00, 0x00, 0x15, 0xd5, 0xf5, 0x84, 0xf8, 0xd0, 0x0f, 0x00,
+ 0x00, 0x04, 0xd2, 0xf7, 0x75, 0xf6, 0xd0, 0x13, 0x00, 0x00,
+ 0x00, 0x02, 0xc1, 0xfb, 0x6f, 0xf0, 0xd7, 0x12, 0x00, 0x00,
+ 0x00, 0x00, 0x11, 0xd6, 0xf3, 0x73, 0xf9, 0xc5, 0x08, 0x00,
+ 0x00, 0x00, 0x00, 0x1e, 0xe1, 0x4f, 0x5a, 0xdc, 0x17, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x0b, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000ac '¬'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x5c, 0x84, 0x84, 0x84, 0x84, 0x67, 0x00, 0x00,
+ 0x00, 0x00, 0xb4, 0xff, 0xff, 0xff, 0xff, 0xc8, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe4, 0xc8, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe4, 0xc8, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000ad '­'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x7f, 0x84, 0x84, 0x84, 0x84, 0x84, 0x04, 0x00,
+ 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x08, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000ae '®'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x15, 0xa1, 0xf1, 0xf2, 0xa4, 0x16, 0x00, 0x00,
+ 0x00, 0x0c, 0xd6, 0xec, 0x96, 0x92, 0xe8, 0xd8, 0x0d, 0x00,
+ 0x00, 0x7d, 0xdf, 0xb5, 0xff, 0xed, 0x76, 0xd8, 0x82, 0x00,
+ 0x00, 0xce, 0x66, 0x9c, 0xc0, 0xc3, 0xd6, 0x55, 0xd4, 0x00,
+ 0x00, 0xe8, 0x3c, 0x9c, 0xff, 0xff, 0xa8, 0x2c, 0xee, 0x00,
+ 0x00, 0xd1, 0x65, 0x9c, 0xc1, 0xf4, 0x48, 0x59, 0xd3, 0x00,
+ 0x00, 0x7f, 0xe0, 0x91, 0x5e, 0x62, 0xac, 0xdc, 0x7f, 0x00,
+ 0x00, 0x0c, 0xd9, 0xed, 0x9a, 0x97, 0xec, 0xd3, 0x09, 0x00,
+ 0x00, 0x00, 0x17, 0xa2, 0xf1, 0xec, 0x9d, 0x13, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000af '¯'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x44, 0xff, 0xff, 0xff, 0xff, 0x38, 0x00, 0x00,
+ 0x00, 0x00, 0x23, 0x84, 0x84, 0x84, 0x84, 0x1c, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000b0 '°'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x5d, 0xe8, 0xf3, 0x83, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x1b, 0xfc, 0xc2, 0xa9, 0xff, 0x47, 0x00, 0x00,
+ 0x00, 0x00, 0x37, 0xff, 0x66, 0x32, 0xff, 0x68, 0x00, 0x00,
+ 0x00, 0x00, 0x04, 0xd0, 0xff, 0xff, 0xe9, 0x17, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x0e, 0x6b, 0x73, 0x1a, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000b1 '±'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xc8, 0xe4, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xc8, 0xe4, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x33, 0x84, 0x84, 0xe4, 0xf2, 0x84, 0x84, 0x33, 0x00,
+ 0x00, 0x64, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x64, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xc8, 0xe4, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xc8, 0xe4, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xc8, 0xe4, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x31, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x35, 0x00,
+ 0x00, 0x60, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x68, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000b2 '²'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x5d, 0xe2, 0xf7, 0x9c, 0x04, 0x00, 0x00,
+ 0x00, 0x00, 0x3d, 0xff, 0xb6, 0xb1, 0xff, 0x5a, 0x00, 0x00,
+ 0x00, 0x00, 0x03, 0x64, 0x02, 0x59, 0xff, 0x60, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x65, 0xf7, 0xb0, 0x05, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x7c, 0xff, 0x81, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x33, 0xff, 0xff, 0xff, 0xff, 0x94, 0x00, 0x00,
+ 0x00, 0x00, 0x23, 0x84, 0x84, 0x84, 0x84, 0x4c, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000b3 '³'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x03, 0x89, 0xef, 0xed, 0x72, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x33, 0xf8, 0xa3, 0xc6, 0xff, 0x29, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x1d, 0x79, 0xc4, 0xfa, 0x20, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xe7, 0x21, 0x00, 0x00,
+ 0x00, 0x00, 0x1a, 0xb1, 0x18, 0x57, 0xff, 0x78, 0x00, 0x00,
+ 0x00, 0x00, 0x4a, 0xf7, 0xff, 0xff, 0xf0, 0x28, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x21, 0x73, 0x6f, 0x1b, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000b4 '´'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x9f, 0x3a, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x38, 0xff, 0x64, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xa2, 0xaa, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x11, 0x10, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000b5 'µ'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x8c, 0xff, 0x28, 0x00, 0xa8, 0xff, 0x04, 0x00, 0x00,
+ 0x00, 0x8c, 0xff, 0x28, 0x00, 0xa8, 0xff, 0x04, 0x00, 0x00,
+ 0x00, 0x8c, 0xff, 0x28, 0x00, 0xa8, 0xff, 0x04, 0x00, 0x00,
+ 0x00, 0x8c, 0xff, 0x28, 0x00, 0xa8, 0xff, 0x04, 0x00, 0x00,
+ 0x00, 0x8e, 0xff, 0x28, 0x00, 0xa9, 0xff, 0x04, 0x00, 0x00,
+ 0x00, 0x9a, 0xff, 0x3f, 0x00, 0xca, 0xff, 0x22, 0x2a, 0x00,
+ 0x00, 0xa8, 0xff, 0xca, 0x93, 0xff, 0xff, 0xc4, 0xa5, 0x00,
+ 0x00, 0xb4, 0xf0, 0xe5, 0xf0, 0x90, 0xd1, 0xe8, 0x4b, 0x00,
+ 0x00, 0xc3, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xcf, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xd7, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000b6 '¶'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x15, 0x99, 0xe5, 0xfc, 0xff, 0xff, 0x44, 0x00,
+ 0x00, 0x00, 0xcb, 0xff, 0xff, 0xff, 0xb2, 0xff, 0x44, 0x00,
+ 0x00, 0x23, 0xff, 0xff, 0xff, 0xff, 0x60, 0xff, 0x44, 0x00,
+ 0x00, 0x1e, 0xff, 0xff, 0xff, 0xff, 0x60, 0xff, 0x44, 0x00,
+ 0x00, 0x00, 0xb6, 0xff, 0xff, 0xff, 0x60, 0xff, 0x44, 0x00,
+ 0x00, 0x00, 0x0e, 0x9c, 0xf3, 0xff, 0x60, 0xff, 0x44, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x8c, 0xff, 0x60, 0xff, 0x44, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x8c, 0xff, 0x60, 0xff, 0x44, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x8c, 0xff, 0x60, 0xff, 0x44, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x8c, 0xff, 0x60, 0xff, 0x44, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x8c, 0xff, 0x60, 0xff, 0x44, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x8c, 0xff, 0x60, 0xff, 0x44, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x48, 0x84, 0x31, 0x84, 0x23, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000b7 '·'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x44, 0xfd, 0xde, 0x05, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x35, 0xed, 0xbf, 0x02, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000b8 '¸'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x2a, 0xff, 0x75, 0x02, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x42, 0xb5, 0xfe, 0xff, 0x4f, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x36, 0xd0, 0xf9, 0xbc, 0x13, 0x00, 0x00,
+
+ // U+000000b9 '¹'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x4e, 0xd6, 0xe8, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x50, 0xfa, 0xf8, 0xe8, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x03, 0x0a, 0xc8, 0xe8, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xc8, 0xe8, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xc8, 0xe8, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xc8, 0xe8, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000ba 'º'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x65, 0xec, 0xec, 0x6b, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x35, 0xfe, 0xbc, 0xca, 0xfe, 0x2e, 0x00, 0x00,
+ 0x00, 0x00, 0x8d, 0xff, 0x15, 0x31, 0xff, 0x73, 0x00, 0x00,
+ 0x00, 0x00, 0x9f, 0xfe, 0x01, 0x1b, 0xff, 0x80, 0x00, 0x00,
+ 0x00, 0x00, 0x74, 0xff, 0x4c, 0x66, 0xff, 0x50, 0x00, 0x00,
+ 0x00, 0x00, 0x11, 0xde, 0xff, 0xff, 0xc8, 0x04, 0x00, 0x00,
+ 0x00, 0x00, 0x79, 0x95, 0xed, 0xe4, 0x8c, 0x7d, 0x00, 0x00,
+ 0x00, 0x00, 0xec, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000bb '»'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x67, 0x8d, 0x05, 0xae, 0x40, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x94, 0xff, 0x9a, 0xd6, 0xf4, 0x3d, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x97, 0xff, 0x8d, 0xd8, 0xf3, 0x2d, 0x00,
+ 0x00, 0x00, 0x00, 0xa1, 0xff, 0x7c, 0xe1, 0xeb, 0x22, 0x00,
+ 0x00, 0x00, 0x84, 0xff, 0x91, 0xcf, 0xf6, 0x38, 0x00, 0x00,
+ 0x00, 0x00, 0xab, 0xa0, 0x1e, 0xe0, 0x4f, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x06, 0x05, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000bc '¼'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x40, 0xcb, 0xdc, 0x00, 0x00, 0x47, 0x7c, 0x08, 0x00,
+ 0x00, 0x8f, 0xcf, 0xdc, 0x00, 0x00, 0xc2, 0xea, 0x09, 0x00,
+ 0x00, 0x00, 0x98, 0xdc, 0x00, 0x36, 0xff, 0x7e, 0x00, 0x00,
+ 0x00, 0x00, 0x98, 0xdc, 0x00, 0xaa, 0xf5, 0x13, 0x00, 0x00,
+ 0x00, 0x00, 0x98, 0xdc, 0x21, 0xfc, 0x96, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x92, 0xfc, 0x23, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x12, 0xf4, 0xaa, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x7a, 0xff, 0x35, 0x55, 0xfe, 0x20, 0x00,
+ 0x00, 0x00, 0x07, 0xe7, 0xc0, 0x3a, 0xeb, 0xff, 0x20, 0x00,
+ 0x00, 0x00, 0x62, 0xff, 0x6d, 0xeb, 0xbb, 0xff, 0x83, 0x00,
+ 0x00, 0x01, 0xd5, 0xd4, 0x6d, 0xff, 0xff, 0xff, 0xe0, 0x00,
+ 0x00, 0x03, 0x5c, 0x4b, 0x00, 0x00, 0x40, 0xff, 0x20, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000bd '½'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x40, 0xcb, 0xdc, 0x00, 0x00, 0x67, 0x66, 0x01, 0x00,
+ 0x00, 0x8f, 0xcf, 0xdc, 0x00, 0x08, 0xea, 0xc9, 0x00, 0x00,
+ 0x00, 0x00, 0x98, 0xdc, 0x00, 0x66, 0xff, 0x56, 0x00, 0x00,
+ 0x00, 0x00, 0x98, 0xdc, 0x01, 0xd9, 0xe0, 0x03, 0x00, 0x00,
+ 0x00, 0x00, 0x98, 0xdc, 0x50, 0xff, 0x72, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xc6, 0xf0, 0x0d, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x3a, 0xff, 0x8c, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xae, 0xfb, 0x5d, 0xe0, 0xee, 0x56, 0x00,
+ 0x00, 0x00, 0x27, 0xfd, 0xa8, 0xdd, 0xa8, 0xd9, 0xd4, 0x00,
+ 0x00, 0x00, 0x9a, 0xff, 0x33, 0x1b, 0x13, 0xc9, 0x8a, 0x00,
+ 0x00, 0x16, 0xf7, 0xc2, 0x00, 0x22, 0xd4, 0x70, 0x00, 0x00,
+ 0x00, 0x0a, 0x8e, 0x4d, 0x00, 0xe3, 0xff, 0xff, 0xfc, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x84, 0x84, 0x81, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000be '¾'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x32, 0xde, 0xf1, 0x6f, 0x00, 0x12, 0x2e, 0x00, 0x00,
+ 0x00, 0x4e, 0xca, 0xfd, 0xd6, 0x00, 0x80, 0xf8, 0x2d, 0x00,
+ 0x00, 0x00, 0x94, 0xff, 0xbb, 0x0b, 0xec, 0xda, 0x03, 0x00,
+ 0x00, 0xa0, 0xa3, 0xb0, 0xff, 0x7e, 0xff, 0x62, 0x00, 0x00,
+ 0x00, 0x45, 0xdf, 0xee, 0x77, 0xe0, 0xe0, 0x05, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x5c, 0xff, 0x6a, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01, 0xd3, 0xe5, 0x07, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x4a, 0xff, 0x74, 0x52, 0xfd, 0x24, 0x00,
+ 0x00, 0x00, 0x00, 0xc0, 0xec, 0x44, 0xea, 0xff, 0x24, 0x00,
+ 0x00, 0x00, 0x38, 0xff, 0x9f, 0xea, 0xbc, 0xff, 0x87, 0x00,
+ 0x00, 0x00, 0xb0, 0xf1, 0x78, 0xff, 0xff, 0xff, 0xe4, 0x00,
+ 0x00, 0x00, 0x4c, 0x5f, 0x00, 0x00, 0x3c, 0xff, 0x24, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000bf '¿'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x30, 0xef, 0xb5, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x3b, 0xfc, 0xd0, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x16, 0x07, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xf4, 0x9f, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x0a, 0xfc, 0x93, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x0a, 0xae, 0xfe, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xaa, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x0f, 0xfe, 0xcc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x0e, 0xfe, 0xc0, 0x00, 0x00, 0x7b, 0x82, 0x00, 0x00,
+ 0x00, 0x00, 0xba, 0xff, 0x9d, 0xa4, 0xfe, 0xc5, 0x04, 0x00,
+ 0x00, 0x00, 0x16, 0xaf, 0xf5, 0xea, 0x92, 0x0c, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000c0 'À'
+ 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x05, 0xc5, 0x3b, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x37, 0xed, 0xfa, 0x6a, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x07, 0x52, 0x5b, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xd7, 0x8e, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x2e, 0xff, 0xe7, 0x03, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x82, 0xfd, 0xff, 0x46, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xd7, 0xaa, 0xe5, 0xa4, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x2e, 0xff, 0x58, 0x92, 0xf5, 0x0c, 0x00, 0x00,
+ 0x00, 0x00, 0x82, 0xfc, 0x1f, 0x4a, 0xff, 0x5e, 0x00, 0x00,
+ 0x00, 0x00, 0xd7, 0xff, 0xff, 0xff, 0xff, 0xbc, 0x00, 0x00,
+ 0x00, 0x2e, 0xff, 0xa3, 0x40, 0x40, 0xbc, 0xfd, 0x1c, 0x00,
+ 0x00, 0x82, 0xff, 0x44, 0x00, 0x00, 0x5e, 0xff, 0x76, 0x00,
+ 0x00, 0xd6, 0xf4, 0x07, 0x00, 0x00, 0x0f, 0xf8, 0xd4, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000c1 'Á'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x07, 0x9c, 0x64, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x18, 0xcb, 0xff, 0xa8, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x10, 0x7e, 0x23, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xd7, 0x8e, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x2e, 0xff, 0xe7, 0x03, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x82, 0xfd, 0xff, 0x46, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xd7, 0xaa, 0xe5, 0xa4, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x2e, 0xff, 0x58, 0x92, 0xf5, 0x0c, 0x00, 0x00,
+ 0x00, 0x00, 0x82, 0xfc, 0x1f, 0x4a, 0xff, 0x5e, 0x00, 0x00,
+ 0x00, 0x00, 0xd7, 0xff, 0xff, 0xff, 0xff, 0xbc, 0x00, 0x00,
+ 0x00, 0x2e, 0xff, 0xa3, 0x40, 0x40, 0xbc, 0xfd, 0x1c, 0x00,
+ 0x00, 0x82, 0xff, 0x44, 0x00, 0x00, 0x5e, 0xff, 0x76, 0x00,
+ 0x00, 0xd6, 0xf4, 0x07, 0x00, 0x00, 0x0f, 0xf8, 0xd4, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000c2 'Â'
+ 0x00, 0x00, 0x00, 0x00, 0x33, 0x48, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x2e, 0xee, 0xf9, 0x43, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x17, 0xe7, 0xb2, 0xa7, 0xf2, 0x24, 0x00, 0x00,
+ 0x00, 0x00, 0x03, 0x5a, 0x00, 0x00, 0x64, 0x05, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xd7, 0x8e, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x2e, 0xff, 0xe7, 0x03, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x82, 0xfd, 0xff, 0x46, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xd7, 0xaa, 0xe5, 0xa4, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x2e, 0xff, 0x58, 0x92, 0xf5, 0x0c, 0x00, 0x00,
+ 0x00, 0x00, 0x82, 0xfc, 0x1f, 0x4a, 0xff, 0x5e, 0x00, 0x00,
+ 0x00, 0x00, 0xd7, 0xff, 0xff, 0xff, 0xff, 0xbc, 0x00, 0x00,
+ 0x00, 0x2e, 0xff, 0xa3, 0x40, 0x40, 0xbc, 0xfd, 0x1c, 0x00,
+ 0x00, 0x82, 0xff, 0x44, 0x00, 0x00, 0x5e, 0xff, 0x76, 0x00,
+ 0x00, 0xd6, 0xf4, 0x07, 0x00, 0x00, 0x0f, 0xf8, 0xd4, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000c3 'Ã'
+ 0x00, 0x00, 0x00, 0x37, 0x75, 0x10, 0x16, 0x0e, 0x00, 0x00,
+ 0x00, 0x00, 0x3c, 0xfa, 0xff, 0xd5, 0xc8, 0x97, 0x00, 0x00,
+ 0x00, 0x00, 0x51, 0x9f, 0x23, 0xcd, 0xdc, 0x23, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xd7, 0x8e, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x2e, 0xff, 0xe7, 0x03, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x82, 0xfd, 0xff, 0x46, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xd7, 0xaa, 0xe5, 0xa4, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x2e, 0xff, 0x58, 0x92, 0xf5, 0x0c, 0x00, 0x00,
+ 0x00, 0x00, 0x82, 0xfc, 0x1f, 0x4a, 0xff, 0x5e, 0x00, 0x00,
+ 0x00, 0x00, 0xd7, 0xff, 0xff, 0xff, 0xff, 0xbc, 0x00, 0x00,
+ 0x00, 0x2e, 0xff, 0xa3, 0x40, 0x40, 0xbc, 0xfd, 0x1c, 0x00,
+ 0x00, 0x82, 0xff, 0x44, 0x00, 0x00, 0x5e, 0xff, 0x76, 0x00,
+ 0x00, 0xd6, 0xf4, 0x07, 0x00, 0x00, 0x0f, 0xf8, 0xd4, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000c4 'Ä'
+ 0x00, 0x00, 0x7b, 0xf4, 0x45, 0x86, 0xf2, 0x37, 0x00, 0x00,
+ 0x00, 0x00, 0x95, 0xff, 0x5b, 0xa3, 0xff, 0x49, 0x00, 0x00,
+ 0x00, 0x00, 0x02, 0x1a, 0x00, 0x03, 0x19, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xd7, 0x8e, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x2e, 0xff, 0xe7, 0x03, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x82, 0xfd, 0xff, 0x46, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xd7, 0xaa, 0xe5, 0xa4, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x2e, 0xff, 0x58, 0x92, 0xf5, 0x0c, 0x00, 0x00,
+ 0x00, 0x00, 0x82, 0xfc, 0x1f, 0x4a, 0xff, 0x5e, 0x00, 0x00,
+ 0x00, 0x00, 0xd7, 0xff, 0xff, 0xff, 0xff, 0xbc, 0x00, 0x00,
+ 0x00, 0x2e, 0xff, 0xa3, 0x40, 0x40, 0xbc, 0xfd, 0x1c, 0x00,
+ 0x00, 0x82, 0xff, 0x44, 0x00, 0x00, 0x5e, 0xff, 0x76, 0x00,
+ 0x00, 0xd6, 0xf4, 0x07, 0x00, 0x00, 0x0f, 0xf8, 0xd4, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000c5 'Å'
+ 0x00, 0x00, 0x00, 0x4e, 0xf0, 0xd1, 0x18, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xc6, 0xc1, 0xe8, 0x77, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x99, 0x6b, 0xbc, 0x46, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x07, 0xe4, 0x9c, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x1e, 0xff, 0xd7, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x6c, 0xff, 0xff, 0x2e, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xba, 0xfc, 0xff, 0x82, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x0e, 0xf9, 0xa7, 0xe4, 0xd7, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x56, 0xff, 0x58, 0x90, 0xff, 0x2e, 0x00, 0x00,
+ 0x00, 0x00, 0xa4, 0xfc, 0x1f, 0x48, 0xff, 0x82, 0x00, 0x00,
+ 0x00, 0x03, 0xee, 0xff, 0xff, 0xff, 0xff, 0xd7, 0x00, 0x00,
+ 0x00, 0x40, 0xff, 0xa3, 0x40, 0x40, 0xbc, 0xff, 0x2e, 0x00,
+ 0x00, 0x8e, 0xff, 0x44, 0x00, 0x00, 0x5e, 0xff, 0x82, 0x00,
+ 0x00, 0xda, 0xf4, 0x07, 0x00, 0x00, 0x0f, 0xf8, 0xd7, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000c6 'Æ'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00,
+ 0x00, 0x00, 0x00, 0x6c, 0xff, 0xff, 0xb8, 0x84, 0x7b, 0x00,
+ 0x00, 0x00, 0x00, 0xbc, 0xf4, 0xff, 0x6c, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x0f, 0xfa, 0xb4, 0xff, 0x6c, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x58, 0xff, 0x6c, 0xff, 0xff, 0xff, 0x8c, 0x00,
+ 0x00, 0x00, 0xa8, 0xec, 0x39, 0xff, 0xb8, 0x84, 0x48, 0x00,
+ 0x00, 0x05, 0xf1, 0xff, 0xff, 0xff, 0x6c, 0x00, 0x00, 0x00,
+ 0x00, 0x44, 0xff, 0xad, 0xa1, 0xff, 0x6c, 0x00, 0x00, 0x00,
+ 0x00, 0x94, 0xff, 0x1f, 0x3c, 0xff, 0xb8, 0x84, 0x77, 0x00,
+ 0x00, 0xe1, 0xd8, 0x00, 0x3c, 0xff, 0xff, 0xff, 0xe8, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000c7 'Ç'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x72, 0xe0, 0xfd, 0xd0, 0x4d, 0x00, 0x00,
+ 0x00, 0x00, 0x8c, 0xff, 0xcc, 0x8a, 0xdc, 0xfe, 0x4e, 0x00,
+ 0x00, 0x1f, 0xfc, 0xd6, 0x07, 0x00, 0x1c, 0xe7, 0x63, 0x00,
+ 0x00, 0x68, 0xff, 0x79, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00,
+ 0x00, 0x84, 0xff, 0x57, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x7f, 0xff, 0x5f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x5c, 0xff, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x12, 0xf5, 0xf8, 0x3c, 0x00, 0x33, 0xd0, 0x48, 0x00,
+ 0x00, 0x00, 0x67, 0xff, 0xfe, 0xe1, 0xfd, 0xf0, 0x2e, 0x00,
+ 0x00, 0x00, 0x00, 0x3f, 0xad, 0xff, 0xa3, 0x24, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x04, 0x3a, 0xff, 0xdf, 0x1c, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x6f, 0xc3, 0x9d, 0xff, 0x53, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x36, 0xd0, 0xf7, 0xac, 0x08, 0x00, 0x00,
+
+ // U+000000c8 'È'
+ 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x0e, 0xe4, 0x62, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x2f, 0xc8, 0xff, 0x8a, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0x3b, 0x00, 0x00, 0x00,
+ 0x00, 0x18, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x64, 0x00,
+ 0x00, 0x18, 0xff, 0xd3, 0x84, 0x84, 0x84, 0x84, 0x33, 0x00,
+ 0x00, 0x18, 0xff, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x18, 0xff, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x18, 0xff, 0xff, 0xff, 0xff, 0xff, 0x94, 0x00, 0x00,
+ 0x00, 0x18, 0xff, 0xd3, 0x84, 0x84, 0x84, 0x4c, 0x00, 0x00,
+ 0x00, 0x18, 0xff, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x18, 0xff, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x18, 0xff, 0xd3, 0x84, 0x84, 0x84, 0x84, 0x2f, 0x00,
+ 0x00, 0x18, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5c, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000c9 'É'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x18, 0xc1, 0x7a, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x22, 0xe6, 0xef, 0x8a, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x06, 0x52, 0x07, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x18, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x64, 0x00,
+ 0x00, 0x18, 0xff, 0xd3, 0x84, 0x84, 0x84, 0x84, 0x33, 0x00,
+ 0x00, 0x18, 0xff, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x18, 0xff, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x18, 0xff, 0xff, 0xff, 0xff, 0xff, 0x94, 0x00, 0x00,
+ 0x00, 0x18, 0xff, 0xd3, 0x84, 0x84, 0x84, 0x4c, 0x00, 0x00,
+ 0x00, 0x18, 0xff, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x18, 0xff, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x18, 0xff, 0xd3, 0x84, 0x84, 0x84, 0x84, 0x2f, 0x00,
+ 0x00, 0x18, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5c, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000ca 'Ê'
+ 0x00, 0x00, 0x00, 0x00, 0x34, 0x4a, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x37, 0xf0, 0xfb, 0x4f, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x19, 0xef, 0x94, 0x88, 0xf7, 0x27, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x3a, 0x01, 0x00, 0x00,
+ 0x00, 0x18, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x64, 0x00,
+ 0x00, 0x18, 0xff, 0xd3, 0x84, 0x84, 0x84, 0x84, 0x33, 0x00,
+ 0x00, 0x18, 0xff, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x18, 0xff, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x18, 0xff, 0xff, 0xff, 0xff, 0xff, 0x94, 0x00, 0x00,
+ 0x00, 0x18, 0xff, 0xd3, 0x84, 0x84, 0x84, 0x4c, 0x00, 0x00,
+ 0x00, 0x18, 0xff, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x18, 0xff, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x18, 0xff, 0xd3, 0x84, 0x84, 0x84, 0x84, 0x2f, 0x00,
+ 0x00, 0x18, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5c, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000cb 'Ë'
+ 0x00, 0x00, 0x7b, 0xf4, 0x45, 0x86, 0xf2, 0x37, 0x00, 0x00,
+ 0x00, 0x00, 0x95, 0xff, 0x5b, 0xa3, 0xff, 0x49, 0x00, 0x00,
+ 0x00, 0x00, 0x02, 0x1a, 0x00, 0x03, 0x19, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x18, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x64, 0x00,
+ 0x00, 0x18, 0xff, 0xd3, 0x84, 0x84, 0x84, 0x84, 0x33, 0x00,
+ 0x00, 0x18, 0xff, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x18, 0xff, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x18, 0xff, 0xff, 0xff, 0xff, 0xff, 0x94, 0x00, 0x00,
+ 0x00, 0x18, 0xff, 0xd3, 0x84, 0x84, 0x84, 0x4c, 0x00, 0x00,
+ 0x00, 0x18, 0xff, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x18, 0xff, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x18, 0xff, 0xd3, 0x84, 0x84, 0x84, 0x84, 0x2f, 0x00,
+ 0x00, 0x18, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5c, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000cc 'Ì'
+ 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x0e, 0xe4, 0x62, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x2f, 0xc8, 0xff, 0x8a, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0x3b, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xbc, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x00, 0x00,
+ 0x00, 0x00, 0x60, 0x84, 0xf2, 0xf4, 0x84, 0x6d, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe4, 0xe8, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe4, 0xe8, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe4, 0xe8, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe4, 0xe8, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe4, 0xe8, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe4, 0xe8, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x6d, 0x84, 0xf2, 0xf4, 0x84, 0x79, 0x00, 0x00,
+ 0x00, 0x00, 0xd4, 0xff, 0xff, 0xff, 0xff, 0xec, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000cd 'Í'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x18, 0xc1, 0x7a, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x22, 0xe6, 0xef, 0x8a, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x06, 0x52, 0x07, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xbc, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x00, 0x00,
+ 0x00, 0x00, 0x60, 0x84, 0xf2, 0xf4, 0x84, 0x6d, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe4, 0xe8, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe4, 0xe8, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe4, 0xe8, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe4, 0xe8, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe4, 0xe8, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe4, 0xe8, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x6d, 0x84, 0xf2, 0xf4, 0x84, 0x79, 0x00, 0x00,
+ 0x00, 0x00, 0xd4, 0xff, 0xff, 0xff, 0xff, 0xec, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000ce 'Î'
+ 0x00, 0x00, 0x00, 0x00, 0x34, 0x4a, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x37, 0xf0, 0xfb, 0x4f, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x19, 0xef, 0x94, 0x88, 0xf7, 0x27, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x3a, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0xbc, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x00, 0x00,
+ 0x00, 0x00, 0x60, 0x84, 0xf2, 0xf4, 0x84, 0x6d, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe4, 0xe8, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe4, 0xe8, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe4, 0xe8, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe4, 0xe8, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe4, 0xe8, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe4, 0xe8, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x70, 0x88, 0xf2, 0xf4, 0x88, 0x7d, 0x00, 0x00,
+ 0x00, 0x00, 0xd4, 0xff, 0xff, 0xff, 0xff, 0xec, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000cf 'Ï'
+ 0x00, 0x00, 0x7b, 0xf4, 0x45, 0x86, 0xf2, 0x37, 0x00, 0x00,
+ 0x00, 0x00, 0x95, 0xff, 0x5b, 0xa3, 0xff, 0x49, 0x00, 0x00,
+ 0x00, 0x00, 0x02, 0x1a, 0x00, 0x03, 0x19, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xbc, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x00, 0x00,
+ 0x00, 0x00, 0x60, 0x84, 0xf2, 0xf4, 0x84, 0x6d, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe4, 0xe8, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe4, 0xe8, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe4, 0xe8, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe4, 0xe8, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe4, 0xe8, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe4, 0xe8, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x6d, 0x84, 0xf2, 0xf4, 0x84, 0x79, 0x00, 0x00,
+ 0x00, 0x00, 0xd4, 0xff, 0xff, 0xff, 0xff, 0xec, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000d0 'Ð'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x4c, 0xff, 0xff, 0xfe, 0xe3, 0x8b, 0x08, 0x00, 0x00,
+ 0x00, 0x4c, 0xff, 0xbc, 0x8a, 0xd2, 0xff, 0xa3, 0x00, 0x00,
+ 0x00, 0x4c, 0xff, 0x74, 0x00, 0x04, 0xc6, 0xff, 0x2c, 0x00,
+ 0x00, 0x9e, 0xff, 0xbc, 0x7d, 0x00, 0x5e, 0xff, 0x74, 0x00,
+ 0x00, 0xec, 0xff, 0xff, 0xf4, 0x00, 0x36, 0xff, 0x94, 0x00,
+ 0x00, 0x4c, 0xff, 0x74, 0x00, 0x00, 0x33, 0xff, 0x96, 0x00,
+ 0x00, 0x4c, 0xff, 0x74, 0x00, 0x00, 0x5d, 0xff, 0x79, 0x00,
+ 0x00, 0x4c, 0xff, 0x74, 0x00, 0x0a, 0xcd, 0xff, 0x34, 0x00,
+ 0x00, 0x4c, 0xff, 0xbc, 0x91, 0xde, 0xff, 0xa5, 0x00, 0x00,
+ 0x00, 0x4c, 0xff, 0xff, 0xf6, 0xd2, 0x77, 0x04, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000d1 'Ñ'
+ 0x00, 0x00, 0x00, 0x37, 0x75, 0x10, 0x16, 0x0e, 0x00, 0x00,
+ 0x00, 0x00, 0x3c, 0xfa, 0xff, 0xd5, 0xc8, 0x97, 0x00, 0x00,
+ 0x00, 0x00, 0x51, 0x9f, 0x23, 0xcd, 0xdc, 0x23, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x7c, 0xff, 0xe6, 0x05, 0x00, 0x20, 0xff, 0x87, 0x00,
+ 0x00, 0x7c, 0xff, 0xff, 0x5c, 0x00, 0x20, 0xff, 0x7c, 0x00,
+ 0x00, 0x7c, 0xff, 0xf1, 0xcc, 0x00, 0x20, 0xff, 0x7c, 0x00,
+ 0x00, 0x7c, 0xff, 0x8e, 0xff, 0x3c, 0x20, 0xff, 0x7c, 0x00,
+ 0x00, 0x7c, 0xff, 0x2b, 0xee, 0xae, 0x20, 0xff, 0x7c, 0x00,
+ 0x00, 0x7c, 0xff, 0x20, 0x86, 0xfd, 0x43, 0xff, 0x7c, 0x00,
+ 0x00, 0x7c, 0xff, 0x20, 0x18, 0xf8, 0xb0, 0xff, 0x7c, 0x00,
+ 0x00, 0x7c, 0xff, 0x20, 0x00, 0x9e, 0xfd, 0xff, 0x7c, 0x00,
+ 0x00, 0x7c, 0xff, 0x20, 0x00, 0x2a, 0xfe, 0xff, 0x7c, 0x00,
+ 0x00, 0x7c, 0xff, 0x20, 0x00, 0x00, 0xb6, 0xff, 0x7c, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000d2 'Ò'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x02, 0xac, 0x2a, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x3a, 0xf9, 0xf3, 0x57, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x11, 0x68, 0x6e, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x10, 0xa0, 0xf2, 0xf3, 0xa6, 0x14, 0x00, 0x00,
+ 0x00, 0x02, 0xc4, 0xfe, 0xa2, 0xa5, 0xff, 0xc9, 0x03, 0x00,
+ 0x00, 0x4e, 0xff, 0x93, 0x00, 0x00, 0xa4, 0xff, 0x51, 0x00,
+ 0x00, 0x94, 0xff, 0x3e, 0x00, 0x00, 0x4b, 0xff, 0x96, 0x00,
+ 0x00, 0xb2, 0xff, 0x21, 0x00, 0x00, 0x2a, 0xff, 0xb2, 0x00,
+ 0x00, 0xb0, 0xff, 0x26, 0x00, 0x00, 0x2d, 0xff, 0xb2, 0x00,
+ 0x00, 0x8f, 0xff, 0x49, 0x00, 0x00, 0x4b, 0xff, 0x94, 0x00,
+ 0x00, 0x49, 0xff, 0xa7, 0x00, 0x00, 0x9b, 0xff, 0x51, 0x00,
+ 0x00, 0x01, 0xbe, 0xff, 0xad, 0xa4, 0xfe, 0xc9, 0x02, 0x00,
+ 0x00, 0x00, 0x10, 0x9d, 0xee, 0xf2, 0xa2, 0x12, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000d3 'Ó'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x56, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x11, 0xb7, 0xff, 0xb6, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x16, 0x95, 0x3a, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x10, 0xa0, 0xf2, 0xf3, 0xa6, 0x14, 0x00, 0x00,
+ 0x00, 0x02, 0xc4, 0xfe, 0xa2, 0xa5, 0xff, 0xc9, 0x03, 0x00,
+ 0x00, 0x4e, 0xff, 0x93, 0x00, 0x00, 0xa4, 0xff, 0x51, 0x00,
+ 0x00, 0x94, 0xff, 0x3e, 0x00, 0x00, 0x4b, 0xff, 0x96, 0x00,
+ 0x00, 0xb2, 0xff, 0x21, 0x00, 0x00, 0x2a, 0xff, 0xb2, 0x00,
+ 0x00, 0xb0, 0xff, 0x26, 0x00, 0x00, 0x2d, 0xff, 0xb2, 0x00,
+ 0x00, 0x8f, 0xff, 0x49, 0x00, 0x00, 0x4b, 0xff, 0x94, 0x00,
+ 0x00, 0x49, 0xff, 0xa7, 0x00, 0x00, 0x9b, 0xff, 0x51, 0x00,
+ 0x00, 0x01, 0xbe, 0xff, 0xad, 0xa4, 0xfe, 0xc9, 0x02, 0x00,
+ 0x00, 0x00, 0x10, 0x9d, 0xee, 0xf2, 0xa2, 0x12, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000d4 'Ô'
+ 0x00, 0x00, 0x00, 0x00, 0x32, 0x48, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x28, 0xec, 0xf9, 0x3f, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x15, 0xe1, 0xc1, 0xb8, 0xef, 0x22, 0x00, 0x00,
+ 0x00, 0x00, 0x07, 0x73, 0x03, 0x03, 0x7e, 0x0a, 0x00, 0x00,
+ 0x00, 0x00, 0x10, 0xa0, 0xf2, 0xf3, 0xa6, 0x14, 0x00, 0x00,
+ 0x00, 0x02, 0xc4, 0xfe, 0xa2, 0xa5, 0xff, 0xc9, 0x03, 0x00,
+ 0x00, 0x4e, 0xff, 0x93, 0x00, 0x00, 0xa4, 0xff, 0x51, 0x00,
+ 0x00, 0x94, 0xff, 0x3e, 0x00, 0x00, 0x4b, 0xff, 0x96, 0x00,
+ 0x00, 0xb2, 0xff, 0x21, 0x00, 0x00, 0x2a, 0xff, 0xb2, 0x00,
+ 0x00, 0xb0, 0xff, 0x26, 0x00, 0x00, 0x2d, 0xff, 0xb2, 0x00,
+ 0x00, 0x8f, 0xff, 0x49, 0x00, 0x00, 0x4b, 0xff, 0x94, 0x00,
+ 0x00, 0x49, 0xff, 0xa7, 0x00, 0x00, 0x9b, 0xff, 0x51, 0x00,
+ 0x00, 0x01, 0xbe, 0xff, 0xad, 0xa4, 0xfe, 0xc9, 0x02, 0x00,
+ 0x00, 0x00, 0x10, 0x9d, 0xee, 0xf2, 0xa2, 0x12, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000d5 'Õ'
+ 0x00, 0x00, 0x07, 0xad, 0xf1, 0x62, 0x5a, 0x4f, 0x00, 0x00,
+ 0x00, 0x00, 0x7b, 0xee, 0xa7, 0xff, 0xff, 0x7c, 0x00, 0x00,
+ 0x00, 0x00, 0x09, 0x34, 0x00, 0x51, 0x60, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x10, 0xa0, 0xf2, 0xf3, 0xa6, 0x14, 0x00, 0x00,
+ 0x00, 0x02, 0xc4, 0xfe, 0xa2, 0xa5, 0xff, 0xc9, 0x03, 0x00,
+ 0x00, 0x4e, 0xff, 0x93, 0x00, 0x00, 0xa4, 0xff, 0x51, 0x00,
+ 0x00, 0x94, 0xff, 0x3e, 0x00, 0x00, 0x4b, 0xff, 0x96, 0x00,
+ 0x00, 0xb2, 0xff, 0x21, 0x00, 0x00, 0x2a, 0xff, 0xb2, 0x00,
+ 0x00, 0xb0, 0xff, 0x26, 0x00, 0x00, 0x2d, 0xff, 0xb2, 0x00,
+ 0x00, 0x8f, 0xff, 0x49, 0x00, 0x00, 0x4b, 0xff, 0x94, 0x00,
+ 0x00, 0x49, 0xff, 0xa7, 0x00, 0x00, 0x9b, 0xff, 0x51, 0x00,
+ 0x00, 0x01, 0xbe, 0xff, 0xad, 0xa4, 0xfe, 0xc9, 0x02, 0x00,
+ 0x00, 0x00, 0x10, 0x9d, 0xee, 0xf2, 0xa2, 0x12, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000d6 'Ö'
+ 0x00, 0x00, 0x7b, 0xf4, 0x45, 0x86, 0xf2, 0x37, 0x00, 0x00,
+ 0x00, 0x00, 0x95, 0xff, 0x5b, 0xa3, 0xff, 0x49, 0x00, 0x00,
+ 0x00, 0x00, 0x02, 0x1a, 0x00, 0x03, 0x19, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x10, 0xa0, 0xf2, 0xf3, 0xa6, 0x14, 0x00, 0x00,
+ 0x00, 0x02, 0xc4, 0xfe, 0xa2, 0xa5, 0xff, 0xc9, 0x03, 0x00,
+ 0x00, 0x4e, 0xff, 0x93, 0x00, 0x00, 0xa4, 0xff, 0x51, 0x00,
+ 0x00, 0x94, 0xff, 0x3e, 0x00, 0x00, 0x4b, 0xff, 0x96, 0x00,
+ 0x00, 0xb2, 0xff, 0x21, 0x00, 0x00, 0x2a, 0xff, 0xb2, 0x00,
+ 0x00, 0xb0, 0xff, 0x26, 0x00, 0x00, 0x2d, 0xff, 0xb2, 0x00,
+ 0x00, 0x8f, 0xff, 0x49, 0x00, 0x00, 0x4b, 0xff, 0x94, 0x00,
+ 0x00, 0x49, 0xff, 0xa7, 0x00, 0x00, 0x9b, 0xff, 0x51, 0x00,
+ 0x00, 0x01, 0xbe, 0xff, 0xad, 0xa4, 0xfe, 0xc9, 0x02, 0x00,
+ 0x00, 0x00, 0x10, 0x9d, 0xee, 0xf2, 0xa2, 0x12, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000d7 '×'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x2d, 0x8c, 0x00, 0x00, 0x68, 0x54, 0x00, 0x00,
+ 0x00, 0x00, 0xa2, 0xff, 0x84, 0x59, 0xfe, 0xd3, 0x04, 0x00,
+ 0x00, 0x00, 0x0a, 0xc7, 0xff, 0xfc, 0xe3, 0x1d, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x46, 0xff, 0xff, 0x75, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x27, 0xea, 0xf0, 0xe5, 0xf9, 0x43, 0x00, 0x00,
+ 0x00, 0x00, 0xa4, 0xf7, 0x3d, 0x2b, 0xee, 0xd3, 0x01, 0x00,
+ 0x00, 0x00, 0x0c, 0x3f, 0x00, 0x00, 0x3b, 0x24, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000d8 'Ø'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x1b, 0x00,
+ 0x00, 0x00, 0x10, 0xa0, 0xf2, 0xf4, 0xc2, 0xff, 0x89, 0x00,
+ 0x00, 0x01, 0xc1, 0xfe, 0xa2, 0xaf, 0xff, 0xfb, 0x11, 0x00,
+ 0x00, 0x4c, 0xff, 0x93, 0x00, 0x70, 0xff, 0xff, 0x47, 0x00,
+ 0x00, 0x93, 0xff, 0x3e, 0x11, 0xee, 0xf7, 0xff, 0x92, 0x00,
+ 0x00, 0xb2, 0xff, 0x23, 0x8c, 0xff, 0x76, 0xff, 0xb2, 0x00,
+ 0x00, 0xb4, 0xff, 0x48, 0xf9, 0xbb, 0x2a, 0xff, 0xb4, 0x00,
+ 0x00, 0x94, 0xff, 0xe0, 0xfc, 0x2d, 0x48, 0xff, 0x96, 0x00,
+ 0x00, 0x4f, 0xff, 0xff, 0x98, 0x00, 0x99, 0xff, 0x52, 0x00,
+ 0x00, 0x03, 0xed, 0xff, 0xb5, 0xa4, 0xfe, 0xcb, 0x02, 0x00,
+ 0x00, 0x56, 0xff, 0xcd, 0xf0, 0xf2, 0xa4, 0x14, 0x00, 0x00,
+ 0x00, 0x2e, 0xa4, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000d9 'Ù'
+ 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x0e, 0xe4, 0x62, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x2f, 0xc8, 0xff, 0x8a, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0x3b, 0x00, 0x00, 0x00,
+ 0x00, 0x68, 0xff, 0x6c, 0x00, 0x00, 0x58, 0xff, 0x68, 0x00,
+ 0x00, 0x68, 0xff, 0x64, 0x00, 0x00, 0x58, 0xff, 0x68, 0x00,
+ 0x00, 0x68, 0xff, 0x64, 0x00, 0x00, 0x58, 0xff, 0x68, 0x00,
+ 0x00, 0x68, 0xff, 0x64, 0x00, 0x00, 0x58, 0xff, 0x68, 0x00,
+ 0x00, 0x68, 0xff, 0x64, 0x00, 0x00, 0x58, 0xff, 0x68, 0x00,
+ 0x00, 0x68, 0xff, 0x64, 0x00, 0x00, 0x58, 0xff, 0x68, 0x00,
+ 0x00, 0x65, 0xff, 0x66, 0x00, 0x00, 0x5d, 0xff, 0x62, 0x00,
+ 0x00, 0x44, 0xff, 0x92, 0x00, 0x00, 0x8c, 0xff, 0x41, 0x00,
+ 0x00, 0x04, 0xda, 0xfb, 0x9d, 0x9c, 0xfb, 0xd7, 0x03, 0x00,
+ 0x00, 0x00, 0x21, 0xb1, 0xf2, 0xf1, 0xb1, 0x20, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000da 'Ú'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x18, 0xc1, 0x7a, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x22, 0xe6, 0xef, 0x8a, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x06, 0x52, 0x07, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x68, 0xff, 0x6c, 0x00, 0x00, 0x58, 0xff, 0x68, 0x00,
+ 0x00, 0x68, 0xff, 0x64, 0x00, 0x00, 0x58, 0xff, 0x68, 0x00,
+ 0x00, 0x68, 0xff, 0x64, 0x00, 0x00, 0x58, 0xff, 0x68, 0x00,
+ 0x00, 0x68, 0xff, 0x64, 0x00, 0x00, 0x58, 0xff, 0x68, 0x00,
+ 0x00, 0x68, 0xff, 0x64, 0x00, 0x00, 0x58, 0xff, 0x68, 0x00,
+ 0x00, 0x68, 0xff, 0x64, 0x00, 0x00, 0x58, 0xff, 0x68, 0x00,
+ 0x00, 0x65, 0xff, 0x66, 0x00, 0x00, 0x5d, 0xff, 0x62, 0x00,
+ 0x00, 0x44, 0xff, 0x92, 0x00, 0x00, 0x8c, 0xff, 0x41, 0x00,
+ 0x00, 0x04, 0xda, 0xfb, 0x9d, 0x9c, 0xfb, 0xd7, 0x03, 0x00,
+ 0x00, 0x00, 0x21, 0xb1, 0xf2, 0xf1, 0xb1, 0x20, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000db 'Û'
+ 0x00, 0x00, 0x00, 0x00, 0x34, 0x4a, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x37, 0xf0, 0xfb, 0x4f, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x19, 0xef, 0x94, 0x88, 0xf7, 0x27, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x3a, 0x01, 0x00, 0x00,
+ 0x00, 0x68, 0xff, 0x6c, 0x00, 0x00, 0x58, 0xff, 0x68, 0x00,
+ 0x00, 0x68, 0xff, 0x64, 0x00, 0x00, 0x58, 0xff, 0x68, 0x00,
+ 0x00, 0x68, 0xff, 0x64, 0x00, 0x00, 0x58, 0xff, 0x68, 0x00,
+ 0x00, 0x68, 0xff, 0x64, 0x00, 0x00, 0x58, 0xff, 0x68, 0x00,
+ 0x00, 0x68, 0xff, 0x64, 0x00, 0x00, 0x58, 0xff, 0x68, 0x00,
+ 0x00, 0x68, 0xff, 0x64, 0x00, 0x00, 0x58, 0xff, 0x68, 0x00,
+ 0x00, 0x65, 0xff, 0x67, 0x00, 0x00, 0x5e, 0xff, 0x62, 0x00,
+ 0x00, 0x44, 0xff, 0x95, 0x00, 0x00, 0x8f, 0xff, 0x41, 0x00,
+ 0x00, 0x04, 0xda, 0xfc, 0xa5, 0xa4, 0xfc, 0xd7, 0x03, 0x00,
+ 0x00, 0x00, 0x21, 0xb1, 0xf2, 0xf1, 0xb1, 0x20, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000dc 'Ü'
+ 0x00, 0x00, 0x7b, 0xf4, 0x45, 0x86, 0xf2, 0x37, 0x00, 0x00,
+ 0x00, 0x00, 0x95, 0xff, 0x5b, 0xa3, 0xff, 0x49, 0x00, 0x00,
+ 0x00, 0x00, 0x02, 0x1a, 0x00, 0x03, 0x19, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x68, 0xff, 0x6c, 0x00, 0x00, 0x58, 0xff, 0x68, 0x00,
+ 0x00, 0x68, 0xff, 0x64, 0x00, 0x00, 0x58, 0xff, 0x68, 0x00,
+ 0x00, 0x68, 0xff, 0x64, 0x00, 0x00, 0x58, 0xff, 0x68, 0x00,
+ 0x00, 0x68, 0xff, 0x64, 0x00, 0x00, 0x58, 0xff, 0x68, 0x00,
+ 0x00, 0x68, 0xff, 0x64, 0x00, 0x00, 0x58, 0xff, 0x68, 0x00,
+ 0x00, 0x68, 0xff, 0x64, 0x00, 0x00, 0x58, 0xff, 0x68, 0x00,
+ 0x00, 0x65, 0xff, 0x66, 0x00, 0x00, 0x5d, 0xff, 0x62, 0x00,
+ 0x00, 0x44, 0xff, 0x92, 0x00, 0x00, 0x8c, 0xff, 0x41, 0x00,
+ 0x00, 0x04, 0xda, 0xfb, 0x9d, 0x9c, 0xfb, 0xd7, 0x03, 0x00,
+ 0x00, 0x00, 0x21, 0xb1, 0xf2, 0xf1, 0xb1, 0x20, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000dd 'Ý'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x18, 0xc1, 0x7a, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x22, 0xe6, 0xef, 0x8a, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x06, 0x52, 0x07, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x9c, 0xff, 0x64, 0x00, 0x00, 0x36, 0xff, 0xb8, 0x00,
+ 0x00, 0x21, 0xfa, 0xde, 0x05, 0x00, 0xa8, 0xff, 0x40, 0x00,
+ 0x00, 0x00, 0x9a, 0xff, 0x64, 0x1e, 0xfb, 0xc7, 0x00, 0x00,
+ 0x00, 0x00, 0x1e, 0xf9, 0xde, 0x91, 0xff, 0x50, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x96, 0xff, 0xfe, 0xd5, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x1b, 0xf8, 0xff, 0x60, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xc8, 0xff, 0x1c, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xc8, 0xff, 0x1c, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xc8, 0xff, 0x1c, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xc8, 0xff, 0x1c, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000de 'Þ'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x34, 0xff, 0xab, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x34, 0xff, 0xe0, 0xa8, 0xa1, 0x73, 0x10, 0x00, 0x00,
+ 0x00, 0x34, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd9, 0x0c, 0x00,
+ 0x00, 0x34, 0xff, 0xa2, 0x00, 0x0e, 0xb2, 0xff, 0x64, 0x00,
+ 0x00, 0x34, 0xff, 0xa0, 0x00, 0x00, 0x54, 0xff, 0x86, 0x00,
+ 0x00, 0x34, 0xff, 0xa0, 0x00, 0x0d, 0xaa, 0xff, 0x60, 0x00,
+ 0x00, 0x34, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x07, 0x00,
+ 0x00, 0x34, 0xff, 0xd1, 0x84, 0x7e, 0x53, 0x05, 0x00, 0x00,
+ 0x00, 0x34, 0xff, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x34, 0xff, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000df 'ß'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x20, 0xbb, 0xf9, 0xe6, 0x76, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xce, 0xfa, 0x93, 0xc3, 0xff, 0x62, 0x00, 0x00,
+ 0x00, 0x30, 0xff, 0x95, 0x00, 0x0a, 0xfd, 0xb4, 0x00, 0x00,
+ 0x00, 0x5b, 0xff, 0x61, 0x00, 0x40, 0xff, 0x8e, 0x00, 0x00,
+ 0x00, 0x64, 0xff, 0x64, 0xff, 0xff, 0xee, 0x18, 0x00, 0x00,
+ 0x00, 0x64, 0xff, 0x5e, 0x84, 0xab, 0xff, 0xc1, 0x01, 0x00,
+ 0x00, 0x64, 0xff, 0x58, 0x00, 0x00, 0x96, 0xff, 0x41, 0x00,
+ 0x00, 0x64, 0xff, 0x58, 0x00, 0x00, 0x50, 0xff, 0x66, 0x00,
+ 0x00, 0x64, 0xff, 0x58, 0x00, 0x00, 0x6f, 0xff, 0x4f, 0x00,
+ 0x00, 0x64, 0xff, 0x58, 0x95, 0x92, 0xf2, 0xeb, 0x0c, 0x00,
+ 0x00, 0x64, 0xff, 0x76, 0xe7, 0xf9, 0xca, 0x37, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000e0 'à'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x06, 0x90, 0x49, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x07, 0xd0, 0xc0, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x2a, 0xf7, 0x2c, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x19, 0xa6, 0xf2, 0xf6, 0xb6, 0x1c, 0x00, 0x00,
+ 0x00, 0x00, 0x8e, 0xf3, 0x98, 0xa0, 0xfe, 0xb8, 0x00, 0x00,
+ 0x00, 0x00, 0x09, 0x25, 0x00, 0x00, 0xbf, 0xfb, 0x04, 0x00,
+ 0x00, 0x00, 0x2b, 0xb0, 0xee, 0xff, 0xff, 0xff, 0x13, 0x00,
+ 0x00, 0x13, 0xee, 0xf4, 0xa0, 0x85, 0xd1, 0xff, 0x14, 0x00,
+ 0x00, 0x53, 0xff, 0x7b, 0x00, 0x08, 0xd2, 0xff, 0x14, 0x00,
+ 0x00, 0x36, 0xff, 0xe3, 0x8d, 0xd2, 0xff, 0xff, 0x14, 0x00,
+ 0x00, 0x00, 0x77, 0xea, 0xf4, 0xa8, 0xbb, 0xff, 0x14, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000e1 'á'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xa2, 0x3d, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x38, 0xff, 0x60, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xa2, 0xa9, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x10, 0x0f, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x19, 0xa6, 0xf2, 0xf6, 0xb6, 0x1c, 0x00, 0x00,
+ 0x00, 0x00, 0x8e, 0xf3, 0x98, 0xa0, 0xfe, 0xb8, 0x00, 0x00,
+ 0x00, 0x00, 0x09, 0x25, 0x00, 0x00, 0xbf, 0xfb, 0x04, 0x00,
+ 0x00, 0x00, 0x2b, 0xb0, 0xee, 0xff, 0xff, 0xff, 0x13, 0x00,
+ 0x00, 0x13, 0xee, 0xf4, 0xa0, 0x85, 0xd1, 0xff, 0x14, 0x00,
+ 0x00, 0x53, 0xff, 0x7b, 0x00, 0x08, 0xd2, 0xff, 0x14, 0x00,
+ 0x00, 0x36, 0xff, 0xe3, 0x8d, 0xd2, 0xff, 0xff, 0x14, 0x00,
+ 0x00, 0x00, 0x77, 0xea, 0xf4, 0xa8, 0xbb, 0xff, 0x14, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000e2 'â'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01, 0xa3, 0xc4, 0x0a, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x93, 0xcc, 0xc9, 0xb6, 0x05, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x52, 0x0d, 0x0e, 0x5f, 0x02, 0x00, 0x00,
+ 0x00, 0x00, 0x19, 0xa6, 0xf2, 0xf6, 0xb6, 0x1c, 0x00, 0x00,
+ 0x00, 0x00, 0x8e, 0xf3, 0x98, 0xa0, 0xfe, 0xb8, 0x00, 0x00,
+ 0x00, 0x00, 0x09, 0x25, 0x00, 0x00, 0xbf, 0xfb, 0x04, 0x00,
+ 0x00, 0x00, 0x2b, 0xb0, 0xee, 0xff, 0xff, 0xff, 0x13, 0x00,
+ 0x00, 0x13, 0xee, 0xf4, 0xa0, 0x85, 0xd1, 0xff, 0x14, 0x00,
+ 0x00, 0x53, 0xff, 0x7b, 0x00, 0x08, 0xd2, 0xff, 0x14, 0x00,
+ 0x00, 0x36, 0xff, 0xe3, 0x8d, 0xd2, 0xff, 0xff, 0x14, 0x00,
+ 0x00, 0x00, 0x77, 0xea, 0xf4, 0xa8, 0xbb, 0xff, 0x14, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000e3 'ã'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x03, 0x9e, 0xf4, 0x73, 0x4b, 0x5f, 0x00, 0x00,
+ 0x00, 0x00, 0x67, 0xf6, 0xa1, 0xff, 0xff, 0x8f, 0x00, 0x00,
+ 0x00, 0x00, 0x05, 0x3a, 0x00, 0x46, 0x67, 0x02, 0x00, 0x00,
+ 0x00, 0x00, 0x19, 0xa6, 0xf2, 0xf6, 0xb6, 0x1c, 0x00, 0x00,
+ 0x00, 0x00, 0x8e, 0xf3, 0x98, 0xa0, 0xfe, 0xb8, 0x00, 0x00,
+ 0x00, 0x00, 0x09, 0x25, 0x00, 0x00, 0xbf, 0xfb, 0x04, 0x00,
+ 0x00, 0x00, 0x2b, 0xb0, 0xee, 0xff, 0xff, 0xff, 0x13, 0x00,
+ 0x00, 0x13, 0xee, 0xf4, 0xa0, 0x85, 0xd1, 0xff, 0x14, 0x00,
+ 0x00, 0x53, 0xff, 0x7b, 0x00, 0x08, 0xd2, 0xff, 0x14, 0x00,
+ 0x00, 0x36, 0xff, 0xe3, 0x8d, 0xd2, 0xff, 0xff, 0x14, 0x00,
+ 0x00, 0x00, 0x77, 0xea, 0xf4, 0xa8, 0xbb, 0xff, 0x14, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000e4 'ä'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x55, 0xf6, 0x6c, 0x63, 0xf6, 0x5c, 0x00, 0x00,
+ 0x00, 0x00, 0x69, 0xff, 0x82, 0x79, 0xff, 0x6f, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x19, 0xa6, 0xf2, 0xf6, 0xb6, 0x1c, 0x00, 0x00,
+ 0x00, 0x00, 0x8e, 0xf3, 0x98, 0xa0, 0xfe, 0xb8, 0x00, 0x00,
+ 0x00, 0x00, 0x09, 0x25, 0x00, 0x00, 0xbf, 0xfb, 0x04, 0x00,
+ 0x00, 0x00, 0x2b, 0xb0, 0xee, 0xff, 0xff, 0xff, 0x13, 0x00,
+ 0x00, 0x13, 0xee, 0xf4, 0xa0, 0x85, 0xd1, 0xff, 0x14, 0x00,
+ 0x00, 0x53, 0xff, 0x7b, 0x00, 0x08, 0xd2, 0xff, 0x14, 0x00,
+ 0x00, 0x36, 0xff, 0xe3, 0x8d, 0xd2, 0xff, 0xff, 0x14, 0x00,
+ 0x00, 0x00, 0x77, 0xea, 0xf4, 0xa8, 0xbb, 0xff, 0x14, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000e5 'å'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x2e, 0xe2, 0xe0, 0x2e, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x9d, 0xce, 0xd0, 0x9d, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x75, 0xff, 0xff, 0x75, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x02, 0x64, 0x61, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x19, 0xa6, 0xf2, 0xf6, 0xb6, 0x1c, 0x00, 0x00,
+ 0x00, 0x00, 0x8e, 0xf3, 0x98, 0xa0, 0xfe, 0xb8, 0x00, 0x00,
+ 0x00, 0x00, 0x09, 0x25, 0x00, 0x00, 0xbf, 0xfb, 0x04, 0x00,
+ 0x00, 0x00, 0x2b, 0xb0, 0xee, 0xff, 0xff, 0xff, 0x13, 0x00,
+ 0x00, 0x13, 0xee, 0xf4, 0xa0, 0x85, 0xd1, 0xff, 0x14, 0x00,
+ 0x00, 0x53, 0xff, 0x7b, 0x00, 0x08, 0xd2, 0xff, 0x14, 0x00,
+ 0x00, 0x36, 0xff, 0xe3, 0x8d, 0xd2, 0xff, 0xff, 0x14, 0x00,
+ 0x00, 0x00, 0x77, 0xea, 0xf4, 0xa8, 0xbb, 0xff, 0x14, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000e6 'æ'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x28, 0xcc, 0xf8, 0x8f, 0x63, 0xf5, 0xc9, 0x17, 0x00,
+ 0x00, 0x79, 0xd9, 0x9b, 0xff, 0xfd, 0x99, 0xef, 0x90, 0x00,
+ 0x00, 0x02, 0x13, 0x00, 0xce, 0xcc, 0x00, 0x95, 0xcf, 0x00,
+ 0x00, 0x0d, 0x98, 0xec, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x00,
+ 0x00, 0xa8, 0xfc, 0xa2, 0xd9, 0xdf, 0x84, 0x84, 0x77, 0x00,
+ 0x00, 0xf2, 0xa5, 0x00, 0xbb, 0xd1, 0x00, 0x00, 0x07, 0x00,
+ 0x00, 0xcd, 0xed, 0x96, 0xfa, 0xfd, 0xab, 0xb1, 0xb1, 0x00,
+ 0x00, 0x2d, 0xcf, 0xf4, 0x86, 0x5b, 0xea, 0xe2, 0x51, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000e7 'ç'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x04, 0x7f, 0xe3, 0xfc, 0xd9, 0x67, 0x00, 0x00,
+ 0x00, 0x00, 0x9f, 0xff, 0xc5, 0x8a, 0xd5, 0xff, 0x2f, 0x00,
+ 0x00, 0x27, 0xff, 0xc7, 0x03, 0x00, 0x0c, 0x6d, 0x00, 0x00,
+ 0x00, 0x5b, 0xff, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x58, 0xff, 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x1a, 0xfb, 0xeb, 0x26, 0x00, 0x2e, 0x77, 0x00, 0x00,
+ 0x00, 0x00, 0x79, 0xff, 0xfb, 0xdf, 0xfe, 0xf5, 0x1d, 0x00,
+ 0x00, 0x00, 0x00, 0x4a, 0xb4, 0xff, 0xa2, 0x27, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x04, 0x38, 0xff, 0xd8, 0x1b, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x6f, 0xc3, 0x9d, 0xff, 0x53, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x36, 0xd0, 0xf7, 0xac, 0x09, 0x00, 0x00,
+
+ // U+000000e8 'è'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x06, 0x90, 0x49, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x07, 0xd0, 0xc0, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x2a, 0xf7, 0x2c, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x0c, 0x97, 0xee, 0xf7, 0xad, 0x15, 0x00, 0x00,
+ 0x00, 0x00, 0xb2, 0xfd, 0xa0, 0x9b, 0xfc, 0xbe, 0x00, 0x00,
+ 0x00, 0x2b, 0xff, 0x96, 0x00, 0x00, 0x97, 0xff, 0x27, 0x00,
+ 0x00, 0x5e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x49, 0x00,
+ 0x00, 0x5f, 0xff, 0xb8, 0x84, 0x84, 0x84, 0x84, 0x25, 0x00,
+ 0x00, 0x2c, 0xff, 0xb7, 0x00, 0x00, 0x07, 0x1e, 0x00, 0x00,
+ 0x00, 0x00, 0xac, 0xff, 0xbe, 0x8d, 0xd8, 0xde, 0x06, 0x00,
+ 0x00, 0x00, 0x08, 0x8a, 0xe2, 0xf5, 0xc4, 0x37, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000e9 'é'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xa2, 0x3d, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x38, 0xff, 0x60, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xa2, 0xa9, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x10, 0x0f, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x0c, 0x97, 0xee, 0xf7, 0xad, 0x15, 0x00, 0x00,
+ 0x00, 0x00, 0xb2, 0xfd, 0xa0, 0x9b, 0xfc, 0xbe, 0x00, 0x00,
+ 0x00, 0x2b, 0xff, 0x96, 0x00, 0x00, 0x97, 0xff, 0x27, 0x00,
+ 0x00, 0x5e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x49, 0x00,
+ 0x00, 0x5f, 0xff, 0xb8, 0x84, 0x84, 0x84, 0x84, 0x25, 0x00,
+ 0x00, 0x2c, 0xff, 0xb7, 0x00, 0x00, 0x07, 0x1e, 0x00, 0x00,
+ 0x00, 0x00, 0xac, 0xff, 0xbe, 0x8d, 0xd8, 0xde, 0x06, 0x00,
+ 0x00, 0x00, 0x08, 0x8a, 0xe2, 0xf5, 0xc4, 0x37, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000ea 'ê'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01, 0xa3, 0xc4, 0x0a, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x93, 0xcc, 0xc9, 0xb6, 0x05, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x52, 0x0d, 0x0e, 0x5f, 0x02, 0x00, 0x00,
+ 0x00, 0x00, 0x0c, 0x97, 0xee, 0xf7, 0xad, 0x15, 0x00, 0x00,
+ 0x00, 0x00, 0xb2, 0xfd, 0xa0, 0x9b, 0xfc, 0xbe, 0x00, 0x00,
+ 0x00, 0x2b, 0xff, 0x96, 0x00, 0x00, 0x97, 0xff, 0x27, 0x00,
+ 0x00, 0x5e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x49, 0x00,
+ 0x00, 0x5f, 0xff, 0xb8, 0x84, 0x84, 0x84, 0x84, 0x25, 0x00,
+ 0x00, 0x2c, 0xff, 0xb7, 0x00, 0x00, 0x07, 0x1e, 0x00, 0x00,
+ 0x00, 0x00, 0xac, 0xff, 0xbe, 0x8d, 0xd8, 0xde, 0x06, 0x00,
+ 0x00, 0x00, 0x08, 0x8a, 0xe2, 0xf5, 0xc4, 0x37, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000eb 'ë'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x55, 0xf6, 0x6c, 0x63, 0xf6, 0x5c, 0x00, 0x00,
+ 0x00, 0x00, 0x69, 0xff, 0x82, 0x79, 0xff, 0x6f, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x0c, 0x97, 0xee, 0xf7, 0xad, 0x15, 0x00, 0x00,
+ 0x00, 0x00, 0xb2, 0xfd, 0xa0, 0x9b, 0xfc, 0xbe, 0x00, 0x00,
+ 0x00, 0x2b, 0xff, 0x96, 0x00, 0x00, 0x97, 0xff, 0x27, 0x00,
+ 0x00, 0x5e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x49, 0x00,
+ 0x00, 0x5f, 0xff, 0xb8, 0x84, 0x84, 0x84, 0x84, 0x25, 0x00,
+ 0x00, 0x2c, 0xff, 0xb7, 0x00, 0x00, 0x07, 0x1e, 0x00, 0x00,
+ 0x00, 0x00, 0xac, 0xff, 0xbe, 0x8d, 0xd8, 0xde, 0x06, 0x00,
+ 0x00, 0x00, 0x08, 0x8a, 0xe2, 0xf5, 0xc4, 0x37, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000ec 'ì'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x0c, 0xba, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xb5, 0xd5, 0x01, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x17, 0xe3, 0x2a, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x7c, 0xff, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x3f, 0x84, 0xe4, 0xff, 0x04, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xc8, 0xff, 0x04, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xc8, 0xff, 0x04, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xc8, 0xff, 0x04, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xc8, 0xff, 0x04, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x4c, 0x84, 0xe4, 0xff, 0x85, 0x54, 0x00, 0x00,
+ 0x00, 0x00, 0x94, 0xff, 0xff, 0xff, 0xff, 0xa4, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000ed 'í'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x01, 0xcc, 0x5a, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x4e, 0xfd, 0x41, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x9a, 0x8a, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x7c, 0xff, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x3f, 0x84, 0xe4, 0xff, 0x04, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xc8, 0xff, 0x04, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xc8, 0xff, 0x04, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xc8, 0xff, 0x04, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xc8, 0xff, 0x04, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x4c, 0x84, 0xe4, 0xff, 0x85, 0x54, 0x00, 0x00,
+ 0x00, 0x00, 0x94, 0xff, 0xff, 0xff, 0xff, 0xa4, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000ee 'î'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x02, 0xa6, 0xc6, 0x0b, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x9e, 0xc5, 0xbf, 0xbf, 0x07, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x3c, 0x08, 0x07, 0x45, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x7c, 0xff, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x3f, 0x84, 0xe4, 0xff, 0x04, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xc8, 0xff, 0x04, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xc8, 0xff, 0x04, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xc8, 0xff, 0x04, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xc8, 0xff, 0x04, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x4a, 0x80, 0xe4, 0xff, 0x82, 0x52, 0x00, 0x00,
+ 0x00, 0x00, 0x94, 0xff, 0xff, 0xff, 0xff, 0xa4, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000ef 'ï'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x55, 0xf6, 0x6c, 0x63, 0xf6, 0x5c, 0x00, 0x00,
+ 0x00, 0x00, 0x69, 0xff, 0x82, 0x79, 0xff, 0x6f, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x7c, 0xff, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x3f, 0x84, 0xe4, 0xff, 0x04, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xc8, 0xff, 0x04, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xc8, 0xff, 0x04, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xc8, 0xff, 0x04, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xc8, 0xff, 0x04, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x4c, 0x84, 0xe4, 0xff, 0x85, 0x54, 0x00, 0x00,
+ 0x00, 0x00, 0x94, 0xff, 0xff, 0xff, 0xff, 0xa4, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000f0 'ð'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x05, 0x4a, 0x79, 0x14, 0x00, 0x04, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x56, 0xf3, 0xe1, 0xc0, 0xed, 0x0a, 0x00,
+ 0x00, 0x00, 0x00, 0xcb, 0xff, 0xff, 0xff, 0x6b, 0x0a, 0x00,
+ 0x00, 0x00, 0x00, 0x55, 0x46, 0x39, 0xfc, 0x8b, 0x00, 0x00,
+ 0x00, 0x00, 0x0d, 0x9e, 0xf4, 0xe2, 0xe7, 0xf1, 0x0b, 0x00,
+ 0x00, 0x00, 0xad, 0xff, 0xb1, 0x9d, 0xfd, 0xff, 0x44, 0x00,
+ 0x00, 0x26, 0xff, 0xc2, 0x00, 0x00, 0x93, 0xff, 0x72, 0x00,
+ 0x00, 0x5e, 0xff, 0x80, 0x00, 0x00, 0x56, 0xff, 0x82, 0x00,
+ 0x00, 0x5f, 0xff, 0x82, 0x00, 0x00, 0x58, 0xff, 0x74, 0x00,
+ 0x00, 0x29, 0xff, 0xc9, 0x01, 0x00, 0x99, 0xff, 0x40, 0x00,
+ 0x00, 0x00, 0xaa, 0xff, 0xb8, 0x9e, 0xfe, 0xcc, 0x02, 0x00,
+ 0x00, 0x00, 0x09, 0x92, 0xeb, 0xf2, 0xaa, 0x18, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000f1 'ñ'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x03, 0x9e, 0xf4, 0x73, 0x4b, 0x5f, 0x00, 0x00,
+ 0x00, 0x00, 0x67, 0xf6, 0xa1, 0xff, 0xff, 0x8f, 0x00, 0x00,
+ 0x00, 0x00, 0x05, 0x3a, 0x00, 0x46, 0x67, 0x02, 0x00, 0x00,
+ 0x00, 0x08, 0xff, 0xd1, 0xa6, 0xf8, 0xe1, 0x47, 0x00, 0x00,
+ 0x00, 0x08, 0xff, 0xff, 0xce, 0x91, 0xf9, 0xe8, 0x03, 0x00,
+ 0x00, 0x08, 0xff, 0xee, 0x0c, 0x00, 0xa8, 0xff, 0x25, 0x00,
+ 0x00, 0x08, 0xff, 0xc5, 0x00, 0x00, 0x91, 0xff, 0x33, 0x00,
+ 0x00, 0x08, 0xff, 0xc4, 0x00, 0x00, 0x90, 0xff, 0x34, 0x00,
+ 0x00, 0x08, 0xff, 0xc4, 0x00, 0x00, 0x90, 0xff, 0x34, 0x00,
+ 0x00, 0x08, 0xff, 0xc4, 0x00, 0x00, 0x90, 0xff, 0x34, 0x00,
+ 0x00, 0x08, 0xff, 0xc4, 0x00, 0x00, 0x90, 0xff, 0x34, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000f2 'ò'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x06, 0x90, 0x49, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x07, 0xd0, 0xc0, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x2a, 0xf7, 0x2c, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x0d, 0x98, 0xf0, 0xf4, 0xac, 0x19, 0x00, 0x00,
+ 0x00, 0x01, 0xbc, 0xff, 0xa4, 0xa2, 0xfe, 0xd2, 0x03, 0x00,
+ 0x00, 0x42, 0xff, 0x9f, 0x00, 0x00, 0x93, 0xff, 0x4d, 0x00,
+ 0x00, 0x7d, 0xff, 0x59, 0x00, 0x00, 0x4b, 0xff, 0x80, 0x00,
+ 0x00, 0x7e, 0xff, 0x58, 0x00, 0x00, 0x46, 0xff, 0x7e, 0x00,
+ 0x00, 0x48, 0xff, 0xa1, 0x00, 0x00, 0x88, 0xff, 0x4e, 0x00,
+ 0x00, 0x01, 0xc2, 0xff, 0xaa, 0x9f, 0xfc, 0xd2, 0x03, 0x00,
+ 0x00, 0x00, 0x0e, 0x9a, 0xed, 0xf1, 0xa8, 0x19, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000f3 'ó'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xa2, 0x3d, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x38, 0xff, 0x60, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xa2, 0xa9, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x10, 0x0f, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x0d, 0x98, 0xf0, 0xf4, 0xac, 0x19, 0x00, 0x00,
+ 0x00, 0x01, 0xbc, 0xff, 0xa4, 0xa2, 0xfe, 0xd2, 0x03, 0x00,
+ 0x00, 0x42, 0xff, 0x9f, 0x00, 0x00, 0x93, 0xff, 0x4d, 0x00,
+ 0x00, 0x7d, 0xff, 0x59, 0x00, 0x00, 0x4b, 0xff, 0x80, 0x00,
+ 0x00, 0x7e, 0xff, 0x58, 0x00, 0x00, 0x46, 0xff, 0x7e, 0x00,
+ 0x00, 0x48, 0xff, 0xa1, 0x00, 0x00, 0x88, 0xff, 0x4e, 0x00,
+ 0x00, 0x01, 0xc2, 0xff, 0xaa, 0x9f, 0xfc, 0xd2, 0x03, 0x00,
+ 0x00, 0x00, 0x0e, 0x9a, 0xed, 0xf1, 0xa8, 0x19, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000f4 'ô'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01, 0xa3, 0xc4, 0x0a, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x93, 0xcc, 0xc9, 0xb6, 0x05, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x52, 0x0d, 0x0e, 0x5f, 0x02, 0x00, 0x00,
+ 0x00, 0x00, 0x0d, 0x98, 0xf0, 0xf4, 0xac, 0x19, 0x00, 0x00,
+ 0x00, 0x01, 0xbc, 0xff, 0xa4, 0xa2, 0xfe, 0xd2, 0x03, 0x00,
+ 0x00, 0x42, 0xff, 0x9f, 0x00, 0x00, 0x93, 0xff, 0x4d, 0x00,
+ 0x00, 0x7d, 0xff, 0x59, 0x00, 0x00, 0x4b, 0xff, 0x80, 0x00,
+ 0x00, 0x7e, 0xff, 0x58, 0x00, 0x00, 0x46, 0xff, 0x7e, 0x00,
+ 0x00, 0x48, 0xff, 0xa1, 0x00, 0x00, 0x88, 0xff, 0x4e, 0x00,
+ 0x00, 0x01, 0xc2, 0xff, 0xaa, 0x9f, 0xfc, 0xd2, 0x03, 0x00,
+ 0x00, 0x00, 0x0e, 0x9a, 0xed, 0xf1, 0xa8, 0x19, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000f5 'õ'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x03, 0x9e, 0xf4, 0x73, 0x4b, 0x5f, 0x00, 0x00,
+ 0x00, 0x00, 0x67, 0xf6, 0xa1, 0xff, 0xff, 0x8f, 0x00, 0x00,
+ 0x00, 0x00, 0x05, 0x3a, 0x00, 0x46, 0x67, 0x02, 0x00, 0x00,
+ 0x00, 0x00, 0x0d, 0x98, 0xf0, 0xf4, 0xac, 0x19, 0x00, 0x00,
+ 0x00, 0x01, 0xbc, 0xff, 0xa4, 0xa2, 0xfe, 0xd2, 0x03, 0x00,
+ 0x00, 0x42, 0xff, 0x9f, 0x00, 0x00, 0x93, 0xff, 0x4d, 0x00,
+ 0x00, 0x7d, 0xff, 0x59, 0x00, 0x00, 0x4b, 0xff, 0x80, 0x00,
+ 0x00, 0x7e, 0xff, 0x58, 0x00, 0x00, 0x46, 0xff, 0x7e, 0x00,
+ 0x00, 0x48, 0xff, 0xa1, 0x00, 0x00, 0x88, 0xff, 0x4e, 0x00,
+ 0x00, 0x01, 0xc2, 0xff, 0xaa, 0x9f, 0xfc, 0xd2, 0x03, 0x00,
+ 0x00, 0x00, 0x0e, 0x9a, 0xed, 0xf1, 0xa8, 0x19, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000f6 'ö'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x55, 0xf6, 0x6c, 0x63, 0xf6, 0x5c, 0x00, 0x00,
+ 0x00, 0x00, 0x69, 0xff, 0x82, 0x79, 0xff, 0x6f, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x0d, 0x98, 0xf0, 0xf4, 0xac, 0x19, 0x00, 0x00,
+ 0x00, 0x01, 0xbc, 0xff, 0xa4, 0xa2, 0xfe, 0xd2, 0x03, 0x00,
+ 0x00, 0x42, 0xff, 0x9f, 0x00, 0x00, 0x93, 0xff, 0x4d, 0x00,
+ 0x00, 0x7d, 0xff, 0x59, 0x00, 0x00, 0x4b, 0xff, 0x80, 0x00,
+ 0x00, 0x7e, 0xff, 0x58, 0x00, 0x00, 0x46, 0xff, 0x7e, 0x00,
+ 0x00, 0x48, 0xff, 0xa1, 0x00, 0x00, 0x88, 0xff, 0x4e, 0x00,
+ 0x00, 0x01, 0xc2, 0xff, 0xaa, 0x9f, 0xfc, 0xd2, 0x03, 0x00,
+ 0x00, 0x00, 0x0e, 0x9a, 0xed, 0xf1, 0xa8, 0x19, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000f7 '÷'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x51, 0x64, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xc2, 0xe0, 0x09, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x08, 0x00,
+ 0x00, 0x00, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x04, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x56, 0x65, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xc6, 0xe2, 0x0a, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000f8 'ø'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x67, 0x47, 0x00, 0x00,
+ 0x00, 0x00, 0x0d, 0x98, 0xf0, 0xf6, 0xf8, 0xc6, 0x00, 0x00,
+ 0x00, 0x01, 0xbc, 0xff, 0xa4, 0xd9, 0xff, 0xc7, 0x01, 0x00,
+ 0x00, 0x42, 0xff, 0xa0, 0x19, 0xf5, 0xfc, 0xff, 0x48, 0x00,
+ 0x00, 0x7d, 0xff, 0x5a, 0x9c, 0xfd, 0x7c, 0xff, 0x7e, 0x00,
+ 0x00, 0x7e, 0xff, 0x84, 0xfd, 0xa0, 0x45, 0xff, 0x80, 0x00,
+ 0x00, 0x46, 0xff, 0xfc, 0xf6, 0x1b, 0x88, 0xff, 0x4f, 0x00,
+ 0x00, 0x01, 0xc0, 0xff, 0xd9, 0x9f, 0xfc, 0xd3, 0x04, 0x00,
+ 0x00, 0x00, 0xc5, 0xf2, 0xec, 0xf1, 0xa8, 0x19, 0x00, 0x00,
+ 0x00, 0x02, 0x72, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000f9 'ù'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x0c, 0xba, 0x60, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xb5, 0xd5, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x17, 0xe3, 0x2a, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x30, 0xff, 0x94, 0x00, 0x00, 0xc0, 0xff, 0x10, 0x00,
+ 0x00, 0x30, 0xff, 0x94, 0x00, 0x00, 0xc0, 0xff, 0x10, 0x00,
+ 0x00, 0x30, 0xff, 0x94, 0x00, 0x00, 0xc0, 0xff, 0x10, 0x00,
+ 0x00, 0x30, 0xff, 0x94, 0x00, 0x00, 0xc0, 0xff, 0x10, 0x00,
+ 0x00, 0x30, 0xff, 0x94, 0x00, 0x00, 0xc1, 0xff, 0x10, 0x00,
+ 0x00, 0x26, 0xff, 0xa8, 0x00, 0x0b, 0xec, 0xff, 0x10, 0x00,
+ 0x00, 0x03, 0xe6, 0xfb, 0x98, 0xcd, 0xff, 0xff, 0x10, 0x00,
+ 0x00, 0x00, 0x44, 0xdd, 0xf8, 0xae, 0xbb, 0xff, 0x1b, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000fa 'ú'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x01, 0xcc, 0x5a, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x4e, 0xfd, 0x41, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x9a, 0x8a, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x30, 0xff, 0x94, 0x00, 0x00, 0xc0, 0xff, 0x10, 0x00,
+ 0x00, 0x30, 0xff, 0x94, 0x00, 0x00, 0xc0, 0xff, 0x10, 0x00,
+ 0x00, 0x30, 0xff, 0x94, 0x00, 0x00, 0xc0, 0xff, 0x10, 0x00,
+ 0x00, 0x30, 0xff, 0x94, 0x00, 0x00, 0xc0, 0xff, 0x10, 0x00,
+ 0x00, 0x30, 0xff, 0x94, 0x00, 0x00, 0xc1, 0xff, 0x10, 0x00,
+ 0x00, 0x26, 0xff, 0xa8, 0x00, 0x0b, 0xec, 0xff, 0x10, 0x00,
+ 0x00, 0x03, 0xe6, 0xfb, 0x98, 0xcd, 0xff, 0xff, 0x10, 0x00,
+ 0x00, 0x00, 0x44, 0xdd, 0xf8, 0xae, 0xbb, 0xff, 0x1b, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000fb 'û'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x02, 0xa6, 0xc6, 0x0b, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x9e, 0xc5, 0xbf, 0xbf, 0x07, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x3c, 0x08, 0x07, 0x45, 0x00, 0x00, 0x00,
+ 0x00, 0x30, 0xff, 0x94, 0x00, 0x00, 0xc0, 0xff, 0x10, 0x00,
+ 0x00, 0x30, 0xff, 0x94, 0x00, 0x00, 0xc0, 0xff, 0x10, 0x00,
+ 0x00, 0x30, 0xff, 0x94, 0x00, 0x00, 0xc0, 0xff, 0x10, 0x00,
+ 0x00, 0x30, 0xff, 0x94, 0x00, 0x00, 0xc0, 0xff, 0x10, 0x00,
+ 0x00, 0x30, 0xff, 0x94, 0x00, 0x00, 0xc1, 0xff, 0x10, 0x00,
+ 0x00, 0x26, 0xff, 0xa8, 0x00, 0x0b, 0xec, 0xff, 0x10, 0x00,
+ 0x00, 0x03, 0xe6, 0xfb, 0x98, 0xcd, 0xff, 0xff, 0x10, 0x00,
+ 0x00, 0x00, 0x44, 0xdd, 0xf8, 0xae, 0xbb, 0xff, 0x1b, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000fc 'ü'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x55, 0xf6, 0x6c, 0x63, 0xf6, 0x5c, 0x00, 0x00,
+ 0x00, 0x00, 0x69, 0xff, 0x82, 0x79, 0xff, 0x6f, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00,
+ 0x00, 0x30, 0xff, 0x94, 0x00, 0x00, 0xc0, 0xff, 0x10, 0x00,
+ 0x00, 0x30, 0xff, 0x94, 0x00, 0x00, 0xc0, 0xff, 0x10, 0x00,
+ 0x00, 0x30, 0xff, 0x94, 0x00, 0x00, 0xc0, 0xff, 0x10, 0x00,
+ 0x00, 0x30, 0xff, 0x94, 0x00, 0x00, 0xc0, 0xff, 0x10, 0x00,
+ 0x00, 0x30, 0xff, 0x94, 0x00, 0x00, 0xc1, 0xff, 0x10, 0x00,
+ 0x00, 0x26, 0xff, 0xa8, 0x00, 0x0b, 0xec, 0xff, 0x10, 0x00,
+ 0x00, 0x03, 0xe6, 0xfb, 0x98, 0xcd, 0xff, 0xff, 0x10, 0x00,
+ 0x00, 0x00, 0x44, 0xdd, 0xf8, 0xae, 0xbb, 0xff, 0x1b, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000fd 'ý'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x01, 0xcc, 0x5a, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x4e, 0xfd, 0x41, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x9a, 0x8a, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x54, 0xff, 0xa1, 0x00, 0x00, 0x3a, 0xff, 0x74, 0x00,
+ 0x00, 0x08, 0xf0, 0xde, 0x00, 0x00, 0x78, 0xff, 0x2b, 0x00,
+ 0x00, 0x00, 0xa0, 0xff, 0x34, 0x00, 0xbe, 0xdb, 0x00, 0x00,
+ 0x00, 0x00, 0x46, 0xff, 0x8c, 0x14, 0xfc, 0x84, 0x00, 0x00,
+ 0x00, 0x00, 0x03, 0xe6, 0xe2, 0x69, 0xff, 0x29, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x90, 0xff, 0xe6, 0xce, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x36, 0xff, 0xff, 0x72, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xd9, 0xfc, 0x18, 0x00, 0x00, 0x00,
+ 0x00, 0x07, 0x1a, 0x09, 0xea, 0xba, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x78, 0xc6, 0xba, 0xff, 0x50, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x58, 0xe0, 0xf2, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000fe 'þ'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x34, 0xff, 0xa6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x34, 0xff, 0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x34, 0xff, 0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x34, 0xff, 0xbc, 0xcc, 0xfa, 0xbf, 0x28, 0x00, 0x00,
+ 0x00, 0x34, 0xff, 0xff, 0xa5, 0xa4, 0xff, 0xdf, 0x07, 0x00,
+ 0x00, 0x34, 0xff, 0xc4, 0x00, 0x00, 0xa3, 0xff, 0x4e, 0x00,
+ 0x00, 0x34, 0xff, 0x98, 0x00, 0x00, 0x61, 0xff, 0x70, 0x00,
+ 0x00, 0x34, 0xff, 0x9a, 0x00, 0x00, 0x5e, 0xff, 0x66, 0x00,
+ 0x00, 0x34, 0xff, 0xcf, 0x00, 0x00, 0xa3, 0xff, 0x36, 0x00,
+ 0x00, 0x34, 0xff, 0xff, 0xae, 0xa7, 0xff, 0xc8, 0x00, 0x00,
+ 0x00, 0x34, 0xff, 0xc7, 0xd0, 0xf7, 0xb1, 0x18, 0x00, 0x00,
+ 0x00, 0x34, 0xff, 0x9c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x34, 0xff, 0x9c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x34, 0xff, 0x9c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000ff 'ÿ'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x55, 0xf6, 0x6c, 0x63, 0xf6, 0x5c, 0x00, 0x00,
+ 0x00, 0x00, 0x69, 0xff, 0x82, 0x79, 0xff, 0x6f, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00,
+ 0x00, 0x54, 0xff, 0xa1, 0x00, 0x00, 0x3a, 0xff, 0x74, 0x00,
+ 0x00, 0x08, 0xf0, 0xde, 0x00, 0x00, 0x78, 0xff, 0x2b, 0x00,
+ 0x00, 0x00, 0xa0, 0xff, 0x34, 0x00, 0xbe, 0xdb, 0x00, 0x00,
+ 0x00, 0x00, 0x46, 0xff, 0x8c, 0x14, 0xfc, 0x84, 0x00, 0x00,
+ 0x00, 0x00, 0x03, 0xe6, 0xe2, 0x69, 0xff, 0x29, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x90, 0xff, 0xe6, 0xce, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x36, 0xff, 0xff, 0x72, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xd9, 0xfc, 0x18, 0x00, 0x00, 0x00,
+ 0x00, 0x07, 0x1a, 0x09, 0xea, 0xba, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x78, 0xc6, 0xba, 0xff, 0x50, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x58, 0xe0, 0xf2, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000102 'Ă'
+ 0x00, 0x00, 0x13, 0x4c, 0x00, 0x00, 0x54, 0x03, 0x00, 0x00,
+ 0x00, 0x00, 0x8c, 0xf9, 0x9d, 0xa8, 0xff, 0x44, 0x00, 0x00,
+ 0x00, 0x00, 0x0b, 0x93, 0xef, 0xe4, 0x68, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xd7, 0x8e, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x2e, 0xff, 0xe7, 0x03, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x82, 0xfd, 0xff, 0x46, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xd7, 0xaa, 0xe5, 0xa4, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x2e, 0xff, 0x58, 0x92, 0xf5, 0x0c, 0x00, 0x00,
+ 0x00, 0x00, 0x82, 0xfc, 0x1f, 0x4a, 0xff, 0x5e, 0x00, 0x00,
+ 0x00, 0x00, 0xd7, 0xff, 0xff, 0xff, 0xff, 0xbc, 0x00, 0x00,
+ 0x00, 0x2e, 0xff, 0xa3, 0x40, 0x40, 0xbc, 0xfd, 0x1c, 0x00,
+ 0x00, 0x82, 0xff, 0x44, 0x00, 0x00, 0x5e, 0xff, 0x76, 0x00,
+ 0x00, 0xd6, 0xf4, 0x07, 0x00, 0x00, 0x0f, 0xf8, 0xd4, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000103 'ă'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x39, 0xca, 0x24, 0x18, 0xbc, 0x3d, 0x00, 0x00,
+ 0x00, 0x00, 0x3f, 0xf0, 0xff, 0xff, 0xeb, 0x34, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x18, 0x6d, 0x70, 0x16, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x19, 0xa6, 0xf2, 0xf6, 0xb6, 0x1c, 0x00, 0x00,
+ 0x00, 0x00, 0x8e, 0xf3, 0x98, 0xa0, 0xfe, 0xb8, 0x00, 0x00,
+ 0x00, 0x00, 0x09, 0x25, 0x00, 0x00, 0xbf, 0xfb, 0x04, 0x00,
+ 0x00, 0x00, 0x2b, 0xb0, 0xee, 0xff, 0xff, 0xff, 0x13, 0x00,
+ 0x00, 0x13, 0xee, 0xf4, 0xa0, 0x85, 0xd1, 0xff, 0x14, 0x00,
+ 0x00, 0x53, 0xff, 0x7b, 0x00, 0x08, 0xd2, 0xff, 0x14, 0x00,
+ 0x00, 0x36, 0xff, 0xe3, 0x8d, 0xd2, 0xff, 0xff, 0x14, 0x00,
+ 0x00, 0x00, 0x77, 0xea, 0xf4, 0xa8, 0xbb, 0xff, 0x14, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000104 'Ą'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xdb, 0x92, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x32, 0xff, 0xeb, 0x05, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x86, 0xff, 0xff, 0x4e, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xda, 0xca, 0xf3, 0xac, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x2e, 0xff, 0x68, 0xa2, 0xf8, 0x11, 0x00, 0x00,
+ 0x00, 0x00, 0x84, 0xfd, 0x25, 0x51, 0xff, 0x68, 0x00, 0x00,
+ 0x00, 0x00, 0xda, 0xff, 0xff, 0xff, 0xff, 0xc6, 0x00, 0x00,
+ 0x00, 0x2e, 0xff, 0xa3, 0x40, 0x40, 0xbc, 0xff, 0x24, 0x00,
+ 0x00, 0x82, 0xff, 0x44, 0x00, 0x00, 0x5e, 0xff, 0x82, 0x00,
+ 0x00, 0xd6, 0xf4, 0x07, 0x00, 0x00, 0x0f, 0xf8, 0xde, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0xf0, 0x60, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbd, 0xe9, 0xb8, 0x08,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79, 0xf5, 0xbe, 0x03,
+
+ // U+00000105 'ą'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x19, 0xa6, 0xf2, 0xf8, 0xba, 0x1e, 0x00, 0x00,
+ 0x00, 0x00, 0x8e, 0xf3, 0x98, 0xa0, 0xfe, 0xbc, 0x00, 0x00,
+ 0x00, 0x00, 0x09, 0x25, 0x00, 0x00, 0xbf, 0xfc, 0x06, 0x00,
+ 0x00, 0x00, 0x2b, 0xb0, 0xee, 0xff, 0xff, 0xff, 0x13, 0x00,
+ 0x00, 0x13, 0xee, 0xf5, 0xa3, 0x85, 0xd1, 0xff, 0x14, 0x00,
+ 0x00, 0x53, 0xff, 0x7b, 0x00, 0x05, 0xcf, 0xff, 0x14, 0x00,
+ 0x00, 0x36, 0xff, 0xe5, 0x8d, 0xd0, 0xff, 0xff, 0x14, 0x00,
+ 0x00, 0x00, 0x79, 0xea, 0xf2, 0xa1, 0xba, 0xfc, 0x10, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0xfb, 0x59, 0x02, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xb6, 0xef, 0xb7, 0x14, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x6d, 0xf4, 0xc4, 0x08, 0x00,
+
+ // U+00000106 'Ć'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x56, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x11, 0xb7, 0xff, 0xb6, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x16, 0x95, 0x3a, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x6e, 0xde, 0xfd, 0xd3, 0x4e, 0x00, 0x00,
+ 0x00, 0x00, 0x86, 0xff, 0xcc, 0x8a, 0xdc, 0xfe, 0x4f, 0x00,
+ 0x00, 0x1c, 0xfb, 0xdb, 0x08, 0x00, 0x1a, 0xe4, 0x61, 0x00,
+ 0x00, 0x64, 0xff, 0x7e, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00,
+ 0x00, 0x83, 0xff, 0x59, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x82, 0xff, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x66, 0xff, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x1f, 0xfd, 0xe5, 0x11, 0x00, 0x0c, 0x89, 0x19, 0x00,
+ 0x00, 0x00, 0x8d, 0xff, 0xdc, 0x8f, 0xd6, 0xff, 0x5a, 0x00,
+ 0x00, 0x00, 0x01, 0x6f, 0xd8, 0xf9, 0xd8, 0x55, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000107 'ć'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xa2, 0x3d, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x38, 0xff, 0x60, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xa2, 0xa9, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x10, 0x0f, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x03, 0x7b, 0xe0, 0xfc, 0xd9, 0x65, 0x00, 0x00,
+ 0x00, 0x00, 0x98, 0xff, 0xc8, 0x8a, 0xd5, 0xff, 0x2e, 0x00,
+ 0x00, 0x21, 0xfe, 0xcf, 0x04, 0x00, 0x0c, 0x6d, 0x00, 0x00,
+ 0x00, 0x59, 0xff, 0x7b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x59, 0xff, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x20, 0xfe, 0xd3, 0x06, 0x00, 0x07, 0x3a, 0x00, 0x00,
+ 0x00, 0x00, 0x98, 0xff, 0xcd, 0x8c, 0xd7, 0xf5, 0x1b, 0x00,
+ 0x00, 0x00, 0x03, 0x7e, 0xe0, 0xf7, 0xd0, 0x58, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000010c 'Č'
+ 0x00, 0x00, 0x00, 0x0e, 0x41, 0x00, 0x02, 0x43, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x2f, 0xed, 0xa5, 0xcf, 0xbb, 0x06, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x28, 0xde, 0x99, 0x04, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x6e, 0xde, 0xfd, 0xd3, 0x4e, 0x00, 0x00,
+ 0x00, 0x00, 0x86, 0xff, 0xcc, 0x8a, 0xdc, 0xfe, 0x4f, 0x00,
+ 0x00, 0x1c, 0xfb, 0xdb, 0x08, 0x00, 0x1a, 0xe4, 0x61, 0x00,
+ 0x00, 0x64, 0xff, 0x7e, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00,
+ 0x00, 0x83, 0xff, 0x59, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x82, 0xff, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x66, 0xff, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x1f, 0xfd, 0xe5, 0x11, 0x00, 0x0c, 0x89, 0x19, 0x00,
+ 0x00, 0x00, 0x8d, 0xff, 0xdc, 0x8f, 0xd6, 0xff, 0x5a, 0x00,
+ 0x00, 0x00, 0x01, 0x6f, 0xd8, 0xf9, 0xd8, 0x55, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000010d 'č'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xbd, 0x74, 0x35, 0xd9, 0x09, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x4f, 0xfc, 0xed, 0x7a, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x8e, 0xb6, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x03, 0x7b, 0xe0, 0xfc, 0xd9, 0x65, 0x00, 0x00,
+ 0x00, 0x00, 0x98, 0xff, 0xc8, 0x8a, 0xd5, 0xff, 0x2e, 0x00,
+ 0x00, 0x21, 0xfe, 0xcf, 0x04, 0x00, 0x0c, 0x6d, 0x00, 0x00,
+ 0x00, 0x59, 0xff, 0x7b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x59, 0xff, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x20, 0xfe, 0xd3, 0x06, 0x00, 0x07, 0x3a, 0x00, 0x00,
+ 0x00, 0x00, 0x98, 0xff, 0xcd, 0x8c, 0xd7, 0xf5, 0x1b, 0x00,
+ 0x00, 0x00, 0x03, 0x7e, 0xe0, 0xf7, 0xd0, 0x58, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000010e 'Ď'
+ 0x00, 0x00, 0x0e, 0x41, 0x00, 0x02, 0x43, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x2f, 0xed, 0xa5, 0xcf, 0xbb, 0x06, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x28, 0xde, 0x99, 0x04, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x4c, 0xff, 0xff, 0xfe, 0xe3, 0x8d, 0x09, 0x00, 0x00,
+ 0x00, 0x4c, 0xff, 0xbc, 0x8c, 0xd6, 0xff, 0xa4, 0x00, 0x00,
+ 0x00, 0x4c, 0xff, 0x74, 0x00, 0x05, 0xc8, 0xff, 0x2c, 0x00,
+ 0x00, 0x4c, 0xff, 0x74, 0x00, 0x00, 0x5e, 0xff, 0x74, 0x00,
+ 0x00, 0x4c, 0xff, 0x74, 0x00, 0x00, 0x36, 0xff, 0x94, 0x00,
+ 0x00, 0x4c, 0xff, 0x74, 0x00, 0x00, 0x33, 0xff, 0x96, 0x00,
+ 0x00, 0x4c, 0xff, 0x74, 0x00, 0x00, 0x5d, 0xff, 0x79, 0x00,
+ 0x00, 0x4c, 0xff, 0x74, 0x00, 0x0a, 0xcd, 0xff, 0x34, 0x00,
+ 0x00, 0x4c, 0xff, 0xbc, 0x91, 0xde, 0xff, 0xa5, 0x00, 0x00,
+ 0x00, 0x4c, 0xff, 0xff, 0xf6, 0xd2, 0x77, 0x04, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000010f 'ď'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xb4, 0xff, 0x89, 0xed, 0x1d,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xb4, 0xff, 0x4e, 0xff, 0x36,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xb4, 0xff, 0x7d, 0xd1, 0x02,
+ 0x00, 0x07, 0x9a, 0xf6, 0xcc, 0xd0, 0xff, 0x2e, 0x28, 0x00,
+ 0x00, 0x8e, 0xff, 0xaf, 0xa8, 0xff, 0xff, 0x08, 0x00, 0x00,
+ 0x06, 0xf4, 0xd3, 0x00, 0x00, 0xda, 0xff, 0x08, 0x00, 0x00,
+ 0x29, 0xff, 0xa4, 0x00, 0x00, 0xb4, 0xff, 0x08, 0x00, 0x00,
+ 0x2e, 0xff, 0xa6, 0x00, 0x00, 0xba, 0xff, 0x08, 0x00, 0x00,
+ 0x0d, 0xfc, 0xdb, 0x02, 0x01, 0xe4, 0xff, 0x08, 0x00, 0x00,
+ 0x00, 0xa5, 0xff, 0xb6, 0xaf, 0xff, 0xff, 0x08, 0x00, 0x00,
+ 0x00, 0x0e, 0xa5, 0xf5, 0xd2, 0xbf, 0xff, 0x15, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000110 'Đ'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x4c, 0xff, 0xff, 0xfe, 0xe3, 0x8b, 0x08, 0x00, 0x00,
+ 0x00, 0x4c, 0xff, 0xbc, 0x8a, 0xd2, 0xff, 0xa3, 0x00, 0x00,
+ 0x00, 0x4c, 0xff, 0x74, 0x00, 0x04, 0xc6, 0xff, 0x2c, 0x00,
+ 0x00, 0x9e, 0xff, 0xbc, 0x7d, 0x00, 0x5e, 0xff, 0x74, 0x00,
+ 0x00, 0xec, 0xff, 0xff, 0xf4, 0x00, 0x36, 0xff, 0x94, 0x00,
+ 0x00, 0x4c, 0xff, 0x74, 0x00, 0x00, 0x33, 0xff, 0x96, 0x00,
+ 0x00, 0x4c, 0xff, 0x74, 0x00, 0x00, 0x5d, 0xff, 0x79, 0x00,
+ 0x00, 0x4c, 0xff, 0x74, 0x00, 0x0a, 0xcd, 0xff, 0x34, 0x00,
+ 0x00, 0x4c, 0xff, 0xbc, 0x91, 0xde, 0xff, 0xa5, 0x00, 0x00,
+ 0x00, 0x4c, 0xff, 0xff, 0xf6, 0xd2, 0x77, 0x04, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000111 'đ'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xff, 0x39, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xff, 0xff, 0xdc, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0xd1, 0xff, 0x86, 0x00,
+ 0x00, 0x00, 0x1d, 0xb8, 0xfa, 0xcd, 0xc5, 0xff, 0x2c, 0x00,
+ 0x00, 0x04, 0xd3, 0xfe, 0x9f, 0xac, 0xff, 0xff, 0x2c, 0x00,
+ 0x00, 0x4a, 0xff, 0x97, 0x00, 0x00, 0xcf, 0xff, 0x2c, 0x00,
+ 0x00, 0x79, 0xff, 0x54, 0x00, 0x00, 0xa1, 0xff, 0x2c, 0x00,
+ 0x00, 0x7c, 0xff, 0x53, 0x00, 0x00, 0xa7, 0xff, 0x2c, 0x00,
+ 0x00, 0x55, 0xff, 0x94, 0x00, 0x01, 0xda, 0xff, 0x2c, 0x00,
+ 0x00, 0x09, 0xe3, 0xfe, 0xa0, 0xb5, 0xff, 0xff, 0x2c, 0x00,
+ 0x00, 0x00, 0x2a, 0xbe, 0xf9, 0xd3, 0xb6, 0xff, 0x37, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000118 'Ę'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x18, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x64, 0x00,
+ 0x00, 0x18, 0xff, 0xd3, 0x84, 0x84, 0x84, 0x84, 0x33, 0x00,
+ 0x00, 0x18, 0xff, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x18, 0xff, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x18, 0xff, 0xff, 0xff, 0xff, 0xff, 0x94, 0x00, 0x00,
+ 0x00, 0x18, 0xff, 0xd3, 0x84, 0x84, 0x84, 0x4c, 0x00, 0x00,
+ 0x00, 0x18, 0xff, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x18, 0xff, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x18, 0xff, 0xd3, 0x84, 0x84, 0x84, 0x84, 0x2f, 0x00,
+ 0x00, 0x18, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5c, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xb1, 0xb5, 0x0e, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0xff, 0xa9, 0x55, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x35, 0xe6, 0xe2, 0x31, 0x00,
+
+ // U+00000119 'ę'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x0c, 0x97, 0xee, 0xf7, 0xad, 0x15, 0x00, 0x00,
+ 0x00, 0x00, 0xb2, 0xfd, 0xa0, 0x9b, 0xfc, 0xbe, 0x00, 0x00,
+ 0x00, 0x2b, 0xff, 0x96, 0x00, 0x00, 0x97, 0xff, 0x27, 0x00,
+ 0x00, 0x5e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x49, 0x00,
+ 0x00, 0x5f, 0xff, 0xb8, 0x84, 0x84, 0x84, 0x84, 0x25, 0x00,
+ 0x00, 0x30, 0xff, 0xb7, 0x00, 0x00, 0x07, 0x1e, 0x00, 0x00,
+ 0x00, 0x00, 0xba, 0xff, 0xbe, 0x8d, 0xd8, 0xe2, 0x07, 0x00,
+ 0x00, 0x00, 0x0f, 0x9f, 0xed, 0xed, 0xf5, 0x82, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0xd9, 0x05, 0x02, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xb3, 0xe1, 0xb4, 0x14, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x6a, 0xf4, 0xc4, 0x08, 0x00,
+
+ // U+0000011a 'Ě'
+ 0x00, 0x00, 0x0e, 0x41, 0x00, 0x02, 0x43, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x2f, 0xed, 0xa5, 0xcf, 0xbb, 0x06, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x28, 0xde, 0x99, 0x04, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x18, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x64, 0x00,
+ 0x00, 0x18, 0xff, 0xd3, 0x84, 0x84, 0x84, 0x84, 0x33, 0x00,
+ 0x00, 0x18, 0xff, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x18, 0xff, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x18, 0xff, 0xff, 0xff, 0xff, 0xff, 0x94, 0x00, 0x00,
+ 0x00, 0x18, 0xff, 0xd3, 0x84, 0x84, 0x84, 0x4c, 0x00, 0x00,
+ 0x00, 0x18, 0xff, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x18, 0xff, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x18, 0xff, 0xd3, 0x84, 0x84, 0x84, 0x84, 0x2f, 0x00,
+ 0x00, 0x18, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5c, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000011b 'ě'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xbd, 0x74, 0x35, 0xd9, 0x09, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x4f, 0xfc, 0xed, 0x7a, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x8e, 0xb6, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x0c, 0x97, 0xee, 0xf7, 0xad, 0x15, 0x00, 0x00,
+ 0x00, 0x00, 0xb2, 0xfd, 0xa0, 0x9b, 0xfc, 0xbe, 0x00, 0x00,
+ 0x00, 0x2b, 0xff, 0x96, 0x00, 0x00, 0x97, 0xff, 0x27, 0x00,
+ 0x00, 0x5e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x49, 0x00,
+ 0x00, 0x5f, 0xff, 0xb8, 0x84, 0x84, 0x84, 0x84, 0x25, 0x00,
+ 0x00, 0x2c, 0xff, 0xb7, 0x00, 0x00, 0x07, 0x1e, 0x00, 0x00,
+ 0x00, 0x00, 0xac, 0xff, 0xbe, 0x8d, 0xd8, 0xde, 0x06, 0x00,
+ 0x00, 0x00, 0x08, 0x8a, 0xe2, 0xf5, 0xc4, 0x37, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000011e 'Ğ'
+ 0x00, 0x00, 0x13, 0x4c, 0x00, 0x00, 0x54, 0x03, 0x00, 0x00,
+ 0x00, 0x00, 0x8c, 0xf9, 0x9d, 0xa8, 0xff, 0x44, 0x00, 0x00,
+ 0x00, 0x00, 0x0b, 0x93, 0xef, 0xe4, 0x68, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x08, 0x84, 0xe5, 0xfb, 0xc7, 0x3c, 0x00, 0x00,
+ 0x00, 0x01, 0xb7, 0xff, 0xb8, 0x8e, 0xe9, 0xf9, 0x33, 0x00,
+ 0x00, 0x4a, 0xff, 0xab, 0x00, 0x00, 0x30, 0xc9, 0x12, 0x00,
+ 0x00, 0x98, 0xff, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xb6, 0xff, 0x21, 0x00, 0x7d, 0x84, 0x84, 0x39, 0x00,
+ 0x00, 0xb6, 0xff, 0x23, 0x00, 0xf4, 0xff, 0xff, 0x70, 0x00,
+ 0x00, 0x92, 0xff, 0x4f, 0x00, 0x00, 0x40, 0xff, 0x70, 0x00,
+ 0x00, 0x46, 0xff, 0xbf, 0x02, 0x00, 0x40, 0xff, 0x70, 0x00,
+ 0x00, 0x00, 0xb8, 0xff, 0xc4, 0x8c, 0xd0, 0xff, 0x6d, 0x00,
+ 0x00, 0x00, 0x0b, 0x8b, 0xe4, 0xf8, 0xd7, 0x75, 0x05, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000011f 'ğ'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x39, 0xca, 0x24, 0x18, 0xbc, 0x3d, 0x00, 0x00,
+ 0x00, 0x00, 0x3f, 0xf0, 0xff, 0xff, 0xeb, 0x34, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x18, 0x6d, 0x70, 0x16, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x15, 0xad, 0xf8, 0xe0, 0x94, 0xeb, 0xa4, 0x00,
+ 0x00, 0x00, 0xb9, 0xf8, 0x91, 0xcf, 0xff, 0xbb, 0x75, 0x00,
+ 0x00, 0x0f, 0xff, 0x9d, 0x00, 0x2c, 0xff, 0x7d, 0x00, 0x00,
+ 0x00, 0x06, 0xf4, 0xcc, 0x11, 0x69, 0xff, 0x6d, 0x00, 0x00,
+ 0x00, 0x00, 0x71, 0xff, 0xff, 0xff, 0xd2, 0x0d, 0x00, 0x00,
+ 0x00, 0x00, 0xa3, 0xde, 0x7d, 0x61, 0x09, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xf3, 0xda, 0x86, 0x83, 0x6f, 0x1d, 0x00, 0x00,
+ 0x00, 0x00, 0xc6, 0xfb, 0xfd, 0xff, 0xff, 0xf3, 0x1f, 0x00,
+ 0x00, 0x57, 0xff, 0x46, 0x00, 0x00, 0x64, 0xff, 0x5b, 0x00,
+ 0x00, 0x61, 0xff, 0xce, 0x8c, 0x91, 0xe2, 0xf9, 0x23, 0x00,
+ 0x00, 0x03, 0x7e, 0xd9, 0xf9, 0xf2, 0xc0, 0x40, 0x00, 0x00,
+
+ // U+00000130 'İ'
+ 0x00, 0x00, 0x00, 0x00, 0xba, 0xe5, 0x19, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xd6, 0xf7, 0x23, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x09, 0x13, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xbc, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x00, 0x00,
+ 0x00, 0x00, 0x60, 0x84, 0xf2, 0xf4, 0x84, 0x6d, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe4, 0xe8, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe4, 0xe8, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe4, 0xe8, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe4, 0xe8, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe4, 0xe8, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe4, 0xe8, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x6d, 0x84, 0xf2, 0xf4, 0x84, 0x79, 0x00, 0x00,
+ 0x00, 0x00, 0xd4, 0xff, 0xff, 0xff, 0xff, 0xec, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000131 'ı'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x7c, 0xff, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x3f, 0x84, 0xe4, 0xff, 0x04, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xc8, 0xff, 0x04, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xc8, 0xff, 0x04, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xc8, 0xff, 0x04, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xc8, 0xff, 0x04, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x4c, 0x84, 0xe4, 0xff, 0x85, 0x54, 0x00, 0x00,
+ 0x00, 0x00, 0x94, 0xff, 0xff, 0xff, 0xff, 0xa4, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000138 'ĸ'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x04, 0x00, 0x00,
+ 0x00, 0x08, 0xff, 0xd4, 0x00, 0x19, 0xde, 0xf8, 0x45, 0x00,
+ 0x00, 0x08, 0xff, 0xc4, 0x10, 0xd1, 0xfb, 0x4e, 0x00, 0x00,
+ 0x00, 0x08, 0xff, 0xcd, 0xc4, 0xfd, 0x57, 0x00, 0x00, 0x00,
+ 0x00, 0x08, 0xff, 0xff, 0xff, 0xdf, 0x0a, 0x00, 0x00, 0x00,
+ 0x00, 0x08, 0xff, 0xf8, 0xb7, 0xff, 0x97, 0x00, 0x00, 0x00,
+ 0x00, 0x08, 0xff, 0xc4, 0x08, 0xd6, 0xff, 0x48, 0x00, 0x00,
+ 0x00, 0x08, 0xff, 0xc4, 0x00, 0x34, 0xfb, 0xe4, 0x11, 0x00,
+ 0x00, 0x08, 0xff, 0xc4, 0x00, 0x00, 0x80, 0xff, 0xa9, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000139 'Ĺ'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x18, 0xc1, 0x7a, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x22, 0xe6, 0xef, 0x8a, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x06, 0x52, 0x07, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x04, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x04, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x04, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x04, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x04, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x04, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x04, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x04, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x04, 0xff, 0xeb, 0x94, 0x94, 0x94, 0x94, 0x32, 0x00,
+ 0x00, 0x04, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x58, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000013a 'ĺ'
+ 0x00, 0x00, 0x00, 0x00, 0x36, 0xe1, 0x92, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x28, 0xf8, 0xc6, 0x64, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xd4, 0xff, 0xff, 0xec, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x6d, 0x84, 0xf0, 0xec, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe0, 0xec, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe0, 0xec, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe0, 0xec, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe0, 0xec, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe0, 0xec, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe0, 0xec, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe0, 0xec, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x79, 0x84, 0xf0, 0xf6, 0x84, 0x7f, 0x00, 0x00,
+ 0x00, 0x00, 0xec, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000013d 'Ľ'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x04, 0xff, 0xdc, 0x00, 0x00, 0xcf, 0xde, 0x12, 0x00,
+ 0x00, 0x04, 0xff, 0xd0, 0x00, 0x00, 0xaa, 0xff, 0x25, 0x00,
+ 0x00, 0x04, 0xff, 0xd0, 0x00, 0x11, 0xd8, 0xa5, 0x00, 0x00,
+ 0x00, 0x04, 0xff, 0xd0, 0x00, 0x02, 0x67, 0x08, 0x00, 0x00,
+ 0x00, 0x04, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x04, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x04, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x04, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x04, 0xff, 0xeb, 0x94, 0x94, 0x94, 0x94, 0x32, 0x00,
+ 0x00, 0x04, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x58, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000013e 'ľ'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xd4, 0xff, 0xff, 0xec, 0x00, 0xce, 0xd9, 0x0d,
+ 0x00, 0x00, 0x6d, 0x84, 0xf0, 0xec, 0x00, 0xbe, 0xff, 0x28,
+ 0x00, 0x00, 0x00, 0x00, 0xe0, 0xec, 0x04, 0xbe, 0xc1, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe0, 0xec, 0x13, 0xb1, 0x1d, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe0, 0xec, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe0, 0xec, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe0, 0xec, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe0, 0xec, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe0, 0xec, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x6a, 0x74, 0xee, 0xf5, 0x74, 0x70, 0x00, 0x00,
+ 0x00, 0x00, 0xec, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000141 'Ł'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x04, 0xff, 0xdd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x04, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x04, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x04, 0xff, 0xd0, 0x00, 0x30, 0x4f, 0x00, 0x00, 0x00,
+ 0x00, 0x04, 0xff, 0xf0, 0xdc, 0xff, 0x9b, 0x00, 0x00, 0x00,
+ 0x00, 0xd4, 0xff, 0xf7, 0xa2, 0x50, 0x0a, 0x00, 0x00, 0x00,
+ 0x00, 0x8b, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x04, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x04, 0xff, 0xeb, 0x94, 0x94, 0x94, 0x94, 0x32, 0x00,
+ 0x00, 0x04, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x58, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000142 'ł'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xd4, 0xff, 0xff, 0xec, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x6d, 0x84, 0xf0, 0xec, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe0, 0xec, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe0, 0xec, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe0, 0xf2, 0x91, 0x3e, 0x00, 0x00,
+ 0x00, 0x00, 0x05, 0x80, 0xf6, 0xff, 0xfa, 0x38, 0x00, 0x00,
+ 0x00, 0x00, 0x10, 0xf8, 0xfb, 0xf0, 0x10, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x03, 0x0e, 0xe0, 0xec, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe0, 0xec, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x79, 0x84, 0xf0, 0xf6, 0x84, 0x7f, 0x00, 0x00,
+ 0x00, 0x00, 0xec, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000143 'Ń'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x18, 0xc1, 0x7a, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x22, 0xe6, 0xef, 0x8a, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x06, 0x52, 0x07, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x7c, 0xff, 0xe6, 0x05, 0x00, 0x20, 0xff, 0x87, 0x00,
+ 0x00, 0x7c, 0xff, 0xff, 0x5c, 0x00, 0x20, 0xff, 0x7c, 0x00,
+ 0x00, 0x7c, 0xff, 0xf1, 0xcc, 0x00, 0x20, 0xff, 0x7c, 0x00,
+ 0x00, 0x7c, 0xff, 0x8e, 0xff, 0x3c, 0x20, 0xff, 0x7c, 0x00,
+ 0x00, 0x7c, 0xff, 0x2b, 0xee, 0xae, 0x20, 0xff, 0x7c, 0x00,
+ 0x00, 0x7c, 0xff, 0x20, 0x86, 0xfd, 0x43, 0xff, 0x7c, 0x00,
+ 0x00, 0x7c, 0xff, 0x20, 0x18, 0xf8, 0xb0, 0xff, 0x7c, 0x00,
+ 0x00, 0x7c, 0xff, 0x20, 0x00, 0x9e, 0xfd, 0xff, 0x7c, 0x00,
+ 0x00, 0x7c, 0xff, 0x20, 0x00, 0x2a, 0xfe, 0xff, 0x7c, 0x00,
+ 0x00, 0x7c, 0xff, 0x20, 0x00, 0x00, 0xb6, 0xff, 0x7c, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000144 'ń'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x01, 0xcc, 0x5a, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x4e, 0xfd, 0x41, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x9a, 0x8a, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x08, 0xff, 0xd1, 0xa6, 0xf8, 0xe1, 0x47, 0x00, 0x00,
+ 0x00, 0x08, 0xff, 0xff, 0xce, 0x91, 0xf9, 0xe8, 0x03, 0x00,
+ 0x00, 0x08, 0xff, 0xee, 0x0c, 0x00, 0xa8, 0xff, 0x25, 0x00,
+ 0x00, 0x08, 0xff, 0xc5, 0x00, 0x00, 0x91, 0xff, 0x33, 0x00,
+ 0x00, 0x08, 0xff, 0xc4, 0x00, 0x00, 0x90, 0xff, 0x34, 0x00,
+ 0x00, 0x08, 0xff, 0xc4, 0x00, 0x00, 0x90, 0xff, 0x34, 0x00,
+ 0x00, 0x08, 0xff, 0xc4, 0x00, 0x00, 0x90, 0xff, 0x34, 0x00,
+ 0x00, 0x08, 0xff, 0xc4, 0x00, 0x00, 0x90, 0xff, 0x34, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000147 'Ň'
+ 0x00, 0x00, 0x0e, 0x41, 0x00, 0x02, 0x43, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x2f, 0xed, 0xa5, 0xcf, 0xbb, 0x06, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x28, 0xde, 0x99, 0x04, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x7c, 0xff, 0xe6, 0x05, 0x00, 0x20, 0xff, 0x87, 0x00,
+ 0x00, 0x7c, 0xff, 0xff, 0x5c, 0x00, 0x20, 0xff, 0x7c, 0x00,
+ 0x00, 0x7c, 0xff, 0xf1, 0xcc, 0x00, 0x20, 0xff, 0x7c, 0x00,
+ 0x00, 0x7c, 0xff, 0x8e, 0xff, 0x3c, 0x20, 0xff, 0x7c, 0x00,
+ 0x00, 0x7c, 0xff, 0x2b, 0xee, 0xae, 0x20, 0xff, 0x7c, 0x00,
+ 0x00, 0x7c, 0xff, 0x20, 0x86, 0xfd, 0x43, 0xff, 0x7c, 0x00,
+ 0x00, 0x7c, 0xff, 0x20, 0x18, 0xf8, 0xb0, 0xff, 0x7c, 0x00,
+ 0x00, 0x7c, 0xff, 0x20, 0x00, 0x9e, 0xfd, 0xff, 0x7c, 0x00,
+ 0x00, 0x7c, 0xff, 0x20, 0x00, 0x2a, 0xfe, 0xff, 0x7c, 0x00,
+ 0x00, 0x7c, 0xff, 0x20, 0x00, 0x00, 0xb6, 0xff, 0x7c, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000148 'ň'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x54, 0x20, 0x04, 0x63, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xae, 0xd2, 0x9f, 0xd2, 0x08, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x10, 0xde, 0xf2, 0x26, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x2f, 0x44, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x08, 0xff, 0xd1, 0xa6, 0xf8, 0xe1, 0x47, 0x00, 0x00,
+ 0x00, 0x08, 0xff, 0xff, 0xce, 0x91, 0xf9, 0xe8, 0x03, 0x00,
+ 0x00, 0x08, 0xff, 0xee, 0x0c, 0x00, 0xa8, 0xff, 0x25, 0x00,
+ 0x00, 0x08, 0xff, 0xc5, 0x00, 0x00, 0x91, 0xff, 0x33, 0x00,
+ 0x00, 0x08, 0xff, 0xc4, 0x00, 0x00, 0x90, 0xff, 0x34, 0x00,
+ 0x00, 0x08, 0xff, 0xc4, 0x00, 0x00, 0x90, 0xff, 0x34, 0x00,
+ 0x00, 0x08, 0xff, 0xc4, 0x00, 0x00, 0x90, 0xff, 0x34, 0x00,
+ 0x00, 0x08, 0xff, 0xc4, 0x00, 0x00, 0x90, 0xff, 0x34, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000014a 'Ŋ'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x74, 0xff, 0x9d, 0xca, 0xfb, 0xd6, 0x43, 0x00, 0x00,
+ 0x00, 0x74, 0xff, 0xff, 0xbf, 0x91, 0xf9, 0xec, 0x08, 0x00,
+ 0x00, 0x74, 0xff, 0xb6, 0x01, 0x00, 0xa4, 0xff, 0x36, 0x00,
+ 0x00, 0x74, 0xff, 0x6b, 0x00, 0x00, 0x89, 0xff, 0x46, 0x00,
+ 0x00, 0x74, 0xff, 0x68, 0x00, 0x00, 0x88, 0xff, 0x48, 0x00,
+ 0x00, 0x74, 0xff, 0x68, 0x00, 0x00, 0x88, 0xff, 0x48, 0x00,
+ 0x00, 0x74, 0xff, 0x68, 0x00, 0x00, 0x88, 0xff, 0x48, 0x00,
+ 0x00, 0x74, 0xff, 0x68, 0x00, 0x00, 0x96, 0xff, 0x3e, 0x00,
+ 0x00, 0x74, 0xff, 0x68, 0x88, 0x94, 0xed, 0xf3, 0x0e, 0x00,
+ 0x00, 0x74, 0xff, 0x6d, 0xd0, 0xfa, 0xdb, 0x4b, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000014b 'ŋ'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x08, 0xff, 0xd1, 0xa6, 0xf8, 0xe1, 0x47, 0x00, 0x00,
+ 0x00, 0x08, 0xff, 0xff, 0xce, 0x91, 0xf9, 0xe8, 0x03, 0x00,
+ 0x00, 0x08, 0xff, 0xee, 0x0c, 0x00, 0xa9, 0xff, 0x25, 0x00,
+ 0x00, 0x08, 0xff, 0xc5, 0x00, 0x00, 0x91, 0xff, 0x33, 0x00,
+ 0x00, 0x08, 0xff, 0xc4, 0x00, 0x00, 0x90, 0xff, 0x34, 0x00,
+ 0x00, 0x08, 0xff, 0xc4, 0x00, 0x00, 0x90, 0xff, 0x34, 0x00,
+ 0x00, 0x08, 0xff, 0xc4, 0x00, 0x00, 0x90, 0xff, 0x34, 0x00,
+ 0x00, 0x08, 0xff, 0xc4, 0x00, 0x00, 0x93, 0xff, 0x2c, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x0b, 0x00, 0xb2, 0xfe, 0x0e, 0x00,
+ 0x00, 0x00, 0x00, 0x1d, 0xdb, 0x96, 0xfc, 0xb5, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x36, 0xd4, 0xf7, 0xb7, 0x19, 0x00, 0x00,
+
+ // U+0000014d 'ō'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x44, 0xff, 0xff, 0xff, 0xff, 0x38, 0x00, 0x00,
+ 0x00, 0x00, 0x23, 0x84, 0x84, 0x84, 0x84, 0x1c, 0x00, 0x00,
+ 0x00, 0x00, 0x0d, 0x98, 0xf0, 0xf4, 0xac, 0x19, 0x00, 0x00,
+ 0x00, 0x01, 0xbc, 0xff, 0xa4, 0xa2, 0xfe, 0xd2, 0x03, 0x00,
+ 0x00, 0x42, 0xff, 0x9f, 0x00, 0x00, 0x93, 0xff, 0x4d, 0x00,
+ 0x00, 0x7d, 0xff, 0x59, 0x00, 0x00, 0x4b, 0xff, 0x80, 0x00,
+ 0x00, 0x7e, 0xff, 0x58, 0x00, 0x00, 0x46, 0xff, 0x7e, 0x00,
+ 0x00, 0x48, 0xff, 0xa1, 0x00, 0x00, 0x88, 0xff, 0x4e, 0x00,
+ 0x00, 0x01, 0xc2, 0xff, 0xaa, 0x9f, 0xfc, 0xd2, 0x03, 0x00,
+ 0x00, 0x00, 0x0e, 0x9a, 0xed, 0xf1, 0xa8, 0x19, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000150 'Ő'
+ 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x10, 0xc1, 0x1e, 0x1f, 0xc3, 0x0c, 0x00,
+ 0x00, 0x00, 0x0b, 0xc6, 0xf1, 0x60, 0xdb, 0xe6, 0x2f, 0x00,
+ 0x00, 0x00, 0x3a, 0xbe, 0x1f, 0x5c, 0xaa, 0x12, 0x00, 0x00,
+ 0x00, 0x00, 0x10, 0xa0, 0xf2, 0xf3, 0xa6, 0x14, 0x00, 0x00,
+ 0x00, 0x02, 0xc4, 0xfe, 0xa2, 0xa5, 0xff, 0xc9, 0x03, 0x00,
+ 0x00, 0x4e, 0xff, 0x93, 0x00, 0x00, 0xa4, 0xff, 0x51, 0x00,
+ 0x00, 0x94, 0xff, 0x3e, 0x00, 0x00, 0x4b, 0xff, 0x96, 0x00,
+ 0x00, 0xb2, 0xff, 0x21, 0x00, 0x00, 0x2a, 0xff, 0xb2, 0x00,
+ 0x00, 0xb0, 0xff, 0x26, 0x00, 0x00, 0x2d, 0xff, 0xb2, 0x00,
+ 0x00, 0x8f, 0xff, 0x49, 0x00, 0x00, 0x4b, 0xff, 0x94, 0x00,
+ 0x00, 0x49, 0xff, 0xa7, 0x00, 0x00, 0x9b, 0xff, 0x51, 0x00,
+ 0x00, 0x01, 0xbe, 0xff, 0xad, 0xa4, 0xfe, 0xc9, 0x02, 0x00,
+ 0x00, 0x00, 0x10, 0x9d, 0xee, 0xf2, 0xa2, 0x12, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000151 'ő'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x0f, 0xb3, 0x1c, 0x7a, 0x65, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x78, 0xf6, 0x36, 0xef, 0x9c, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0xe0, 0x6a, 0x66, 0xd9, 0x0b, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x1f, 0x00, 0x04, 0x1c, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x0d, 0x98, 0xf0, 0xf4, 0xac, 0x19, 0x00, 0x00,
+ 0x00, 0x01, 0xbc, 0xff, 0xa4, 0xa2, 0xfe, 0xd2, 0x03, 0x00,
+ 0x00, 0x42, 0xff, 0x9f, 0x00, 0x00, 0x93, 0xff, 0x4d, 0x00,
+ 0x00, 0x7d, 0xff, 0x59, 0x00, 0x00, 0x4b, 0xff, 0x80, 0x00,
+ 0x00, 0x7e, 0xff, 0x58, 0x00, 0x00, 0x46, 0xff, 0x7e, 0x00,
+ 0x00, 0x48, 0xff, 0xa1, 0x00, 0x00, 0x88, 0xff, 0x4e, 0x00,
+ 0x00, 0x01, 0xc2, 0xff, 0xaa, 0x9f, 0xfc, 0xd2, 0x03, 0x00,
+ 0x00, 0x00, 0x0e, 0x9a, 0xed, 0xf1, 0xa8, 0x19, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000152 'Œ'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x85, 0xf1, 0xe5, 0xff, 0xff, 0xff, 0xe4, 0x00,
+ 0x00, 0x54, 0xff, 0xb5, 0xcf, 0xff, 0xb6, 0x84, 0x75, 0x00,
+ 0x00, 0xb2, 0xf8, 0x0b, 0x4a, 0xff, 0x68, 0x00, 0x00, 0x00,
+ 0x00, 0xe0, 0xd4, 0x00, 0x44, 0xff, 0x68, 0x00, 0x00, 0x00,
+ 0x00, 0xf2, 0xc6, 0x00, 0x44, 0xff, 0xff, 0xff, 0x84, 0x00,
+ 0x00, 0xf0, 0xc6, 0x00, 0x44, 0xff, 0xb6, 0x84, 0x44, 0x00,
+ 0x00, 0xdd, 0xd6, 0x00, 0x44, 0xff, 0x68, 0x00, 0x00, 0x00,
+ 0x00, 0xad, 0xfb, 0x11, 0x47, 0xff, 0x68, 0x00, 0x00, 0x00,
+ 0x00, 0x52, 0xff, 0xc0, 0xc6, 0xff, 0xb6, 0x84, 0x71, 0x00,
+ 0x00, 0x00, 0x86, 0xf2, 0xe8, 0xff, 0xff, 0xff, 0xdc, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000153 'œ'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x06, 0xa1, 0xf8, 0xb9, 0x97, 0xf8, 0xc6, 0x18, 0x00,
+ 0x00, 0x78, 0xff, 0xa1, 0xfd, 0xf3, 0x96, 0xfc, 0x9b, 0x00,
+ 0x00, 0xcf, 0xd4, 0x07, 0xfe, 0xa1, 0x00, 0xc5, 0xd8, 0x00,
+ 0x00, 0xf0, 0xaf, 0x14, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x00,
+ 0x00, 0xf0, 0xb2, 0x11, 0xff, 0xc8, 0x84, 0x84, 0x77, 0x00,
+ 0x00, 0xd1, 0xda, 0x03, 0xf9, 0xac, 0x00, 0x04, 0x12, 0x00,
+ 0x00, 0x7f, 0xff, 0xa4, 0xf8, 0xfc, 0x96, 0xc7, 0xc3, 0x01,
+ 0x00, 0x09, 0xa7, 0xf6, 0xb3, 0x9e, 0xf4, 0xdd, 0x51, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000154 'Ŕ'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x18, 0xc1, 0x7a, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x22, 0xe6, 0xef, 0x8a, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x06, 0x52, 0x07, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x40, 0xff, 0xff, 0xff, 0xf7, 0xcb, 0x46, 0x00, 0x00,
+ 0x00, 0x40, 0xff, 0xcb, 0x84, 0x96, 0xf3, 0xf8, 0x1d, 0x00,
+ 0x00, 0x40, 0xff, 0x94, 0x00, 0x00, 0x81, 0xff, 0x59, 0x00,
+ 0x00, 0x40, 0xff, 0x94, 0x00, 0x12, 0xb9, 0xff, 0x3e, 0x00,
+ 0x00, 0x40, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa9, 0x00, 0x00,
+ 0x00, 0x40, 0xff, 0xcb, 0x95, 0xff, 0xb3, 0x00, 0x00, 0x00,
+ 0x00, 0x40, 0xff, 0x94, 0x00, 0xcd, 0xf8, 0x1b, 0x00, 0x00,
+ 0x00, 0x40, 0xff, 0x94, 0x00, 0x58, 0xff, 0x94, 0x00, 0x00,
+ 0x00, 0x40, 0xff, 0x94, 0x00, 0x03, 0xde, 0xf8, 0x1b, 0x00,
+ 0x00, 0x40, 0xff, 0x94, 0x00, 0x00, 0x6c, 0xff, 0x94, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000155 'ŕ'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x01, 0xcc, 0x5a, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x4e, 0xfd, 0x41, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x9a, 0x8a, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x94, 0xff, 0x90, 0xdb, 0xfc, 0xcd, 0x35, 0x00,
+ 0x00, 0x00, 0x94, 0xff, 0xff, 0xb1, 0x9d, 0xfd, 0x2e, 0x00,
+ 0x00, 0x00, 0x94, 0xff, 0xa1, 0x00, 0x00, 0x47, 0x00, 0x00,
+ 0x00, 0x00, 0x94, 0xff, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x94, 0xff, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x94, 0xff, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x94, 0xff, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x94, 0xff, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000158 'Ř'
+ 0x00, 0x00, 0x0e, 0x41, 0x00, 0x02, 0x43, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x2f, 0xed, 0xa5, 0xcf, 0xbb, 0x06, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x28, 0xde, 0x99, 0x04, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x40, 0xff, 0xff, 0xff, 0xf7, 0xcb, 0x46, 0x00, 0x00,
+ 0x00, 0x40, 0xff, 0xcb, 0x84, 0x96, 0xf3, 0xf8, 0x1d, 0x00,
+ 0x00, 0x40, 0xff, 0x94, 0x00, 0x00, 0x81, 0xff, 0x59, 0x00,
+ 0x00, 0x40, 0xff, 0x94, 0x00, 0x12, 0xb9, 0xff, 0x3e, 0x00,
+ 0x00, 0x40, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa9, 0x00, 0x00,
+ 0x00, 0x40, 0xff, 0xcb, 0x95, 0xff, 0xb3, 0x00, 0x00, 0x00,
+ 0x00, 0x40, 0xff, 0x94, 0x00, 0xcd, 0xf8, 0x1b, 0x00, 0x00,
+ 0x00, 0x40, 0xff, 0x94, 0x00, 0x58, 0xff, 0x94, 0x00, 0x00,
+ 0x00, 0x40, 0xff, 0x94, 0x00, 0x03, 0xde, 0xf8, 0x1b, 0x00,
+ 0x00, 0x40, 0xff, 0x94, 0x00, 0x00, 0x6c, 0xff, 0x94, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000159 'ř'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x54, 0x20, 0x04, 0x63, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xae, 0xd2, 0x9f, 0xd2, 0x08, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x10, 0xde, 0xf2, 0x26, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x2f, 0x44, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x94, 0xff, 0x90, 0xdb, 0xfc, 0xcd, 0x35, 0x00,
+ 0x00, 0x00, 0x94, 0xff, 0xff, 0xb1, 0x9d, 0xfd, 0x2e, 0x00,
+ 0x00, 0x00, 0x94, 0xff, 0xa1, 0x00, 0x00, 0x47, 0x00, 0x00,
+ 0x00, 0x00, 0x94, 0xff, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x94, 0xff, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x94, 0xff, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x94, 0xff, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x94, 0xff, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000015a 'Ś'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x56, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x11, 0xb7, 0xff, 0xb6, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x16, 0x95, 0x3a, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x21, 0xb1, 0xf4, 0xf3, 0xb2, 0x27, 0x00, 0x00,
+ 0x00, 0x06, 0xdd, 0xfa, 0x96, 0x9c, 0xf5, 0xdf, 0x03, 0x00,
+ 0x00, 0x32, 0xff, 0xae, 0x00, 0x00, 0x39, 0x4f, 0x00, 0x00,
+ 0x00, 0x13, 0xf6, 0xf2, 0x4a, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x53, 0xf3, 0xff, 0xce, 0x5f, 0x02, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x18, 0x83, 0xea, 0xff, 0xb5, 0x02, 0x00,
+ 0x00, 0x00, 0x02, 0x00, 0x00, 0x0c, 0xbf, 0xff, 0x43, 0x00,
+ 0x00, 0x0e, 0xbf, 0x11, 0x00, 0x00, 0x8b, 0xff, 0x50, 0x00,
+ 0x00, 0x57, 0xff, 0xe6, 0x94, 0x9e, 0xf8, 0xeb, 0x10, 0x00,
+ 0x00, 0x00, 0x58, 0xc9, 0xf5, 0xee, 0xae, 0x29, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000015b 'ś'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xa2, 0x3d, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x38, 0xff, 0x60, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xa2, 0xa9, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x10, 0x0f, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x07, 0x8d, 0xec, 0xf7, 0xc0, 0x36, 0x00, 0x00,
+ 0x00, 0x00, 0x8e, 0xfe, 0x9b, 0x91, 0xe3, 0xe4, 0x03, 0x00,
+ 0x00, 0x00, 0xbe, 0xf4, 0x2c, 0x00, 0x11, 0x4c, 0x00, 0x00,
+ 0x00, 0x00, 0x52, 0xfa, 0xff, 0xd6, 0x7f, 0x0d, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x27, 0x8d, 0xde, 0xff, 0xcf, 0x04, 0x00,
+ 0x00, 0x00, 0x86, 0x23, 0x00, 0x02, 0xbf, 0xff, 0x27, 0x00,
+ 0x00, 0x15, 0xfa, 0xf3, 0x9d, 0x93, 0xf2, 0xdc, 0x04, 0x00,
+ 0x00, 0x00, 0x44, 0xbf, 0xf4, 0xf2, 0xae, 0x21, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000015e 'Ş'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x25, 0xb4, 0xf4, 0xf3, 0xb2, 0x27, 0x00, 0x00,
+ 0x00, 0x09, 0xe3, 0xfa, 0x96, 0x99, 0xf2, 0xde, 0x03, 0x00,
+ 0x00, 0x32, 0xff, 0xaf, 0x00, 0x00, 0x32, 0x47, 0x00, 0x00,
+ 0x00, 0x0c, 0xeb, 0xf4, 0x54, 0x01, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x33, 0xd7, 0xff, 0xd9, 0x6e, 0x05, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x03, 0x4f, 0xbd, 0xff, 0xc2, 0x05, 0x00,
+ 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x9d, 0xff, 0x48, 0x00,
+ 0x00, 0x2b, 0xf0, 0x4c, 0x00, 0x03, 0xac, 0xff, 0x4a, 0x00,
+ 0x00, 0x3e, 0xf5, 0xff, 0xe7, 0xec, 0xff, 0xd9, 0x08, 0x00,
+ 0x00, 0x00, 0x22, 0x91, 0xe8, 0xe8, 0x89, 0x14, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x04, 0xb6, 0xfa, 0x82, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x07, 0xd5, 0x97, 0xd6, 0xd6, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x02, 0x8a, 0xf1, 0xe4, 0x52, 0x00, 0x00, 0x00,
+
+ // U+0000015f 'ş'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x0a, 0x95, 0xed, 0xf7, 0xc0, 0x36, 0x00, 0x00,
+ 0x00, 0x00, 0x98, 0xfd, 0x99, 0x90, 0xe0, 0xe1, 0x03, 0x00,
+ 0x00, 0x00, 0xb8, 0xf5, 0x37, 0x00, 0x0b, 0x40, 0x00, 0x00,
+ 0x00, 0x00, 0x37, 0xe4, 0xff, 0xe3, 0x8d, 0x15, 0x00, 0x00,
+ 0x00, 0x00, 0x13, 0x06, 0x52, 0xa1, 0xfc, 0xdc, 0x08, 0x00,
+ 0x00, 0x00, 0xc4, 0x6a, 0x02, 0x00, 0xba, 0xff, 0x26, 0x00,
+ 0x00, 0x14, 0xe6, 0xff, 0xed, 0xe7, 0xff, 0xc6, 0x01, 0x00,
+ 0x00, 0x00, 0x12, 0x78, 0xdf, 0xe4, 0x79, 0x0b, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x04, 0xb6, 0xfb, 0x83, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x07, 0xd5, 0x97, 0xd6, 0xd7, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x02, 0x8a, 0xf1, 0xe4, 0x52, 0x00, 0x00, 0x00,
+
+ // U+00000160 'Š'
+ 0x00, 0x00, 0x0e, 0x41, 0x00, 0x02, 0x43, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x2f, 0xed, 0xa5, 0xcf, 0xbb, 0x06, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x28, 0xde, 0x99, 0x04, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x21, 0xb1, 0xf4, 0xf3, 0xb2, 0x27, 0x00, 0x00,
+ 0x00, 0x06, 0xdd, 0xfa, 0x96, 0x9c, 0xf5, 0xdf, 0x03, 0x00,
+ 0x00, 0x32, 0xff, 0xae, 0x00, 0x00, 0x39, 0x4f, 0x00, 0x00,
+ 0x00, 0x13, 0xf6, 0xf2, 0x4a, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x53, 0xf3, 0xff, 0xce, 0x5f, 0x02, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x18, 0x83, 0xea, 0xff, 0xb5, 0x02, 0x00,
+ 0x00, 0x00, 0x02, 0x00, 0x00, 0x0c, 0xbf, 0xff, 0x43, 0x00,
+ 0x00, 0x0e, 0xbf, 0x11, 0x00, 0x00, 0x8b, 0xff, 0x50, 0x00,
+ 0x00, 0x57, 0xff, 0xe6, 0x94, 0x9e, 0xf8, 0xeb, 0x10, 0x00,
+ 0x00, 0x00, 0x58, 0xc9, 0xf5, 0xee, 0xae, 0x29, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000161 'š'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xbd, 0x74, 0x35, 0xd9, 0x09, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x4f, 0xfc, 0xed, 0x7a, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x8e, 0xb6, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x07, 0x8d, 0xec, 0xf7, 0xc0, 0x36, 0x00, 0x00,
+ 0x00, 0x00, 0x8e, 0xfe, 0x9b, 0x91, 0xe3, 0xe4, 0x03, 0x00,
+ 0x00, 0x00, 0xbe, 0xf4, 0x2c, 0x00, 0x11, 0x4c, 0x00, 0x00,
+ 0x00, 0x00, 0x52, 0xfa, 0xff, 0xd6, 0x7f, 0x0d, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x27, 0x8d, 0xde, 0xff, 0xcf, 0x04, 0x00,
+ 0x00, 0x00, 0x86, 0x23, 0x00, 0x02, 0xbf, 0xff, 0x27, 0x00,
+ 0x00, 0x15, 0xfa, 0xf3, 0x9d, 0x93, 0xf2, 0xdc, 0x04, 0x00,
+ 0x00, 0x00, 0x44, 0xbf, 0xf4, 0xf2, 0xae, 0x21, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000162 'Ţ'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xac, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xac, 0x00,
+ 0x00, 0x58, 0x84, 0x84, 0xfc, 0xee, 0x84, 0x84, 0x58, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xf8, 0xdc, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xf8, 0xdc, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xf8, 0xdc, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xf8, 0xdc, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xf8, 0xdc, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xf8, 0xdc, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xf8, 0xdc, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xf8, 0xdc, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xd4, 0xca, 0x2c, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x18, 0xce, 0xa2, 0xec, 0xae, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x0b, 0xa5, 0xf6, 0xde, 0x41, 0x00, 0x00, 0x00,
+
+ // U+00000163 'ţ'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x02, 0x16, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x44, 0xf6, 0x8d, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x5e, 0xff, 0x6c, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x18, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x00, 0x00,
+ 0x00, 0x0c, 0x84, 0xc2, 0xff, 0xa7, 0x84, 0x52, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x8f, 0xff, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x9a, 0xff, 0x30, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xa0, 0xff, 0x31, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x96, 0xff, 0x51, 0x0d, 0x70, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x5a, 0xff, 0xf4, 0xf2, 0xff, 0x20, 0x00,
+ 0x00, 0x00, 0x00, 0x01, 0x78, 0xf6, 0xc4, 0x3f, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x04, 0xf2, 0xef, 0x4d, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x2a, 0xdd, 0x8e, 0xf1, 0x9b, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x12, 0xae, 0xf7, 0xd0, 0x2b, 0x00, 0x00,
+
+ // U+00000164 'Ť'
+ 0x00, 0x00, 0x0e, 0x41, 0x00, 0x02, 0x43, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x2f, 0xed, 0xa5, 0xcf, 0xbb, 0x06, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x28, 0xde, 0x99, 0x04, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xac, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xac, 0x00,
+ 0x00, 0x58, 0x84, 0x84, 0xfc, 0xee, 0x84, 0x84, 0x58, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xf8, 0xdc, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xf8, 0xdc, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xf8, 0xdc, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xf8, 0xdc, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xf8, 0xdc, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xf8, 0xdc, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xf8, 0xdc, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xf8, 0xdc, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000165 'ť'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc8, 0xd5, 0x09,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd7, 0xff, 0x2d,
+ 0x00, 0x00, 0x00, 0x00, 0x19, 0x2e, 0x00, 0x97, 0xe3, 0x04,
+ 0x00, 0x00, 0x00, 0x4d, 0xff, 0x88, 0x1a, 0xf8, 0x50, 0x00,
+ 0x00, 0x00, 0x00, 0x5e, 0xff, 0x6c, 0x00, 0x24, 0x00, 0x00,
+ 0x00, 0x18, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x00, 0x00,
+ 0x00, 0x0c, 0x84, 0xc2, 0xff, 0xa7, 0x84, 0x52, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x8e, 0xff, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x99, 0xff, 0x30, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xa0, 0xff, 0x30, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x97, 0xff, 0x40, 0x00, 0x2d, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x69, 0xff, 0xc7, 0xae, 0xfa, 0x15, 0x00,
+ 0x00, 0x00, 0x00, 0x08, 0xac, 0xf8, 0xe2, 0x80, 0x09, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000016e 'Ů'
+ 0x00, 0x00, 0x00, 0x14, 0xd4, 0xdf, 0x25, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x7b, 0xdd, 0xce, 0x9a, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x90, 0xa5, 0x85, 0xb1, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x4a, 0xff, 0xff, 0x69, 0x00, 0x00, 0x00,
+ 0x00, 0x68, 0xff, 0x6c, 0x54, 0x5f, 0x58, 0xff, 0x68, 0x00,
+ 0x00, 0x68, 0xff, 0x64, 0x00, 0x00, 0x58, 0xff, 0x68, 0x00,
+ 0x00, 0x68, 0xff, 0x64, 0x00, 0x00, 0x58, 0xff, 0x68, 0x00,
+ 0x00, 0x68, 0xff, 0x64, 0x00, 0x00, 0x58, 0xff, 0x68, 0x00,
+ 0x00, 0x68, 0xff, 0x64, 0x00, 0x00, 0x58, 0xff, 0x68, 0x00,
+ 0x00, 0x68, 0xff, 0x64, 0x00, 0x00, 0x58, 0xff, 0x68, 0x00,
+ 0x00, 0x65, 0xff, 0x66, 0x00, 0x00, 0x5d, 0xff, 0x62, 0x00,
+ 0x00, 0x44, 0xff, 0x92, 0x00, 0x00, 0x8c, 0xff, 0x41, 0x00,
+ 0x00, 0x04, 0xda, 0xfb, 0x9d, 0x9c, 0xfb, 0xd7, 0x03, 0x00,
+ 0x00, 0x00, 0x21, 0xb1, 0xf2, 0xf1, 0xb1, 0x20, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000016f 'ů'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01, 0x63, 0x5f, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x68, 0xff, 0xff, 0x67, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xa2, 0x98, 0x9b, 0xa4, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x67, 0xff, 0xff, 0x66, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01, 0x61, 0x5e, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x30, 0xff, 0x94, 0x00, 0x00, 0xc0, 0xff, 0x10, 0x00,
+ 0x00, 0x30, 0xff, 0x94, 0x00, 0x00, 0xc0, 0xff, 0x10, 0x00,
+ 0x00, 0x30, 0xff, 0x94, 0x00, 0x00, 0xc0, 0xff, 0x10, 0x00,
+ 0x00, 0x30, 0xff, 0x94, 0x00, 0x00, 0xc0, 0xff, 0x10, 0x00,
+ 0x00, 0x30, 0xff, 0x94, 0x00, 0x00, 0xc1, 0xff, 0x10, 0x00,
+ 0x00, 0x26, 0xff, 0xa8, 0x00, 0x0b, 0xec, 0xff, 0x10, 0x00,
+ 0x00, 0x03, 0xe6, 0xfb, 0x98, 0xcd, 0xff, 0xff, 0x10, 0x00,
+ 0x00, 0x00, 0x44, 0xdd, 0xf8, 0xae, 0xbb, 0xff, 0x1b, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000170 'Ű'
+ 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x2f, 0xed, 0x40, 0x49, 0xef, 0x24, 0x00,
+ 0x00, 0x00, 0x26, 0xea, 0xc9, 0x63, 0xf6, 0xb4, 0x18, 0x00,
+ 0x00, 0x00, 0x20, 0x79, 0x03, 0x36, 0x66, 0x00, 0x00, 0x00,
+ 0x00, 0x68, 0xff, 0x6c, 0x00, 0x00, 0x58, 0xff, 0x68, 0x00,
+ 0x00, 0x68, 0xff, 0x64, 0x00, 0x00, 0x58, 0xff, 0x68, 0x00,
+ 0x00, 0x68, 0xff, 0x64, 0x00, 0x00, 0x58, 0xff, 0x68, 0x00,
+ 0x00, 0x68, 0xff, 0x64, 0x00, 0x00, 0x58, 0xff, 0x68, 0x00,
+ 0x00, 0x68, 0xff, 0x64, 0x00, 0x00, 0x58, 0xff, 0x68, 0x00,
+ 0x00, 0x68, 0xff, 0x64, 0x00, 0x00, 0x58, 0xff, 0x68, 0x00,
+ 0x00, 0x65, 0xff, 0x66, 0x00, 0x00, 0x5d, 0xff, 0x62, 0x00,
+ 0x00, 0x44, 0xff, 0x92, 0x00, 0x00, 0x8c, 0xff, 0x41, 0x00,
+ 0x00, 0x04, 0xda, 0xfb, 0x9d, 0x9c, 0xfb, 0xd7, 0x03, 0x00,
+ 0x00, 0x00, 0x21, 0xb1, 0xf2, 0xf1, 0xb1, 0x20, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000171 'ű'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x1d, 0xda, 0x2f, 0x9a, 0x8b, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x8e, 0xe9, 0x2f, 0xf9, 0x7c, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0xd8, 0x4a, 0x5e, 0xc2, 0x02, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
+ 0x00, 0x30, 0xff, 0x94, 0x00, 0x00, 0xc0, 0xff, 0x10, 0x00,
+ 0x00, 0x30, 0xff, 0x94, 0x00, 0x00, 0xc0, 0xff, 0x10, 0x00,
+ 0x00, 0x30, 0xff, 0x94, 0x00, 0x00, 0xc0, 0xff, 0x10, 0x00,
+ 0x00, 0x30, 0xff, 0x94, 0x00, 0x00, 0xc0, 0xff, 0x10, 0x00,
+ 0x00, 0x30, 0xff, 0x94, 0x00, 0x00, 0xc1, 0xff, 0x10, 0x00,
+ 0x00, 0x26, 0xff, 0xa8, 0x00, 0x0b, 0xec, 0xff, 0x10, 0x00,
+ 0x00, 0x03, 0xe6, 0xfb, 0x98, 0xcd, 0xff, 0xff, 0x10, 0x00,
+ 0x00, 0x00, 0x44, 0xdd, 0xf8, 0xae, 0xbb, 0xff, 0x1b, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000178 'Ÿ'
+ 0x00, 0x00, 0x7b, 0xf4, 0x45, 0x86, 0xf2, 0x37, 0x00, 0x00,
+ 0x00, 0x00, 0x95, 0xff, 0x5b, 0xa3, 0xff, 0x49, 0x00, 0x00,
+ 0x00, 0x00, 0x02, 0x1a, 0x00, 0x03, 0x19, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x9c, 0xff, 0x64, 0x00, 0x00, 0x36, 0xff, 0xb8, 0x00,
+ 0x00, 0x21, 0xfa, 0xde, 0x05, 0x00, 0xa8, 0xff, 0x40, 0x00,
+ 0x00, 0x00, 0x9a, 0xff, 0x64, 0x1e, 0xfb, 0xc7, 0x00, 0x00,
+ 0x00, 0x00, 0x1e, 0xf9, 0xde, 0x91, 0xff, 0x50, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x96, 0xff, 0xfe, 0xd5, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x1b, 0xf8, 0xff, 0x60, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xc8, 0xff, 0x1c, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xc8, 0xff, 0x1c, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xc8, 0xff, 0x1c, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xc8, 0xff, 0x1c, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000179 'Ź'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x18, 0xc1, 0x7a, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x22, 0xe6, 0xef, 0x8a, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x06, 0x52, 0x07, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x2c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x00,
+ 0x00, 0x16, 0x84, 0x84, 0x84, 0x87, 0xfa, 0xf8, 0x24, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x6e, 0xff, 0x84, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x19, 0xf1, 0xdf, 0x09, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xa6, 0xff, 0x50, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x43, 0xff, 0xb7, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x06, 0xd8, 0xf9, 0x25, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x7a, 0xff, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x1e, 0xf5, 0xff, 0x8f, 0x84, 0x84, 0x84, 0x52, 0x00,
+ 0x00, 0x58, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000017a 'ź'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x05, 0xe1, 0x71, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x60, 0xf7, 0x2c, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x84, 0x6d, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00,
+ 0x00, 0x00, 0x84, 0x84, 0x84, 0xd0, 0xff, 0xb2, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x2f, 0xf8, 0xe6, 0x14, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x09, 0xd6, 0xfe, 0x44, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x98, 0xff, 0x8c, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x50, 0xff, 0xcf, 0x06, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x1a, 0xec, 0xff, 0xaa, 0x84, 0x84, 0x84, 0x29, 0x00,
+ 0x00, 0x50, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000017b 'Ż'
+ 0x00, 0x00, 0x00, 0x00, 0xba, 0xe5, 0x19, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xd6, 0xf7, 0x23, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x09, 0x13, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x2c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x00,
+ 0x00, 0x16, 0x84, 0x84, 0x84, 0x87, 0xfa, 0xf8, 0x24, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x6e, 0xff, 0x84, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x19, 0xf1, 0xdf, 0x09, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xa6, 0xff, 0x50, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x43, 0xff, 0xb7, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x06, 0xd8, 0xf9, 0x25, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x7a, 0xff, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x1e, 0xf5, 0xff, 0x8f, 0x84, 0x84, 0x84, 0x52, 0x00,
+ 0x00, 0x58, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000017c 'ż'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01, 0xca, 0xdc, 0x0e, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x03, 0xe3, 0xf0, 0x14, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x0b, 0x0f, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00,
+ 0x00, 0x00, 0x84, 0x84, 0x84, 0xd0, 0xff, 0xb2, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x2f, 0xf8, 0xe6, 0x14, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x09, 0xd6, 0xfe, 0x44, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x98, 0xff, 0x8c, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x50, 0xff, 0xcf, 0x06, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x1a, 0xec, 0xff, 0xaa, 0x84, 0x84, 0x84, 0x29, 0x00,
+ 0x00, 0x50, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000017d 'Ž'
+ 0x00, 0x00, 0x0e, 0x41, 0x00, 0x02, 0x43, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x2f, 0xed, 0xa5, 0xcf, 0xbb, 0x06, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x28, 0xde, 0x99, 0x04, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x2c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x00,
+ 0x00, 0x16, 0x84, 0x84, 0x84, 0x87, 0xfa, 0xf8, 0x24, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x6e, 0xff, 0x84, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x19, 0xf1, 0xdf, 0x09, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xa6, 0xff, 0x50, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x43, 0xff, 0xb7, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x06, 0xd8, 0xf9, 0x25, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x7a, 0xff, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x1e, 0xf5, 0xff, 0x8f, 0x84, 0x84, 0x84, 0x52, 0x00,
+ 0x00, 0x58, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000017e 'ž'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x54, 0x20, 0x04, 0x63, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xae, 0xd2, 0x9f, 0xd2, 0x08, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x10, 0xde, 0xf2, 0x26, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x2f, 0x44, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00,
+ 0x00, 0x00, 0x84, 0x84, 0x84, 0xd0, 0xff, 0xb2, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x2f, 0xf8, 0xe6, 0x14, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x09, 0xd6, 0xfe, 0x44, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x98, 0xff, 0x8c, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x50, 0xff, 0xcf, 0x06, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x1a, 0xec, 0xff, 0xaa, 0x84, 0x84, 0x84, 0x29, 0x00,
+ 0x00, 0x50, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000192 'ƒ'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x08, 0xa6, 0xf7, 0xde, 0x47, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x81, 0xff, 0xae, 0xcb, 0xa8, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xcd, 0xf6, 0x05, 0x1a, 0x21, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xeb, 0xda, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x71, 0x84, 0xfe, 0xe6, 0x84, 0x4a, 0x00, 0x00,
+ 0x00, 0x00, 0xdc, 0xff, 0xff, 0xff, 0xff, 0x90, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x1e, 0xff, 0x9d, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x32, 0xff, 0x8c, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x46, 0xff, 0x7a, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x5a, 0xff, 0x63, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x6e, 0xff, 0x4d, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x06, 0x90, 0xff, 0x24, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x62, 0xc0, 0xe9, 0xcf, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x7e, 0xf4, 0xd3, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000237 'ȷ'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x68, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x35, 0x84, 0x84, 0xe8, 0xfc, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0xfc, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0xfc, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0xfc, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0xfc, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0xfc, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xd1, 0xfa, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x57, 0x00, 0x04, 0xeb, 0xe2, 0x00, 0x00, 0x00,
+ 0x00, 0x48, 0xff, 0xb0, 0xb5, 0xff, 0x8e, 0x00, 0x00, 0x00,
+ 0x00, 0x0c, 0x9a, 0xf1, 0xec, 0x97, 0x08, 0x00, 0x00, 0x00,
+
+ // U+000002bc 'ʼ'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xcc, 0xd8, 0x0c, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xc7, 0xff, 0x2b, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xaf, 0xcf, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x17, 0xd5, 0x2d, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000002c6 'ˆ'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x8e, 0xb6, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x51, 0xf6, 0xf3, 0x78, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xc3, 0x51, 0x50, 0xde, 0x09, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000002c7 'ˇ'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xbd, 0x74, 0x35, 0xd9, 0x09, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x4f, 0xfc, 0xed, 0x7a, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x8e, 0xb6, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000002c9 'ˉ'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x44, 0xff, 0xff, 0xff, 0xff, 0x38, 0x00, 0x00,
+ 0x00, 0x00, 0x23, 0x84, 0x84, 0x84, 0x84, 0x1c, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000002cb 'ˋ'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x05, 0x8c, 0x47, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x08, 0xd3, 0xc0, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x2c, 0xf7, 0x2c, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000002d8 '˘'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x39, 0xca, 0x24, 0x18, 0xbc, 0x3d, 0x00, 0x00,
+ 0x00, 0x00, 0x3f, 0xef, 0xff, 0xff, 0xeb, 0x34, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x17, 0x6d, 0x6e, 0x15, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000002d9 '˙'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01, 0xca, 0xdc, 0x0e, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x03, 0xe3, 0xf0, 0x14, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x0b, 0x0f, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000002da '˚'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x03, 0x66, 0x64, 0x03, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x77, 0xff, 0xff, 0x77, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x9c, 0xce, 0xd0, 0x9d, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x2c, 0xe0, 0xdd, 0x2b, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000002db '˛'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0xf1, 0x89, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xb1, 0xed, 0x88, 0x12, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0xf4, 0xcb, 0x0a, 0x00,
+
+ // U+000002dc '˜'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x03, 0x9e, 0xf4, 0x73, 0x4b, 0x5f, 0x00, 0x00,
+ 0x00, 0x00, 0x67, 0xf6, 0xa3, 0xff, 0xff, 0x92, 0x00, 0x00,
+ 0x00, 0x00, 0x05, 0x3a, 0x00, 0x46, 0x69, 0x03, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000002dd '˝'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x0f, 0xaf, 0x1a, 0x78, 0x61, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x78, 0xf7, 0x39, 0xef, 0xa0, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0xe1, 0x6c, 0x66, 0xda, 0x0c, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x22, 0x00, 0x04, 0x1d, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00002018 '‘'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x09, 0x9d, 0x16, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x98, 0xe1, 0x14, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x26, 0xfe, 0x77, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x59, 0xff, 0xf0, 0x10, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x16, 0xd9, 0xcf, 0x06, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00002019 '’'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x28, 0xeb, 0xb8, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x3c, 0xfe, 0xff, 0x1d, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xb1, 0xe3, 0x03, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x35, 0xf9, 0x5e, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x33, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000201a '‚'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x25, 0xe9, 0xbb, 0x02, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x38, 0xfd, 0xff, 0x21, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xae, 0xe6, 0x04, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x36, 0xf9, 0x5f, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x2d, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000201c '“'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x66, 0x56, 0x00, 0x2b, 0x8e, 0x01, 0x00,
+ 0x00, 0x00, 0x35, 0xfc, 0x5a, 0x09, 0xdb, 0xa5, 0x01, 0x00,
+ 0x00, 0x00, 0xbc, 0xdc, 0x00, 0x70, 0xff, 0x28, 0x00, 0x00,
+ 0x00, 0x00, 0xf1, 0xff, 0x68, 0xa5, 0xff, 0xb1, 0x00, 0x00,
+ 0x00, 0x00, 0x8b, 0xf2, 0x48, 0x49, 0xf1, 0x89, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000201d '”'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xa8, 0xee, 0x36, 0x61, 0xf7, 0x74, 0x00, 0x00,
+ 0x00, 0x00, 0xcf, 0xff, 0x89, 0x83, 0xff, 0xd5, 0x00, 0x00,
+ 0x00, 0x00, 0x45, 0xff, 0x53, 0x05, 0xf4, 0x9f, 0x00, 0x00,
+ 0x00, 0x05, 0xbf, 0xc6, 0x03, 0x78, 0xf3, 0x22, 0x00, 0x00,
+ 0x00, 0x07, 0x98, 0x1b, 0x00, 0x6c, 0x4d, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000201e '„'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xa8, 0xee, 0x36, 0x61, 0xf7, 0x74, 0x00, 0x00,
+ 0x00, 0x00, 0xcd, 0xff, 0x89, 0x81, 0xff, 0xd5, 0x00, 0x00,
+ 0x00, 0x00, 0x46, 0xff, 0x53, 0x05, 0xf4, 0x9f, 0x00, 0x00,
+ 0x00, 0x07, 0xc3, 0xc4, 0x02, 0x7e, 0xf2, 0x20, 0x00, 0x00,
+ 0x00, 0x05, 0x93, 0x1a, 0x00, 0x67, 0x4c, 0x00, 0x00, 0x00,
+
+ // U+00002020 '†'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe4, 0xd4, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe4, 0xd4, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe4, 0xd4, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x5c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x48, 0x00,
+ 0x00, 0x2f, 0x84, 0x84, 0xf2, 0xea, 0x84, 0x84, 0x25, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe4, 0xd4, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe4, 0xd4, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe4, 0xd4, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe4, 0xd4, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe4, 0xd4, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe4, 0xd4, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe4, 0xd4, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe4, 0xd4, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe4, 0xd4, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00002021 '‡'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe4, 0xd4, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe4, 0xd4, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe4, 0xd4, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x5c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x48, 0x00,
+ 0x00, 0x2f, 0x84, 0x84, 0xf2, 0xea, 0x84, 0x84, 0x25, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe4, 0xd4, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe4, 0xd4, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe4, 0xd4, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe4, 0xd4, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x5c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x48, 0x00,
+ 0x00, 0x2f, 0x84, 0x84, 0xf2, 0xea, 0x84, 0x84, 0x25, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe4, 0xd4, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe4, 0xd4, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe4, 0xd4, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00002022 '•'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x2b, 0xe1, 0xec, 0x42, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x83, 0xff, 0xff, 0xa6, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x2a, 0xdd, 0xe8, 0x41, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00002026 '…'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x09, 0x18, 0x00, 0x16, 0x0b, 0x01, 0x1f, 0x00, 0x00,
+ 0x00, 0xca, 0xfc, 0x5d, 0xfa, 0xda, 0x7e, 0xff, 0x7d, 0x00,
+ 0x00, 0xa9, 0xe9, 0x40, 0xe4, 0xb7, 0x62, 0xf4, 0x60, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00002039 '‹'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x12, 0xb4, 0x1e, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x11, 0xce, 0xfb, 0x4c, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x03, 0xcb, 0xfb, 0x54, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x03, 0xcb, 0xfb, 0x46, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x17, 0xde, 0xf2, 0x30, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x26, 0xea, 0x5a, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000203a '›'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x51, 0x95, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x90, 0xff, 0x93, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01, 0x96, 0xff, 0x84, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x8a, 0xff, 0x86, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x6e, 0xff, 0xa6, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xa4, 0xbe, 0x06, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x04, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00002044 '⁄'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x68, 0xdd, 0x16, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xd7, 0xd0, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0xff, 0x60, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xb8, 0xe8, 0x06, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x29, 0xfe, 0x80, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x98, 0xf8, 0x17, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x14, 0xf6, 0x9e, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x7c, 0xff, 0x2c, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x05, 0xe6, 0xbc, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x5c, 0xff, 0x4c, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xcc, 0xd8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x5c, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00002074 '⁴'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x05, 0xc8, 0xb8, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x88, 0xff, 0xb8, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x43, 0xfd, 0xf3, 0xb8, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x13, 0xe5, 0x9e, 0xc8, 0xbd, 0x0c, 0x00, 0x00,
+ 0x00, 0x00, 0x83, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x00, 0x00,
+ 0x00, 0x00, 0x25, 0x44, 0x44, 0xe8, 0xcb, 0x2a, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x5c, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000020ac '€'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x31, 0xb6, 0xf3, 0xf8, 0xb6, 0x21, 0x00,
+ 0x00, 0x00, 0x26, 0xf4, 0xea, 0x95, 0x8a, 0xcb, 0x70, 0x00,
+ 0x00, 0x35, 0xc2, 0xff, 0xa5, 0x84, 0x84, 0x66, 0x03, 0x00,
+ 0x00, 0x92, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7e, 0x00, 0x00,
+ 0x00, 0x00, 0xd7, 0xd5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x78, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x02, 0x00, 0x00,
+ 0x00, 0x53, 0xd4, 0xff, 0x8e, 0x84, 0x51, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x6a, 0xff, 0x6f, 0x00, 0x00, 0x1e, 0x01, 0x00,
+ 0x00, 0x00, 0x08, 0xd7, 0xfc, 0xa4, 0x97, 0xf3, 0x56, 0x00,
+ 0x00, 0x00, 0x00, 0x18, 0xa6, 0xef, 0xf1, 0xa5, 0x19, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00002122 '™'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x76, 0xa8, 0xa8, 0x8b, 0xa2, 0x11, 0x31, 0x7b, 0x00,
+ 0x00, 0x4b, 0xb8, 0xca, 0x59, 0xf8, 0x72, 0xae, 0xbc, 0x00,
+ 0x00, 0x00, 0x84, 0xa4, 0x00, 0xf8, 0xe4, 0xf9, 0xbc, 0x00,
+ 0x00, 0x00, 0x84, 0xa4, 0x00, 0xf8, 0xb1, 0xa6, 0xbc, 0x00,
+ 0x00, 0x00, 0x84, 0xa4, 0x00, 0xf8, 0x24, 0x68, 0xbc, 0x00,
+ 0x00, 0x00, 0x54, 0x69, 0x00, 0x9e, 0x17, 0x42, 0x78, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00002191 '↑'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x78, 0x9b, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x46, 0xfe, 0xff, 0x60, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x1b, 0xea, 0xff, 0xff, 0xf1, 0x20, 0x00, 0x00,
+ 0x00, 0x04, 0xc4, 0xda, 0xdf, 0xeb, 0xe3, 0xc2, 0x02, 0x00,
+ 0x00, 0x12, 0xcb, 0x45, 0xd8, 0xe4, 0x62, 0xc0, 0x12, 0x00,
+ 0x00, 0x00, 0x05, 0x00, 0xd8, 0xe4, 0x02, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xd8, 0xe4, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xd8, 0xe4, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xd8, 0xe4, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xd8, 0xe4, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xd8, 0xe4, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x7c, 0x83, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00002193 '↓'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xb6, 0xb2, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe0, 0xdc, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe0, 0xdc, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe0, 0xdc, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe0, 0xdc, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe0, 0xdc, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x16, 0x0a, 0xe0, 0xdc, 0x02, 0x22, 0x00, 0x00,
+ 0x00, 0x16, 0xea, 0x76, 0xe0, 0xdc, 0x64, 0xed, 0x15, 0x00,
+ 0x00, 0x00, 0x9e, 0xec, 0xeb, 0xe5, 0xe7, 0x98, 0x00, 0x00,
+ 0x00, 0x00, 0x0c, 0xdd, 0xff, 0xff, 0xcf, 0x07, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x39, 0xfc, 0xf1, 0x24, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x61, 0x48, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00002212 '−'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x09, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x09, 0x00,
+ 0x00, 0x64, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x64, 0x00,
+ 0x00, 0x2d, 0x74, 0x74, 0x74, 0x74, 0x74, 0x74, 0x2d, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00002423 '␣'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x10, 0x30, 0x03, 0x00, 0x00, 0x05, 0x30, 0x10, 0x00,
+ 0x00, 0x58, 0xff, 0x14, 0x00, 0x00, 0x1c, 0xff, 0x58, 0x00,
+ 0x00, 0x58, 0xff, 0xcc, 0xc8, 0xc8, 0xce, 0xff, 0x58, 0x00,
+ 0x00, 0x2d, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x2d, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ },
+ },
+ Ranges: []basicfont.Range{
+ {'\U00000020', '\U0000007f', 0},
+ {'\U0000008e', '\U0000008f', 95},
+ {'\U0000009e', '\U0000009f', 96},
+ {'\U000000a0', '\U00000100', 97},
+ {'\U00000102', '\U00000108', 193},
+ {'\U0000010c', '\U00000112', 199},
+ {'\U00000118', '\U0000011c', 205},
+ {'\U0000011e', '\U00000120', 209},
+ {'\U00000130', '\U00000132', 211},
+ {'\U00000138', '\U0000013b', 213},
+ {'\U0000013d', '\U0000013f', 216},
+ {'\U00000141', '\U00000145', 218},
+ {'\U00000147', '\U00000149', 222},
+ {'\U0000014a', '\U0000014c', 224},
+ {'\U0000014d', '\U0000014e', 226},
+ {'\U00000150', '\U00000156', 227},
+ {'\U00000158', '\U0000015c', 233},
+ {'\U0000015e', '\U00000166', 237},
+ {'\U0000016e', '\U00000172', 245},
+ {'\U00000178', '\U0000017f', 249},
+ {'\U00000192', '\U00000193', 256},
+ {'\U00000237', '\U00000238', 257},
+ {'\U000002bc', '\U000002bd', 258},
+ {'\U000002c6', '\U000002c8', 259},
+ {'\U000002c9', '\U000002ca', 261},
+ {'\U000002cb', '\U000002cc', 262},
+ {'\U000002d8', '\U000002de', 263},
+ {'\U00002018', '\U0000201b', 269},
+ {'\U0000201c', '\U0000201f', 272},
+ {'\U00002020', '\U00002023', 275},
+ {'\U00002026', '\U00002027', 278},
+ {'\U00002039', '\U0000203b', 279},
+ {'\U00002044', '\U00002045', 281},
+ {'\U00002074', '\U00002075', 282},
+ {'\U000020ac', '\U000020ad', 283},
+ {'\U00002122', '\U00002123', 284},
+ {'\U00002191', '\U00002192', 285},
+ {'\U00002193', '\U00002194', 286},
+ {'\U00002212', '\U00002213', 287},
+ {'\U00002423', '\U00002424', 288},
+ },
+}
diff --git a/vendor/golang.org/x/image/font/inconsolata/inconsolata.go b/vendor/golang.org/x/image/font/inconsolata/inconsolata.go
new file mode 100644
index 000000000..276a81589
--- /dev/null
+++ b/vendor/golang.org/x/image/font/inconsolata/inconsolata.go
@@ -0,0 +1,29 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+//go:generate genbasicfont -size=16 -pkg=inconsolata -hinting=full -var=regular8x16 -fontfile=http://www.levien.com/type/myfonts/inconsolata/InconsolataGo-Regular.ttf
+//go:generate genbasicfont -size=16 -pkg=inconsolata -hinting=full -var=bold8x16 -fontfile=http://www.levien.com/type/myfonts/inconsolata/InconsolataGo-Bold.ttf
+
+// The genbasicfont program is github.com/golang/freetype/example/genbasicfont
+
+// Package inconsolata provides pre-rendered bitmap versions of the Inconsolata
+// font family.
+//
+// Inconsolata is copyright Raph Levien and Cyreal. This package is licensed
+// under Go's BSD-style license (https://golang.org/LICENSE) with their
+// permission.
+//
+// Inconsolata's home page is at
+// http://www.levien.com/type/myfonts/inconsolata.html
+package inconsolata // import "golang.org/x/image/font/inconsolata"
+
+import (
+ "golang.org/x/image/font/basicfont"
+)
+
+// Regular8x16 is a regular weight, 8x16 font face.
+var Regular8x16 *basicfont.Face = &regular8x16
+
+// Bold8x16 is a bold weight, 8x16 font face.
+var Bold8x16 *basicfont.Face = &bold8x16
diff --git a/vendor/golang.org/x/image/font/inconsolata/regular8x16.go b/vendor/golang.org/x/image/font/inconsolata/regular8x16.go
new file mode 100644
index 000000000..25e09a371
--- /dev/null
+++ b/vendor/golang.org/x/image/font/inconsolata/regular8x16.go
@@ -0,0 +1,5557 @@
+// generated by go generate; DO NOT EDIT.
+
+package inconsolata
+
+import (
+ "image"
+
+ "golang.org/x/image/font/basicfont"
+)
+
+// regular8x16 contains 289 9×17 glyphs in 44217 Pix bytes.
+var regular8x16 = basicfont.Face{
+ Advance: 8,
+ Width: 9,
+ Height: 16,
+ Ascent: 14,
+ Descent: 3,
+ Left: 0,
+ Mask: &image.Alpha{
+ Stride: 9,
+ Rect: image.Rectangle{Max: image.Point{9, 289 * 17}},
+ Pix: []byte{
+ // U+00000020 ' '
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000021 '!'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x8c, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xb7, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xa8, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x96, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x8a, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x62, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xc2, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000022 '"'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x43, 0x8a, 0x43, 0x8a, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x62, 0xce, 0x62, 0xce, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x56, 0xc2, 0x56, 0xc2, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x48, 0xb6, 0x48, 0xb6, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x14, 0x39, 0x14, 0x39, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000023 '#'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xe6, 0x0e, 0x00, 0xe2, 0x16, 0x00,
+ 0x00, 0x00, 0x04, 0xef, 0x00, 0x02, 0xf4, 0x01, 0x00,
+ 0x00, 0x00, 0x1e, 0xd6, 0x00, 0x1a, 0xe1, 0x08, 0x00,
+ 0x00, 0xf2, 0xf9, 0xff, 0xff, 0xff, 0xfd, 0xf8, 0x09,
+ 0x00, 0x04, 0x56, 0x9c, 0x00, 0x52, 0xa4, 0x00, 0x00,
+ 0x00, 0x00, 0x7c, 0x74, 0x00, 0x7c, 0x82, 0x0c, 0x00,
+ 0x00, 0xf0, 0xfc, 0xff, 0xff, 0xff, 0xf7, 0xf4, 0x07,
+ 0x00, 0x08, 0xba, 0x38, 0x00, 0xb4, 0x40, 0x00, 0x00,
+ 0x00, 0x00, 0xd6, 0x1a, 0x00, 0xd4, 0x22, 0x00, 0x00,
+ 0x00, 0x00, 0xeb, 0x02, 0x00, 0xe8, 0x06, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000024 '$'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xf8, 0x04, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x37, 0xda, 0xff, 0xf1, 0xb1, 0x36, 0x00, 0x00,
+ 0x00, 0xda, 0x49, 0xff, 0x16, 0x66, 0xa4, 0x00, 0x00,
+ 0x00, 0xdc, 0x14, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x5c, 0xc2, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x54, 0xff, 0xdf, 0x86, 0x0d, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x0d, 0x87, 0xbb, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x10, 0xf6, 0x00, 0x00,
+ 0x00, 0x98, 0x2e, 0xff, 0x0e, 0x8e, 0xa0, 0x00, 0x00,
+ 0x00, 0x5b, 0xe0, 0xff, 0xdd, 0x7d, 0x06, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000025 '%'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x51, 0xe9, 0xe8, 0x4e, 0x00, 0x54, 0xc0, 0x00, 0x00,
+ 0xea, 0x32, 0x36, 0xe5, 0x01, 0xd1, 0x40, 0x00, 0x00,
+ 0xe9, 0x36, 0x34, 0xe8, 0x50, 0xc0, 0x00, 0x00, 0x00,
+ 0x4f, 0xe7, 0xe9, 0x52, 0xce, 0x40, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x4c, 0xc2, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xca, 0x44, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x48, 0xc3, 0x51, 0xe9, 0xe9, 0x51, 0x00,
+ 0x00, 0x00, 0xc6, 0x44, 0xe9, 0x2f, 0x39, 0xe7, 0x00,
+ 0x00, 0x44, 0xc3, 0x00, 0xea, 0x37, 0x36, 0xe6, 0x00,
+ 0x00, 0xc2, 0x46, 0x00, 0x50, 0xe6, 0xe7, 0x4e, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000026 '&'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x50, 0xe8, 0xe9, 0x4f, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xe8, 0x3b, 0x45, 0xe5, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xed, 0x0e, 0x11, 0xf1, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x8a, 0x72, 0x81, 0x98, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x2f, 0xf7, 0xa2, 0x0b, 0x00, 0x00, 0x00,
+ 0x00, 0x32, 0xe0, 0x6a, 0xbd, 0x0e, 0x1c, 0x91, 0x00,
+ 0x00, 0xc8, 0x4e, 0x00, 0x39, 0xb3, 0x66, 0xaa, 0x00,
+ 0x00, 0xfa, 0x09, 0x00, 0x00, 0x4b, 0xf7, 0x27, 0x00,
+ 0x00, 0xcd, 0x7b, 0x08, 0x3a, 0xc8, 0xe6, 0x62, 0x00,
+ 0x00, 0x27, 0xc6, 0xf9, 0xd1, 0x54, 0x2b, 0xaf, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000027 '''
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x43, 0x8a, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x62, 0xce, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x56, 0xc2, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x48, 0xb6, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x14, 0x39, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000028 '('
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x51, 0xac, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x78, 0xa7, 0x15, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x71, 0x98, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x30, 0xd2, 0x06, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xa0, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xe0, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xfb, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xf5, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xce, 0x2f, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x80, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x15, 0xe2, 0x21, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x53, 0xd2, 0x14, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x60, 0xd6, 0x31, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0xb2, 0x00, 0x00,
+
+ // U+00000029 ')'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xb0, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x46, 0xdc, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x17, 0xd1, 0x62, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x18, 0xdf, 0x1d, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x70, 0x88, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x29, 0xd2, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x07, 0xf4, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x08, 0xf2, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x20, 0xca, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x60, 0x7a, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x18, 0xd0, 0x12, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x1b, 0xd6, 0x59, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x4d, 0xe5, 0x6f, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x04, 0xc2, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000002a '*'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x36, 0xff, 0x3c, 0x00, 0x00, 0x00,
+ 0x00, 0x0f, 0x00, 0x22, 0xff, 0x20, 0x00, 0x08, 0x00,
+ 0x00, 0xd4, 0xb8, 0x4a, 0xff, 0x44, 0xae, 0xcd, 0x00,
+ 0x00, 0x0e, 0x58, 0xbc, 0xff, 0xb7, 0x54, 0x0c, 0x00,
+ 0x00, 0x00, 0x03, 0xc3, 0x97, 0xbe, 0x02, 0x00, 0x00,
+ 0x00, 0x00, 0x7a, 0xb7, 0x00, 0xb6, 0x76, 0x00, 0x00,
+ 0x00, 0x00, 0xa5, 0x25, 0x00, 0x25, 0xa2, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000002b '+'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000002c ','
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xd2, 0xb3, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x7b, 0xee, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x31, 0x90, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x94, 0x0d, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000002d '-'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000002e '.'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000002f '/'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xab, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x8c, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x02, 0xd2, 0x1a, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x52, 0x9e, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xc7, 0x29, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x3e, 0xb0, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xb4, 0x3a, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x2b, 0xc3, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xa0, 0x4c, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x1c, 0xce, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x8c, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xa9, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000030 '0'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x51, 0xe6, 0xe6, 0x54, 0x00, 0x00, 0x00,
+ 0x00, 0x28, 0xe3, 0x2e, 0x2f, 0xe4, 0x2a, 0x00, 0x00,
+ 0x00, 0x97, 0x6c, 0x00, 0x00, 0x9b, 0x98, 0x00, 0x00,
+ 0x00, 0xdb, 0x20, 0x00, 0x4d, 0xc2, 0xd7, 0x00, 0x00,
+ 0x00, 0xfa, 0x03, 0x24, 0xc0, 0x12, 0xf4, 0x00, 0x00,
+ 0x00, 0xfa, 0x13, 0xc0, 0x20, 0x04, 0xf8, 0x00, 0x00,
+ 0x00, 0xdc, 0xc2, 0x44, 0x00, 0x1c, 0xdf, 0x00, 0x00,
+ 0x00, 0x9a, 0x99, 0x00, 0x00, 0x61, 0xa3, 0x00, 0x00,
+ 0x00, 0x2a, 0xea, 0x39, 0x24, 0xdc, 0x35, 0x00, 0x00,
+ 0x00, 0x00, 0x51, 0xe3, 0xe5, 0x5d, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000031 '1'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x08, 0x7c, 0xf3, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xb4, 0x92, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000032 '2'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x2a, 0xb5, 0xf4, 0xe6, 0x59, 0x00, 0x00, 0x00,
+ 0x00, 0xa7, 0x60, 0x0b, 0x16, 0xaf, 0x65, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0xee, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xdf, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x04, 0xb0, 0x64, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x0d, 0xb7, 0x79, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x12, 0xcb, 0x72, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x06, 0xc2, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x86, 0x69, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00,
+ 0x00, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000033 '3'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x4e, 0xdc, 0xf9, 0xba, 0x1f, 0x00, 0x00, 0x00,
+ 0x00, 0xa5, 0x39, 0x07, 0x73, 0xc5, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x09, 0xf5, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x0f, 0x89, 0xa6, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xfc, 0xf8, 0x28, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x03, 0x86, 0xb0, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x10, 0xf1, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x17, 0xf1, 0x00, 0x00, 0x00,
+ 0x00, 0x92, 0x3f, 0x09, 0x8a, 0xa2, 0x00, 0x00, 0x00,
+ 0x00, 0x60, 0xe1, 0xf5, 0xa8, 0x10, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000034 '4'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x2f, 0xf9, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x06, 0xc0, 0xfe, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x86, 0x60, 0xfc, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x37, 0xb5, 0x00, 0xfc, 0x00, 0x00, 0x00,
+ 0x00, 0x09, 0xcc, 0x1f, 0x00, 0xfc, 0x00, 0x00, 0x00,
+ 0x00, 0x90, 0x6e, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00,
+ 0x00, 0xfa, 0xfc, 0xfc, 0xfc, 0xff, 0xff, 0x48, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000035 '5'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
+ 0x00, 0x52, 0xb4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x64, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x76, 0xc3, 0xd8, 0xec, 0x4f, 0x00, 0x00, 0x00,
+ 0x00, 0x70, 0x77, 0x0b, 0x19, 0xb8, 0x40, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0xcb, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xf7, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xdf, 0x00, 0x00,
+ 0x00, 0xa0, 0x6e, 0x10, 0x1c, 0xc3, 0x6d, 0x00, 0x00,
+ 0x00, 0x2e, 0xb7, 0xf4, 0xdf, 0x52, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000036 '6'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x33, 0xc5, 0xf9, 0xdf, 0x5d, 0x00, 0x00,
+ 0x00, 0x1c, 0xe7, 0x5d, 0x07, 0x3a, 0x95, 0x00, 0x00,
+ 0x00, 0x8e, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xd4, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xf0, 0x6f, 0xe9, 0xed, 0x5a, 0x00, 0x00, 0x00,
+ 0x00, 0xfd, 0xa7, 0x1d, 0x0e, 0x9f, 0x60, 0x00, 0x00,
+ 0x00, 0xee, 0x05, 0x00, 0x00, 0x13, 0xe8, 0x00, 0x00,
+ 0x00, 0xbb, 0x2f, 0x00, 0x00, 0x13, 0xe7, 0x00, 0x00,
+ 0x00, 0x52, 0xcb, 0x27, 0x12, 0xa2, 0x6d, 0x00, 0x00,
+ 0x00, 0x00, 0x71, 0xe4, 0xeb, 0x66, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000037 '7'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd6, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x9e, 0x78, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x11, 0xec, 0x12, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x6d, 0x9c, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xd0, 0x36, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x30, 0xd1, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x8e, 0x72, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x03, 0xe3, 0x18, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x44, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x9a, 0x6a, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000038 '8'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x1a, 0xaa, 0xf5, 0xf7, 0xb4, 0x21, 0x00, 0x00,
+ 0x00, 0xc8, 0x77, 0x0b, 0x0e, 0x82, 0xcc, 0x00, 0x00,
+ 0x00, 0xe5, 0x19, 0x00, 0x00, 0x14, 0xe5, 0x00, 0x00,
+ 0x00, 0x68, 0xd3, 0x4b, 0x27, 0xc3, 0x5f, 0x00, 0x00,
+ 0x00, 0x00, 0xa7, 0xff, 0xff, 0x98, 0x00, 0x00, 0x00,
+ 0x00, 0x62, 0xd1, 0x29, 0x50, 0xe6, 0x62, 0x00, 0x00,
+ 0x00, 0xdf, 0x29, 0x00, 0x00, 0x39, 0xe1, 0x00, 0x00,
+ 0x00, 0xf8, 0x07, 0x00, 0x00, 0x0d, 0xf5, 0x00, 0x00,
+ 0x00, 0xad, 0x8e, 0x17, 0x15, 0x94, 0xa1, 0x00, 0x00,
+ 0x00, 0x0f, 0x9d, 0xef, 0xed, 0x99, 0x0c, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000039 '9'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x51, 0xe9, 0xd6, 0x51, 0x00, 0x00, 0x00,
+ 0x00, 0x67, 0x9c, 0x10, 0x1f, 0xc9, 0x42, 0x00, 0x00,
+ 0x00, 0xeb, 0x10, 0x00, 0x00, 0x3a, 0xaf, 0x00, 0x00,
+ 0x00, 0xee, 0x12, 0x00, 0x00, 0x10, 0xe1, 0x00, 0x00,
+ 0x00, 0x63, 0xa0, 0x10, 0x21, 0xa7, 0xf6, 0x00, 0x00,
+ 0x00, 0x00, 0x55, 0xea, 0xe3, 0x77, 0xf9, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0xde, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x9b, 0x00, 0x00,
+ 0x00, 0x95, 0x3d, 0x08, 0x50, 0xe5, 0x22, 0x00, 0x00,
+ 0x00, 0x5e, 0xdb, 0xf5, 0xbf, 0x33, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000003a ':'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000003b ';'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xd2, 0xb3, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x7b, 0xee, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x31, 0x90, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x94, 0x0d, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000003c '<'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3d, 0xc0, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x36, 0xba, 0xc5, 0x42, 0x00,
+ 0x00, 0x00, 0x2f, 0xb2, 0xcd, 0x4a, 0x00, 0x00, 0x00,
+ 0x00, 0xaa, 0xd4, 0x52, 0x01, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xa2, 0xd6, 0x5a, 0x01, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x29, 0xa8, 0xd0, 0x52, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x2d, 0xae, 0xca, 0x4a, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0xb6, 0x0b,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000003d '='
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000003e '>'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xbe, 0x3a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x42, 0xc6, 0xb8, 0x35, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x4a, 0xce, 0xb2, 0x2e, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01, 0x56, 0xd6, 0xaa, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x02, 0x5a, 0xd6, 0xa0, 0x00, 0x00,
+ 0x00, 0x00, 0x52, 0xd1, 0xa6, 0x27, 0x00, 0x00, 0x00,
+ 0x4a, 0xcb, 0xae, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xb6, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000003f '?'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x29, 0xad, 0xf2, 0xf6, 0xa9, 0x11, 0x00, 0x00,
+ 0x00, 0xa8, 0x77, 0x16, 0x00, 0x7f, 0xab, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xf6, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x27, 0xd8, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x02, 0xa2, 0x3a, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x81, 0x2f, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xf0, 0x03, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000040 '@'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x22, 0xb0, 0xf6, 0xe1, 0x49, 0x00, 0x00,
+ 0x00, 0x15, 0xdb, 0x6a, 0x0b, 0x20, 0xb7, 0x29, 0x00,
+ 0x00, 0x8b, 0x63, 0x00, 0x00, 0x00, 0x26, 0xb3, 0x00,
+ 0x00, 0xda, 0x17, 0x2a, 0xb4, 0xed, 0xfe, 0xf3, 0x00,
+ 0x00, 0xf8, 0x03, 0xd9, 0x65, 0x12, 0x0a, 0xff, 0x00,
+ 0x00, 0xf6, 0x0a, 0xee, 0x4a, 0x07, 0x67, 0xff, 0x00,
+ 0x00, 0xbe, 0x3f, 0x49, 0xda, 0xf4, 0x80, 0xff, 0x00,
+ 0x00, 0x3b, 0xbd, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x5e, 0xb5, 0x37, 0x05, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x2f, 0xc0, 0xf7, 0xe6, 0x8d, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000041 'A'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x17, 0xf5, 0x12, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x6e, 0xeb, 0x70, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xc6, 0x40, 0xd2, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x23, 0xbd, 0x00, 0xac, 0x3c, 0x00, 0x00, 0x00,
+ 0x00, 0x7c, 0x5c, 0x00, 0x3c, 0xa2, 0x00, 0x00, 0x00,
+ 0x00, 0xd6, 0xff, 0xff, 0xff, 0xf6, 0x0f, 0x00, 0x00,
+ 0x30, 0xc4, 0x00, 0x00, 0x00, 0x8e, 0x6c, 0x00, 0x00,
+ 0x8a, 0x6e, 0x00, 0x00, 0x00, 0x29, 0xd1, 0x00, 0x00,
+ 0xe1, 0x1b, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x38, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000042 'B'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xff, 0xf5, 0xbb, 0x26, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x0f, 0x8b, 0xcc, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x0e, 0xf5, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x01, 0x16, 0x8e, 0xa8, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x11, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x14, 0x81, 0x87, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x1c, 0xea, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x13, 0xf4, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x10, 0x80, 0xa6, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xfd, 0xe7, 0x9d, 0x0f, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000043 'C'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x4d, 0xdb, 0xfb, 0xbe, 0x2a, 0x00, 0x00,
+ 0x00, 0x31, 0xea, 0x3a, 0x0a, 0x7a, 0xab, 0x00, 0x00,
+ 0x00, 0xa5, 0x71, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xe4, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xfa, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xfa, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xe2, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xa3, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x2d, 0xe5, 0x51, 0x0a, 0x57, 0xaf, 0x00, 0x00,
+ 0x00, 0x00, 0x44, 0xd2, 0xf8, 0xc2, 0x2b, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000044 'D'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xfc, 0xd3, 0x48, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x09, 0x56, 0xee, 0x2e, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x7b, 0xa2, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x2d, 0xdd, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x0b, 0xf6, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x06, 0xf6, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x27, 0xd9, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x7d, 0x94, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x13, 0x67, 0xea, 0x20, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xf1, 0xbc, 0x32, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000045 'E'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000046 'F'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000047 'G'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x24, 0xac, 0xf2, 0xf4, 0xb7, 0x30, 0x00, 0x00,
+ 0x1c, 0xe4, 0x6a, 0x0e, 0x0d, 0x69, 0xaa, 0x00, 0x00,
+ 0x92, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xde, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xfb, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xfa, 0x05, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00,
+ 0xdd, 0x21, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x94, 0x78, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x1b, 0xe5, 0x76, 0x12, 0x10, 0x5c, 0xff, 0x00, 0x00,
+ 0x00, 0x25, 0xaf, 0xf2, 0xef, 0xb5, 0x40, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000048 'H'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x03, 0x00, 0x00, 0x00, 0xfc, 0x05, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000049 'I'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xff, 0xfc, 0xfc, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000004a 'J'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x15, 0xeb, 0x00, 0x00, 0x00,
+ 0x00, 0x95, 0x45, 0x09, 0x80, 0xa5, 0x00, 0x00, 0x00,
+ 0x00, 0x58, 0xda, 0xf8, 0xb6, 0x15, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000004b 'K'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x06, 0x00, 0x00, 0x57, 0xd7, 0x14, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x41, 0xe9, 0x2d, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x2e, 0xea, 0x41, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x1f, 0xe4, 0x5c, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0xd6, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x5e, 0xd6, 0x62, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x33, 0xeb, 0x1b, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x7c, 0xb6, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x03, 0xc5, 0x60, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x22, 0xe2, 0x1b, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000004c 'L'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000004d 'M'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00,
+ 0xfa, 0x23, 0x00, 0x00, 0x00, 0x20, 0xf8, 0x00, 0x00,
+ 0xff, 0xaa, 0x00, 0x00, 0x00, 0xa8, 0xff, 0x00, 0x00,
+ 0xff, 0xeb, 0x37, 0x00, 0x3b, 0xe5, 0xff, 0x00, 0x00,
+ 0xff, 0x60, 0xc2, 0x01, 0xca, 0x49, 0xff, 0x00, 0x00,
+ 0xff, 0x00, 0xbe, 0xa5, 0x9e, 0x00, 0xff, 0x00, 0x00,
+ 0xff, 0x00, 0x25, 0xdb, 0x0f, 0x00, 0xff, 0x00, 0x00,
+ 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000004e 'N'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00,
+ 0x00, 0xff, 0x48, 0x00, 0x00, 0x00, 0xff, 0x04, 0x00,
+ 0x00, 0xff, 0xcf, 0x01, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0xcd, 0x5a, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x48, 0xde, 0x05, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0xbf, 0x6c, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x38, 0xe8, 0x0d, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0xb0, 0x80, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x2a, 0xf0, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0xa0, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x1e, 0xf7, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000004f 'O'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x3a, 0xcb, 0xfa, 0xd6, 0x4a, 0x00, 0x00, 0x00,
+ 0x24, 0xe5, 0x48, 0x04, 0x44, 0xed, 0x35, 0x00, 0x00,
+ 0x9a, 0x6f, 0x00, 0x00, 0x00, 0x74, 0xa7, 0x00, 0x00,
+ 0xde, 0x1d, 0x00, 0x00, 0x00, 0x24, 0xe2, 0x00, 0x00,
+ 0xfa, 0x03, 0x00, 0x00, 0x00, 0x07, 0xf8, 0x00, 0x00,
+ 0xfa, 0x06, 0x00, 0x00, 0x00, 0x0a, 0xf4, 0x00, 0x00,
+ 0xd8, 0x2b, 0x00, 0x00, 0x00, 0x22, 0xdb, 0x00, 0x00,
+ 0x93, 0x84, 0x00, 0x00, 0x00, 0x6d, 0x9b, 0x00, 0x00,
+ 0x1f, 0xe9, 0x5f, 0x08, 0x42, 0xe6, 0x2b, 0x00, 0x00,
+ 0x00, 0x34, 0xc8, 0xf6, 0xd1, 0x45, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000050 'P'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xff, 0xf6, 0xab, 0x10, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x08, 0x82, 0x9f, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x1b, 0xeb, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x13, 0xee, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x02, 0x77, 0xa0, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xff, 0xf2, 0xaa, 0x11, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000051 'Q'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x3b, 0xc9, 0xfa, 0xd3, 0x45, 0x00, 0x00, 0x00,
+ 0x26, 0xe8, 0x50, 0x05, 0x4e, 0xee, 0x2f, 0x00, 0x00,
+ 0x9b, 0x6c, 0x00, 0x00, 0x00, 0x7a, 0xa3, 0x00, 0x00,
+ 0xe1, 0x1d, 0x00, 0x00, 0x00, 0x2b, 0xde, 0x00, 0x00,
+ 0xfb, 0x03, 0x00, 0x00, 0x00, 0x0a, 0xf4, 0x00, 0x00,
+ 0xfa, 0x06, 0x00, 0x00, 0x00, 0x06, 0xf8, 0x00, 0x00,
+ 0xdf, 0x29, 0x00, 0x00, 0x00, 0x1f, 0xdd, 0x00, 0x00,
+ 0x9e, 0x7b, 0x00, 0x00, 0x00, 0x6d, 0x9e, 0x00, 0x00,
+ 0x2a, 0xf0, 0x5b, 0x09, 0x49, 0xe8, 0x2c, 0x00, 0x00,
+ 0x00, 0x45, 0xd7, 0xff, 0xd3, 0x42, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xe3, 0x2f, 0x0b, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x41, 0xde, 0xf7, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000052 'R'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xff, 0xf3, 0xab, 0x13, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x0f, 0x97, 0xa7, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x17, 0xf0, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x0e, 0xf1, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x02, 0x73, 0xa1, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xff, 0xfe, 0xbb, 0x13, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0xae, 0x5a, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x26, 0xde, 0x09, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x96, 0x7c, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x15, 0xe5, 0x1a, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000053 'S'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x11, 0x9f, 0xf0, 0xf8, 0xc4, 0x44, 0x00, 0x00,
+ 0x00, 0xb7, 0x7f, 0x0c, 0x0c, 0x55, 0xa0, 0x00, 0x00,
+ 0x00, 0xfa, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xba, 0x81, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x0b, 0x92, 0xe5, 0x8c, 0x1e, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x14, 0x7a, 0xe6, 0x51, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xe4, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0xf4, 0x00, 0x00,
+ 0x00, 0x9a, 0x54, 0x0f, 0x04, 0x84, 0xa4, 0x00, 0x00,
+ 0x00, 0x51, 0xc7, 0xf6, 0xef, 0x9e, 0x0e, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000054 'T'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000055 'U'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x09, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0xfc, 0x01, 0x00, 0x00, 0x03, 0xf9, 0x00, 0x00,
+ 0x00, 0xd8, 0x1f, 0x00, 0x00, 0x25, 0xcc, 0x00, 0x00,
+ 0x00, 0x51, 0xb0, 0x19, 0x1b, 0xae, 0x3b, 0x00, 0x00,
+ 0x00, 0x00, 0x64, 0xea, 0xe3, 0x4b, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000056 'V'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xe8, 0x14, 0x00, 0x00, 0x00, 0x0d, 0xe4, 0x07, 0x00,
+ 0x9c, 0x6a, 0x00, 0x00, 0x00, 0x5c, 0xa2, 0x00, 0x00,
+ 0x44, 0xc6, 0x00, 0x00, 0x00, 0xb2, 0x4e, 0x00, 0x00,
+ 0x03, 0xe9, 0x23, 0x00, 0x0d, 0xe8, 0x07, 0x00, 0x00,
+ 0x00, 0x98, 0x7e, 0x00, 0x5a, 0xa2, 0x00, 0x00, 0x00,
+ 0x00, 0x40, 0xd9, 0x00, 0xae, 0x4c, 0x00, 0x00, 0x00,
+ 0x00, 0x02, 0xe7, 0x43, 0xe6, 0x06, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x94, 0xdf, 0xa0, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x3c, 0xff, 0x4a, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0xd1, 0x06, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000057 'W'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x3c, 0xc2, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x26,
+ 0x14, 0xe8, 0x00, 0x00, 0x9a, 0x00, 0x00, 0xe0, 0x03,
+ 0x00, 0xeb, 0x10, 0x07, 0xf6, 0x22, 0x09, 0xd3, 0x00,
+ 0x00, 0xc4, 0x38, 0x40, 0xfa, 0x66, 0x28, 0xac, 0x00,
+ 0x00, 0x9a, 0x60, 0x82, 0x92, 0xa8, 0x48, 0x84, 0x00,
+ 0x00, 0x70, 0x88, 0xbd, 0x14, 0xe3, 0x69, 0x5a, 0x00,
+ 0x00, 0x48, 0xba, 0xb3, 0x00, 0xc0, 0xb8, 0x30, 0x00,
+ 0x00, 0x20, 0xfd, 0x70, 0x00, 0x7a, 0xfb, 0x09, 0x00,
+ 0x00, 0x01, 0xf6, 0x28, 0x00, 0x34, 0xe0, 0x00, 0x00,
+ 0x00, 0x00, 0xaf, 0x00, 0x00, 0x01, 0xa2, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000058 'X'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x86, 0x76, 0x00, 0x00, 0x00, 0x7e, 0x88, 0x00, 0x00,
+ 0x0e, 0xde, 0x1f, 0x00, 0x22, 0xe0, 0x0e, 0x00, 0x00,
+ 0x00, 0x68, 0xb2, 0x00, 0xb6, 0x68, 0x00, 0x00, 0x00,
+ 0x00, 0x03, 0xd4, 0x9b, 0xd5, 0x03, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x4f, 0xff, 0x55, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x82, 0xe3, 0x8c, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x13, 0xe1, 0x1f, 0xe1, 0x1e, 0x00, 0x00, 0x00,
+ 0x00, 0x8c, 0x76, 0x00, 0x6a, 0xa0, 0x00, 0x00, 0x00,
+ 0x1a, 0xda, 0x08, 0x00, 0x04, 0xd6, 0x2d, 0x00, 0x00,
+ 0x96, 0x64, 0x00, 0x00, 0x00, 0x50, 0xb6, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000059 'Y'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x01, 0xd1, 0x31, 0x00, 0x00, 0x00, 0x6a, 0x98, 0x00,
+ 0x00, 0x52, 0xba, 0x00, 0x00, 0x04, 0xdd, 0x23, 0x00,
+ 0x00, 0x01, 0xcf, 0x46, 0x00, 0x5c, 0xa8, 0x00, 0x00,
+ 0x00, 0x00, 0x4e, 0xcf, 0x02, 0xd2, 0x30, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xcb, 0xa3, 0xb8, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x4a, 0xff, 0x40, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000005a 'Z'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0x92, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x11, 0xd6, 0x10, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x96, 0x64, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x33, 0xc7, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0xc5, 0x37, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x62, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x11, 0xdb, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x96, 0x72, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00,
+ 0x00, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000005b '['
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00,
+ 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000005c '\'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xa9, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x90, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x1c, 0xcf, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xa2, 0x4c, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x2c, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xb3, 0x38, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x3e, 0xae, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xc5, 0x27, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x50, 0x9c, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x01, 0xd1, 0x18, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x88, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xaa, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000005d ']'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000005e '^'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x0f, 0xd4, 0x17, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x9e, 0xa9, 0xa0, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x4b, 0xb0, 0x01, 0xc8, 0x39, 0x00, 0x00,
+ 0x00, 0x00, 0xb7, 0x1b, 0x00, 0x3a, 0xa0, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000005f '_'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000060 '`'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xba, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x50, 0xd6, 0x28, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x54, 0xd9, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000061 'a'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x57, 0xde, 0xfb, 0xcf, 0x31, 0x00, 0x00,
+ 0x00, 0x00, 0xa1, 0x30, 0x08, 0x6f, 0xca, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xfa, 0x00, 0x00,
+ 0x00, 0x1f, 0x9f, 0xe2, 0xfc, 0xff, 0xff, 0x00, 0x00,
+ 0x00, 0xd4, 0x6a, 0x15, 0x02, 0x05, 0xf9, 0x00, 0x00,
+ 0x00, 0xee, 0x4f, 0x07, 0x23, 0xa5, 0xff, 0x00, 0x00,
+ 0x00, 0x48, 0xd8, 0xf8, 0xd6, 0x6c, 0xfc, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000062 'b'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x5c, 0xe5, 0xe9, 0x4f, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x8f, 0x0c, 0x1f, 0xbe, 0x4a, 0x00, 0x00,
+ 0x00, 0xff, 0x0d, 0x00, 0x00, 0x2f, 0xd3, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x06, 0xf6, 0x00, 0x00,
+ 0x00, 0xff, 0x0e, 0x00, 0x00, 0x25, 0xcc, 0x00, 0x00,
+ 0x00, 0xff, 0x89, 0x0c, 0x22, 0xb8, 0x3d, 0x00, 0x00,
+ 0x00, 0xca, 0x74, 0xe8, 0xe3, 0x4b, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000063 'c'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x6b, 0xdd, 0xfa, 0xd1, 0x4a, 0x00, 0x00,
+ 0x00, 0x69, 0xc8, 0x25, 0x06, 0x4f, 0x9e, 0x00, 0x00,
+ 0x00, 0xdb, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xfc, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xda, 0x3b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x64, 0xdb, 0x3a, 0x08, 0x50, 0xa7, 0x00, 0x00,
+ 0x00, 0x00, 0x61, 0xd8, 0xf8, 0xce, 0x43, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000064 'd'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf1, 0x06, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00,
+ 0x00, 0x00, 0x57, 0xe5, 0xe3, 0x4b, 0xf0, 0x00, 0x00,
+ 0x00, 0x5c, 0xaa, 0x14, 0x15, 0xa3, 0xfa, 0x00, 0x00,
+ 0x00, 0xdd, 0x1a, 0x00, 0x00, 0x20, 0xfc, 0x00, 0x00,
+ 0x00, 0xfc, 0x04, 0x00, 0x00, 0x0f, 0xfc, 0x00, 0x00,
+ 0x00, 0xd6, 0x2c, 0x00, 0x00, 0x27, 0xfc, 0x00, 0x00,
+ 0x00, 0x48, 0xb7, 0x19, 0x18, 0xac, 0xfc, 0x00, 0x00,
+ 0x00, 0x00, 0x4f, 0xe9, 0xdc, 0x53, 0xfc, 0x04, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000065 'e'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x44, 0xdb, 0xed, 0x58, 0x00, 0x00, 0x00,
+ 0x00, 0x3d, 0xbb, 0x22, 0x0f, 0x9c, 0x5d, 0x00, 0x00,
+ 0x00, 0xcb, 0x2c, 0x00, 0x00, 0x0f, 0xdb, 0x00, 0x00,
+ 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x00, 0x00,
+ 0x00, 0xc1, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x25, 0xb0, 0x2a, 0x06, 0x48, 0xaa, 0x00, 0x00,
+ 0x00, 0x00, 0x42, 0xd3, 0xf8, 0xcf, 0x3f, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000066 'f'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x17, 0xb5, 0xf9, 0xea, 0x71, 0x00,
+ 0x00, 0x00, 0x00, 0xad, 0x8c, 0x09, 0x2b, 0x94, 0x00,
+ 0x00, 0x00, 0x00, 0xf2, 0x13, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000067 'g'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x1e, 0xc0, 0xfa, 0xc5, 0x94, 0xe6, 0x00, 0x00,
+ 0x00, 0xbe, 0x76, 0x09, 0x78, 0xd5, 0x07, 0x00, 0x00,
+ 0x00, 0xf9, 0x05, 0x00, 0x09, 0xf6, 0x00, 0x00, 0x00,
+ 0x00, 0xc7, 0x75, 0x09, 0x7a, 0xbf, 0x00, 0x00, 0x00,
+ 0x00, 0x47, 0xee, 0xf8, 0xc1, 0x20, 0x00, 0x00, 0x00,
+ 0x00, 0xe3, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xb6, 0xf2, 0xf3, 0xfb, 0xdd, 0x57, 0x00, 0x00,
+ 0x00, 0xd7, 0x18, 0x00, 0x00, 0x35, 0xf0, 0x00, 0x00,
+ 0x00, 0xf3, 0x59, 0x0a, 0x10, 0x71, 0xd4, 0x00, 0x00,
+ 0x00, 0x4e, 0xcf, 0xf7, 0xf3, 0xb6, 0x27, 0x00, 0x00,
+
+ // U+00000068 'h'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x30, 0xc2, 0xfa, 0xd6, 0x33, 0x00, 0x00,
+ 0x00, 0xff, 0xb7, 0x33, 0x07, 0x7b, 0xc9, 0x00, 0x00,
+ 0x00, 0xff, 0x1c, 0x00, 0x00, 0x0a, 0xf9, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000069 'i'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x3b, 0xd1, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x3b, 0xd1, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000006a 'j'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x3b, 0xd3, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x3b, 0xd1, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x0f, 0xef, 0x00, 0x00, 0x00,
+ 0x00, 0x90, 0x3d, 0x0d, 0x8c, 0xa8, 0x00, 0x00, 0x00,
+ 0x00, 0x6b, 0xe2, 0xf2, 0xa7, 0x12, 0x00, 0x00, 0x00,
+
+ // U+0000006b 'k'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x20, 0xd2, 0x55, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x2f, 0xde, 0x4f, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x42, 0xe9, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0xce, 0xe9, 0x64, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x11, 0x34, 0xef, 0x44, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x47, 0xeb, 0x29, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x5e, 0xdc, 0x15, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000006c 'l'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000006d 'm'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xff, 0x9c, 0xf5, 0x5c, 0xaa, 0xee, 0x67, 0x00, 0x00,
+ 0xff, 0x5f, 0x28, 0xff, 0x6c, 0x25, 0xf5, 0x00, 0x00,
+ 0xff, 0x03, 0x00, 0xff, 0x03, 0x00, 0xff, 0x00, 0x00,
+ 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000006e 'n'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x32, 0xc3, 0xfa, 0xd4, 0x30, 0x00, 0x00,
+ 0x00, 0xff, 0xbe, 0x33, 0x07, 0x7b, 0xc6, 0x00, 0x00,
+ 0x00, 0xff, 0x21, 0x00, 0x00, 0x0a, 0xf9, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000006f 'o'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x79, 0xeb, 0xed, 0x65, 0x00, 0x00, 0x00,
+ 0x00, 0x6c, 0xbd, 0x18, 0x1c, 0xc3, 0x52, 0x00, 0x00,
+ 0x00, 0xd9, 0x28, 0x00, 0x00, 0x2e, 0xd4, 0x00, 0x00,
+ 0x00, 0xfc, 0x03, 0x00, 0x00, 0x06, 0xf7, 0x00, 0x00,
+ 0x00, 0xdf, 0x2e, 0x00, 0x00, 0x28, 0xc5, 0x00, 0x00,
+ 0x00, 0x67, 0xc4, 0x1e, 0x1a, 0xb8, 0x34, 0x00, 0x00,
+ 0x00, 0x00, 0x5b, 0xe1, 0xea, 0x5d, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000070 'p'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xfc, 0x61, 0xe5, 0xef, 0x6e, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x8e, 0x0a, 0x21, 0xc3, 0x58, 0x00, 0x00,
+ 0x00, 0xff, 0x0c, 0x00, 0x00, 0x31, 0xda, 0x00, 0x00,
+ 0x00, 0xfc, 0x00, 0x00, 0x00, 0x06, 0xf8, 0x00, 0x00,
+ 0x00, 0xff, 0x0a, 0x00, 0x00, 0x25, 0xd5, 0x00, 0x00,
+ 0x00, 0xff, 0x99, 0x17, 0x20, 0xb9, 0x54, 0x00, 0x00,
+ 0x00, 0xff, 0x6d, 0xe6, 0xe1, 0x44, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000071 'q'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x77, 0xed, 0xe2, 0x65, 0xf0, 0x00, 0x00,
+ 0x00, 0x71, 0xb1, 0x16, 0x11, 0xa6, 0xfe, 0x00, 0x00,
+ 0x00, 0xe3, 0x20, 0x00, 0x00, 0x25, 0xff, 0x00, 0x00,
+ 0x00, 0xfb, 0x03, 0x00, 0x00, 0x0e, 0xff, 0x00, 0x00,
+ 0x00, 0xc8, 0x2d, 0x00, 0x00, 0x2a, 0xff, 0x00, 0x00,
+ 0x00, 0x3b, 0xbf, 0x1e, 0x14, 0xab, 0xff, 0x00, 0x00,
+ 0x00, 0x00, 0x56, 0xea, 0xde, 0x57, 0xff, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+
+ // U+00000072 'r'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xff, 0x49, 0xda, 0xf7, 0x94, 0x00, 0x00,
+ 0x00, 0x00, 0xff, 0xca, 0x2d, 0x14, 0x87, 0x00, 0x00,
+ 0x00, 0x00, 0xff, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000073 's'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x39, 0xbe, 0xf7, 0xf7, 0xc6, 0x4c, 0x00, 0x00,
+ 0x00, 0xec, 0x43, 0x03, 0x0e, 0x5d, 0x9d, 0x00, 0x00,
+ 0x00, 0x66, 0xc7, 0x79, 0x41, 0x05, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x42, 0x8c, 0xcd, 0xea, 0x55, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xf1, 0x00, 0x00,
+ 0x00, 0x95, 0x58, 0x0f, 0x0b, 0x6a, 0xcc, 0x00, 0x00,
+ 0x00, 0x53, 0xc4, 0xf4, 0xf4, 0xb2, 0x21, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000074 't'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x04, 0x0c, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xae, 0x51, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xc0, 0x32, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xe2, 0x18, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xf2, 0x05, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x06, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xe7, 0x50, 0x1a, 0x96, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x62, 0xef, 0xe6, 0x6e, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000075 'u'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x02, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x06, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x08, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x08, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x01, 0xf9, 0x14, 0x00, 0x00, 0x21, 0xff, 0x00, 0x00,
+ 0x00, 0xb4, 0x81, 0x06, 0x26, 0xba, 0xff, 0x00, 0x00,
+ 0x00, 0x1b, 0xbb, 0xf9, 0xd6, 0x50, 0xfe, 0x04, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000076 'v'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x07, 0xe9, 0x1a, 0x00, 0x00, 0x00, 0x28, 0xd7, 0x00,
+ 0x00, 0x80, 0x88, 0x00, 0x00, 0x00, 0x84, 0x7a, 0x00,
+ 0x00, 0x15, 0xe8, 0x0f, 0x00, 0x0a, 0xe3, 0x16, 0x00,
+ 0x00, 0x00, 0x9a, 0x78, 0x00, 0x6e, 0x96, 0x00, 0x00,
+ 0x00, 0x00, 0x27, 0xe6, 0x0b, 0xd9, 0x1e, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xb2, 0xb9, 0x9e, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x3e, 0xfc, 0x24, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000077 'w'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xe1, 0x01, 0x00, 0x00, 0x00, 0x03, 0xee, 0x00, 0x00,
+ 0xb8, 0x28, 0x02, 0xea, 0x16, 0x15, 0xcb, 0x00, 0x00,
+ 0x88, 0x60, 0x30, 0xff, 0x64, 0x33, 0xa4, 0x00, 0x00,
+ 0x56, 0x98, 0x70, 0x92, 0xb4, 0x57, 0x7e, 0x00, 0x00,
+ 0x24, 0xd2, 0xa3, 0x0b, 0xd5, 0x8d, 0x52, 0x00, 0x00,
+ 0x01, 0xf0, 0x94, 0x00, 0x82, 0xf0, 0x27, 0x00, 0x00,
+ 0x00, 0xc2, 0x4c, 0x00, 0x24, 0xf6, 0x02, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000078 'x'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x96, 0x6c, 0x00, 0x00, 0x66, 0x8c, 0x00, 0x00,
+ 0x00, 0x08, 0xc9, 0x2d, 0x39, 0xb8, 0x03, 0x00, 0x00,
+ 0x00, 0x00, 0x27, 0xc9, 0xca, 0x16, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x94, 0x79, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x31, 0xc0, 0xcd, 0x27, 0x00, 0x00, 0x00,
+ 0x00, 0x0c, 0xce, 0x23, 0x33, 0xcc, 0x09, 0x00, 0x00,
+ 0x00, 0xa2, 0x68, 0x00, 0x00, 0x70, 0x9e, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000079 'y'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xc0, 0x4d, 0x00, 0x00, 0x09, 0xe9, 0x02, 0x00,
+ 0x00, 0x56, 0xb0, 0x00, 0x00, 0x3d, 0xad, 0x00, 0x00,
+ 0x00, 0x04, 0xe2, 0x23, 0x00, 0x84, 0x67, 0x00, 0x00,
+ 0x00, 0x00, 0x7e, 0x90, 0x00, 0xc8, 0x1a, 0x00, 0x00,
+ 0x00, 0x00, 0x17, 0xeb, 0x1f, 0xcd, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xa6, 0xc1, 0x86, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x38, 0xff, 0x3a, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x2f, 0xe7, 0x02, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x0b, 0xb7, 0x5d, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xa5, 0xec, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000007a 'z'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x03, 0xa4, 0x34, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x9b, 0x4f, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x88, 0x72, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x72, 0x95, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x60, 0xb6, 0x03, 0x00, 0x00, 0x07, 0x00, 0x00,
+ 0x00, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000007b '{'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x19, 0xb7, 0xf8, 0xff, 0x04, 0x00,
+ 0x00, 0x00, 0x00, 0xae, 0x82, 0x07, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xe9, 0x19, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xee, 0x14, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xef, 0x08, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x07, 0x64, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0xea, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x05, 0x5b, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xf3, 0x03, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xfa, 0x04, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xfb, 0x08, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xcc, 0x80, 0x0f, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x30, 0xcb, 0xf7, 0xff, 0x00, 0x00,
+
+ // U+0000007c '|'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000007d '}'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x0c, 0xff, 0xf7, 0xb5, 0x15, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x09, 0x7e, 0xa6, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x14, 0xe8, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x14, 0xec, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x0b, 0xec, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xb5, 0x5e, 0x07, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x24, 0xed, 0xf4, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xc4, 0x57, 0x04, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x07, 0xf6, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x0a, 0xf8, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x0b, 0xfa, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x09, 0x83, 0xca, 0x00, 0x00, 0x00, 0x00,
+ 0x08, 0xff, 0xfb, 0xcc, 0x31, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000007e '~'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x38, 0xd8, 0xf6, 0x9c, 0x16, 0x46, 0xac, 0x00,
+ 0x00, 0xad, 0x43, 0x0a, 0x44, 0xe1, 0xd3, 0x34, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000008e 'Ž'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xa7, 0x49, 0x49, 0x9a, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x16, 0xc0, 0xae, 0x0e, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0x92, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x11, 0xd6, 0x10, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x96, 0x64, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x33, 0xc7, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0xc5, 0x37, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x62, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x11, 0xdb, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x96, 0x72, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00,
+ 0x00, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000009e 'ž'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xaa, 0x1e, 0xa1, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x80, 0xf3, 0x7a, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x0a, 0xc3, 0x07, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x03, 0xa4, 0x34, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x9b, 0x4f, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x88, 0x72, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x72, 0x95, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x60, 0xb6, 0x03, 0x00, 0x00, 0x07, 0x00, 0x00,
+ 0x00, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000a0 ' '
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000a1 '¡'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x62, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x6e, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x94, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xa7, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xb8, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000a2 '¢'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x4f, 0x74, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x82, 0x7c, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x4d, 0xd2, 0xfd, 0xe7, 0x5a, 0x00, 0x00,
+ 0x00, 0x45, 0xdb, 0x36, 0xc5, 0x71, 0xa6, 0x00, 0x00,
+ 0x00, 0xc4, 0x42, 0x00, 0xe2, 0x1c, 0x01, 0x00, 0x00,
+ 0x00, 0xf7, 0x05, 0x04, 0xf5, 0x02, 0x00, 0x00, 0x00,
+ 0x00, 0xf7, 0x12, 0x1e, 0xdc, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xc6, 0x5b, 0x3a, 0xbc, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x4b, 0xe9, 0x92, 0xa1, 0x43, 0xa7, 0x00, 0x00,
+ 0x00, 0x00, 0x59, 0xe4, 0xfc, 0xd2, 0x46, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x98, 0x56, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x81, 0x2b, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000a3 '£'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x0f, 0xa7, 0xf6, 0xe9, 0x70, 0x00, 0x00,
+ 0x00, 0x00, 0xa5, 0x89, 0x0c, 0x33, 0x8f, 0x00, 0x00,
+ 0x00, 0x00, 0xf5, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xec, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x37, 0xd1, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x0a, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x52, 0xb6, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x78, 0xf1, 0xff, 0xd3, 0x56, 0x10, 0x8b, 0x00,
+ 0x00, 0x9f, 0x41, 0x0b, 0x54, 0xbf, 0xef, 0x70, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000a4 '¤'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x0c, 0x25, 0x00, 0x00, 0x00, 0x26, 0x08, 0x00,
+ 0x00, 0x24, 0xcf, 0xc3, 0xf8, 0xc1, 0xd0, 0x20, 0x00,
+ 0x00, 0x00, 0xc7, 0x73, 0x08, 0x7e, 0xbf, 0x00, 0x00,
+ 0x00, 0x00, 0xfc, 0x05, 0x00, 0x0b, 0xf4, 0x00, 0x00,
+ 0x00, 0x00, 0xc5, 0x75, 0x09, 0x7a, 0xbf, 0x00, 0x00,
+ 0x00, 0x27, 0xd0, 0xbf, 0xf7, 0xc3, 0xd0, 0x21, 0x00,
+ 0x00, 0x09, 0x20, 0x00, 0x00, 0x00, 0x23, 0x07, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000a5 '¥'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xbf, 0x42, 0x00, 0x00, 0x00, 0x76, 0x85, 0x00,
+ 0x00, 0x38, 0xcd, 0x02, 0x00, 0x0c, 0xe0, 0x14, 0x00,
+ 0x00, 0x00, 0xb0, 0x5e, 0x00, 0x78, 0x8c, 0x00, 0x00,
+ 0x00, 0x00, 0x2a, 0xe0, 0x16, 0xe1, 0x16, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x9e, 0xd6, 0x8e, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x1c, 0xff, 0x19, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000a6 '¦'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000a7 '§'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x28, 0xc4, 0xfa, 0xd6, 0x47, 0x00, 0x00, 0x00,
+ 0x00, 0xce, 0x5e, 0x05, 0x52, 0xa2, 0x00, 0x00, 0x00,
+ 0x00, 0xeb, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x74, 0xc7, 0x45, 0x01, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x57, 0xaf, 0xd5, 0xd4, 0x30, 0x00, 0x00, 0x00,
+ 0x00, 0xed, 0x09, 0x00, 0x66, 0xdb, 0x00, 0x00, 0x00,
+ 0x00, 0xdf, 0x85, 0x09, 0x0f, 0xe6, 0x00, 0x00, 0x00,
+ 0x00, 0x2f, 0xc6, 0xf1, 0xd3, 0x51, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x2e, 0xb2, 0x63, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x0e, 0xe7, 0x00, 0x00, 0x00,
+ 0x00, 0xa0, 0x51, 0x0a, 0x68, 0xc8, 0x00, 0x00, 0x00,
+ 0x00, 0x4a, 0xd1, 0xf8, 0xc7, 0x27, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000a8 '¨'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xc3, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xc3, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000a9 '©'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x29, 0xb1, 0xf3, 0xf2, 0xad, 0x25, 0x00, 0x00,
+ 0x29, 0xe8, 0x6c, 0x0e, 0x0e, 0x6f, 0xe7, 0x24, 0x00,
+ 0xb1, 0x6c, 0x49, 0xe5, 0xf7, 0x99, 0x70, 0xaa, 0x00,
+ 0xf3, 0x0e, 0xea, 0x3a, 0x00, 0x00, 0x11, 0xee, 0x00,
+ 0xf3, 0x0e, 0xe4, 0x4b, 0x01, 0x00, 0x12, 0xf2, 0x00,
+ 0xb1, 0x6b, 0x44, 0xdd, 0xf4, 0x86, 0x76, 0xaf, 0x00,
+ 0x28, 0xe9, 0x6e, 0x11, 0x12, 0x76, 0xe9, 0x25, 0x00,
+ 0x00, 0x29, 0xb0, 0xf3, 0xf0, 0xac, 0x25, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000aa 'ª'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x66, 0xec, 0xea, 0x5e, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x95, 0x17, 0x39, 0xe8, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x50, 0xe3, 0xff, 0xff, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xe7, 0x37, 0x06, 0xff, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xee, 0x2b, 0x69, 0xff, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x6f, 0xf4, 0xc1, 0xff, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000ab '«'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x35, 0xaa, 0x00, 0x35, 0xaa, 0x00, 0x00,
+ 0x00, 0x3b, 0xd7, 0x2b, 0x3b, 0xd7, 0x2b, 0x00, 0x00,
+ 0x00, 0xe5, 0x44, 0x00, 0xe5, 0x44, 0x00, 0x00, 0x00,
+ 0x00, 0x33, 0xd2, 0x2e, 0x33, 0xd2, 0x2e, 0x00, 0x00,
+ 0x00, 0x00, 0x29, 0xb5, 0x02, 0x29, 0xb5, 0x02, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000ac '¬'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000ad '­'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000ae '®'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x29, 0xb1, 0xf3, 0xf2, 0xad, 0x25, 0x00, 0x00,
+ 0x29, 0xe8, 0x6c, 0x0e, 0x0e, 0x6f, 0xe7, 0x24, 0x00,
+ 0xb1, 0x6c, 0xff, 0xf4, 0x52, 0x00, 0x70, 0xaa, 0x00,
+ 0xf3, 0x0e, 0xff, 0x1e, 0xe1, 0x00, 0x11, 0xee, 0x00,
+ 0xf3, 0x0e, 0xff, 0xff, 0x85, 0x00, 0x12, 0xf2, 0x00,
+ 0xb1, 0x6b, 0xff, 0x3c, 0xd3, 0x14, 0x76, 0xaf, 0x00,
+ 0x28, 0xe9, 0x6e, 0x11, 0x14, 0x76, 0xe9, 0x25, 0x00,
+ 0x00, 0x29, 0xb0, 0xf3, 0xf0, 0xac, 0x25, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000af '¯'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000b0 '°'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x50, 0xe9, 0xe9, 0x4d, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xe9, 0x37, 0x3c, 0xe7, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xe9, 0x3a, 0x3d, 0xe6, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x51, 0xe7, 0xe5, 0x4b, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000b1 '±'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x04,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000b2 '²'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x35, 0xc6, 0xf9, 0xdf, 0x4e, 0x00, 0x00, 0x00,
+ 0x00, 0xab, 0x4d, 0x05, 0x40, 0xef, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x63, 0xc0, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x20, 0xac, 0x8b, 0x09, 0x00, 0x00, 0x00,
+ 0x00, 0x4e, 0xb1, 0x28, 0x00, 0x0a, 0x00, 0x00, 0x00,
+ 0x00, 0xfb, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000b3 '³'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x41, 0xd0, 0xfc, 0xdb, 0x3a, 0x00, 0x00,
+ 0x00, 0x00, 0xa7, 0x4c, 0x08, 0x51, 0xe8, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x6c, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x02, 0x43, 0xe4, 0x00, 0x00,
+ 0x00, 0x00, 0x98, 0x40, 0x09, 0x62, 0xdb, 0x00, 0x00,
+ 0x00, 0x00, 0x51, 0xd6, 0xf8, 0xc7, 0x2f, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000b4 '´'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x97, 0x89, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x53, 0xfd, 0x51, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xa9, 0x70, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000b5 'µ'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x0e, 0x00, 0x10, 0xff, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x82, 0x10, 0x91, 0xfd, 0x24, 0x81, 0x00,
+ 0x00, 0xff, 0x93, 0xf4, 0xad, 0x68, 0xed, 0x71, 0x00,
+ 0x00, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000b6 '¶'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x16, 0x99, 0xe0, 0xfc, 0xff, 0xff, 0x00, 0x00,
+ 0x00, 0xc1, 0xff, 0xff, 0xff, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0xfa, 0xff, 0xff, 0xff, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0xad, 0xff, 0xff, 0xff, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0x0b, 0x93, 0xec, 0xff, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000b7 '·'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xc7, 0xc3, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xc6, 0xc1, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000b8 '¸'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x16, 0xff, 0xbe, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x25, 0xf3, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x99, 0xf0, 0xeb, 0x66, 0x00, 0x00, 0x00,
+
+ // U+000000b9 '¹'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x04, 0x7c, 0xf8, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xaa, 0xaa, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000ba 'º'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x11, 0xb5, 0xfa, 0xc7, 0x1f, 0x00, 0x00, 0x00,
+ 0x00, 0xa1, 0x88, 0x08, 0x8a, 0xb5, 0x00, 0x00, 0x00,
+ 0x00, 0xf1, 0x12, 0x00, 0x14, 0xf5, 0x00, 0x00, 0x00,
+ 0x00, 0xf6, 0x10, 0x00, 0x12, 0xee, 0x00, 0x00, 0x00,
+ 0x00, 0xb1, 0x87, 0x0b, 0x8a, 0xa3, 0x00, 0x00, 0x00,
+ 0x00, 0x1a, 0xbf, 0xf7, 0xb7, 0x14, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000bb '»'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xaa, 0x33, 0x00, 0xaa, 0x33, 0x00, 0x00, 0x00,
+ 0x00, 0x2e, 0xd7, 0x38, 0x2e, 0xd7, 0x38, 0x00, 0x00,
+ 0x00, 0x00, 0x46, 0xe3, 0x00, 0x46, 0xe3, 0x00, 0x00,
+ 0x00, 0x30, 0xd2, 0x30, 0x2f, 0xd2, 0x30, 0x00, 0x00,
+ 0x02, 0xb4, 0x27, 0x02, 0xb2, 0x27, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000bc '¼'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0xfa, 0x00, 0x00, 0x00, 0x0d, 0xb2, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x72, 0x84, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x04, 0xd9, 0x15, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x5a, 0x9a, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0xcc, 0x27, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x42, 0xb2, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xb6, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x2b, 0xc8, 0x00, 0x1b, 0xec, 0x00, 0x00,
+ 0x00, 0x00, 0x9e, 0x56, 0x02, 0x8f, 0xfd, 0x00, 0x00,
+ 0x00, 0x18, 0xd7, 0x03, 0x73, 0x30, 0xfc, 0x00, 0x00,
+ 0x00, 0x86, 0x6e, 0x00, 0xf7, 0xff, 0xff, 0xff, 0x00,
+ 0x00, 0xb2, 0x0b, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000bd '½'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0xfa, 0x00, 0x00, 0x00, 0x0d, 0xb2, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x72, 0x84, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x04, 0xd9, 0x15, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x5a, 0x9a, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0xcc, 0x27, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x42, 0xb2, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xb6, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x2b, 0xc8, 0x7f, 0xee, 0xe7, 0x39, 0x00,
+ 0x00, 0x00, 0x9e, 0x56, 0x00, 0x00, 0x26, 0xee, 0x00,
+ 0x00, 0x18, 0xd7, 0x03, 0x00, 0x15, 0xa3, 0x58, 0x00,
+ 0x00, 0x86, 0x6e, 0x00, 0x46, 0x9a, 0x2c, 0x05, 0x00,
+ 0x00, 0xb2, 0x0b, 0x00, 0xfa, 0xff, 0xff, 0xff, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000be '¾'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x91, 0xf5, 0xf1, 0x75, 0x00, 0x0d, 0xb2, 0x00, 0x00,
+ 0x00, 0x00, 0x35, 0xf3, 0x00, 0x72, 0x84, 0x00, 0x00,
+ 0x00, 0x00, 0xff, 0xa9, 0x04, 0xd9, 0x15, 0x00, 0x00,
+ 0x8e, 0x15, 0x37, 0xf3, 0x5a, 0x9a, 0x00, 0x00, 0x00,
+ 0x66, 0xeb, 0xea, 0x6c, 0xcc, 0x27, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x42, 0xb2, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xb6, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x2b, 0xc8, 0x00, 0x1b, 0xec, 0x00, 0x00,
+ 0x00, 0x00, 0x9e, 0x56, 0x02, 0x8f, 0xfd, 0x00, 0x00,
+ 0x00, 0x18, 0xd7, 0x03, 0x73, 0x30, 0xfc, 0x00, 0x00,
+ 0x00, 0x86, 0x6e, 0x00, 0xf7, 0xff, 0xff, 0xff, 0x00,
+ 0x00, 0xb2, 0x0b, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000bf '¿'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xc4, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x0e, 0xec, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x5f, 0x79, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x49, 0xae, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xdf, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xf8, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xb3, 0x7c, 0x0f, 0x1c, 0x7f, 0xa7, 0x00, 0x00,
+ 0x00, 0x15, 0xad, 0xf4, 0xed, 0xa9, 0x24, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000c0 'À'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xa2, 0x82, 0x0a, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x3b, 0x96, 0xb1, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x17, 0xf5, 0x12, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x6e, 0xeb, 0x70, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xc6, 0x40, 0xd2, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x23, 0xbd, 0x00, 0xac, 0x3c, 0x00, 0x00, 0x00,
+ 0x00, 0x7c, 0x5c, 0x00, 0x3c, 0xa2, 0x00, 0x00, 0x00,
+ 0x00, 0xd6, 0xff, 0xff, 0xff, 0xf6, 0x0f, 0x00, 0x00,
+ 0x30, 0xc4, 0x00, 0x00, 0x00, 0x8e, 0x6c, 0x00, 0x00,
+ 0x8a, 0x6e, 0x00, 0x00, 0x00, 0x29, 0xd1, 0x00, 0x00,
+ 0xe1, 0x1b, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x38, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000c1 'Á'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x0a, 0x82, 0xa0, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xb2, 0x96, 0x3b, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x17, 0xf5, 0x12, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x6e, 0xeb, 0x70, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xc6, 0x40, 0xd2, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x23, 0xbd, 0x00, 0xac, 0x3c, 0x00, 0x00, 0x00,
+ 0x00, 0x7c, 0x5c, 0x00, 0x3c, 0xa2, 0x00, 0x00, 0x00,
+ 0x00, 0xd6, 0xff, 0xff, 0xff, 0xf6, 0x0f, 0x00, 0x00,
+ 0x30, 0xc4, 0x00, 0x00, 0x00, 0x8e, 0x6c, 0x00, 0x00,
+ 0x8a, 0x6e, 0x00, 0x00, 0x00, 0x29, 0xd1, 0x00, 0x00,
+ 0xe1, 0x1b, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x38, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000c2 'Â'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x0f, 0xb0, 0xbf, 0x13, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xa2, 0x50, 0x51, 0xac, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x17, 0xf5, 0x12, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x6e, 0xeb, 0x70, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xc6, 0x40, 0xd2, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x23, 0xbd, 0x00, 0xac, 0x3c, 0x00, 0x00, 0x00,
+ 0x00, 0x7c, 0x5c, 0x00, 0x3c, 0xa2, 0x00, 0x00, 0x00,
+ 0x00, 0xd6, 0xff, 0xff, 0xff, 0xf6, 0x0f, 0x00, 0x00,
+ 0x30, 0xc4, 0x00, 0x00, 0x00, 0x8e, 0x6c, 0x00, 0x00,
+ 0x8a, 0x6e, 0x00, 0x00, 0x00, 0x29, 0xd1, 0x00, 0x00,
+ 0xe1, 0x1b, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x38, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000c3 'Ã'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x4f, 0xf0, 0xa9, 0x1d, 0x9a, 0x00, 0x00, 0x00,
+ 0x00, 0xa8, 0x1a, 0x68, 0xeb, 0x5f, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x17, 0xf5, 0x12, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x6e, 0xeb, 0x70, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xc6, 0x40, 0xd2, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x23, 0xbd, 0x00, 0xac, 0x3c, 0x00, 0x00, 0x00,
+ 0x00, 0x7c, 0x5c, 0x00, 0x3c, 0xa2, 0x00, 0x00, 0x00,
+ 0x00, 0xd6, 0xff, 0xff, 0xff, 0xf6, 0x0f, 0x00, 0x00,
+ 0x30, 0xc4, 0x00, 0x00, 0x00, 0x8e, 0x6c, 0x00, 0x00,
+ 0x8a, 0x6e, 0x00, 0x00, 0x00, 0x29, 0xd1, 0x00, 0x00,
+ 0xe1, 0x1b, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x38, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000c4 'Ä'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xc3, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xc3, 0x00, 0x00, 0xc2, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x17, 0xf5, 0x12, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x6e, 0xeb, 0x70, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xc6, 0x40, 0xd2, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x23, 0xbd, 0x00, 0xac, 0x3c, 0x00, 0x00, 0x00,
+ 0x00, 0x7c, 0x5c, 0x00, 0x3c, 0xa2, 0x00, 0x00, 0x00,
+ 0x00, 0xd6, 0xff, 0xff, 0xff, 0xf6, 0x0f, 0x00, 0x00,
+ 0x30, 0xc4, 0x00, 0x00, 0x00, 0x8e, 0x6c, 0x00, 0x00,
+ 0x8a, 0x6e, 0x00, 0x00, 0x00, 0x29, 0xd1, 0x00, 0x00,
+ 0xe1, 0x1b, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x38, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000c5 'Å'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x60, 0xf3, 0x68, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xeb, 0x3b, 0xe8, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x61, 0xf0, 0x61, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x24, 0xff, 0x38, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x7c, 0xd2, 0x98, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xcf, 0x26, 0xe6, 0x08, 0x00, 0x00, 0x00,
+ 0x00, 0x2c, 0xb6, 0x00, 0xa0, 0x58, 0x00, 0x00, 0x00,
+ 0x00, 0x84, 0x5a, 0x00, 0x38, 0xb8, 0x00, 0x00, 0x00,
+ 0x00, 0xdb, 0xff, 0xff, 0xff, 0xfd, 0x1b, 0x00, 0x00,
+ 0x34, 0xc4, 0x00, 0x00, 0x00, 0x8e, 0x7a, 0x00, 0x00,
+ 0x8c, 0x6e, 0x00, 0x00, 0x00, 0x29, 0xda, 0x00, 0x00,
+ 0xe1, 0x1b, 0x00, 0x00, 0x00, 0x00, 0xc2, 0x3b, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000c6 'Æ'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x0d, 0xf8, 0xff, 0xff, 0xff, 0xff, 0x00,
+ 0x00, 0x00, 0x58, 0x98, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xa8, 0x40, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x06, 0xd9, 0x02, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x48, 0x94, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00,
+ 0x00, 0x98, 0x3e, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x01, 0xe6, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x38, 0xb6, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x88, 0x6c, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0xd8, 0x24, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000c7 'Ç'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x51, 0xdc, 0xfb, 0xbe, 0x2a, 0x00, 0x00,
+ 0x00, 0x32, 0xeb, 0x3a, 0x0a, 0x7a, 0xab, 0x00, 0x00,
+ 0x00, 0xa3, 0x71, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xe2, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xfb, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xfa, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xe2, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xa8, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x35, 0xf2, 0x4f, 0x0b, 0x63, 0xaf, 0x00, 0x00,
+ 0x00, 0x00, 0x53, 0xde, 0xff, 0xd0, 0x34, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x14, 0xfe, 0x5f, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x25, 0xee, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x99, 0xf0, 0xeb, 0x66, 0x00, 0x00, 0x00,
+
+ // U+000000c8 'È'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xa2, 0x82, 0x0a, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x3b, 0x96, 0xb1, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000c9 'É'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x0a, 0x82, 0xa0, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xb2, 0x96, 0x3b, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000ca 'Ê'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x0f, 0xb0, 0xbf, 0x13, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xa2, 0x50, 0x51, 0xac, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000cb 'Ë'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xc3, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xc3, 0x00, 0x00, 0xc2, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000cc 'Ì'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xa2, 0x82, 0x0a, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x3b, 0x96, 0xb1, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xff, 0xfc, 0xfc, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000cd 'Í'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x0a, 0x82, 0xa0, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xb2, 0x96, 0x3b, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xff, 0xfc, 0xfc, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000ce 'Î'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x0f, 0xb0, 0xbf, 0x13, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xa2, 0x50, 0x51, 0xac, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xff, 0xfc, 0xfc, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000cf 'Ï'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xc3, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xc3, 0x00, 0x00, 0xc2, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xff, 0xfc, 0xfc, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000d0 'Ð'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xf9, 0xc8, 0x3f, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x0a, 0x5b, 0xef, 0x2b, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x81, 0x9e, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x2d, 0xdc, 0x00, 0x00,
+ 0xff, 0xff, 0xff, 0xff, 0x00, 0x09, 0xf6, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x08, 0xf8, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x2c, 0xd3, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x88, 0x84, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x14, 0x70, 0xe5, 0x14, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xf5, 0xc2, 0x2d, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000d1 'Ñ'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x4f, 0xf0, 0xa9, 0x1d, 0x9a, 0x00, 0x00,
+ 0x00, 0x00, 0xa8, 0x1a, 0x68, 0xeb, 0x5f, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00,
+ 0x00, 0xff, 0x48, 0x00, 0x00, 0x00, 0xff, 0x04, 0x00,
+ 0x00, 0xff, 0xcf, 0x01, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0xcd, 0x5a, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x48, 0xde, 0x05, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0xbf, 0x6c, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x38, 0xe8, 0x0d, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0xb0, 0x80, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x2a, 0xf0, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0xa0, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x1e, 0xf7, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000d2 'Ò'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xa2, 0x82, 0x0a, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x3b, 0x96, 0xb1, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x3a, 0xcb, 0xfa, 0xd6, 0x4a, 0x00, 0x00, 0x00,
+ 0x24, 0xe5, 0x48, 0x04, 0x44, 0xed, 0x35, 0x00, 0x00,
+ 0x9a, 0x6f, 0x00, 0x00, 0x00, 0x74, 0xa7, 0x00, 0x00,
+ 0xde, 0x1d, 0x00, 0x00, 0x00, 0x24, 0xe2, 0x00, 0x00,
+ 0xfa, 0x03, 0x00, 0x00, 0x00, 0x07, 0xf8, 0x00, 0x00,
+ 0xfa, 0x06, 0x00, 0x00, 0x00, 0x0a, 0xf4, 0x00, 0x00,
+ 0xd8, 0x2b, 0x00, 0x00, 0x00, 0x22, 0xdb, 0x00, 0x00,
+ 0x93, 0x84, 0x00, 0x00, 0x00, 0x6d, 0x9b, 0x00, 0x00,
+ 0x1f, 0xe9, 0x5f, 0x08, 0x42, 0xe6, 0x2b, 0x00, 0x00,
+ 0x00, 0x34, 0xc8, 0xf6, 0xd1, 0x45, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000d3 'Ó'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x0a, 0x82, 0xa0, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xb2, 0x96, 0x3b, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x3a, 0xcb, 0xfa, 0xd6, 0x4a, 0x00, 0x00, 0x00,
+ 0x24, 0xe5, 0x48, 0x04, 0x44, 0xed, 0x35, 0x00, 0x00,
+ 0x9a, 0x6f, 0x00, 0x00, 0x00, 0x74, 0xa7, 0x00, 0x00,
+ 0xde, 0x1d, 0x00, 0x00, 0x00, 0x24, 0xe2, 0x00, 0x00,
+ 0xfa, 0x03, 0x00, 0x00, 0x00, 0x07, 0xf8, 0x00, 0x00,
+ 0xfa, 0x06, 0x00, 0x00, 0x00, 0x0a, 0xf4, 0x00, 0x00,
+ 0xd8, 0x2b, 0x00, 0x00, 0x00, 0x22, 0xdb, 0x00, 0x00,
+ 0x93, 0x84, 0x00, 0x00, 0x00, 0x6d, 0x9b, 0x00, 0x00,
+ 0x1f, 0xe9, 0x5f, 0x08, 0x42, 0xe6, 0x2b, 0x00, 0x00,
+ 0x00, 0x34, 0xc8, 0xf6, 0xd1, 0x45, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000d4 'Ô'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x0f, 0xb0, 0xbf, 0x13, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xa2, 0x50, 0x51, 0xac, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x3a, 0xcb, 0xfa, 0xd6, 0x4a, 0x00, 0x00, 0x00,
+ 0x24, 0xe5, 0x48, 0x04, 0x44, 0xed, 0x35, 0x00, 0x00,
+ 0x9a, 0x6f, 0x00, 0x00, 0x00, 0x74, 0xa7, 0x00, 0x00,
+ 0xde, 0x1d, 0x00, 0x00, 0x00, 0x24, 0xe2, 0x00, 0x00,
+ 0xfa, 0x03, 0x00, 0x00, 0x00, 0x07, 0xf8, 0x00, 0x00,
+ 0xfa, 0x06, 0x00, 0x00, 0x00, 0x0a, 0xf4, 0x00, 0x00,
+ 0xd8, 0x2b, 0x00, 0x00, 0x00, 0x22, 0xdb, 0x00, 0x00,
+ 0x93, 0x84, 0x00, 0x00, 0x00, 0x6d, 0x9b, 0x00, 0x00,
+ 0x1f, 0xe9, 0x5f, 0x08, 0x42, 0xe6, 0x2b, 0x00, 0x00,
+ 0x00, 0x34, 0xc8, 0xf6, 0xd1, 0x45, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000d5 'Õ'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x4f, 0xf0, 0xa9, 0x1d, 0x9a, 0x00, 0x00, 0x00,
+ 0x00, 0xa8, 0x1a, 0x68, 0xeb, 0x5f, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x3a, 0xcb, 0xfa, 0xd6, 0x4a, 0x00, 0x00, 0x00,
+ 0x24, 0xe5, 0x48, 0x04, 0x44, 0xed, 0x35, 0x00, 0x00,
+ 0x9a, 0x6f, 0x00, 0x00, 0x00, 0x74, 0xa7, 0x00, 0x00,
+ 0xde, 0x1d, 0x00, 0x00, 0x00, 0x24, 0xe2, 0x00, 0x00,
+ 0xfa, 0x03, 0x00, 0x00, 0x00, 0x07, 0xf8, 0x00, 0x00,
+ 0xfa, 0x06, 0x00, 0x00, 0x00, 0x0a, 0xf4, 0x00, 0x00,
+ 0xd8, 0x2b, 0x00, 0x00, 0x00, 0x22, 0xdb, 0x00, 0x00,
+ 0x93, 0x84, 0x00, 0x00, 0x00, 0x6d, 0x9b, 0x00, 0x00,
+ 0x1f, 0xe9, 0x5f, 0x08, 0x42, 0xe6, 0x2b, 0x00, 0x00,
+ 0x00, 0x34, 0xc8, 0xf6, 0xd1, 0x45, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000d6 'Ö'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xc3, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xc3, 0x00, 0x00, 0xc2, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x3a, 0xcb, 0xfa, 0xd6, 0x4a, 0x00, 0x00, 0x00,
+ 0x24, 0xe5, 0x48, 0x04, 0x44, 0xed, 0x35, 0x00, 0x00,
+ 0x9a, 0x6f, 0x00, 0x00, 0x00, 0x74, 0xa7, 0x00, 0x00,
+ 0xde, 0x1d, 0x00, 0x00, 0x00, 0x24, 0xe2, 0x00, 0x00,
+ 0xfa, 0x03, 0x00, 0x00, 0x00, 0x07, 0xf8, 0x00, 0x00,
+ 0xfa, 0x06, 0x00, 0x00, 0x00, 0x0a, 0xf4, 0x00, 0x00,
+ 0xd8, 0x2b, 0x00, 0x00, 0x00, 0x22, 0xdb, 0x00, 0x00,
+ 0x93, 0x84, 0x00, 0x00, 0x00, 0x6d, 0x9b, 0x00, 0x00,
+ 0x1f, 0xe9, 0x5f, 0x08, 0x42, 0xe6, 0x2b, 0x00, 0x00,
+ 0x00, 0x34, 0xc8, 0xf6, 0xd1, 0x45, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000d7 '×'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xa3, 0x54, 0x00, 0x00, 0x51, 0xac, 0x00, 0x00,
+ 0x00, 0x51, 0xf5, 0x4f, 0x51, 0xf4, 0x4e, 0x00, 0x00,
+ 0x00, 0x00, 0x54, 0xf5, 0xf4, 0x4e, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x4b, 0xf2, 0xf5, 0x46, 0x00, 0x00, 0x00,
+ 0x00, 0x4b, 0xf1, 0x4b, 0x5e, 0xf4, 0x43, 0x00, 0x00,
+ 0x00, 0xa7, 0x4b, 0x00, 0x00, 0x62, 0xae, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000d8 'Ø'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x81, 0x00, 0x00,
+ 0x00, 0x3a, 0xcc, 0xfb, 0xd0, 0x94, 0x86, 0x00, 0x00,
+ 0x25, 0xe8, 0x50, 0x06, 0x61, 0xff, 0x3b, 0x00, 0x00,
+ 0x99, 0x73, 0x00, 0x00, 0x9a, 0xbe, 0xa3, 0x00, 0x00,
+ 0xdc, 0x1f, 0x00, 0x2b, 0xd1, 0x28, 0xdf, 0x00, 0x00,
+ 0xfa, 0x03, 0x00, 0xb6, 0x50, 0x0b, 0xf8, 0x00, 0x00,
+ 0xfa, 0x07, 0x42, 0xc6, 0x00, 0x08, 0xf8, 0x00, 0x00,
+ 0xdb, 0x2d, 0xce, 0x3f, 0x00, 0x24, 0xde, 0x00, 0x00,
+ 0x96, 0xcd, 0xb8, 0x00, 0x00, 0x6d, 0x9f, 0x00, 0x00,
+ 0x22, 0xff, 0x79, 0x08, 0x43, 0xe7, 0x2d, 0x00, 0x00,
+ 0x64, 0xbe, 0xc6, 0xf9, 0xd3, 0x47, 0x00, 0x00, 0x00,
+ 0x8b, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000d9 'Ù'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xa2, 0x82, 0x0a, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x3b, 0x96, 0xb1, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x09, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0xfc, 0x01, 0x00, 0x00, 0x03, 0xf9, 0x00, 0x00,
+ 0x00, 0xd8, 0x1f, 0x00, 0x00, 0x25, 0xcc, 0x00, 0x00,
+ 0x00, 0x51, 0xb0, 0x19, 0x1b, 0xae, 0x3b, 0x00, 0x00,
+ 0x00, 0x00, 0x64, 0xea, 0xe3, 0x4b, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000da 'Ú'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x0a, 0x82, 0xa0, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xb2, 0x96, 0x3b, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x09, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0xfc, 0x01, 0x00, 0x00, 0x03, 0xf9, 0x00, 0x00,
+ 0x00, 0xd8, 0x1f, 0x00, 0x00, 0x25, 0xcc, 0x00, 0x00,
+ 0x00, 0x51, 0xb0, 0x19, 0x1b, 0xae, 0x3b, 0x00, 0x00,
+ 0x00, 0x00, 0x64, 0xea, 0xe3, 0x4b, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000db 'Û'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x0f, 0xb0, 0xbf, 0x13, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xa2, 0x50, 0x51, 0xac, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x09, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0xfc, 0x01, 0x00, 0x00, 0x03, 0xf9, 0x00, 0x00,
+ 0x00, 0xd8, 0x1f, 0x00, 0x00, 0x25, 0xcc, 0x00, 0x00,
+ 0x00, 0x51, 0xb0, 0x19, 0x1b, 0xae, 0x3b, 0x00, 0x00,
+ 0x00, 0x00, 0x64, 0xea, 0xe3, 0x4b, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000dc 'Ü'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xc3, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xc3, 0x00, 0x00, 0xc2, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x09, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0xfc, 0x01, 0x00, 0x00, 0x03, 0xf9, 0x00, 0x00,
+ 0x00, 0xd8, 0x1f, 0x00, 0x00, 0x25, 0xcc, 0x00, 0x00,
+ 0x00, 0x51, 0xb0, 0x19, 0x1b, 0xae, 0x3b, 0x00, 0x00,
+ 0x00, 0x00, 0x64, 0xea, 0xe3, 0x4b, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000dd 'Ý'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x0a, 0x82, 0xa0, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xb2, 0x96, 0x3b, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x01, 0xd1, 0x31, 0x00, 0x00, 0x00, 0x6a, 0x98, 0x00,
+ 0x00, 0x52, 0xba, 0x00, 0x00, 0x04, 0xdd, 0x23, 0x00,
+ 0x00, 0x01, 0xcf, 0x46, 0x00, 0x5c, 0xa8, 0x00, 0x00,
+ 0x00, 0x00, 0x4e, 0xcf, 0x02, 0xd2, 0x30, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xcb, 0xa3, 0xb8, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x4a, 0xff, 0x40, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000de 'Þ'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xff, 0xf5, 0xa9, 0x10, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x06, 0x7e, 0x9f, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x1a, 0xeb, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x16, 0xee, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x03, 0x73, 0xa3, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xff, 0xf4, 0xaa, 0x11, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000df 'ß'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x0f, 0xb7, 0xfa, 0xb4, 0x10, 0x00, 0x00, 0x00,
+ 0x00, 0x91, 0x6a, 0x06, 0x8c, 0x9b, 0x00, 0x00, 0x00,
+ 0x00, 0xdf, 0x24, 0x00, 0x0f, 0xed, 0x00, 0x00, 0x00,
+ 0x00, 0xfb, 0x05, 0x00, 0x14, 0xf1, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x05, 0x8f, 0x9b, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0xff, 0xfc, 0x50, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x01, 0x25, 0xbb, 0x5f, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x25, 0xe8, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x10, 0xf2, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x04, 0x73, 0xa6, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0xac, 0xf7, 0xb7, 0x13, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000e0 'à'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x89, 0x95, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x55, 0xfd, 0x4e, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x72, 0xa8, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x57, 0xde, 0xfb, 0xcf, 0x31, 0x00, 0x00,
+ 0x00, 0x00, 0xa1, 0x30, 0x08, 0x6f, 0xca, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xfa, 0x00, 0x00,
+ 0x00, 0x1f, 0x9f, 0xe2, 0xfc, 0xff, 0xff, 0x00, 0x00,
+ 0x00, 0xd4, 0x6a, 0x15, 0x02, 0x05, 0xf9, 0x00, 0x00,
+ 0x00, 0xee, 0x4f, 0x07, 0x23, 0xa5, 0xff, 0x00, 0x00,
+ 0x00, 0x48, 0xd8, 0xf8, 0xd6, 0x6c, 0xfc, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000e1 'á'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x97, 0x89, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x53, 0xfd, 0x51, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xa9, 0x70, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x57, 0xde, 0xfb, 0xcf, 0x31, 0x00, 0x00,
+ 0x00, 0x00, 0xa1, 0x30, 0x08, 0x6f, 0xca, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xfa, 0x00, 0x00,
+ 0x00, 0x1f, 0x9f, 0xe2, 0xfc, 0xff, 0xff, 0x00, 0x00,
+ 0x00, 0xd4, 0x6a, 0x15, 0x02, 0x05, 0xf9, 0x00, 0x00,
+ 0x00, 0xee, 0x4f, 0x07, 0x23, 0xa5, 0xff, 0x00, 0x00,
+ 0x00, 0x48, 0xd8, 0xf8, 0xd6, 0x6c, 0xfc, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000e2 'â'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x09, 0xc3, 0x08, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x7e, 0xcf, 0x78, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x97, 0x0a, 0xa3, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x57, 0xde, 0xfb, 0xcf, 0x31, 0x00, 0x00,
+ 0x00, 0x00, 0xa1, 0x30, 0x08, 0x6f, 0xca, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xfa, 0x00, 0x00,
+ 0x00, 0x1f, 0x9f, 0xe2, 0xfc, 0xff, 0xff, 0x00, 0x00,
+ 0x00, 0xd4, 0x6a, 0x15, 0x02, 0x05, 0xf9, 0x00, 0x00,
+ 0x00, 0xee, 0x4f, 0x07, 0x23, 0xa5, 0xff, 0x00, 0x00,
+ 0x00, 0x48, 0xd8, 0xf8, 0xd6, 0x6c, 0xfc, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000e3 'ã'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x53, 0xf1, 0xa8, 0x1c, 0x9e, 0x00, 0x00,
+ 0x00, 0x00, 0xac, 0x1d, 0x59, 0xf1, 0x63, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x57, 0xde, 0xfb, 0xcf, 0x31, 0x00, 0x00,
+ 0x00, 0x00, 0xa1, 0x30, 0x08, 0x6f, 0xca, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xfa, 0x00, 0x00,
+ 0x00, 0x1f, 0x9f, 0xe2, 0xfc, 0xff, 0xff, 0x00, 0x00,
+ 0x00, 0xd4, 0x6a, 0x15, 0x02, 0x05, 0xf9, 0x00, 0x00,
+ 0x00, 0xee, 0x4f, 0x07, 0x23, 0xa5, 0xff, 0x00, 0x00,
+ 0x00, 0x48, 0xd8, 0xf8, 0xd6, 0x6c, 0xfc, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000e4 'ä'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xc3, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xc3, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x57, 0xde, 0xfb, 0xcf, 0x31, 0x00, 0x00,
+ 0x00, 0x00, 0xa1, 0x30, 0x08, 0x6f, 0xca, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xfa, 0x00, 0x00,
+ 0x00, 0x1f, 0x9f, 0xe2, 0xfc, 0xff, 0xff, 0x00, 0x00,
+ 0x00, 0xd4, 0x6a, 0x15, 0x02, 0x05, 0xf9, 0x00, 0x00,
+ 0x00, 0xee, 0x4f, 0x07, 0x23, 0xa5, 0xff, 0x00, 0x00,
+ 0x00, 0x48, 0xd8, 0xf8, 0xd6, 0x6c, 0xfc, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000e5 'å'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x68, 0xf3, 0x67, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xf5, 0x3c, 0xf4, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x70, 0xee, 0x6e, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x57, 0xde, 0xfb, 0xcf, 0x31, 0x00, 0x00,
+ 0x00, 0x00, 0xa1, 0x30, 0x08, 0x6f, 0xca, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xfa, 0x00, 0x00,
+ 0x00, 0x1f, 0x9f, 0xe2, 0xfc, 0xff, 0xff, 0x00, 0x00,
+ 0x00, 0xd4, 0x6a, 0x15, 0x02, 0x05, 0xf9, 0x00, 0x00,
+ 0x00, 0xee, 0x4f, 0x07, 0x23, 0xa5, 0xff, 0x00, 0x00,
+ 0x00, 0x48, 0xd8, 0xf8, 0xd6, 0x6c, 0xfc, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000e6 'æ'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x5f, 0xe0, 0xfc, 0xcf, 0x5e, 0xd8, 0xef, 0x4a, 0x00,
+ 0x9f, 0x45, 0x09, 0x7e, 0xff, 0x5a, 0x48, 0xc8, 0x00,
+ 0x00, 0x00, 0x00, 0x09, 0xff, 0x0c, 0x14, 0xf3, 0x00,
+ 0x1d, 0x9c, 0xe2, 0xfa, 0xff, 0xfa, 0xf0, 0xe7, 0x00,
+ 0xd6, 0x77, 0x27, 0x14, 0xff, 0x03, 0x00, 0x00, 0x00,
+ 0xea, 0x49, 0x06, 0x4e, 0xff, 0x6a, 0x05, 0x00, 0x00,
+ 0x3f, 0xd2, 0xf7, 0xc3, 0x43, 0xc3, 0xf7, 0x9c, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000e7 'ç'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x6a, 0xdd, 0xfa, 0xd1, 0x4a, 0x00, 0x00,
+ 0x00, 0x67, 0xc8, 0x25, 0x06, 0x4e, 0x9e, 0x00, 0x00,
+ 0x00, 0xdc, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xfc, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xdb, 0x3b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x6b, 0xdb, 0x3a, 0x08, 0x50, 0xa7, 0x00, 0x00,
+ 0x00, 0x00, 0x72, 0xe2, 0xff, 0xda, 0x4d, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x14, 0xff, 0x62, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x25, 0xec, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x99, 0xf0, 0xeb, 0x66, 0x00, 0x00, 0x00,
+
+ // U+000000e8 'è'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x89, 0x95, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x55, 0xfd, 0x4e, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x72, 0xa8, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x44, 0xdb, 0xed, 0x58, 0x00, 0x00, 0x00,
+ 0x00, 0x3d, 0xbb, 0x22, 0x0f, 0x9c, 0x5d, 0x00, 0x00,
+ 0x00, 0xcb, 0x2c, 0x00, 0x00, 0x0f, 0xdb, 0x00, 0x00,
+ 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x00, 0x00,
+ 0x00, 0xc1, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x25, 0xb0, 0x2a, 0x06, 0x48, 0xaa, 0x00, 0x00,
+ 0x00, 0x00, 0x42, 0xd3, 0xf8, 0xcf, 0x3f, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000e9 'é'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x97, 0x89, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x53, 0xfd, 0x51, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xa9, 0x70, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x44, 0xdb, 0xed, 0x58, 0x00, 0x00, 0x00,
+ 0x00, 0x3d, 0xbb, 0x22, 0x0f, 0x9c, 0x5d, 0x00, 0x00,
+ 0x00, 0xcb, 0x2c, 0x00, 0x00, 0x0f, 0xdb, 0x00, 0x00,
+ 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x00, 0x00,
+ 0x00, 0xc1, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x25, 0xb0, 0x2a, 0x06, 0x48, 0xaa, 0x00, 0x00,
+ 0x00, 0x00, 0x42, 0xd3, 0xf8, 0xcf, 0x3f, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000ea 'ê'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x09, 0xc3, 0x08, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x7e, 0xcf, 0x78, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x97, 0x0a, 0xa3, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x44, 0xdb, 0xed, 0x58, 0x00, 0x00, 0x00,
+ 0x00, 0x3d, 0xbb, 0x22, 0x0f, 0x9c, 0x5d, 0x00, 0x00,
+ 0x00, 0xcb, 0x2c, 0x00, 0x00, 0x0f, 0xdb, 0x00, 0x00,
+ 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x00, 0x00,
+ 0x00, 0xc1, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x25, 0xb0, 0x2a, 0x06, 0x48, 0xaa, 0x00, 0x00,
+ 0x00, 0x00, 0x42, 0xd3, 0xf8, 0xcf, 0x3f, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000eb 'ë'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xc3, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xc3, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x44, 0xdb, 0xed, 0x58, 0x00, 0x00, 0x00,
+ 0x00, 0x3d, 0xbb, 0x22, 0x0f, 0x9c, 0x5d, 0x00, 0x00,
+ 0x00, 0xcb, 0x2c, 0x00, 0x00, 0x0f, 0xdb, 0x00, 0x00,
+ 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x00, 0x00,
+ 0x00, 0xc1, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x25, 0xb0, 0x2a, 0x06, 0x48, 0xaa, 0x00, 0x00,
+ 0x00, 0x00, 0x42, 0xd3, 0xf8, 0xcf, 0x3f, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000ec 'ì'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x89, 0x95, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x55, 0xfd, 0x4e, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x72, 0xa8, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000ed 'í'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x97, 0x89, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x53, 0xfd, 0x51, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xa9, 0x70, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000ee 'î'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x09, 0xc3, 0x08, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x7e, 0xcf, 0x78, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x97, 0x0a, 0xa3, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000ef 'ï'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xc3, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xc3, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000f0 'ð'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x74, 0xcb, 0x18, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x15, 0xc1, 0xea, 0xd2, 0x9a, 0x00, 0x00,
+ 0x00, 0x00, 0xc2, 0x86, 0x92, 0xa0, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x07, 0xe1, 0x3d, 0x00, 0x00,
+ 0x00, 0x00, 0x5c, 0xea, 0xe9, 0xcc, 0xa2, 0x00, 0x00,
+ 0x00, 0x5d, 0xbe, 0x1b, 0x16, 0xb4, 0xde, 0x00, 0x00,
+ 0x00, 0xda, 0x26, 0x00, 0x00, 0x25, 0xf6, 0x00, 0x00,
+ 0x00, 0xfc, 0x03, 0x00, 0x00, 0x06, 0xf3, 0x00, 0x00,
+ 0x00, 0xde, 0x2e, 0x00, 0x00, 0x2b, 0xc9, 0x00, 0x00,
+ 0x00, 0x66, 0xc4, 0x1f, 0x19, 0xb6, 0x50, 0x00, 0x00,
+ 0x00, 0x00, 0x58, 0xdf, 0xe7, 0x4d, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000f1 'ñ'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x53, 0xf1, 0xa8, 0x1c, 0x9e, 0x00, 0x00,
+ 0x00, 0x00, 0xac, 0x1d, 0x59, 0xf1, 0x63, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x32, 0xc3, 0xfa, 0xd4, 0x30, 0x00, 0x00,
+ 0x00, 0xff, 0xbe, 0x33, 0x07, 0x7b, 0xc6, 0x00, 0x00,
+ 0x00, 0xff, 0x21, 0x00, 0x00, 0x0a, 0xf9, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000f2 'ò'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x89, 0x95, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x55, 0xfd, 0x4e, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x72, 0xa8, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x79, 0xeb, 0xed, 0x65, 0x00, 0x00, 0x00,
+ 0x00, 0x6c, 0xbd, 0x18, 0x1c, 0xc3, 0x52, 0x00, 0x00,
+ 0x00, 0xd9, 0x28, 0x00, 0x00, 0x2e, 0xd4, 0x00, 0x00,
+ 0x00, 0xfc, 0x03, 0x00, 0x00, 0x06, 0xf7, 0x00, 0x00,
+ 0x00, 0xdf, 0x2e, 0x00, 0x00, 0x28, 0xc5, 0x00, 0x00,
+ 0x00, 0x67, 0xc4, 0x1e, 0x1a, 0xb8, 0x34, 0x00, 0x00,
+ 0x00, 0x00, 0x5b, 0xe1, 0xea, 0x5d, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000f3 'ó'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x97, 0x89, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x53, 0xfd, 0x51, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xa9, 0x70, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x79, 0xeb, 0xed, 0x65, 0x00, 0x00, 0x00,
+ 0x00, 0x6c, 0xbd, 0x18, 0x1c, 0xc3, 0x52, 0x00, 0x00,
+ 0x00, 0xd9, 0x28, 0x00, 0x00, 0x2e, 0xd4, 0x00, 0x00,
+ 0x00, 0xfc, 0x03, 0x00, 0x00, 0x06, 0xf7, 0x00, 0x00,
+ 0x00, 0xdf, 0x2e, 0x00, 0x00, 0x28, 0xc5, 0x00, 0x00,
+ 0x00, 0x67, 0xc4, 0x1e, 0x1a, 0xb8, 0x34, 0x00, 0x00,
+ 0x00, 0x00, 0x5b, 0xe1, 0xea, 0x5d, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000f4 'ô'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x09, 0xc3, 0x08, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x7e, 0xcf, 0x78, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x97, 0x0a, 0xa3, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x79, 0xeb, 0xed, 0x65, 0x00, 0x00, 0x00,
+ 0x00, 0x6c, 0xbd, 0x18, 0x1c, 0xc3, 0x52, 0x00, 0x00,
+ 0x00, 0xd9, 0x28, 0x00, 0x00, 0x2e, 0xd4, 0x00, 0x00,
+ 0x00, 0xfc, 0x03, 0x00, 0x00, 0x06, 0xf7, 0x00, 0x00,
+ 0x00, 0xdf, 0x2e, 0x00, 0x00, 0x28, 0xc5, 0x00, 0x00,
+ 0x00, 0x67, 0xc4, 0x1e, 0x1a, 0xb8, 0x34, 0x00, 0x00,
+ 0x00, 0x00, 0x5b, 0xe1, 0xea, 0x5d, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000f5 'õ'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x53, 0xf1, 0xa8, 0x1c, 0x9e, 0x00, 0x00,
+ 0x00, 0x00, 0xac, 0x1d, 0x59, 0xf1, 0x63, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x79, 0xeb, 0xed, 0x65, 0x00, 0x00, 0x00,
+ 0x00, 0x6c, 0xbd, 0x18, 0x1c, 0xc3, 0x52, 0x00, 0x00,
+ 0x00, 0xd9, 0x28, 0x00, 0x00, 0x2e, 0xd4, 0x00, 0x00,
+ 0x00, 0xfc, 0x03, 0x00, 0x00, 0x06, 0xf7, 0x00, 0x00,
+ 0x00, 0xdf, 0x2e, 0x00, 0x00, 0x28, 0xc5, 0x00, 0x00,
+ 0x00, 0x67, 0xc4, 0x1e, 0x1a, 0xb8, 0x34, 0x00, 0x00,
+ 0x00, 0x00, 0x5b, 0xe1, 0xea, 0x5d, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000f6 'ö'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xc3, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xc3, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x79, 0xeb, 0xed, 0x65, 0x00, 0x00, 0x00,
+ 0x00, 0x6c, 0xbd, 0x18, 0x1c, 0xc3, 0x52, 0x00, 0x00,
+ 0x00, 0xd9, 0x28, 0x00, 0x00, 0x2e, 0xd4, 0x00, 0x00,
+ 0x00, 0xfc, 0x03, 0x00, 0x00, 0x06, 0xf7, 0x00, 0x00,
+ 0x00, 0xdf, 0x2e, 0x00, 0x00, 0x28, 0xc5, 0x00, 0x00,
+ 0x00, 0x67, 0xc4, 0x1e, 0x1a, 0xb8, 0x34, 0x00, 0x00,
+ 0x00, 0x00, 0x5b, 0xe1, 0xea, 0x5d, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000f7 '÷'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xc1, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000f8 'ø'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x6b, 0x52, 0x00, 0x00,
+ 0x00, 0x00, 0x76, 0xea, 0xf1, 0xee, 0x18, 0x00, 0x00,
+ 0x00, 0x69, 0xbd, 0x19, 0x7a, 0xf4, 0x60, 0x00, 0x00,
+ 0x00, 0xd7, 0x26, 0x12, 0xdb, 0x40, 0xc4, 0x00, 0x00,
+ 0x00, 0xfa, 0x03, 0x90, 0x6e, 0x06, 0xf4, 0x00, 0x00,
+ 0x00, 0xe1, 0x58, 0xd2, 0x04, 0x28, 0xc6, 0x00, 0x00,
+ 0x00, 0x73, 0xfc, 0x63, 0x1a, 0xbd, 0x3d, 0x00, 0x00,
+ 0x00, 0x21, 0xe5, 0xe7, 0xeb, 0x60, 0x00, 0x00, 0x00,
+ 0x00, 0x64, 0x56, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000f9 'ù'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x89, 0x95, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x55, 0xfd, 0x4e, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x72, 0xa8, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x02, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x06, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x08, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x08, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x01, 0xf9, 0x14, 0x00, 0x00, 0x21, 0xff, 0x00, 0x00,
+ 0x00, 0xb4, 0x81, 0x06, 0x26, 0xba, 0xff, 0x00, 0x00,
+ 0x00, 0x1b, 0xbb, 0xf9, 0xd6, 0x50, 0xfe, 0x04, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000fa 'ú'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x97, 0x89, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x53, 0xfd, 0x51, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xa9, 0x70, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x02, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x06, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x08, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x08, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x01, 0xf9, 0x14, 0x00, 0x00, 0x21, 0xff, 0x00, 0x00,
+ 0x00, 0xb4, 0x81, 0x06, 0x26, 0xba, 0xff, 0x00, 0x00,
+ 0x00, 0x1b, 0xbb, 0xf9, 0xd6, 0x50, 0xfe, 0x04, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000fb 'û'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x09, 0xc3, 0x08, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x7e, 0xcf, 0x78, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x97, 0x0a, 0xa3, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x02, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x06, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x08, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x08, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x01, 0xf9, 0x14, 0x00, 0x00, 0x21, 0xff, 0x00, 0x00,
+ 0x00, 0xb4, 0x81, 0x06, 0x26, 0xba, 0xff, 0x00, 0x00,
+ 0x00, 0x1b, 0xbb, 0xf9, 0xd6, 0x50, 0xfe, 0x04, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000fc 'ü'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xc3, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xc3, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x02, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x06, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x08, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x08, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x01, 0xf9, 0x14, 0x00, 0x00, 0x21, 0xff, 0x00, 0x00,
+ 0x00, 0xb4, 0x81, 0x06, 0x26, 0xba, 0xff, 0x00, 0x00,
+ 0x00, 0x1b, 0xbb, 0xf9, 0xd6, 0x50, 0xfe, 0x04, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000fd 'ý'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x97, 0x89, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x53, 0xfd, 0x51, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xa9, 0x70, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xc0, 0x4d, 0x00, 0x00, 0x09, 0xe9, 0x02, 0x00,
+ 0x00, 0x56, 0xb0, 0x00, 0x00, 0x3d, 0xad, 0x00, 0x00,
+ 0x00, 0x04, 0xe2, 0x23, 0x00, 0x84, 0x67, 0x00, 0x00,
+ 0x00, 0x00, 0x7e, 0x90, 0x00, 0xc8, 0x1a, 0x00, 0x00,
+ 0x00, 0x00, 0x17, 0xeb, 0x1f, 0xcd, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xa6, 0xc1, 0x86, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x38, 0xff, 0x3a, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x2f, 0xe7, 0x02, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x0b, 0xb7, 0x5d, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xa5, 0xec, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000fe 'þ'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xfd, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xfc, 0x61, 0xe5, 0xef, 0x74, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x8e, 0x0a, 0x1d, 0xc1, 0x66, 0x00, 0x00,
+ 0x00, 0xff, 0x0c, 0x00, 0x00, 0x30, 0xdc, 0x00, 0x00,
+ 0x00, 0xfc, 0x00, 0x00, 0x00, 0x06, 0xf8, 0x00, 0x00,
+ 0x00, 0xff, 0x0b, 0x00, 0x00, 0x25, 0xd2, 0x00, 0x00,
+ 0x00, 0xff, 0xb2, 0x28, 0x20, 0xbb, 0x4e, 0x00, 0x00,
+ 0x00, 0xff, 0x6d, 0xe6, 0xe8, 0x5e, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000000ff 'ÿ'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xc3, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xc3, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xc0, 0x4d, 0x00, 0x00, 0x09, 0xe9, 0x02, 0x00,
+ 0x00, 0x56, 0xb0, 0x00, 0x00, 0x3d, 0xad, 0x00, 0x00,
+ 0x00, 0x04, 0xe2, 0x23, 0x00, 0x84, 0x67, 0x00, 0x00,
+ 0x00, 0x00, 0x7e, 0x90, 0x00, 0xc8, 0x1a, 0x00, 0x00,
+ 0x00, 0x00, 0x17, 0xeb, 0x1f, 0xcd, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xa6, 0xc1, 0x86, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x38, 0xff, 0x3a, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x2f, 0xe7, 0x02, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x0b, 0xb7, 0x5d, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xa5, 0xec, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000102 'Ă'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xa9, 0x4a, 0x09, 0x41, 0xa9, 0x00, 0x00, 0x00,
+ 0x00, 0x39, 0xc7, 0xf6, 0xca, 0x37, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x17, 0xf5, 0x12, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x6e, 0xeb, 0x70, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xc6, 0x40, 0xd2, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x23, 0xbd, 0x00, 0xac, 0x3c, 0x00, 0x00, 0x00,
+ 0x00, 0x7c, 0x5c, 0x00, 0x3c, 0xa2, 0x00, 0x00, 0x00,
+ 0x00, 0xd6, 0xff, 0xff, 0xff, 0xf6, 0x0f, 0x00, 0x00,
+ 0x30, 0xc4, 0x00, 0x00, 0x00, 0x8e, 0x6c, 0x00, 0x00,
+ 0x8a, 0x6e, 0x00, 0x00, 0x00, 0x29, 0xd1, 0x00, 0x00,
+ 0xe1, 0x1b, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x38, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000103 'ă'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xa9, 0x48, 0x09, 0x41, 0xa9, 0x00, 0x00,
+ 0x00, 0x00, 0x39, 0xc7, 0xf6, 0xc9, 0x36, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x57, 0xde, 0xfb, 0xcf, 0x31, 0x00, 0x00,
+ 0x00, 0x00, 0xa1, 0x30, 0x08, 0x6f, 0xca, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xfa, 0x00, 0x00,
+ 0x00, 0x1f, 0x9f, 0xe2, 0xfc, 0xff, 0xff, 0x00, 0x00,
+ 0x00, 0xd4, 0x6a, 0x15, 0x02, 0x05, 0xf9, 0x00, 0x00,
+ 0x00, 0xee, 0x4f, 0x07, 0x23, 0xa5, 0xff, 0x00, 0x00,
+ 0x00, 0x48, 0xd8, 0xf8, 0xd6, 0x6c, 0xfc, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000104 'Ą'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x17, 0xf5, 0x14, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x6e, 0xeb, 0x72, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xc6, 0x3e, 0xd3, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x23, 0xbd, 0x00, 0xa8, 0x3e, 0x00, 0x00, 0x00,
+ 0x00, 0x7c, 0x5c, 0x00, 0x38, 0xa4, 0x00, 0x00, 0x00,
+ 0x00, 0xd6, 0xff, 0xff, 0xff, 0xf8, 0x12, 0x00, 0x00,
+ 0x30, 0xc4, 0x00, 0x00, 0x00, 0x8a, 0x70, 0x00, 0x00,
+ 0x8a, 0x6e, 0x00, 0x00, 0x00, 0x26, 0xd5, 0x00, 0x00,
+ 0xe1, 0x1b, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x3c, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0xaa, 0x11, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x19, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xc5, 0xe3, 0x00, 0x00,
+
+ // U+00000105 'ą'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x57, 0xde, 0xfb, 0xcf, 0x31, 0x00, 0x00,
+ 0x00, 0x00, 0xa1, 0x30, 0x08, 0x6f, 0xca, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xfa, 0x00, 0x00,
+ 0x00, 0x1d, 0x9f, 0xe2, 0xfc, 0xff, 0xfc, 0x00, 0x00,
+ 0x00, 0xd3, 0x6a, 0x15, 0x02, 0x05, 0xf5, 0x00, 0x00,
+ 0x00, 0xee, 0x4f, 0x07, 0x23, 0xa5, 0xfc, 0x00, 0x00,
+ 0x00, 0x49, 0xd8, 0xf8, 0xd6, 0x6c, 0xf6, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x95, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xe7, 0x13, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xc5, 0xe3, 0x00, 0x00,
+
+ // U+00000106 'Ć'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x0a, 0x82, 0xa0, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xb2, 0x96, 0x3b, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x4d, 0xdb, 0xfb, 0xbe, 0x2a, 0x00, 0x00,
+ 0x00, 0x31, 0xea, 0x3a, 0x0a, 0x7a, 0xab, 0x00, 0x00,
+ 0x00, 0xa5, 0x71, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xe4, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xfa, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xfa, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xe2, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xa3, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x2d, 0xe5, 0x51, 0x0a, 0x57, 0xaf, 0x00, 0x00,
+ 0x00, 0x00, 0x44, 0xd2, 0xf8, 0xc2, 0x2b, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000107 'ć'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x97, 0x89, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x53, 0xfd, 0x51, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xa9, 0x70, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x6b, 0xdd, 0xfa, 0xd1, 0x4a, 0x00, 0x00,
+ 0x00, 0x69, 0xc8, 0x25, 0x06, 0x4f, 0x9e, 0x00, 0x00,
+ 0x00, 0xdb, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xfc, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xda, 0x3b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x64, 0xdb, 0x3a, 0x08, 0x50, 0xa7, 0x00, 0x00,
+ 0x00, 0x00, 0x61, 0xd8, 0xf8, 0xce, 0x43, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000010c 'Č'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xa7, 0x49, 0x49, 0x9a, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x16, 0xc0, 0xae, 0x0e, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x4d, 0xdb, 0xfb, 0xbe, 0x2a, 0x00, 0x00,
+ 0x00, 0x31, 0xea, 0x3a, 0x0a, 0x7a, 0xab, 0x00, 0x00,
+ 0x00, 0xa5, 0x71, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xe4, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xfa, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xfa, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xe2, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xa3, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x2d, 0xe5, 0x51, 0x0a, 0x57, 0xaf, 0x00, 0x00,
+ 0x00, 0x00, 0x44, 0xd2, 0xf8, 0xc2, 0x2b, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000010d 'č'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xaa, 0x1e, 0xa1, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x80, 0xf3, 0x7a, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x0a, 0xc3, 0x07, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x6b, 0xdd, 0xfa, 0xd1, 0x4a, 0x00, 0x00,
+ 0x00, 0x69, 0xc8, 0x25, 0x06, 0x4f, 0x9e, 0x00, 0x00,
+ 0x00, 0xdb, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xfc, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xda, 0x3b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x64, 0xdb, 0x3a, 0x08, 0x50, 0xa7, 0x00, 0x00,
+ 0x00, 0x00, 0x61, 0xd8, 0xf8, 0xce, 0x43, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000010e 'Ď'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xa7, 0x49, 0x49, 0x9a, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x16, 0xc0, 0xae, 0x0e, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xfc, 0xd3, 0x48, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x09, 0x56, 0xee, 0x2e, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x7b, 0xa2, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x2d, 0xdd, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x0b, 0xf6, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x06, 0xf6, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x27, 0xd9, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x7d, 0x94, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x13, 0x67, 0xea, 0x20, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xf1, 0xbc, 0x32, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000010f 'ď'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xd0, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x0e, 0xce, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x89, 0x26, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00,
+ 0x00, 0x5c, 0xe9, 0xe8, 0x65, 0xff, 0x00, 0x00, 0x00,
+ 0x43, 0xb6, 0x13, 0x1b, 0xb3, 0xff, 0x00, 0x00, 0x00,
+ 0xcf, 0x24, 0x00, 0x00, 0x2d, 0xff, 0x00, 0x00, 0x00,
+ 0xfa, 0x04, 0x00, 0x00, 0x1b, 0xff, 0x00, 0x00, 0x00,
+ 0xd3, 0x30, 0x00, 0x00, 0x37, 0xff, 0x00, 0x00, 0x00,
+ 0x42, 0xbd, 0x1e, 0x1d, 0xbd, 0xff, 0x00, 0x00, 0x00,
+ 0x00, 0x40, 0xe9, 0xd9, 0x50, 0xff, 0x03, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000110 'Đ'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xf9, 0xc8, 0x3f, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x0a, 0x5b, 0xef, 0x2b, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x81, 0x9e, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x2d, 0xdc, 0x00, 0x00,
+ 0xff, 0xff, 0xff, 0xff, 0x00, 0x09, 0xf6, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x08, 0xf8, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x2c, 0xd3, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x88, 0x84, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x14, 0x70, 0xe5, 0x14, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xf5, 0xc2, 0x2d, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000111 'đ'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf4, 0x07, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf4, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf4, 0x00, 0x00,
+ 0x00, 0x00, 0x53, 0xe5, 0xe3, 0x4b, 0xf4, 0x00, 0x00,
+ 0x00, 0x4b, 0xa9, 0x14, 0x15, 0xa3, 0xfe, 0x00, 0x00,
+ 0x00, 0xd5, 0x1a, 0x00, 0x00, 0x20, 0xff, 0x00, 0x00,
+ 0x00, 0xfa, 0x04, 0x00, 0x00, 0x0f, 0xff, 0x00, 0x00,
+ 0x00, 0xd0, 0x2d, 0x00, 0x00, 0x27, 0xff, 0x00, 0x00,
+ 0x00, 0x45, 0xbe, 0x1c, 0x19, 0xad, 0xff, 0x00, 0x00,
+ 0x00, 0x00, 0x5f, 0xec, 0xdc, 0x53, 0xfc, 0x04, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000118 'Ę'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, 0x94, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xe6, 0x13, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xc2, 0xe3, 0x00, 0x00,
+
+ // U+00000119 'ę'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x60, 0xe2, 0xf1, 0x65, 0x00, 0x00, 0x00,
+ 0x00, 0x71, 0xb9, 0x1f, 0x10, 0x9e, 0x54, 0x00, 0x00,
+ 0x00, 0xe3, 0x20, 0x00, 0x00, 0x0f, 0xd9, 0x00, 0x00,
+ 0x00, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x00, 0x00,
+ 0x00, 0xdd, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x67, 0xb4, 0x28, 0x06, 0x4a, 0xaa, 0x00, 0x00,
+ 0x00, 0x00, 0x4c, 0xd6, 0xf8, 0xf4, 0x4c, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x63, 0x73, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xf2, 0x0d, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xac, 0xe8, 0x00, 0x00, 0x00,
+
+ // U+0000011a 'Ě'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xa7, 0x49, 0x49, 0x9a, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x16, 0xc0, 0xae, 0x0e, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000011b 'ě'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xaa, 0x1e, 0xa1, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x80, 0xf3, 0x7a, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x0a, 0xc3, 0x07, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x44, 0xdb, 0xed, 0x58, 0x00, 0x00, 0x00,
+ 0x00, 0x3d, 0xbb, 0x22, 0x0f, 0x9c, 0x5d, 0x00, 0x00,
+ 0x00, 0xcb, 0x2c, 0x00, 0x00, 0x0f, 0xdb, 0x00, 0x00,
+ 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x00, 0x00,
+ 0x00, 0xc1, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x25, 0xb0, 0x2a, 0x06, 0x48, 0xaa, 0x00, 0x00,
+ 0x00, 0x00, 0x42, 0xd3, 0xf8, 0xcf, 0x3f, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000011e 'Ğ'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xa9, 0x4a, 0x09, 0x41, 0xa9, 0x00, 0x00, 0x00,
+ 0x00, 0x39, 0xc7, 0xf6, 0xca, 0x37, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x24, 0xac, 0xf2, 0xf4, 0xb7, 0x30, 0x00, 0x00,
+ 0x1c, 0xe4, 0x6a, 0x0e, 0x0d, 0x69, 0xaa, 0x00, 0x00,
+ 0x92, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xde, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xfb, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xfa, 0x05, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00,
+ 0xdd, 0x21, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x94, 0x78, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x1b, 0xe5, 0x76, 0x12, 0x10, 0x5c, 0xff, 0x00, 0x00,
+ 0x00, 0x25, 0xaf, 0xf2, 0xef, 0xb5, 0x40, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000011f 'ğ'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xa9, 0x48, 0x09, 0x41, 0xa9, 0x00, 0x00,
+ 0x00, 0x00, 0x39, 0xc7, 0xf6, 0xc9, 0x36, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x1e, 0xc0, 0xfa, 0xc5, 0x94, 0xe6, 0x00, 0x00,
+ 0x00, 0xbe, 0x76, 0x09, 0x78, 0xd5, 0x07, 0x00, 0x00,
+ 0x00, 0xf9, 0x05, 0x00, 0x09, 0xf6, 0x00, 0x00, 0x00,
+ 0x00, 0xc7, 0x75, 0x09, 0x7a, 0xbf, 0x00, 0x00, 0x00,
+ 0x00, 0x47, 0xee, 0xf8, 0xc1, 0x20, 0x00, 0x00, 0x00,
+ 0x00, 0xe3, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xb6, 0xf2, 0xf3, 0xfb, 0xdd, 0x57, 0x00, 0x00,
+ 0x00, 0xd7, 0x18, 0x00, 0x00, 0x35, 0xf0, 0x00, 0x00,
+ 0x00, 0xf3, 0x59, 0x0a, 0x10, 0x71, 0xd4, 0x00, 0x00,
+ 0x00, 0x4e, 0xcf, 0xf7, 0xf3, 0xb6, 0x27, 0x00, 0x00,
+
+ // U+00000130 'İ'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xc5, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xff, 0xfc, 0xfc, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000131 'ı'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000138 'ĸ'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x09, 0x00, 0x20, 0xd2, 0x55, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x2f, 0xde, 0x4f, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x43, 0xe9, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0xcf, 0xe9, 0x64, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x11, 0x34, 0xee, 0x44, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x46, 0xeb, 0x29, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x5c, 0xdb, 0x15, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000139 'Ĺ'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x0a, 0x82, 0xa0, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xb2, 0x96, 0x3b, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000013a 'ĺ'
+ 0x00, 0x00, 0x00, 0x0a, 0x82, 0xa0, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xb2, 0x96, 0x3b, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000013d 'Ľ'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x09, 0x00, 0x00, 0xd3, 0xc5, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x31, 0xce, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x89, 0x26, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000013e 'ľ'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0xd4, 0xc5, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x31, 0xce, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x89, 0x26, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000141 'Ł'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x70, 0xc6, 0xe8, 0x00, 0x00, 0x00, 0x00,
+ 0xc0, 0xff, 0x92, 0x3e, 0x02, 0x00, 0x00, 0x00, 0x00,
+ 0x42, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000142 'ł'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x8d, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x4e, 0xff, 0x60, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xac, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000143 'Ń'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x0a, 0x82, 0xa0, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xb2, 0x96, 0x3b, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00,
+ 0x00, 0xff, 0x48, 0x00, 0x00, 0x00, 0xff, 0x04, 0x00,
+ 0x00, 0xff, 0xcf, 0x01, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0xcd, 0x5a, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x48, 0xde, 0x05, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0xbf, 0x6c, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x38, 0xe8, 0x0d, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0xb0, 0x80, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x2a, 0xf0, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0xa0, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x1e, 0xf7, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000144 'ń'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x97, 0x89, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x53, 0xfd, 0x51, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xa9, 0x70, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x32, 0xc3, 0xfa, 0xd4, 0x30, 0x00, 0x00,
+ 0x00, 0xff, 0xbe, 0x33, 0x07, 0x7b, 0xc6, 0x00, 0x00,
+ 0x00, 0xff, 0x21, 0x00, 0x00, 0x0a, 0xf9, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000147 'Ň'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xa7, 0x49, 0x49, 0x9a, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x16, 0xc0, 0xae, 0x0e, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00,
+ 0x00, 0xff, 0x48, 0x00, 0x00, 0x00, 0xff, 0x04, 0x00,
+ 0x00, 0xff, 0xcf, 0x01, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0xcd, 0x5a, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x48, 0xde, 0x05, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0xbf, 0x6c, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x38, 0xe8, 0x0d, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0xb0, 0x80, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x2a, 0xf0, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0xa0, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x1e, 0xf7, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000148 'ň'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xaa, 0x1e, 0xa1, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x80, 0xf3, 0x7a, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x0a, 0xc3, 0x07, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x32, 0xc3, 0xfa, 0xd4, 0x30, 0x00, 0x00,
+ 0x00, 0xff, 0xbe, 0x33, 0x07, 0x7b, 0xc6, 0x00, 0x00,
+ 0x00, 0xff, 0x21, 0x00, 0x00, 0x0a, 0xf9, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000014a 'Ŋ'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x32, 0xc9, 0xfb, 0xc6, 0x1f, 0x00, 0x00,
+ 0x00, 0xff, 0xc5, 0x34, 0x07, 0x89, 0xae, 0x00, 0x00,
+ 0x00, 0xff, 0x38, 0x00, 0x00, 0x14, 0xef, 0x00, 0x00,
+ 0x00, 0xff, 0x01, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x0a, 0xf8, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x04, 0x70, 0xc1, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0xa0, 0xf9, 0xc8, 0x27, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000014b 'ŋ'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x32, 0xc3, 0xfa, 0xd3, 0x2c, 0x00, 0x00,
+ 0x00, 0xff, 0xb9, 0x32, 0x08, 0x80, 0xbf, 0x00, 0x00,
+ 0x00, 0xff, 0x1d, 0x00, 0x00, 0x0d, 0xf7, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x01, 0xfc, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0xe6, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x05, 0x88, 0x9d, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xaa, 0xf9, 0xb5, 0x12, 0x00, 0x00,
+
+ // U+0000014d 'ō'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x79, 0xeb, 0xed, 0x65, 0x00, 0x00, 0x00,
+ 0x00, 0x6c, 0xbd, 0x18, 0x1c, 0xc3, 0x52, 0x00, 0x00,
+ 0x00, 0xd9, 0x28, 0x00, 0x00, 0x2e, 0xd4, 0x00, 0x00,
+ 0x00, 0xfc, 0x03, 0x00, 0x00, 0x06, 0xf7, 0x00, 0x00,
+ 0x00, 0xdf, 0x2e, 0x00, 0x00, 0x28, 0xc5, 0x00, 0x00,
+ 0x00, 0x67, 0xc4, 0x1e, 0x1a, 0xb8, 0x34, 0x00, 0x00,
+ 0x00, 0x00, 0x5b, 0xe1, 0xea, 0x5d, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000150 'Ő'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x23, 0xa6, 0x00, 0x22, 0xa6, 0x00, 0x00,
+ 0x00, 0x00, 0xa2, 0x2e, 0x00, 0xa2, 0x2e, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x3a, 0xcb, 0xfa, 0xd6, 0x4a, 0x00, 0x00, 0x00,
+ 0x24, 0xe5, 0x48, 0x04, 0x44, 0xed, 0x35, 0x00, 0x00,
+ 0x9a, 0x6f, 0x00, 0x00, 0x00, 0x74, 0xa7, 0x00, 0x00,
+ 0xde, 0x1d, 0x00, 0x00, 0x00, 0x24, 0xe2, 0x00, 0x00,
+ 0xfa, 0x03, 0x00, 0x00, 0x00, 0x07, 0xf8, 0x00, 0x00,
+ 0xfa, 0x06, 0x00, 0x00, 0x00, 0x0a, 0xf4, 0x00, 0x00,
+ 0xd8, 0x2b, 0x00, 0x00, 0x00, 0x22, 0xdb, 0x00, 0x00,
+ 0x93, 0x84, 0x00, 0x00, 0x00, 0x6d, 0x9b, 0x00, 0x00,
+ 0x1f, 0xe9, 0x5f, 0x08, 0x42, 0xe6, 0x2b, 0x00, 0x00,
+ 0x00, 0x34, 0xc8, 0xf6, 0xd1, 0x45, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000151 'ő'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x97, 0x89, 0x00, 0x97, 0x89, 0x00,
+ 0x00, 0x00, 0x53, 0xfd, 0x51, 0x53, 0xfd, 0x51, 0x00,
+ 0x00, 0x00, 0xa9, 0x70, 0x00, 0xa9, 0x70, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x79, 0xeb, 0xed, 0x65, 0x00, 0x00, 0x00,
+ 0x00, 0x6c, 0xbd, 0x18, 0x1c, 0xc3, 0x52, 0x00, 0x00,
+ 0x00, 0xd9, 0x28, 0x00, 0x00, 0x2e, 0xd4, 0x00, 0x00,
+ 0x00, 0xfc, 0x03, 0x00, 0x00, 0x06, 0xf7, 0x00, 0x00,
+ 0x00, 0xdf, 0x2e, 0x00, 0x00, 0x28, 0xc5, 0x00, 0x00,
+ 0x00, 0x67, 0xc4, 0x1e, 0x1a, 0xb8, 0x34, 0x00, 0x00,
+ 0x00, 0x00, 0x5b, 0xe1, 0xea, 0x5d, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000152 'Œ'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x65, 0xeb, 0xc6, 0xfd, 0xff, 0xff, 0xff, 0x00,
+ 0x4a, 0xb9, 0x0d, 0x84, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0xb6, 0x40, 0x00, 0x07, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0xe8, 0x14, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0xfc, 0x02, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00,
+ 0xfc, 0x02, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0xe7, 0x16, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0xad, 0x4e, 0x00, 0x01, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x33, 0xc3, 0x16, 0x66, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x48, 0xe3, 0xc1, 0xff, 0xff, 0xff, 0xff, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000153 'œ'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x70, 0xec, 0xec, 0x7b, 0xd8, 0xed, 0x47, 0x00,
+ 0x5d, 0xb2, 0x18, 0x16, 0xef, 0x54, 0x4d, 0xcf, 0x00,
+ 0xdc, 0x1d, 0x00, 0x00, 0xf7, 0x0b, 0x06, 0xf9, 0x00,
+ 0xfb, 0x03, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00,
+ 0xda, 0x28, 0x00, 0x00, 0xf1, 0x08, 0x00, 0x00, 0x00,
+ 0x5c, 0xb9, 0x1c, 0x13, 0xe5, 0x5d, 0x01, 0x00, 0x00,
+ 0x00, 0x67, 0xeb, 0xde, 0x7a, 0xd5, 0xf7, 0x9c, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000154 'Ŕ'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x0a, 0x82, 0xa0, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xb2, 0x96, 0x3b, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xff, 0xf3, 0xab, 0x13, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x0f, 0x97, 0xa7, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x17, 0xf0, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x0e, 0xf1, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x02, 0x73, 0xa1, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xff, 0xfe, 0xbb, 0x13, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0xae, 0x5a, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x26, 0xde, 0x09, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x96, 0x7c, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x15, 0xe5, 0x1a, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000155 'ŕ'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x97, 0x89, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x53, 0xfd, 0x51, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xa9, 0x70, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xff, 0x49, 0xda, 0xf7, 0x94, 0x00, 0x00,
+ 0x00, 0x00, 0xff, 0xca, 0x2d, 0x14, 0x87, 0x00, 0x00,
+ 0x00, 0x00, 0xff, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000158 'Ř'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xa7, 0x49, 0x49, 0x9a, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x16, 0xc0, 0xae, 0x0e, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xff, 0xf3, 0xab, 0x13, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x0f, 0x97, 0xa7, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x17, 0xf0, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x0e, 0xf1, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x02, 0x73, 0xa1, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xff, 0xfe, 0xbb, 0x13, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0xae, 0x5a, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x26, 0xde, 0x09, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x96, 0x7c, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x15, 0xe5, 0x1a, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000159 'ř'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xaa, 0x1e, 0xa1, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x80, 0xf3, 0x7a, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x0a, 0xc3, 0x07, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xff, 0x49, 0xda, 0xf7, 0x94, 0x00, 0x00,
+ 0x00, 0x00, 0xff, 0xca, 0x2d, 0x14, 0x87, 0x00, 0x00,
+ 0x00, 0x00, 0xff, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000015a 'Ś'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x0a, 0x82, 0xa0, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xb2, 0x96, 0x3b, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x11, 0x9f, 0xf0, 0xf8, 0xc4, 0x44, 0x00, 0x00,
+ 0x00, 0xb7, 0x7f, 0x0c, 0x0c, 0x55, 0xa0, 0x00, 0x00,
+ 0x00, 0xfa, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xba, 0x81, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x0b, 0x92, 0xe5, 0x8c, 0x1e, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x14, 0x7a, 0xe6, 0x51, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xe4, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0xf4, 0x00, 0x00,
+ 0x00, 0x9a, 0x54, 0x0f, 0x04, 0x84, 0xa4, 0x00, 0x00,
+ 0x00, 0x51, 0xc7, 0xf6, 0xef, 0x9e, 0x0e, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000015b 'ś'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x97, 0x89, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x53, 0xfd, 0x51, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xa9, 0x70, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x39, 0xbe, 0xf7, 0xf7, 0xc6, 0x4c, 0x00, 0x00,
+ 0x00, 0xec, 0x43, 0x03, 0x0e, 0x5d, 0x9d, 0x00, 0x00,
+ 0x00, 0x66, 0xc7, 0x79, 0x41, 0x05, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x42, 0x8c, 0xcd, 0xea, 0x55, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xf1, 0x00, 0x00,
+ 0x00, 0x95, 0x58, 0x0f, 0x0b, 0x6a, 0xcc, 0x00, 0x00,
+ 0x00, 0x53, 0xc4, 0xf4, 0xf4, 0xb2, 0x21, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000015e 'Ş'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x11, 0x9f, 0xf0, 0xf8, 0xc4, 0x44, 0x00, 0x00,
+ 0x00, 0xb7, 0x7f, 0x0c, 0x0c, 0x55, 0xa0, 0x00, 0x00,
+ 0x00, 0xfa, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xba, 0x7f, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x0b, 0x92, 0xe5, 0x8c, 0x1e, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x14, 0x7a, 0xe6, 0x51, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x2b, 0xe4, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xf4, 0x00, 0x00,
+ 0x00, 0x9a, 0x54, 0x0f, 0x13, 0x92, 0x9e, 0x00, 0x00,
+ 0x00, 0x66, 0xe4, 0xff, 0xe8, 0x90, 0x09, 0x00, 0x00,
+ 0x00, 0x00, 0x14, 0xfe, 0x66, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x25, 0xee, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x99, 0xf0, 0xeb, 0x66, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000015f 'ş'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x39, 0xbe, 0xf7, 0xf7, 0xc6, 0x4c, 0x00, 0x00,
+ 0x00, 0xed, 0x43, 0x03, 0x11, 0x68, 0x9a, 0x00, 0x00,
+ 0x00, 0x7f, 0xc7, 0x79, 0x41, 0x05, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x42, 0x8c, 0xcd, 0xea, 0x53, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xef, 0x00, 0x00,
+ 0x00, 0x96, 0x58, 0x0f, 0x0b, 0x6a, 0xd7, 0x00, 0x00,
+ 0x00, 0x4d, 0xbc, 0xf1, 0xff, 0xd4, 0x36, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x16, 0xfe, 0x52, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x25, 0xea, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x99, 0xf0, 0xcb, 0x43, 0x00, 0x00, 0x00,
+
+ // U+00000160 'Š'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xa7, 0x49, 0x49, 0x9a, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x16, 0xc0, 0xae, 0x0e, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x11, 0x9f, 0xf0, 0xf8, 0xc4, 0x44, 0x00, 0x00,
+ 0x00, 0xb7, 0x7f, 0x0c, 0x0c, 0x55, 0xa0, 0x00, 0x00,
+ 0x00, 0xfa, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xba, 0x81, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x0b, 0x92, 0xe5, 0x8c, 0x1e, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x14, 0x7a, 0xe6, 0x51, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xe4, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0xf4, 0x00, 0x00,
+ 0x00, 0x9a, 0x54, 0x0f, 0x04, 0x84, 0xa4, 0x00, 0x00,
+ 0x00, 0x51, 0xc7, 0xf6, 0xef, 0x9e, 0x0e, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000161 'š'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xaa, 0x1e, 0xa1, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x80, 0xf3, 0x7a, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x0a, 0xc3, 0x07, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x39, 0xbe, 0xf7, 0xf7, 0xc6, 0x4c, 0x00, 0x00,
+ 0x00, 0xec, 0x43, 0x03, 0x0e, 0x5d, 0x9d, 0x00, 0x00,
+ 0x00, 0x66, 0xc7, 0x79, 0x41, 0x05, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x42, 0x8c, 0xcd, 0xea, 0x55, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xf1, 0x00, 0x00,
+ 0x00, 0x95, 0x58, 0x0f, 0x0b, 0x6a, 0xcc, 0x00, 0x00,
+ 0x00, 0x53, 0xc4, 0xf4, 0xf4, 0xb2, 0x21, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000162 'Ţ'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x16, 0xff, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x25, 0xf3, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x99, 0xf0, 0xeb, 0x66, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000163 'ţ'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x04, 0x0c, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xae, 0x51, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xc0, 0x32, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xe3, 0x18, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xf6, 0x05, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x06, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xea, 0x4d, 0x1a, 0x96, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x75, 0xff, 0xdc, 0x67, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x16, 0xff, 0x6c, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x25, 0xee, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x99, 0xf0, 0xeb, 0x66, 0x00, 0x00, 0x00,
+
+ // U+00000164 'Ť'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xa7, 0x49, 0x49, 0x9a, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x16, 0xc0, 0xae, 0x0e, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000165 'ť'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd4, 0xc5, 0x00,
+ 0x00, 0x00, 0x00, 0x04, 0x0c, 0x00, 0x31, 0xce, 0x00,
+ 0x00, 0x00, 0x00, 0xae, 0x51, 0x00, 0x89, 0x26, 0x00,
+ 0x00, 0x00, 0x00, 0xc0, 0x32, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xe2, 0x18, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xf2, 0x05, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x06, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xe7, 0x50, 0x1a, 0x96, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x62, 0xef, 0xe6, 0x6e, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000016e 'Ů'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x72, 0xf7, 0x68, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xf4, 0x3b, 0xee, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x70, 0xec, 0x69, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x09, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0xfc, 0x01, 0x00, 0x00, 0x03, 0xf9, 0x00, 0x00,
+ 0x00, 0xd8, 0x1f, 0x00, 0x00, 0x25, 0xcc, 0x00, 0x00,
+ 0x00, 0x51, 0xb0, 0x19, 0x1b, 0xae, 0x3b, 0x00, 0x00,
+ 0x00, 0x00, 0x64, 0xea, 0xe3, 0x4b, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000016f 'ů'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x68, 0xf3, 0x67, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xf5, 0x3c, 0xf4, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x70, 0xee, 0x6e, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x02, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x06, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x08, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x08, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x01, 0xf9, 0x14, 0x00, 0x00, 0x21, 0xff, 0x00, 0x00,
+ 0x00, 0xb4, 0x81, 0x06, 0x26, 0xba, 0xff, 0x00, 0x00,
+ 0x00, 0x1b, 0xbb, 0xf9, 0xd6, 0x50, 0xfe, 0x04, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000170 'Ű'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x23, 0xa6, 0x00, 0x22, 0xa6, 0x00, 0x00,
+ 0x00, 0x00, 0xa2, 0x2e, 0x00, 0xa2, 0x2e, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x09, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0xfc, 0x01, 0x00, 0x00, 0x03, 0xf9, 0x00, 0x00,
+ 0x00, 0xd8, 0x1f, 0x00, 0x00, 0x25, 0xcc, 0x00, 0x00,
+ 0x00, 0x51, 0xb0, 0x19, 0x1b, 0xae, 0x3b, 0x00, 0x00,
+ 0x00, 0x00, 0x64, 0xea, 0xe3, 0x4b, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000171 'ű'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x97, 0x89, 0x00, 0x97, 0x89, 0x00,
+ 0x00, 0x00, 0x53, 0xfd, 0x51, 0x53, 0xfd, 0x51, 0x00,
+ 0x00, 0x00, 0xa9, 0x70, 0x00, 0xa9, 0x70, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x02, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x06, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x08, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x08, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x01, 0xf9, 0x14, 0x00, 0x00, 0x21, 0xff, 0x00, 0x00,
+ 0x00, 0xb4, 0x81, 0x06, 0x26, 0xba, 0xff, 0x00, 0x00,
+ 0x00, 0x1b, 0xbb, 0xf9, 0xd6, 0x50, 0xfe, 0x04, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000178 'Ÿ'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xc3, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xc3, 0x00, 0x00, 0xc2, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x01, 0xd1, 0x31, 0x00, 0x00, 0x00, 0x6a, 0x98, 0x00,
+ 0x00, 0x52, 0xba, 0x00, 0x00, 0x04, 0xdd, 0x23, 0x00,
+ 0x00, 0x01, 0xcf, 0x46, 0x00, 0x5c, 0xa8, 0x00, 0x00,
+ 0x00, 0x00, 0x4e, 0xcf, 0x02, 0xd2, 0x30, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xcb, 0xa3, 0xb8, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x4a, 0xff, 0x40, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000179 'Ź'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x0a, 0x82, 0xa0, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xb2, 0x96, 0x3b, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0x92, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x11, 0xd6, 0x10, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x96, 0x64, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x33, 0xc7, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0xc5, 0x37, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x62, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x11, 0xdb, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x96, 0x72, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00,
+ 0x00, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000017a 'ź'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x97, 0x89, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x53, 0xfd, 0x51, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xa9, 0x70, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x03, 0xa4, 0x34, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x9b, 0x4f, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x88, 0x72, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x72, 0x95, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x60, 0xb6, 0x03, 0x00, 0x00, 0x07, 0x00, 0x00,
+ 0x00, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000017b 'Ż'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xc5, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0x92, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x11, 0xd6, 0x10, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x96, 0x64, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x33, 0xc7, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0xc5, 0x37, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x62, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x11, 0xdb, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x96, 0x72, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00,
+ 0x00, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000017c 'ż'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x03, 0xa4, 0x34, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x9b, 0x4f, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x88, 0x72, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x72, 0x95, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x60, 0xb6, 0x03, 0x00, 0x00, 0x07, 0x00, 0x00,
+ 0x00, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000017d 'Ž'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xa7, 0x49, 0x49, 0x9a, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x16, 0xc0, 0xae, 0x0e, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0x92, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x11, 0xd6, 0x10, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x96, 0x64, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x33, 0xc7, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0xc5, 0x37, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x62, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x11, 0xdb, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x96, 0x72, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00,
+ 0x00, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000017e 'ž'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xaa, 0x1e, 0xa1, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x80, 0xf3, 0x7a, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x0a, 0xc3, 0x07, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x03, 0xa4, 0x34, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x9b, 0x4f, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x88, 0x72, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x72, 0x95, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x60, 0xb6, 0x03, 0x00, 0x00, 0x07, 0x00, 0x00,
+ 0x00, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000192 'ƒ'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x68, 0xe0, 0x73, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x5e, 0x9c, 0x0f, 0x85, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xb8, 0x43, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xd9, 0x28, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xea, 0x1a, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x0a, 0xf4, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x1e, 0xde, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x32, 0xca, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x46, 0xb6, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x57, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x76, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x7a, 0x15, 0xcc, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xb1, 0xed, 0x59, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00000237 'ȷ'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x0f, 0xef, 0x00, 0x00, 0x00,
+ 0x00, 0x90, 0x3d, 0x0d, 0x8c, 0xa8, 0x00, 0x00, 0x00,
+ 0x00, 0x6b, 0xe2, 0xf2, 0xa7, 0x12, 0x00, 0x00, 0x00,
+
+ // U+000002bc 'ʼ'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xd4, 0xc5, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x31, 0xce, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x89, 0x26, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000002c6 'ˆ'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x09, 0xc3, 0x08, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x7e, 0xcf, 0x78, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x97, 0x0a, 0xa3, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000002c7 'ˇ'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xaa, 0x1e, 0xa1, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x80, 0xf3, 0x7a, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x0a, 0xc3, 0x07, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000002c9 'ˉ'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000002cb 'ˋ'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x89, 0x95, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x55, 0xfd, 0x4e, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x72, 0xa8, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000002d8 '˘'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xa9, 0x48, 0x09, 0x41, 0xa9, 0x00, 0x00,
+ 0x00, 0x00, 0x39, 0xc7, 0xf6, 0xc9, 0x36, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000002d9 '˙'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000002da '˚'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x68, 0xf3, 0x67, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xf5, 0x3c, 0xf4, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x70, 0xee, 0x6e, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000002db '˛'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x42, 0xb5, 0x0d, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe1, 0x19, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xc5, 0xe3, 0x00, 0x00, 0x00,
+
+ // U+000002dc '˜'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x53, 0xf1, 0xa8, 0x1c, 0x9e, 0x00, 0x00,
+ 0x00, 0x00, 0xac, 0x1d, 0x59, 0xf1, 0x63, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000002dd '˝'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x97, 0x89, 0x00, 0x97, 0x89, 0x00,
+ 0x00, 0x00, 0x53, 0xfd, 0x51, 0x53, 0xfd, 0x51, 0x00,
+ 0x00, 0x00, 0xa9, 0x70, 0x00, 0xa9, 0x70, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00002018 '‘'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x13, 0x97, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x9e, 0x2f, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xf3, 0x77, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xb2, 0xcf, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00002019 '’'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xd2, 0xb3, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x79, 0xee, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x31, 0x90, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x94, 0x0d, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000201a '‚'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xd2, 0xb3, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x7b, 0xee, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x31, 0x90, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x94, 0x0d, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000201c '“'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x13, 0x97, 0x00, 0x13, 0x97, 0x00, 0x00, 0x00,
+ 0x00, 0x9e, 0x2f, 0x00, 0x9e, 0x2f, 0x00, 0x00, 0x00,
+ 0x00, 0xf3, 0x7a, 0x00, 0xf3, 0x7a, 0x00, 0x00, 0x00,
+ 0x00, 0xb5, 0xcf, 0x00, 0xb5, 0xcf, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000201d '”'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xd2, 0xb5, 0x00, 0xd2, 0xb5, 0x00, 0x00,
+ 0x00, 0x00, 0x78, 0xf1, 0x00, 0x76, 0xf1, 0x00, 0x00,
+ 0x00, 0x00, 0x31, 0x98, 0x00, 0x31, 0x98, 0x00, 0x00,
+ 0x00, 0x00, 0x95, 0x10, 0x00, 0x95, 0x10, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000201e '„'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xd2, 0xb5, 0x00, 0xd2, 0xb5, 0x00, 0x00,
+ 0x00, 0x00, 0x77, 0xf1, 0x00, 0x7b, 0xf1, 0x00, 0x00,
+ 0x00, 0x00, 0x31, 0x98, 0x00, 0x31, 0x98, 0x00, 0x00,
+ 0x00, 0x00, 0x95, 0x10, 0x00, 0x95, 0x10, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00002020 '†'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00002021 '‡'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00002022 '•'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x84, 0xf4, 0x83, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xf4, 0xff, 0xf2, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x86, 0xf2, 0x86, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00002026 '…'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xc3, 0x00, 0x00, 0xc3, 0x00, 0x00, 0xc2, 0x00, 0x00,
+ 0xc4, 0x00, 0x00, 0xc3, 0x00, 0x00, 0xc4, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00002039 '‹'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x35, 0xaa, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x3b, 0xd7, 0x2b, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xe5, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x33, 0xd2, 0x2e, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x29, 0xb5, 0x02, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+0000203a '›'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xaa, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x2e, 0xd7, 0x38, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x46, 0xe3, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x30, 0xd2, 0x30, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x02, 0xb4, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00002044 '⁄'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0xb2, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x72, 0x84, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x04, 0xd9, 0x15, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x5a, 0x9a, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xcc, 0x27, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x42, 0xb2, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xb6, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x2b, 0xc8, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x9e, 0x56, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x18, 0xd7, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x86, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xb2, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00002074 '⁴'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x24, 0xf0, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x0a, 0xbe, 0xfe, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xa0, 0x41, 0xfc, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x6c, 0x74, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xf2, 0xfc, 0xfc, 0xff, 0xff, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+000020ac '€'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x38, 0xc1, 0xf8, 0xd9, 0x5b, 0x00, 0x00,
+ 0x00, 0x2b, 0xe1, 0x53, 0x09, 0x1d, 0x8c, 0x00, 0x00,
+ 0x00, 0xa7, 0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xe2, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x00, 0x00, 0x00,
+ 0x00, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xe0, 0xff, 0xff, 0xff, 0xd6, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xd2, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x8c, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x18, 0xe3, 0x6a, 0x0e, 0x2b, 0x9d, 0x00, 0x00,
+ 0x00, 0x00, 0x29, 0xbb, 0xf7, 0xde, 0x61, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00002122 '™'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xff, 0x00, 0xfa, 0x1d, 0xf8, 0x00,
+ 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xa2, 0xff, 0x00,
+ 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x83, 0xff, 0x00,
+ 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00,
+ 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00002191 '↑'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x29, 0xe0, 0x3f, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x27, 0xe7, 0xff, 0xf1, 0x31, 0x00, 0x00, 0x00,
+ 0x25, 0xe4, 0x7e, 0xff, 0x86, 0xe8, 0x25, 0x00, 0x00,
+ 0xaa, 0x53, 0x00, 0xff, 0x00, 0x63, 0xa9, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00002193 '↓'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xaa, 0x56, 0x00, 0xff, 0x00, 0x47, 0xa9, 0x00, 0x00,
+ 0x26, 0xe6, 0x5c, 0xff, 0x5b, 0xdf, 0x23, 0x00, 0x00,
+ 0x00, 0x33, 0xf0, 0xff, 0xe4, 0x26, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x3f, 0xe1, 0x29, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00002212 '−'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ // U+00002423 '␣'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ },
+ },
+ Ranges: []basicfont.Range{
+ {'\U00000020', '\U0000007f', 0},
+ {'\U0000008e', '\U0000008f', 95},
+ {'\U0000009e', '\U0000009f', 96},
+ {'\U000000a0', '\U00000100', 97},
+ {'\U00000102', '\U00000108', 193},
+ {'\U0000010c', '\U00000112', 199},
+ {'\U00000118', '\U0000011c', 205},
+ {'\U0000011e', '\U00000120', 209},
+ {'\U00000130', '\U00000132', 211},
+ {'\U00000138', '\U0000013b', 213},
+ {'\U0000013d', '\U0000013f', 216},
+ {'\U00000141', '\U00000145', 218},
+ {'\U00000147', '\U00000149', 222},
+ {'\U0000014a', '\U0000014c', 224},
+ {'\U0000014d', '\U0000014e', 226},
+ {'\U00000150', '\U00000156', 227},
+ {'\U00000158', '\U0000015c', 233},
+ {'\U0000015e', '\U00000166', 237},
+ {'\U0000016e', '\U00000172', 245},
+ {'\U00000178', '\U0000017f', 249},
+ {'\U00000192', '\U00000193', 256},
+ {'\U00000237', '\U00000238', 257},
+ {'\U000002bc', '\U000002bd', 258},
+ {'\U000002c6', '\U000002c8', 259},
+ {'\U000002c9', '\U000002ca', 261},
+ {'\U000002cb', '\U000002cc', 262},
+ {'\U000002d8', '\U000002de', 263},
+ {'\U00002018', '\U0000201b', 269},
+ {'\U0000201c', '\U0000201f', 272},
+ {'\U00002020', '\U00002023', 275},
+ {'\U00002026', '\U00002027', 278},
+ {'\U00002039', '\U0000203b', 279},
+ {'\U00002044', '\U00002045', 281},
+ {'\U00002074', '\U00002075', 282},
+ {'\U000020ac', '\U000020ad', 283},
+ {'\U00002122', '\U00002123', 284},
+ {'\U00002191', '\U00002192', 285},
+ {'\U00002193', '\U00002194', 286},
+ {'\U00002212', '\U00002213', 287},
+ {'\U00002423', '\U00002424', 288},
+ },
+}
diff --git a/vendor/golang.org/x/image/font/plan9font/plan9font.go b/vendor/golang.org/x/image/font/plan9font/plan9font.go
index af57c55e1..315e793aa 100644
--- a/vendor/golang.org/x/image/font/plan9font/plan9font.go
+++ b/vendor/golang.org/x/image/font/plan9font/plan9font.go
@@ -174,6 +174,31 @@ func (f *face) GlyphAdvance(r rune) (advance fixed.Int26_6, ok bool) {
return 0, false
}
+// For subfont files, if reading the given file name fails, we try appending
+// ".n" where n is the log2 of the grayscale depth in bits (so at most 3) and
+// then work down to 0. This was done in Plan 9 when antialiased fonts were
+// introduced so that the 1-bit displays could keep using the 1-bit forms but
+// higher depth displays could use the antialiased forms.
+var subfontSuffixes = [...]string{
+ "",
+ ".3",
+ ".2",
+ ".1",
+ ".0",
+}
+
+func (f *face) readSubfontFile(name string) ([]byte, error) {
+ var firstErr error
+ for _, suffix := range subfontSuffixes {
+ if b, err := f.readFile(name + suffix); err == nil {
+ return b, nil
+ } else if firstErr == nil {
+ firstErr = err
+ }
+ }
+ return nil, firstErr
+}
+
func (f *face) subface(r rune) (*subface, rune) {
// Fall back on U+FFFD if we can't find r.
for _, rr := range [2]rune{r, '\ufffd'} {
@@ -188,7 +213,7 @@ func (f *face) subface(r rune) (*subface, rune) {
continue
}
if x.subface == nil {
- data, err := f.readFile(x.relFilename)
+ data, err := f.readSubfontFile(x.relFilename)
if err != nil {
log.Printf("plan9font: couldn't read subfont %q: %v", x.relFilename, err)
x.bad = true
diff --git a/vendor/golang.org/x/image/math/fixed/fixed.go b/vendor/golang.org/x/image/math/fixed/fixed.go
index df3540a3a..2c76ed460 100644
--- a/vendor/golang.org/x/image/math/fixed/fixed.go
+++ b/vendor/golang.org/x/image/math/fixed/fixed.go
@@ -56,6 +56,11 @@ func (x Int26_6) Round() int { return int((x + 0x20) >> 6) }
// Its return type is int, not Int26_6.
func (x Int26_6) Ceil() int { return int((x + 0x3f) >> 6) }
+// Mul returns x*y in 26.6 fixed-point arithmetic.
+func (x Int26_6) Mul(y Int26_6) Int26_6 {
+ return Int26_6((int64(x)*int64(y) + 1<<5) >> 6)
+}
+
// Int52_12 is a signed 52.12 fixed-point number.
//
// The integer part ranges from -2251799813685248 to 2251799813685247,
@@ -95,6 +100,39 @@ func (x Int52_12) Round() int { return int((x + 0x800) >> 12) }
// Its return type is int, not Int52_12.
func (x Int52_12) Ceil() int { return int((x + 0xfff) >> 12) }
+// Mul returns x*y in 52.12 fixed-point arithmetic.
+func (x Int52_12) Mul(y Int52_12) Int52_12 {
+ const M, N = 52, 12
+ lo, hi := muli64(int64(x), int64(y))
+ ret := Int52_12(hi<<M | lo>>N)
+ ret += Int52_12((lo >> (N - 1)) & 1) // Round to nearest, instead of rounding down.
+ return ret
+}
+
+// muli64 multiplies two int64 values, returning the 128-bit signed integer
+// result as two uint64 values.
+//
+// This implementation is similar to $GOROOT/src/runtime/softfloat64.go's mullu
+// function, which is in turn adapted from Hacker's Delight.
+func muli64(u, v int64) (lo, hi uint64) {
+ const (
+ s = 32
+ mask = 1<<s - 1
+ )
+
+ u1 := uint64(u >> s)
+ u0 := uint64(u & mask)
+ v1 := uint64(v >> s)
+ v0 := uint64(v & mask)
+
+ w0 := u0 * v0
+ t := u1*v0 + w0>>s
+ w1 := t & mask
+ w2 := uint64(int64(t) >> s)
+ w1 += u0 * v1
+ return uint64(u) * uint64(v), u1*v1 + w2 + uint64(int64(w1)>>s)
+}
+
// P returns the integer values x and y as a Point26_6.
//
// For example, passing the integer values (2, -3) yields Point26_6{128, -192}.
diff --git a/vendor/golang.org/x/image/math/fixed/fixed_test.go b/vendor/golang.org/x/image/math/fixed/fixed_test.go
index 065ab00b0..c81fb7205 100644
--- a/vendor/golang.org/x/image/math/fixed/fixed_test.go
+++ b/vendor/golang.org/x/image/math/fixed/fixed_test.go
@@ -5,6 +5,8 @@
package fixed
import (
+ "math"
+ "math/rand"
"testing"
)
@@ -74,6 +76,7 @@ var testCases = []struct {
}}
func TestInt26_6(t *testing.T) {
+ const one = Int26_6(1 << 6)
for _, tc := range testCases {
x := Int26_6(tc.x * (1 << 6))
if got, want := x.String(), tc.s26_6; got != want {
@@ -88,10 +91,17 @@ func TestInt26_6(t *testing.T) {
if got, want := x.Ceil(), tc.ceil; got != want {
t.Errorf("tc.x=%v: Ceil: got %v, want %v", tc.x, got, want)
}
+ if got, want := x.Mul(one), x; got != want {
+ t.Errorf("tc.x=%v: Mul by one: got %v, want %v", tc.x, got, want)
+ }
+ if got, want := x.mul(one), x; got != want {
+ t.Errorf("tc.x=%v: mul by one: got %v, want %v", tc.x, got, want)
+ }
}
}
func TestInt52_12(t *testing.T) {
+ const one = Int52_12(1 << 12)
for _, tc := range testCases {
x := Int52_12(tc.x * (1 << 12))
if got, want := x.String(), tc.s52_12; got != want {
@@ -106,5 +116,324 @@ func TestInt52_12(t *testing.T) {
if got, want := x.Ceil(), tc.ceil; got != want {
t.Errorf("tc.x=%v: Ceil: got %v, want %v", tc.x, got, want)
}
+ if got, want := x.Mul(one), x; got != want {
+ t.Errorf("tc.x=%v: Mul by one: got %v, want %v", tc.x, got, want)
+ }
+ }
+}
+
+var mulTestCases = []struct {
+ x float64
+ y float64
+ z26_6 float64 // Equals truncate26_6(x)*truncate26_6(y).
+ z52_12 float64 // Equals truncate52_12(x)*truncate52_12(y).
+ s26_6 string
+ s52_12 string
+}{{
+ x: 0,
+ y: 1.5,
+ z26_6: 0,
+ z52_12: 0,
+ s26_6: "0:00",
+ s52_12: "0:0000",
+}, {
+ x: +1.25,
+ y: +4,
+ z26_6: +5,
+ z52_12: +5,
+ s26_6: "5:00",
+ s52_12: "5:0000",
+}, {
+ x: +1.25,
+ y: -4,
+ z26_6: -5,
+ z52_12: -5,
+ s26_6: "-5:00",
+ s52_12: "-5:0000",
+}, {
+ x: -1.25,
+ y: +4,
+ z26_6: -5,
+ z52_12: -5,
+ s26_6: "-5:00",
+ s52_12: "-5:0000",
+}, {
+ x: -1.25,
+ y: -4,
+ z26_6: +5,
+ z52_12: +5,
+ s26_6: "5:00",
+ s52_12: "5:0000",
+}, {
+ x: 1.25,
+ y: 1.5,
+ z26_6: 1.875,
+ z52_12: 1.875,
+ s26_6: "1:56",
+ s52_12: "1:3584",
+}, {
+ x: 1234.5,
+ y: -8888.875,
+ z26_6: -10973316.1875,
+ z52_12: -10973316.1875,
+ s26_6: "-10973316:12",
+ s52_12: "-10973316:0768",
+}, {
+ x: 1.515625, // 1 + 33/64 = 97/64
+ y: 1.531250, // 1 + 34/64 = 98/64
+ z26_6: 2.32080078125, // 2 + 1314/4096 = 9506/4096
+ z52_12: 2.32080078125, // 2 + 1314/4096 = 9506/4096
+ s26_6: "2:21", // 2.32812500000, which is closer than 2:20 (in decimal, 2.3125)
+ s52_12: "2:1314", // 2.32080078125
+}, {
+ x: 0.500244140625, // 2049/4096, approximately 32/64
+ y: 0.500732421875, // 2051/4096, approximately 32/64
+ z26_6: 0.25, // 4194304/16777216, or 1024/4096
+ z52_12: 0.2504884600639343, // 4202499/16777216
+ s26_6: "0:16", // 0.25000000000
+ s52_12: "0:1026", // 0.25048828125, which is closer than 0:1027 (in decimal, 0.250732421875)
+}, {
+ x: 0.015625, // 1/64
+ y: 0.000244140625, // 1/4096, approximately 0/64
+ z26_6: 0.0, // 0
+ z52_12: 0.000003814697265625, // 1/262144
+ s26_6: "0:00", // 0
+ s52_12: "0:0000", // 0, which is closer than 0:0001 (in decimal, 0.000244140625)
+}, {
+ // Round the Int52_12 calculation down.
+ x: 1.44140625, // 1 + 1808/4096 = 5904/4096, approximately 92/64
+ y: 1.44140625, // 1 + 1808/4096 = 5904/4096, approximately 92/64
+ z26_6: 2.06640625, // 2 + 272/4096 = 8464/4096
+ z52_12: 2.0776519775390625, // 2 + 318/4096 + 256/16777216 = 34857216/16777216
+ s26_6: "2:04", // 2.06250000000, which is closer than 2:05 (in decimal, 2.078125000000)
+ s52_12: "2:0318", // 2.07763671875, which is closer than 2:0319 (in decimal, 2.077880859375)
+}, {
+ // Round the Int52_12 calculation up.
+ x: 1.44140625, // 1 + 1808/4096 = 5904/4096, approximately 92/64
+ y: 1.441650390625, // 1 + 1809/4096 = 5905/4096, approximately 92/64
+ z26_6: 2.06640625, // 2 + 272/4096 = 8464/4096
+ z52_12: 2.0780038833618164, // 2 + 319/4096 + 2064/16777216 = 34863120/16777216
+ s26_6: "2:04", // 2.06250000000, which is closer than 2:05 (in decimal, 2.078125000000)
+ s52_12: "2:0320", // 2.07812500000, which is closer than 2:0319 (in decimal, 2.077880859375)
+}}
+
+func TestInt26_6Mul(t *testing.T) {
+ for _, tc := range mulTestCases {
+ x := Int26_6(tc.x * (1 << 6))
+ y := Int26_6(tc.y * (1 << 6))
+ if z := float64(x) * float64(y) / (1 << 12); z != tc.z26_6 {
+ t.Errorf("tc.x=%v, tc.y=%v: z: got %v, want %v", tc.x, tc.y, z, tc.z26_6)
+ continue
+ }
+ if got, want := x.Mul(y).String(), tc.s26_6; got != want {
+ t.Errorf("tc.x=%v: Mul: got %q, want %q", tc.x, got, want)
+ }
+ }
+}
+
+func TestInt52_12Mul(t *testing.T) {
+ for _, tc := range mulTestCases {
+ x := Int52_12(tc.x * (1 << 12))
+ y := Int52_12(tc.y * (1 << 12))
+ if z := float64(x) * float64(y) / (1 << 24); z != tc.z52_12 {
+ t.Errorf("tc.x=%v, tc.y=%v: z: got %v, want %v", tc.x, tc.y, z, tc.z52_12)
+ continue
+ }
+ if got, want := x.Mul(y).String(), tc.s52_12; got != want {
+ t.Errorf("tc.x=%v: Mul: got %q, want %q", tc.x, got, want)
+ }
+ }
+}
+
+func TestInt26_6MulByOneMinusIota(t *testing.T) {
+ const (
+ totalBits = 32
+ fracBits = 6
+
+ oneMinusIota = Int26_6(1<<fracBits) - 1
+ oneMinusIotaF = float64(oneMinusIota) / (1 << fracBits)
+ )
+
+ for _, neg := range []bool{false, true} {
+ for i := uint(0); i < totalBits; i++ {
+ x := Int26_6(1 << i)
+ if neg {
+ x = -x
+ } else if i == totalBits-1 {
+ // A signed int32 can't represent 1<<31.
+ continue
+ }
+
+ // want equals x * oneMinusIota, rounded to nearest.
+ want := Int26_6(0)
+ if -1<<fracBits < x && x < 1<<fracBits {
+ // (x * oneMinusIota) isn't exactly representable as an
+ // Int26_6. Calculate the rounded value using float64 math.
+ xF := float64(x) / (1 << fracBits)
+ wantF := xF * oneMinusIotaF * (1 << fracBits)
+ want = Int26_6(math.Floor(wantF + 0.5))
+ } else {
+ // (x * oneMinusIota) is exactly representable.
+ want = oneMinusIota << (i - fracBits)
+ if neg {
+ want = -want
+ }
+ }
+
+ if got := x.Mul(oneMinusIota); got != want {
+ t.Errorf("neg=%t, i=%d, x=%v, Mul: got %v, want %v", neg, i, x, got, want)
+ }
+ if got := x.mul(oneMinusIota); got != want {
+ t.Errorf("neg=%t, i=%d, x=%v, mul: got %v, want %v", neg, i, x, got, want)
+ }
+ }
+ }
+}
+
+func TestInt52_12MulByOneMinusIota(t *testing.T) {
+ const (
+ totalBits = 64
+ fracBits = 12
+
+ oneMinusIota = Int52_12(1<<fracBits) - 1
+ oneMinusIotaF = float64(oneMinusIota) / (1 << fracBits)
+ )
+
+ for _, neg := range []bool{false, true} {
+ for i := uint(0); i < totalBits; i++ {
+ x := Int52_12(1 << i)
+ if neg {
+ x = -x
+ } else if i == totalBits-1 {
+ // A signed int64 can't represent 1<<63.
+ continue
+ }
+
+ // want equals x * oneMinusIota, rounded to nearest.
+ want := Int52_12(0)
+ if -1<<fracBits < x && x < 1<<fracBits {
+ // (x * oneMinusIota) isn't exactly representable as an
+ // Int52_12. Calculate the rounded value using float64 math.
+ xF := float64(x) / (1 << fracBits)
+ wantF := xF * oneMinusIotaF * (1 << fracBits)
+ want = Int52_12(math.Floor(wantF + 0.5))
+ } else {
+ // (x * oneMinusIota) is exactly representable.
+ want = oneMinusIota << (i - fracBits)
+ if neg {
+ want = -want
+ }
+ }
+
+ if got := x.Mul(oneMinusIota); got != want {
+ t.Errorf("neg=%t, i=%d, x=%v, Mul: got %v, want %v", neg, i, x, got, want)
+ }
+ }
+ }
+}
+
+func TestInt26_6MulVsMul(t *testing.T) {
+ rng := rand.New(rand.NewSource(1))
+ for i := 0; i < 10000; i++ {
+ u := Int26_6(rng.Uint32())
+ v := Int26_6(rng.Uint32())
+ Mul := u.Mul(v)
+ mul := u.mul(v)
+ if Mul != mul {
+ t.Errorf("u=%#08x, v=%#08x: Mul=%#08x and mul=%#08x differ",
+ uint32(u), uint32(v), uint32(Mul), uint32(mul))
+ }
}
}
+
+func TestMuli32(t *testing.T) {
+ rng := rand.New(rand.NewSource(2))
+ for i := 0; i < 10000; i++ {
+ u := int32(rng.Uint32())
+ v := int32(rng.Uint32())
+ lo, hi := muli32(u, v)
+ got := uint64(lo) | uint64(hi)<<32
+ want := uint64(int64(u) * int64(v))
+ if got != want {
+ t.Errorf("u=%#08x, v=%#08x: got %#016x, want %#016x", uint32(u), uint32(v), got, want)
+ }
+ }
+}
+
+func TestMulu32(t *testing.T) {
+ rng := rand.New(rand.NewSource(3))
+ for i := 0; i < 10000; i++ {
+ u := rng.Uint32()
+ v := rng.Uint32()
+ lo, hi := mulu32(u, v)
+ got := uint64(lo) | uint64(hi)<<32
+ want := uint64(u) * uint64(v)
+ if got != want {
+ t.Errorf("u=%#08x, v=%#08x: got %#016x, want %#016x", u, v, got, want)
+ }
+ }
+}
+
+// mul (with a lower case 'm') is an alternative implementation of Int26_6.Mul
+// (with an upper case 'M'). It has the same structure as the Int52_12.Mul
+// implementation, but Int26_6.mul is easier to test since Go has built-in
+// 64-bit integers.
+func (x Int26_6) mul(y Int26_6) Int26_6 {
+ const M, N = 26, 6
+ lo, hi := muli32(int32(x), int32(y))
+ ret := Int26_6(hi<<M | lo>>N)
+ ret += Int26_6((lo >> (N - 1)) & 1) // Round to nearest, instead of rounding down.
+ return ret
+}
+
+// muli32 multiplies two int32 values, returning the 64-bit signed integer
+// result as two uint32 values.
+//
+// muli32 isn't used directly by this package, but it has the same structure as
+// muli64, and muli32 is easier to test since Go has built-in 64-bit integers.
+func muli32(u, v int32) (lo, hi uint32) {
+ const (
+ s = 16
+ mask = 1<<s - 1
+ )
+
+ u1 := uint32(u >> s)
+ u0 := uint32(u & mask)
+ v1 := uint32(v >> s)
+ v0 := uint32(v & mask)
+
+ w0 := u0 * v0
+ t := u1*v0 + w0>>s
+ w1 := t & mask
+ w2 := uint32(int32(t) >> s)
+ w1 += u0 * v1
+ return uint32(u) * uint32(v), u1*v1 + w2 + uint32(int32(w1)>>s)
+}
+
+// mulu32 is like muli32, except that it multiplies unsigned instead of signed
+// values.
+//
+// This implementation comes from $GOROOT/src/runtime/softfloat64.go's mullu
+// function, which is in turn adapted from Hacker's Delight.
+//
+// mulu32 (and its corresponding test, TestMulu32) isn't used directly by this
+// package. It is provided in this test file as a reference point to compare
+// the muli32 (and TestMuli32) implementations against.
+func mulu32(u, v uint32) (lo, hi uint32) {
+ const (
+ s = 16
+ mask = 1<<s - 1
+ )
+
+ u0 := u & mask
+ u1 := u >> s
+ v0 := v & mask
+ v1 := v >> s
+
+ w0 := u0 * v0
+ t := u1*v0 + w0>>s
+ w1 := t & mask
+ w2 := t >> s
+ w1 += u0 * v1
+ return u * v, u1*v1 + w2 + w1>>s
+}
diff --git a/vendor/golang.org/x/image/riff/riff.go b/vendor/golang.org/x/image/riff/riff.go
index 9b9f71d81..38dc0e568 100644
--- a/vendor/golang.org/x/image/riff/riff.go
+++ b/vendor/golang.org/x/image/riff/riff.go
@@ -23,6 +23,7 @@ import (
var (
errMissingPaddingByte = errors.New("riff: missing padding byte")
errMissingRIFFChunkHeader = errors.New("riff: missing RIFF chunk header")
+ errListSubchunkTooLong = errors.New("riff: list subchunk too long")
errShortChunkData = errors.New("riff: short chunk data")
errShortChunkHeader = errors.New("riff: short chunk header")
errStaleReader = errors.New("riff: stale reader")
@@ -100,13 +101,23 @@ func (z *Reader) Next() (chunkID FourCC, chunkLen uint32, chunkData io.Reader, e
// Drain the rest of the previous chunk.
if z.chunkLen != 0 {
- _, z.err = io.Copy(ioutil.Discard, z.chunkReader)
+ want := z.chunkLen
+ var got int64
+ got, z.err = io.Copy(ioutil.Discard, z.chunkReader)
+ if z.err == nil && uint32(got) != want {
+ z.err = errShortChunkData
+ }
if z.err != nil {
return FourCC{}, 0, nil, z.err
}
}
z.chunkReader = nil
if z.padded {
+ if z.totalLen == 0 {
+ z.err = errListSubchunkTooLong
+ return FourCC{}, 0, nil, z.err
+ }
+ z.totalLen--
_, z.err = io.ReadFull(z.r, z.buf[:1])
if z.err != nil {
if z.err == io.EOF {
@@ -114,7 +125,6 @@ func (z *Reader) Next() (chunkID FourCC, chunkLen uint32, chunkData io.Reader, e
}
return FourCC{}, 0, nil, z.err
}
- z.totalLen--
}
// We are done if we have no more data.
@@ -129,7 +139,7 @@ func (z *Reader) Next() (chunkID FourCC, chunkLen uint32, chunkData io.Reader, e
return FourCC{}, 0, nil, z.err
}
z.totalLen -= chunkHeaderSize
- if _, err = io.ReadFull(z.r, z.buf[:chunkHeaderSize]); err != nil {
+ if _, z.err = io.ReadFull(z.r, z.buf[:chunkHeaderSize]); z.err != nil {
if z.err == io.EOF || z.err == io.ErrUnexpectedEOF {
z.err = errShortChunkHeader
}
@@ -137,6 +147,10 @@ func (z *Reader) Next() (chunkID FourCC, chunkLen uint32, chunkData io.Reader, e
}
chunkID = FourCC{z.buf[0], z.buf[1], z.buf[2], z.buf[3]}
z.chunkLen = u32(z.buf[4:])
+ if z.chunkLen > z.totalLen {
+ z.err = errListSubchunkTooLong
+ return FourCC{}, 0, nil, z.err
+ }
z.padded = z.chunkLen&1 == 1
z.chunkReader = &chunkReader{z}
return chunkID, z.chunkLen, z.chunkReader, nil
diff --git a/vendor/golang.org/x/image/riff/riff_test.go b/vendor/golang.org/x/image/riff/riff_test.go
new file mode 100644
index 000000000..567e938d2
--- /dev/null
+++ b/vendor/golang.org/x/image/riff/riff_test.go
@@ -0,0 +1,69 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package riff
+
+import (
+ "bytes"
+ "testing"
+)
+
+func encodeU32(u uint32) []byte {
+ return []byte{
+ byte(u >> 0),
+ byte(u >> 8),
+ byte(u >> 16),
+ byte(u >> 24),
+ }
+}
+
+func TestShortChunks(t *testing.T) {
+ // s is a RIFF(ABCD) with allegedly 256 bytes of data (excluding the
+ // leading 8-byte "RIFF\x00\x01\x00\x00"). The first chunk of that ABCD
+ // list is an abcd chunk of length m followed by n zeroes.
+ for _, m := range []uint32{0, 8, 15, 200, 300} {
+ for _, n := range []int{0, 1, 2, 7} {
+ s := []byte("RIFF\x00\x01\x00\x00ABCDabcd")
+ s = append(s, encodeU32(m)...)
+ s = append(s, make([]byte, n)...)
+ _, r, err := NewReader(bytes.NewReader(s))
+ if err != nil {
+ t.Errorf("m=%d, n=%d: NewReader: %v", m, n, err)
+ continue
+ }
+
+ _, _, _, err0 := r.Next()
+ // The total "ABCD" list length is 256 bytes, of which the first 12
+ // bytes are "ABCDabcd" plus the 4-byte encoding of m. If the
+ // "abcd" subchunk length (m) plus those 12 bytes is greater than
+ // the total list length, we have an invalid RIFF, and we expect an
+ // errListSubchunkTooLong error.
+ if m+12 > 256 {
+ if err0 != errListSubchunkTooLong {
+ t.Errorf("m=%d, n=%d: Next #0: got %v, want %v", m, n, err0, errListSubchunkTooLong)
+ }
+ continue
+ }
+ // Otherwise, we expect a nil error.
+ if err0 != nil {
+ t.Errorf("m=%d, n=%d: Next #0: %v", m, n, err0)
+ continue
+ }
+
+ _, _, _, err1 := r.Next()
+ // If m > 0, then m > n, so that "abcd" subchunk doesn't have m
+ // bytes of data. If m == 0, then that "abcd" subchunk is OK in
+ // that it has 0 extra bytes of data, but the next subchunk (8 byte
+ // header plus body) is missing, as we only have n < 8 more bytes.
+ want := errShortChunkData
+ if m == 0 {
+ want = errShortChunkHeader
+ }
+ if err1 != want {
+ t.Errorf("m=%d, n=%d: Next #1: got %v, want %v", m, n, err1, want)
+ continue
+ }
+ }
+ }
+}
diff --git a/vendor/golang.org/x/image/vector/raster_floating.go b/vendor/golang.org/x/image/vector/raster_floating.go
new file mode 100644
index 000000000..d03936a1e
--- /dev/null
+++ b/vendor/golang.org/x/image/vector/raster_floating.go
@@ -0,0 +1,153 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package vector
+
+// This file contains a floating point math implementation of the vector
+// graphics rasterizer.
+
+import (
+ "math"
+
+ "golang.org/x/image/math/f32"
+)
+
+func floatingMax(x, y float32) float32 {
+ if x > y {
+ return x
+ }
+ return y
+}
+
+func floatingMin(x, y float32) float32 {
+ if x < y {
+ return x
+ }
+ return y
+}
+
+func floatingFloor(x float32) int32 { return int32(math.Floor(float64(x))) }
+func floatingCeil(x float32) int32 { return int32(math.Ceil(float64(x))) }
+
+func (z *Rasterizer) floatingLineTo(b f32.Vec2) {
+ a := z.pen
+ z.pen = b
+ dir := float32(1)
+ if a[1] > b[1] {
+ dir, a, b = -1, b, a
+ }
+ // Horizontal line segments yield no change in coverage. Almost horizontal
+ // segments would yield some change, in ideal math, but the computation
+ // further below, involving 1 / (b[1] - a[1]), is unstable in floating
+ // point math, so we treat the segment as if it was perfectly horizontal.
+ if b[1]-a[1] <= 0.000001 {
+ return
+ }
+ dxdy := (b[0] - a[0]) / (b[1] - a[1])
+
+ x := a[0]
+ y := floatingFloor(a[1])
+ yMax := floatingCeil(b[1])
+ if yMax > int32(z.size.Y) {
+ yMax = int32(z.size.Y)
+ }
+ width := int32(z.size.X)
+
+ for ; y < yMax; y++ {
+ dy := floatingMin(float32(y+1), b[1]) - floatingMax(float32(y), a[1])
+ xNext := x + dy*dxdy
+ if y < 0 {
+ x = xNext
+ continue
+ }
+ buf := z.area[y*width:]
+ d := dy * dir
+ x0, x1 := x, xNext
+ if x > xNext {
+ x0, x1 = x1, x0
+ }
+ x0i := floatingFloor(x0)
+ x0Floor := float32(x0i)
+ x1i := floatingCeil(x1)
+ x1Ceil := float32(x1i)
+
+ if x1i <= x0i+1 {
+ xmf := 0.5*(x+xNext) - x0Floor
+ if i := clamp(x0i+0, width); i < uint(len(buf)) {
+ buf[i] += d - d*xmf
+ }
+ if i := clamp(x0i+1, width); i < uint(len(buf)) {
+ buf[i] += d * xmf
+ }
+ } else {
+ s := 1 / (x1 - x0)
+ x0f := x0 - x0Floor
+ oneMinusX0f := 1 - x0f
+ a0 := 0.5 * s * oneMinusX0f * oneMinusX0f
+ x1f := x1 - x1Ceil + 1
+ am := 0.5 * s * x1f * x1f
+
+ if i := clamp(x0i, width); i < uint(len(buf)) {
+ buf[i] += d * a0
+ }
+
+ if x1i == x0i+2 {
+ if i := clamp(x0i+1, width); i < uint(len(buf)) {
+ buf[i] += d * (1 - a0 - am)
+ }
+ } else {
+ a1 := s * (1.5 - x0f)
+ if i := clamp(x0i+1, width); i < uint(len(buf)) {
+ buf[i] += d * (a1 - a0)
+ }
+ dTimesS := d * s
+ for xi := x0i + 2; xi < x1i-1; xi++ {
+ if i := clamp(xi, width); i < uint(len(buf)) {
+ buf[i] += dTimesS
+ }
+ }
+ a2 := a1 + s*float32(x1i-x0i-3)
+ if i := clamp(x1i-1, width); i < uint(len(buf)) {
+ buf[i] += d * (1 - a2 - am)
+ }
+ }
+
+ if i := clamp(x1i, width); i < uint(len(buf)) {
+ buf[i] += d * am
+ }
+ }
+
+ x = xNext
+ }
+}
+
+func floatingAccumulate(dst []uint8, src []float32) {
+ // almost256 scales a floating point value in the range [0, 1] to a uint8
+ // value in the range [0x00, 0xff].
+ //
+ // 255 is too small. Floating point math accumulates rounding errors, so a
+ // fully covered src value that would in ideal math be float32(1) might be
+ // float32(1-ε), and uint8(255 * (1-ε)) would be 0xfe instead of 0xff. The
+ // uint8 conversion rounds to zero, not to nearest.
+ //
+ // 256 is too big. If we multiplied by 256, below, then a fully covered src
+ // value of float32(1) would translate to uint8(256 * 1), which can be 0x00
+ // instead of the maximal value 0xff.
+ //
+ // math.Float32bits(almost256) is 0x437fffff.
+ const almost256 = 255.99998
+
+ acc := float32(0)
+ for i, v := range src {
+ acc += v
+ a := acc
+ if a < 0 {
+ a = -a
+ }
+ if a > 1 {
+ a = 1
+ }
+ dst[i] = uint8(almost256 * a)
+ }
+}
diff --git a/vendor/golang.org/x/image/vector/vector.go b/vendor/golang.org/x/image/vector/vector.go
new file mode 100644
index 000000000..218e76489
--- /dev/null
+++ b/vendor/golang.org/x/image/vector/vector.go
@@ -0,0 +1,228 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package vector provides a rasterizer for 2-D vector graphics.
+package vector // import "golang.org/x/image/vector"
+
+// The rasterizer's design follows
+// https://medium.com/@raphlinus/inside-the-fastest-font-renderer-in-the-world-75ae5270c445
+//
+// Proof of concept code is in
+// https://github.com/google/font-go
+//
+// See also:
+// http://nothings.org/gamedev/rasterize/
+// http://projects.tuxee.net/cl-vectors/section-the-cl-aa-algorithm
+// https://people.gnome.org/~mathieu/libart/internals.html#INTERNALS-SCANLINE
+
+import (
+ "image"
+ "image/draw"
+ "math"
+
+ "golang.org/x/image/math/f32"
+)
+
+func midPoint(p, q f32.Vec2) f32.Vec2 {
+ return f32.Vec2{
+ (p[0] + q[0]) * 0.5,
+ (p[1] + q[1]) * 0.5,
+ }
+}
+
+func lerp(t float32, p, q f32.Vec2) f32.Vec2 {
+ return f32.Vec2{
+ p[0] + t*(q[0]-p[0]),
+ p[1] + t*(q[1]-p[1]),
+ }
+}
+
+func clamp(i, width int32) uint {
+ if i < 0 {
+ return 0
+ }
+ if i < width {
+ return uint(i)
+ }
+ return uint(width)
+}
+
+// NewRasterizer returns a new Rasterizer whose rendered mask image is bounded
+// by the given width and height.
+func NewRasterizer(w, h int) *Rasterizer {
+ return &Rasterizer{
+ area: make([]float32, w*h),
+ size: image.Point{w, h},
+ }
+}
+
+// Raster is a 2-D vector graphics rasterizer.
+type Rasterizer struct {
+ area []float32
+ size image.Point
+ first f32.Vec2
+ pen f32.Vec2
+
+ // DrawOp is the operator used for the Draw method.
+ //
+ // The zero value is draw.Over.
+ DrawOp draw.Op
+
+ // TODO: an exported field equivalent to the mask point in the
+ // draw.DrawMask function in the stdlib image/draw package?
+}
+
+// Reset resets a Rasterizer as if it was just returned by NewRasterizer.
+//
+// This includes setting z.DrawOp to draw.Over.
+func (z *Rasterizer) Reset(w, h int) {
+ if n := w * h; n > cap(z.area) {
+ z.area = make([]float32, n)
+ } else {
+ z.area = z.area[:n]
+ for i := range z.area {
+ z.area[i] = 0
+ }
+ }
+ z.size = image.Point{w, h}
+ z.first = f32.Vec2{}
+ z.pen = f32.Vec2{}
+ z.DrawOp = draw.Over
+}
+
+// Size returns the width and height passed to NewRasterizer or Reset.
+func (z *Rasterizer) Size() image.Point {
+ return z.size
+}
+
+// Bounds returns the rectangle from (0, 0) to the width and height passed to
+// NewRasterizer or Reset.
+func (z *Rasterizer) Bounds() image.Rectangle {
+ return image.Rectangle{Max: z.size}
+}
+
+// Pen returns the location of the path-drawing pen: the last argument to the
+// most recent XxxTo call.
+func (z *Rasterizer) Pen() f32.Vec2 {
+ return z.pen
+}
+
+// ClosePath closes the current path.
+func (z *Rasterizer) ClosePath() {
+ z.LineTo(z.first)
+}
+
+// MoveTo starts a new path and moves the pen to a.
+//
+// The coordinates are allowed to be out of the Rasterizer's bounds.
+func (z *Rasterizer) MoveTo(a f32.Vec2) {
+ z.first = a
+ z.pen = a
+}
+
+// LineTo adds a line segment, from the pen to b, and moves the pen to b.
+//
+// The coordinates are allowed to be out of the Rasterizer's bounds.
+func (z *Rasterizer) LineTo(b f32.Vec2) {
+ // TODO: add a fixed point math implementation.
+ z.floatingLineTo(b)
+}
+
+// QuadTo adds a quadratic Bézier segment, from the pen via b to c, and moves
+// the pen to c.
+//
+// The coordinates are allowed to be out of the Rasterizer's bounds.
+func (z *Rasterizer) QuadTo(b, c f32.Vec2) {
+ a := z.pen
+ devsq := devSquared(a, b, c)
+ if devsq >= 0.333 {
+ const tol = 3
+ n := 1 + int(math.Sqrt(math.Sqrt(tol*float64(devsq))))
+ t, nInv := float32(0), 1/float32(n)
+ for i := 0; i < n-1; i++ {
+ t += nInv
+ ab := lerp(t, a, b)
+ bc := lerp(t, b, c)
+ z.LineTo(lerp(t, ab, bc))
+ }
+ }
+ z.LineTo(c)
+}
+
+// CubeTo adds a cubic Bézier segment, from the pen via b and c to d, and moves
+// the pen to d.
+//
+// The coordinates are allowed to be out of the Rasterizer's bounds.
+func (z *Rasterizer) CubeTo(b, c, d f32.Vec2) {
+ a := z.pen
+ devsq := devSquared(a, b, d)
+ if devsqAlt := devSquared(a, c, d); devsq < devsqAlt {
+ devsq = devsqAlt
+ }
+ if devsq >= 0.333 {
+ const tol = 3
+ n := 1 + int(math.Sqrt(math.Sqrt(tol*float64(devsq))))
+ t, nInv := float32(0), 1/float32(n)
+ for i := 0; i < n-1; i++ {
+ t += nInv
+ ab := lerp(t, a, b)
+ bc := lerp(t, b, c)
+ cd := lerp(t, c, d)
+ abc := lerp(t, ab, bc)
+ bcd := lerp(t, bc, cd)
+ z.LineTo(lerp(t, abc, bcd))
+ }
+ }
+ z.LineTo(d)
+}
+
+// devSquared returns a measure of how curvy the sequnce a to b to c is. It
+// determines how many line segments will approximate a Bézier curve segment.
+//
+// http://lists.nongnu.org/archive/html/freetype-devel/2016-08/msg00080.html
+// gives the rationale for this evenly spaced heuristic instead of a recursive
+// de Casteljau approach:
+//
+// The reason for the subdivision by n is that I expect the "flatness"
+// computation to be semi-expensive (it's done once rather than on each
+// potential subdivision) and also because you'll often get fewer subdivisions.
+// Taking a circular arc as a simplifying assumption (ie a spherical cow),
+// where I get n, a recursive approach would get 2^⌈lg n⌉, which, if I haven't
+// made any horrible mistakes, is expected to be 33% more in the limit.
+func devSquared(a, b, c f32.Vec2) float32 {
+ devx := a[0] - 2*b[0] + c[0]
+ devy := a[1] - 2*b[1] + c[1]
+ return devx*devx + devy*devy
+}
+
+// Draw implements the Drawer interface from the standard library's image/draw
+// package.
+//
+// The vector paths previously added via the XxxTo calls become the mask for
+// drawing src onto dst.
+func (z *Rasterizer) Draw(dst draw.Image, r image.Rectangle, src image.Image, sp image.Point) {
+ if src, ok := src.(*image.Uniform); ok {
+ _, _, _, srcA := src.RGBA()
+ switch dst := dst.(type) {
+ case *image.Alpha:
+ // Fast path for glyph rendering.
+ if srcA == 0xffff && z.DrawOp == draw.Src {
+ z.rasterizeDstAlphaSrcOpaqueOpSrc(dst, r)
+ return
+ }
+ }
+ }
+ println("TODO: the general case")
+}
+
+func (z *Rasterizer) rasterizeDstAlphaSrcOpaqueOpSrc(dst *image.Alpha, r image.Rectangle) {
+ // TODO: add SIMD implementations.
+ // TODO: add a fixed point math implementation.
+ // TODO: non-zero vs even-odd winding?
+ if r == dst.Bounds() && r == z.Bounds() {
+ floatingAccumulate(dst.Pix, z.area)
+ return
+ }
+ println("TODO: the general case")
+}
diff --git a/vendor/golang.org/x/image/vector/vector_test.go b/vendor/golang.org/x/image/vector/vector_test.go
new file mode 100644
index 000000000..3aa8c192f
--- /dev/null
+++ b/vendor/golang.org/x/image/vector/vector_test.go
@@ -0,0 +1,76 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package vector
+
+// TODO: add tests for NaN and Inf coordinates.
+
+import (
+ "image"
+ "image/draw"
+ "image/png"
+ "os"
+ "testing"
+
+ "golang.org/x/image/math/f32"
+)
+
+// encodePNG is useful for manually debugging the tests.
+func encodePNG(dstFilename string, src image.Image) error {
+ f, err := os.Create(dstFilename)
+ if err != nil {
+ return err
+ }
+ encErr := png.Encode(f, src)
+ closeErr := f.Close()
+ if encErr != nil {
+ return encErr
+ }
+ return closeErr
+}
+
+func TestBasicPath(t *testing.T) {
+ want := []byte{
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0xaa, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x5f, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x24, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x14, 0x00, 0x00,
+ 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4a, 0x00, 0x00,
+ 0x00, 0x00, 0xcc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x81, 0x00, 0x00,
+ 0x00, 0x00, 0x66, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xe4, 0xff, 0xff, 0xff, 0xb6, 0x00, 0x00,
+ 0x00, 0x00, 0x0c, 0xf2, 0xff, 0xff, 0xfe, 0x9e, 0x15, 0x00, 0x15, 0x96, 0xff, 0xce, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x88, 0xfc, 0xe3, 0x43, 0x00, 0x00, 0x00, 0x00, 0x06, 0xcd, 0xdc, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x10, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0xde, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ }
+
+ z := NewRasterizer(16, 16)
+ z.MoveTo(f32.Vec2{2, 2})
+ z.LineTo(f32.Vec2{8, 2})
+ z.QuadTo(f32.Vec2{14, 2}, f32.Vec2{14, 14})
+ z.CubeTo(f32.Vec2{8, 2}, f32.Vec2{5, 20}, f32.Vec2{2, 8})
+ z.ClosePath()
+
+ dst := image.NewAlpha(z.Bounds())
+ z.DrawOp = draw.Src
+ z.Draw(dst, dst.Bounds(), image.Opaque, image.Point{})
+
+ got := dst.Pix
+ if len(got) != len(want) {
+ t.Fatalf("len(got)=%d and len(want)=%d differ", len(got), len(want))
+ }
+ for i := range got {
+ delta := int(got[i]) - int(want[i])
+ // The +/- 2 allows different implementations to give different
+ // rounding errors.
+ if delta < -2 || +2 < delta {
+ t.Errorf("i=%d: got %#02x, want %#02x", i, got[i], want[i])
+ }
+ }
+}
diff --git a/vendor/golang.org/x/image/webp/decode.go b/vendor/golang.org/x/image/webp/decode.go
index 134307e41..111f3589c 100644
--- a/vendor/golang.org/x/image/webp/decode.go
+++ b/vendor/golang.org/x/image/webp/decode.go
@@ -2,11 +2,9 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
-// Package webp implements a decoder for WEBP images.
-//
-// WEBP is defined at:
-// https://developers.google.com/speed/webp/docs/riff_container
-package webp // import "golang.org/x/image/webp"
+// +build go1.6
+
+package webp
import (
"bytes"
diff --git a/vendor/golang.org/x/image/webp/decode_test.go b/vendor/golang.org/x/image/webp/decode_test.go
index ad65b1088..b27468aa9 100644
--- a/vendor/golang.org/x/image/webp/decode_test.go
+++ b/vendor/golang.org/x/image/webp/decode_test.go
@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
+// +build go1.6
+
package webp
import (
diff --git a/vendor/golang.org/x/image/webp/webp.go b/vendor/golang.org/x/image/webp/webp.go
new file mode 100644
index 000000000..850cdc80c
--- /dev/null
+++ b/vendor/golang.org/x/image/webp/webp.go
@@ -0,0 +1,30 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package webp implements a decoder for WEBP images.
+//
+// WEBP is defined at:
+// https://developers.google.com/speed/webp/docs/riff_container
+//
+// It requires Go 1.6 or later.
+package webp // import "golang.org/x/image/webp"
+
+// This blank Go file, other than the package clause, exists so that this
+// package can be built for Go 1.5 and earlier. (The other files in this
+// package are all marked "+build go1.6" for the NYCbCrA types introduced in Go
+// 1.6). There is no functionality in a blank package, but some image
+// manipulation programs might still underscore import this package for the
+// side effect of registering the WEBP format with the standard library's
+// image.RegisterFormat and image.Decode functions. For example, that program
+// might contain:
+//
+// // Underscore imports to register some formats for image.Decode.
+// import _ "image/gif"
+// import _ "image/jpeg"
+// import _ "image/png"
+// import _ "golang.org/x/image/webp"
+//
+// Such a program will still compile for Go 1.5 (due to this placeholder Go
+// file). It will simply not be able to recognize and decode WEBP (but still
+// handle GIF, JPEG and PNG).
diff --git a/vendor/golang.org/x/sys/unix/asm_linux_s390x.s b/vendor/golang.org/x/sys/unix/asm_linux_s390x.s
new file mode 100644
index 000000000..11889859f
--- /dev/null
+++ b/vendor/golang.org/x/sys/unix/asm_linux_s390x.s
@@ -0,0 +1,28 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build s390x
+// +build linux
+// +build !gccgo
+
+#include "textflag.h"
+
+//
+// System calls for s390x, Linux
+//
+
+// Just jump to package syscall's implementation for all these functions.
+// The runtime may know about them.
+
+TEXT ·Syscall(SB),NOSPLIT,$0-56
+ BR syscall·Syscall(SB)
+
+TEXT ·Syscall6(SB),NOSPLIT,$0-80
+ BR syscall·Syscall6(SB)
+
+TEXT ·RawSyscall(SB),NOSPLIT,$0-56
+ BR syscall·RawSyscall(SB)
+
+TEXT ·RawSyscall6(SB),NOSPLIT,$0-80
+ BR syscall·RawSyscall6(SB)
diff --git a/vendor/golang.org/x/sys/unix/mkall.sh b/vendor/golang.org/x/sys/unix/mkall.sh
index de95a4bbc..3e224c57e 100755
--- a/vendor/golang.org/x/sys/unix/mkall.sh
+++ b/vendor/golang.org/x/sys/unix/mkall.sh
@@ -161,7 +161,7 @@ freebsd_arm)
mkerrors="$mkerrors"
mksyscall="./mksyscall.pl -l32 -arm"
mksysnum="curl -s 'http://svn.freebsd.org/base/stable/10/sys/kern/syscalls.master' | ./mksysnum_freebsd.pl"
- # Let the type of C char be singed for making the bare syscall
+ # Let the type of C char be signed for making the bare syscall
# API consistent across over platforms.
mktypes="GOARCH=$GOARCH go tool cgo -godefs -- -fsigned-char"
;;
@@ -194,7 +194,7 @@ linux_arm64)
exit 1
fi
mksysnum="./mksysnum_linux.pl $unistd_h"
- # Let the type of C char be singed for making the bare syscall
+ # Let the type of C char be signed for making the bare syscall
# API consistent across over platforms.
mktypes="GOARCH=$GOARCH go tool cgo -godefs -- -fsigned-char"
;;
@@ -212,6 +212,17 @@ linux_ppc64le)
mksysnum="./mksysnum_linux.pl $unistd_h"
mktypes="GOARCH=$GOARCH go tool cgo -godefs"
;;
+linux_s390x)
+ GOOSARCH_in=syscall_linux_s390x.go
+ unistd_h=/usr/include/asm/unistd.h
+ mkerrors="$mkerrors -m64"
+ mksysnum="./mksysnum_linux.pl $unistd_h"
+ # Let the type of C char be signed to make the bare sys
+ # API more consistent between platforms.
+ # This is a deliberate departure from the way the syscall
+ # package generates its version of the types file.
+ mktypes="GOARCH=$GOARCH go tool cgo -godefs -- -fsigned-char"
+ ;;
netbsd_386)
mkerrors="$mkerrors -m32"
mksyscall="./mksyscall.pl -l32 -netbsd"
@@ -269,6 +280,6 @@ esac
if [ -n "$mksysnum" ]; then echo "$mksysnum |gofmt >zsysnum_$GOOSARCH.go"; fi
if [ -n "$mktypes" ]; then
echo "echo // +build $GOARCH,$GOOS > ztypes_$GOOSARCH.go";
- echo "$mktypes types_$GOOS.go | gofmt >>ztypes_$GOOSARCH.go";
+ echo "$mktypes types_$GOOS.go | go run mkpost.go >>ztypes_$GOOSARCH.go";
fi
) | $run
diff --git a/vendor/golang.org/x/sys/unix/mkpost.go b/vendor/golang.org/x/sys/unix/mkpost.go
new file mode 100644
index 000000000..ed50d902a
--- /dev/null
+++ b/vendor/golang.org/x/sys/unix/mkpost.go
@@ -0,0 +1,62 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build ignore
+
+// mkpost processes the output of cgo -godefs to
+// modify the generated types. It is used to clean up
+// the sys API in an architecture specific manner.
+//
+// mkpost is run after cgo -godefs by mkall.sh.
+package main
+
+import (
+ "fmt"
+ "go/format"
+ "io/ioutil"
+ "log"
+ "os"
+ "regexp"
+)
+
+func main() {
+ b, err := ioutil.ReadAll(os.Stdin)
+ if err != nil {
+ log.Fatal(err)
+ }
+ s := string(b)
+
+ goarch := os.Getenv("GOARCH")
+ goos := os.Getenv("GOOS")
+ if goarch == "s390x" && goos == "linux" {
+ // Export the types of PtraceRegs fields.
+ re := regexp.MustCompile("ptrace(Psw|Fpregs|Per)")
+ s = re.ReplaceAllString(s, "Ptrace$1")
+
+ // Replace padding fields inserted by cgo with blank identifiers.
+ re = regexp.MustCompile("Pad_cgo[A-Za-z0-9_]*")
+ s = re.ReplaceAllString(s, "_")
+
+ // Replace other unwanted fields with blank identifiers.
+ re = regexp.MustCompile("X_[A-Za-z0-9_]*")
+ s = re.ReplaceAllString(s, "_")
+
+ // Replace the control_regs union with a blank identifier for now.
+ re = regexp.MustCompile("(Control_regs)\\s+\\[0\\]uint64")
+ s = re.ReplaceAllString(s, "_ [0]uint64")
+ }
+
+ // gofmt
+ b, err = format.Source([]byte(s))
+ if err != nil {
+ log.Fatal(err)
+ }
+
+ // Append this command to the header to show where the new file
+ // came from.
+ re := regexp.MustCompile("(cgo -godefs [a-zA-Z0-9_]+\\.go.*)")
+ b = re.ReplaceAll(b, []byte("$1 | go run mkpost.go"))
+
+ fmt.Printf("%s", b)
+}
diff --git a/vendor/golang.org/x/sys/unix/syscall_bsd_test.go b/vendor/golang.org/x/sys/unix/syscall_bsd_test.go
index 2ad51290c..d8085a072 100644
--- a/vendor/golang.org/x/sys/unix/syscall_bsd_test.go
+++ b/vendor/golang.org/x/sys/unix/syscall_bsd_test.go
@@ -7,6 +7,7 @@
package unix_test
import (
+ "os/exec"
"runtime"
"testing"
@@ -14,23 +15,37 @@ import (
)
const MNT_WAIT = 1
+const MNT_NOWAIT = 2
func TestGetfsstat(t *testing.T) {
- n, err := unix.Getfsstat(nil, MNT_WAIT)
+ const flags = MNT_NOWAIT // see golang.org/issue/16937
+ n, err := unix.Getfsstat(nil, flags)
if err != nil {
t.Fatal(err)
}
data := make([]unix.Statfs_t, n)
- n, err = unix.Getfsstat(data, MNT_WAIT)
+ n2, err := unix.Getfsstat(data, flags)
if err != nil {
t.Fatal(err)
}
-
- empty := unix.Statfs_t{}
- for _, stat := range data {
- if stat == empty {
- t.Fatal("an empty Statfs_t struct was returned")
+ if n != n2 {
+ t.Errorf("Getfsstat(nil) = %d, but subsequent Getfsstat(slice) = %d", n, n2)
+ }
+ for i, stat := range data {
+ if stat == (unix.Statfs_t{}) {
+ t.Errorf("index %v is an empty Statfs_t struct", i)
+ }
+ }
+ if t.Failed() {
+ for i, stat := range data[:n2] {
+ t.Logf("data[%v] = %+v", i, stat)
+ }
+ mount, err := exec.Command("mount").CombinedOutput()
+ if err != nil {
+ t.Logf("mount: %v\n%s", err, mount)
+ } else {
+ t.Logf("mount: %s", mount)
}
}
}
diff --git a/vendor/golang.org/x/sys/unix/syscall_darwin.go b/vendor/golang.org/x/sys/unix/syscall_darwin.go
index 0d1771c3f..3d534d2da 100644
--- a/vendor/golang.org/x/sys/unix/syscall_darwin.go
+++ b/vendor/golang.org/x/sys/unix/syscall_darwin.go
@@ -144,6 +144,7 @@ func getAttrList(path string, attrList attrList, attrBuf []byte, options uint) (
uintptr(options),
0,
)
+ use(unsafe.Pointer(_p0))
if e1 != 0 {
return nil, e1
}
@@ -196,6 +197,7 @@ func Getfsstat(buf []Statfs_t, flags int) (n int, err error) {
bufsize = unsafe.Sizeof(Statfs_t{}) * uintptr(len(buf))
}
r0, _, e1 := Syscall(SYS_GETFSSTAT64, uintptr(_p0), bufsize, uintptr(flags))
+ use(unsafe.Pointer(_p0))
n = int(r0)
if e1 != 0 {
err = e1
diff --git a/vendor/golang.org/x/sys/unix/syscall_dragonfly.go b/vendor/golang.org/x/sys/unix/syscall_dragonfly.go
index fbbe0dce2..ec408ee78 100644
--- a/vendor/golang.org/x/sys/unix/syscall_dragonfly.go
+++ b/vendor/golang.org/x/sys/unix/syscall_dragonfly.go
@@ -109,6 +109,7 @@ func Getfsstat(buf []Statfs_t, flags int) (n int, err error) {
bufsize = unsafe.Sizeof(Statfs_t{}) * uintptr(len(buf))
}
r0, _, e1 := Syscall(SYS_GETFSSTAT, uintptr(_p0), bufsize, uintptr(flags))
+ use(unsafe.Pointer(_p0))
n = int(r0)
if e1 != 0 {
err = e1
diff --git a/vendor/golang.org/x/sys/unix/syscall_freebsd.go b/vendor/golang.org/x/sys/unix/syscall_freebsd.go
index ec56ed608..520ccbeaf 100644
--- a/vendor/golang.org/x/sys/unix/syscall_freebsd.go
+++ b/vendor/golang.org/x/sys/unix/syscall_freebsd.go
@@ -129,6 +129,7 @@ func Getfsstat(buf []Statfs_t, flags int) (n int, err error) {
bufsize = unsafe.Sizeof(Statfs_t{}) * uintptr(len(buf))
}
r0, _, e1 := Syscall(SYS_GETFSSTAT, uintptr(_p0), bufsize, uintptr(flags))
+ use(unsafe.Pointer(_p0))
n = int(r0)
if e1 != 0 {
err = e1
diff --git a/vendor/golang.org/x/sys/unix/syscall_linux.go b/vendor/golang.org/x/sys/unix/syscall_linux.go
index 9ca104c95..6d10c9cff 100644
--- a/vendor/golang.org/x/sys/unix/syscall_linux.go
+++ b/vendor/golang.org/x/sys/unix/syscall_linux.go
@@ -60,6 +60,15 @@ func Openat(dirfd int, path string, flags int, mode uint32) (fd int, err error)
return openat(dirfd, path, flags|O_LARGEFILE, mode)
}
+//sys ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error)
+
+func Ppoll(fds []PollFd, timeout *Timespec, sigmask *Sigset_t) (n int, err error) {
+ if len(fds) == 0 {
+ return ppoll(nil, 0, timeout, sigmask)
+ }
+ return ppoll(&fds[0], len(fds), timeout, sigmask)
+}
+
//sys readlinkat(dirfd int, path string, buf []byte) (n int, err error)
func Readlink(path string, buf []byte) (n int, err error) {
@@ -1043,8 +1052,6 @@ func Munmap(b []byte) (err error) {
// Newfstatat
// Nfsservctl
// Personality
-// Poll
-// Ppoll
// Pselect6
// Ptrace
// Putpmsg
diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_386.go b/vendor/golang.org/x/sys/unix/syscall_linux_386.go
index bea01cb50..2b881b979 100644
--- a/vendor/golang.org/x/sys/unix/syscall_linux_386.go
+++ b/vendor/golang.org/x/sys/unix/syscall_linux_386.go
@@ -388,3 +388,12 @@ func (msghdr *Msghdr) SetControllen(length int) {
func (cmsg *Cmsghdr) SetLen(length int) {
cmsg.Len = uint32(length)
}
+
+//sys poll(fds *PollFd, nfds int, timeout int) (n int, err error)
+
+func Poll(fds []PollFd, timeout int) (n int, err error) {
+ if len(fds) == 0 {
+ return poll(nil, 0, timeout)
+ }
+ return poll(&fds[0], len(fds), timeout)
+}
diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go b/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go
index 721f24b68..18911c2d9 100644
--- a/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go
+++ b/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go
@@ -146,3 +146,12 @@ func (msghdr *Msghdr) SetControllen(length int) {
func (cmsg *Cmsghdr) SetLen(length int) {
cmsg.Len = uint64(length)
}
+
+//sys poll(fds *PollFd, nfds int, timeout int) (n int, err error)
+
+func Poll(fds []PollFd, timeout int) (n int, err error) {
+ if len(fds) == 0 {
+ return poll(nil, 0, timeout)
+ }
+ return poll(&fds[0], len(fds), timeout)
+}
diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_arm.go b/vendor/golang.org/x/sys/unix/syscall_linux_arm.go
index 122df649a..71d870228 100644
--- a/vendor/golang.org/x/sys/unix/syscall_linux_arm.go
+++ b/vendor/golang.org/x/sys/unix/syscall_linux_arm.go
@@ -252,3 +252,12 @@ func (msghdr *Msghdr) SetControllen(length int) {
func (cmsg *Cmsghdr) SetLen(length int) {
cmsg.Len = uint32(length)
}
+
+//sys poll(fds *PollFd, nfds int, timeout int) (n int, err error)
+
+func Poll(fds []PollFd, timeout int) (n int, err error) {
+ if len(fds) == 0 {
+ return poll(nil, 0, timeout)
+ }
+ return poll(&fds[0], len(fds), timeout)
+}
diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go b/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go
index d10518680..4b6ff2a80 100644
--- a/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go
+++ b/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go
@@ -178,3 +178,15 @@ const (
SYS_EPOLL_CREATE = 1042
SYS_EPOLL_WAIT = 1069
)
+
+func Poll(fds []PollFd, timeout int) (n int, err error) {
+ var ts *Timespec
+ if timeout >= 0 {
+ ts = new(Timespec)
+ *ts = NsecToTimespec(int64(timeout) * 1e6)
+ }
+ if len(fds) == 0 {
+ return ppoll(nil, 0, ts, nil)
+ }
+ return ppoll(&fds[0], len(fds), ts, nil)
+}
diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go b/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go
index bb15ba3e6..440f54ee9 100644
--- a/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go
+++ b/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go
@@ -204,3 +204,12 @@ func (msghdr *Msghdr) SetControllen(length int) {
func (cmsg *Cmsghdr) SetLen(length int) {
cmsg.Len = uint64(length)
}
+
+//sys poll(fds *PollFd, nfds int, timeout int) (n int, err error)
+
+func Poll(fds []PollFd, timeout int) (n int, err error) {
+ if len(fds) == 0 {
+ return poll(nil, 0, timeout)
+ }
+ return poll(&fds[0], len(fds), timeout)
+}
diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go b/vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go
index acd2e1c78..60770f627 100644
--- a/vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go
+++ b/vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go
@@ -124,3 +124,12 @@ func Pipe2(p []int, flags int) (err error) {
p[1] = int(pp[1])
return
}
+
+//sys poll(fds *PollFd, nfds int, timeout int) (n int, err error)
+
+func Poll(fds []PollFd, timeout int) (n int, err error) {
+ if len(fds) == 0 {
+ return poll(nil, 0, timeout)
+ }
+ return poll(&fds[0], len(fds), timeout)
+}
diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_s390x.go b/vendor/golang.org/x/sys/unix/syscall_linux_s390x.go
new file mode 100644
index 000000000..81c5f4732
--- /dev/null
+++ b/vendor/golang.org/x/sys/unix/syscall_linux_s390x.go
@@ -0,0 +1,329 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build s390x,linux
+
+package unix
+
+import (
+ "unsafe"
+)
+
+//sys Dup2(oldfd int, newfd int) (err error)
+//sys EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error)
+//sys Fadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_FADVISE64
+//sys Fchown(fd int, uid int, gid int) (err error)
+//sys Fstat(fd int, stat *Stat_t) (err error)
+//sys Fstatfs(fd int, buf *Statfs_t) (err error)
+//sys Ftruncate(fd int, length int64) (err error)
+//sysnb Getegid() (egid int)
+//sysnb Geteuid() (euid int)
+//sysnb Getgid() (gid int)
+//sysnb Getrlimit(resource int, rlim *Rlimit) (err error)
+//sysnb Getuid() (uid int)
+//sysnb InotifyInit() (fd int, err error)
+//sys Lchown(path string, uid int, gid int) (err error)
+//sys Lstat(path string, stat *Stat_t) (err error)
+//sys Pause() (err error)
+//sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64
+//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64
+//sys Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK
+//sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error)
+//sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error)
+//sys Setfsgid(gid int) (err error)
+//sys Setfsuid(uid int) (err error)
+//sysnb Setregid(rgid int, egid int) (err error)
+//sysnb Setresgid(rgid int, egid int, sgid int) (err error)
+//sysnb Setresuid(ruid int, euid int, suid int) (err error)
+//sysnb Setrlimit(resource int, rlim *Rlimit) (err error)
+//sysnb Setreuid(ruid int, euid int) (err error)
+//sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error)
+//sys Stat(path string, stat *Stat_t) (err error)
+//sys Statfs(path string, buf *Statfs_t) (err error)
+//sys SyncFileRange(fd int, off int64, n int64, flags int) (err error)
+//sys Truncate(path string, length int64) (err error)
+//sysnb getgroups(n int, list *_Gid_t) (nn int, err error)
+//sysnb setgroups(n int, list *_Gid_t) (err error)
+
+func Getpagesize() int { return 4096 }
+
+//sysnb Gettimeofday(tv *Timeval) (err error)
+
+func Time(t *Time_t) (tt Time_t, err error) {
+ var tv Timeval
+ err = Gettimeofday(&tv)
+ if err != nil {
+ return 0, err
+ }
+ if t != nil {
+ *t = Time_t(tv.Sec)
+ }
+ return Time_t(tv.Sec), nil
+}
+
+//sys Utime(path string, buf *Utimbuf) (err error)
+
+func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) }
+
+func NsecToTimespec(nsec int64) (ts Timespec) {
+ ts.Sec = nsec / 1e9
+ ts.Nsec = nsec % 1e9
+ return
+}
+
+func NsecToTimeval(nsec int64) (tv Timeval) {
+ nsec += 999 // round up to microsecond
+ tv.Sec = nsec / 1e9
+ tv.Usec = nsec % 1e9 / 1e3
+ return
+}
+
+//sysnb pipe2(p *[2]_C_int, flags int) (err error)
+
+func Pipe(p []int) (err error) {
+ if len(p) != 2 {
+ return EINVAL
+ }
+ var pp [2]_C_int
+ err = pipe2(&pp, 0) // pipe2 is the same as pipe when flags are set to 0.
+ p[0] = int(pp[0])
+ p[1] = int(pp[1])
+ return
+}
+
+func Pipe2(p []int, flags int) (err error) {
+ if len(p) != 2 {
+ return EINVAL
+ }
+ var pp [2]_C_int
+ err = pipe2(&pp, flags)
+ p[0] = int(pp[0])
+ p[1] = int(pp[1])
+ return
+}
+
+func Ioperm(from int, num int, on int) (err error) {
+ return ENOSYS
+}
+
+func Iopl(level int) (err error) {
+ return ENOSYS
+}
+
+func (r *PtraceRegs) PC() uint64 { return r.Psw.Addr }
+
+func (r *PtraceRegs) SetPC(pc uint64) { r.Psw.Addr = pc }
+
+func (iov *Iovec) SetLen(length int) {
+ iov.Len = uint64(length)
+}
+
+func (msghdr *Msghdr) SetControllen(length int) {
+ msghdr.Controllen = uint64(length)
+}
+
+func (cmsg *Cmsghdr) SetLen(length int) {
+ cmsg.Len = uint64(length)
+}
+
+// Linux on s390x uses the old mmap interface, which requires arguments to be passed in a struct.
+// mmap2 also requires arguments to be passed in a struct; it is currently not exposed in <asm/unistd.h>.
+func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) {
+ mmap_args := [6]uintptr{addr, length, uintptr(prot), uintptr(flags), uintptr(fd), uintptr(offset)}
+ r0, _, e1 := Syscall(SYS_MMAP, uintptr(unsafe.Pointer(&mmap_args[0])), 0, 0)
+ use(unsafe.Pointer(&mmap_args[0]))
+ xaddr = uintptr(r0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// On s390x Linux, all the socket calls go through an extra indirection.
+// The arguments to the underlying system call (SYS_SOCKETCALL) are the
+// number below and a pointer to an array of uintptr.
+const (
+ // see linux/net.h
+ netSocket = 1
+ netBind = 2
+ netConnect = 3
+ netListen = 4
+ netAccept = 5
+ netGetSockName = 6
+ netGetPeerName = 7
+ netSocketPair = 8
+ netSend = 9
+ netRecv = 10
+ netSendTo = 11
+ netRecvFrom = 12
+ netShutdown = 13
+ netSetSockOpt = 14
+ netGetSockOpt = 15
+ netSendMsg = 16
+ netRecvMsg = 17
+ netAccept4 = 18
+ netRecvMMsg = 19
+ netSendMMsg = 20
+)
+
+func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (int, error) {
+ args := [3]uintptr{uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))}
+ fd, _, err := Syscall(SYS_SOCKETCALL, netAccept, uintptr(unsafe.Pointer(&args)), 0)
+ if err != 0 {
+ return 0, err
+ }
+ return int(fd), nil
+}
+
+func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (int, error) {
+ args := [4]uintptr{uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags)}
+ fd, _, err := Syscall(SYS_SOCKETCALL, netAccept4, uintptr(unsafe.Pointer(&args)), 0)
+ if err != 0 {
+ return 0, err
+ }
+ return int(fd), nil
+}
+
+func getsockname(s int, rsa *RawSockaddrAny, addrlen *_Socklen) error {
+ args := [3]uintptr{uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))}
+ _, _, err := RawSyscall(SYS_SOCKETCALL, netGetSockName, uintptr(unsafe.Pointer(&args)), 0)
+ if err != 0 {
+ return err
+ }
+ return nil
+}
+
+func getpeername(s int, rsa *RawSockaddrAny, addrlen *_Socklen) error {
+ args := [3]uintptr{uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))}
+ _, _, err := RawSyscall(SYS_SOCKETCALL, netGetPeerName, uintptr(unsafe.Pointer(&args)), 0)
+ if err != 0 {
+ return err
+ }
+ return nil
+}
+
+func socketpair(domain int, typ int, flags int, fd *[2]int32) error {
+ args := [4]uintptr{uintptr(domain), uintptr(typ), uintptr(flags), uintptr(unsafe.Pointer(fd))}
+ _, _, err := RawSyscall(SYS_SOCKETCALL, netSocketPair, uintptr(unsafe.Pointer(&args)), 0)
+ if err != 0 {
+ return err
+ }
+ return nil
+}
+
+func bind(s int, addr unsafe.Pointer, addrlen _Socklen) error {
+ args := [3]uintptr{uintptr(s), uintptr(addr), uintptr(addrlen)}
+ _, _, err := Syscall(SYS_SOCKETCALL, netBind, uintptr(unsafe.Pointer(&args)), 0)
+ if err != 0 {
+ return err
+ }
+ return nil
+}
+
+func connect(s int, addr unsafe.Pointer, addrlen _Socklen) error {
+ args := [3]uintptr{uintptr(s), uintptr(addr), uintptr(addrlen)}
+ _, _, err := Syscall(SYS_SOCKETCALL, netConnect, uintptr(unsafe.Pointer(&args)), 0)
+ if err != 0 {
+ return err
+ }
+ return nil
+}
+
+func socket(domain int, typ int, proto int) (int, error) {
+ args := [3]uintptr{uintptr(domain), uintptr(typ), uintptr(proto)}
+ fd, _, err := RawSyscall(SYS_SOCKETCALL, netSocket, uintptr(unsafe.Pointer(&args)), 0)
+ if err != 0 {
+ return 0, err
+ }
+ return int(fd), nil
+}
+
+func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) error {
+ args := [5]uintptr{uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen))}
+ _, _, err := Syscall(SYS_SOCKETCALL, netGetSockOpt, uintptr(unsafe.Pointer(&args)), 0)
+ if err != 0 {
+ return err
+ }
+ return nil
+}
+
+func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) error {
+ args := [4]uintptr{uintptr(s), uintptr(level), uintptr(name), uintptr(val)}
+ _, _, err := Syscall(SYS_SOCKETCALL, netSetSockOpt, uintptr(unsafe.Pointer(&args)), 0)
+ if err != 0 {
+ return err
+ }
+ return nil
+}
+
+func recvfrom(s int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (int, error) {
+ var base uintptr
+ if len(p) > 0 {
+ base = uintptr(unsafe.Pointer(&p[0]))
+ }
+ args := [6]uintptr{uintptr(s), base, uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))}
+ n, _, err := Syscall(SYS_SOCKETCALL, netRecvFrom, uintptr(unsafe.Pointer(&args)), 0)
+ if err != 0 {
+ return 0, err
+ }
+ return int(n), nil
+}
+
+func sendto(s int, p []byte, flags int, to unsafe.Pointer, addrlen _Socklen) error {
+ var base uintptr
+ if len(p) > 0 {
+ base = uintptr(unsafe.Pointer(&p[0]))
+ }
+ args := [6]uintptr{uintptr(s), base, uintptr(len(p)), uintptr(flags), uintptr(to), uintptr(addrlen)}
+ _, _, err := Syscall(SYS_SOCKETCALL, netSendTo, uintptr(unsafe.Pointer(&args)), 0)
+ if err != 0 {
+ return err
+ }
+ return nil
+}
+
+func recvmsg(s int, msg *Msghdr, flags int) (int, error) {
+ args := [3]uintptr{uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)}
+ n, _, err := Syscall(SYS_SOCKETCALL, netRecvMsg, uintptr(unsafe.Pointer(&args)), 0)
+ if err != 0 {
+ return 0, err
+ }
+ return int(n), nil
+}
+
+func sendmsg(s int, msg *Msghdr, flags int) (int, error) {
+ args := [3]uintptr{uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)}
+ n, _, err := Syscall(SYS_SOCKETCALL, netSendMsg, uintptr(unsafe.Pointer(&args)), 0)
+ if err != 0 {
+ return 0, err
+ }
+ return int(n), nil
+}
+
+func Listen(s int, n int) error {
+ args := [2]uintptr{uintptr(s), uintptr(n)}
+ _, _, err := Syscall(SYS_SOCKETCALL, netListen, uintptr(unsafe.Pointer(&args)), 0)
+ if err != 0 {
+ return err
+ }
+ return nil
+}
+
+func Shutdown(s, how int) error {
+ args := [2]uintptr{uintptr(s), uintptr(how)}
+ _, _, err := Syscall(SYS_SOCKETCALL, netShutdown, uintptr(unsafe.Pointer(&args)), 0)
+ if err != 0 {
+ return err
+ }
+ return nil
+}
+
+//sys poll(fds *PollFd, nfds int, timeout int) (n int, err error)
+
+func Poll(fds []PollFd, timeout int) (n int, err error) {
+ if len(fds) == 0 {
+ return poll(nil, 0, timeout)
+ }
+ return poll(&fds[0], len(fds), timeout)
+}
diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_test.go b/vendor/golang.org/x/sys/unix/syscall_linux_test.go
index 2238b658d..91184cae0 100644
--- a/vendor/golang.org/x/sys/unix/syscall_linux_test.go
+++ b/vendor/golang.org/x/sys/unix/syscall_linux_test.go
@@ -15,6 +15,82 @@ import (
"golang.org/x/sys/unix"
)
+func TestPoll(t *testing.T) {
+ f, cleanup := mktmpfifo(t)
+ defer cleanup()
+
+ const timeout = 100
+
+ ok := make(chan bool, 1)
+ go func() {
+ select {
+ case <-time.After(10 * timeout * time.Millisecond):
+ t.Errorf("Poll: failed to timeout after %d milliseconds", 10*timeout)
+ case <-ok:
+ }
+ }()
+
+ fds := []unix.PollFd{{Fd: int32(f.Fd()), Events: unix.POLLIN}}
+ n, err := unix.Poll(fds, timeout)
+ ok <- true
+ if err != nil {
+ t.Errorf("Poll: unexpected error: %v", err)
+ return
+ }
+ if n != 0 {
+ t.Errorf("Poll: wrong number of events: got %v, expected %v", n, 0)
+ return
+ }
+}
+
+func TestPpoll(t *testing.T) {
+ f, cleanup := mktmpfifo(t)
+ defer cleanup()
+
+ const timeout = 100 * time.Millisecond
+
+ ok := make(chan bool, 1)
+ go func() {
+ select {
+ case <-time.After(10 * timeout):
+ t.Errorf("Ppoll: failed to timeout after %d", 10*timeout)
+ case <-ok:
+ }
+ }()
+
+ fds := []unix.PollFd{{Fd: int32(f.Fd()), Events: unix.POLLIN}}
+ timeoutTs := unix.NsecToTimespec(int64(timeout))
+ n, err := unix.Ppoll(fds, &timeoutTs, nil)
+ ok <- true
+ if err != nil {
+ t.Errorf("Ppoll: unexpected error: %v", err)
+ return
+ }
+ if n != 0 {
+ t.Errorf("Ppoll: wrong number of events: got %v, expected %v", n, 0)
+ return
+ }
+}
+
+// mktmpfifo creates a temporary FIFO and provides a cleanup function.
+func mktmpfifo(t *testing.T) (*os.File, func()) {
+ err := unix.Mkfifo("fifo", 0666)
+ if err != nil {
+ t.Fatalf("mktmpfifo: failed to create FIFO: %v", err)
+ }
+
+ f, err := os.OpenFile("fifo", os.O_RDWR, 0666)
+ if err != nil {
+ os.Remove("fifo")
+ t.Fatalf("mktmpfifo: failed to open FIFO: %v", err)
+ }
+
+ return f, func() {
+ f.Close()
+ os.Remove("fifo")
+ }
+}
+
func TestTime(t *testing.T) {
var ut unix.Time_t
ut2, err := unix.Time(&ut)
diff --git a/vendor/golang.org/x/sys/unix/syscall_openbsd.go b/vendor/golang.org/x/sys/unix/syscall_openbsd.go
index 246131d2a..554a82342 100644
--- a/vendor/golang.org/x/sys/unix/syscall_openbsd.go
+++ b/vendor/golang.org/x/sys/unix/syscall_openbsd.go
@@ -111,6 +111,7 @@ func Getfsstat(buf []Statfs_t, flags int) (n int, err error) {
bufsize = unsafe.Sizeof(Statfs_t{}) * uintptr(len(buf))
}
r0, _, e1 := Syscall(SYS_GETFSSTAT, uintptr(_p0), bufsize, uintptr(flags))
+ use(unsafe.Pointer(_p0))
n = int(r0)
if e1 != 0 {
err = e1
diff --git a/vendor/golang.org/x/sys/unix/syscall_solaris.go b/vendor/golang.org/x/sys/unix/syscall_solaris.go
index eb489b159..acb74b1d1 100644
--- a/vendor/golang.org/x/sys/unix/syscall_solaris.go
+++ b/vendor/golang.org/x/sys/unix/syscall_solaris.go
@@ -72,18 +72,20 @@ func ParseDirent(buf []byte, max int, names []string) (consumed int, count int,
return origlen - len(buf), count, names
}
-func pipe() (r uintptr, w uintptr, err uintptr)
+//sysnb pipe(p *[2]_C_int) (n int, err error)
func Pipe(p []int) (err error) {
if len(p) != 2 {
return EINVAL
}
- r0, w0, e1 := pipe()
- if e1 != 0 {
- err = syscall.Errno(e1)
+ var pp [2]_C_int
+ n, err := pipe(&pp)
+ if n != 0 {
+ return err
}
- p[0], p[1] = int(r0), int(w0)
- return
+ p[0] = int(pp[0])
+ p[1] = int(pp[1])
+ return nil
}
func (sa *SockaddrInet4) sockaddr() (unsafe.Pointer, _Socklen, error) {
@@ -269,24 +271,34 @@ func (w WaitStatus) StopSignal() syscall.Signal {
func (w WaitStatus) TrapCause() int { return -1 }
-func wait4(pid uintptr, wstatus *WaitStatus, options uintptr, rusage *Rusage) (wpid uintptr, err uintptr)
+//sys wait4(pid int32, statusp *_C_int, options int, rusage *Rusage) (wpid int32, err error)
-func Wait4(pid int, wstatus *WaitStatus, options int, rusage *Rusage) (wpid int, err error) {
- r0, e1 := wait4(uintptr(pid), wstatus, uintptr(options), rusage)
- if e1 != 0 {
- err = syscall.Errno(e1)
+func Wait4(pid int, wstatus *WaitStatus, options int, rusage *Rusage) (int, error) {
+ var status _C_int
+ rpid, err := wait4(int32(pid), &status, options, rusage)
+ wpid := int(rpid)
+ if wpid == -1 {
+ return wpid, err
+ }
+ if wstatus != nil {
+ *wstatus = WaitStatus(status)
}
- return int(r0), err
+ return wpid, nil
}
-func gethostname() (name string, err uintptr)
+//sys gethostname(buf []byte) (n int, err error)
func Gethostname() (name string, err error) {
- name, e1 := gethostname()
- if e1 != 0 {
- err = syscall.Errno(e1)
+ var buf [MaxHostNameLen]byte
+ n, err := gethostname(buf[:])
+ if n != 0 {
+ return "", err
}
- return name, err
+ n = clen(buf[:])
+ if n < 1 {
+ return "", EFAULT
+ }
+ return string(buf[:n]), nil
}
//sys utimes(path string, times *[2]Timeval) (err error)
diff --git a/vendor/golang.org/x/sys/unix/types_linux.go b/vendor/golang.org/x/sys/unix/types_linux.go
index 143e767a6..7dea79a8e 100644
--- a/vendor/golang.org/x/sys/unix/types_linux.go
+++ b/vendor/golang.org/x/sys/unix/types_linux.go
@@ -24,6 +24,7 @@ package unix
#include <netinet/in.h>
#include <netinet/tcp.h>
#include <netpacket/packet.h>
+#include <poll.h>
#include <signal.h>
#include <stdio.h>
#include <sys/epoll.h>
@@ -102,10 +103,22 @@ typedef struct user_pt_regs PtraceRegs;
typedef struct pt_regs PtraceRegs;
#elif defined(__mips__)
typedef struct user PtraceRegs;
+#elif defined(__s390x__)
+typedef struct _user_regs_struct PtraceRegs;
#else
typedef struct user_regs_struct PtraceRegs;
#endif
+#if defined(__s390x__)
+typedef struct _user_psw_struct ptracePsw;
+typedef struct _user_fpregs_struct ptraceFpregs;
+typedef struct _user_per_struct ptracePer;
+#else
+typedef struct {} ptracePsw;
+typedef struct {} ptraceFpregs;
+typedef struct {} ptracePer;
+#endif
+
// The real epoll_event is a union, and godefs doesn't handle it well.
struct my_epoll_event {
uint32_t events;
@@ -113,8 +126,7 @@ struct my_epoll_event {
// padding is not specified in linux/eventpoll.h but added to conform to the
// alignment requirements of EABI
int32_t padFd;
-#endif
-#ifdef __powerpc64__
+#elif defined(__powerpc64__) || defined(__s390x__)
int32_t _padFd;
#endif
int32_t fd;
@@ -393,6 +405,13 @@ const SizeofInotifyEvent = C.sizeof_struct_inotify_event
// Register structures
type PtraceRegs C.PtraceRegs
+// Structures contained in PtraceRegs on s390x (exported by mkpost.go)
+type ptracePsw C.ptracePsw
+
+type ptraceFpregs C.ptraceFpregs
+
+type ptracePer C.ptracePer
+
// Misc
type FdSet C.fd_set
@@ -412,6 +431,20 @@ const (
AT_SYMLINK_NOFOLLOW = C.AT_SYMLINK_NOFOLLOW
)
+type PollFd C.struct_pollfd
+
+const (
+ POLLIN = C.POLLIN
+ POLLPRI = C.POLLPRI
+ POLLOUT = C.POLLOUT
+ POLLRDHUP = C.POLLRDHUP
+ POLLERR = C.POLLERR
+ POLLHUP = C.POLLHUP
+ POLLNVAL = C.POLLNVAL
+)
+
+type Sigset_t C.sigset_t
+
// Terminal handling
type Termios C.termios_t
diff --git a/vendor/golang.org/x/sys/unix/types_solaris.go b/vendor/golang.org/x/sys/unix/types_solaris.go
index 6ad50eaba..c5d5c8f16 100644
--- a/vendor/golang.org/x/sys/unix/types_solaris.go
+++ b/vendor/golang.org/x/sys/unix/types_solaris.go
@@ -22,6 +22,7 @@ package unix
#define __USE_LEGACY_PROTOTYPES__ // iovec
#include <dirent.h>
#include <fcntl.h>
+#include <netdb.h>
#include <limits.h>
#include <signal.h>
#include <termios.h>
@@ -81,6 +82,7 @@ const (
sizeofLong = C.sizeof_long
sizeofLongLong = C.sizeof_longlong
PathMax = C.PATH_MAX
+ MaxHostNameLen = C.MAXHOSTNAMELEN
)
// Basic types
diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_386.go b/vendor/golang.org/x/sys/unix/zerrors_linux_386.go
index 80b73811d..8f920124b 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_linux_386.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_linux_386.go
@@ -216,6 +216,7 @@ const (
CLONE_FILES = 0x400
CLONE_FS = 0x200
CLONE_IO = 0x80000000
+ CLONE_NEWCGROUP = 0x2000000
CLONE_NEWIPC = 0x8000000
CLONE_NEWNET = 0x40000000
CLONE_NEWNS = 0x20000
diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go
index 64cc0b7d2..49b6c3546 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go
@@ -216,6 +216,7 @@ const (
CLONE_FILES = 0x400
CLONE_FS = 0x200
CLONE_IO = 0x80000000
+ CLONE_NEWCGROUP = 0x2000000
CLONE_NEWIPC = 0x8000000
CLONE_NEWNET = 0x40000000
CLONE_NEWNS = 0x20000
diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go b/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go
index 1cc76a78c..f036758f9 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go
@@ -212,6 +212,7 @@ const (
CLONE_FILES = 0x400
CLONE_FS = 0x200
CLONE_IO = 0x80000000
+ CLONE_NEWCGROUP = 0x2000000
CLONE_NEWIPC = 0x8000000
CLONE_NEWNET = 0x40000000
CLONE_NEWNS = 0x20000
diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go
index 47027b79c..16dcbc9cb 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go
@@ -222,6 +222,7 @@ const (
CLONE_FILES = 0x400
CLONE_FS = 0x200
CLONE_IO = 0x80000000
+ CLONE_NEWCGROUP = 0x2000000
CLONE_NEWIPC = 0x8000000
CLONE_NEWNET = 0x40000000
CLONE_NEWNS = 0x20000
diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go
index 98056fe20..36535b242 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go
@@ -221,6 +221,7 @@ const (
CLONE_FILES = 0x400
CLONE_FS = 0x200
CLONE_IO = 0x80000000
+ CLONE_NEWCGROUP = 0x2000000
CLONE_NEWIPC = 0x8000000
CLONE_NEWNET = 0x40000000
CLONE_NEWNS = 0x20000
diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go
index e5debb688..112f05de5 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go
@@ -221,6 +221,7 @@ const (
CLONE_FILES = 0x400
CLONE_FS = 0x200
CLONE_IO = 0x80000000
+ CLONE_NEWCGROUP = 0x2000000
CLONE_NEWIPC = 0x8000000
CLONE_NEWNET = 0x40000000
CLONE_NEWNS = 0x20000
diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go
index 5b90d07ed..8b42ca2fe 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go
@@ -223,6 +223,7 @@ const (
CLONE_FILES = 0x400
CLONE_FS = 0x200
CLONE_IO = 0x80000000
+ CLONE_NEWCGROUP = 0x2000000
CLONE_NEWIPC = 0x8000000
CLONE_NEWNET = 0x40000000
CLONE_NEWNS = 0x20000
diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go
index 0861bd566..e8d12b5d6 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go
@@ -222,6 +222,7 @@ const (
CLONE_FILES = 0x400
CLONE_FS = 0x200
CLONE_IO = 0x80000000
+ CLONE_NEWCGROUP = 0x2000000
CLONE_NEWIPC = 0x8000000
CLONE_NEWNET = 0x40000000
CLONE_NEWNS = 0x20000
diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go b/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go
new file mode 100644
index 000000000..329f25e7c
--- /dev/null
+++ b/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go
@@ -0,0 +1,2027 @@
+// mkerrors.sh -m64
+// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT
+
+// +build s390x,linux
+
+// Created by cgo -godefs - DO NOT EDIT
+// cgo -godefs -- -m64 _const.go
+
+package unix
+
+import "syscall"
+
+const (
+ AF_ALG = 0x26
+ AF_APPLETALK = 0x5
+ AF_ASH = 0x12
+ AF_ATMPVC = 0x8
+ AF_ATMSVC = 0x14
+ AF_AX25 = 0x3
+ AF_BLUETOOTH = 0x1f
+ AF_BRIDGE = 0x7
+ AF_CAIF = 0x25
+ AF_CAN = 0x1d
+ AF_DECnet = 0xc
+ AF_ECONET = 0x13
+ AF_FILE = 0x1
+ AF_IB = 0x1b
+ AF_IEEE802154 = 0x24
+ AF_INET = 0x2
+ AF_INET6 = 0xa
+ AF_IPX = 0x4
+ AF_IRDA = 0x17
+ AF_ISDN = 0x22
+ AF_IUCV = 0x20
+ AF_KEY = 0xf
+ AF_LLC = 0x1a
+ AF_LOCAL = 0x1
+ AF_MAX = 0x29
+ AF_MPLS = 0x1c
+ AF_NETBEUI = 0xd
+ AF_NETLINK = 0x10
+ AF_NETROM = 0x6
+ AF_NFC = 0x27
+ AF_PACKET = 0x11
+ AF_PHONET = 0x23
+ AF_PPPOX = 0x18
+ AF_RDS = 0x15
+ AF_ROSE = 0xb
+ AF_ROUTE = 0x10
+ AF_RXRPC = 0x21
+ AF_SECURITY = 0xe
+ AF_SNA = 0x16
+ AF_TIPC = 0x1e
+ AF_UNIX = 0x1
+ AF_UNSPEC = 0x0
+ AF_VSOCK = 0x28
+ AF_WANPIPE = 0x19
+ AF_X25 = 0x9
+ ARPHRD_6LOWPAN = 0x339
+ ARPHRD_ADAPT = 0x108
+ ARPHRD_APPLETLK = 0x8
+ ARPHRD_ARCNET = 0x7
+ ARPHRD_ASH = 0x30d
+ ARPHRD_ATM = 0x13
+ ARPHRD_AX25 = 0x3
+ ARPHRD_BIF = 0x307
+ ARPHRD_CAIF = 0x336
+ ARPHRD_CAN = 0x118
+ ARPHRD_CHAOS = 0x5
+ ARPHRD_CISCO = 0x201
+ ARPHRD_CSLIP = 0x101
+ ARPHRD_CSLIP6 = 0x103
+ ARPHRD_DDCMP = 0x205
+ ARPHRD_DLCI = 0xf
+ ARPHRD_ECONET = 0x30e
+ ARPHRD_EETHER = 0x2
+ ARPHRD_ETHER = 0x1
+ ARPHRD_EUI64 = 0x1b
+ ARPHRD_FCAL = 0x311
+ ARPHRD_FCFABRIC = 0x313
+ ARPHRD_FCPL = 0x312
+ ARPHRD_FCPP = 0x310
+ ARPHRD_FDDI = 0x306
+ ARPHRD_FRAD = 0x302
+ ARPHRD_HDLC = 0x201
+ ARPHRD_HIPPI = 0x30c
+ ARPHRD_HWX25 = 0x110
+ ARPHRD_IEEE1394 = 0x18
+ ARPHRD_IEEE802 = 0x6
+ ARPHRD_IEEE80211 = 0x321
+ ARPHRD_IEEE80211_PRISM = 0x322
+ ARPHRD_IEEE80211_RADIOTAP = 0x323
+ ARPHRD_IEEE802154 = 0x324
+ ARPHRD_IEEE802154_MONITOR = 0x325
+ ARPHRD_IEEE802_TR = 0x320
+ ARPHRD_INFINIBAND = 0x20
+ ARPHRD_IP6GRE = 0x337
+ ARPHRD_IPDDP = 0x309
+ ARPHRD_IPGRE = 0x30a
+ ARPHRD_IRDA = 0x30f
+ ARPHRD_LAPB = 0x204
+ ARPHRD_LOCALTLK = 0x305
+ ARPHRD_LOOPBACK = 0x304
+ ARPHRD_METRICOM = 0x17
+ ARPHRD_NETLINK = 0x338
+ ARPHRD_NETROM = 0x0
+ ARPHRD_NONE = 0xfffe
+ ARPHRD_PHONET = 0x334
+ ARPHRD_PHONET_PIPE = 0x335
+ ARPHRD_PIMREG = 0x30b
+ ARPHRD_PPP = 0x200
+ ARPHRD_PRONET = 0x4
+ ARPHRD_RAWHDLC = 0x206
+ ARPHRD_ROSE = 0x10e
+ ARPHRD_RSRVD = 0x104
+ ARPHRD_SIT = 0x308
+ ARPHRD_SKIP = 0x303
+ ARPHRD_SLIP = 0x100
+ ARPHRD_SLIP6 = 0x102
+ ARPHRD_TUNNEL = 0x300
+ ARPHRD_TUNNEL6 = 0x301
+ ARPHRD_VOID = 0xffff
+ ARPHRD_X25 = 0x10f
+ B0 = 0x0
+ B1000000 = 0x1008
+ B110 = 0x3
+ B115200 = 0x1002
+ B1152000 = 0x1009
+ B1200 = 0x9
+ B134 = 0x4
+ B150 = 0x5
+ B1500000 = 0x100a
+ B1800 = 0xa
+ B19200 = 0xe
+ B200 = 0x6
+ B2000000 = 0x100b
+ B230400 = 0x1003
+ B2400 = 0xb
+ B2500000 = 0x100c
+ B300 = 0x7
+ B3000000 = 0x100d
+ B3500000 = 0x100e
+ B38400 = 0xf
+ B4000000 = 0x100f
+ B460800 = 0x1004
+ B4800 = 0xc
+ B50 = 0x1
+ B500000 = 0x1005
+ B57600 = 0x1001
+ B576000 = 0x1006
+ B600 = 0x8
+ B75 = 0x2
+ B921600 = 0x1007
+ B9600 = 0xd
+ BOTHER = 0x1000
+ BPF_A = 0x10
+ BPF_ABS = 0x20
+ BPF_ADD = 0x0
+ BPF_ALU = 0x4
+ BPF_AND = 0x50
+ BPF_B = 0x10
+ BPF_DIV = 0x30
+ BPF_H = 0x8
+ BPF_IMM = 0x0
+ BPF_IND = 0x40
+ BPF_JA = 0x0
+ BPF_JEQ = 0x10
+ BPF_JGE = 0x30
+ BPF_JGT = 0x20
+ BPF_JMP = 0x5
+ BPF_JSET = 0x40
+ BPF_K = 0x0
+ BPF_LD = 0x0
+ BPF_LDX = 0x1
+ BPF_LEN = 0x80
+ BPF_LL_OFF = -0x200000
+ BPF_LSH = 0x60
+ BPF_MAJOR_VERSION = 0x1
+ BPF_MAXINSNS = 0x1000
+ BPF_MEM = 0x60
+ BPF_MEMWORDS = 0x10
+ BPF_MINOR_VERSION = 0x1
+ BPF_MISC = 0x7
+ BPF_MOD = 0x90
+ BPF_MSH = 0xa0
+ BPF_MUL = 0x20
+ BPF_NEG = 0x80
+ BPF_NET_OFF = -0x100000
+ BPF_OR = 0x40
+ BPF_RET = 0x6
+ BPF_RSH = 0x70
+ BPF_ST = 0x2
+ BPF_STX = 0x3
+ BPF_SUB = 0x10
+ BPF_TAX = 0x0
+ BPF_TXA = 0x80
+ BPF_W = 0x0
+ BPF_X = 0x8
+ BPF_XOR = 0xa0
+ BRKINT = 0x2
+ BS0 = 0x0
+ BS1 = 0x2000
+ BSDLY = 0x2000
+ CBAUD = 0x100f
+ CBAUDEX = 0x1000
+ CFLUSH = 0xf
+ CIBAUD = 0x100f0000
+ CLOCAL = 0x800
+ CLOCK_BOOTTIME = 0x7
+ CLOCK_BOOTTIME_ALARM = 0x9
+ CLOCK_DEFAULT = 0x0
+ CLOCK_EXT = 0x1
+ CLOCK_INT = 0x2
+ CLOCK_MONOTONIC = 0x1
+ CLOCK_MONOTONIC_COARSE = 0x6
+ CLOCK_MONOTONIC_RAW = 0x4
+ CLOCK_PROCESS_CPUTIME_ID = 0x2
+ CLOCK_REALTIME = 0x0
+ CLOCK_REALTIME_ALARM = 0x8
+ CLOCK_REALTIME_COARSE = 0x5
+ CLOCK_TAI = 0xb
+ CLOCK_THREAD_CPUTIME_ID = 0x3
+ CLOCK_TXFROMRX = 0x4
+ CLOCK_TXINT = 0x3
+ CLONE_CHILD_CLEARTID = 0x200000
+ CLONE_CHILD_SETTID = 0x1000000
+ CLONE_DETACHED = 0x400000
+ CLONE_FILES = 0x400
+ CLONE_FS = 0x200
+ CLONE_IO = 0x80000000
+ CLONE_NEWCGROUP = 0x2000000
+ CLONE_NEWIPC = 0x8000000
+ CLONE_NEWNET = 0x40000000
+ CLONE_NEWNS = 0x20000
+ CLONE_NEWPID = 0x20000000
+ CLONE_NEWUSER = 0x10000000
+ CLONE_NEWUTS = 0x4000000
+ CLONE_PARENT = 0x8000
+ CLONE_PARENT_SETTID = 0x100000
+ CLONE_PTRACE = 0x2000
+ CLONE_SETTLS = 0x80000
+ CLONE_SIGHAND = 0x800
+ CLONE_SYSVSEM = 0x40000
+ CLONE_THREAD = 0x10000
+ CLONE_UNTRACED = 0x800000
+ CLONE_VFORK = 0x4000
+ CLONE_VM = 0x100
+ CMSPAR = 0x40000000
+ CR0 = 0x0
+ CR1 = 0x200
+ CR2 = 0x400
+ CR3 = 0x600
+ CRDLY = 0x600
+ CREAD = 0x80
+ CRTSCTS = 0x80000000
+ CS5 = 0x0
+ CS6 = 0x10
+ CS7 = 0x20
+ CS8 = 0x30
+ CSIGNAL = 0xff
+ CSIZE = 0x30
+ CSTART = 0x11
+ CSTATUS = 0x0
+ CSTOP = 0x13
+ CSTOPB = 0x40
+ CSUSP = 0x1a
+ DT_BLK = 0x6
+ DT_CHR = 0x2
+ DT_DIR = 0x4
+ DT_FIFO = 0x1
+ DT_LNK = 0xa
+ DT_REG = 0x8
+ DT_SOCK = 0xc
+ DT_UNKNOWN = 0x0
+ DT_WHT = 0xe
+ ECHO = 0x8
+ ECHOCTL = 0x200
+ ECHOE = 0x10
+ ECHOK = 0x20
+ ECHOKE = 0x800
+ ECHONL = 0x40
+ ECHOPRT = 0x400
+ ENCODING_DEFAULT = 0x0
+ ENCODING_FM_MARK = 0x3
+ ENCODING_FM_SPACE = 0x4
+ ENCODING_MANCHESTER = 0x5
+ ENCODING_NRZ = 0x1
+ ENCODING_NRZI = 0x2
+ EPOLLERR = 0x8
+ EPOLLET = 0x80000000
+ EPOLLHUP = 0x10
+ EPOLLIN = 0x1
+ EPOLLMSG = 0x400
+ EPOLLONESHOT = 0x40000000
+ EPOLLOUT = 0x4
+ EPOLLPRI = 0x2
+ EPOLLRDBAND = 0x80
+ EPOLLRDHUP = 0x2000
+ EPOLLRDNORM = 0x40
+ EPOLLWAKEUP = 0x20000000
+ EPOLLWRBAND = 0x200
+ EPOLLWRNORM = 0x100
+ EPOLL_CLOEXEC = 0x80000
+ EPOLL_CTL_ADD = 0x1
+ EPOLL_CTL_DEL = 0x2
+ EPOLL_CTL_MOD = 0x3
+ ETH_P_1588 = 0x88f7
+ ETH_P_8021AD = 0x88a8
+ ETH_P_8021AH = 0x88e7
+ ETH_P_8021Q = 0x8100
+ ETH_P_80221 = 0x8917
+ ETH_P_802_2 = 0x4
+ ETH_P_802_3 = 0x1
+ ETH_P_802_3_MIN = 0x600
+ ETH_P_802_EX1 = 0x88b5
+ ETH_P_AARP = 0x80f3
+ ETH_P_AF_IUCV = 0xfbfb
+ ETH_P_ALL = 0x3
+ ETH_P_AOE = 0x88a2
+ ETH_P_ARCNET = 0x1a
+ ETH_P_ARP = 0x806
+ ETH_P_ATALK = 0x809b
+ ETH_P_ATMFATE = 0x8884
+ ETH_P_ATMMPOA = 0x884c
+ ETH_P_AX25 = 0x2
+ ETH_P_BATMAN = 0x4305
+ ETH_P_BPQ = 0x8ff
+ ETH_P_CAIF = 0xf7
+ ETH_P_CAN = 0xc
+ ETH_P_CANFD = 0xd
+ ETH_P_CONTROL = 0x16
+ ETH_P_CUST = 0x6006
+ ETH_P_DDCMP = 0x6
+ ETH_P_DEC = 0x6000
+ ETH_P_DIAG = 0x6005
+ ETH_P_DNA_DL = 0x6001
+ ETH_P_DNA_RC = 0x6002
+ ETH_P_DNA_RT = 0x6003
+ ETH_P_DSA = 0x1b
+ ETH_P_ECONET = 0x18
+ ETH_P_EDSA = 0xdada
+ ETH_P_FCOE = 0x8906
+ ETH_P_FIP = 0x8914
+ ETH_P_HDLC = 0x19
+ ETH_P_IEEE802154 = 0xf6
+ ETH_P_IEEEPUP = 0xa00
+ ETH_P_IEEEPUPAT = 0xa01
+ ETH_P_IP = 0x800
+ ETH_P_IPV6 = 0x86dd
+ ETH_P_IPX = 0x8137
+ ETH_P_IRDA = 0x17
+ ETH_P_LAT = 0x6004
+ ETH_P_LINK_CTL = 0x886c
+ ETH_P_LOCALTALK = 0x9
+ ETH_P_LOOP = 0x60
+ ETH_P_LOOPBACK = 0x9000
+ ETH_P_MOBITEX = 0x15
+ ETH_P_MPLS_MC = 0x8848
+ ETH_P_MPLS_UC = 0x8847
+ ETH_P_MVRP = 0x88f5
+ ETH_P_PAE = 0x888e
+ ETH_P_PAUSE = 0x8808
+ ETH_P_PHONET = 0xf5
+ ETH_P_PPPTALK = 0x10
+ ETH_P_PPP_DISC = 0x8863
+ ETH_P_PPP_MP = 0x8
+ ETH_P_PPP_SES = 0x8864
+ ETH_P_PRP = 0x88fb
+ ETH_P_PUP = 0x200
+ ETH_P_PUPAT = 0x201
+ ETH_P_QINQ1 = 0x9100
+ ETH_P_QINQ2 = 0x9200
+ ETH_P_QINQ3 = 0x9300
+ ETH_P_RARP = 0x8035
+ ETH_P_SCA = 0x6007
+ ETH_P_SLOW = 0x8809
+ ETH_P_SNAP = 0x5
+ ETH_P_TDLS = 0x890d
+ ETH_P_TEB = 0x6558
+ ETH_P_TIPC = 0x88ca
+ ETH_P_TRAILER = 0x1c
+ ETH_P_TR_802_2 = 0x11
+ ETH_P_TSN = 0x22f0
+ ETH_P_WAN_PPP = 0x7
+ ETH_P_WCCP = 0x883e
+ ETH_P_X25 = 0x805
+ ETH_P_XDSA = 0xf8
+ EXTA = 0xe
+ EXTB = 0xf
+ EXTPROC = 0x10000
+ FD_CLOEXEC = 0x1
+ FD_SETSIZE = 0x400
+ FF0 = 0x0
+ FF1 = 0x8000
+ FFDLY = 0x8000
+ FLUSHO = 0x1000
+ F_DUPFD = 0x0
+ F_DUPFD_CLOEXEC = 0x406
+ F_EXLCK = 0x4
+ F_GETFD = 0x1
+ F_GETFL = 0x3
+ F_GETLEASE = 0x401
+ F_GETLK = 0x5
+ F_GETLK64 = 0x5
+ F_GETOWN = 0x9
+ F_GETOWN_EX = 0x10
+ F_GETPIPE_SZ = 0x408
+ F_GETSIG = 0xb
+ F_LOCK = 0x1
+ F_NOTIFY = 0x402
+ F_OFD_GETLK = 0x24
+ F_OFD_SETLK = 0x25
+ F_OFD_SETLKW = 0x26
+ F_OK = 0x0
+ F_RDLCK = 0x0
+ F_SETFD = 0x2
+ F_SETFL = 0x4
+ F_SETLEASE = 0x400
+ F_SETLK = 0x6
+ F_SETLK64 = 0x6
+ F_SETLKW = 0x7
+ F_SETLKW64 = 0x7
+ F_SETOWN = 0x8
+ F_SETOWN_EX = 0xf
+ F_SETPIPE_SZ = 0x407
+ F_SETSIG = 0xa
+ F_SHLCK = 0x8
+ F_TEST = 0x3
+ F_TLOCK = 0x2
+ F_ULOCK = 0x0
+ F_UNLCK = 0x2
+ F_WRLCK = 0x1
+ HUPCL = 0x400
+ IBSHIFT = 0x10
+ ICANON = 0x2
+ ICMPV6_FILTER = 0x1
+ ICRNL = 0x100
+ IEXTEN = 0x8000
+ IFA_F_DADFAILED = 0x8
+ IFA_F_DEPRECATED = 0x20
+ IFA_F_HOMEADDRESS = 0x10
+ IFA_F_MANAGETEMPADDR = 0x100
+ IFA_F_MCAUTOJOIN = 0x400
+ IFA_F_NODAD = 0x2
+ IFA_F_NOPREFIXROUTE = 0x200
+ IFA_F_OPTIMISTIC = 0x4
+ IFA_F_PERMANENT = 0x80
+ IFA_F_SECONDARY = 0x1
+ IFA_F_STABLE_PRIVACY = 0x800
+ IFA_F_TEMPORARY = 0x1
+ IFA_F_TENTATIVE = 0x40
+ IFA_MAX = 0x8
+ IFF_ALLMULTI = 0x200
+ IFF_ATTACH_QUEUE = 0x200
+ IFF_AUTOMEDIA = 0x4000
+ IFF_BROADCAST = 0x2
+ IFF_DEBUG = 0x4
+ IFF_DETACH_QUEUE = 0x400
+ IFF_DORMANT = 0x20000
+ IFF_DYNAMIC = 0x8000
+ IFF_ECHO = 0x40000
+ IFF_LOOPBACK = 0x8
+ IFF_LOWER_UP = 0x10000
+ IFF_MASTER = 0x400
+ IFF_MULTICAST = 0x1000
+ IFF_MULTI_QUEUE = 0x100
+ IFF_NOARP = 0x80
+ IFF_NOFILTER = 0x1000
+ IFF_NOTRAILERS = 0x20
+ IFF_NO_PI = 0x1000
+ IFF_ONE_QUEUE = 0x2000
+ IFF_PERSIST = 0x800
+ IFF_POINTOPOINT = 0x10
+ IFF_PORTSEL = 0x2000
+ IFF_PROMISC = 0x100
+ IFF_RUNNING = 0x40
+ IFF_SLAVE = 0x800
+ IFF_TAP = 0x2
+ IFF_TUN = 0x1
+ IFF_TUN_EXCL = 0x8000
+ IFF_UP = 0x1
+ IFF_VNET_HDR = 0x4000
+ IFF_VOLATILE = 0x70c5a
+ IFNAMSIZ = 0x10
+ IGNBRK = 0x1
+ IGNCR = 0x80
+ IGNPAR = 0x4
+ IMAXBEL = 0x2000
+ INLCR = 0x40
+ INPCK = 0x10
+ IN_ACCESS = 0x1
+ IN_ALL_EVENTS = 0xfff
+ IN_ATTRIB = 0x4
+ IN_CLASSA_HOST = 0xffffff
+ IN_CLASSA_MAX = 0x80
+ IN_CLASSA_NET = 0xff000000
+ IN_CLASSA_NSHIFT = 0x18
+ IN_CLASSB_HOST = 0xffff
+ IN_CLASSB_MAX = 0x10000
+ IN_CLASSB_NET = 0xffff0000
+ IN_CLASSB_NSHIFT = 0x10
+ IN_CLASSC_HOST = 0xff
+ IN_CLASSC_NET = 0xffffff00
+ IN_CLASSC_NSHIFT = 0x8
+ IN_CLOEXEC = 0x80000
+ IN_CLOSE = 0x18
+ IN_CLOSE_NOWRITE = 0x10
+ IN_CLOSE_WRITE = 0x8
+ IN_CREATE = 0x100
+ IN_DELETE = 0x200
+ IN_DELETE_SELF = 0x400
+ IN_DONT_FOLLOW = 0x2000000
+ IN_EXCL_UNLINK = 0x4000000
+ IN_IGNORED = 0x8000
+ IN_ISDIR = 0x40000000
+ IN_LOOPBACKNET = 0x7f
+ IN_MASK_ADD = 0x20000000
+ IN_MODIFY = 0x2
+ IN_MOVE = 0xc0
+ IN_MOVED_FROM = 0x40
+ IN_MOVED_TO = 0x80
+ IN_MOVE_SELF = 0x800
+ IN_NONBLOCK = 0x800
+ IN_ONESHOT = 0x80000000
+ IN_ONLYDIR = 0x1000000
+ IN_OPEN = 0x20
+ IN_Q_OVERFLOW = 0x4000
+ IN_UNMOUNT = 0x2000
+ IPPROTO_AH = 0x33
+ IPPROTO_BEETPH = 0x5e
+ IPPROTO_COMP = 0x6c
+ IPPROTO_DCCP = 0x21
+ IPPROTO_DSTOPTS = 0x3c
+ IPPROTO_EGP = 0x8
+ IPPROTO_ENCAP = 0x62
+ IPPROTO_ESP = 0x32
+ IPPROTO_FRAGMENT = 0x2c
+ IPPROTO_GRE = 0x2f
+ IPPROTO_HOPOPTS = 0x0
+ IPPROTO_ICMP = 0x1
+ IPPROTO_ICMPV6 = 0x3a
+ IPPROTO_IDP = 0x16
+ IPPROTO_IGMP = 0x2
+ IPPROTO_IP = 0x0
+ IPPROTO_IPIP = 0x4
+ IPPROTO_IPV6 = 0x29
+ IPPROTO_MH = 0x87
+ IPPROTO_MPLS = 0x89
+ IPPROTO_MTP = 0x5c
+ IPPROTO_NONE = 0x3b
+ IPPROTO_PIM = 0x67
+ IPPROTO_PUP = 0xc
+ IPPROTO_RAW = 0xff
+ IPPROTO_ROUTING = 0x2b
+ IPPROTO_RSVP = 0x2e
+ IPPROTO_SCTP = 0x84
+ IPPROTO_TCP = 0x6
+ IPPROTO_TP = 0x1d
+ IPPROTO_UDP = 0x11
+ IPPROTO_UDPLITE = 0x88
+ IPV6_2292DSTOPTS = 0x4
+ IPV6_2292HOPLIMIT = 0x8
+ IPV6_2292HOPOPTS = 0x3
+ IPV6_2292PKTINFO = 0x2
+ IPV6_2292PKTOPTIONS = 0x6
+ IPV6_2292RTHDR = 0x5
+ IPV6_ADDRFORM = 0x1
+ IPV6_ADD_MEMBERSHIP = 0x14
+ IPV6_AUTHHDR = 0xa
+ IPV6_CHECKSUM = 0x7
+ IPV6_DONTFRAG = 0x3e
+ IPV6_DROP_MEMBERSHIP = 0x15
+ IPV6_DSTOPTS = 0x3b
+ IPV6_HOPLIMIT = 0x34
+ IPV6_HOPOPTS = 0x36
+ IPV6_IPSEC_POLICY = 0x22
+ IPV6_JOIN_ANYCAST = 0x1b
+ IPV6_JOIN_GROUP = 0x14
+ IPV6_LEAVE_ANYCAST = 0x1c
+ IPV6_LEAVE_GROUP = 0x15
+ IPV6_MTU = 0x18
+ IPV6_MTU_DISCOVER = 0x17
+ IPV6_MULTICAST_HOPS = 0x12
+ IPV6_MULTICAST_IF = 0x11
+ IPV6_MULTICAST_LOOP = 0x13
+ IPV6_NEXTHOP = 0x9
+ IPV6_PATHMTU = 0x3d
+ IPV6_PKTINFO = 0x32
+ IPV6_PMTUDISC_DO = 0x2
+ IPV6_PMTUDISC_DONT = 0x0
+ IPV6_PMTUDISC_INTERFACE = 0x4
+ IPV6_PMTUDISC_OMIT = 0x5
+ IPV6_PMTUDISC_PROBE = 0x3
+ IPV6_PMTUDISC_WANT = 0x1
+ IPV6_RECVDSTOPTS = 0x3a
+ IPV6_RECVERR = 0x19
+ IPV6_RECVHOPLIMIT = 0x33
+ IPV6_RECVHOPOPTS = 0x35
+ IPV6_RECVPATHMTU = 0x3c
+ IPV6_RECVPKTINFO = 0x31
+ IPV6_RECVRTHDR = 0x38
+ IPV6_RECVTCLASS = 0x42
+ IPV6_ROUTER_ALERT = 0x16
+ IPV6_RTHDR = 0x39
+ IPV6_RTHDRDSTOPTS = 0x37
+ IPV6_RTHDR_LOOSE = 0x0
+ IPV6_RTHDR_STRICT = 0x1
+ IPV6_RTHDR_TYPE_0 = 0x0
+ IPV6_RXDSTOPTS = 0x3b
+ IPV6_RXHOPOPTS = 0x36
+ IPV6_TCLASS = 0x43
+ IPV6_UNICAST_HOPS = 0x10
+ IPV6_V6ONLY = 0x1a
+ IPV6_XFRM_POLICY = 0x23
+ IP_ADD_MEMBERSHIP = 0x23
+ IP_ADD_SOURCE_MEMBERSHIP = 0x27
+ IP_BIND_ADDRESS_NO_PORT = 0x18
+ IP_BLOCK_SOURCE = 0x26
+ IP_CHECKSUM = 0x17
+ IP_DEFAULT_MULTICAST_LOOP = 0x1
+ IP_DEFAULT_MULTICAST_TTL = 0x1
+ IP_DF = 0x4000
+ IP_DROP_MEMBERSHIP = 0x24
+ IP_DROP_SOURCE_MEMBERSHIP = 0x28
+ IP_FREEBIND = 0xf
+ IP_HDRINCL = 0x3
+ IP_IPSEC_POLICY = 0x10
+ IP_MAXPACKET = 0xffff
+ IP_MAX_MEMBERSHIPS = 0x14
+ IP_MF = 0x2000
+ IP_MINTTL = 0x15
+ IP_MSFILTER = 0x29
+ IP_MSS = 0x240
+ IP_MTU = 0xe
+ IP_MTU_DISCOVER = 0xa
+ IP_MULTICAST_ALL = 0x31
+ IP_MULTICAST_IF = 0x20
+ IP_MULTICAST_LOOP = 0x22
+ IP_MULTICAST_TTL = 0x21
+ IP_NODEFRAG = 0x16
+ IP_OFFMASK = 0x1fff
+ IP_OPTIONS = 0x4
+ IP_ORIGDSTADDR = 0x14
+ IP_PASSSEC = 0x12
+ IP_PKTINFO = 0x8
+ IP_PKTOPTIONS = 0x9
+ IP_PMTUDISC = 0xa
+ IP_PMTUDISC_DO = 0x2
+ IP_PMTUDISC_DONT = 0x0
+ IP_PMTUDISC_INTERFACE = 0x4
+ IP_PMTUDISC_OMIT = 0x5
+ IP_PMTUDISC_PROBE = 0x3
+ IP_PMTUDISC_WANT = 0x1
+ IP_RECVERR = 0xb
+ IP_RECVOPTS = 0x6
+ IP_RECVORIGDSTADDR = 0x14
+ IP_RECVRETOPTS = 0x7
+ IP_RECVTOS = 0xd
+ IP_RECVTTL = 0xc
+ IP_RETOPTS = 0x7
+ IP_RF = 0x8000
+ IP_ROUTER_ALERT = 0x5
+ IP_TOS = 0x1
+ IP_TRANSPARENT = 0x13
+ IP_TTL = 0x2
+ IP_UNBLOCK_SOURCE = 0x25
+ IP_UNICAST_IF = 0x32
+ IP_XFRM_POLICY = 0x11
+ ISIG = 0x1
+ ISTRIP = 0x20
+ IUCLC = 0x200
+ IUTF8 = 0x4000
+ IXANY = 0x800
+ IXOFF = 0x1000
+ IXON = 0x400
+ LINUX_REBOOT_CMD_CAD_OFF = 0x0
+ LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef
+ LINUX_REBOOT_CMD_HALT = 0xcdef0123
+ LINUX_REBOOT_CMD_KEXEC = 0x45584543
+ LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc
+ LINUX_REBOOT_CMD_RESTART = 0x1234567
+ LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4
+ LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2
+ LINUX_REBOOT_MAGIC1 = 0xfee1dead
+ LINUX_REBOOT_MAGIC2 = 0x28121969
+ LOCK_EX = 0x2
+ LOCK_NB = 0x4
+ LOCK_SH = 0x1
+ LOCK_UN = 0x8
+ MADV_DODUMP = 0x11
+ MADV_DOFORK = 0xb
+ MADV_DONTDUMP = 0x10
+ MADV_DONTFORK = 0xa
+ MADV_DONTNEED = 0x4
+ MADV_HUGEPAGE = 0xe
+ MADV_HWPOISON = 0x64
+ MADV_MERGEABLE = 0xc
+ MADV_NOHUGEPAGE = 0xf
+ MADV_NORMAL = 0x0
+ MADV_RANDOM = 0x1
+ MADV_REMOVE = 0x9
+ MADV_SEQUENTIAL = 0x2
+ MADV_UNMERGEABLE = 0xd
+ MADV_WILLNEED = 0x3
+ MAP_ANON = 0x20
+ MAP_ANONYMOUS = 0x20
+ MAP_DENYWRITE = 0x800
+ MAP_EXECUTABLE = 0x1000
+ MAP_FILE = 0x0
+ MAP_FIXED = 0x10
+ MAP_GROWSDOWN = 0x100
+ MAP_HUGETLB = 0x40000
+ MAP_HUGE_MASK = 0x3f
+ MAP_HUGE_SHIFT = 0x1a
+ MAP_LOCKED = 0x2000
+ MAP_NONBLOCK = 0x10000
+ MAP_NORESERVE = 0x4000
+ MAP_POPULATE = 0x8000
+ MAP_PRIVATE = 0x2
+ MAP_SHARED = 0x1
+ MAP_STACK = 0x20000
+ MAP_TYPE = 0xf
+ MCL_CURRENT = 0x1
+ MCL_FUTURE = 0x2
+ MCL_ONFAULT = 0x4
+ MNT_DETACH = 0x2
+ MNT_EXPIRE = 0x4
+ MNT_FORCE = 0x1
+ MSG_CMSG_CLOEXEC = 0x40000000
+ MSG_CONFIRM = 0x800
+ MSG_CTRUNC = 0x8
+ MSG_DONTROUTE = 0x4
+ MSG_DONTWAIT = 0x40
+ MSG_EOR = 0x80
+ MSG_ERRQUEUE = 0x2000
+ MSG_FASTOPEN = 0x20000000
+ MSG_FIN = 0x200
+ MSG_MORE = 0x8000
+ MSG_NOSIGNAL = 0x4000
+ MSG_OOB = 0x1
+ MSG_PEEK = 0x2
+ MSG_PROXY = 0x10
+ MSG_RST = 0x1000
+ MSG_SYN = 0x400
+ MSG_TRUNC = 0x20
+ MSG_TRYHARD = 0x4
+ MSG_WAITALL = 0x100
+ MSG_WAITFORONE = 0x10000
+ MS_ACTIVE = 0x40000000
+ MS_ASYNC = 0x1
+ MS_BIND = 0x1000
+ MS_DIRSYNC = 0x80
+ MS_INVALIDATE = 0x2
+ MS_I_VERSION = 0x800000
+ MS_KERNMOUNT = 0x400000
+ MS_LAZYTIME = 0x2000000
+ MS_MANDLOCK = 0x40
+ MS_MGC_MSK = 0xffff0000
+ MS_MGC_VAL = 0xc0ed0000
+ MS_MOVE = 0x2000
+ MS_NOATIME = 0x400
+ MS_NODEV = 0x4
+ MS_NODIRATIME = 0x800
+ MS_NOEXEC = 0x8
+ MS_NOSUID = 0x2
+ MS_NOUSER = -0x80000000
+ MS_POSIXACL = 0x10000
+ MS_PRIVATE = 0x40000
+ MS_RDONLY = 0x1
+ MS_REC = 0x4000
+ MS_RELATIME = 0x200000
+ MS_REMOUNT = 0x20
+ MS_RMT_MASK = 0x2800051
+ MS_SHARED = 0x100000
+ MS_SILENT = 0x8000
+ MS_SLAVE = 0x80000
+ MS_STRICTATIME = 0x1000000
+ MS_SYNC = 0x4
+ MS_SYNCHRONOUS = 0x10
+ MS_UNBINDABLE = 0x20000
+ NAME_MAX = 0xff
+ NETLINK_ADD_MEMBERSHIP = 0x1
+ NETLINK_AUDIT = 0x9
+ NETLINK_BROADCAST_ERROR = 0x4
+ NETLINK_CAP_ACK = 0xa
+ NETLINK_CONNECTOR = 0xb
+ NETLINK_CRYPTO = 0x15
+ NETLINK_DNRTMSG = 0xe
+ NETLINK_DROP_MEMBERSHIP = 0x2
+ NETLINK_ECRYPTFS = 0x13
+ NETLINK_FIB_LOOKUP = 0xa
+ NETLINK_FIREWALL = 0x3
+ NETLINK_GENERIC = 0x10
+ NETLINK_INET_DIAG = 0x4
+ NETLINK_IP6_FW = 0xd
+ NETLINK_ISCSI = 0x8
+ NETLINK_KOBJECT_UEVENT = 0xf
+ NETLINK_LISTEN_ALL_NSID = 0x8
+ NETLINK_LIST_MEMBERSHIPS = 0x9
+ NETLINK_NETFILTER = 0xc
+ NETLINK_NFLOG = 0x5
+ NETLINK_NO_ENOBUFS = 0x5
+ NETLINK_PKTINFO = 0x3
+ NETLINK_RDMA = 0x14
+ NETLINK_ROUTE = 0x0
+ NETLINK_RX_RING = 0x6
+ NETLINK_SCSITRANSPORT = 0x12
+ NETLINK_SELINUX = 0x7
+ NETLINK_SOCK_DIAG = 0x4
+ NETLINK_TX_RING = 0x7
+ NETLINK_UNUSED = 0x1
+ NETLINK_USERSOCK = 0x2
+ NETLINK_XFRM = 0x6
+ NL0 = 0x0
+ NL1 = 0x100
+ NLA_ALIGNTO = 0x4
+ NLA_F_NESTED = 0x8000
+ NLA_F_NET_BYTEORDER = 0x4000
+ NLA_HDRLEN = 0x4
+ NLDLY = 0x100
+ NLMSG_ALIGNTO = 0x4
+ NLMSG_DONE = 0x3
+ NLMSG_ERROR = 0x2
+ NLMSG_HDRLEN = 0x10
+ NLMSG_MIN_TYPE = 0x10
+ NLMSG_NOOP = 0x1
+ NLMSG_OVERRUN = 0x4
+ NLM_F_ACK = 0x4
+ NLM_F_APPEND = 0x800
+ NLM_F_ATOMIC = 0x400
+ NLM_F_CREATE = 0x400
+ NLM_F_DUMP = 0x300
+ NLM_F_DUMP_FILTERED = 0x20
+ NLM_F_DUMP_INTR = 0x10
+ NLM_F_ECHO = 0x8
+ NLM_F_EXCL = 0x200
+ NLM_F_MATCH = 0x200
+ NLM_F_MULTI = 0x2
+ NLM_F_REPLACE = 0x100
+ NLM_F_REQUEST = 0x1
+ NLM_F_ROOT = 0x100
+ NOFLSH = 0x80
+ OCRNL = 0x8
+ OFDEL = 0x80
+ OFILL = 0x40
+ OLCUC = 0x2
+ ONLCR = 0x4
+ ONLRET = 0x20
+ ONOCR = 0x10
+ OPOST = 0x1
+ O_ACCMODE = 0x3
+ O_APPEND = 0x400
+ O_ASYNC = 0x2000
+ O_CLOEXEC = 0x80000
+ O_CREAT = 0x40
+ O_DIRECT = 0x4000
+ O_DIRECTORY = 0x10000
+ O_DSYNC = 0x1000
+ O_EXCL = 0x80
+ O_FSYNC = 0x101000
+ O_LARGEFILE = 0x0
+ O_NDELAY = 0x800
+ O_NOATIME = 0x40000
+ O_NOCTTY = 0x100
+ O_NOFOLLOW = 0x20000
+ O_NONBLOCK = 0x800
+ O_PATH = 0x200000
+ O_RDONLY = 0x0
+ O_RDWR = 0x2
+ O_RSYNC = 0x101000
+ O_SYNC = 0x101000
+ O_TMPFILE = 0x410000
+ O_TRUNC = 0x200
+ O_WRONLY = 0x1
+ PACKET_ADD_MEMBERSHIP = 0x1
+ PACKET_AUXDATA = 0x8
+ PACKET_BROADCAST = 0x1
+ PACKET_COPY_THRESH = 0x7
+ PACKET_DROP_MEMBERSHIP = 0x2
+ PACKET_FANOUT = 0x12
+ PACKET_FANOUT_CBPF = 0x6
+ PACKET_FANOUT_CPU = 0x2
+ PACKET_FANOUT_DATA = 0x16
+ PACKET_FANOUT_EBPF = 0x7
+ PACKET_FANOUT_FLAG_DEFRAG = 0x8000
+ PACKET_FANOUT_FLAG_ROLLOVER = 0x1000
+ PACKET_FANOUT_HASH = 0x0
+ PACKET_FANOUT_LB = 0x1
+ PACKET_FANOUT_QM = 0x5
+ PACKET_FANOUT_RND = 0x4
+ PACKET_FANOUT_ROLLOVER = 0x3
+ PACKET_FASTROUTE = 0x6
+ PACKET_HDRLEN = 0xb
+ PACKET_HOST = 0x0
+ PACKET_KERNEL = 0x7
+ PACKET_LOOPBACK = 0x5
+ PACKET_LOSS = 0xe
+ PACKET_MR_ALLMULTI = 0x2
+ PACKET_MR_MULTICAST = 0x0
+ PACKET_MR_PROMISC = 0x1
+ PACKET_MR_UNICAST = 0x3
+ PACKET_MULTICAST = 0x2
+ PACKET_ORIGDEV = 0x9
+ PACKET_OTHERHOST = 0x3
+ PACKET_OUTGOING = 0x4
+ PACKET_QDISC_BYPASS = 0x14
+ PACKET_RECV_OUTPUT = 0x3
+ PACKET_RESERVE = 0xc
+ PACKET_ROLLOVER_STATS = 0x15
+ PACKET_RX_RING = 0x5
+ PACKET_STATISTICS = 0x6
+ PACKET_TIMESTAMP = 0x11
+ PACKET_TX_HAS_OFF = 0x13
+ PACKET_TX_RING = 0xd
+ PACKET_TX_TIMESTAMP = 0x10
+ PACKET_USER = 0x6
+ PACKET_VERSION = 0xa
+ PACKET_VNET_HDR = 0xf
+ PARENB = 0x100
+ PARITY_CRC16_PR0 = 0x2
+ PARITY_CRC16_PR0_CCITT = 0x4
+ PARITY_CRC16_PR1 = 0x3
+ PARITY_CRC16_PR1_CCITT = 0x5
+ PARITY_CRC32_PR0_CCITT = 0x6
+ PARITY_CRC32_PR1_CCITT = 0x7
+ PARITY_DEFAULT = 0x0
+ PARITY_NONE = 0x1
+ PARMRK = 0x8
+ PARODD = 0x200
+ PENDIN = 0x4000
+ PRIO_PGRP = 0x1
+ PRIO_PROCESS = 0x0
+ PRIO_USER = 0x2
+ PROT_EXEC = 0x4
+ PROT_GROWSDOWN = 0x1000000
+ PROT_GROWSUP = 0x2000000
+ PROT_NONE = 0x0
+ PROT_READ = 0x1
+ PROT_WRITE = 0x2
+ PR_CAPBSET_DROP = 0x18
+ PR_CAPBSET_READ = 0x17
+ PR_CAP_AMBIENT = 0x2f
+ PR_CAP_AMBIENT_CLEAR_ALL = 0x4
+ PR_CAP_AMBIENT_IS_SET = 0x1
+ PR_CAP_AMBIENT_LOWER = 0x3
+ PR_CAP_AMBIENT_RAISE = 0x2
+ PR_ENDIAN_BIG = 0x0
+ PR_ENDIAN_LITTLE = 0x1
+ PR_ENDIAN_PPC_LITTLE = 0x2
+ PR_FPEMU_NOPRINT = 0x1
+ PR_FPEMU_SIGFPE = 0x2
+ PR_FP_EXC_ASYNC = 0x2
+ PR_FP_EXC_DISABLED = 0x0
+ PR_FP_EXC_DIV = 0x10000
+ PR_FP_EXC_INV = 0x100000
+ PR_FP_EXC_NONRECOV = 0x1
+ PR_FP_EXC_OVF = 0x20000
+ PR_FP_EXC_PRECISE = 0x3
+ PR_FP_EXC_RES = 0x80000
+ PR_FP_EXC_SW_ENABLE = 0x80
+ PR_FP_EXC_UND = 0x40000
+ PR_FP_MODE_FR = 0x1
+ PR_FP_MODE_FRE = 0x2
+ PR_GET_CHILD_SUBREAPER = 0x25
+ PR_GET_DUMPABLE = 0x3
+ PR_GET_ENDIAN = 0x13
+ PR_GET_FPEMU = 0x9
+ PR_GET_FPEXC = 0xb
+ PR_GET_FP_MODE = 0x2e
+ PR_GET_KEEPCAPS = 0x7
+ PR_GET_NAME = 0x10
+ PR_GET_NO_NEW_PRIVS = 0x27
+ PR_GET_PDEATHSIG = 0x2
+ PR_GET_SECCOMP = 0x15
+ PR_GET_SECUREBITS = 0x1b
+ PR_GET_THP_DISABLE = 0x2a
+ PR_GET_TID_ADDRESS = 0x28
+ PR_GET_TIMERSLACK = 0x1e
+ PR_GET_TIMING = 0xd
+ PR_GET_TSC = 0x19
+ PR_GET_UNALIGN = 0x5
+ PR_MCE_KILL = 0x21
+ PR_MCE_KILL_CLEAR = 0x0
+ PR_MCE_KILL_DEFAULT = 0x2
+ PR_MCE_KILL_EARLY = 0x1
+ PR_MCE_KILL_GET = 0x22
+ PR_MCE_KILL_LATE = 0x0
+ PR_MCE_KILL_SET = 0x1
+ PR_MPX_DISABLE_MANAGEMENT = 0x2c
+ PR_MPX_ENABLE_MANAGEMENT = 0x2b
+ PR_SET_CHILD_SUBREAPER = 0x24
+ PR_SET_DUMPABLE = 0x4
+ PR_SET_ENDIAN = 0x14
+ PR_SET_FPEMU = 0xa
+ PR_SET_FPEXC = 0xc
+ PR_SET_FP_MODE = 0x2d
+ PR_SET_KEEPCAPS = 0x8
+ PR_SET_MM = 0x23
+ PR_SET_MM_ARG_END = 0x9
+ PR_SET_MM_ARG_START = 0x8
+ PR_SET_MM_AUXV = 0xc
+ PR_SET_MM_BRK = 0x7
+ PR_SET_MM_END_CODE = 0x2
+ PR_SET_MM_END_DATA = 0x4
+ PR_SET_MM_ENV_END = 0xb
+ PR_SET_MM_ENV_START = 0xa
+ PR_SET_MM_EXE_FILE = 0xd
+ PR_SET_MM_MAP = 0xe
+ PR_SET_MM_MAP_SIZE = 0xf
+ PR_SET_MM_START_BRK = 0x6
+ PR_SET_MM_START_CODE = 0x1
+ PR_SET_MM_START_DATA = 0x3
+ PR_SET_MM_START_STACK = 0x5
+ PR_SET_NAME = 0xf
+ PR_SET_NO_NEW_PRIVS = 0x26
+ PR_SET_PDEATHSIG = 0x1
+ PR_SET_PTRACER = 0x59616d61
+ PR_SET_PTRACER_ANY = -0x1
+ PR_SET_SECCOMP = 0x16
+ PR_SET_SECUREBITS = 0x1c
+ PR_SET_THP_DISABLE = 0x29
+ PR_SET_TIMERSLACK = 0x1d
+ PR_SET_TIMING = 0xe
+ PR_SET_TSC = 0x1a
+ PR_SET_UNALIGN = 0x6
+ PR_TASK_PERF_EVENTS_DISABLE = 0x1f
+ PR_TASK_PERF_EVENTS_ENABLE = 0x20
+ PR_TIMING_STATISTICAL = 0x0
+ PR_TIMING_TIMESTAMP = 0x1
+ PR_TSC_ENABLE = 0x1
+ PR_TSC_SIGSEGV = 0x2
+ PR_UNALIGN_NOPRINT = 0x1
+ PR_UNALIGN_SIGBUS = 0x2
+ PTRACE_ATTACH = 0x10
+ PTRACE_CONT = 0x7
+ PTRACE_DETACH = 0x11
+ PTRACE_DISABLE_TE = 0x5010
+ PTRACE_ENABLE_TE = 0x5009
+ PTRACE_EVENT_CLONE = 0x3
+ PTRACE_EVENT_EXEC = 0x4
+ PTRACE_EVENT_EXIT = 0x6
+ PTRACE_EVENT_FORK = 0x1
+ PTRACE_EVENT_SECCOMP = 0x7
+ PTRACE_EVENT_STOP = 0x80
+ PTRACE_EVENT_VFORK = 0x2
+ PTRACE_EVENT_VFORK_DONE = 0x5
+ PTRACE_GETEVENTMSG = 0x4201
+ PTRACE_GETREGS = 0xc
+ PTRACE_GETREGSET = 0x4204
+ PTRACE_GETSIGINFO = 0x4202
+ PTRACE_GETSIGMASK = 0x420a
+ PTRACE_GET_LAST_BREAK = 0x5006
+ PTRACE_INTERRUPT = 0x4207
+ PTRACE_KILL = 0x8
+ PTRACE_LISTEN = 0x4208
+ PTRACE_OLDSETOPTIONS = 0x15
+ PTRACE_O_EXITKILL = 0x100000
+ PTRACE_O_MASK = 0x3000ff
+ PTRACE_O_SUSPEND_SECCOMP = 0x200000
+ PTRACE_O_TRACECLONE = 0x8
+ PTRACE_O_TRACEEXEC = 0x10
+ PTRACE_O_TRACEEXIT = 0x40
+ PTRACE_O_TRACEFORK = 0x2
+ PTRACE_O_TRACESECCOMP = 0x80
+ PTRACE_O_TRACESYSGOOD = 0x1
+ PTRACE_O_TRACEVFORK = 0x4
+ PTRACE_O_TRACEVFORKDONE = 0x20
+ PTRACE_PEEKDATA = 0x2
+ PTRACE_PEEKDATA_AREA = 0x5003
+ PTRACE_PEEKSIGINFO = 0x4209
+ PTRACE_PEEKSIGINFO_SHARED = 0x1
+ PTRACE_PEEKTEXT = 0x1
+ PTRACE_PEEKTEXT_AREA = 0x5002
+ PTRACE_PEEKUSR = 0x3
+ PTRACE_PEEKUSR_AREA = 0x5000
+ PTRACE_PEEK_SYSTEM_CALL = 0x5007
+ PTRACE_POKEDATA = 0x5
+ PTRACE_POKEDATA_AREA = 0x5005
+ PTRACE_POKETEXT = 0x4
+ PTRACE_POKETEXT_AREA = 0x5004
+ PTRACE_POKEUSR = 0x6
+ PTRACE_POKEUSR_AREA = 0x5001
+ PTRACE_POKE_SYSTEM_CALL = 0x5008
+ PTRACE_PROT = 0x15
+ PTRACE_SECCOMP_GET_FILTER = 0x420c
+ PTRACE_SEIZE = 0x4206
+ PTRACE_SETOPTIONS = 0x4200
+ PTRACE_SETREGS = 0xd
+ PTRACE_SETREGSET = 0x4205
+ PTRACE_SETSIGINFO = 0x4203
+ PTRACE_SETSIGMASK = 0x420b
+ PTRACE_SINGLEBLOCK = 0xc
+ PTRACE_SINGLESTEP = 0x9
+ PTRACE_SYSCALL = 0x18
+ PTRACE_TE_ABORT_RAND = 0x5011
+ PTRACE_TRACEME = 0x0
+ PT_ACR0 = 0x90
+ PT_ACR1 = 0x94
+ PT_ACR10 = 0xb8
+ PT_ACR11 = 0xbc
+ PT_ACR12 = 0xc0
+ PT_ACR13 = 0xc4
+ PT_ACR14 = 0xc8
+ PT_ACR15 = 0xcc
+ PT_ACR2 = 0x98
+ PT_ACR3 = 0x9c
+ PT_ACR4 = 0xa0
+ PT_ACR5 = 0xa4
+ PT_ACR6 = 0xa8
+ PT_ACR7 = 0xac
+ PT_ACR8 = 0xb0
+ PT_ACR9 = 0xb4
+ PT_CR_10 = 0x168
+ PT_CR_11 = 0x170
+ PT_CR_9 = 0x160
+ PT_ENDREGS = 0x1af
+ PT_FPC = 0xd8
+ PT_FPR0 = 0xe0
+ PT_FPR1 = 0xe8
+ PT_FPR10 = 0x130
+ PT_FPR11 = 0x138
+ PT_FPR12 = 0x140
+ PT_FPR13 = 0x148
+ PT_FPR14 = 0x150
+ PT_FPR15 = 0x158
+ PT_FPR2 = 0xf0
+ PT_FPR3 = 0xf8
+ PT_FPR4 = 0x100
+ PT_FPR5 = 0x108
+ PT_FPR6 = 0x110
+ PT_FPR7 = 0x118
+ PT_FPR8 = 0x120
+ PT_FPR9 = 0x128
+ PT_GPR0 = 0x10
+ PT_GPR1 = 0x18
+ PT_GPR10 = 0x60
+ PT_GPR11 = 0x68
+ PT_GPR12 = 0x70
+ PT_GPR13 = 0x78
+ PT_GPR14 = 0x80
+ PT_GPR15 = 0x88
+ PT_GPR2 = 0x20
+ PT_GPR3 = 0x28
+ PT_GPR4 = 0x30
+ PT_GPR5 = 0x38
+ PT_GPR6 = 0x40
+ PT_GPR7 = 0x48
+ PT_GPR8 = 0x50
+ PT_GPR9 = 0x58
+ PT_IEEE_IP = 0x1a8
+ PT_LASTOFF = 0x1a8
+ PT_ORIGGPR2 = 0xd0
+ PT_PSWADDR = 0x8
+ PT_PSWMASK = 0x0
+ RLIMIT_AS = 0x9
+ RLIMIT_CORE = 0x4
+ RLIMIT_CPU = 0x0
+ RLIMIT_DATA = 0x2
+ RLIMIT_FSIZE = 0x1
+ RLIMIT_NOFILE = 0x7
+ RLIMIT_STACK = 0x3
+ RLIM_INFINITY = -0x1
+ RTAX_ADVMSS = 0x8
+ RTAX_CC_ALGO = 0x10
+ RTAX_CWND = 0x7
+ RTAX_FEATURES = 0xc
+ RTAX_FEATURE_ALLFRAG = 0x8
+ RTAX_FEATURE_ECN = 0x1
+ RTAX_FEATURE_MASK = 0xf
+ RTAX_FEATURE_SACK = 0x2
+ RTAX_FEATURE_TIMESTAMP = 0x4
+ RTAX_HOPLIMIT = 0xa
+ RTAX_INITCWND = 0xb
+ RTAX_INITRWND = 0xe
+ RTAX_LOCK = 0x1
+ RTAX_MAX = 0x10
+ RTAX_MTU = 0x2
+ RTAX_QUICKACK = 0xf
+ RTAX_REORDERING = 0x9
+ RTAX_RTO_MIN = 0xd
+ RTAX_RTT = 0x4
+ RTAX_RTTVAR = 0x5
+ RTAX_SSTHRESH = 0x6
+ RTAX_UNSPEC = 0x0
+ RTAX_WINDOW = 0x3
+ RTA_ALIGNTO = 0x4
+ RTA_MAX = 0x16
+ RTCF_DIRECTSRC = 0x4000000
+ RTCF_DOREDIRECT = 0x1000000
+ RTCF_LOG = 0x2000000
+ RTCF_MASQ = 0x400000
+ RTCF_NAT = 0x800000
+ RTCF_VALVE = 0x200000
+ RTF_ADDRCLASSMASK = 0xf8000000
+ RTF_ADDRCONF = 0x40000
+ RTF_ALLONLINK = 0x20000
+ RTF_BROADCAST = 0x10000000
+ RTF_CACHE = 0x1000000
+ RTF_DEFAULT = 0x10000
+ RTF_DYNAMIC = 0x10
+ RTF_FLOW = 0x2000000
+ RTF_GATEWAY = 0x2
+ RTF_HOST = 0x4
+ RTF_INTERFACE = 0x40000000
+ RTF_IRTT = 0x100
+ RTF_LINKRT = 0x100000
+ RTF_LOCAL = 0x80000000
+ RTF_MODIFIED = 0x20
+ RTF_MSS = 0x40
+ RTF_MTU = 0x40
+ RTF_MULTICAST = 0x20000000
+ RTF_NAT = 0x8000000
+ RTF_NOFORWARD = 0x1000
+ RTF_NONEXTHOP = 0x200000
+ RTF_NOPMTUDISC = 0x4000
+ RTF_POLICY = 0x4000000
+ RTF_REINSTATE = 0x8
+ RTF_REJECT = 0x200
+ RTF_STATIC = 0x400
+ RTF_THROW = 0x2000
+ RTF_UP = 0x1
+ RTF_WINDOW = 0x80
+ RTF_XRESOLVE = 0x800
+ RTM_BASE = 0x10
+ RTM_DELACTION = 0x31
+ RTM_DELADDR = 0x15
+ RTM_DELADDRLABEL = 0x49
+ RTM_DELLINK = 0x11
+ RTM_DELMDB = 0x55
+ RTM_DELNEIGH = 0x1d
+ RTM_DELNSID = 0x59
+ RTM_DELQDISC = 0x25
+ RTM_DELROUTE = 0x19
+ RTM_DELRULE = 0x21
+ RTM_DELTCLASS = 0x29
+ RTM_DELTFILTER = 0x2d
+ RTM_F_CLONED = 0x200
+ RTM_F_EQUALIZE = 0x400
+ RTM_F_LOOKUP_TABLE = 0x1000
+ RTM_F_NOTIFY = 0x100
+ RTM_F_PREFIX = 0x800
+ RTM_GETACTION = 0x32
+ RTM_GETADDR = 0x16
+ RTM_GETADDRLABEL = 0x4a
+ RTM_GETANYCAST = 0x3e
+ RTM_GETDCB = 0x4e
+ RTM_GETLINK = 0x12
+ RTM_GETMDB = 0x56
+ RTM_GETMULTICAST = 0x3a
+ RTM_GETNEIGH = 0x1e
+ RTM_GETNEIGHTBL = 0x42
+ RTM_GETNETCONF = 0x52
+ RTM_GETNSID = 0x5a
+ RTM_GETQDISC = 0x26
+ RTM_GETROUTE = 0x1a
+ RTM_GETRULE = 0x22
+ RTM_GETTCLASS = 0x2a
+ RTM_GETTFILTER = 0x2e
+ RTM_MAX = 0x5b
+ RTM_NEWACTION = 0x30
+ RTM_NEWADDR = 0x14
+ RTM_NEWADDRLABEL = 0x48
+ RTM_NEWLINK = 0x10
+ RTM_NEWMDB = 0x54
+ RTM_NEWNDUSEROPT = 0x44
+ RTM_NEWNEIGH = 0x1c
+ RTM_NEWNEIGHTBL = 0x40
+ RTM_NEWNETCONF = 0x50
+ RTM_NEWNSID = 0x58
+ RTM_NEWPREFIX = 0x34
+ RTM_NEWQDISC = 0x24
+ RTM_NEWROUTE = 0x18
+ RTM_NEWRULE = 0x20
+ RTM_NEWTCLASS = 0x28
+ RTM_NEWTFILTER = 0x2c
+ RTM_NR_FAMILIES = 0x13
+ RTM_NR_MSGTYPES = 0x4c
+ RTM_SETDCB = 0x4f
+ RTM_SETLINK = 0x13
+ RTM_SETNEIGHTBL = 0x43
+ RTNH_ALIGNTO = 0x4
+ RTNH_COMPARE_MASK = 0x11
+ RTNH_F_DEAD = 0x1
+ RTNH_F_LINKDOWN = 0x10
+ RTNH_F_OFFLOAD = 0x8
+ RTNH_F_ONLINK = 0x4
+ RTNH_F_PERVASIVE = 0x2
+ RTN_MAX = 0xb
+ RTPROT_BABEL = 0x2a
+ RTPROT_BIRD = 0xc
+ RTPROT_BOOT = 0x3
+ RTPROT_DHCP = 0x10
+ RTPROT_DNROUTED = 0xd
+ RTPROT_GATED = 0x8
+ RTPROT_KERNEL = 0x2
+ RTPROT_MROUTED = 0x11
+ RTPROT_MRT = 0xa
+ RTPROT_NTK = 0xf
+ RTPROT_RA = 0x9
+ RTPROT_REDIRECT = 0x1
+ RTPROT_STATIC = 0x4
+ RTPROT_UNSPEC = 0x0
+ RTPROT_XORP = 0xe
+ RTPROT_ZEBRA = 0xb
+ RT_CLASS_DEFAULT = 0xfd
+ RT_CLASS_LOCAL = 0xff
+ RT_CLASS_MAIN = 0xfe
+ RT_CLASS_MAX = 0xff
+ RT_CLASS_UNSPEC = 0x0
+ RUSAGE_CHILDREN = -0x1
+ RUSAGE_SELF = 0x0
+ RUSAGE_THREAD = 0x1
+ SCM_CREDENTIALS = 0x2
+ SCM_RIGHTS = 0x1
+ SCM_TIMESTAMP = 0x1d
+ SCM_TIMESTAMPING = 0x25
+ SCM_TIMESTAMPNS = 0x23
+ SCM_WIFI_STATUS = 0x29
+ SHUT_RD = 0x0
+ SHUT_RDWR = 0x2
+ SHUT_WR = 0x1
+ SIOCADDDLCI = 0x8980
+ SIOCADDMULTI = 0x8931
+ SIOCADDRT = 0x890b
+ SIOCATMARK = 0x8905
+ SIOCDARP = 0x8953
+ SIOCDELDLCI = 0x8981
+ SIOCDELMULTI = 0x8932
+ SIOCDELRT = 0x890c
+ SIOCDEVPRIVATE = 0x89f0
+ SIOCDIFADDR = 0x8936
+ SIOCDRARP = 0x8960
+ SIOCGARP = 0x8954
+ SIOCGIFADDR = 0x8915
+ SIOCGIFBR = 0x8940
+ SIOCGIFBRDADDR = 0x8919
+ SIOCGIFCONF = 0x8912
+ SIOCGIFCOUNT = 0x8938
+ SIOCGIFDSTADDR = 0x8917
+ SIOCGIFENCAP = 0x8925
+ SIOCGIFFLAGS = 0x8913
+ SIOCGIFHWADDR = 0x8927
+ SIOCGIFINDEX = 0x8933
+ SIOCGIFMAP = 0x8970
+ SIOCGIFMEM = 0x891f
+ SIOCGIFMETRIC = 0x891d
+ SIOCGIFMTU = 0x8921
+ SIOCGIFNAME = 0x8910
+ SIOCGIFNETMASK = 0x891b
+ SIOCGIFPFLAGS = 0x8935
+ SIOCGIFSLAVE = 0x8929
+ SIOCGIFTXQLEN = 0x8942
+ SIOCGPGRP = 0x8904
+ SIOCGRARP = 0x8961
+ SIOCGSTAMP = 0x8906
+ SIOCGSTAMPNS = 0x8907
+ SIOCPROTOPRIVATE = 0x89e0
+ SIOCRTMSG = 0x890d
+ SIOCSARP = 0x8955
+ SIOCSIFADDR = 0x8916
+ SIOCSIFBR = 0x8941
+ SIOCSIFBRDADDR = 0x891a
+ SIOCSIFDSTADDR = 0x8918
+ SIOCSIFENCAP = 0x8926
+ SIOCSIFFLAGS = 0x8914
+ SIOCSIFHWADDR = 0x8924
+ SIOCSIFHWBROADCAST = 0x8937
+ SIOCSIFLINK = 0x8911
+ SIOCSIFMAP = 0x8971
+ SIOCSIFMEM = 0x8920
+ SIOCSIFMETRIC = 0x891e
+ SIOCSIFMTU = 0x8922
+ SIOCSIFNAME = 0x8923
+ SIOCSIFNETMASK = 0x891c
+ SIOCSIFPFLAGS = 0x8934
+ SIOCSIFSLAVE = 0x8930
+ SIOCSIFTXQLEN = 0x8943
+ SIOCSPGRP = 0x8902
+ SIOCSRARP = 0x8962
+ SOCK_CLOEXEC = 0x80000
+ SOCK_DCCP = 0x6
+ SOCK_DGRAM = 0x2
+ SOCK_NONBLOCK = 0x800
+ SOCK_PACKET = 0xa
+ SOCK_RAW = 0x3
+ SOCK_RDM = 0x4
+ SOCK_SEQPACKET = 0x5
+ SOCK_STREAM = 0x1
+ SOL_AAL = 0x109
+ SOL_ATM = 0x108
+ SOL_DECNET = 0x105
+ SOL_ICMPV6 = 0x3a
+ SOL_IP = 0x0
+ SOL_IPV6 = 0x29
+ SOL_IRDA = 0x10a
+ SOL_PACKET = 0x107
+ SOL_RAW = 0xff
+ SOL_SOCKET = 0x1
+ SOL_TCP = 0x6
+ SOL_X25 = 0x106
+ SOMAXCONN = 0x80
+ SO_ACCEPTCONN = 0x1e
+ SO_ATTACH_BPF = 0x32
+ SO_ATTACH_FILTER = 0x1a
+ SO_BINDTODEVICE = 0x19
+ SO_BPF_EXTENSIONS = 0x30
+ SO_BROADCAST = 0x6
+ SO_BSDCOMPAT = 0xe
+ SO_BUSY_POLL = 0x2e
+ SO_DEBUG = 0x1
+ SO_DETACH_BPF = 0x1b
+ SO_DETACH_FILTER = 0x1b
+ SO_DOMAIN = 0x27
+ SO_DONTROUTE = 0x5
+ SO_ERROR = 0x4
+ SO_GET_FILTER = 0x1a
+ SO_INCOMING_CPU = 0x31
+ SO_KEEPALIVE = 0x9
+ SO_LINGER = 0xd
+ SO_LOCK_FILTER = 0x2c
+ SO_MARK = 0x24
+ SO_MAX_PACING_RATE = 0x2f
+ SO_NOFCS = 0x2b
+ SO_NO_CHECK = 0xb
+ SO_OOBINLINE = 0xa
+ SO_PASSCRED = 0x10
+ SO_PASSSEC = 0x22
+ SO_PEEK_OFF = 0x2a
+ SO_PEERCRED = 0x11
+ SO_PEERNAME = 0x1c
+ SO_PEERSEC = 0x1f
+ SO_PRIORITY = 0xc
+ SO_PROTOCOL = 0x26
+ SO_RCVBUF = 0x8
+ SO_RCVBUFFORCE = 0x21
+ SO_RCVLOWAT = 0x12
+ SO_RCVTIMEO = 0x14
+ SO_REUSEADDR = 0x2
+ SO_REUSEPORT = 0xf
+ SO_RXQ_OVFL = 0x28
+ SO_SECURITY_AUTHENTICATION = 0x16
+ SO_SECURITY_ENCRYPTION_NETWORK = 0x18
+ SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17
+ SO_SELECT_ERR_QUEUE = 0x2d
+ SO_SNDBUF = 0x7
+ SO_SNDBUFFORCE = 0x20
+ SO_SNDLOWAT = 0x13
+ SO_SNDTIMEO = 0x15
+ SO_TIMESTAMP = 0x1d
+ SO_TIMESTAMPING = 0x25
+ SO_TIMESTAMPNS = 0x23
+ SO_TYPE = 0x3
+ SO_WIFI_STATUS = 0x29
+ S_BLKSIZE = 0x200
+ S_IEXEC = 0x40
+ S_IFBLK = 0x6000
+ S_IFCHR = 0x2000
+ S_IFDIR = 0x4000
+ S_IFIFO = 0x1000
+ S_IFLNK = 0xa000
+ S_IFMT = 0xf000
+ S_IFREG = 0x8000
+ S_IFSOCK = 0xc000
+ S_IREAD = 0x100
+ S_IRGRP = 0x20
+ S_IROTH = 0x4
+ S_IRUSR = 0x100
+ S_IRWXG = 0x38
+ S_IRWXO = 0x7
+ S_IRWXU = 0x1c0
+ S_ISGID = 0x400
+ S_ISUID = 0x800
+ S_ISVTX = 0x200
+ S_IWGRP = 0x10
+ S_IWOTH = 0x2
+ S_IWRITE = 0x80
+ S_IWUSR = 0x80
+ S_IXGRP = 0x8
+ S_IXOTH = 0x1
+ S_IXUSR = 0x40
+ TAB0 = 0x0
+ TAB1 = 0x800
+ TAB2 = 0x1000
+ TAB3 = 0x1800
+ TABDLY = 0x1800
+ TCFLSH = 0x540b
+ TCGETA = 0x5405
+ TCGETS = 0x5401
+ TCGETS2 = 0x802c542a
+ TCGETX = 0x5432
+ TCIFLUSH = 0x0
+ TCIOFF = 0x2
+ TCIOFLUSH = 0x2
+ TCION = 0x3
+ TCOFLUSH = 0x1
+ TCOOFF = 0x0
+ TCOON = 0x1
+ TCP_CC_INFO = 0x1a
+ TCP_CONGESTION = 0xd
+ TCP_COOKIE_IN_ALWAYS = 0x1
+ TCP_COOKIE_MAX = 0x10
+ TCP_COOKIE_MIN = 0x8
+ TCP_COOKIE_OUT_NEVER = 0x2
+ TCP_COOKIE_PAIR_SIZE = 0x20
+ TCP_COOKIE_TRANSACTIONS = 0xf
+ TCP_CORK = 0x3
+ TCP_DEFER_ACCEPT = 0x9
+ TCP_FASTOPEN = 0x17
+ TCP_INFO = 0xb
+ TCP_KEEPCNT = 0x6
+ TCP_KEEPIDLE = 0x4
+ TCP_KEEPINTVL = 0x5
+ TCP_LINGER2 = 0x8
+ TCP_MAXSEG = 0x2
+ TCP_MAXWIN = 0xffff
+ TCP_MAX_WINSHIFT = 0xe
+ TCP_MD5SIG = 0xe
+ TCP_MD5SIG_MAXKEYLEN = 0x50
+ TCP_MSS = 0x200
+ TCP_MSS_DEFAULT = 0x218
+ TCP_MSS_DESIRED = 0x4c4
+ TCP_NODELAY = 0x1
+ TCP_NOTSENT_LOWAT = 0x19
+ TCP_QUEUE_SEQ = 0x15
+ TCP_QUICKACK = 0xc
+ TCP_REPAIR = 0x13
+ TCP_REPAIR_OPTIONS = 0x16
+ TCP_REPAIR_QUEUE = 0x14
+ TCP_SAVED_SYN = 0x1c
+ TCP_SAVE_SYN = 0x1b
+ TCP_SYNCNT = 0x7
+ TCP_S_DATA_IN = 0x4
+ TCP_S_DATA_OUT = 0x8
+ TCP_THIN_DUPACK = 0x11
+ TCP_THIN_LINEAR_TIMEOUTS = 0x10
+ TCP_TIMESTAMP = 0x18
+ TCP_USER_TIMEOUT = 0x12
+ TCP_WINDOW_CLAMP = 0xa
+ TCSAFLUSH = 0x2
+ TCSBRK = 0x5409
+ TCSBRKP = 0x5425
+ TCSETA = 0x5406
+ TCSETAF = 0x5408
+ TCSETAW = 0x5407
+ TCSETS = 0x5402
+ TCSETS2 = 0x402c542b
+ TCSETSF = 0x5404
+ TCSETSF2 = 0x402c542d
+ TCSETSW = 0x5403
+ TCSETSW2 = 0x402c542c
+ TCSETX = 0x5433
+ TCSETXF = 0x5434
+ TCSETXW = 0x5435
+ TCXONC = 0x540a
+ TIOCCBRK = 0x5428
+ TIOCCONS = 0x541d
+ TIOCEXCL = 0x540c
+ TIOCGDEV = 0x80045432
+ TIOCGETD = 0x5424
+ TIOCGEXCL = 0x80045440
+ TIOCGICOUNT = 0x545d
+ TIOCGLCKTRMIOS = 0x5456
+ TIOCGPGRP = 0x540f
+ TIOCGPKT = 0x80045438
+ TIOCGPTLCK = 0x80045439
+ TIOCGPTN = 0x80045430
+ TIOCGRS485 = 0x542e
+ TIOCGSERIAL = 0x541e
+ TIOCGSID = 0x5429
+ TIOCGSOFTCAR = 0x5419
+ TIOCGWINSZ = 0x5413
+ TIOCINQ = 0x541b
+ TIOCLINUX = 0x541c
+ TIOCMBIC = 0x5417
+ TIOCMBIS = 0x5416
+ TIOCMGET = 0x5415
+ TIOCMIWAIT = 0x545c
+ TIOCMSET = 0x5418
+ TIOCM_CAR = 0x40
+ TIOCM_CD = 0x40
+ TIOCM_CTS = 0x20
+ TIOCM_DSR = 0x100
+ TIOCM_DTR = 0x2
+ TIOCM_LE = 0x1
+ TIOCM_RI = 0x80
+ TIOCM_RNG = 0x80
+ TIOCM_RTS = 0x4
+ TIOCM_SR = 0x10
+ TIOCM_ST = 0x8
+ TIOCNOTTY = 0x5422
+ TIOCNXCL = 0x540d
+ TIOCOUTQ = 0x5411
+ TIOCPKT = 0x5420
+ TIOCPKT_DATA = 0x0
+ TIOCPKT_DOSTOP = 0x20
+ TIOCPKT_FLUSHREAD = 0x1
+ TIOCPKT_FLUSHWRITE = 0x2
+ TIOCPKT_IOCTL = 0x40
+ TIOCPKT_NOSTOP = 0x10
+ TIOCPKT_START = 0x8
+ TIOCPKT_STOP = 0x4
+ TIOCSBRK = 0x5427
+ TIOCSCTTY = 0x540e
+ TIOCSERCONFIG = 0x5453
+ TIOCSERGETLSR = 0x5459
+ TIOCSERGETMULTI = 0x545a
+ TIOCSERGSTRUCT = 0x5458
+ TIOCSERGWILD = 0x5454
+ TIOCSERSETMULTI = 0x545b
+ TIOCSERSWILD = 0x5455
+ TIOCSER_TEMT = 0x1
+ TIOCSETD = 0x5423
+ TIOCSIG = 0x40045436
+ TIOCSLCKTRMIOS = 0x5457
+ TIOCSPGRP = 0x5410
+ TIOCSPTLCK = 0x40045431
+ TIOCSRS485 = 0x542f
+ TIOCSSERIAL = 0x541f
+ TIOCSSOFTCAR = 0x541a
+ TIOCSTI = 0x5412
+ TIOCSWINSZ = 0x5414
+ TIOCVHANGUP = 0x5437
+ TOSTOP = 0x100
+ TUNATTACHFILTER = 0x401054d5
+ TUNDETACHFILTER = 0x401054d6
+ TUNGETFEATURES = 0x800454cf
+ TUNGETFILTER = 0x801054db
+ TUNGETIFF = 0x800454d2
+ TUNGETSNDBUF = 0x800454d3
+ TUNGETVNETBE = 0x800454df
+ TUNGETVNETHDRSZ = 0x800454d7
+ TUNGETVNETLE = 0x800454dd
+ TUNSETDEBUG = 0x400454c9
+ TUNSETGROUP = 0x400454ce
+ TUNSETIFF = 0x400454ca
+ TUNSETIFINDEX = 0x400454da
+ TUNSETLINK = 0x400454cd
+ TUNSETNOCSUM = 0x400454c8
+ TUNSETOFFLOAD = 0x400454d0
+ TUNSETOWNER = 0x400454cc
+ TUNSETPERSIST = 0x400454cb
+ TUNSETQUEUE = 0x400454d9
+ TUNSETSNDBUF = 0x400454d4
+ TUNSETTXFILTER = 0x400454d1
+ TUNSETVNETBE = 0x400454de
+ TUNSETVNETHDRSZ = 0x400454d8
+ TUNSETVNETLE = 0x400454dc
+ VDISCARD = 0xd
+ VEOF = 0x4
+ VEOL = 0xb
+ VEOL2 = 0x10
+ VERASE = 0x2
+ VINTR = 0x0
+ VKILL = 0x3
+ VLNEXT = 0xf
+ VMIN = 0x6
+ VQUIT = 0x1
+ VREPRINT = 0xc
+ VSTART = 0x8
+ VSTOP = 0x9
+ VSUSP = 0xa
+ VSWTC = 0x7
+ VT0 = 0x0
+ VT1 = 0x4000
+ VTDLY = 0x4000
+ VTIME = 0x5
+ VWERASE = 0xe
+ WALL = 0x40000000
+ WCLONE = 0x80000000
+ WCONTINUED = 0x8
+ WEXITED = 0x4
+ WNOHANG = 0x1
+ WNOTHREAD = 0x20000000
+ WNOWAIT = 0x1000000
+ WORDSIZE = 0x40
+ WSTOPPED = 0x2
+ WUNTRACED = 0x2
+ XCASE = 0x4
+ XTABS = 0x1800
+)
+
+// Errors
+const (
+ E2BIG = syscall.Errno(0x7)
+ EACCES = syscall.Errno(0xd)
+ EADDRINUSE = syscall.Errno(0x62)
+ EADDRNOTAVAIL = syscall.Errno(0x63)
+ EADV = syscall.Errno(0x44)
+ EAFNOSUPPORT = syscall.Errno(0x61)
+ EAGAIN = syscall.Errno(0xb)
+ EALREADY = syscall.Errno(0x72)
+ EBADE = syscall.Errno(0x34)
+ EBADF = syscall.Errno(0x9)
+ EBADFD = syscall.Errno(0x4d)
+ EBADMSG = syscall.Errno(0x4a)
+ EBADR = syscall.Errno(0x35)
+ EBADRQC = syscall.Errno(0x38)
+ EBADSLT = syscall.Errno(0x39)
+ EBFONT = syscall.Errno(0x3b)
+ EBUSY = syscall.Errno(0x10)
+ ECANCELED = syscall.Errno(0x7d)
+ ECHILD = syscall.Errno(0xa)
+ ECHRNG = syscall.Errno(0x2c)
+ ECOMM = syscall.Errno(0x46)
+ ECONNABORTED = syscall.Errno(0x67)
+ ECONNREFUSED = syscall.Errno(0x6f)
+ ECONNRESET = syscall.Errno(0x68)
+ EDEADLK = syscall.Errno(0x23)
+ EDEADLOCK = syscall.Errno(0x23)
+ EDESTADDRREQ = syscall.Errno(0x59)
+ EDOM = syscall.Errno(0x21)
+ EDOTDOT = syscall.Errno(0x49)
+ EDQUOT = syscall.Errno(0x7a)
+ EEXIST = syscall.Errno(0x11)
+ EFAULT = syscall.Errno(0xe)
+ EFBIG = syscall.Errno(0x1b)
+ EHOSTDOWN = syscall.Errno(0x70)
+ EHOSTUNREACH = syscall.Errno(0x71)
+ EHWPOISON = syscall.Errno(0x85)
+ EIDRM = syscall.Errno(0x2b)
+ EILSEQ = syscall.Errno(0x54)
+ EINPROGRESS = syscall.Errno(0x73)
+ EINTR = syscall.Errno(0x4)
+ EINVAL = syscall.Errno(0x16)
+ EIO = syscall.Errno(0x5)
+ EISCONN = syscall.Errno(0x6a)
+ EISDIR = syscall.Errno(0x15)
+ EISNAM = syscall.Errno(0x78)
+ EKEYEXPIRED = syscall.Errno(0x7f)
+ EKEYREJECTED = syscall.Errno(0x81)
+ EKEYREVOKED = syscall.Errno(0x80)
+ EL2HLT = syscall.Errno(0x33)
+ EL2NSYNC = syscall.Errno(0x2d)
+ EL3HLT = syscall.Errno(0x2e)
+ EL3RST = syscall.Errno(0x2f)
+ ELIBACC = syscall.Errno(0x4f)
+ ELIBBAD = syscall.Errno(0x50)
+ ELIBEXEC = syscall.Errno(0x53)
+ ELIBMAX = syscall.Errno(0x52)
+ ELIBSCN = syscall.Errno(0x51)
+ ELNRNG = syscall.Errno(0x30)
+ ELOOP = syscall.Errno(0x28)
+ EMEDIUMTYPE = syscall.Errno(0x7c)
+ EMFILE = syscall.Errno(0x18)
+ EMLINK = syscall.Errno(0x1f)
+ EMSGSIZE = syscall.Errno(0x5a)
+ EMULTIHOP = syscall.Errno(0x48)
+ ENAMETOOLONG = syscall.Errno(0x24)
+ ENAVAIL = syscall.Errno(0x77)
+ ENETDOWN = syscall.Errno(0x64)
+ ENETRESET = syscall.Errno(0x66)
+ ENETUNREACH = syscall.Errno(0x65)
+ ENFILE = syscall.Errno(0x17)
+ ENOANO = syscall.Errno(0x37)
+ ENOBUFS = syscall.Errno(0x69)
+ ENOCSI = syscall.Errno(0x32)
+ ENODATA = syscall.Errno(0x3d)
+ ENODEV = syscall.Errno(0x13)
+ ENOENT = syscall.Errno(0x2)
+ ENOEXEC = syscall.Errno(0x8)
+ ENOKEY = syscall.Errno(0x7e)
+ ENOLCK = syscall.Errno(0x25)
+ ENOLINK = syscall.Errno(0x43)
+ ENOMEDIUM = syscall.Errno(0x7b)
+ ENOMEM = syscall.Errno(0xc)
+ ENOMSG = syscall.Errno(0x2a)
+ ENONET = syscall.Errno(0x40)
+ ENOPKG = syscall.Errno(0x41)
+ ENOPROTOOPT = syscall.Errno(0x5c)
+ ENOSPC = syscall.Errno(0x1c)
+ ENOSR = syscall.Errno(0x3f)
+ ENOSTR = syscall.Errno(0x3c)
+ ENOSYS = syscall.Errno(0x26)
+ ENOTBLK = syscall.Errno(0xf)
+ ENOTCONN = syscall.Errno(0x6b)
+ ENOTDIR = syscall.Errno(0x14)
+ ENOTEMPTY = syscall.Errno(0x27)
+ ENOTNAM = syscall.Errno(0x76)
+ ENOTRECOVERABLE = syscall.Errno(0x83)
+ ENOTSOCK = syscall.Errno(0x58)
+ ENOTSUP = syscall.Errno(0x5f)
+ ENOTTY = syscall.Errno(0x19)
+ ENOTUNIQ = syscall.Errno(0x4c)
+ ENXIO = syscall.Errno(0x6)
+ EOPNOTSUPP = syscall.Errno(0x5f)
+ EOVERFLOW = syscall.Errno(0x4b)
+ EOWNERDEAD = syscall.Errno(0x82)
+ EPERM = syscall.Errno(0x1)
+ EPFNOSUPPORT = syscall.Errno(0x60)
+ EPIPE = syscall.Errno(0x20)
+ EPROTO = syscall.Errno(0x47)
+ EPROTONOSUPPORT = syscall.Errno(0x5d)
+ EPROTOTYPE = syscall.Errno(0x5b)
+ ERANGE = syscall.Errno(0x22)
+ EREMCHG = syscall.Errno(0x4e)
+ EREMOTE = syscall.Errno(0x42)
+ EREMOTEIO = syscall.Errno(0x79)
+ ERESTART = syscall.Errno(0x55)
+ ERFKILL = syscall.Errno(0x84)
+ EROFS = syscall.Errno(0x1e)
+ ESHUTDOWN = syscall.Errno(0x6c)
+ ESOCKTNOSUPPORT = syscall.Errno(0x5e)
+ ESPIPE = syscall.Errno(0x1d)
+ ESRCH = syscall.Errno(0x3)
+ ESRMNT = syscall.Errno(0x45)
+ ESTALE = syscall.Errno(0x74)
+ ESTRPIPE = syscall.Errno(0x56)
+ ETIME = syscall.Errno(0x3e)
+ ETIMEDOUT = syscall.Errno(0x6e)
+ ETOOMANYREFS = syscall.Errno(0x6d)
+ ETXTBSY = syscall.Errno(0x1a)
+ EUCLEAN = syscall.Errno(0x75)
+ EUNATCH = syscall.Errno(0x31)
+ EUSERS = syscall.Errno(0x57)
+ EWOULDBLOCK = syscall.Errno(0xb)
+ EXDEV = syscall.Errno(0x12)
+ EXFULL = syscall.Errno(0x36)
+)
+
+// Signals
+const (
+ SIGABRT = syscall.Signal(0x6)
+ SIGALRM = syscall.Signal(0xe)
+ SIGBUS = syscall.Signal(0x7)
+ SIGCHLD = syscall.Signal(0x11)
+ SIGCLD = syscall.Signal(0x11)
+ SIGCONT = syscall.Signal(0x12)
+ SIGFPE = syscall.Signal(0x8)
+ SIGHUP = syscall.Signal(0x1)
+ SIGILL = syscall.Signal(0x4)
+ SIGINT = syscall.Signal(0x2)
+ SIGIO = syscall.Signal(0x1d)
+ SIGIOT = syscall.Signal(0x6)
+ SIGKILL = syscall.Signal(0x9)
+ SIGPIPE = syscall.Signal(0xd)
+ SIGPOLL = syscall.Signal(0x1d)
+ SIGPROF = syscall.Signal(0x1b)
+ SIGPWR = syscall.Signal(0x1e)
+ SIGQUIT = syscall.Signal(0x3)
+ SIGSEGV = syscall.Signal(0xb)
+ SIGSTKFLT = syscall.Signal(0x10)
+ SIGSTOP = syscall.Signal(0x13)
+ SIGSYS = syscall.Signal(0x1f)
+ SIGTERM = syscall.Signal(0xf)
+ SIGTRAP = syscall.Signal(0x5)
+ SIGTSTP = syscall.Signal(0x14)
+ SIGTTIN = syscall.Signal(0x15)
+ SIGTTOU = syscall.Signal(0x16)
+ SIGUNUSED = syscall.Signal(0x1f)
+ SIGURG = syscall.Signal(0x17)
+ SIGUSR1 = syscall.Signal(0xa)
+ SIGUSR2 = syscall.Signal(0xc)
+ SIGVTALRM = syscall.Signal(0x1a)
+ SIGWINCH = syscall.Signal(0x1c)
+ SIGXCPU = syscall.Signal(0x18)
+ SIGXFSZ = syscall.Signal(0x19)
+)
+
+// Error table
+var errors = [...]string{
+ 1: "operation not permitted",
+ 2: "no such file or directory",
+ 3: "no such process",
+ 4: "interrupted system call",
+ 5: "input/output error",
+ 6: "no such device or address",
+ 7: "argument list too long",
+ 8: "exec format error",
+ 9: "bad file descriptor",
+ 10: "no child processes",
+ 11: "resource temporarily unavailable",
+ 12: "cannot allocate memory",
+ 13: "permission denied",
+ 14: "bad address",
+ 15: "block device required",
+ 16: "device or resource busy",
+ 17: "file exists",
+ 18: "invalid cross-device link",
+ 19: "no such device",
+ 20: "not a directory",
+ 21: "is a directory",
+ 22: "invalid argument",
+ 23: "too many open files in system",
+ 24: "too many open files",
+ 25: "inappropriate ioctl for device",
+ 26: "text file busy",
+ 27: "file too large",
+ 28: "no space left on device",
+ 29: "illegal seek",
+ 30: "read-only file system",
+ 31: "too many links",
+ 32: "broken pipe",
+ 33: "numerical argument out of domain",
+ 34: "numerical result out of range",
+ 35: "resource deadlock avoided",
+ 36: "file name too long",
+ 37: "no locks available",
+ 38: "function not implemented",
+ 39: "directory not empty",
+ 40: "too many levels of symbolic links",
+ 42: "no message of desired type",
+ 43: "identifier removed",
+ 44: "channel number out of range",
+ 45: "level 2 not synchronized",
+ 46: "level 3 halted",
+ 47: "level 3 reset",
+ 48: "link number out of range",
+ 49: "protocol driver not attached",
+ 50: "no CSI structure available",
+ 51: "level 2 halted",
+ 52: "invalid exchange",
+ 53: "invalid request descriptor",
+ 54: "exchange full",
+ 55: "no anode",
+ 56: "invalid request code",
+ 57: "invalid slot",
+ 59: "bad font file format",
+ 60: "device not a stream",
+ 61: "no data available",
+ 62: "timer expired",
+ 63: "out of streams resources",
+ 64: "machine is not on the network",
+ 65: "package not installed",
+ 66: "object is remote",
+ 67: "link has been severed",
+ 68: "advertise error",
+ 69: "srmount error",
+ 70: "communication error on send",
+ 71: "protocol error",
+ 72: "multihop attempted",
+ 73: "RFS specific error",
+ 74: "bad message",
+ 75: "value too large for defined data type",
+ 76: "name not unique on network",
+ 77: "file descriptor in bad state",
+ 78: "remote address changed",
+ 79: "can not access a needed shared library",
+ 80: "accessing a corrupted shared library",
+ 81: ".lib section in a.out corrupted",
+ 82: "attempting to link in too many shared libraries",
+ 83: "cannot exec a shared library directly",
+ 84: "invalid or incomplete multibyte or wide character",
+ 85: "interrupted system call should be restarted",
+ 86: "streams pipe error",
+ 87: "too many users",
+ 88: "socket operation on non-socket",
+ 89: "destination address required",
+ 90: "message too long",
+ 91: "protocol wrong type for socket",
+ 92: "protocol not available",
+ 93: "protocol not supported",
+ 94: "socket type not supported",
+ 95: "operation not supported",
+ 96: "protocol family not supported",
+ 97: "address family not supported by protocol",
+ 98: "address already in use",
+ 99: "cannot assign requested address",
+ 100: "network is down",
+ 101: "network is unreachable",
+ 102: "network dropped connection on reset",
+ 103: "software caused connection abort",
+ 104: "connection reset by peer",
+ 105: "no buffer space available",
+ 106: "transport endpoint is already connected",
+ 107: "transport endpoint is not connected",
+ 108: "cannot send after transport endpoint shutdown",
+ 109: "too many references: cannot splice",
+ 110: "connection timed out",
+ 111: "connection refused",
+ 112: "host is down",
+ 113: "no route to host",
+ 114: "operation already in progress",
+ 115: "operation now in progress",
+ 116: "stale file handle",
+ 117: "structure needs cleaning",
+ 118: "not a XENIX named type file",
+ 119: "no XENIX semaphores available",
+ 120: "is a named type file",
+ 121: "remote I/O error",
+ 122: "disk quota exceeded",
+ 123: "no medium found",
+ 124: "wrong medium type",
+ 125: "operation canceled",
+ 126: "required key not available",
+ 127: "key has expired",
+ 128: "key has been revoked",
+ 129: "key was rejected by service",
+ 130: "owner died",
+ 131: "state not recoverable",
+ 132: "operation not possible due to RF-kill",
+ 133: "memory page has hardware error",
+}
+
+// Signal table
+var signals = [...]string{
+ 1: "hangup",
+ 2: "interrupt",
+ 3: "quit",
+ 4: "illegal instruction",
+ 5: "trace/breakpoint trap",
+ 6: "aborted",
+ 7: "bus error",
+ 8: "floating point exception",
+ 9: "killed",
+ 10: "user defined signal 1",
+ 11: "segmentation fault",
+ 12: "user defined signal 2",
+ 13: "broken pipe",
+ 14: "alarm clock",
+ 15: "terminated",
+ 16: "stack fault",
+ 17: "child exited",
+ 18: "continued",
+ 19: "stopped (signal)",
+ 20: "stopped",
+ 21: "stopped (tty input)",
+ 22: "stopped (tty output)",
+ 23: "urgent I/O condition",
+ 24: "CPU time limit exceeded",
+ 25: "file size limit exceeded",
+ 26: "virtual timer expired",
+ 27: "profiling timer expired",
+ 28: "window changed",
+ 29: "I/O possible",
+ 30: "power failure",
+ 31: "bad system call",
+}
diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.go b/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.go
index a15aaf120..031034a34 100644
--- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.go
+++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.go
@@ -222,6 +222,7 @@ func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr)
_p0 = unsafe.Pointer(&_zero)
}
_, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen))
+ use(_p0)
if e1 != 0 {
err = errnoErr(e1)
}
diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go
index 74606b2f4..ee96f78ba 100644
--- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go
+++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go
@@ -222,6 +222,7 @@ func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr)
_p0 = unsafe.Pointer(&_zero)
}
_, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen))
+ use(_p0)
if e1 != 0 {
err = errnoErr(e1)
}
diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.go b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.go
index 640e85426..e52cd0d54 100644
--- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.go
+++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.go
@@ -222,6 +222,7 @@ func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr)
_p0 = unsafe.Pointer(&_zero)
}
_, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen))
+ use(_p0)
if e1 != 0 {
err = errnoErr(e1)
}
diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go
index 933f67bbf..9863ef99e 100644
--- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go
+++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go
@@ -222,6 +222,7 @@ func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr)
_p0 = unsafe.Pointer(&_zero)
}
_, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen))
+ use(_p0)
if e1 != 0 {
err = errnoErr(e1)
}
diff --git a/vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go
index 3fa6ff796..78de48dcf 100644
--- a/vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go
+++ b/vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go
@@ -222,6 +222,7 @@ func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr)
_p0 = unsafe.Pointer(&_zero)
}
_, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen))
+ use(_p0)
if e1 != 0 {
err = errnoErr(e1)
}
diff --git a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go
index 1a0e528cd..fade994dc 100644
--- a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go
+++ b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go
@@ -222,6 +222,7 @@ func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr)
_p0 = unsafe.Pointer(&_zero)
}
_, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen))
+ use(_p0)
if e1 != 0 {
err = errnoErr(e1)
}
diff --git a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go
index 6e4cf1455..c28281e83 100644
--- a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go
+++ b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go
@@ -222,6 +222,7 @@ func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr)
_p0 = unsafe.Pointer(&_zero)
}
_, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen))
+ use(_p0)
if e1 != 0 {
err = errnoErr(e1)
}
diff --git a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go
index 1872d3230..a18ba5c88 100644
--- a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go
+++ b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go
@@ -222,6 +222,7 @@ func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr)
_p0 = unsafe.Pointer(&_zero)
}
_, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen))
+ use(_p0)
if e1 != 0 {
err = errnoErr(e1)
}
diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go
index 749f3e46e..1f7a75669 100644
--- a/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go
+++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go
@@ -53,6 +53,17 @@ func openat(dirfd int, path string, flags int, mode uint32) (fd int, err error)
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) {
+ r0, _, e1 := Syscall6(SYS_PPOLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0)
+ n = int(r0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
func readlinkat(dirfd int, path string, buf []byte) (n int, err error) {
var _p0 *byte
_p0, err = BytePtrFromString(path)
@@ -1636,3 +1647,14 @@ func Utime(path string, buf *Utimbuf) (err error) {
}
return
}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func poll(fds *PollFd, nfds int, timeout int) (n int, err error) {
+ r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout))
+ n = int(r0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go
index 1096aa544..b4e24fc0a 100644
--- a/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go
+++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go
@@ -53,6 +53,17 @@ func openat(dirfd int, path string, flags int, mode uint32) (fd int, err error)
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) {
+ r0, _, e1 := Syscall6(SYS_PPOLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0)
+ n = int(r0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
func readlinkat(dirfd int, path string, buf []byte) (n int, err error) {
var _p0 *byte
_p0, err = BytePtrFromString(path)
@@ -1830,3 +1841,14 @@ func pipe2(p *[2]_C_int, flags int) (err error) {
}
return
}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func poll(fds *PollFd, nfds int, timeout int) (n int, err error) {
+ r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout))
+ n = int(r0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go
index 9066e1cb7..20bf33ce5 100644
--- a/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go
+++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go
@@ -53,6 +53,17 @@ func openat(dirfd int, path string, flags int, mode uint32) (fd int, err error)
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) {
+ r0, _, e1 := Syscall6(SYS_PPOLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0)
+ n = int(r0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
func readlinkat(dirfd int, path string, buf []byte) (n int, err error) {
var _p0 *byte
_p0, err = BytePtrFromString(path)
@@ -1737,3 +1748,14 @@ func setrlimit(resource int, rlim *rlimit32) (err error) {
}
return
}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func poll(fds *PollFd, nfds int, timeout int) (n int, err error) {
+ r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout))
+ n = int(r0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go
index 5b9161226..c7286db48 100644
--- a/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go
+++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go
@@ -53,6 +53,17 @@ func openat(dirfd int, path string, flags int, mode uint32) (fd int, err error)
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) {
+ r0, _, e1 := Syscall6(SYS_PPOLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0)
+ n = int(r0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
func readlinkat(dirfd int, path string, buf []byte) (n int, err error) {
var _p0 *byte
_p0, err = BytePtrFromString(path)
diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go
index 738c83091..b709ed2f5 100644
--- a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go
+++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go
@@ -53,6 +53,17 @@ func openat(dirfd int, path string, flags int, mode uint32) (fd int, err error)
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) {
+ r0, _, e1 := Syscall6(SYS_PPOLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0)
+ n = int(r0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
func readlinkat(dirfd int, path string, buf []byte) (n int, err error) {
var _p0 *byte
_p0, err = BytePtrFromString(path)
@@ -1779,3 +1790,14 @@ func stat(path string, st *stat_t) (err error) {
}
return
}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func poll(fds *PollFd, nfds int, timeout int) (n int, err error) {
+ r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout))
+ n = int(r0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go
index 2a0357832..5cb1c5671 100644
--- a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go
+++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go
@@ -53,6 +53,17 @@ func openat(dirfd int, path string, flags int, mode uint32) (fd int, err error)
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) {
+ r0, _, e1 := Syscall6(SYS_PPOLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0)
+ n = int(r0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
func readlinkat(dirfd int, path string, buf []byte) (n int, err error) {
var _p0 *byte
_p0, err = BytePtrFromString(path)
@@ -1779,3 +1790,14 @@ func stat(path string, st *stat_t) (err error) {
}
return
}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func poll(fds *PollFd, nfds int, timeout int) (n int, err error) {
+ r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout))
+ n = int(r0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go
index 4bd18dcee..873bb18f7 100644
--- a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go
+++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go
@@ -53,6 +53,17 @@ func openat(dirfd int, path string, flags int, mode uint32) (fd int, err error)
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) {
+ r0, _, e1 := Syscall6(SYS_PPOLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0)
+ n = int(r0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
func readlinkat(dirfd int, path string, buf []byte) (n int, err error) {
var _p0 *byte
_p0, err = BytePtrFromString(path)
@@ -1841,3 +1852,14 @@ func pipe2(p *[2]_C_int, flags int) (err error) {
}
return
}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func poll(fds *PollFd, nfds int, timeout int) (n int, err error) {
+ r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout))
+ n = int(r0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go
index fbb43516c..bf08835c5 100644
--- a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go
+++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go
@@ -53,6 +53,17 @@ func openat(dirfd int, path string, flags int, mode uint32) (fd int, err error)
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) {
+ r0, _, e1 := Syscall6(SYS_PPOLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0)
+ n = int(r0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
func readlinkat(dirfd int, path string, buf []byte) (n int, err error) {
var _p0 *byte
_p0, err = BytePtrFromString(path)
@@ -1841,3 +1852,14 @@ func pipe2(p *[2]_C_int, flags int) (err error) {
}
return
}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func poll(fds *PollFd, nfds int, timeout int) (n int, err error) {
+ r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout))
+ n = int(r0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go
new file mode 100644
index 000000000..dbaa53b98
--- /dev/null
+++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go
@@ -0,0 +1,1645 @@
+// mksyscall.pl syscall_linux.go syscall_linux_s390x.go
+// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT
+
+// +build s390x,linux
+
+package unix
+
+import (
+ "syscall"
+ "unsafe"
+)
+
+var _ syscall.Errno
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) {
+ var _p0 *byte
+ _p0, err = BytePtrFromString(oldpath)
+ if err != nil {
+ return
+ }
+ var _p1 *byte
+ _p1, err = BytePtrFromString(newpath)
+ if err != nil {
+ return
+ }
+ _, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0)
+ use(unsafe.Pointer(_p0))
+ use(unsafe.Pointer(_p1))
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) {
+ var _p0 *byte
+ _p0, err = BytePtrFromString(path)
+ if err != nil {
+ return
+ }
+ r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0)
+ use(unsafe.Pointer(_p0))
+ fd = int(r0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) {
+ r0, _, e1 := Syscall6(SYS_PPOLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0)
+ n = int(r0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func readlinkat(dirfd int, path string, buf []byte) (n int, err error) {
+ var _p0 *byte
+ _p0, err = BytePtrFromString(path)
+ if err != nil {
+ return
+ }
+ var _p1 unsafe.Pointer
+ if len(buf) > 0 {
+ _p1 = unsafe.Pointer(&buf[0])
+ } else {
+ _p1 = unsafe.Pointer(&_zero)
+ }
+ r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0)
+ use(unsafe.Pointer(_p0))
+ n = int(r0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func symlinkat(oldpath string, newdirfd int, newpath string) (err error) {
+ var _p0 *byte
+ _p0, err = BytePtrFromString(oldpath)
+ if err != nil {
+ return
+ }
+ var _p1 *byte
+ _p1, err = BytePtrFromString(newpath)
+ if err != nil {
+ return
+ }
+ _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)))
+ use(unsafe.Pointer(_p0))
+ use(unsafe.Pointer(_p1))
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func unlinkat(dirfd int, path string, flags int) (err error) {
+ var _p0 *byte
+ _p0, err = BytePtrFromString(path)
+ if err != nil {
+ return
+ }
+ _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags))
+ use(unsafe.Pointer(_p0))
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func utimes(path string, times *[2]Timeval) (err error) {
+ var _p0 *byte
+ _p0, err = BytePtrFromString(path)
+ if err != nil {
+ return
+ }
+ _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0)
+ use(unsafe.Pointer(_p0))
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) {
+ var _p0 *byte
+ _p0, err = BytePtrFromString(path)
+ if err != nil {
+ return
+ }
+ _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0)
+ use(unsafe.Pointer(_p0))
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func futimesat(dirfd int, path *byte, times *[2]Timeval) (err error) {
+ _, _, e1 := Syscall(SYS_FUTIMESAT, uintptr(dirfd), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(times)))
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func Getcwd(buf []byte) (n int, err error) {
+ var _p0 unsafe.Pointer
+ if len(buf) > 0 {
+ _p0 = unsafe.Pointer(&buf[0])
+ } else {
+ _p0 = unsafe.Pointer(&_zero)
+ }
+ r0, _, e1 := Syscall(SYS_GETCWD, uintptr(_p0), uintptr(len(buf)), 0)
+ n = int(r0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) {
+ r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0)
+ wpid = int(r0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) {
+ _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) {
+ var _p0 *byte
+ _p0, err = BytePtrFromString(arg)
+ if err != nil {
+ return
+ }
+ _, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0, 0)
+ use(unsafe.Pointer(_p0))
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func mount(source string, target string, fstype string, flags uintptr, data *byte) (err error) {
+ var _p0 *byte
+ _p0, err = BytePtrFromString(source)
+ if err != nil {
+ return
+ }
+ var _p1 *byte
+ _p1, err = BytePtrFromString(target)
+ if err != nil {
+ return
+ }
+ var _p2 *byte
+ _p2, err = BytePtrFromString(fstype)
+ if err != nil {
+ return
+ }
+ _, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0)
+ use(unsafe.Pointer(_p0))
+ use(unsafe.Pointer(_p1))
+ use(unsafe.Pointer(_p2))
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func Acct(path string) (err error) {
+ var _p0 *byte
+ _p0, err = BytePtrFromString(path)
+ if err != nil {
+ return
+ }
+ _, _, e1 := Syscall(SYS_ACCT, uintptr(unsafe.Pointer(_p0)), 0, 0)
+ use(unsafe.Pointer(_p0))
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func Adjtimex(buf *Timex) (state int, err error) {
+ r0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0)
+ state = int(r0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func Chdir(path string) (err error) {
+ var _p0 *byte
+ _p0, err = BytePtrFromString(path)
+ if err != nil {
+ return
+ }
+ _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0)
+ use(unsafe.Pointer(_p0))
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func Chroot(path string) (err error) {
+ var _p0 *byte
+ _p0, err = BytePtrFromString(path)
+ if err != nil {
+ return
+ }
+ _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0)
+ use(unsafe.Pointer(_p0))
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func ClockGettime(clockid int32, time *Timespec) (err error) {
+ _, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func Close(fd int) (err error) {
+ _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func Dup(oldfd int) (fd int, err error) {
+ r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0)
+ fd = int(r0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func Dup3(oldfd int, newfd int, flags int) (err error) {
+ _, _, e1 := Syscall(SYS_DUP3, uintptr(oldfd), uintptr(newfd), uintptr(flags))
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func EpollCreate(size int) (fd int, err error) {
+ r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 0, 0)
+ fd = int(r0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func EpollCreate1(flag int) (fd int, err error) {
+ r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE1, uintptr(flag), 0, 0)
+ fd = int(r0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) {
+ _, _, e1 := RawSyscall6(SYS_EPOLL_CTL, uintptr(epfd), uintptr(op), uintptr(fd), uintptr(unsafe.Pointer(event)), 0, 0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func Exit(code int) {
+ Syscall(SYS_EXIT_GROUP, uintptr(code), 0, 0)
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) {
+ var _p0 *byte
+ _p0, err = BytePtrFromString(path)
+ if err != nil {
+ return
+ }
+ _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0)
+ use(unsafe.Pointer(_p0))
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func Fallocate(fd int, mode uint32, off int64, len int64) (err error) {
+ _, _, e1 := Syscall6(SYS_FALLOCATE, uintptr(fd), uintptr(mode), uintptr(off), uintptr(len), 0, 0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func Fchdir(fd int) (err error) {
+ _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func Fchmod(fd int, mode uint32) (err error) {
+ _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) {
+ var _p0 *byte
+ _p0, err = BytePtrFromString(path)
+ if err != nil {
+ return
+ }
+ _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0)
+ use(unsafe.Pointer(_p0))
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) {
+ var _p0 *byte
+ _p0, err = BytePtrFromString(path)
+ if err != nil {
+ return
+ }
+ _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0)
+ use(unsafe.Pointer(_p0))
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func fcntl(fd int, cmd int, arg int) (val int, err error) {
+ r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg))
+ val = int(r0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func Fdatasync(fd int) (err error) {
+ _, _, e1 := Syscall(SYS_FDATASYNC, uintptr(fd), 0, 0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func Flock(fd int, how int) (err error) {
+ _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func Fsync(fd int) (err error) {
+ _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func Getdents(fd int, buf []byte) (n int, err error) {
+ var _p0 unsafe.Pointer
+ if len(buf) > 0 {
+ _p0 = unsafe.Pointer(&buf[0])
+ } else {
+ _p0 = unsafe.Pointer(&_zero)
+ }
+ r0, _, e1 := Syscall(SYS_GETDENTS64, uintptr(fd), uintptr(_p0), uintptr(len(buf)))
+ n = int(r0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func Getpgid(pid int) (pgid int, err error) {
+ r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0)
+ pgid = int(r0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func Getpid() (pid int) {
+ r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0)
+ pid = int(r0)
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func Getppid() (ppid int) {
+ r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0)
+ ppid = int(r0)
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func Getpriority(which int, who int) (prio int, err error) {
+ r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0)
+ prio = int(r0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func Getrusage(who int, rusage *Rusage) (err error) {
+ _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func Gettid() (tid int) {
+ r0, _, _ := RawSyscall(SYS_GETTID, 0, 0, 0)
+ tid = int(r0)
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func Getxattr(path string, attr string, dest []byte) (sz int, err error) {
+ var _p0 *byte
+ _p0, err = BytePtrFromString(path)
+ if err != nil {
+ return
+ }
+ var _p1 *byte
+ _p1, err = BytePtrFromString(attr)
+ if err != nil {
+ return
+ }
+ var _p2 unsafe.Pointer
+ if len(dest) > 0 {
+ _p2 = unsafe.Pointer(&dest[0])
+ } else {
+ _p2 = unsafe.Pointer(&_zero)
+ }
+ r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0)
+ use(unsafe.Pointer(_p0))
+ use(unsafe.Pointer(_p1))
+ sz = int(r0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error) {
+ var _p0 *byte
+ _p0, err = BytePtrFromString(pathname)
+ if err != nil {
+ return
+ }
+ r0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask))
+ use(unsafe.Pointer(_p0))
+ watchdesc = int(r0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func InotifyInit1(flags int) (fd int, err error) {
+ r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT1, uintptr(flags), 0, 0)
+ fd = int(r0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func InotifyRmWatch(fd int, watchdesc uint32) (success int, err error) {
+ r0, _, e1 := RawSyscall(SYS_INOTIFY_RM_WATCH, uintptr(fd), uintptr(watchdesc), 0)
+ success = int(r0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func Kill(pid int, sig syscall.Signal) (err error) {
+ _, _, e1 := RawSyscall(SYS_KILL, uintptr(pid), uintptr(sig), 0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func Klogctl(typ int, buf []byte) (n int, err error) {
+ var _p0 unsafe.Pointer
+ if len(buf) > 0 {
+ _p0 = unsafe.Pointer(&buf[0])
+ } else {
+ _p0 = unsafe.Pointer(&_zero)
+ }
+ r0, _, e1 := Syscall(SYS_SYSLOG, uintptr(typ), uintptr(_p0), uintptr(len(buf)))
+ n = int(r0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func Listxattr(path string, dest []byte) (sz int, err error) {
+ var _p0 *byte
+ _p0, err = BytePtrFromString(path)
+ if err != nil {
+ return
+ }
+ var _p1 unsafe.Pointer
+ if len(dest) > 0 {
+ _p1 = unsafe.Pointer(&dest[0])
+ } else {
+ _p1 = unsafe.Pointer(&_zero)
+ }
+ r0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest)))
+ use(unsafe.Pointer(_p0))
+ sz = int(r0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func Mkdirat(dirfd int, path string, mode uint32) (err error) {
+ var _p0 *byte
+ _p0, err = BytePtrFromString(path)
+ if err != nil {
+ return
+ }
+ _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode))
+ use(unsafe.Pointer(_p0))
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) {
+ var _p0 *byte
+ _p0, err = BytePtrFromString(path)
+ if err != nil {
+ return
+ }
+ _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0)
+ use(unsafe.Pointer(_p0))
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func Nanosleep(time *Timespec, leftover *Timespec) (err error) {
+ _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func PivotRoot(newroot string, putold string) (err error) {
+ var _p0 *byte
+ _p0, err = BytePtrFromString(newroot)
+ if err != nil {
+ return
+ }
+ var _p1 *byte
+ _p1, err = BytePtrFromString(putold)
+ if err != nil {
+ return
+ }
+ _, _, e1 := Syscall(SYS_PIVOT_ROOT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0)
+ use(unsafe.Pointer(_p0))
+ use(unsafe.Pointer(_p1))
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func prlimit(pid int, resource int, old *Rlimit, newlimit *Rlimit) (err error) {
+ _, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(newlimit)), 0, 0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) {
+ _, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func read(fd int, p []byte) (n int, err error) {
+ var _p0 unsafe.Pointer
+ if len(p) > 0 {
+ _p0 = unsafe.Pointer(&p[0])
+ } else {
+ _p0 = unsafe.Pointer(&_zero)
+ }
+ r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p)))
+ n = int(r0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func Removexattr(path string, attr string) (err error) {
+ var _p0 *byte
+ _p0, err = BytePtrFromString(path)
+ if err != nil {
+ return
+ }
+ var _p1 *byte
+ _p1, err = BytePtrFromString(attr)
+ if err != nil {
+ return
+ }
+ _, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0)
+ use(unsafe.Pointer(_p0))
+ use(unsafe.Pointer(_p1))
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) {
+ var _p0 *byte
+ _p0, err = BytePtrFromString(oldpath)
+ if err != nil {
+ return
+ }
+ var _p1 *byte
+ _p1, err = BytePtrFromString(newpath)
+ if err != nil {
+ return
+ }
+ _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0)
+ use(unsafe.Pointer(_p0))
+ use(unsafe.Pointer(_p1))
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func Setdomainname(p []byte) (err error) {
+ var _p0 unsafe.Pointer
+ if len(p) > 0 {
+ _p0 = unsafe.Pointer(&p[0])
+ } else {
+ _p0 = unsafe.Pointer(&_zero)
+ }
+ _, _, e1 := Syscall(SYS_SETDOMAINNAME, uintptr(_p0), uintptr(len(p)), 0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func Sethostname(p []byte) (err error) {
+ var _p0 unsafe.Pointer
+ if len(p) > 0 {
+ _p0 = unsafe.Pointer(&p[0])
+ } else {
+ _p0 = unsafe.Pointer(&_zero)
+ }
+ _, _, e1 := Syscall(SYS_SETHOSTNAME, uintptr(_p0), uintptr(len(p)), 0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func Setpgid(pid int, pgid int) (err error) {
+ _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func Setsid() (pid int, err error) {
+ r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0)
+ pid = int(r0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func Settimeofday(tv *Timeval) (err error) {
+ _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func Setns(fd int, nstype int) (err error) {
+ _, _, e1 := Syscall(SYS_SETNS, uintptr(fd), uintptr(nstype), 0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func Setpriority(which int, who int, prio int) (err error) {
+ _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio))
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func Setxattr(path string, attr string, data []byte, flags int) (err error) {
+ var _p0 *byte
+ _p0, err = BytePtrFromString(path)
+ if err != nil {
+ return
+ }
+ var _p1 *byte
+ _p1, err = BytePtrFromString(attr)
+ if err != nil {
+ return
+ }
+ var _p2 unsafe.Pointer
+ if len(data) > 0 {
+ _p2 = unsafe.Pointer(&data[0])
+ } else {
+ _p2 = unsafe.Pointer(&_zero)
+ }
+ _, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0)
+ use(unsafe.Pointer(_p0))
+ use(unsafe.Pointer(_p1))
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func Sync() {
+ Syscall(SYS_SYNC, 0, 0, 0)
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func Sysinfo(info *Sysinfo_t) (err error) {
+ _, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) {
+ r0, _, e1 := Syscall6(SYS_TEE, uintptr(rfd), uintptr(wfd), uintptr(len), uintptr(flags), 0, 0)
+ n = int64(r0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func Tgkill(tgid int, tid int, sig syscall.Signal) (err error) {
+ _, _, e1 := RawSyscall(SYS_TGKILL, uintptr(tgid), uintptr(tid), uintptr(sig))
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func Times(tms *Tms) (ticks uintptr, err error) {
+ r0, _, e1 := RawSyscall(SYS_TIMES, uintptr(unsafe.Pointer(tms)), 0, 0)
+ ticks = uintptr(r0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func Umask(mask int) (oldmask int) {
+ r0, _, _ := RawSyscall(SYS_UMASK, uintptr(mask), 0, 0)
+ oldmask = int(r0)
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func Uname(buf *Utsname) (err error) {
+ _, _, e1 := RawSyscall(SYS_UNAME, uintptr(unsafe.Pointer(buf)), 0, 0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func Unmount(target string, flags int) (err error) {
+ var _p0 *byte
+ _p0, err = BytePtrFromString(target)
+ if err != nil {
+ return
+ }
+ _, _, e1 := Syscall(SYS_UMOUNT2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0)
+ use(unsafe.Pointer(_p0))
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func Unshare(flags int) (err error) {
+ _, _, e1 := Syscall(SYS_UNSHARE, uintptr(flags), 0, 0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func Ustat(dev int, ubuf *Ustat_t) (err error) {
+ _, _, e1 := Syscall(SYS_USTAT, uintptr(dev), uintptr(unsafe.Pointer(ubuf)), 0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func write(fd int, p []byte) (n int, err error) {
+ var _p0 unsafe.Pointer
+ if len(p) > 0 {
+ _p0 = unsafe.Pointer(&p[0])
+ } else {
+ _p0 = unsafe.Pointer(&_zero)
+ }
+ r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)))
+ n = int(r0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func exitThread(code int) (err error) {
+ _, _, e1 := Syscall(SYS_EXIT, uintptr(code), 0, 0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func readlen(fd int, p *byte, np int) (n int, err error) {
+ r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np))
+ n = int(r0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func writelen(fd int, p *byte, np int) (n int, err error) {
+ r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np))
+ n = int(r0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func munmap(addr uintptr, length uintptr) (err error) {
+ _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func Madvise(b []byte, advice int) (err error) {
+ var _p0 unsafe.Pointer
+ if len(b) > 0 {
+ _p0 = unsafe.Pointer(&b[0])
+ } else {
+ _p0 = unsafe.Pointer(&_zero)
+ }
+ _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(advice))
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func Mprotect(b []byte, prot int) (err error) {
+ var _p0 unsafe.Pointer
+ if len(b) > 0 {
+ _p0 = unsafe.Pointer(&b[0])
+ } else {
+ _p0 = unsafe.Pointer(&_zero)
+ }
+ _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot))
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func Mlock(b []byte) (err error) {
+ var _p0 unsafe.Pointer
+ if len(b) > 0 {
+ _p0 = unsafe.Pointer(&b[0])
+ } else {
+ _p0 = unsafe.Pointer(&_zero)
+ }
+ _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func Munlock(b []byte) (err error) {
+ var _p0 unsafe.Pointer
+ if len(b) > 0 {
+ _p0 = unsafe.Pointer(&b[0])
+ } else {
+ _p0 = unsafe.Pointer(&_zero)
+ }
+ _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func Mlockall(flags int) (err error) {
+ _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func Munlockall() (err error) {
+ _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func Dup2(oldfd int, newfd int) (err error) {
+ _, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) {
+ var _p0 unsafe.Pointer
+ if len(events) > 0 {
+ _p0 = unsafe.Pointer(&events[0])
+ } else {
+ _p0 = unsafe.Pointer(&_zero)
+ }
+ r0, _, e1 := Syscall6(SYS_EPOLL_WAIT, uintptr(epfd), uintptr(_p0), uintptr(len(events)), uintptr(msec), 0, 0)
+ n = int(r0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func Fadvise(fd int, offset int64, length int64, advice int) (err error) {
+ _, _, e1 := Syscall6(SYS_FADVISE64, uintptr(fd), uintptr(offset), uintptr(length), uintptr(advice), 0, 0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func Fchown(fd int, uid int, gid int) (err error) {
+ _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid))
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func Fstat(fd int, stat *Stat_t) (err error) {
+ _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func Fstatfs(fd int, buf *Statfs_t) (err error) {
+ _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(buf)), 0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func Ftruncate(fd int, length int64) (err error) {
+ _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), uintptr(length), 0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func Getegid() (egid int) {
+ r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0)
+ egid = int(r0)
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func Geteuid() (euid int) {
+ r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0)
+ euid = int(r0)
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func Getgid() (gid int) {
+ r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0)
+ gid = int(r0)
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func Getrlimit(resource int, rlim *Rlimit) (err error) {
+ _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func Getuid() (uid int) {
+ r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0)
+ uid = int(r0)
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func InotifyInit() (fd int, err error) {
+ r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT, 0, 0, 0)
+ fd = int(r0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func Lchown(path string, uid int, gid int) (err error) {
+ var _p0 *byte
+ _p0, err = BytePtrFromString(path)
+ if err != nil {
+ return
+ }
+ _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid))
+ use(unsafe.Pointer(_p0))
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func Lstat(path string, stat *Stat_t) (err error) {
+ var _p0 *byte
+ _p0, err = BytePtrFromString(path)
+ if err != nil {
+ return
+ }
+ _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0)
+ use(unsafe.Pointer(_p0))
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func Pause() (err error) {
+ _, _, e1 := Syscall(SYS_PAUSE, 0, 0, 0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func Pread(fd int, p []byte, offset int64) (n int, err error) {
+ var _p0 unsafe.Pointer
+ if len(p) > 0 {
+ _p0 = unsafe.Pointer(&p[0])
+ } else {
+ _p0 = unsafe.Pointer(&_zero)
+ }
+ r0, _, e1 := Syscall6(SYS_PREAD64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0)
+ n = int(r0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func Pwrite(fd int, p []byte, offset int64) (n int, err error) {
+ var _p0 unsafe.Pointer
+ if len(p) > 0 {
+ _p0 = unsafe.Pointer(&p[0])
+ } else {
+ _p0 = unsafe.Pointer(&_zero)
+ }
+ r0, _, e1 := Syscall6(SYS_PWRITE64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0)
+ n = int(r0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func Seek(fd int, offset int64, whence int) (off int64, err error) {
+ r0, _, e1 := Syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence))
+ off = int64(r0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) {
+ r0, _, e1 := Syscall6(SYS_SELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0)
+ n = int(r0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) {
+ r0, _, e1 := Syscall6(SYS_SENDFILE, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0)
+ written = int(r0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func Setfsgid(gid int) (err error) {
+ _, _, e1 := Syscall(SYS_SETFSGID, uintptr(gid), 0, 0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func Setfsuid(uid int) (err error) {
+ _, _, e1 := Syscall(SYS_SETFSUID, uintptr(uid), 0, 0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func Setregid(rgid int, egid int) (err error) {
+ _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func Setresgid(rgid int, egid int, sgid int) (err error) {
+ _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid))
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func Setresuid(ruid int, euid int, suid int) (err error) {
+ _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid))
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func Setrlimit(resource int, rlim *Rlimit) (err error) {
+ _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func Setreuid(ruid int, euid int) (err error) {
+ _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) {
+ r0, _, e1 := Syscall6(SYS_SPLICE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags))
+ n = int64(r0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func Stat(path string, stat *Stat_t) (err error) {
+ var _p0 *byte
+ _p0, err = BytePtrFromString(path)
+ if err != nil {
+ return
+ }
+ _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0)
+ use(unsafe.Pointer(_p0))
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func Statfs(path string, buf *Statfs_t) (err error) {
+ var _p0 *byte
+ _p0, err = BytePtrFromString(path)
+ if err != nil {
+ return
+ }
+ _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0)
+ use(unsafe.Pointer(_p0))
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func SyncFileRange(fd int, off int64, n int64, flags int) (err error) {
+ _, _, e1 := Syscall6(SYS_SYNC_FILE_RANGE, uintptr(fd), uintptr(off), uintptr(n), uintptr(flags), 0, 0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func Truncate(path string, length int64) (err error) {
+ var _p0 *byte
+ _p0, err = BytePtrFromString(path)
+ if err != nil {
+ return
+ }
+ _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0)
+ use(unsafe.Pointer(_p0))
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func getgroups(n int, list *_Gid_t) (nn int, err error) {
+ r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0)
+ nn = int(r0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func setgroups(n int, list *_Gid_t) (err error) {
+ _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func Gettimeofday(tv *Timeval) (err error) {
+ _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func Utime(path string, buf *Utimbuf) (err error) {
+ var _p0 *byte
+ _p0, err = BytePtrFromString(path)
+ if err != nil {
+ return
+ }
+ _, _, e1 := Syscall(SYS_UTIME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0)
+ use(unsafe.Pointer(_p0))
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func pipe2(p *[2]_C_int, flags int) (err error) {
+ _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func poll(fds *PollFd, nfds int, timeout int) (n int, err error) {
+ r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout))
+ n = int(r0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
diff --git a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go
index 00ca1f9c1..b16e1d0ee 100644
--- a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go
+++ b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go
@@ -222,6 +222,7 @@ func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr)
_p0 = unsafe.Pointer(&_zero)
}
_, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen))
+ use(_p0)
if e1 != 0 {
err = errnoErr(e1)
}
diff --git a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go
index 03f31b973..b63667da9 100644
--- a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go
+++ b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go
@@ -222,6 +222,7 @@ func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr)
_p0 = unsafe.Pointer(&_zero)
}
_, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen))
+ use(_p0)
if e1 != 0 {
err = errnoErr(e1)
}
diff --git a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go
index 84dc61cfa..b0d19038d 100644
--- a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go
+++ b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go
@@ -222,6 +222,7 @@ func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr)
_p0 = unsafe.Pointer(&_zero)
}
_, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen))
+ use(_p0)
if e1 != 0 {
err = errnoErr(e1)
}
diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go
index 02b3528a6..f91a5b856 100644
--- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go
+++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go
@@ -222,6 +222,7 @@ func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr)
_p0 = unsafe.Pointer(&_zero)
}
_, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen))
+ use(_p0)
if e1 != 0 {
err = errnoErr(e1)
}
diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go
index 7dc2b7eaf..2e8d59d72 100644
--- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go
+++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go
@@ -222,6 +222,7 @@ func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr)
_p0 = unsafe.Pointer(&_zero)
}
_, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen))
+ use(_p0)
if e1 != 0 {
err = errnoErr(e1)
}
diff --git a/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go
index 432642781..c0ecfc044 100644
--- a/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go
+++ b/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go
@@ -10,10 +10,13 @@ import (
"unsafe"
)
+//go:cgo_import_dynamic libc_pipe pipe "libc.so"
//go:cgo_import_dynamic libc_getsockname getsockname "libsocket.so"
//go:cgo_import_dynamic libc_getcwd getcwd "libc.so"
//go:cgo_import_dynamic libc_getgroups getgroups "libc.so"
//go:cgo_import_dynamic libc_setgroups setgroups "libc.so"
+//go:cgo_import_dynamic libc_wait4 wait4 "libc.so"
+//go:cgo_import_dynamic libc_gethostname gethostname "libc.so"
//go:cgo_import_dynamic libc_utimes utimes "libc.so"
//go:cgo_import_dynamic libc_utimensat utimensat "libc.so"
//go:cgo_import_dynamic libc_fcntl fcntl "libc.so"
@@ -125,10 +128,13 @@ import (
//go:cgo_import_dynamic libc_recvfrom recvfrom "libsocket.so"
//go:cgo_import_dynamic libc_sysconf sysconf "libc.so"
+//go:linkname procpipe libc_pipe
//go:linkname procgetsockname libc_getsockname
//go:linkname procGetcwd libc_getcwd
//go:linkname procgetgroups libc_getgroups
//go:linkname procsetgroups libc_setgroups
+//go:linkname procwait4 libc_wait4
+//go:linkname procgethostname libc_gethostname
//go:linkname procutimes libc_utimes
//go:linkname procutimensat libc_utimensat
//go:linkname procfcntl libc_fcntl
@@ -241,10 +247,13 @@ import (
//go:linkname procsysconf libc_sysconf
var (
+ procpipe,
procgetsockname,
procGetcwd,
procgetgroups,
procsetgroups,
+ procwait4,
+ procgethostname,
procutimes,
procutimensat,
procfcntl,
@@ -357,6 +366,15 @@ var (
procsysconf syscallFunc
)
+func pipe(p *[2]_C_int) (n int, err error) {
+ r0, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procpipe)), 1, uintptr(unsafe.Pointer(p)), 0, 0, 0, 0, 0)
+ n = int(r0)
+ if e1 != 0 {
+ err = e1
+ }
+ return
+}
+
func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) {
_, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procgetsockname)), 3, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), 0, 0, 0)
if e1 != 0 {
@@ -395,6 +413,28 @@ func setgroups(ngid int, gid *_Gid_t) (err error) {
return
}
+func wait4(pid int32, statusp *_C_int, options int, rusage *Rusage) (wpid int32, err error) {
+ r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procwait4)), 4, uintptr(pid), uintptr(unsafe.Pointer(statusp)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0)
+ wpid = int32(r0)
+ if e1 != 0 {
+ err = e1
+ }
+ return
+}
+
+func gethostname(buf []byte) (n int, err error) {
+ var _p0 *byte
+ if len(buf) > 0 {
+ _p0 = &buf[0]
+ }
+ r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procgethostname)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(len(buf)), 0, 0, 0, 0)
+ n = int(r0)
+ if e1 != 0 {
+ err = e1
+ }
+ return
+}
+
func utimes(path string, times *[2]Timeval) (err error) {
var _p0 *byte
_p0, err = BytePtrFromString(path)
diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go
new file mode 100644
index 000000000..42d4f5cda
--- /dev/null
+++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go
@@ -0,0 +1,328 @@
+// mksysnum_linux.pl /usr/include/asm/unistd.h
+// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT
+
+// +build s390x,linux
+
+package unix
+
+const (
+ SYS_EXIT = 1
+ SYS_FORK = 2
+ SYS_READ = 3
+ SYS_WRITE = 4
+ SYS_OPEN = 5
+ SYS_CLOSE = 6
+ SYS_RESTART_SYSCALL = 7
+ SYS_CREAT = 8
+ SYS_LINK = 9
+ SYS_UNLINK = 10
+ SYS_EXECVE = 11
+ SYS_CHDIR = 12
+ SYS_MKNOD = 14
+ SYS_CHMOD = 15
+ SYS_LSEEK = 19
+ SYS_GETPID = 20
+ SYS_MOUNT = 21
+ SYS_UMOUNT = 22
+ SYS_PTRACE = 26
+ SYS_ALARM = 27
+ SYS_PAUSE = 29
+ SYS_UTIME = 30
+ SYS_ACCESS = 33
+ SYS_NICE = 34
+ SYS_SYNC = 36
+ SYS_KILL = 37
+ SYS_RENAME = 38
+ SYS_MKDIR = 39
+ SYS_RMDIR = 40
+ SYS_DUP = 41
+ SYS_PIPE = 42
+ SYS_TIMES = 43
+ SYS_BRK = 45
+ SYS_SIGNAL = 48
+ SYS_ACCT = 51
+ SYS_UMOUNT2 = 52
+ SYS_IOCTL = 54
+ SYS_FCNTL = 55
+ SYS_SETPGID = 57
+ SYS_UMASK = 60
+ SYS_CHROOT = 61
+ SYS_USTAT = 62
+ SYS_DUP2 = 63
+ SYS_GETPPID = 64
+ SYS_GETPGRP = 65
+ SYS_SETSID = 66
+ SYS_SIGACTION = 67
+ SYS_SIGSUSPEND = 72
+ SYS_SIGPENDING = 73
+ SYS_SETHOSTNAME = 74
+ SYS_SETRLIMIT = 75
+ SYS_GETRUSAGE = 77
+ SYS_GETTIMEOFDAY = 78
+ SYS_SETTIMEOFDAY = 79
+ SYS_SYMLINK = 83
+ SYS_READLINK = 85
+ SYS_USELIB = 86
+ SYS_SWAPON = 87
+ SYS_REBOOT = 88
+ SYS_READDIR = 89
+ SYS_MMAP = 90
+ SYS_MUNMAP = 91
+ SYS_TRUNCATE = 92
+ SYS_FTRUNCATE = 93
+ SYS_FCHMOD = 94
+ SYS_GETPRIORITY = 96
+ SYS_SETPRIORITY = 97
+ SYS_STATFS = 99
+ SYS_FSTATFS = 100
+ SYS_SOCKETCALL = 102
+ SYS_SYSLOG = 103
+ SYS_SETITIMER = 104
+ SYS_GETITIMER = 105
+ SYS_STAT = 106
+ SYS_LSTAT = 107
+ SYS_FSTAT = 108
+ SYS_LOOKUP_DCOOKIE = 110
+ SYS_VHANGUP = 111
+ SYS_IDLE = 112
+ SYS_WAIT4 = 114
+ SYS_SWAPOFF = 115
+ SYS_SYSINFO = 116
+ SYS_IPC = 117
+ SYS_FSYNC = 118
+ SYS_SIGRETURN = 119
+ SYS_CLONE = 120
+ SYS_SETDOMAINNAME = 121
+ SYS_UNAME = 122
+ SYS_ADJTIMEX = 124
+ SYS_MPROTECT = 125
+ SYS_SIGPROCMASK = 126
+ SYS_CREATE_MODULE = 127
+ SYS_INIT_MODULE = 128
+ SYS_DELETE_MODULE = 129
+ SYS_GET_KERNEL_SYMS = 130
+ SYS_QUOTACTL = 131
+ SYS_GETPGID = 132
+ SYS_FCHDIR = 133
+ SYS_BDFLUSH = 134
+ SYS_SYSFS = 135
+ SYS_PERSONALITY = 136
+ SYS_AFS_SYSCALL = 137
+ SYS_GETDENTS = 141
+ SYS_FLOCK = 143
+ SYS_MSYNC = 144
+ SYS_READV = 145
+ SYS_WRITEV = 146
+ SYS_GETSID = 147
+ SYS_FDATASYNC = 148
+ SYS__SYSCTL = 149
+ SYS_MLOCK = 150
+ SYS_MUNLOCK = 151
+ SYS_MLOCKALL = 152
+ SYS_MUNLOCKALL = 153
+ SYS_SCHED_SETPARAM = 154
+ SYS_SCHED_GETPARAM = 155
+ SYS_SCHED_SETSCHEDULER = 156
+ SYS_SCHED_GETSCHEDULER = 157
+ SYS_SCHED_YIELD = 158
+ SYS_SCHED_GET_PRIORITY_MAX = 159
+ SYS_SCHED_GET_PRIORITY_MIN = 160
+ SYS_SCHED_RR_GET_INTERVAL = 161
+ SYS_NANOSLEEP = 162
+ SYS_MREMAP = 163
+ SYS_QUERY_MODULE = 167
+ SYS_POLL = 168
+ SYS_NFSSERVCTL = 169
+ SYS_PRCTL = 172
+ SYS_RT_SIGRETURN = 173
+ SYS_RT_SIGACTION = 174
+ SYS_RT_SIGPROCMASK = 175
+ SYS_RT_SIGPENDING = 176
+ SYS_RT_SIGTIMEDWAIT = 177
+ SYS_RT_SIGQUEUEINFO = 178
+ SYS_RT_SIGSUSPEND = 179
+ SYS_PREAD64 = 180
+ SYS_PWRITE64 = 181
+ SYS_GETCWD = 183
+ SYS_CAPGET = 184
+ SYS_CAPSET = 185
+ SYS_SIGALTSTACK = 186
+ SYS_SENDFILE = 187
+ SYS_GETPMSG = 188
+ SYS_PUTPMSG = 189
+ SYS_VFORK = 190
+ SYS_PIVOT_ROOT = 217
+ SYS_MINCORE = 218
+ SYS_MADVISE = 219
+ SYS_GETDENTS64 = 220
+ SYS_READAHEAD = 222
+ SYS_SETXATTR = 224
+ SYS_LSETXATTR = 225
+ SYS_FSETXATTR = 226
+ SYS_GETXATTR = 227
+ SYS_LGETXATTR = 228
+ SYS_FGETXATTR = 229
+ SYS_LISTXATTR = 230
+ SYS_LLISTXATTR = 231
+ SYS_FLISTXATTR = 232
+ SYS_REMOVEXATTR = 233
+ SYS_LREMOVEXATTR = 234
+ SYS_FREMOVEXATTR = 235
+ SYS_GETTID = 236
+ SYS_TKILL = 237
+ SYS_FUTEX = 238
+ SYS_SCHED_SETAFFINITY = 239
+ SYS_SCHED_GETAFFINITY = 240
+ SYS_TGKILL = 241
+ SYS_IO_SETUP = 243
+ SYS_IO_DESTROY = 244
+ SYS_IO_GETEVENTS = 245
+ SYS_IO_SUBMIT = 246
+ SYS_IO_CANCEL = 247
+ SYS_EXIT_GROUP = 248
+ SYS_EPOLL_CREATE = 249
+ SYS_EPOLL_CTL = 250
+ SYS_EPOLL_WAIT = 251
+ SYS_SET_TID_ADDRESS = 252
+ SYS_FADVISE64 = 253
+ SYS_TIMER_CREATE = 254
+ SYS_TIMER_SETTIME = 255
+ SYS_TIMER_GETTIME = 256
+ SYS_TIMER_GETOVERRUN = 257
+ SYS_TIMER_DELETE = 258
+ SYS_CLOCK_SETTIME = 259
+ SYS_CLOCK_GETTIME = 260
+ SYS_CLOCK_GETRES = 261
+ SYS_CLOCK_NANOSLEEP = 262
+ SYS_STATFS64 = 265
+ SYS_FSTATFS64 = 266
+ SYS_REMAP_FILE_PAGES = 267
+ SYS_MBIND = 268
+ SYS_GET_MEMPOLICY = 269
+ SYS_SET_MEMPOLICY = 270
+ SYS_MQ_OPEN = 271
+ SYS_MQ_UNLINK = 272
+ SYS_MQ_TIMEDSEND = 273
+ SYS_MQ_TIMEDRECEIVE = 274
+ SYS_MQ_NOTIFY = 275
+ SYS_MQ_GETSETATTR = 276
+ SYS_KEXEC_LOAD = 277
+ SYS_ADD_KEY = 278
+ SYS_REQUEST_KEY = 279
+ SYS_KEYCTL = 280
+ SYS_WAITID = 281
+ SYS_IOPRIO_SET = 282
+ SYS_IOPRIO_GET = 283
+ SYS_INOTIFY_INIT = 284
+ SYS_INOTIFY_ADD_WATCH = 285
+ SYS_INOTIFY_RM_WATCH = 286
+ SYS_MIGRATE_PAGES = 287
+ SYS_OPENAT = 288
+ SYS_MKDIRAT = 289
+ SYS_MKNODAT = 290
+ SYS_FCHOWNAT = 291
+ SYS_FUTIMESAT = 292
+ SYS_UNLINKAT = 294
+ SYS_RENAMEAT = 295
+ SYS_LINKAT = 296
+ SYS_SYMLINKAT = 297
+ SYS_READLINKAT = 298
+ SYS_FCHMODAT = 299
+ SYS_FACCESSAT = 300
+ SYS_PSELECT6 = 301
+ SYS_PPOLL = 302
+ SYS_UNSHARE = 303
+ SYS_SET_ROBUST_LIST = 304
+ SYS_GET_ROBUST_LIST = 305
+ SYS_SPLICE = 306
+ SYS_SYNC_FILE_RANGE = 307
+ SYS_TEE = 308
+ SYS_VMSPLICE = 309
+ SYS_MOVE_PAGES = 310
+ SYS_GETCPU = 311
+ SYS_EPOLL_PWAIT = 312
+ SYS_UTIMES = 313
+ SYS_FALLOCATE = 314
+ SYS_UTIMENSAT = 315
+ SYS_SIGNALFD = 316
+ SYS_TIMERFD = 317
+ SYS_EVENTFD = 318
+ SYS_TIMERFD_CREATE = 319
+ SYS_TIMERFD_SETTIME = 320
+ SYS_TIMERFD_GETTIME = 321
+ SYS_SIGNALFD4 = 322
+ SYS_EVENTFD2 = 323
+ SYS_INOTIFY_INIT1 = 324
+ SYS_PIPE2 = 325
+ SYS_DUP3 = 326
+ SYS_EPOLL_CREATE1 = 327
+ SYS_PREADV = 328
+ SYS_PWRITEV = 329
+ SYS_RT_TGSIGQUEUEINFO = 330
+ SYS_PERF_EVENT_OPEN = 331
+ SYS_FANOTIFY_INIT = 332
+ SYS_FANOTIFY_MARK = 333
+ SYS_PRLIMIT64 = 334
+ SYS_NAME_TO_HANDLE_AT = 335
+ SYS_OPEN_BY_HANDLE_AT = 336
+ SYS_CLOCK_ADJTIME = 337
+ SYS_SYNCFS = 338
+ SYS_SETNS = 339
+ SYS_PROCESS_VM_READV = 340
+ SYS_PROCESS_VM_WRITEV = 341
+ SYS_S390_RUNTIME_INSTR = 342
+ SYS_KCMP = 343
+ SYS_FINIT_MODULE = 344
+ SYS_SCHED_SETATTR = 345
+ SYS_SCHED_GETATTR = 346
+ SYS_RENAMEAT2 = 347
+ SYS_SECCOMP = 348
+ SYS_GETRANDOM = 349
+ SYS_MEMFD_CREATE = 350
+ SYS_BPF = 351
+ SYS_S390_PCI_MMIO_WRITE = 352
+ SYS_S390_PCI_MMIO_READ = 353
+ SYS_EXECVEAT = 354
+ SYS_USERFAULTFD = 355
+ SYS_MEMBARRIER = 356
+ SYS_RECVMMSG = 357
+ SYS_SENDMMSG = 358
+ SYS_SOCKET = 359
+ SYS_SOCKETPAIR = 360
+ SYS_BIND = 361
+ SYS_CONNECT = 362
+ SYS_LISTEN = 363
+ SYS_ACCEPT4 = 364
+ SYS_GETSOCKOPT = 365
+ SYS_SETSOCKOPT = 366
+ SYS_GETSOCKNAME = 367
+ SYS_GETPEERNAME = 368
+ SYS_SENDTO = 369
+ SYS_SENDMSG = 370
+ SYS_RECVFROM = 371
+ SYS_RECVMSG = 372
+ SYS_SHUTDOWN = 373
+ SYS_MLOCK2 = 374
+ SYS_SELECT = 142
+ SYS_GETRLIMIT = 191
+ SYS_LCHOWN = 198
+ SYS_GETUID = 199
+ SYS_GETGID = 200
+ SYS_GETEUID = 201
+ SYS_GETEGID = 202
+ SYS_SETREUID = 203
+ SYS_SETREGID = 204
+ SYS_GETGROUPS = 205
+ SYS_SETGROUPS = 206
+ SYS_FCHOWN = 207
+ SYS_SETRESUID = 208
+ SYS_GETRESUID = 209
+ SYS_SETRESGID = 210
+ SYS_GETRESGID = 211
+ SYS_CHOWN = 212
+ SYS_SETUID = 213
+ SYS_SETGID = 214
+ SYS_SETFSUID = 215
+ SYS_SETFSGID = 216
+ SYS_NEWFSTATAT = 293
+)
diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_386.go b/vendor/golang.org/x/sys/unix/ztypes_linux_386.go
index fb1257ae0..f3ddf5345 100644
--- a/vendor/golang.org/x/sys/unix/ztypes_linux_386.go
+++ b/vendor/golang.org/x/sys/unix/ztypes_linux_386.go
@@ -595,6 +595,26 @@ const (
AT_SYMLINK_NOFOLLOW = 0x100
)
+type PollFd struct {
+ Fd int32
+ Events int16
+ Revents int16
+}
+
+const (
+ POLLIN = 0x1
+ POLLPRI = 0x2
+ POLLOUT = 0x4
+ POLLRDHUP = 0x2000
+ POLLERR = 0x8
+ POLLHUP = 0x10
+ POLLNVAL = 0x20
+)
+
+type Sigset_t struct {
+ X__val [16]uint64
+}
+
type Termios struct {
Iflag uint32
Oflag uint32
diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go
index 34edb3685..a923bef35 100644
--- a/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go
+++ b/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go
@@ -613,6 +613,26 @@ const (
AT_SYMLINK_NOFOLLOW = 0x100
)
+type PollFd struct {
+ Fd int32
+ Events int16
+ Revents int16
+}
+
+const (
+ POLLIN = 0x1
+ POLLPRI = 0x2
+ POLLOUT = 0x4
+ POLLRDHUP = 0x2000
+ POLLERR = 0x8
+ POLLHUP = 0x10
+ POLLNVAL = 0x20
+)
+
+type Sigset_t struct {
+ X__val [16]uint64
+}
+
type Termios struct {
Iflag uint32
Oflag uint32
diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go b/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go
index 0fef350b1..817ac9c29 100644
--- a/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go
+++ b/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go
@@ -575,6 +575,26 @@ const (
AT_SYMLINK_NOFOLLOW = 0x100
)
+type PollFd struct {
+ Fd int32
+ Events int16
+ Revents int16
+}
+
+const (
+ POLLIN = 0x1
+ POLLPRI = 0x2
+ POLLOUT = 0x4
+ POLLRDHUP = 0x2000
+ POLLERR = 0x8
+ POLLHUP = 0x10
+ POLLNVAL = 0x20
+)
+
+type Sigset_t struct {
+ X__val [16]uint64
+}
+
type Termios struct {
Iflag uint32
Oflag uint32
diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go
index 28b7cd43c..e786addf7 100644
--- a/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go
+++ b/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go
@@ -592,6 +592,26 @@ const (
AT_SYMLINK_NOFOLLOW = 0x100
)
+type PollFd struct {
+ Fd int32
+ Events int16
+ Revents int16
+}
+
+const (
+ POLLIN = 0x1
+ POLLPRI = 0x2
+ POLLOUT = 0x4
+ POLLRDHUP = 0x2000
+ POLLERR = 0x8
+ POLLHUP = 0x10
+ POLLNVAL = 0x20
+)
+
+type Sigset_t struct {
+ X__val [16]uint64
+}
+
type Termios struct {
Iflag uint32
Oflag uint32
diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go
index 8fe5af262..b29894deb 100644
--- a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go
+++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go
@@ -596,6 +596,26 @@ const (
AT_SYMLINK_NOFOLLOW = 0x100
)
+type PollFd struct {
+ Fd int32
+ Events int16
+ Revents int16
+}
+
+const (
+ POLLIN = 0x1
+ POLLPRI = 0x2
+ POLLOUT = 0x4
+ POLLRDHUP = 0x2000
+ POLLERR = 0x8
+ POLLHUP = 0x10
+ POLLNVAL = 0x20
+)
+
+type Sigset_t struct {
+ X__val [16]uint64
+}
+
type Termios struct {
Iflag uint32
Oflag uint32
diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go
index df16e83c5..d9af71b69 100644
--- a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go
+++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go
@@ -596,6 +596,26 @@ const (
AT_SYMLINK_NOFOLLOW = 0x100
)
+type PollFd struct {
+ Fd int32
+ Events int16
+ Revents int16
+}
+
+const (
+ POLLIN = 0x1
+ POLLPRI = 0x2
+ POLLOUT = 0x4
+ POLLRDHUP = 0x2000
+ POLLERR = 0x8
+ POLLHUP = 0x10
+ POLLNVAL = 0x20
+)
+
+type Sigset_t struct {
+ X__val [16]uint64
+}
+
type Termios struct {
Iflag uint32
Oflag uint32
diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go
index d1105402e..4218170a9 100644
--- a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go
+++ b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go
@@ -602,6 +602,26 @@ const (
AT_SYMLINK_NOFOLLOW = 0x100
)
+type PollFd struct {
+ Fd int32
+ Events int16
+ Revents int16
+}
+
+const (
+ POLLIN = 0x1
+ POLLPRI = 0x2
+ POLLOUT = 0x4
+ POLLRDHUP = 0x2000
+ POLLERR = 0x8
+ POLLHUP = 0x10
+ POLLNVAL = 0x20
+)
+
+type Sigset_t struct {
+ X__val [16]uint64
+}
+
type Termios struct {
Iflag uint32
Oflag uint32
diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go
index 8e25c9fff..7db4c78c6 100644
--- a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go
+++ b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go
@@ -602,6 +602,26 @@ const (
AT_SYMLINK_NOFOLLOW = 0x100
)
+type PollFd struct {
+ Fd int32
+ Events int16
+ Revents int16
+}
+
+const (
+ POLLIN = 0x1
+ POLLPRI = 0x2
+ POLLOUT = 0x4
+ POLLRDHUP = 0x2000
+ POLLERR = 0x8
+ POLLHUP = 0x10
+ POLLNVAL = 0x20
+)
+
+type Sigset_t struct {
+ X__val [16]uint64
+}
+
type Termios struct {
Iflag uint32
Oflag uint32
diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go b/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go
new file mode 100644
index 000000000..76ee57cbf
--- /dev/null
+++ b/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go
@@ -0,0 +1,649 @@
+// +build s390x,linux
+// Created by cgo -godefs - DO NOT EDIT
+// cgo -godefs -- -fsigned-char types_linux.go
+
+package unix
+
+const (
+ sizeofPtr = 0x8
+ sizeofShort = 0x2
+ sizeofInt = 0x4
+ sizeofLong = 0x8
+ sizeofLongLong = 0x8
+ PathMax = 0x1000
+)
+
+type (
+ _C_short int16
+ _C_int int32
+ _C_long int64
+ _C_long_long int64
+)
+
+type Timespec struct {
+ Sec int64
+ Nsec int64
+}
+
+type Timeval struct {
+ Sec int64
+ Usec int64
+}
+
+type Timex struct {
+ Modes uint32
+ _ [4]byte
+ Offset int64
+ Freq int64
+ Maxerror int64
+ Esterror int64
+ Status int32
+ _ [4]byte
+ Constant int64
+ Precision int64
+ Tolerance int64
+ Time Timeval
+ Tick int64
+ Ppsfreq int64
+ Jitter int64
+ Shift int32
+ _ [4]byte
+ Stabil int64
+ Jitcnt int64
+ Calcnt int64
+ Errcnt int64
+ Stbcnt int64
+ Tai int32
+ _ [44]byte
+}
+
+type Time_t int64
+
+type Tms struct {
+ Utime int64
+ Stime int64
+ Cutime int64
+ Cstime int64
+}
+
+type Utimbuf struct {
+ Actime int64
+ Modtime int64
+}
+
+type Rusage struct {
+ Utime Timeval
+ Stime Timeval
+ Maxrss int64
+ Ixrss int64
+ Idrss int64
+ Isrss int64
+ Minflt int64
+ Majflt int64
+ Nswap int64
+ Inblock int64
+ Oublock int64
+ Msgsnd int64
+ Msgrcv int64
+ Nsignals int64
+ Nvcsw int64
+ Nivcsw int64
+}
+
+type Rlimit struct {
+ Cur uint64
+ Max uint64
+}
+
+type _Gid_t uint32
+
+type Stat_t struct {
+ Dev uint64
+ Ino uint64
+ Nlink uint64
+ Mode uint32
+ Uid uint32
+ Gid uint32
+ _ int32
+ Rdev uint64
+ Size int64
+ Atim Timespec
+ Mtim Timespec
+ Ctim Timespec
+ Blksize int64
+ Blocks int64
+ _ [3]int64
+}
+
+type Statfs_t struct {
+ Type uint32
+ Bsize uint32
+ Blocks uint64
+ Bfree uint64
+ Bavail uint64
+ Files uint64
+ Ffree uint64
+ Fsid Fsid
+ Namelen uint32
+ Frsize uint32
+ Flags uint32
+ Spare [4]uint32
+ _ [4]byte
+}
+
+type Dirent struct {
+ Ino uint64
+ Off int64
+ Reclen uint16
+ Type uint8
+ Name [256]int8
+ _ [5]byte
+}
+
+type Fsid struct {
+ _ [2]int32
+}
+
+type Flock_t struct {
+ Type int16
+ Whence int16
+ _ [4]byte
+ Start int64
+ Len int64
+ Pid int32
+ _ [4]byte
+}
+
+const (
+ FADV_NORMAL = 0x0
+ FADV_RANDOM = 0x1
+ FADV_SEQUENTIAL = 0x2
+ FADV_WILLNEED = 0x3
+ FADV_DONTNEED = 0x6
+ FADV_NOREUSE = 0x7
+)
+
+type RawSockaddrInet4 struct {
+ Family uint16
+ Port uint16
+ Addr [4]byte /* in_addr */
+ Zero [8]uint8
+}
+
+type RawSockaddrInet6 struct {
+ Family uint16
+ Port uint16
+ Flowinfo uint32
+ Addr [16]byte /* in6_addr */
+ Scope_id uint32
+}
+
+type RawSockaddrUnix struct {
+ Family uint16
+ Path [108]int8
+}
+
+type RawSockaddrLinklayer struct {
+ Family uint16
+ Protocol uint16
+ Ifindex int32
+ Hatype uint16
+ Pkttype uint8
+ Halen uint8
+ Addr [8]uint8
+}
+
+type RawSockaddrNetlink struct {
+ Family uint16
+ Pad uint16
+ Pid uint32
+ Groups uint32
+}
+
+type RawSockaddrHCI struct {
+ Family uint16
+ Dev uint16
+ Channel uint16
+}
+
+type RawSockaddr struct {
+ Family uint16
+ Data [14]int8
+}
+
+type RawSockaddrAny struct {
+ Addr RawSockaddr
+ Pad [96]int8
+}
+
+type _Socklen uint32
+
+type Linger struct {
+ Onoff int32
+ Linger int32
+}
+
+type Iovec struct {
+ Base *byte
+ Len uint64
+}
+
+type IPMreq struct {
+ Multiaddr [4]byte /* in_addr */
+ Interface [4]byte /* in_addr */
+}
+
+type IPMreqn struct {
+ Multiaddr [4]byte /* in_addr */
+ Address [4]byte /* in_addr */
+ Ifindex int32
+}
+
+type IPv6Mreq struct {
+ Multiaddr [16]byte /* in6_addr */
+ Interface uint32
+}
+
+type Msghdr struct {
+ Name *byte
+ Namelen uint32
+ _ [4]byte
+ Iov *Iovec
+ Iovlen uint64
+ Control *byte
+ Controllen uint64
+ Flags int32
+ _ [4]byte
+}
+
+type Cmsghdr struct {
+ Len uint64
+ Level int32
+ Type int32
+}
+
+type Inet4Pktinfo struct {
+ Ifindex int32
+ Spec_dst [4]byte /* in_addr */
+ Addr [4]byte /* in_addr */
+}
+
+type Inet6Pktinfo struct {
+ Addr [16]byte /* in6_addr */
+ Ifindex uint32
+}
+
+type IPv6MTUInfo struct {
+ Addr RawSockaddrInet6
+ Mtu uint32
+}
+
+type ICMPv6Filter struct {
+ Data [8]uint32
+}
+
+type Ucred struct {
+ Pid int32
+ Uid uint32
+ Gid uint32
+}
+
+type TCPInfo struct {
+ State uint8
+ Ca_state uint8
+ Retransmits uint8
+ Probes uint8
+ Backoff uint8
+ Options uint8
+ _ [2]byte
+ Rto uint32
+ Ato uint32
+ Snd_mss uint32
+ Rcv_mss uint32
+ Unacked uint32
+ Sacked uint32
+ Lost uint32
+ Retrans uint32
+ Fackets uint32
+ Last_data_sent uint32
+ Last_ack_sent uint32
+ Last_data_recv uint32
+ Last_ack_recv uint32
+ Pmtu uint32
+ Rcv_ssthresh uint32
+ Rtt uint32
+ Rttvar uint32
+ Snd_ssthresh uint32
+ Snd_cwnd uint32
+ Advmss uint32
+ Reordering uint32
+ Rcv_rtt uint32
+ Rcv_space uint32
+ Total_retrans uint32
+}
+
+const (
+ SizeofSockaddrInet4 = 0x10
+ SizeofSockaddrInet6 = 0x1c
+ SizeofSockaddrAny = 0x70
+ SizeofSockaddrUnix = 0x6e
+ SizeofSockaddrLinklayer = 0x14
+ SizeofSockaddrNetlink = 0xc
+ SizeofSockaddrHCI = 0x6
+ SizeofLinger = 0x8
+ SizeofIPMreq = 0x8
+ SizeofIPMreqn = 0xc
+ SizeofIPv6Mreq = 0x14
+ SizeofMsghdr = 0x38
+ SizeofCmsghdr = 0x10
+ SizeofInet4Pktinfo = 0xc
+ SizeofInet6Pktinfo = 0x14
+ SizeofIPv6MTUInfo = 0x20
+ SizeofICMPv6Filter = 0x20
+ SizeofUcred = 0xc
+ SizeofTCPInfo = 0x68
+)
+
+const (
+ IFA_UNSPEC = 0x0
+ IFA_ADDRESS = 0x1
+ IFA_LOCAL = 0x2
+ IFA_LABEL = 0x3
+ IFA_BROADCAST = 0x4
+ IFA_ANYCAST = 0x5
+ IFA_CACHEINFO = 0x6
+ IFA_MULTICAST = 0x7
+ IFLA_UNSPEC = 0x0
+ IFLA_ADDRESS = 0x1
+ IFLA_BROADCAST = 0x2
+ IFLA_IFNAME = 0x3
+ IFLA_MTU = 0x4
+ IFLA_LINK = 0x5
+ IFLA_QDISC = 0x6
+ IFLA_STATS = 0x7
+ IFLA_COST = 0x8
+ IFLA_PRIORITY = 0x9
+ IFLA_MASTER = 0xa
+ IFLA_WIRELESS = 0xb
+ IFLA_PROTINFO = 0xc
+ IFLA_TXQLEN = 0xd
+ IFLA_MAP = 0xe
+ IFLA_WEIGHT = 0xf
+ IFLA_OPERSTATE = 0x10
+ IFLA_LINKMODE = 0x11
+ IFLA_LINKINFO = 0x12
+ IFLA_NET_NS_PID = 0x13
+ IFLA_IFALIAS = 0x14
+ IFLA_MAX = 0x27
+ RT_SCOPE_UNIVERSE = 0x0
+ RT_SCOPE_SITE = 0xc8
+ RT_SCOPE_LINK = 0xfd
+ RT_SCOPE_HOST = 0xfe
+ RT_SCOPE_NOWHERE = 0xff
+ RT_TABLE_UNSPEC = 0x0
+ RT_TABLE_COMPAT = 0xfc
+ RT_TABLE_DEFAULT = 0xfd
+ RT_TABLE_MAIN = 0xfe
+ RT_TABLE_LOCAL = 0xff
+ RT_TABLE_MAX = 0xffffffff
+ RTA_UNSPEC = 0x0
+ RTA_DST = 0x1
+ RTA_SRC = 0x2
+ RTA_IIF = 0x3
+ RTA_OIF = 0x4
+ RTA_GATEWAY = 0x5
+ RTA_PRIORITY = 0x6
+ RTA_PREFSRC = 0x7
+ RTA_METRICS = 0x8
+ RTA_MULTIPATH = 0x9
+ RTA_FLOW = 0xb
+ RTA_CACHEINFO = 0xc
+ RTA_TABLE = 0xf
+ RTN_UNSPEC = 0x0
+ RTN_UNICAST = 0x1
+ RTN_LOCAL = 0x2
+ RTN_BROADCAST = 0x3
+ RTN_ANYCAST = 0x4
+ RTN_MULTICAST = 0x5
+ RTN_BLACKHOLE = 0x6
+ RTN_UNREACHABLE = 0x7
+ RTN_PROHIBIT = 0x8
+ RTN_THROW = 0x9
+ RTN_NAT = 0xa
+ RTN_XRESOLVE = 0xb
+ RTNLGRP_NONE = 0x0
+ RTNLGRP_LINK = 0x1
+ RTNLGRP_NOTIFY = 0x2
+ RTNLGRP_NEIGH = 0x3
+ RTNLGRP_TC = 0x4
+ RTNLGRP_IPV4_IFADDR = 0x5
+ RTNLGRP_IPV4_MROUTE = 0x6
+ RTNLGRP_IPV4_ROUTE = 0x7
+ RTNLGRP_IPV4_RULE = 0x8
+ RTNLGRP_IPV6_IFADDR = 0x9
+ RTNLGRP_IPV6_MROUTE = 0xa
+ RTNLGRP_IPV6_ROUTE = 0xb
+ RTNLGRP_IPV6_IFINFO = 0xc
+ RTNLGRP_IPV6_PREFIX = 0x12
+ RTNLGRP_IPV6_RULE = 0x13
+ RTNLGRP_ND_USEROPT = 0x14
+ SizeofNlMsghdr = 0x10
+ SizeofNlMsgerr = 0x14
+ SizeofRtGenmsg = 0x1
+ SizeofNlAttr = 0x4
+ SizeofRtAttr = 0x4
+ SizeofIfInfomsg = 0x10
+ SizeofIfAddrmsg = 0x8
+ SizeofRtMsg = 0xc
+ SizeofRtNexthop = 0x8
+)
+
+type NlMsghdr struct {
+ Len uint32
+ Type uint16
+ Flags uint16
+ Seq uint32
+ Pid uint32
+}
+
+type NlMsgerr struct {
+ Error int32
+ Msg NlMsghdr
+}
+
+type RtGenmsg struct {
+ Family uint8
+}
+
+type NlAttr struct {
+ Len uint16
+ Type uint16
+}
+
+type RtAttr struct {
+ Len uint16
+ Type uint16
+}
+
+type IfInfomsg struct {
+ Family uint8
+ _ uint8
+ Type uint16
+ Index int32
+ Flags uint32
+ Change uint32
+}
+
+type IfAddrmsg struct {
+ Family uint8
+ Prefixlen uint8
+ Flags uint8
+ Scope uint8
+ Index uint32
+}
+
+type RtMsg struct {
+ Family uint8
+ Dst_len uint8
+ Src_len uint8
+ Tos uint8
+ Table uint8
+ Protocol uint8
+ Scope uint8
+ Type uint8
+ Flags uint32
+}
+
+type RtNexthop struct {
+ Len uint16
+ Flags uint8
+ Hops uint8
+ Ifindex int32
+}
+
+const (
+ SizeofSockFilter = 0x8
+ SizeofSockFprog = 0x10
+)
+
+type SockFilter struct {
+ Code uint16
+ Jt uint8
+ Jf uint8
+ K uint32
+}
+
+type SockFprog struct {
+ Len uint16
+ _ [6]byte
+ Filter *SockFilter
+}
+
+type InotifyEvent struct {
+ Wd int32
+ Mask uint32
+ Cookie uint32
+ Len uint32
+}
+
+const SizeofInotifyEvent = 0x10
+
+type PtraceRegs struct {
+ Psw PtracePsw
+ Gprs [16]uint64
+ Acrs [16]uint32
+ Orig_gpr2 uint64
+ Fp_regs PtraceFpregs
+ Per_info PtracePer
+ Ieee_instruction_pointer uint64
+}
+
+type PtracePsw struct {
+ Mask uint64
+ Addr uint64
+}
+
+type PtraceFpregs struct {
+ Fpc uint32
+ _ [4]byte
+ Fprs [16]float64
+}
+
+type PtracePer struct {
+ _ [0]uint64
+ _ [24]byte
+ _ [8]byte
+ Starting_addr uint64
+ Ending_addr uint64
+ Perc_atmid uint16
+ _ [6]byte
+ Address uint64
+ Access_id uint8
+ _ [7]byte
+}
+
+type FdSet struct {
+ Bits [16]int64
+}
+
+type Sysinfo_t struct {
+ Uptime int64
+ Loads [3]uint64
+ Totalram uint64
+ Freeram uint64
+ Sharedram uint64
+ Bufferram uint64
+ Totalswap uint64
+ Freeswap uint64
+ Procs uint16
+ Pad uint16
+ _ [4]byte
+ Totalhigh uint64
+ Freehigh uint64
+ Unit uint32
+ _ [0]int8
+ _ [4]byte
+}
+
+type Utsname struct {
+ Sysname [65]int8
+ Nodename [65]int8
+ Release [65]int8
+ Version [65]int8
+ Machine [65]int8
+ Domainname [65]int8
+}
+
+type Ustat_t struct {
+ Tfree int32
+ _ [4]byte
+ Tinode uint64
+ Fname [6]int8
+ Fpack [6]int8
+ _ [4]byte
+}
+
+type EpollEvent struct {
+ Events uint32
+ _ int32
+ Fd int32
+ Pad int32
+}
+
+const (
+ AT_FDCWD = -0x64
+ AT_REMOVEDIR = 0x200
+ AT_SYMLINK_FOLLOW = 0x400
+ AT_SYMLINK_NOFOLLOW = 0x100
+)
+
+type PollFd struct {
+ Fd int32
+ Events int16
+ Revents int16
+}
+
+const (
+ POLLIN = 0x1
+ POLLPRI = 0x2
+ POLLOUT = 0x4
+ POLLRDHUP = 0x2000
+ POLLERR = 0x8
+ POLLHUP = 0x10
+ POLLNVAL = 0x20
+)
+
+type Sigset_t struct {
+ X__val [16]uint64
+}
+
+type Termios struct {
+ Iflag uint32
+ Oflag uint32
+ Cflag uint32
+ Lflag uint32
+ Line uint8
+ Cc [19]uint8
+ Ispeed uint32
+ Ospeed uint32
+}
diff --git a/vendor/golang.org/x/sys/unix/ztypes_solaris_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_solaris_amd64.go
index b3b928a51..02777e4d8 100644
--- a/vendor/golang.org/x/sys/unix/ztypes_solaris_amd64.go
+++ b/vendor/golang.org/x/sys/unix/ztypes_solaris_amd64.go
@@ -1,6 +1,6 @@
// +build amd64,solaris
// Created by cgo -godefs - DO NOT EDIT
-// cgo -godefs types_solaris.go
+// cgo -godefs types_solaris.go | go run mkpost.go
package unix
@@ -11,6 +11,7 @@ const (
sizeofLong = 0x8
sizeofLongLong = 0x8
PathMax = 0x400
+ MaxHostNameLen = 0x100
)
type (
diff --git a/vendor/golang.org/x/sys/windows/dll_windows.go b/vendor/golang.org/x/sys/windows/dll_windows.go
index 5f110679e..0f6204674 100644
--- a/vendor/golang.org/x/sys/windows/dll_windows.go
+++ b/vendor/golang.org/x/sys/windows/dll_windows.go
@@ -114,6 +114,8 @@ func (p *Proc) Addr() uintptr {
return p.addr
}
+//go:uintptrescapes
+
// Call executes procedure p with arguments a. It will panic, if more then 15 arguments
// are supplied.
//
@@ -293,6 +295,8 @@ func (p *LazyProc) Addr() uintptr {
return p.proc.Addr()
}
+//go:uintptrescapes
+
// Call executes procedure p with arguments a. It will panic, if more then 15 arguments
// are supplied.
//
diff --git a/vendor/golang.org/x/sys/windows/mksyscall.go b/vendor/golang.org/x/sys/windows/mksyscall.go
new file mode 100644
index 000000000..e1c88c9c7
--- /dev/null
+++ b/vendor/golang.org/x/sys/windows/mksyscall.go
@@ -0,0 +1,7 @@
+// Copyright 2009 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package windows
+
+//go:generate go run $GOROOT/src/syscall/mksyscall_windows.go -output zsyscall_windows.go eventlog.go service.go syscall_windows.go security_windows.go
diff --git a/vendor/golang.org/x/sys/windows/registry/mksyscall.go b/vendor/golang.org/x/sys/windows/registry/mksyscall.go
new file mode 100644
index 000000000..0ac95ffe7
--- /dev/null
+++ b/vendor/golang.org/x/sys/windows/registry/mksyscall.go
@@ -0,0 +1,7 @@
+// Copyright 2015 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package registry
+
+//go:generate go run $GOROOT/src/syscall/mksyscall_windows.go -output zsyscall_windows.go syscall.go
diff --git a/vendor/golang.org/x/sys/windows/registry/syscall.go b/vendor/golang.org/x/sys/windows/registry/syscall.go
index 5426cae90..a6525dac5 100644
--- a/vendor/golang.org/x/sys/windows/registry/syscall.go
+++ b/vendor/golang.org/x/sys/windows/registry/syscall.go
@@ -8,8 +8,6 @@ package registry
import "syscall"
-//go:generate go run $GOROOT/src/syscall/mksyscall_windows.go -output zsyscall_windows.go syscall.go
-
const (
_REG_OPTION_NON_VOLATILE = 0
diff --git a/vendor/golang.org/x/sys/windows/syscall_windows.go b/vendor/golang.org/x/sys/windows/syscall_windows.go
index 78991e8be..592d73e03 100644
--- a/vendor/golang.org/x/sys/windows/syscall_windows.go
+++ b/vendor/golang.org/x/sys/windows/syscall_windows.go
@@ -14,8 +14,6 @@ import (
"unsafe"
)
-//go:generate go run $GOROOT/src/syscall/mksyscall_windows.go -output zsyscall_windows.go eventlog.go service.go syscall_windows.go security_windows.go
-
type Handle uintptr
const InvalidHandle = ^Handle(0)
diff --git a/vendor/gopkg.in/fsnotify.v1/AUTHORS b/vendor/gopkg.in/fsnotify.v1/AUTHORS
index 6438bb31c..71c47ce89 100644
--- a/vendor/gopkg.in/fsnotify.v1/AUTHORS
+++ b/vendor/gopkg.in/fsnotify.v1/AUTHORS
@@ -11,6 +11,7 @@
Adrien Bustany <adrien@bustany.org>
Amit Krishnan <amit.krishnan@oracle.com>
Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
+Bruno Bigras <bigras.bruno@gmail.com>
Caleb Spare <cespare@gmail.com>
Case Nelson <case@teammating.com>
Chris Howey <chris@howey.me> <howeyc@gmail.com>
diff --git a/vendor/gopkg.in/fsnotify.v1/CHANGELOG.md b/vendor/gopkg.in/fsnotify.v1/CHANGELOG.md
index 675fab9eb..f6c7c485c 100644
--- a/vendor/gopkg.in/fsnotify.v1/CHANGELOG.md
+++ b/vendor/gopkg.in/fsnotify.v1/CHANGELOG.md
@@ -1,5 +1,9 @@
# Changelog
+## v1.3.1 / 2016-06-28
+
+* windows: fix for double backslash when watching the root of a drive [#151](https://github.com/fsnotify/fsnotify/issues/151) (thanks @brunoqc)
+
## v1.3.0 / 2016-04-19
* Support linux/arm64 by [patching](https://go-review.googlesource.com/#/c/21971/) x/sys/unix and switching to to it from syscall (thanks @suihkulokki) [#135](https://github.com/fsnotify/fsnotify/pull/135)
diff --git a/vendor/gopkg.in/fsnotify.v1/windows.go b/vendor/gopkg.in/fsnotify.v1/windows.go
index c836bdb3d..09436f31d 100644
--- a/vendor/gopkg.in/fsnotify.v1/windows.go
+++ b/vendor/gopkg.in/fsnotify.v1/windows.go
@@ -306,7 +306,7 @@ func (w *Watcher) remWatch(pathname string) error {
watch.mask = 0
} else {
name := filepath.Base(pathname)
- w.sendEvent(watch.path+"\\"+name, watch.names[name]&sysFSIGNORED)
+ w.sendEvent(filepath.Join(watch.path, name), watch.names[name]&sysFSIGNORED)
delete(watch.names, name)
}
return w.startRead(watch)
@@ -316,7 +316,7 @@ func (w *Watcher) remWatch(pathname string) error {
func (w *Watcher) deleteWatch(watch *watch) {
for name, mask := range watch.names {
if mask&provisional == 0 {
- w.sendEvent(watch.path+"\\"+name, mask&sysFSIGNORED)
+ w.sendEvent(filepath.Join(watch.path, name), mask&sysFSIGNORED)
}
delete(watch.names, name)
}
@@ -453,7 +453,7 @@ func (w *Watcher) readEvents() {
raw := (*syscall.FileNotifyInformation)(unsafe.Pointer(&watch.buf[offset]))
buf := (*[syscall.MAX_PATH]uint16)(unsafe.Pointer(&raw.FileName))
name := syscall.UTF16ToString(buf[:raw.FileNameLength/2])
- fullname := watch.path + "\\" + name
+ fullname := filepath.Join(watch.path, name)
var mask uint64
switch raw.Action {
@@ -491,7 +491,7 @@ func (w *Watcher) readEvents() {
}
}
if raw.Action == syscall.FILE_ACTION_RENAMED_NEW_NAME {
- fullname = watch.path + "\\" + watch.rename
+ fullname = filepath.Join(watch.path, watch.rename)
sendNameEvent()
}
diff --git a/vendor/gopkg.in/throttled/throttled.v1/.gitignore b/vendor/gopkg.in/throttled/throttled.v1/.gitignore
deleted file mode 100644
index c2a6499b4..000000000
--- a/vendor/gopkg.in/throttled/throttled.v1/.gitignore
+++ /dev/null
@@ -1,10 +0,0 @@
-.DS_Store
-*.swp
-*.swo
-*.test
-examples/interval/interval
-examples/interval-vary/interval-vary
-examples/interval-many/interval-many
-examples/memstats/memstats
-examples/rate-limit/rate-limit
-examples/custom/custom
diff --git a/vendor/gopkg.in/throttled/throttled.v1/.travis.yml b/vendor/gopkg.in/throttled/throttled.v1/.travis.yml
deleted file mode 100644
index 1b2427202..000000000
--- a/vendor/gopkg.in/throttled/throttled.v1/.travis.yml
+++ /dev/null
@@ -1,10 +0,0 @@
-sudo: false
-language: go
-
-go:
- - 1.2
- - tip
-
-install: go get -t ./...
-
-script: go test -v -short ./...
diff --git a/vendor/gopkg.in/throttled/throttled.v1/README.md b/vendor/gopkg.in/throttled/throttled.v1/README.md
deleted file mode 100644
index fbb4a01fc..000000000
--- a/vendor/gopkg.in/throttled/throttled.v1/README.md
+++ /dev/null
@@ -1,82 +0,0 @@
-# Throttled [![build status](https://secure.travis-ci.org/throttled/throttled.png)](http://travis-ci.org/throttled/throttled) [![GoDoc](https://godoc.org/gopkg.in/throttled/throttled.v1?status.png)](http://godoc.org/gopkg.in/throttled/throttled.v1)
-
-Package throttled implements different throttling strategies for controlling
-access to HTTP handlers.
-
-*As of July 27, 2015, the package is now located under its own GitHub
- organization and uses gopkg.in for versioning, please adjust your
- imports to `gopkg.in/throttled/throttled.v1`.*
-
-## Installation
-
-`go get gopkg.in/throttled/throttled.v1/...`
-
-## Interval
-
-The Interval function creates a throttler that allows requests to go through at
-a controlled, constant interval. The interval may be applied to all requests
-(vary argument == nil) or independently based on vary-by criteria.
-
-For example:
-
- th := throttled.Interval(throttled.PerSec(10), 100, &throttled.VaryBy{Path: true}, 50)
- h := th.Throttle(myHandler)
- http.ListenAndServe(":9000", h)
-
-Creates a throttler that will allow a request each 100ms (10 requests per second), with
-a buffer of 100 exceeding requests before dropping requests with a status code 429 (by
-default, configurable using th.DeniedHandler or the package-global DefaultDeniedHandler
-variable). Different paths will be throttled independently, so that /path_a and /path_b
-both can serve 10 requests per second. The last argument, 50, indicates the maximum number
-of keys that the throttler will keep in memory.
-
-## MemStats
-
-The MemStats function creates a throttler that allows requests to go through only if
-the memory statistics of the current process are below specified thresholds.
-
-For example:
-
- th := throttled.MemStats(throttled.MemThresholds(&runtime.MemStats{NumGC: 10}, 10*time.Millisecond)
- h := th.Throttle(myHandler)
- http.ListenAndServe(":9000", h)
-
-Creates a throttler that will allow requests to go through until the number of garbage
-collections reaches the initial number + 10 (the MemThresholds function creates absolute
-memory stats thresholds from offsets). The second argument, 10ms, indicates the refresh
-rate of the memory stats.
-
-## RateLimit
-
-The RateLimit function creates a throttler that allows a certain number of requests in
-a given time window, as is often implemented in public RESTful APIs.
-
-For example:
-
- th := throttled.RateLimit(throttled.PerMin(30), &throttled.VaryBy{RemoteAddr: true}, store.NewMemStore(1000))
- h := th.Throttle(myHandler)
- http.ListenAndServe(":9000", h)
-
-Creates a throttler that will limit requests to 30 per minute, based on the remote address
-of the client, and will store the counter and remaining time of the current window in the
-provided memory store, limiting the number of keys to keep in memory to 1000. The store
-sub-package also provides a Redis-based Store implementations.
-
-The RateLimit throttler sets the expected X-RateLimit-* headers on the response, and
-also sets a Retry-After header when the limit is exceeded.
-
-## Documentation
-
-The API documentation is available as usual on [godoc.org][doc].
-
-There is also a [blog post explaining the package's usage on 0value.com][blog].
-
-Finally, many examples are provided in the /examples sub-folder of the repository.
-
-## License
-
-The [BSD 3-clause license][bsd]. Copyright (c) 2014 Martin Angers and Contributors.
-
-[doc]: http://godoc.org/gopkg.in/throttled/throttled.v1
-[blog]: http://0value.com/throttled--guardian-of-the-web-server
-[bsd]: http://opensource.org/licenses/BSD-3-Clause
diff --git a/vendor/gopkg.in/throttled/throttled.v1/common_test.go b/vendor/gopkg.in/throttled/throttled.v1/common_test.go
deleted file mode 100644
index ddb57fb1c..000000000
--- a/vendor/gopkg.in/throttled/throttled.v1/common_test.go
+++ /dev/null
@@ -1,65 +0,0 @@
-package throttled
-
-import (
- "fmt"
- "net/http"
- "net/http/httptest"
- "sync"
- "time"
-
- "github.com/PuerkitoBio/boom/commands"
-)
-
-type stats struct {
- sync.Mutex
- ok int
- dropped int
- ts []time.Time
-
- body func()
-}
-
-func (s *stats) ServeHTTP(w http.ResponseWriter, r *http.Request) {
- if s.body != nil {
- s.body()
- }
- s.Lock()
- defer s.Unlock()
- s.ts = append(s.ts, time.Now())
- s.ok++
- w.WriteHeader(200)
-}
-
-func (s *stats) DeniedHTTP(w http.ResponseWriter, r *http.Request) {
- s.Lock()
- defer s.Unlock()
- s.dropped++
- w.WriteHeader(deniedStatus)
-}
-
-func (s *stats) Stats() (int, int, []time.Time) {
- s.Lock()
- defer s.Unlock()
- return s.ok, s.dropped, s.ts
-}
-
-func runTest(h http.Handler, b ...commands.Boom) []*commands.Report {
- srv := httptest.NewServer(h)
- defer srv.Close()
-
- var rpts []*commands.Report
- var wg sync.WaitGroup
- var mu sync.Mutex
- wg.Add(len(b))
- for i, bo := range b {
- bo.Req.Url = srv.URL + fmt.Sprintf("/%d", i)
- go func(bo commands.Boom) {
- mu.Lock()
- defer mu.Unlock()
- rpts = append(rpts, bo.Run())
- wg.Done()
- }(bo)
- }
- wg.Wait()
- return rpts
-}
diff --git a/vendor/gopkg.in/throttled/throttled.v1/delayer.go b/vendor/gopkg.in/throttled/throttled.v1/delayer.go
deleted file mode 100644
index e62ec9e86..000000000
--- a/vendor/gopkg.in/throttled/throttled.v1/delayer.go
+++ /dev/null
@@ -1,109 +0,0 @@
-package throttled
-
-import "time"
-
-// The Quota interface defines the method to implement to describe
-// a time-window quota, as required by the RateLimit throttler.
-type Quota interface {
- // Quota returns a number of requests allowed, and a duration.
- Quota() (int, time.Duration)
-}
-
-// The Delayer interface defines the method to implement to describe
-// a delay as required by the Interval throttler.
-type Delayer interface {
- // Delay returns a duration.
- Delay() time.Duration
-}
-
-// PerSec represents a number of requests per second.
-type PerSec int
-
-// Delay returns the duration to wait before the next request can go through,
-// so that PerSec(n) == n requests per second at regular intervals.
-func (ps PerSec) Delay() time.Duration {
- if ps <= 0 {
- return 0
- }
- return time.Duration(1.0 / float64(ps) * float64(time.Second))
-}
-
-// Quota returns the number of requests allowed in a 1 second time window,
-// so that PerSec(n) == n requests allowed per second.
-func (ps PerSec) Quota() (int, time.Duration) {
- return int(ps), time.Second
-}
-
-// PerMin represents a number of requests per minute.
-type PerMin int
-
-// Delay returns the duration to wait before the next request can go through,
-// so that PerMin(n) == n requests per minute at regular intervals.
-func (pm PerMin) Delay() time.Duration {
- if pm <= 0 {
- return 0
- }
- return time.Duration(1.0 / float64(pm) * float64(time.Minute))
-}
-
-// Quota returns the number of requests allowed in a 1 minute time window,
-// so that PerMin(n) == n requests allowed per minute.
-func (pm PerMin) Quota() (int, time.Duration) {
- return int(pm), time.Minute
-}
-
-// PerHour represents a number of requests per hour.
-type PerHour int
-
-// Delay returns the duration to wait before the next request can go through,
-// so that PerHour(n) == n requests per hour at regular intervals.
-func (ph PerHour) Delay() time.Duration {
- if ph <= 0 {
- return 0
- }
- return time.Duration(1.0 / float64(ph) * float64(time.Hour))
-}
-
-// Quota returns the number of requests allowed in a 1 hour time window,
-// so that PerHour(n) == n requests allowed per hour.
-func (ph PerHour) Quota() (int, time.Duration) {
- return int(ph), time.Hour
-}
-
-// PerDay represents a number of requests per day.
-type PerDay int
-
-// Delay returns the duration to wait before the next request can go through,
-// so that PerDay(n) == n requests per day at regular intervals.
-func (pd PerDay) Delay() time.Duration {
- if pd <= 0 {
- return 0
- }
- return time.Duration(1.0 / float64(pd) * float64(24*time.Hour))
-}
-
-// Quota returns the number of requests allowed in a 1 day time window,
-// so that PerDay(n) == n requests allowed per day.
-func (pd PerDay) Quota() (int, time.Duration) {
- return int(pd), 24 * time.Hour
-}
-
-// D represents a custom delay.
-type D time.Duration
-
-// Delay returns the duration to wait before the next request can go through,
-// which is the custom duration represented by the D value.
-func (d D) Delay() time.Duration {
- return time.Duration(d)
-}
-
-// Q represents a custom quota.
-type Q struct {
- Requests int
- Window time.Duration
-}
-
-// Quota returns the number of requests allowed and the custom time window.
-func (q Q) Quota() (int, time.Duration) {
- return q.Requests, q.Window
-}
diff --git a/vendor/gopkg.in/throttled/throttled.v1/delayer_test.go b/vendor/gopkg.in/throttled/throttled.v1/delayer_test.go
deleted file mode 100644
index 822978e5d..000000000
--- a/vendor/gopkg.in/throttled/throttled.v1/delayer_test.go
+++ /dev/null
@@ -1,65 +0,0 @@
-package throttled
-
-import (
- "testing"
- "time"
-)
-
-func TestDelayer(t *testing.T) {
- cases := []struct {
- in Delayer
- out time.Duration
- }{
- 0: {PerSec(1), time.Second},
- 1: {PerSec(2), 500 * time.Millisecond},
- 2: {PerSec(4), 250 * time.Millisecond},
- 3: {PerSec(5), 200 * time.Millisecond},
- 4: {PerSec(10), 100 * time.Millisecond},
- 5: {PerSec(100), 10 * time.Millisecond},
- 6: {PerSec(3), 333333333 * time.Nanosecond},
- 7: {PerMin(1), time.Minute},
- 8: {PerMin(2), 30 * time.Second},
- 9: {PerMin(4), 15 * time.Second},
- 10: {PerMin(5), 12 * time.Second},
- 11: {PerMin(10), 6 * time.Second},
- 12: {PerMin(60), time.Second},
- 13: {PerHour(1), time.Hour},
- 14: {PerHour(2), 30 * time.Minute},
- 15: {PerHour(4), 15 * time.Minute},
- 16: {PerHour(60), time.Minute},
- 17: {PerHour(120), 30 * time.Second},
- 18: {D(time.Second), time.Second},
- 19: {D(5 * time.Minute), 5 * time.Minute},
- 20: {PerSec(200), 5 * time.Millisecond},
- 21: {PerDay(24), time.Hour},
- }
- for i, c := range cases {
- got := c.in.Delay()
- if got != c.out {
- t.Errorf("%d: expected %s, got %s", i, c.out, got)
- }
- }
-}
-
-func TestQuota(t *testing.T) {
- cases := []struct {
- q Quota
- reqs int
- win time.Duration
- }{
- 0: {PerSec(10), 10, time.Second},
- 1: {PerMin(30), 30, time.Minute},
- 2: {PerHour(124), 124, time.Hour},
- 3: {PerDay(1), 1, 24 * time.Hour},
- 4: {Q{148, 17 * time.Second}, 148, 17 * time.Second},
- }
- for i, c := range cases {
- r, w := c.q.Quota()
- if r != c.reqs {
- t.Errorf("%d: expected %d requests, got %d", i, c.reqs, r)
- }
- if w != c.win {
- t.Errorf("%d: expected %s window, got %s", i, c.win, w)
- }
- }
-}
diff --git a/vendor/gopkg.in/throttled/throttled.v1/doc.go b/vendor/gopkg.in/throttled/throttled.v1/doc.go
deleted file mode 100644
index a2c8d4c75..000000000
--- a/vendor/gopkg.in/throttled/throttled.v1/doc.go
+++ /dev/null
@@ -1,77 +0,0 @@
-// Package throttled implements different throttling strategies for controlling
-// access to HTTP handlers.
-//
-// Installation
-//
-// go get gopkg.in/throttled/throttled.v1/...
-//
-// Inverval
-//
-// The Interval function creates a throttler that allows requests to go through at
-// a controlled, constant interval. The interval may be applied to all requests
-// (vary argument == nil) or independently based on vary-by criteria.
-//
-// For example:
-//
-// th := throttled.Interval(throttled.PerSec(10), 100, &throttled.VaryBy{Path: true}, 50)
-// h := th.Throttle(myHandler)
-// http.ListenAndServe(":9000", h)
-//
-// Creates a throttler that will allow a request each 100ms (10 requests per second), with
-// a buffer of 100 exceeding requests before dropping requests with a status code 429 (by
-// default, configurable using th.DeniedHandler or the package-global DefaultDeniedHandler
-// variable). Different paths will be throttled independently, so that /path_a and /path_b
-// both can serve 10 requests per second. The last argument, 50, indicates the maximum number
-// of keys that the throttler will keep in memory.
-//
-// MemStats
-//
-// The MemStats function creates a throttler that allows requests to go through only if
-// the memory statistics of the current process are below specified thresholds.
-//
-// For example:
-//
-// th := throttled.MemStats(throttled.MemThresholds(&runtime.MemStats{NumGC: 10}, 10*time.Millisecond)
-// h := th.Throttle(myHandler)
-// http.ListenAndServe(":9000", h)
-//
-// Creates a throttler that will allow requests to go through until the number of garbage
-// collections reaches the initial number + 10 (the MemThresholds function creates absolute
-// memory stats thresholds from offsets). The second argument, 10ms, indicates the refresh
-// rate of the memory stats.
-//
-// RateLimit
-//
-// The RateLimit function creates a throttler that allows a certain number of requests in
-// a given time window, as is often implemented in public RESTful APIs.
-//
-// For example:
-//
-// th := throttled.RateLimit(throttled.PerMin(30), &throttled.VaryBy{RemoteAddr: true}, store.NewMemStore(1000))
-// h := th.Throttle(myHandler)
-// http.ListenAndServe(":9000", h)
-//
-// Creates a throttler that will limit requests to 30 per minute, based on the remote address
-// of the client, and will store the counter and remaining time of the current window in the
-// provided memory store, limiting the number of keys to keep in memory to 1000. The store
-// sub-package also provides a Redis-based Store implementations.
-//
-// The RateLimit throttler sets the expected X-RateLimit-* headers on the response, and
-// also sets a Retry-After header when the limit is exceeded.
-//
-// Documentation
-//
-// The API documentation is available as usual on godoc.org:
-// http://godoc.org/gopkg.in/throttled/throttled.v1
-//
-// There is also a blog post explaining the package's usage on 0value.com:
-// http://0value.com/throttled--guardian-of-the-web-server
-//
-// Finally, many examples are provided in the /examples sub-folder of the repository.
-//
-// License
-//
-// The BSD 3-clause license. Copyright (c) 2014 Martin Angers and Contributors.
-// http://opensource.org/licenses/BSD-3-Clause
-//
-package throttled // import "gopkg.in/throttled/throttled.v1"
diff --git a/vendor/gopkg.in/throttled/throttled.v1/examples/README.md b/vendor/gopkg.in/throttled/throttled.v1/examples/README.md
deleted file mode 100644
index 6b12dad20..000000000
--- a/vendor/gopkg.in/throttled/throttled.v1/examples/README.md
+++ /dev/null
@@ -1,12 +0,0 @@
-# Examples
-
-This directory contains examples for all the throttlers implemented by the throttled package, as well as an example of a custom limiter.
-
-* custom/ : implements a custom limiter that allows requests to path /a on even seconds, and on path /b on odd seconds.
-* interval-many/ : implements a common interval throttler to control two different handlers, one for path /a and another for path /b, so that requests to any one of the handlers go through at the specified interval.
-* interval-vary/ : implements an interval throttler that varies by path, so that requests to each different path goes through at the specified interval.
-* interval/ : implements an interval throttler so that any request goes through at the specified interval, regardless of path or any other criteria.
-* memstats/ : implements a memory-usage throttler that limits access based on current memory statistics.
-* rate-limit/ : implements a rate-limiter throttler that varies by path, so that the number of requests allowed are counted based on the requested path.
-
-Each example app supports a number of command-line flags. Run the example with the -h flag to display usage and defaults.
diff --git a/vendor/gopkg.in/throttled/throttled.v1/examples/custom/main.go b/vendor/gopkg.in/throttled/throttled.v1/examples/custom/main.go
deleted file mode 100644
index b3fe993e8..000000000
--- a/vendor/gopkg.in/throttled/throttled.v1/examples/custom/main.go
+++ /dev/null
@@ -1,90 +0,0 @@
-package main
-
-import (
- "flag"
- "fmt"
- "log"
- "math/rand"
- "net/http"
- "sync"
- "time"
-
- "gopkg.in/throttled/throttled.v1"
-)
-
-var (
- delayRes = flag.Duration("delay-response", 0, "delay the response by a random duration between 0 and this value")
- output = flag.String("output", "v", "type of output, one of `v`erbose, `q`uiet, `ok`-only, `ko`-only")
-)
-
-// Custom limiter: allow requests to the /a path on even seconds only, and
-// allow access to the /b path on odd seconds only.
-//
-// Yes this is absurd. A more realistic case could be to allow requests to some
-// contest page only during a limited time window.
-type customLimiter struct {
-}
-
-func (c *customLimiter) Start() {
- // No-op
-}
-
-func (c *customLimiter) Limit(w http.ResponseWriter, r *http.Request) (<-chan bool, error) {
- s := time.Now().Second()
- ch := make(chan bool, 1)
- ok := (r.URL.Path == "/a" && s%2 == 0) || (r.URL.Path == "/b" && s%2 != 0)
- ch <- ok
- if *output == "v" {
- log.Printf("Custom Limiter: Path=%s, Second=%d; ok? %v", r.URL.Path, s, ok)
- }
- return ch, nil
-}
-
-func main() {
- flag.Parse()
-
- var h http.Handler
- var ok, ko int
- var mu sync.Mutex
-
- // Keep the start time to print since-time
- start := time.Now()
- // Create the custom throttler using our custom limiter
- t := throttled.Custom(&customLimiter{})
- // Set its denied handler
- t.DeniedHandler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
- if *output == "v" || *output == "ko" {
- log.Printf("KO: %s", time.Since(start))
- }
- throttled.DefaultDeniedHandler.ServeHTTP(w, r)
- mu.Lock()
- defer mu.Unlock()
- ko++
- })
- // Throttle the OK handler
- rand.Seed(time.Now().Unix())
- h = t.Throttle(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
- if *output == "v" || *output == "ok" {
- log.Printf("ok: %s", time.Since(start))
- }
- if *delayRes > 0 {
- wait := time.Duration(rand.Intn(int(*delayRes)))
- time.Sleep(wait)
- }
- w.WriteHeader(200)
- mu.Lock()
- defer mu.Unlock()
- ok++
- }))
-
- // Print stats once in a while
- go func() {
- for _ = range time.Tick(10 * time.Second) {
- mu.Lock()
- log.Printf("ok: %d, ko: %d", ok, ko)
- mu.Unlock()
- }
- }()
- fmt.Println("server listening on port 9000")
- http.ListenAndServe(":9000", h)
-}
diff --git a/vendor/gopkg.in/throttled/throttled.v1/examples/interval-many/main.go b/vendor/gopkg.in/throttled/throttled.v1/examples/interval-many/main.go
deleted file mode 100644
index 51a4ca023..000000000
--- a/vendor/gopkg.in/throttled/throttled.v1/examples/interval-many/main.go
+++ /dev/null
@@ -1,79 +0,0 @@
-package main
-
-import (
- "flag"
- "fmt"
- "log"
- "math/rand"
- "net/http"
- "sync"
- "time"
-
- "gopkg.in/throttled/throttled.v1"
-)
-
-var (
- delay = flag.Duration("delay", 200*time.Millisecond, "delay between calls")
- bursts = flag.Int("bursts", 10, "number of bursts allowed")
- delayRes = flag.Duration("delay-response", 0, "delay the response by a random duration between 0 and this value")
- output = flag.String("output", "v", "type of output, one of `v`erbose, `q`uiet, `ok`-only, `ko`-only")
-)
-
-func main() {
- flag.Parse()
-
- var ok, ko int
- var mu sync.Mutex
-
- // Keep start time to log since-time
- start := time.Now()
-
- // Create the interval throttle
- t := throttled.Interval(throttled.D(*delay), *bursts, nil, 0)
- // Set its denied handler
- t.DeniedHandler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
- if *output == "v" || *output == "ko" {
- log.Printf("%s: KO: %s", r.URL.Path, time.Since(start))
- }
- throttled.DefaultDeniedHandler.ServeHTTP(w, r)
- mu.Lock()
- defer mu.Unlock()
- ko++
- })
- // Create OK handlers
- rand.Seed(time.Now().Unix())
- makeHandler := func(ix int) http.Handler {
- return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
- if *output == "v" || *output == "ok" {
- log.Printf("handler %d: %s: ok: %s", ix, r.URL.Path, time.Since(start))
- }
- if *delayRes > 0 {
- wait := time.Duration(rand.Intn(int(*delayRes)))
- time.Sleep(wait)
- }
- w.WriteHeader(200)
- mu.Lock()
- defer mu.Unlock()
- ok++
- })
- }
- // Throttle them using the same interval throttler
- h1 := t.Throttle(makeHandler(1))
- h2 := t.Throttle(makeHandler(2))
-
- // Handle two paths
- mux := http.NewServeMux()
- mux.Handle("/a", h1)
- mux.Handle("/b", h2)
-
- // Print stats once in a while
- go func() {
- for _ = range time.Tick(10 * time.Second) {
- mu.Lock()
- log.Printf("ok: %d, ko: %d", ok, ko)
- mu.Unlock()
- }
- }()
- fmt.Println("server listening on port 9000")
- http.ListenAndServe(":9000", mux)
-}
diff --git a/vendor/gopkg.in/throttled/throttled.v1/examples/interval-vary/main.go b/vendor/gopkg.in/throttled/throttled.v1/examples/interval-vary/main.go
deleted file mode 100644
index f43cdc122..000000000
--- a/vendor/gopkg.in/throttled/throttled.v1/examples/interval-vary/main.go
+++ /dev/null
@@ -1,74 +0,0 @@
-package main
-
-import (
- "flag"
- "fmt"
- "log"
- "math/rand"
- "net/http"
- "sync"
- "time"
-
- "gopkg.in/throttled/throttled.v1"
-)
-
-var (
- delay = flag.Duration("delay", 200*time.Millisecond, "delay between calls")
- bursts = flag.Int("bursts", 10, "number of bursts allowed")
- maxkeys = flag.Int("max-keys", 1000, "maximum number of keys")
- delayRes = flag.Duration("delay-response", 0, "delay the response by a random duration between 0 and this value")
- output = flag.String("output", "v", "type of output, one of `v`erbose, `q`uiet, `ok`-only, `ko`-only")
-)
-
-func main() {
- flag.Parse()
-
- var h http.Handler
- var ok, ko int
- var mu sync.Mutex
-
- // Keep the start time to print since-time
- start := time.Now()
-
- // Create the interval throttler
- t := throttled.Interval(throttled.D(*delay), *bursts, &throttled.VaryBy{
- Path: true,
- }, *maxkeys)
- // Set the denied handler
- t.DeniedHandler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
- if *output == "v" || *output == "ko" {
- log.Printf("KO: %s", time.Since(start))
- }
- throttled.DefaultDeniedHandler.ServeHTTP(w, r)
- mu.Lock()
- defer mu.Unlock()
- ko++
- })
-
- // Throttle the OK handler
- rand.Seed(time.Now().Unix())
- h = t.Throttle(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
- if *output == "v" || *output == "ok" {
- log.Printf("%s: ok: %s", r.URL.Path, time.Since(start))
- }
- if *delayRes > 0 {
- wait := time.Duration(rand.Intn(int(*delayRes)))
- time.Sleep(wait)
- }
- w.WriteHeader(200)
- mu.Lock()
- defer mu.Unlock()
- ok++
- }))
-
- // Print stats once in a while
- go func() {
- for _ = range time.Tick(10 * time.Second) {
- mu.Lock()
- log.Printf("ok: %d, ko: %d", ok, ko)
- mu.Unlock()
- }
- }()
- fmt.Println("server listening on port 9000")
- http.ListenAndServe(":9000", h)
-}
diff --git a/vendor/gopkg.in/throttled/throttled.v1/examples/interval-vary/siege-urls b/vendor/gopkg.in/throttled/throttled.v1/examples/interval-vary/siege-urls
deleted file mode 100644
index 9a2d0d312..000000000
--- a/vendor/gopkg.in/throttled/throttled.v1/examples/interval-vary/siege-urls
+++ /dev/null
@@ -1,4 +0,0 @@
-http://localhost:9000/a
-http://localhost:9000/b
-http://localhost:9000/c
-
diff --git a/vendor/gopkg.in/throttled/throttled.v1/examples/interval/main.go b/vendor/gopkg.in/throttled/throttled.v1/examples/interval/main.go
deleted file mode 100644
index ef8ee2cb8..000000000
--- a/vendor/gopkg.in/throttled/throttled.v1/examples/interval/main.go
+++ /dev/null
@@ -1,69 +0,0 @@
-package main
-
-import (
- "flag"
- "fmt"
- "log"
- "math/rand"
- "net/http"
- "sync"
- "time"
-
- "gopkg.in/throttled/throttled.v1"
-)
-
-var (
- delay = flag.Duration("delay", 200*time.Millisecond, "delay between calls")
- bursts = flag.Int("bursts", 10, "number of bursts allowed")
- delayRes = flag.Duration("delay-response", 0, "delay the response by a random duration between 0 and this value")
- output = flag.String("output", "v", "type of output, one of `v`erbose, `q`uiet, `ok`-only, `ko`-only")
-)
-
-func main() {
- flag.Parse()
-
- var h http.Handler
- var ok, ko int
- var mu sync.Mutex
-
- // Keep the start time to print since-time
- start := time.Now()
- // Create the interval throttler
- t := throttled.Interval(throttled.D(*delay), *bursts, nil, 0)
- // Set its denied handler
- t.DeniedHandler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
- if *output == "v" || *output == "ko" {
- log.Printf("KO: %s", time.Since(start))
- }
- throttled.DefaultDeniedHandler.ServeHTTP(w, r)
- mu.Lock()
- defer mu.Unlock()
- ko++
- })
- // Throttle the OK handler
- rand.Seed(time.Now().Unix())
- h = t.Throttle(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
- if *output == "v" || *output == "ok" {
- log.Printf("ok: %s", time.Since(start))
- }
- if *delayRes > 0 {
- wait := time.Duration(rand.Intn(int(*delayRes)))
- time.Sleep(wait)
- }
- w.WriteHeader(200)
- mu.Lock()
- defer mu.Unlock()
- ok++
- }))
-
- // Print stats once in a while
- go func() {
- for _ = range time.Tick(10 * time.Second) {
- mu.Lock()
- log.Printf("ok: %d, ko: %d", ok, ko)
- mu.Unlock()
- }
- }()
- fmt.Println("server listening on port 9000")
- http.ListenAndServe(":9000", h)
-}
diff --git a/vendor/gopkg.in/throttled/throttled.v1/examples/memstats/main.go b/vendor/gopkg.in/throttled/throttled.v1/examples/memstats/main.go
deleted file mode 100644
index 50d4cc69b..000000000
--- a/vendor/gopkg.in/throttled/throttled.v1/examples/memstats/main.go
+++ /dev/null
@@ -1,97 +0,0 @@
-package main
-
-import (
- "flag"
- "fmt"
- "io/ioutil"
- "log"
- "math/rand"
- "net/http"
- "runtime"
- "sync"
- "time"
-
- "gopkg.in/throttled/throttled.v1"
-)
-
-var (
- numgc = flag.Int("gc", 0, "number of GC runs")
- mallocs = flag.Int("mallocs", 0, "number of mallocs")
- total = flag.Int("total", 0, "total number of bytes allocated")
- allocs = flag.Int("allocs", 0, "number of bytes allocated")
- refrate = flag.Duration("refresh", 0, "refresh rate of the memory stats")
- delayRes = flag.Duration("delay-response", 0, "delay the response by a random duration between 0 and this value")
- output = flag.String("output", "v", "type of output, one of `v`erbose, `q`uiet, `ok`-only, `ko`-only")
-)
-
-func main() {
- flag.Parse()
-
- var h http.Handler
- var ok, ko int
- var mu sync.Mutex
-
- // Keep the start time to print since-time
- start := time.Now()
- // Create the thresholds struct
- thresh := throttled.MemThresholds(&runtime.MemStats{
- NumGC: uint32(*numgc),
- Mallocs: uint64(*mallocs),
- TotalAlloc: uint64(*total),
- Alloc: uint64(*allocs),
- })
- if *output != "q" {
- log.Printf("thresholds: NumGC: %d, Mallocs: %d, Alloc: %dKb, Total: %dKb", thresh.NumGC, thresh.Mallocs, thresh.Alloc/1024, thresh.TotalAlloc/1024)
- }
- // Create the MemStats throttler
- t := throttled.MemStats(thresh, *refrate)
- // Set its denied handler
- t.DeniedHandler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
- if *output == "v" || *output == "ko" {
- log.Printf("KO: %s", time.Since(start))
- }
- throttled.DefaultDeniedHandler.ServeHTTP(w, r)
- mu.Lock()
- defer mu.Unlock()
- ko++
- })
-
- // Throttle the OK handler
- rand.Seed(time.Now().Unix())
- h = t.Throttle(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
- if *output == "v" || *output == "ok" {
- log.Printf("ok: %s", time.Since(start))
- }
- if *delayRes > 0 {
- wait := time.Duration(rand.Intn(int(*delayRes)))
- time.Sleep(wait)
- }
- // Read the whole file in memory, to actually use 64Kb (instead of streaming to w)
- b, err := ioutil.ReadFile("test-file")
- if err != nil {
- throttled.Error(w, r, err)
- return
- }
- _, err = w.Write(b)
- if err != nil {
- throttled.Error(w, r, err)
- }
- mu.Lock()
- defer mu.Unlock()
- ok++
- }))
-
- // Print stats once in a while
- go func() {
- var mem runtime.MemStats
- for _ = range time.Tick(10 * time.Second) {
- mu.Lock()
- runtime.ReadMemStats(&mem)
- log.Printf("ok: %d, ko: %d", ok, ko)
- log.Printf("TotalAllocs: %d Kb, Allocs: %d Kb, Mallocs: %d, NumGC: %d", mem.TotalAlloc/1024, mem.Alloc/1024, mem.Mallocs, mem.NumGC)
- mu.Unlock()
- }
- }()
- fmt.Println("server listening on port 9000")
- http.ListenAndServe(":9000", h)
-}
diff --git a/vendor/gopkg.in/throttled/throttled.v1/examples/memstats/test-file b/vendor/gopkg.in/throttled/throttled.v1/examples/memstats/test-file
deleted file mode 100644
index c97c12f9b..000000000
--- a/vendor/gopkg.in/throttled/throttled.v1/examples/memstats/test-file
+++ /dev/null
Binary files differ
diff --git a/vendor/gopkg.in/throttled/throttled.v1/examples/rate-limit/main.go b/vendor/gopkg.in/throttled/throttled.v1/examples/rate-limit/main.go
deleted file mode 100644
index b00119f63..000000000
--- a/vendor/gopkg.in/throttled/throttled.v1/examples/rate-limit/main.go
+++ /dev/null
@@ -1,101 +0,0 @@
-package main
-
-import (
- "flag"
- "fmt"
- "log"
- "math/rand"
- "net/http"
- "sync"
- "time"
-
- "github.com/garyburd/redigo/redis"
- "gopkg.in/throttled/throttled.v1"
- "gopkg.in/throttled/throttled.v1/store"
-)
-
-var (
- requests = flag.Int("requests", 10, "number of requests allowed in the time window")
- window = flag.Duration("window", time.Minute, "time window for the limit of requests")
- storeType = flag.String("store", "mem", "store to use, one of `mem` or `redis` (on default localhost port)")
- delayRes = flag.Duration("delay-response", 0, "delay the response by a random duration between 0 and this value")
- output = flag.String("output", "v", "type of output, one of `v`erbose, `q`uiet, `ok`-only, `ko`-only")
-)
-
-func main() {
- flag.Parse()
-
- var h http.Handler
- var ok, ko int
- var mu sync.Mutex
- var st throttled.Store
-
- // Keep the start time to print since-time
- start := time.Now()
- // Create the rate-limit store
- switch *storeType {
- case "mem":
- st = store.NewMemStore(0)
- case "redis":
- st = store.NewRedisStore(setupRedis(), "throttled:", 0)
- default:
- log.Fatalf("unsupported store: %s", *storeType)
- }
- // Create the rate-limit throttler, varying on path
- t := throttled.RateLimit(throttled.Q{Requests: *requests, Window: *window}, &throttled.VaryBy{
- Path: true,
- }, st)
-
- // Set its denied handler
- t.DeniedHandler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
- if *output == "v" || *output == "ko" {
- log.Printf("KO: %s", time.Since(start))
- }
- throttled.DefaultDeniedHandler.ServeHTTP(w, r)
- mu.Lock()
- defer mu.Unlock()
- ko++
- })
-
- // Throttle the OK handler
- rand.Seed(time.Now().Unix())
- h = t.Throttle(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
- if *output == "v" || *output == "ok" {
- log.Printf("ok: %s", time.Since(start))
- }
- if *delayRes > 0 {
- wait := time.Duration(rand.Intn(int(*delayRes)))
- time.Sleep(wait)
- }
- w.WriteHeader(200)
- mu.Lock()
- defer mu.Unlock()
- ok++
- }))
-
- // Print stats once in a while
- go func() {
- for _ = range time.Tick(10 * time.Second) {
- mu.Lock()
- log.Printf("ok: %d, ko: %d", ok, ko)
- mu.Unlock()
- }
- }()
- fmt.Println("server listening on port 9000")
- http.ListenAndServe(":9000", h)
-}
-
-func setupRedis() *redis.Pool {
- pool := &redis.Pool{
- MaxIdle: 3,
- IdleTimeout: 30 * time.Second,
- Dial: func() (redis.Conn, error) {
- return redis.Dial("tcp", ":6379")
- },
- TestOnBorrow: func(c redis.Conn, t time.Time) error {
- _, err := c.Do("PING")
- return err
- },
- }
- return pool
-}
diff --git a/vendor/gopkg.in/throttled/throttled.v1/interval.go b/vendor/gopkg.in/throttled/throttled.v1/interval.go
deleted file mode 100644
index 628a5593e..000000000
--- a/vendor/gopkg.in/throttled/throttled.v1/interval.go
+++ /dev/null
@@ -1,164 +0,0 @@
-package throttled
-
-import (
- "net/http"
- "sync"
- "time"
-
- "github.com/golang/groupcache/lru"
-)
-
-// Static check to ensure that the interval limiters implement the Limiter interface.
-var _ Limiter = (*intervalVaryByLimiter)(nil)
-var _ Limiter = (*intervalLimiter)(nil)
-
-// Interval creates a throttler that controls the requests so that they
-// go through at a constant interval. The interval is specified by the
-// delay argument, and convenience types such as PerSec can be used to
-// express the interval in a more expressive way, i.e. PerSec(10) means
-// 10 requests per second or one request each 100ms, PerMin(30) means
-// 30 requests per minute or on request each 2s, etc.
-//
-// The bursts argument indicates the number of exceeding requests that may
-// be queued up waiting to be processed. Requests that overflow the queue
-// are dropped and go through the denied handler, which may be specified
-// on the Throttler and that defaults to the package-global variable
-// DefaultDeniedHandler.
-//
-// The vary argument indicates the criteria to use to group the requests,
-// so that the interval applies to the requests in the same group (e.g. based on
-// the path, or the remote IP address, etc.). If this argument is nil, the
-// interval applies to all requests going through this throttler.
-//
-// The maxKeys indicates the maximum number of keys to keep in memory to apply the interval,
-// when a vary argument is specified. A LRU algorithm is used to remove older keys.
-//
-func Interval(delay Delayer, bursts int, vary *VaryBy, maxKeys int) *Throttler {
- var l Limiter
- if vary != nil {
- if maxKeys < 1 {
- maxKeys = 1
- }
- l = &intervalVaryByLimiter{
- delay: delay.Delay(),
- bursts: bursts,
- vary: vary,
- maxKeys: maxKeys,
- }
- } else {
- l = &intervalLimiter{
- delay: delay.Delay(),
- bursts: bursts,
- }
- }
- return &Throttler{
- limiter: l,
- }
-}
-
-// The intervalLimiter struct implements an interval limiter with no vary-by
-// criteria.
-type intervalLimiter struct {
- delay time.Duration
- bursts int
-
- bucket chan chan bool
-}
-
-// Start initializes the limiter for execution.
-func (il *intervalLimiter) Start() {
- if il.bursts < 0 {
- il.bursts = 0
- }
- il.bucket = make(chan chan bool, il.bursts)
- go process(il.bucket, il.delay)
-}
-
-// Limit is called for each request to the throttled handler. It tries to
-// queue the request to allow it to run at the given interval, but if the
-// queue is full, the request is denied access.
-func (il *intervalLimiter) Limit(w http.ResponseWriter, r *http.Request) (<-chan bool, error) {
- ch := make(chan bool, 1)
- select {
- case il.bucket <- ch:
- return ch, nil
- default:
- ch <- false
- return ch, nil
- }
-}
-
-// The intervalVaryByLimiter struct implements an interval limiter with a vary-by
-// criteria.
-type intervalVaryByLimiter struct {
- delay time.Duration
- bursts int
- vary *VaryBy
-
- lock sync.RWMutex
- keys *lru.Cache
- maxKeys int
-}
-
-// Start initializes the limiter for execution.
-func (il *intervalVaryByLimiter) Start() {
- if il.bursts < 0 {
- il.bursts = 0
- }
- il.keys = lru.New(il.maxKeys)
- il.keys.OnEvicted = il.stopProcess
-}
-
-// Limit is called for each request to the throttled handler. It tries to
-// queue the request for the vary-by key to allow it to run at the given interval,
-// but if the queue is full, the request is denied access.
-func (il *intervalVaryByLimiter) Limit(w http.ResponseWriter, r *http.Request) (<-chan bool, error) {
- ch := make(chan bool, 1)
- key := il.vary.Key(r)
-
- il.lock.RLock()
- item, ok := il.keys.Get(key)
- if !ok {
- // Create the key, bucket, start goroutine
- // First release the read lock and acquire a write lock
- il.lock.RUnlock()
- il.lock.Lock()
- // Create the bucket, add the key
- bucket := make(chan chan bool, il.bursts)
- il.keys.Add(key, bucket)
- // Start the goroutine to process this bucket
- go process(bucket, il.delay)
- item = bucket
- // Release the write lock, acquire the read lock
- il.lock.Unlock()
- il.lock.RLock()
- }
- defer il.lock.RUnlock()
- bucket := item.(chan chan bool)
- select {
- case bucket <- ch:
- return ch, nil
- default:
- ch <- false
- return ch, nil
- }
-}
-
-// process loops through the queued requests for a key's bucket, and sends
-// requests through at the given interval.
-func process(bucket chan chan bool, delay time.Duration) {
- after := time.After(0)
- for v := range bucket {
- <-after
- // Let the request go through
- v <- true
- // Wait the required duration
- after = time.After(delay)
- }
-}
-
-// stopProcess is called when a key is removed from the LRU cache so that its
-// accompanying goroutine is correctly released.
-func (il *intervalVaryByLimiter) stopProcess(key lru.Key, value interface{}) {
- close(value.(chan chan bool))
-}
diff --git a/vendor/gopkg.in/throttled/throttled.v1/interval_test.go b/vendor/gopkg.in/throttled/throttled.v1/interval_test.go
deleted file mode 100644
index bc584e134..000000000
--- a/vendor/gopkg.in/throttled/throttled.v1/interval_test.go
+++ /dev/null
@@ -1,114 +0,0 @@
-package throttled
-
-import (
- "net/http"
- "testing"
-
- "github.com/PuerkitoBio/boom/commands"
-)
-
-func TestInterval(t *testing.T) {
- if testing.Short() {
- t.Skip()
- }
- cases := []struct {
- n int
- c int
- rps int
- bursts int
- }{
- 0: {60, 10, 20, 100},
- 1: {300, 20, 100, 100},
- 2: {10, 10, 1, 10},
- 3: {1000, 100, 1000, 100},
- }
- for i, c := range cases {
- // Setup the stats handler
- st := &stats{}
- // Create the throttler
- th := Interval(PerSec(c.rps), c.bursts, nil, 0)
- th.DeniedHandler = http.HandlerFunc(st.DeniedHTTP)
- b := commands.Boom{
- Req: &commands.ReqOpts{},
- N: c.n,
- C: c.c,
- Output: "quiet",
- }
- // Run the test
- rpts := runTest(th.Throttle(st), b)
- // Assert results
- for _, rpt := range rpts {
- assertRPS(t, i, c.rps, rpt)
- }
- assertStats(t, i, st, rpts)
- }
-}
-
-func TestIntervalVary(t *testing.T) {
- if testing.Short() {
- t.Skip()
- }
- cases := []struct {
- n int
- c int
- urls int
- rps int
- bursts int
- }{
- 0: {60, 10, 3, 20, 100},
- 1: {300, 20, 3, 100, 100},
- 2: {10, 10, 3, 1, 10},
- 3: {500, 10, 2, 1000, 100},
- }
- for i, c := range cases {
- // Setup the stats handler
- st := &stats{}
- // Create the throttler
- th := Interval(PerSec(c.rps), c.bursts, nil, 0)
- th.DeniedHandler = http.HandlerFunc(st.DeniedHTTP)
- var booms []commands.Boom
- for j := 0; j < c.urls; j++ {
- booms = append(booms, commands.Boom{
- Req: &commands.ReqOpts{},
- N: c.n,
- C: c.c,
- Output: "quiet",
- })
- }
- // Run the test
- rpts := runTest(th.Throttle(st), booms...)
- // Assert results
- for _, rpt := range rpts {
- assertRPS(t, i, c.rps, rpt)
- }
- assertStats(t, i, st, rpts)
- }
-}
-
-func assertRPS(t *testing.T, ix int, exp int, rpt *commands.Report) {
- wigglef := 0.2 * float64(exp)
- if rpt.SuccessRPS < float64(exp)-wigglef || rpt.SuccessRPS > float64(exp)+wigglef {
- t.Errorf("%d: expected RPS to be around %d, got %f", ix, exp, rpt.SuccessRPS)
- }
-}
-
-func assertStats(t *testing.T, ix int, st *stats, rpts []*commands.Report) {
- ok, ko, _ := st.Stats()
- var twos, fives, max int
- for _, rpt := range rpts {
- twos += rpt.StatusCodeDist[200]
- fives += rpt.StatusCodeDist[deniedStatus]
- if len(rpt.StatusCodeDist) > max {
- max = len(rpt.StatusCodeDist)
- }
- }
- if ok != twos {
- t.Errorf("%d: expected %d status 200, got %d", ix, twos, ok)
- }
- if ko != fives {
- t.Errorf("%d: expected %d status 429, got %d", ix, fives, ok)
- }
- if max > 2 {
- t.Errorf("%d: expected at most 2 different status codes, got %d", ix, max)
- }
-}
diff --git a/vendor/gopkg.in/throttled/throttled.v1/memstats.go b/vendor/gopkg.in/throttled/throttled.v1/memstats.go
deleted file mode 100644
index bd2765630..000000000
--- a/vendor/gopkg.in/throttled/throttled.v1/memstats.go
+++ /dev/null
@@ -1,214 +0,0 @@
-package throttled
-
-import (
- "net/http"
- "runtime"
- "sync"
- "time"
-)
-
-// Static check to ensure that memStatsLimiter implements Limiter.
-var _ Limiter = (*memStatsLimiter)(nil)
-
-// The memStatsLimiter struct implements a limiter based on the memory statistics
-// of the current process.
-type memStatsLimiter struct {
- thresholds *runtime.MemStats
- refreshRate time.Duration
-
- lockStats sync.RWMutex
- stats runtime.MemStats
-}
-
-// MemStats creates a Throttler based on the memory statistics of the current process.
-// Any combination of any (non-array) integer field of Go's runtime.MemStats structure
-// can be used as thresholds to deny a request.
-//
-// As soon as one threshold value is reached, the access is denied. If the value can
-// decrease, access will be allowed again once it gets back under the threshold value.
-// Denied requests go through the denied handler, which may be specified on the Throttler
-// and that defaults to the package-global variable DefaultDeniedHandler.
-//
-// Thresholds must be specified in absolute numbers (i.e. NumGC = 10 means stop once the
-// NumGC reaches 10, not when the current value increments by 10), and zero values are
-// ignored.
-//
-// The refreshRate indicates the frequency at which the process' memory stats are refreshed,
-// and 0 means on each request.
-//
-func MemStats(thresholds *runtime.MemStats, refreshRate time.Duration) *Throttler {
- return &Throttler{
- limiter: &memStatsLimiter{
- thresholds: thresholds,
- refreshRate: refreshRate,
- },
- }
-}
-
-// Start initialized the limiter for execution.
-func (m *memStatsLimiter) Start() {
- // Make sure there is an initial MemStats reading
- runtime.ReadMemStats(&m.stats)
- if m.refreshRate > 0 {
- go m.refresh()
- }
-}
-
-// refresh runs in a separate goroutine and refreshes the memory statistics
-// at regular intervals.
-func (m *memStatsLimiter) refresh() {
- c := time.Tick(m.refreshRate)
- for _ = range c {
- m.lockStats.Lock()
- runtime.ReadMemStats(&m.stats)
- m.lockStats.Unlock()
- }
-}
-
-// Limit is called for each request to the throttled handler. It checks if
-// the request can go through by checking the memory thresholds, and signals it
-// via the returned channel.
-func (m *memStatsLimiter) Limit(w http.ResponseWriter, r *http.Request) (<-chan bool, error) {
- ch := make(chan bool, 1)
- // Check if memory thresholds are reached
- ch <- m.allow()
- return ch, nil
-}
-
-// allow compares the current memory stats with the thresholds, and returns
-// false if any threshold is reached.
-func (m *memStatsLimiter) allow() bool {
- m.lockStats.RLock()
- mem := m.stats
- m.lockStats.RUnlock()
- // If refreshRate == 0, then read on every request.
- if m.refreshRate == 0 {
- runtime.ReadMemStats(&mem)
- }
- ok := true
- checkStat(m.thresholds.Alloc, mem.Alloc, &ok)
- checkStat(m.thresholds.BuckHashSys, mem.BuckHashSys, &ok)
- checkStat(m.thresholds.Frees, mem.Frees, &ok)
- checkStat(m.thresholds.GCSys, mem.GCSys, &ok)
- checkStat(m.thresholds.HeapAlloc, mem.HeapAlloc, &ok)
- checkStat(m.thresholds.HeapIdle, mem.HeapIdle, &ok)
- checkStat(m.thresholds.HeapInuse, mem.HeapInuse, &ok)
- checkStat(m.thresholds.HeapObjects, mem.HeapObjects, &ok)
- checkStat(m.thresholds.HeapReleased, mem.HeapReleased, &ok)
- checkStat(m.thresholds.HeapSys, mem.HeapSys, &ok)
- checkStat(m.thresholds.LastGC, mem.LastGC, &ok)
- checkStat(m.thresholds.Lookups, mem.Lookups, &ok)
- checkStat(m.thresholds.MCacheInuse, mem.MCacheInuse, &ok)
- checkStat(m.thresholds.MCacheSys, mem.MCacheSys, &ok)
- checkStat(m.thresholds.MSpanInuse, mem.MSpanInuse, &ok)
- checkStat(m.thresholds.MSpanSys, mem.MSpanSys, &ok)
- checkStat(m.thresholds.Mallocs, mem.Mallocs, &ok)
- checkStat(m.thresholds.NextGC, mem.NextGC, &ok)
- checkStat(uint64(m.thresholds.NumGC), uint64(mem.NumGC), &ok)
- checkStat(m.thresholds.OtherSys, mem.OtherSys, &ok)
- checkStat(m.thresholds.PauseTotalNs, mem.PauseTotalNs, &ok)
- checkStat(m.thresholds.StackInuse, mem.StackInuse, &ok)
- checkStat(m.thresholds.StackSys, mem.StackSys, &ok)
- checkStat(m.thresholds.Sys, mem.Sys, &ok)
- checkStat(m.thresholds.TotalAlloc, mem.TotalAlloc, &ok)
- return ok
-}
-
-// Checks the threshold value against the actual value, and assigns false
-// to the boolean pointer if the threshold is reached.
-func checkStat(threshold, actual uint64, ok *bool) {
- if !*ok {
- return
- }
- if threshold > 0 {
- if actual >= threshold {
- *ok = false
- }
- }
-}
-
-// MemThresholds is a convenience function to create a thresholds memory stats from
-// offsets to apply to the current memory stats. Zero values in the offset stats
-// are left to 0 in the resulting thresholds memory stats value.
-//
-// The return value may be used as thresholds argument to the MemStats function.
-func MemThresholds(offset *runtime.MemStats) *runtime.MemStats {
- var mem, thr runtime.MemStats
- runtime.ReadMemStats(&mem)
- if offset.Alloc > 0 {
- thr.Alloc = mem.Alloc + offset.Alloc
- }
- if offset.BuckHashSys > 0 {
- thr.BuckHashSys = mem.BuckHashSys + offset.BuckHashSys
- }
- if offset.Frees > 0 {
- thr.Frees = mem.Frees + offset.Frees
- }
- if offset.GCSys > 0 {
- thr.GCSys = mem.GCSys + offset.GCSys
- }
- if offset.HeapAlloc > 0 {
- thr.HeapAlloc = mem.HeapAlloc + offset.HeapAlloc
- }
- if offset.HeapIdle > 0 {
- thr.HeapIdle = mem.HeapIdle + offset.HeapIdle
- }
- if offset.HeapInuse > 0 {
- thr.HeapInuse = mem.HeapInuse + offset.HeapInuse
- }
- if offset.HeapObjects > 0 {
- thr.HeapObjects = mem.HeapObjects + offset.HeapObjects
- }
- if offset.HeapReleased > 0 {
- thr.HeapReleased = mem.HeapReleased + offset.HeapReleased
- }
- if offset.HeapSys > 0 {
- thr.HeapSys = mem.HeapSys + offset.HeapSys
- }
- if offset.LastGC > 0 {
- thr.LastGC = mem.LastGC + offset.LastGC
- }
- if offset.Lookups > 0 {
- thr.Lookups = mem.Lookups + offset.Lookups
- }
- if offset.MCacheInuse > 0 {
- thr.MCacheInuse = mem.MCacheInuse + offset.MCacheInuse
- }
- if offset.MCacheSys > 0 {
- thr.MCacheSys = mem.MCacheSys + offset.MCacheSys
- }
- if offset.MSpanInuse > 0 {
- thr.MSpanInuse = mem.MSpanInuse + offset.MSpanInuse
- }
- if offset.MSpanSys > 0 {
- thr.MSpanSys = mem.MSpanSys + offset.MSpanSys
- }
- if offset.Mallocs > 0 {
- thr.Mallocs = mem.Mallocs + offset.Mallocs
- }
- if offset.NextGC > 0 {
- thr.NextGC = mem.NextGC + offset.NextGC
- }
- if offset.NumGC > 0 {
- thr.NumGC = mem.NumGC + offset.NumGC
- }
- if offset.OtherSys > 0 {
- thr.OtherSys = mem.OtherSys + offset.OtherSys
- }
- if offset.PauseTotalNs > 0 {
- thr.PauseTotalNs = mem.PauseTotalNs + offset.PauseTotalNs
- }
- if offset.StackInuse > 0 {
- thr.StackInuse = mem.StackInuse + offset.StackInuse
- }
- if offset.StackSys > 0 {
- thr.StackSys = mem.StackSys + offset.StackSys
- }
- if offset.Sys > 0 {
- thr.Sys = mem.Sys + offset.Sys
- }
- if offset.TotalAlloc > 0 {
- thr.TotalAlloc = mem.TotalAlloc + offset.TotalAlloc
- }
- return &thr
-}
diff --git a/vendor/gopkg.in/throttled/throttled.v1/memstats_test.go b/vendor/gopkg.in/throttled/throttled.v1/memstats_test.go
deleted file mode 100644
index 2b8faa721..000000000
--- a/vendor/gopkg.in/throttled/throttled.v1/memstats_test.go
+++ /dev/null
@@ -1,64 +0,0 @@
-package throttled
-
-import (
- "net/http"
- "runtime"
- "testing"
- "time"
-
- "github.com/PuerkitoBio/boom/commands"
-)
-
-func TestMemStats(t *testing.T) {
- if testing.Short() {
- t.Skip()
- }
- cases := []struct {
- n int
- c int
- gc uint32
- total uint64
- rate time.Duration
- }{
- 0: {1000, 10, 3, 0, 0},
- 1: {200, 10, 0, 600000, 0},
- 2: {500, 10, 2, 555555, 10 * time.Millisecond},
- }
- for i, c := range cases {
- // Setup the stats handler
- st := &stats{}
- // Create the throttler
- limit := MemThresholds(&runtime.MemStats{NumGC: c.gc, TotalAlloc: c.total})
- th := MemStats(limit, c.rate)
- th.DeniedHandler = http.HandlerFunc(st.DeniedHTTP)
- // Run the test
- b := commands.Boom{
- Req: &commands.ReqOpts{},
- N: c.n,
- C: c.c,
- Output: "quiet",
- }
- rpts := runTest(th.Throttle(st), b)
- // Assert results
- assertStats(t, i, st, rpts)
- assertMem(t, i, limit)
- }
-}
-
-func assertMem(t *testing.T, ix int, limit *runtime.MemStats) {
- var mem runtime.MemStats
- runtime.ReadMemStats(&mem)
- if mem.NumGC < limit.NumGC {
- t.Errorf("%d: expected gc to be at least %d, got %d", ix, limit.NumGC, mem.NumGC)
- }
- if mem.TotalAlloc < limit.TotalAlloc {
- t.Errorf("%d: expected total alloc to be at least %dKb, got %dKb", ix, limit.TotalAlloc/1024, mem.TotalAlloc/1024)
- }
-}
-
-func BenchmarkReadMemStats(b *testing.B) {
- var mem runtime.MemStats
- for i := 0; i < b.N; i++ {
- runtime.ReadMemStats(&mem)
- }
-}
diff --git a/vendor/gopkg.in/throttled/throttled.v1/misc/pre-commit b/vendor/gopkg.in/throttled/throttled.v1/misc/pre-commit
deleted file mode 100755
index 88b61bfde..000000000
--- a/vendor/gopkg.in/throttled/throttled.v1/misc/pre-commit
+++ /dev/null
@@ -1,38 +0,0 @@
-#!/bin/sh
-# Copyright 2012 The Go Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style
-# license that can be found in the LICENSE file.
-
-# git gofmt pre-commit hook
-#
-# To use, store as .git/hooks/pre-commit inside your repository and make sure
-# it has execute permissions.
-#
-# This script does not handle file names that contain spaces.
-
-# golint is purely informational, it doesn't fail with exit code != 0 if it finds something,
-# because it may find a lot of false positives. Just print out its result for information.
-echo "lint result (informational only):"
-echo
-golint .
-
-# go vet returns 1 if an error was found. Exit the hook with this exit code.
-go vet ./...
-vetres=$?
-
-# Check for gofmt problems and report if any.
-gofiles=$(git diff --cached --name-only --diff-filter=ACM | grep '.go$')
-[ -z "$gofiles" ] && echo "EXIT $vetres" && exit $vetres
-
-unformatted=$(gofmt -l $gofiles)
-[ -z "$unformatted" ] && echo "EXIT $vetres" && exit $vetres
-
-# Some files are not gofmt'd. Print message and fail.
-
-echo >&2 "Go files must be formatted with gofmt. Please run:"
-for fn in $unformatted; do
- echo >&2 " gofmt -w $PWD/$fn"
-done
-
-echo "EXIT 1"
-exit 1
diff --git a/vendor/gopkg.in/throttled/throttled.v1/rate.go b/vendor/gopkg.in/throttled/throttled.v1/rate.go
deleted file mode 100644
index d7a7de6d7..000000000
--- a/vendor/gopkg.in/throttled/throttled.v1/rate.go
+++ /dev/null
@@ -1,116 +0,0 @@
-package throttled
-
-import (
- "math"
- "net/http"
- "strconv"
- "time"
-)
-
-// Static check to ensure that rateLimiter implements Limiter.
-var _ Limiter = (*rateLimiter)(nil)
-
-// RateLimit creates a throttler that limits the number of requests allowed
-// in a certain time window defined by the Quota q. The q parameter specifies
-// the requests per time window, and it is silently set to at least 1 request
-// and at least a 1 second window if it is less than that. The time window
-// starts when the first request is made outside an existing window. Fractions
-// of seconds are not supported, they are truncated.
-//
-// The vary parameter indicates what criteria should be used to group requests
-// for which the limit must be applied (ex.: rate limit based on the remote address).
-// See varyby.go for the various options.
-//
-// The specified store is used to keep track of the request count and the
-// time remaining in the window. The throttled package comes with some stores
-// in the throttled/store package. Custom stores can be created too, by implementing
-// the Store interface.
-//
-// Requests that bust the rate limit are denied access and go through the denied handler,
-// which may be specified on the Throttler and that defaults to the package-global
-// variable DefaultDeniedHandler.
-//
-// The rate limit throttler sets the following headers on the response:
-//
-// X-RateLimit-Limit : quota
-// X-RateLimit-Remaining : number of requests remaining in the current window
-// X-RateLimit-Reset : seconds before a new window
-//
-// Additionally, if the request was denied access, the following header is added:
-//
-// Retry-After : seconds before the caller should retry
-//
-func RateLimit(q Quota, vary *VaryBy, store Store) *Throttler {
- // Extract requests and window
- reqs, win := q.Quota()
-
- // Create and return the throttler
- return &Throttler{
- limiter: &rateLimiter{
- reqs: reqs,
- window: win,
- vary: vary,
- store: store,
- },
- }
-}
-
-// The rate limiter implements limiting the request to a certain quota
-// based on the vary-by criteria. State is saved in the store.
-type rateLimiter struct {
- reqs int
- window time.Duration
- vary *VaryBy
- store Store
-}
-
-// Start initializes the limiter for execution.
-func (r *rateLimiter) Start() {
- if r.reqs < 1 {
- r.reqs = 1
- }
- if r.window < time.Second {
- r.window = time.Second
- }
-}
-
-// Limit is called for each request to the throttled handler. It checks if
-// the request can go through and signals it via the returned channel.
-// It returns an error if the operation fails.
-func (r *rateLimiter) Limit(w http.ResponseWriter, req *http.Request) (<-chan bool, error) {
- // Create return channel and initialize
- ch := make(chan bool, 1)
- ok := true
- key := r.vary.Key(req)
-
- // Get the current count and remaining seconds
- cnt, secs, err := r.store.Incr(key, r.window)
- // Handle the possible situations: error, begin new window, or increment current window.
- switch {
- case err != nil && err != ErrNoSuchKey:
- // An unexpected error occurred
- return nil, err
- case err == ErrNoSuchKey || secs <= 0:
- // Reset counter
- if err := r.store.Reset(key, r.window); err != nil {
- return nil, err
- }
- cnt = 1
- secs = int(r.window.Seconds())
- default:
- // If the limit is reached, deny access
- if cnt > r.reqs {
- ok = false
- }
- }
- // Set rate-limit headers
- w.Header().Add("X-RateLimit-Limit", strconv.Itoa(r.reqs))
- w.Header().Add("X-RateLimit-Remaining", strconv.Itoa(int(math.Max(float64(r.reqs-cnt), 0))))
- w.Header().Add("X-RateLimit-Reset", strconv.Itoa(secs))
- if !ok {
- w.Header().Add("Retry-After", strconv.Itoa(secs))
- }
- // Send response via the return channel
- ch <- ok
- return ch, nil
-}
diff --git a/vendor/gopkg.in/throttled/throttled.v1/rate_test.go b/vendor/gopkg.in/throttled/throttled.v1/rate_test.go
deleted file mode 100644
index 67dea74b1..000000000
--- a/vendor/gopkg.in/throttled/throttled.v1/rate_test.go
+++ /dev/null
@@ -1,101 +0,0 @@
-package throttled
-
-import (
- "net/http"
- "net/http/httptest"
- "strconv"
- "testing"
- "time"
-)
-
-const deniedStatus = 429
-
-// Simple memory store for tests, unsafe for concurrent access
-type mapStore struct {
- cnt map[string]int
- ts map[string]time.Time
-}
-
-func newMapStore() *mapStore {
- return &mapStore{
- make(map[string]int),
- make(map[string]time.Time),
- }
-}
-func (ms *mapStore) Incr(key string, window time.Duration) (int, int, error) {
- if _, ok := ms.cnt[key]; !ok {
- return 0, 0, ErrNoSuchKey
- }
- ms.cnt[key]++
- ts := ms.ts[key]
- return ms.cnt[key], RemainingSeconds(ts, window), nil
-}
-func (ms *mapStore) Reset(key string, win time.Duration) error {
- ms.cnt[key] = 1
- ms.ts[key] = time.Now().UTC()
- return nil
-}
-
-func TestRateLimit(t *testing.T) {
- quota := Q{5, 5 * time.Second}
- cases := []struct {
- limit, remain, reset, status int
- }{
- 0: {5, 4, 5, 200},
- 1: {5, 3, 4, 200},
- 2: {5, 2, 4, 200},
- 3: {5, 1, 3, 200},
- 4: {5, 0, 3, 200},
- 5: {5, 0, 2, deniedStatus},
- }
- // Limit the requests to 2 per second
- th := Interval(PerSec(2), 0, nil, 0)
- // Rate limit
- rl := RateLimit(quota, nil, newMapStore())
- // Create the stats
- st := &stats{}
- // Create the handler
- h := th.Throttle(rl.Throttle(st))
-
- // Start the server
- srv := httptest.NewServer(h)
- defer srv.Close()
- for i, c := range cases {
- callRateLimited(t, i, c.limit, c.remain, c.reset, c.status, srv.URL)
- }
- // Wait 3 seconds and call again, should start a new window
- time.Sleep(3 * time.Second)
- callRateLimited(t, len(cases), 5, 4, 5, 200, srv.URL)
-}
-
-func callRateLimited(t *testing.T, i, limit, remain, reset, status int, url string) {
- res, err := http.Get(url)
- if err != nil {
- t.Fatal(err)
- }
- defer res.Body.Close()
- // Assert status code
- if status != res.StatusCode {
- t.Errorf("%d: expected status %d, got %d", i, status, res.StatusCode)
- }
- // Assert headers
- if v := res.Header.Get("X-RateLimit-Limit"); v != strconv.Itoa(limit) {
- t.Errorf("%d: expected limit header to be %d, got %s", i, limit, v)
- }
- if v := res.Header.Get("X-RateLimit-Remaining"); v != strconv.Itoa(remain) {
- t.Errorf("%d: expected remain header to be %d, got %s", i, remain, v)
- }
- // Allow 1 second wiggle room
- v := res.Header.Get("X-RateLimit-Reset")
- vi, _ := strconv.Atoi(v)
- if vi < reset-1 || vi > reset+1 {
- t.Errorf("%d: expected reset header to be close to %d, got %d", i, reset, vi)
- }
- if status == deniedStatus {
- v := res.Header.Get("Retry-After")
- vi, _ := strconv.Atoi(v)
- if vi < reset-1 || vi > reset+1 {
- t.Errorf("%d: expected retry after header to be close to %d, got %d", i, reset, vi)
- }
- }
-}
diff --git a/vendor/gopkg.in/throttled/throttled.v1/store.go b/vendor/gopkg.in/throttled/throttled.v1/store.go
deleted file mode 100644
index 760fe2b69..000000000
--- a/vendor/gopkg.in/throttled/throttled.v1/store.go
+++ /dev/null
@@ -1,31 +0,0 @@
-package throttled
-
-import (
- "errors"
- "time"
-)
-
-// The error returned if the key does not exist in the Store.
-var ErrNoSuchKey = errors.New("throttled: no such key")
-
-// Store is the interface to implement to store the RateLimit state (number
-// of requests per key, time-to-live or creation timestamp).
-type Store interface {
- // Incr increments the count for the specified key and returns the new value along
- // with the number of seconds remaining. It may return an error
- // if the operation fails.
- //
- // The method may return ErrNoSuchKey if the key to increment does not exist,
- // in which case Reset will be called to initialize the value.
- Incr(string, time.Duration) (int, int, error)
-
- // Reset resets the key to 1 with the specified window duration. It must create the
- // key if it doesn't exist. It returns an error if it fails.
- Reset(string, time.Duration) error
-}
-
-// RemainingSeconds is a helper function that returns the number of seconds
-// remaining from an absolute timestamp in UTC.
-func RemainingSeconds(ts time.Time, window time.Duration) int {
- return int((window - time.Now().UTC().Sub(ts)).Seconds())
-}
diff --git a/vendor/gopkg.in/throttled/throttled.v1/store/doc.go b/vendor/gopkg.in/throttled/throttled.v1/store/doc.go
deleted file mode 100644
index 8e33f2c98..000000000
--- a/vendor/gopkg.in/throttled/throttled.v1/store/doc.go
+++ /dev/null
@@ -1,2 +0,0 @@
-// Package store offers a memory-based and a Redis-based throttled.Store implementation.
-package store // import "gopkg.in/throttled/throttled.v1/store"
diff --git a/vendor/gopkg.in/throttled/throttled.v1/store/mem.go b/vendor/gopkg.in/throttled/throttled.v1/store/mem.go
deleted file mode 100644
index 22d200e8d..000000000
--- a/vendor/gopkg.in/throttled/throttled.v1/store/mem.go
+++ /dev/null
@@ -1,90 +0,0 @@
-package store
-
-import (
- "sync"
- "time"
-
- "github.com/golang/groupcache/lru"
- "gopkg.in/throttled/throttled.v1"
-)
-
-// memStore implements an in-memory Store.
-type memStore struct {
- sync.Mutex
- keys *lru.Cache
- m map[string]*counter
-}
-
-// NewMemStore creates a new MemStore. If maxKeys > 0, the number of different keys
-// is restricted to the specified amount. In this case, it uses an LRU algorithm to
-// evict older keys to make room for newer ones. If a request is made for a key that
-// has been evicted, it will be processed as if its count was 0, possibly allowing requests
-// that should be denied.
-//
-// If maxKeys <= 0, there is no limit on the number of keys, which may use an unbounded amount of
-// memory depending on the server's load.
-//
-// The MemStore is only for single-process rate-limiting. To share the rate limit state
-// among multiple instances of the web server, use a database- or key-value-based
-// store.
-//
-func NewMemStore(maxKeys int) throttled.Store {
- var m *memStore
- if maxKeys > 0 {
- m = &memStore{
- keys: lru.New(maxKeys),
- }
- } else {
- m = &memStore{
- m: make(map[string]*counter),
- }
- }
- return m
-}
-
-// A counter represents a single entry in the MemStore.
-type counter struct {
- n int
- ts time.Time
-}
-
-// Incr increments the counter for the specified key. It returns the new
-// count value and the remaining number of seconds, or an error.
-func (ms *memStore) Incr(key string, window time.Duration) (int, int, error) {
- ms.Lock()
- defer ms.Unlock()
- var c *counter
- if ms.keys != nil {
- v, _ := ms.keys.Get(key)
- if v != nil {
- c = v.(*counter)
- }
- } else {
- c = ms.m[key]
- }
- if c == nil {
- c = &counter{0, time.Now().UTC()}
- }
- c.n++
- if ms.keys != nil {
- ms.keys.Add(key, c)
- } else {
- ms.m[key] = c
- }
- return c.n, throttled.RemainingSeconds(c.ts, window), nil
-}
-
-// Reset resets the counter for the specified key. It sets the count
-// to 1 and initializes the timestamp with the current time, in UTC.
-// It returns an error if the operation fails.
-func (ms *memStore) Reset(key string, win time.Duration) error {
- ms.Lock()
- defer ms.Unlock()
- c := &counter{1, time.Now().UTC()}
- if ms.keys != nil {
- ms.keys.Add(key, c)
- } else {
- ms.m[key] = c
- }
- return nil
-}
diff --git a/vendor/gopkg.in/throttled/throttled.v1/store/mem_test.go b/vendor/gopkg.in/throttled/throttled.v1/store/mem_test.go
deleted file mode 100644
index e8ef8d0da..000000000
--- a/vendor/gopkg.in/throttled/throttled.v1/store/mem_test.go
+++ /dev/null
@@ -1,43 +0,0 @@
-package store
-
-import (
- "testing"
- "time"
-)
-
-func TestMemStore(t *testing.T) {
- st := NewMemStore(0)
- win := time.Second
-
- // Reset stores a key with count of 1, current timestamp
- err := st.Reset("k", time.Second)
- if err != nil {
- t.Errorf("expected reset to return nil, got %s", err)
- }
- cnt, sec1, _ := st.Incr("k", win)
- if cnt != 2 {
- t.Errorf("expected reset+incr to set count to 2, got %d", cnt)
- }
-
- // Incr increments the key, keeps same timestamp
- cnt, sec2, err := st.Incr("k", win)
- if err != nil {
- t.Errorf("expected 2nd incr to return nil error, got %s", err)
- }
- if cnt != 3 {
- t.Errorf("expected 2nd incr to return 3, got %d", cnt)
- }
- if sec1 != sec2 {
- t.Errorf("expected 2nd incr to return %d secs, got %d", sec1, sec2)
- }
-
- // Reset on existing key brings it back to 1, new timestamp
- err = st.Reset("k", win)
- if err != nil {
- t.Errorf("expected reset on existing key to return nil, got %s", err)
- }
- cnt, _, _ = st.Incr("k", win)
- if cnt != 2 {
- t.Errorf("expected last reset+incr to return 2, got %d", cnt)
- }
-}
diff --git a/vendor/gopkg.in/throttled/throttled.v1/store/redis.go b/vendor/gopkg.in/throttled/throttled.v1/store/redis.go
deleted file mode 100644
index b089f9f4e..000000000
--- a/vendor/gopkg.in/throttled/throttled.v1/store/redis.go
+++ /dev/null
@@ -1,85 +0,0 @@
-package store
-
-import (
- "time"
-
- "github.com/garyburd/redigo/redis"
- "gopkg.in/throttled/throttled.v1"
-)
-
-// redisStore implements a Redis-based store.
-type redisStore struct {
- pool *redis.Pool
- prefix string
- db int
-}
-
-// NewRedisStore creates a new Redis-based store, using the provided pool to get its
-// connections. The keys will have the specified keyPrefix, which may be an empty string,
-// and the database index specified by db will be selected to store the keys.
-//
-func NewRedisStore(pool *redis.Pool, keyPrefix string, db int) throttled.Store {
- return &redisStore{
- pool: pool,
- prefix: keyPrefix,
- db: db,
- }
-}
-
-// Incr increments the specified key. If the key did not exist, it sets it to 1
-// and sets it to expire after the number of seconds specified by window.
-//
-// It returns the new count value and the number of remaining seconds, or an error
-// if the operation fails.
-func (r *redisStore) Incr(key string, window time.Duration) (int, int, error) {
- conn := r.pool.Get()
- defer conn.Close()
- if err := selectDB(r.db, conn); err != nil {
- return 0, 0, err
- }
- // Atomically increment and read the TTL.
- conn.Send("MULTI")
- conn.Send("INCR", r.prefix+key)
- conn.Send("TTL", r.prefix+key)
- vals, err := redis.Values(conn.Do("EXEC"))
- if err != nil {
- conn.Do("DISCARD")
- return 0, 0, err
- }
- var cnt, ttl int
- if _, err = redis.Scan(vals, &cnt, &ttl); err != nil {
- return 0, 0, err
- }
- // If there was no TTL set, then this is a newly created key (INCR creates the key
- // if it didn't exist), so set it to expire.
- if ttl == -1 {
- ttl = int(window.Seconds())
- _, err = conn.Do("EXPIRE", r.prefix+key, ttl)
- if err != nil {
- return 0, 0, err
- }
- }
- return cnt, ttl, nil
-}
-
-// Reset sets the value of the key to 1, and resets its time window.
-func (r *redisStore) Reset(key string, window time.Duration) error {
- conn := r.pool.Get()
- defer conn.Close()
- if err := selectDB(r.db, conn); err != nil {
- return err
- }
- _, err := redis.String(conn.Do("SET", r.prefix+key, "1", "EX", int(window.Seconds()), "NX"))
- return err
-}
-
-// Select the specified database index.
-func selectDB(db int, conn redis.Conn) error {
- // Select the specified database
- if db > 0 {
- if _, err := redis.String(conn.Do("SELECT", db)); err != nil {
- return err
- }
- }
- return nil
-}
diff --git a/vendor/gopkg.in/throttled/throttled.v1/store/redis_test.go b/vendor/gopkg.in/throttled/throttled.v1/store/redis_test.go
deleted file mode 100644
index a282d6d25..000000000
--- a/vendor/gopkg.in/throttled/throttled.v1/store/redis_test.go
+++ /dev/null
@@ -1,66 +0,0 @@
-package store
-
-import (
- "testing"
- "time"
-
- "github.com/garyburd/redigo/redis"
-)
-
-func getPool() *redis.Pool {
- pool := &redis.Pool{
- MaxIdle: 3,
- IdleTimeout: 30 * time.Second,
- Dial: func() (redis.Conn, error) {
- return redis.Dial("tcp", ":6379")
- },
- TestOnBorrow: func(c redis.Conn, t time.Time) error {
- _, err := c.Do("PING")
- return err
- },
- }
- return pool
-}
-
-func TestRedisStore(t *testing.T) {
- pool := getPool()
- c := pool.Get()
- if _, err := redis.String(c.Do("PING")); err != nil {
- c.Close()
- t.Skip("redis server not available on localhost port 6379")
- }
- st := NewRedisStore(pool, "throttled:", 1)
- win := 2 * time.Second
-
- // Incr increments the key, even if it does not exist
- cnt, secs, err := st.Incr("k", win)
- if err != nil {
- t.Errorf("expected initial incr to return nil error, got %s", err)
- }
- if cnt != 1 {
- t.Errorf("expected initial incr to return 1, got %d", cnt)
- }
- if secs != int(win.Seconds()) {
- t.Errorf("expected initial incr to return %d secs, got %d", int(win.Seconds()), secs)
- }
-
- // Waiting a second diminishes the remaining seconds
- time.Sleep(time.Second)
- _, sec2, _ := st.Incr("k", win)
- if sec2 != secs-1 {
- t.Errorf("expected 2nd incr after a 1s sleep to return %d secs, got %d", secs-1, sec2)
- }
-
- // Waiting a second so the key expires, Incr should set back to 1, initial secs
- time.Sleep(1100 * time.Millisecond)
- cnt, sec3, err := st.Incr("k", win)
- if err != nil {
- t.Errorf("expected last incr to return nil error, got %s", err)
- }
- if cnt != 1 {
- t.Errorf("expected last incr to return 1, got %d", cnt)
- }
- if sec3 != int(win.Seconds()) {
- t.Errorf("expected last incr to return %d secs, got %d", int(win.Seconds()), sec3)
- }
-}
diff --git a/vendor/gopkg.in/throttled/throttled.v1/throttler.go b/vendor/gopkg.in/throttled/throttled.v1/throttler.go
deleted file mode 100644
index 06da13051..000000000
--- a/vendor/gopkg.in/throttled/throttled.v1/throttler.go
+++ /dev/null
@@ -1,86 +0,0 @@
-package throttled
-
-import (
- "net/http"
- "sync"
-)
-
-var (
- // DefaultDeniedHandler handles the requests that were denied access because
- // of a throttler. By default, returns a 429 status code with a
- // generic message.
- DefaultDeniedHandler = http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
- http.Error(w, "limit exceeded", 429)
- }))
-
- // Error is the function to call when an error occurs on a throttled handler.
- // By default, returns a 500 status code with a generic message.
- Error = ErrorFunc(func(w http.ResponseWriter, r *http.Request, err error) {
- http.Error(w, "internal error", http.StatusInternalServerError)
- })
-)
-
-// ErrorFunc defines the function type for the Error variable.
-type ErrorFunc func(w http.ResponseWriter, r *http.Request, err error)
-
-// The Limiter interface defines the methods required to control access to a
-// throttled handler.
-type Limiter interface {
- Start()
- Limit(http.ResponseWriter, *http.Request) (<-chan bool, error)
-}
-
-// Custom creates a Throttler using the provided Limiter implementation.
-func Custom(l Limiter) *Throttler {
- return &Throttler{
- limiter: l,
- }
-}
-
-// A Throttler controls access to HTTP handlers using a Limiter.
-type Throttler struct {
- // DeniedHandler is called if the request is disallowed. If it is nil,
- // the DefaultDeniedHandler variable is used.
- DeniedHandler http.Handler
-
- limiter Limiter
- // The mutex protects the started flag
- mu sync.Mutex
- started bool
-}
-
-// Throttle wraps a HTTP handler so that its access is controlled by
-// the Throttler. It returns the Handler with the throttling logic.
-func (t *Throttler) Throttle(h http.Handler) http.Handler {
- dh := t.start()
- return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
- ch, err := t.limiter.Limit(w, r)
- if err != nil {
- Error(w, r, err)
- return
- }
- ok := <-ch
- if ok {
- h.ServeHTTP(w, r)
- } else {
- dh.ServeHTTP(w, r)
- }
- })
-}
-
-// start starts the throttling and returns the effective denied handler to
-// use for requests that were denied access.
-func (t *Throttler) start() http.Handler {
- t.mu.Lock()
- defer t.mu.Unlock()
- // Get the effective denied handler
- dh := t.DeniedHandler
- if dh == nil {
- dh = DefaultDeniedHandler
- }
- if !t.started {
- t.limiter.Start()
- t.started = true
- }
- return dh
-}
diff --git a/vendor/gopkg.in/throttled/throttled.v2/.gitignore b/vendor/gopkg.in/throttled/throttled.v2/.gitignore
new file mode 100644
index 000000000..96c4e10b7
--- /dev/null
+++ b/vendor/gopkg.in/throttled/throttled.v2/.gitignore
@@ -0,0 +1,5 @@
+.DS_Store
+*.swp
+*.swo
+*.test
+*.out
diff --git a/vendor/gopkg.in/throttled/throttled.v2/.travis.yml b/vendor/gopkg.in/throttled/throttled.v2/.travis.yml
new file mode 100644
index 000000000..29225d7af
--- /dev/null
+++ b/vendor/gopkg.in/throttled/throttled.v2/.travis.yml
@@ -0,0 +1,24 @@
+sudo: false
+
+language: go
+
+go:
+ - 1.3
+ - tip
+
+notifications:
+ email: false
+
+services:
+ - redis-server
+
+install:
+ - make get-deps
+ # Move to the gopkg location that rather than the default clone location
+ # otherwise Go 1.4+ complains about incorrect import paths.
+ - export GOPKG_DIR=$GOPATH/src/gopkg.in/throttled
+ - mkdir -p $GOPKG_DIR
+ - mv $TRAVIS_BUILD_DIR $GOPKG_DIR/throttled.v2
+ - cd $GOPKG_DIR/throttled.v2
+
+script: make
diff --git a/vendor/gopkg.in/throttled/throttled.v1/LICENSE b/vendor/gopkg.in/throttled/throttled.v2/LICENSE
index f9616483e..f9616483e 100644
--- a/vendor/gopkg.in/throttled/throttled.v1/LICENSE
+++ b/vendor/gopkg.in/throttled/throttled.v2/LICENSE
diff --git a/vendor/gopkg.in/throttled/throttled.v2/Makefile b/vendor/gopkg.in/throttled/throttled.v2/Makefile
new file mode 100644
index 000000000..cfc235c31
--- /dev/null
+++ b/vendor/gopkg.in/throttled/throttled.v2/Makefile
@@ -0,0 +1,31 @@
+
+
+.PHONY: test test-cover bench lint get-deps .go-test .go-test-cover
+
+test: .go-test bench lint
+
+test-cover: .go-test-cover bench lint
+
+bench:
+ go test -race -bench=. -cpu=1,2,4
+
+lint:
+ gofmt -l .
+ifneq ($(TRAVIS_GO_VERSION),1.3) # go vet doesn't play nicely on 1.3
+ go vet ./...
+endif
+ which golint # Fail if golint doesn't exist
+ -golint . # Don't fail on golint warnings themselves
+ -golint store # Don't fail on golint warnings themselves
+
+get-deps:
+ go get github.com/garyburd/redigo/redis
+ go get github.com/hashicorp/golang-lru
+ go get github.com/golang/lint/golint
+
+.go-test:
+ go test ./...
+
+.go-test-cover:
+ go test -coverprofile=throttled.coverage.out .
+ go test -coverprofile=store.coverage.out ./store
diff --git a/vendor/gopkg.in/throttled/throttled.v2/README.md b/vendor/gopkg.in/throttled/throttled.v2/README.md
new file mode 100644
index 000000000..b18dcbcc6
--- /dev/null
+++ b/vendor/gopkg.in/throttled/throttled.v2/README.md
@@ -0,0 +1,85 @@
+# Throttled [![build status](https://secure.travis-ci.org/throttled/throttled.png)](https://travis-ci.org/throttled/throttled) [![GoDoc](https://godoc.org/gopkg.in/throttled/throttled.v2?status.png)](https://godoc.org/gopkg.in/throttled/throttled.v2)
+
+Package throttled implements rate limiting access to resources such as
+HTTP endpoints.
+
+The 2.0.0 release made some major changes to the throttled API. If
+this change broke your code in problematic ways or you wish a feature
+of the old API had been retained, please open an issue. We don't
+guarantee any particular changes but would like to hear more about
+what our users need. Thanks!
+
+## Installation
+
+throttled uses gopkg.in for semantic versioning:
+`go get gopkg.in/throttled/throttled.v2`
+
+As of July 27, 2015, the package is located under its own Github
+organization. Please adjust your imports to
+`gopkg.in/throttled/throttled.v2`.
+
+The 1.x release series is compatible with the original, unversioned
+library written by [Martin Angers][puerkitobio]. There is a
+[blog post explaining that version's usage on 0value.com][blog].
+
+## Documentation
+
+API documentation is available on [godoc.org][doc]. The following
+example demonstrates the usage of HTTPLimiter for rate-limiting access
+to an http.Handler to 20 requests per path per minute with bursts of
+up to 5 additional requests:
+
+ store, err := memstore.New(65536)
+ if err != nil {
+ log.Fatal(err)
+ }
+
+ quota := throttled.RateQuota{throttled.PerMin(20), 5}
+ rateLimiter, err := throttled.NewGCRARateLimiter(store, quota)
+ if err != nil {
+ log.Fatal(err)
+ }
+
+ httpRateLimiter := throttled.HTTPRateLimiter{
+ RateLimiter: rateLimiter,
+ VaryBy: &throttled.VaryBy{Path: true},
+ }
+
+ http.ListenAndServe(":8080", httpRateLimiter.RateLimit(myHandler))
+
+## Contributing
+
+Since throttled uses gopkg.in for versioning, running `go get` against
+a fork or cloning from Github to the default path will break
+imports. Instead, use the following process for setting up your
+environment and contributing:
+
+```sh
+# Retrieve the source and dependencies.
+go get gopkg.in/throttled/throttled.v2/...
+
+# Fork the project on Github. For all following directions replace
+# <username> with your Github username. Add your fork as a remote.
+cd $GOPATH/src/gopkg.in/throttled/throttled.v2
+git remote add fork git@github.com:<username>/throttled.git
+
+# Create a branch, make your changes, test them and commit.
+git checkout -b my-new-feature
+# <do some work>
+make test
+git commit -a
+git push -u fork my-new-feature
+```
+
+When your changes are ready, [open a pull request][pr] using "compare
+across forks".
+
+## License
+
+The [BSD 3-clause license][bsd]. Copyright (c) 2014 Martin Angers and Contributors.
+
+[blog]: http://0value.com/throttled--guardian-of-the-web-server
+[bsd]: https://opensource.org/licenses/BSD-3-Clause
+[doc]: https://godoc.org/gopkg.in/throttled/throttled.v2
+[puerkitobio]: https://github.com/puerkitobio/
+[pr]: https://github.com/throttled/throttled/compare
diff --git a/vendor/gopkg.in/throttled/throttled.v2/deprecated.go b/vendor/gopkg.in/throttled/throttled.v2/deprecated.go
new file mode 100644
index 000000000..f2c648a3e
--- /dev/null
+++ b/vendor/gopkg.in/throttled/throttled.v2/deprecated.go
@@ -0,0 +1,73 @@
+package throttled
+
+import (
+ "net/http"
+ "time"
+)
+
+// DEPRECATED. Quota returns the number of requests allowed and the custom time window.
+func (q Rate) Quota() (int, time.Duration) {
+ return q.count, q.period * time.Duration(q.count)
+}
+
+// DEPRECATED. Q represents a custom quota.
+type Q struct {
+ Requests int
+ Window time.Duration
+}
+
+// DEPRECATED. Quota returns the number of requests allowed and the custom time window.
+func (q Q) Quota() (int, time.Duration) {
+ return q.Requests, q.Window
+}
+
+// DEPRECATED. The Quota interface defines the method to implement to describe
+// a time-window quota, as required by the RateLimit throttler.
+type Quota interface {
+ // Quota returns a number of requests allowed, and a duration.
+ Quota() (int, time.Duration)
+}
+
+// DEPRECATED. Throttler is a backwards-compatible alias for HTTPLimiter.
+type Throttler struct {
+ HTTPRateLimiter
+}
+
+// DEPRECATED. Throttle is an alias for HTTPLimiter#Limit
+func (t *Throttler) Throttle(h http.Handler) http.Handler {
+ return t.RateLimit(h)
+}
+
+// DEPRECATED. RateLimit creates a Throttler that conforms to the given
+// rate limits
+func RateLimit(q Quota, vary *VaryBy, store GCRAStore) *Throttler {
+ count, period := q.Quota()
+
+ if count < 1 {
+ count = 1
+ }
+ if period <= 0 {
+ period = time.Second
+ }
+
+ rate := Rate{period: period / time.Duration(count)}
+ limiter, err := NewGCRARateLimiter(store, RateQuota{rate, count - 1})
+
+ // This panic in unavoidable because the original interface does
+ // not support returning an error.
+ if err != nil {
+ panic(err)
+ }
+
+ return &Throttler{
+ HTTPRateLimiter{
+ RateLimiter: limiter,
+ VaryBy: vary,
+ },
+ }
+}
+
+// DEPRECATED. Store is an alias for GCRAStore
+type Store interface {
+ GCRAStore
+}
diff --git a/vendor/gopkg.in/throttled/throttled.v2/deprecated_test.go b/vendor/gopkg.in/throttled/throttled.v2/deprecated_test.go
new file mode 100644
index 000000000..93406648f
--- /dev/null
+++ b/vendor/gopkg.in/throttled/throttled.v2/deprecated_test.go
@@ -0,0 +1,59 @@
+package throttled_test
+
+import (
+ "net/http"
+ "net/http/httptest"
+ "testing"
+
+ "gopkg.in/throttled/throttled.v2"
+ "gopkg.in/throttled/throttled.v2/store"
+)
+
+// Ensure that the current implementation remains compatible with the
+// supported but deprecated usage until the next major version.
+func TestDeprecatedUsage(t *testing.T) {
+ // Declare interfaces to statically check that names haven't changed
+ var st throttled.Store
+ var thr *throttled.Throttler
+ var q throttled.Quota
+
+ st = store.NewMemStore(100)
+ vary := &throttled.VaryBy{Path: true}
+ q = throttled.PerMin(2)
+ thr = throttled.RateLimit(q, vary, st)
+ handler := thr.Throttle(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ w.WriteHeader(200)
+ }))
+
+ cases := []struct {
+ path string
+ code int
+ headers map[string]string
+ }{
+ {"/foo", 200, map[string]string{"X-Ratelimit-Limit": "2", "X-Ratelimit-Remaining": "1", "X-Ratelimit-Reset": "30"}},
+ {"/foo", 200, map[string]string{"X-Ratelimit-Limit": "2", "X-Ratelimit-Remaining": "0", "X-Ratelimit-Reset": "60"}},
+ {"/foo", 429, map[string]string{"X-Ratelimit-Limit": "2", "X-Ratelimit-Remaining": "0", "X-Ratelimit-Reset": "60", "Retry-After": "30"}},
+ {"/bar", 200, map[string]string{"X-Ratelimit-Limit": "2", "X-Ratelimit-Remaining": "1", "X-Ratelimit-Reset": "30"}},
+ }
+
+ for i, c := range cases {
+ req, err := http.NewRequest("GET", c.path, nil)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ rr := httptest.NewRecorder()
+ handler.ServeHTTP(rr, req)
+ if have, want := rr.Code, c.code; have != want {
+ t.Errorf("Expected request %d at %s to return %d but got %d",
+ i, c.path, want, have)
+ }
+
+ for name, want := range c.headers {
+ if have := rr.HeaderMap.Get(name); have != want {
+ t.Errorf("Expected request %d at %s to have header '%s: %s' but got '%s'",
+ i, c.path, name, want, have)
+ }
+ }
+ }
+}
diff --git a/vendor/gopkg.in/throttled/throttled.v2/doc.go b/vendor/gopkg.in/throttled/throttled.v2/doc.go
new file mode 100644
index 000000000..302c2bed7
--- /dev/null
+++ b/vendor/gopkg.in/throttled/throttled.v2/doc.go
@@ -0,0 +1,3 @@
+// Package throttled implements rate limiting access to resources such
+// as HTTP endpoints.
+package throttled // import "gopkg.in/throttled/throttled.v2"
diff --git a/vendor/gopkg.in/throttled/throttled.v2/example_test.go b/vendor/gopkg.in/throttled/throttled.v2/example_test.go
new file mode 100644
index 000000000..66e6374be
--- /dev/null
+++ b/vendor/gopkg.in/throttled/throttled.v2/example_test.go
@@ -0,0 +1,103 @@
+package throttled_test
+
+import (
+ "fmt"
+ "log"
+ "net/http"
+
+ "gopkg.in/throttled/throttled.v2"
+ "gopkg.in/throttled/throttled.v2/store/memstore"
+)
+
+var myHandler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ w.Write([]byte("hi there!"))
+})
+
+// ExampleHTTPRateLimiter demonstrates the usage of HTTPRateLimiter
+// for rate-limiting access to an http.Handler to 20 requests per path
+// per minute with a maximum burst of 5 requests.
+func ExampleHTTPRateLimiter() {
+ store, err := memstore.New(65536)
+ if err != nil {
+ log.Fatal(err)
+ }
+
+ // Maximum burst of 5 which refills at 20 tokens per minute.
+ quota := throttled.RateQuota{throttled.PerMin(20), 5}
+
+ rateLimiter, err := throttled.NewGCRARateLimiter(store, quota)
+ if err != nil {
+ log.Fatal(err)
+ }
+
+ httpRateLimiter := throttled.HTTPRateLimiter{
+ RateLimiter: rateLimiter,
+ VaryBy: &throttled.VaryBy{Path: true},
+ }
+
+ http.ListenAndServe(":8080", httpRateLimiter.RateLimit(myHandler))
+}
+
+// Demonstrates direct use of GCRARateLimiter's RateLimit function (and the
+// more general RateLimiter interface). This should be used anywhere where
+// granular control over rate limiting is required.
+func ExampleGCRARateLimiter() {
+ store, err := memstore.New(65536)
+ if err != nil {
+ log.Fatal(err)
+ }
+
+ // Maximum burst of 5 which refills at 1 token per hour.
+ quota := throttled.RateQuota{throttled.PerHour(1), 5}
+
+ rateLimiter, err := throttled.NewGCRARateLimiter(store, quota)
+ if err != nil {
+ log.Fatal(err)
+ }
+
+ // Bucket according to the number i / 10 (so 1 falls into the bucket 0
+ // while 11 falls into the bucket 1). This has the effect of allowing a
+ // burst of 5 plus 1 (a single emission interval) on every ten iterations
+ // of the loop. See the output for better clarity here.
+ //
+ // We also refill the bucket at 1 token per hour, but that has no effect
+ // for the purposes of this example.
+ for i := 0; i < 20; i++ {
+ bucket := fmt.Sprintf("by-order:%v", i/10)
+
+ limited, result, err := rateLimiter.RateLimit(bucket, 1)
+ if err != nil {
+ log.Fatal(err)
+ }
+
+ if limited {
+ fmt.Printf("Iteration %2v; bucket %v: FAILED. Rate limit exceeded.\n",
+ i, bucket)
+ } else {
+ fmt.Printf("Iteration %2v; bucket %v: Operation successful (remaining=%v).\n",
+ i, bucket, result.Remaining)
+ }
+ }
+
+ // Output:
+ // Iteration 0; bucket by-order:0: Operation successful (remaining=5).
+ // Iteration 1; bucket by-order:0: Operation successful (remaining=4).
+ // Iteration 2; bucket by-order:0: Operation successful (remaining=3).
+ // Iteration 3; bucket by-order:0: Operation successful (remaining=2).
+ // Iteration 4; bucket by-order:0: Operation successful (remaining=1).
+ // Iteration 5; bucket by-order:0: Operation successful (remaining=0).
+ // Iteration 6; bucket by-order:0: FAILED. Rate limit exceeded.
+ // Iteration 7; bucket by-order:0: FAILED. Rate limit exceeded.
+ // Iteration 8; bucket by-order:0: FAILED. Rate limit exceeded.
+ // Iteration 9; bucket by-order:0: FAILED. Rate limit exceeded.
+ // Iteration 10; bucket by-order:1: Operation successful (remaining=5).
+ // Iteration 11; bucket by-order:1: Operation successful (remaining=4).
+ // Iteration 12; bucket by-order:1: Operation successful (remaining=3).
+ // Iteration 13; bucket by-order:1: Operation successful (remaining=2).
+ // Iteration 14; bucket by-order:1: Operation successful (remaining=1).
+ // Iteration 15; bucket by-order:1: Operation successful (remaining=0).
+ // Iteration 16; bucket by-order:1: FAILED. Rate limit exceeded.
+ // Iteration 17; bucket by-order:1: FAILED. Rate limit exceeded.
+ // Iteration 18; bucket by-order:1: FAILED. Rate limit exceeded.
+ // Iteration 19; bucket by-order:1: FAILED. Rate limit exceeded.
+}
diff --git a/vendor/gopkg.in/throttled/throttled.v2/http.go b/vendor/gopkg.in/throttled/throttled.v2/http.go
new file mode 100644
index 000000000..4c513a81d
--- /dev/null
+++ b/vendor/gopkg.in/throttled/throttled.v2/http.go
@@ -0,0 +1,110 @@
+package throttled
+
+import (
+ "errors"
+ "math"
+ "net/http"
+ "strconv"
+)
+
+var (
+ // DefaultDeniedHandler is the default DeniedHandler for an
+ // HTTPRateLimiter. It returns a 429 status code with a generic
+ // message.
+ DefaultDeniedHandler = http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ http.Error(w, "limit exceeded", 429)
+ }))
+
+ // DefaultError is the default Error function for an HTTPRateLimiter.
+ // It returns a 500 status code with a generic message.
+ DefaultError = func(w http.ResponseWriter, r *http.Request, err error) {
+ http.Error(w, "internal error", http.StatusInternalServerError)
+ }
+)
+
+// HTTPRateLimiter faciliates using a Limiter to limit HTTP requests.
+type HTTPRateLimiter struct {
+ // DeniedHandler is called if the request is disallowed. If it is
+ // nil, the DefaultDeniedHandler variable is used.
+ DeniedHandler http.Handler
+
+ // Error is called if the RateLimiter returns an error. If it is
+ // nil, the DefaultErrorFunc is used.
+ Error func(w http.ResponseWriter, r *http.Request, err error)
+
+ // Limiter is call for each request to determine whether the
+ // request is permitted and update internal state. It must be set.
+ RateLimiter RateLimiter
+
+ // VaryBy is called for each request to generate a key for the
+ // limiter. If it is nil, all requests use an empty string key.
+ VaryBy interface {
+ Key(*http.Request) string
+ }
+}
+
+// RateLimit wraps an http.Handler to limit incoming requests.
+// Requests that are not limited will be passed to the handler
+// unchanged. Limited requests will be passed to the DeniedHandler.
+// X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset and
+// Retry-After headers will be written to the response based on the
+// values in the RateLimitResult.
+func (t *HTTPRateLimiter) RateLimit(h http.Handler) http.Handler {
+ return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ if t.RateLimiter == nil {
+ t.error(w, r, errors.New("You must set a RateLimiter on HTTPRateLimiter"))
+ }
+
+ var k string
+ if t.VaryBy != nil {
+ k = t.VaryBy.Key(r)
+ }
+
+ limited, context, err := t.RateLimiter.RateLimit(k, 1)
+
+ if err != nil {
+ t.error(w, r, err)
+ return
+ }
+
+ setRateLimitHeaders(w, context)
+
+ if !limited {
+ h.ServeHTTP(w, r)
+ } else {
+ dh := t.DeniedHandler
+ if dh == nil {
+ dh = DefaultDeniedHandler
+ }
+ dh.ServeHTTP(w, r)
+ }
+ })
+}
+
+func (t *HTTPRateLimiter) error(w http.ResponseWriter, r *http.Request, err error) {
+ e := t.Error
+ if e == nil {
+ e = DefaultError
+ }
+ e(w, r, err)
+}
+
+func setRateLimitHeaders(w http.ResponseWriter, context RateLimitResult) {
+ if v := context.Limit; v >= 0 {
+ w.Header().Add("X-RateLimit-Limit", strconv.Itoa(v))
+ }
+
+ if v := context.Remaining; v >= 0 {
+ w.Header().Add("X-RateLimit-Remaining", strconv.Itoa(v))
+ }
+
+ if v := context.ResetAfter; v >= 0 {
+ vi := int(math.Ceil(v.Seconds()))
+ w.Header().Add("X-RateLimit-Reset", strconv.Itoa(vi))
+ }
+
+ if v := context.RetryAfter; v >= 0 {
+ vi := int(math.Ceil(v.Seconds()))
+ w.Header().Add("Retry-After", strconv.Itoa(vi))
+ }
+}
diff --git a/vendor/gopkg.in/throttled/throttled.v2/http_test.go b/vendor/gopkg.in/throttled/throttled.v2/http_test.go
new file mode 100644
index 000000000..42761da09
--- /dev/null
+++ b/vendor/gopkg.in/throttled/throttled.v2/http_test.go
@@ -0,0 +1,99 @@
+package throttled_test
+
+import (
+ "errors"
+ "net/http"
+ "net/http/httptest"
+ "testing"
+ "time"
+
+ "gopkg.in/throttled/throttled.v2"
+)
+
+type stubLimiter struct {
+}
+
+func (sl *stubLimiter) RateLimit(key string, quantity int) (bool, throttled.RateLimitResult, error) {
+ switch key {
+ case "limit":
+ return true, throttled.RateLimitResult{-1, -1, -1, time.Minute}, nil
+ case "error":
+ return false, throttled.RateLimitResult{}, errors.New("stubLimiter error")
+ default:
+ return false, throttled.RateLimitResult{1, 2, time.Minute, -1}, nil
+ }
+}
+
+type pathGetter struct{}
+
+func (*pathGetter) Key(r *http.Request) string {
+ return r.URL.Path
+}
+
+type httpTestCase struct {
+ path string
+ code int
+ headers map[string]string
+}
+
+func TestHTTPRateLimiter(t *testing.T) {
+ limiter := throttled.HTTPRateLimiter{
+ RateLimiter: &stubLimiter{},
+ VaryBy: &pathGetter{},
+ }
+
+ handler := limiter.RateLimit(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ w.WriteHeader(200)
+ }))
+
+ runHTTPTestCases(t, handler, []httpTestCase{
+ {"ok", 200, map[string]string{"X-Ratelimit-Limit": "1", "X-Ratelimit-Remaining": "2", "X-Ratelimit-Reset": "60"}},
+ {"error", 500, map[string]string{}},
+ {"limit", 429, map[string]string{"Retry-After": "60"}},
+ })
+}
+
+func TestCustomHTTPRateLimiterHandlers(t *testing.T) {
+ limiter := throttled.HTTPRateLimiter{
+ RateLimiter: &stubLimiter{},
+ VaryBy: &pathGetter{},
+ DeniedHandler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ http.Error(w, "custom limit exceeded", 400)
+ }),
+ Error: func(w http.ResponseWriter, r *http.Request, err error) {
+ http.Error(w, "custom internal error", 501)
+ },
+ }
+
+ handler := limiter.RateLimit(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ w.WriteHeader(200)
+ }))
+
+ runHTTPTestCases(t, handler, []httpTestCase{
+ {"limit", 400, map[string]string{}},
+ {"error", 501, map[string]string{}},
+ })
+}
+
+func runHTTPTestCases(t *testing.T, h http.Handler, cs []httpTestCase) {
+ for i, c := range cs {
+ req, err := http.NewRequest("GET", c.path, nil)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ rr := httptest.NewRecorder()
+ h.ServeHTTP(rr, req)
+ if have, want := rr.Code, c.code; have != want {
+ t.Errorf("Expected request %d at %s to return %d but got %d",
+ i, c.path, want, have)
+ }
+
+ for name, want := range c.headers {
+ if have := rr.HeaderMap.Get(name); have != want {
+ t.Errorf("Expected request %d at %s to have header '%s: %s' but got '%s'",
+ i, c.path, name, want, have)
+ }
+ }
+ }
+}
diff --git a/vendor/gopkg.in/throttled/throttled.v2/rate.go b/vendor/gopkg.in/throttled/throttled.v2/rate.go
new file mode 100644
index 000000000..8c11cdb47
--- /dev/null
+++ b/vendor/gopkg.in/throttled/throttled.v2/rate.go
@@ -0,0 +1,239 @@
+package throttled
+
+import (
+ "fmt"
+ "time"
+)
+
+const (
+ // Maximum number of times to retry SetIfNotExists/CompareAndSwap operations
+ // before returning an error.
+ maxCASAttempts = 10
+)
+
+// A RateLimiter manages limiting the rate of actions by key.
+type RateLimiter interface {
+ // RateLimit checks whether a particular key has exceeded a rate
+ // limit. It also returns a RateLimitResult to provide additional
+ // information about the state of the RateLimiter.
+ //
+ // If the rate limit has not been exceeded, the underlying storage
+ // is updated by the supplied quantity. For example, a quantity of
+ // 1 might be used to rate limit a single request while a greater
+ // quantity could rate limit based on the size of a file upload in
+ // megabytes. If quantity is 0, no update is performed allowing
+ // you to "peek" at the state of the RateLimiter for a given key.
+ RateLimit(key string, quantity int) (bool, RateLimitResult, error)
+}
+
+// RateLimitResult represents the state of the RateLimiter for a
+// given key at the time of the query. This state can be used, for
+// example, to communicate information to the client via HTTP
+// headers. Negative values indicate that the attribute is not
+// relevant to the implementation or state.
+type RateLimitResult struct {
+ // Limit is the maximum number of requests that could be permitted
+ // instantaneously for this key starting from an empty state. For
+ // example, if a rate limiter allows 10 requests per second per
+ // key, Limit would always be 10.
+ Limit int
+
+ // Remaining is the maximum number of requests that could be
+ // permitted instantaneously for this key given the current
+ // state. For example, if a rate limiter allows 10 requests per
+ // second and has already received 6 requests for this key this
+ // second, Remaining would be 4.
+ Remaining int
+
+ // ResetAfter is the time until the RateLimiter returns to its
+ // initial state for a given key. For example, if a rate limiter
+ // manages requests per second and received one request 200ms ago,
+ // Reset would return 800ms. You can also think of this as the time
+ // until Limit and Remaining will be equal.
+ ResetAfter time.Duration
+
+ // RetryAfter is the time until the next request will be permitted.
+ // It should be -1 unless the rate limit has been exceeded.
+ RetryAfter time.Duration
+}
+
+type limitResult struct {
+ limited bool
+}
+
+func (r *limitResult) Limited() bool { return r.limited }
+
+type rateLimitResult struct {
+ limitResult
+
+ limit, remaining int
+ reset, retryAfter time.Duration
+}
+
+func (r *rateLimitResult) Limit() int { return r.limit }
+func (r *rateLimitResult) Remaining() int { return r.remaining }
+func (r *rateLimitResult) Reset() time.Duration { return r.reset }
+func (r *rateLimitResult) RetryAfter() time.Duration { return r.retryAfter }
+
+// Rate describes a frequency of an activity such as the number of requests
+// allowed per minute.
+type Rate struct {
+ period time.Duration // Time between equally spaced requests at the rate
+ count int // Used internally for deprecated `RateLimit` interface only
+}
+
+// RateQuota describes the number of requests allowed per time period.
+// MaxRate specified the maximum sustained rate of requests and must
+// be greater than zero. MaxBurst defines the number of requests that
+// will be allowed to exceed the rate in a single burst and must be
+// greater than or equal to zero.
+//
+// Rate{PerSec(1), 0} would mean that after each request, no more
+// requests will be permitted for that client for one second. In
+// practice, you probably want to set MaxBurst >0 to provide some
+// flexibility to clients that only need to make a handful of
+// requests. In fact a MaxBurst of zero will *never* permit a request
+// with a quantity greater than one because it will immediately exceed
+// the limit.
+type RateQuota struct {
+ MaxRate Rate
+ MaxBurst int
+}
+
+// PerSec represents a number of requests per second.
+func PerSec(n int) Rate { return Rate{time.Second / time.Duration(n), n} }
+
+// PerMin represents a number of requests per minute.
+func PerMin(n int) Rate { return Rate{time.Minute / time.Duration(n), n} }
+
+// PerHour represents a number of requests per hour.
+func PerHour(n int) Rate { return Rate{time.Hour / time.Duration(n), n} }
+
+// PerDay represents a number of requests per day.
+func PerDay(n int) Rate { return Rate{24 * time.Hour / time.Duration(n), n} }
+
+// GCRARateLimiter is a RateLimiter that users the generic cell-rate
+// algorithm. The algorithm has been slightly modified from its usual
+// form to support limiting with an additional quantity parameter, such
+// as for limiting the number of bytes uploaded.
+type GCRARateLimiter struct {
+ limit int
+ // Think of the DVT as our flexibility:
+ // How far can you deviate from the nominal equally spaced schedule?
+ // If you like leaky buckets, think about it as the size of your bucket.
+ delayVariationTolerance time.Duration
+ // Think of the emission interval as the time between events
+ // in the nominal equally spaced schedule. If you like leaky buckets,
+ // think of it as how frequently the bucket leaks one unit.
+ emissionInterval time.Duration
+
+ store GCRAStore
+}
+
+// NewGCRARateLimiter creates a GCRARateLimiter. quota.Count defines
+// the maximum number of requests permitted in an instantaneous burst
+// and quota.Count / quota.Period defines the maximum sustained
+// rate. For example, PerMin(60) permits 60 requests instantly per key
+// followed by one request per second indefinitely whereas PerSec(1)
+// only permits one request per second with no tolerance for bursts.
+func NewGCRARateLimiter(st GCRAStore, quota RateQuota) (*GCRARateLimiter, error) {
+ if quota.MaxBurst < 0 {
+ return nil, fmt.Errorf("Invalid RateQuota %#v. MaxBurst must be greater than zero.", quota)
+ }
+ if quota.MaxRate.period <= 0 {
+ return nil, fmt.Errorf("Invalid RateQuota %#v. MaxRate must be greater than zero.", quota)
+ }
+
+ return &GCRARateLimiter{
+ delayVariationTolerance: quota.MaxRate.period * (time.Duration(quota.MaxBurst) + 1),
+ emissionInterval: quota.MaxRate.period,
+ limit: quota.MaxBurst + 1,
+ store: st,
+ }, nil
+}
+
+// RateLimit checks whether a particular key has exceeded a rate
+// limit. It also returns a RateLimitResult to provide additional
+// information about the state of the RateLimiter.
+//
+// If the rate limit has not been exceeded, the underlying storage is
+// updated by the supplied quantity. For example, a quantity of 1
+// might be used to rate limit a single request while a greater
+// quantity could rate limit based on the size of a file upload in
+// megabytes. If quantity is 0, no update is performed allowing you
+// to "peek" at the state of the RateLimiter for a given key.
+func (g *GCRARateLimiter) RateLimit(key string, quantity int) (bool, RateLimitResult, error) {
+ var tat, newTat, now time.Time
+ var ttl time.Duration
+ rlc := RateLimitResult{Limit: g.limit, RetryAfter: -1}
+ limited := false
+
+ i := 0
+ for {
+ var err error
+ var tatVal int64
+ var updated bool
+
+ // tat refers to the theoretical arrival time that would be expected
+ // from equally spaced requests at exactly the rate limit.
+ tatVal, now, err = g.store.GetWithTime(key)
+ if err != nil {
+ return false, rlc, err
+ }
+
+ if tatVal == -1 {
+ tat = now
+ } else {
+ tat = time.Unix(0, tatVal)
+ }
+
+ increment := time.Duration(quantity) * g.emissionInterval
+ if now.After(tat) {
+ newTat = now.Add(increment)
+ } else {
+ newTat = tat.Add(increment)
+ }
+
+ // Block the request if the next permitted time is in the future
+ allowAt := newTat.Add(-(g.delayVariationTolerance))
+ if diff := now.Sub(allowAt); diff < 0 {
+ if increment <= g.delayVariationTolerance {
+ rlc.RetryAfter = -diff
+ }
+ ttl = tat.Sub(now)
+ limited = true
+ break
+ }
+
+ ttl = newTat.Sub(now)
+
+ if tatVal == -1 {
+ updated, err = g.store.SetIfNotExistsWithTTL(key, newTat.UnixNano(), ttl)
+ } else {
+ updated, err = g.store.CompareAndSwapWithTTL(key, tatVal, newTat.UnixNano(), ttl)
+ }
+
+ if err != nil {
+ return false, rlc, err
+ }
+ if updated {
+ break
+ }
+
+ i++
+ if i > maxCASAttempts {
+ return false, rlc, fmt.Errorf(
+ "Failed to store updated rate limit data for key %s after %d attempts",
+ key, i,
+ )
+ }
+ }
+
+ next := g.delayVariationTolerance - ttl
+ if next > -g.emissionInterval {
+ rlc.Remaining = int(next / g.emissionInterval)
+ }
+ rlc.ResetAfter = ttl
+
+ return limited, rlc, nil
+}
diff --git a/vendor/gopkg.in/throttled/throttled.v2/rate_test.go b/vendor/gopkg.in/throttled/throttled.v2/rate_test.go
new file mode 100644
index 000000000..292a050bc
--- /dev/null
+++ b/vendor/gopkg.in/throttled/throttled.v2/rate_test.go
@@ -0,0 +1,128 @@
+package throttled_test
+
+import (
+ "testing"
+ "time"
+
+ "gopkg.in/throttled/throttled.v2"
+ "gopkg.in/throttled/throttled.v2/store/memstore"
+)
+
+const deniedStatus = 429
+
+type testStore struct {
+ store throttled.GCRAStore
+
+ clock time.Time
+ failUpdates bool
+}
+
+func (ts *testStore) GetWithTime(key string) (int64, time.Time, error) {
+ v, _, e := ts.store.GetWithTime(key)
+ return v, ts.clock, e
+}
+
+func (ts *testStore) SetIfNotExistsWithTTL(key string, value int64, ttl time.Duration) (bool, error) {
+ if ts.failUpdates {
+ return false, nil
+ }
+ return ts.store.SetIfNotExistsWithTTL(key, value, ttl)
+}
+
+func (ts *testStore) CompareAndSwapWithTTL(key string, old, new int64, ttl time.Duration) (bool, error) {
+ if ts.failUpdates {
+ return false, nil
+ }
+ return ts.store.CompareAndSwapWithTTL(key, old, new, ttl)
+}
+
+func TestRateLimit(t *testing.T) {
+ limit := 5
+ rq := throttled.RateQuota{throttled.PerSec(1), limit - 1}
+ start := time.Unix(0, 0)
+ cases := []struct {
+ now time.Time
+ volume, remaining int
+ reset, retry time.Duration
+ limited bool
+ }{
+ // You can never make a request larger than the maximum
+ 0: {start, 6, 5, 0, -1, true},
+ // Rate limit normal requests appropriately
+ 1: {start, 1, 4, time.Second, -1, false},
+ 2: {start, 1, 3, 2 * time.Second, -1, false},
+ 3: {start, 1, 2, 3 * time.Second, -1, false},
+ 4: {start, 1, 1, 4 * time.Second, -1, false},
+ 5: {start, 1, 0, 5 * time.Second, -1, false},
+ 6: {start, 1, 0, 5 * time.Second, time.Second, true},
+ 7: {start.Add(3000 * time.Millisecond), 1, 2, 3000 * time.Millisecond, -1, false},
+ 8: {start.Add(3100 * time.Millisecond), 1, 1, 3900 * time.Millisecond, -1, false},
+ 9: {start.Add(4000 * time.Millisecond), 1, 1, 4000 * time.Millisecond, -1, false},
+ 10: {start.Add(8000 * time.Millisecond), 1, 4, 1000 * time.Millisecond, -1, false},
+ 11: {start.Add(9500 * time.Millisecond), 1, 4, 1000 * time.Millisecond, -1, false},
+ // Zero-volume request just peeks at the state
+ 12: {start.Add(9500 * time.Millisecond), 0, 4, time.Second, -1, false},
+ // High-volume request uses up more of the limit
+ 13: {start.Add(9500 * time.Millisecond), 2, 2, 3 * time.Second, -1, false},
+ // Large requests cannot exceed limits
+ 14: {start.Add(9500 * time.Millisecond), 5, 2, 3 * time.Second, 3 * time.Second, true},
+ }
+
+ mst, err := memstore.New(0)
+ if err != nil {
+ t.Fatal(err)
+ }
+ st := testStore{store: mst}
+
+ rl, err := throttled.NewGCRARateLimiter(&st, rq)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ // Start the server
+ for i, c := range cases {
+ st.clock = c.now
+
+ limited, context, err := rl.RateLimit("foo", c.volume)
+ if err != nil {
+ t.Fatalf("%d: %#v", i, err)
+ }
+
+ if limited != c.limited {
+ t.Errorf("%d: expected Limited to be %t but got %t", i, c.limited, limited)
+ }
+
+ if have, want := context.Limit, limit; have != want {
+ t.Errorf("%d: expected Limit to be %d but got %d", i, want, have)
+ }
+
+ if have, want := context.Remaining, c.remaining; have != want {
+ t.Errorf("%d: expected Remaining to be %d but got %d", i, want, have)
+ }
+
+ if have, want := context.ResetAfter, c.reset; have != want {
+ t.Errorf("%d: expected ResetAfter to be %s but got %s", i, want, have)
+ }
+
+ if have, want := context.RetryAfter, c.retry; have != want {
+ t.Errorf("%d: expected RetryAfter to be %d but got %d", i, want, have)
+ }
+ }
+}
+
+func TestRateLimitUpdateFailures(t *testing.T) {
+ rq := throttled.RateQuota{throttled.PerSec(1), 1}
+ mst, err := memstore.New(0)
+ if err != nil {
+ t.Fatal(err)
+ }
+ st := testStore{store: mst, failUpdates: true}
+ rl, err := throttled.NewGCRARateLimiter(&st, rq)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ if _, _, err := rl.RateLimit("foo", 1); err == nil {
+ t.Error("Expected limiting to fail when store updates fail")
+ }
+}
diff --git a/vendor/gopkg.in/throttled/throttled.v2/store.go b/vendor/gopkg.in/throttled/throttled.v2/store.go
new file mode 100644
index 000000000..a26bbc2c5
--- /dev/null
+++ b/vendor/gopkg.in/throttled/throttled.v2/store.go
@@ -0,0 +1,34 @@
+package throttled
+
+import (
+ "time"
+)
+
+// GCRAStore is the interface to implement to store state for a GCRA
+// rate limiter
+type GCRAStore interface {
+ // GetWithTime returns the value of the key if it is in the store
+ // or -1 if it does not exist. It also returns the current time at
+ // the Store. The time must be representable as a positive int64
+ // of nanoseconds since the epoch.
+ //
+ // GCRA assumes that all instances sharing the same Store also
+ // share the same clock. Using separate clocks will work if the
+ // skew is small but not recommended in practice unless you're
+ // lucky enough to be hooked up to GPS or atomic clocks.
+ GetWithTime(key string) (int64, time.Time, error)
+
+ // SetIfNotExistsWithTTL sets the value of key only if it is not
+ // already set in the store it returns whether a new value was
+ // set. If the store supports expiring keys and a new value was
+ // set, the key will expire after the provided ttl.
+ SetIfNotExistsWithTTL(key string, value int64, ttl time.Duration) (bool, error)
+
+ // CompareAndSwapWithTTL atomically compares the value at key to
+ // the old value. If it matches, it sets it to the new value and
+ // returns true. Otherwise, it returns false. If the key does not
+ // exist in the store, it returns false with no error. If the
+ // store supports expiring keys and the swap succeeded, the key
+ // will expire after the provided ttl.
+ CompareAndSwapWithTTL(key string, old, new int64, ttl time.Duration) (bool, error)
+}
diff --git a/vendor/gopkg.in/throttled/throttled.v2/store/deprecated.go b/vendor/gopkg.in/throttled/throttled.v2/store/deprecated.go
new file mode 100644
index 000000000..5476e87ac
--- /dev/null
+++ b/vendor/gopkg.in/throttled/throttled.v2/store/deprecated.go
@@ -0,0 +1,32 @@
+// Package store contains deprecated aliases for subpackages
+package store // import "gopkg.in/throttled/throttled.v2/store"
+
+import (
+ "github.com/garyburd/redigo/redis"
+
+ "gopkg.in/throttled/throttled.v2/store/memstore"
+ "gopkg.in/throttled/throttled.v2/store/redigostore"
+)
+
+// DEPRECATED. NewMemStore is a compatible alias for mem.New
+func NewMemStore(maxKeys int) *memstore.MemStore {
+ st, err := memstore.New(maxKeys)
+ if err != nil {
+ // As of this writing, `lru.New` can only return an error if you pass
+ // maxKeys <= 0 so this should never occur.
+ panic(err)
+ }
+ return st
+}
+
+// DEPRECATED. NewMemStore is a compatible alias for redis.New
+func NewRedisStore(pool *redis.Pool, keyPrefix string, db int) *redigostore.RedigoStore {
+ st, err := redigostore.New(pool, keyPrefix, db)
+ if err != nil {
+ // As of this writing, creating a Redis store never returns an error
+ // so this should be safe while providing some ability to return errors
+ // in the future.
+ panic(err)
+ }
+ return st
+}
diff --git a/vendor/gopkg.in/throttled/throttled.v2/store/memstore/memstore.go b/vendor/gopkg.in/throttled/throttled.v2/store/memstore/memstore.go
new file mode 100644
index 000000000..5d8fee8b5
--- /dev/null
+++ b/vendor/gopkg.in/throttled/throttled.v2/store/memstore/memstore.go
@@ -0,0 +1,127 @@
+// Package memstore offers an in-memory store implementation for throttled.
+package memstore // import "gopkg.in/throttled/throttled.v2/store/memstore"
+
+import (
+ "sync"
+ "sync/atomic"
+ "time"
+
+ "github.com/hashicorp/golang-lru"
+)
+
+// MemStore is an in-memory store implementation for throttled. It
+// supports evicting the least recently used keys to control memory
+// usage. It is stored in memory in the current process and thus
+// doesn't share state with other rate limiters.
+type MemStore struct {
+ sync.RWMutex
+ keys *lru.Cache
+ m map[string]*int64
+}
+
+// New initializes a Store. If maxKeys > 0, the number of different
+// keys is restricted to the specified amount. In this case, it uses
+// an LRU algorithm to evict older keys to make room for newer
+// ones. If maxKeys <= 0, there is no limit on the number of keys,
+// which may use an unbounded amount of memory.
+func New(maxKeys int) (*MemStore, error) {
+ var m *MemStore
+
+ if maxKeys > 0 {
+ keys, err := lru.New(maxKeys)
+ if err != nil {
+ return nil, err
+ }
+
+ m = &MemStore{
+ keys: keys,
+ }
+ } else {
+ m = &MemStore{
+ m: make(map[string]*int64),
+ }
+ }
+ return m, nil
+}
+
+// GetWithTime returns the value of the key if it is in the store or
+// -1 if it does not exist. It also returns the current local time on
+// the machine.
+func (ms *MemStore) GetWithTime(key string) (int64, time.Time, error) {
+ now := time.Now()
+ valP, ok := ms.get(key, false)
+
+ if !ok {
+ return -1, now, nil
+ }
+
+ return atomic.LoadInt64(valP), now, nil
+}
+
+// SetIfNotExistsWithTTL sets the value of key only if it is not
+// already set in the store it returns whether a new value was set. It
+// ignores the ttl.
+func (ms *MemStore) SetIfNotExistsWithTTL(key string, value int64, _ time.Duration) (bool, error) {
+ _, ok := ms.get(key, false)
+
+ if ok {
+ return false, nil
+ }
+
+ ms.Lock()
+ defer ms.Unlock()
+
+ _, ok = ms.get(key, true)
+
+ if ok {
+ return false, nil
+ }
+
+ // Store a pointer to a new instance so that the caller
+ // can't mutate the value after setting
+ v := value
+
+ if ms.keys != nil {
+ ms.keys.Add(key, &v)
+ } else {
+ ms.m[key] = &v
+ }
+
+ return true, nil
+}
+
+// CompareAndSwapWithTTL atomically compares the value at key to the
+// old value. If it matches, it sets it to the new value and returns
+// true. Otherwise, it returns false. If the key does not exist in the
+// store, it returns false with no error. It ignores the ttl.
+func (ms *MemStore) CompareAndSwapWithTTL(key string, old, new int64, _ time.Duration) (bool, error) {
+ valP, ok := ms.get(key, false)
+
+ if !ok {
+ return false, nil
+ }
+
+ return atomic.CompareAndSwapInt64(valP, old, new), nil
+}
+
+func (ms *MemStore) get(key string, locked bool) (*int64, bool) {
+ var valP *int64
+ var ok bool
+
+ if ms.keys != nil {
+ var valI interface{}
+
+ valI, ok = ms.keys.Get(key)
+ if ok {
+ valP = valI.(*int64)
+ }
+ } else {
+ if !locked {
+ ms.RLock()
+ defer ms.RUnlock()
+ }
+ valP, ok = ms.m[key]
+ }
+
+ return valP, ok
+}
diff --git a/vendor/gopkg.in/throttled/throttled.v2/store/memstore/memstore_test.go b/vendor/gopkg.in/throttled/throttled.v2/store/memstore/memstore_test.go
new file mode 100644
index 000000000..ef003d3de
--- /dev/null
+++ b/vendor/gopkg.in/throttled/throttled.v2/store/memstore/memstore_test.go
@@ -0,0 +1,40 @@
+package memstore_test
+
+import (
+ "testing"
+
+ "gopkg.in/throttled/throttled.v2/store/memstore"
+ "gopkg.in/throttled/throttled.v2/store/storetest"
+)
+
+func TestMemStoreLRU(t *testing.T) {
+ st, err := memstore.New(10)
+ if err != nil {
+ t.Fatal(err)
+ }
+ storetest.TestGCRAStore(t, st)
+}
+
+func TestMemStoreUnlimited(t *testing.T) {
+ st, err := memstore.New(10)
+ if err != nil {
+ t.Fatal(err)
+ }
+ storetest.TestGCRAStore(t, st)
+}
+
+func BenchmarkMemStoreLRU(b *testing.B) {
+ st, err := memstore.New(10)
+ if err != nil {
+ b.Fatal(err)
+ }
+ storetest.BenchmarkGCRAStore(b, st)
+}
+
+func BenchmarkMemStoreUnlimited(b *testing.B) {
+ st, err := memstore.New(0)
+ if err != nil {
+ b.Fatal(err)
+ }
+ storetest.BenchmarkGCRAStore(b, st)
+}
diff --git a/vendor/gopkg.in/throttled/throttled.v2/store/redigostore/redigostore.go b/vendor/gopkg.in/throttled/throttled.v2/store/redigostore/redigostore.go
new file mode 100644
index 000000000..54208fa6d
--- /dev/null
+++ b/vendor/gopkg.in/throttled/throttled.v2/store/redigostore/redigostore.go
@@ -0,0 +1,156 @@
+// Package redigostore offers Redis-based store implementation for throttled using redigo.
+package redigostore // import "gopkg.in/throttled/throttled.v2/store/redigostore"
+
+import (
+ "strings"
+ "time"
+
+ "github.com/garyburd/redigo/redis"
+)
+
+const (
+ redisCASMissingKey = "key does not exist"
+ redisCASScript = `
+local v = redis.call('get', KEYS[1])
+if v == false then
+ return redis.error_reply("key does not exist")
+end
+if v ~= ARGV[1] then
+ return 0
+end
+if ARGV[3] ~= "0" then
+ redis.call('setex', KEYS[1], ARGV[3], ARGV[2])
+else
+ redis.call('set', KEYS[1], ARGV[2])
+end
+return 1
+`
+)
+
+// RedigoStore implements a Redis-based store using redigo.
+type RedigoStore struct {
+ pool *redis.Pool
+ prefix string
+ db int
+}
+
+// New creates a new Redis-based store, using the provided pool to get
+// its connections. The keys will have the specified keyPrefix, which
+// may be an empty string, and the database index specified by db will
+// be selected to store the keys. Any updating operations will reset
+// the key TTL to the provided value rounded down to the nearest
+// second. Depends on Redis 2.6+ for EVAL support.
+func New(pool *redis.Pool, keyPrefix string, db int) (*RedigoStore, error) {
+ return &RedigoStore{
+ pool: pool,
+ prefix: keyPrefix,
+ db: db,
+ }, nil
+}
+
+// GetWithTime returns the value of the key if it is in the store
+// or -1 if it does not exist. It also returns the current time at
+// the redis server to microsecond precision.
+func (r *RedigoStore) GetWithTime(key string) (int64, time.Time, error) {
+ var now time.Time
+
+ key = r.prefix + key
+
+ conn, err := r.getConn()
+ if err != nil {
+ return 0, now, err
+ }
+ defer conn.Close()
+
+ conn.Send("TIME")
+ conn.Send("GET", key)
+ conn.Flush()
+ timeReply, err := redis.Values(conn.Receive())
+ if err != nil {
+ return 0, now, err
+ }
+
+ var s, us int64
+ if _, err := redis.Scan(timeReply, &s, &us); err != nil {
+ return 0, now, err
+ }
+ now = time.Unix(s, us*int64(time.Microsecond))
+
+ v, err := redis.Int64(conn.Receive())
+ if err == redis.ErrNil {
+ return -1, now, nil
+ } else if err != nil {
+ return 0, now, err
+ }
+
+ return v, now, nil
+}
+
+// SetIfNotExistsWithTTL sets the value of key only if it is not
+// already set in the store it returns whether a new value was set.
+// If a new value was set, the ttl in the key is also set, though this
+// operation is not performed atomically.
+func (r *RedigoStore) SetIfNotExistsWithTTL(key string, value int64, ttl time.Duration) (bool, error) {
+ key = r.prefix + key
+
+ conn, err := r.getConn()
+ if err != nil {
+ return false, err
+ }
+ defer conn.Close()
+
+ v, err := redis.Int64(conn.Do("SETNX", key, value))
+ if err != nil {
+ return false, err
+ }
+
+ updated := v == 1
+
+ if ttl >= time.Second {
+ if _, err := conn.Do("EXPIRE", key, int(ttl.Seconds())); err != nil {
+ return updated, err
+ }
+ }
+
+ return updated, nil
+}
+
+// CompareAndSwapWithTTL atomically compares the value at key to the
+// old value. If it matches, it sets it to the new value and returns
+// true. Otherwise, it returns false. If the key does not exist in the
+// store, it returns false with no error. If the swap succeeds, the
+// ttl for the key is updated atomically.
+func (r *RedigoStore) CompareAndSwapWithTTL(key string, old, new int64, ttl time.Duration) (bool, error) {
+ key = r.prefix + key
+ conn, err := r.getConn()
+ if err != nil {
+ return false, err
+ }
+ defer conn.Close()
+
+ swapped, err := redis.Bool(conn.Do("EVAL", redisCASScript, 1, key, old, new, int(ttl.Seconds())))
+ if err != nil {
+ if strings.Contains(err.Error(), redisCASMissingKey) {
+ return false, nil
+ }
+
+ return false, err
+ }
+
+ return swapped, nil
+}
+
+// Select the specified database index.
+func (r *RedigoStore) getConn() (redis.Conn, error) {
+ conn := r.pool.Get()
+
+ // Select the specified database
+ if r.db > 0 {
+ if _, err := redis.String(conn.Do("SELECT", r.db)); err != nil {
+ conn.Close()
+ return nil, err
+ }
+ }
+
+ return conn, nil
+}
diff --git a/vendor/gopkg.in/throttled/throttled.v2/store/redigostore/redisstore_test.go b/vendor/gopkg.in/throttled/throttled.v2/store/redigostore/redisstore_test.go
new file mode 100644
index 000000000..d47b635d2
--- /dev/null
+++ b/vendor/gopkg.in/throttled/throttled.v2/store/redigostore/redisstore_test.go
@@ -0,0 +1,85 @@
+package redigostore_test
+
+import (
+ "testing"
+ "time"
+
+ "github.com/garyburd/redigo/redis"
+
+ "gopkg.in/throttled/throttled.v2/store/redigostore"
+ "gopkg.in/throttled/throttled.v2/store/storetest"
+)
+
+const (
+ redisTestDB = 1
+ redisTestPrefix = "throttled:"
+)
+
+func getPool() *redis.Pool {
+ pool := &redis.Pool{
+ MaxIdle: 3,
+ IdleTimeout: 30 * time.Second,
+ Dial: func() (redis.Conn, error) {
+ return redis.Dial("tcp", ":6379")
+ },
+ TestOnBorrow: func(c redis.Conn, t time.Time) error {
+ _, err := c.Do("PING")
+ return err
+ },
+ }
+ return pool
+}
+
+func TestRedisStore(t *testing.T) {
+ c, st := setupRedis(t, 0)
+ defer c.Close()
+ defer clearRedis(c)
+
+ clearRedis(c)
+ storetest.TestGCRAStore(t, st)
+ storetest.TestGCRAStoreTTL(t, st)
+}
+
+func BenchmarkRedisStore(b *testing.B) {
+ c, st := setupRedis(b, 0)
+ defer c.Close()
+ defer clearRedis(c)
+
+ storetest.BenchmarkGCRAStore(b, st)
+}
+
+func clearRedis(c redis.Conn) error {
+ keys, err := redis.Values(c.Do("KEYS", redisTestPrefix+"*"))
+ if err != nil {
+ return err
+ }
+
+ if _, err := redis.Int(c.Do("DEL", keys...)); err != nil {
+ return err
+ }
+
+ return nil
+}
+
+func setupRedis(tb testing.TB, ttl time.Duration) (redis.Conn, *redigostore.RedigoStore) {
+ pool := getPool()
+ c := pool.Get()
+
+ if _, err := redis.String(c.Do("PING")); err != nil {
+ c.Close()
+ tb.Skip("redis server not available on localhost port 6379")
+ }
+
+ if _, err := redis.String(c.Do("SELECT", redisTestDB)); err != nil {
+ c.Close()
+ tb.Fatal(err)
+ }
+
+ st, err := redigostore.New(pool, redisTestPrefix, redisTestDB)
+ if err != nil {
+ c.Close()
+ tb.Fatal(err)
+ }
+
+ return c, st
+}
diff --git a/vendor/gopkg.in/throttled/throttled.v2/store/storetest/doc.go b/vendor/gopkg.in/throttled/throttled.v2/store/storetest/doc.go
new file mode 100644
index 000000000..ecfee2638
--- /dev/null
+++ b/vendor/gopkg.in/throttled/throttled.v2/store/storetest/doc.go
@@ -0,0 +1,2 @@
+// Package storetest provides a helper for testing throttled stores.
+package storetest // import "gopkg.in/throttled/throttled.v2/store/storetest"
diff --git a/vendor/gopkg.in/throttled/throttled.v2/store/storetest/storetest.go b/vendor/gopkg.in/throttled/throttled.v2/store/storetest/storetest.go
new file mode 100644
index 000000000..191b40a4f
--- /dev/null
+++ b/vendor/gopkg.in/throttled/throttled.v2/store/storetest/storetest.go
@@ -0,0 +1,176 @@
+// Package storetest provides a helper for testing throttled stores.
+package storetest // import "gopkg.in/throttled/throttled.v2/store/storetest"
+
+import (
+ "math/rand"
+ "strconv"
+ "sync/atomic"
+ "testing"
+ "time"
+
+ "gopkg.in/throttled/throttled.v2"
+)
+
+// TestGCRAStore tests the behavior of a GCRAStore implementation for
+// compliance with the throttled API. It does not require support
+// for TTLs.
+func TestGCRAStore(t *testing.T, st throttled.GCRAStore) {
+ // GetWithTime a missing key
+ if have, _, err := st.GetWithTime("foo"); err != nil {
+ t.Fatal(err)
+ } else if have != -1 {
+ t.Errorf("expected GetWithTime to return -1 for a missing key but got %d", have)
+ }
+
+ // SetIfNotExists on a new key
+ want := int64(1)
+
+ if set, err := st.SetIfNotExistsWithTTL("foo", want, 0); err != nil {
+ t.Fatal(err)
+ } else if !set {
+ t.Errorf("expected SetIfNotExists on an empty key to succeed")
+ }
+
+ before := time.Now()
+
+ if have, now, err := st.GetWithTime("foo"); err != nil {
+ t.Fatal(err)
+ } else if have != want {
+ t.Errorf("expected GetWithTime to return %d but got %d", want, have)
+ } else if now.UnixNano() <= 0 {
+ t.Errorf("expected GetWithTime to return a time representable representable as a positive int64 of nanoseconds since the epoch")
+ } else if now.Before(before) || now.After(time.Now()) {
+ // Note that we make the assumption here that the store is running on
+ // the same machine as this test and thus shares a clock. This can be a
+ // little tricky in the case of Redis, which could be running
+ // elsewhere. The test assumes that it's running either locally on on
+ // Travis (where currently the Redis is available on localhost). If new
+ // test environments are procured, this may need to be revisited.
+ t.Errorf("expected GetWithTime to return a time between the time before the call and the time after the call")
+ }
+
+ // SetIfNotExists on an existing key
+ if set, err := st.SetIfNotExistsWithTTL("foo", 123, 0); err != nil {
+ t.Fatal(err)
+ } else if set {
+ t.Errorf("expected SetIfNotExists on an existing key to fail")
+ }
+
+ if have, _, err := st.GetWithTime("foo"); err != nil {
+ t.Fatal(err)
+ } else if have != want {
+ t.Errorf("expected GetWithTime to return %d but got %d", want, have)
+ }
+
+ // SetIfNotExists on a different key
+ if set, err := st.SetIfNotExistsWithTTL("bar", 456, 0); err != nil {
+ t.Fatal(err)
+ } else if !set {
+ t.Errorf("expected SetIfNotExists on an empty key to succeed")
+ }
+
+ // Returns the false on a missing key
+ if swapped, err := st.CompareAndSwapWithTTL("baz", 1, 2, 0); err != nil {
+ t.Fatal(err)
+ } else if swapped {
+ t.Errorf("expected CompareAndSwap to fail on a missing key")
+ }
+
+ // Test a successful CAS
+ want = int64(2)
+
+ if swapped, err := st.CompareAndSwapWithTTL("foo", 1, want, 0); err != nil {
+ t.Fatal(err)
+ } else if !swapped {
+ t.Errorf("expected CompareAndSwap to succeed")
+ }
+
+ if have, _, err := st.GetWithTime("foo"); err != nil {
+ t.Fatal(err)
+ } else if have != want {
+ t.Errorf("expected GetWithTime to return %d but got %d", want, have)
+ }
+
+ // Test an unsuccessful CAS
+ if swapped, err := st.CompareAndSwapWithTTL("foo", 1, 2, 0); err != nil {
+ t.Fatal(err)
+ } else if swapped {
+ t.Errorf("expected CompareAndSwap to fail")
+ }
+
+ if have, _, err := st.GetWithTime("foo"); err != nil {
+ t.Fatal(err)
+ } else if have != want {
+ t.Errorf("expected GetWithTime to return %d but got %d", want, have)
+ }
+}
+
+// TestGCRAStoreTTL tests the behavior of TTLs in a GCRAStore implementation.
+func TestGCRAStoreTTL(t *testing.T, st throttled.GCRAStore) {
+ ttl := time.Second
+ want := int64(1)
+ key := "ttl"
+
+ if _, err := st.SetIfNotExistsWithTTL(key, want, ttl); err != nil {
+ t.Fatal(err)
+ }
+
+ if have, _, err := st.GetWithTime(key); err != nil {
+ t.Fatal(err)
+ } else if have != want {
+ t.Errorf("expected GetWithTime to return %d, got %d", want, have)
+ }
+
+ // I can't think of a generic way to test expiration without a sleep
+ time.Sleep(ttl + time.Millisecond)
+
+ if have, _, err := st.GetWithTime(key); err != nil {
+ t.Fatal(err)
+ } else if have != -1 {
+ t.Errorf("expected GetWithTime to fail on an expired key but got %d", have)
+ }
+}
+
+// BenchmarkGCRAStore runs parallel benchmarks against a GCRAStore implementation.
+// Aside from being useful for performance testing, this is useful for finding
+// race conditions with the Go race detector.
+func BenchmarkGCRAStore(b *testing.B, st throttled.GCRAStore) {
+ seed := int64(42)
+ var attempts, updates int64
+
+ b.RunParallel(func(pb *testing.PB) {
+ // We need atomic behavior around the RNG or go detects a race in the test
+ delta := int64(1)
+ seedValue := atomic.AddInt64(&seed, delta) - delta
+ gen := rand.New(rand.NewSource(seedValue))
+
+ for pb.Next() {
+ key := strconv.FormatInt(gen.Int63n(50), 10)
+
+ var v int64
+ var updated bool
+
+ v, _, err := st.GetWithTime(key)
+ if v == -1 {
+ updated, err = st.SetIfNotExistsWithTTL(key, gen.Int63(), 0)
+ if err != nil {
+ b.Error(err)
+ }
+ } else if err != nil {
+ b.Error(err)
+ } else {
+ updated, err = st.CompareAndSwapWithTTL(key, v, gen.Int63(), 0)
+ if err != nil {
+ b.Error(err)
+ }
+ }
+
+ atomic.AddInt64(&attempts, 1)
+ if updated {
+ atomic.AddInt64(&updates, 1)
+ }
+ }
+ })
+
+ b.Logf("%d/%d update operations succeeed", updates, attempts)
+}
diff --git a/vendor/gopkg.in/throttled/throttled.v1/varyby.go b/vendor/gopkg.in/throttled/throttled.v2/varyby.go
index 3b2cdb011..dc6a01718 100644
--- a/vendor/gopkg.in/throttled/throttled.v1/varyby.go
+++ b/vendor/gopkg.in/throttled/throttled.v2/varyby.go
@@ -31,7 +31,7 @@ type VaryBy struct {
// Defaults to a newline character if empty (\n).
Separator string
- // Custom specifies the custom-generated key to use for this request.
+ // DEPRECATED. Custom specifies the custom-generated key to use for this request.
// If not nil, the value returned by this function is used instead of any
// VaryBy criteria.
Custom func(r *http.Request) string
diff --git a/vendor/gopkg.in/throttled/throttled.v1/varyby_test.go b/vendor/gopkg.in/throttled/throttled.v2/varyby_test.go
index 91b7ae0ae..66a5f4e98 100644
--- a/vendor/gopkg.in/throttled/throttled.v1/varyby_test.go
+++ b/vendor/gopkg.in/throttled/throttled.v2/varyby_test.go
@@ -1,9 +1,11 @@
-package throttled
+package throttled_test
import (
"net/http"
"net/url"
"testing"
+
+ "gopkg.in/throttled/throttled.v2"
)
func TestVaryBy(t *testing.T) {
@@ -13,34 +15,34 @@ func TestVaryBy(t *testing.T) {
}
ck := &http.Cookie{Name: "ssn", Value: "test"}
cases := []struct {
- vb *VaryBy
+ vb *throttled.VaryBy
r *http.Request
k string
}{
0: {nil, &http.Request{}, ""},
- 1: {&VaryBy{RemoteAddr: true}, &http.Request{RemoteAddr: "::"}, "::\n"},
+ 1: {&throttled.VaryBy{RemoteAddr: true}, &http.Request{RemoteAddr: "::"}, "::\n"},
2: {
- &VaryBy{Method: true, Path: true},
+ &throttled.VaryBy{Method: true, Path: true},
&http.Request{Method: "POST", URL: u},
"post\n/test/path\n",
},
3: {
- &VaryBy{Headers: []string{"Content-length"}},
+ &throttled.VaryBy{Headers: []string{"Content-length"}},
&http.Request{Header: http.Header{"Content-Type": []string{"text/plain"}, "Content-Length": []string{"123"}}},
"123\n",
},
4: {
- &VaryBy{Separator: ",", Method: true, Headers: []string{"Content-length"}, Params: []string{"q", "user"}},
+ &throttled.VaryBy{Separator: ",", Method: true, Headers: []string{"Content-length"}, Params: []string{"q", "user"}},
&http.Request{Method: "GET", Header: http.Header{"Content-Type": []string{"text/plain"}, "Content-Length": []string{"123"}}, Form: url.Values{"q": []string{"s"}, "pwd": []string{"secret"}, "user": []string{"test"}}},
"get,123,s,test,",
},
5: {
- &VaryBy{Cookies: []string{"ssn"}},
+ &throttled.VaryBy{Cookies: []string{"ssn"}},
&http.Request{Header: http.Header{"Cookie": []string{ck.String()}}},
"test\n",
},
6: {
- &VaryBy{Cookies: []string{"ssn"}, RemoteAddr: true, Custom: func(r *http.Request) string {
+ &throttled.VaryBy{Cookies: []string{"ssn"}, RemoteAddr: true, Custom: func(r *http.Request) string {
return "blah"
}},
&http.Request{Header: http.Header{"Cookie": []string{ck.String()}}},
diff --git a/vendor/gopkg.in/yaml.v2/LICENSE b/vendor/gopkg.in/yaml.v2/LICENSE
index a68e67f01..866d74a7a 100644
--- a/vendor/gopkg.in/yaml.v2/LICENSE
+++ b/vendor/gopkg.in/yaml.v2/LICENSE
@@ -1,188 +1,13 @@
+Copyright 2011-2016 Canonical Ltd.
-Copyright (c) 2011-2014 - Canonical 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
-This software is licensed under the LGPLv3, included below.
+ http://www.apache.org/licenses/LICENSE-2.0
-As a special exception to the GNU Lesser General Public License version 3
-("LGPL3"), the copyright holders of this Library give you permission to
-convey to a third party a Combined Work that links statically or dynamically
-to this Library without providing any Minimal Corresponding Source or
-Minimal Application Code as set out in 4d or providing the installation
-information set out in section 4e, provided that you comply with the other
-provisions of LGPL3 and provided that you meet, for the Application the
-terms and conditions of the license(s) which apply to the Application.
-
-Except as stated in this special exception, the provisions of LGPL3 will
-continue to comply in full to this Library. If you modify this Library, you
-may apply this exception to your version of this Library, but you are not
-obliged to do so. If you do not wish to do so, delete this exception
-statement from your version. This exception does not (and cannot) modify any
-license terms which apply to the Application, with which you must still
-comply.
-
-
- GNU LESSER GENERAL PUBLIC LICENSE
- Version 3, 29 June 2007
-
- Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-
- This version of the GNU Lesser General Public License incorporates
-the terms and conditions of version 3 of the GNU General Public
-License, supplemented by the additional permissions listed below.
-
- 0. Additional Definitions.
-
- As used herein, "this License" refers to version 3 of the GNU Lesser
-General Public License, and the "GNU GPL" refers to version 3 of the GNU
-General Public License.
-
- "The Library" refers to a covered work governed by this License,
-other than an Application or a Combined Work as defined below.
-
- An "Application" is any work that makes use of an interface provided
-by the Library, but which is not otherwise based on the Library.
-Defining a subclass of a class defined by the Library is deemed a mode
-of using an interface provided by the Library.
-
- A "Combined Work" is a work produced by combining or linking an
-Application with the Library. The particular version of the Library
-with which the Combined Work was made is also called the "Linked
-Version".
-
- The "Minimal Corresponding Source" for a Combined Work means the
-Corresponding Source for the Combined Work, excluding any source code
-for portions of the Combined Work that, considered in isolation, are
-based on the Application, and not on the Linked Version.
-
- The "Corresponding Application Code" for a Combined Work means the
-object code and/or source code for the Application, including any data
-and utility programs needed for reproducing the Combined Work from the
-Application, but excluding the System Libraries of the Combined Work.
-
- 1. Exception to Section 3 of the GNU GPL.
-
- You may convey a covered work under sections 3 and 4 of this License
-without being bound by section 3 of the GNU GPL.
-
- 2. Conveying Modified Versions.
-
- If you modify a copy of the Library, and, in your modifications, a
-facility refers to a function or data to be supplied by an Application
-that uses the facility (other than as an argument passed when the
-facility is invoked), then you may convey a copy of the modified
-version:
-
- a) under this License, provided that you make a good faith effort to
- ensure that, in the event an Application does not supply the
- function or data, the facility still operates, and performs
- whatever part of its purpose remains meaningful, or
-
- b) under the GNU GPL, with none of the additional permissions of
- this License applicable to that copy.
-
- 3. Object Code Incorporating Material from Library Header Files.
-
- The object code form of an Application may incorporate material from
-a header file that is part of the Library. You may convey such object
-code under terms of your choice, provided that, if the incorporated
-material is not limited to numerical parameters, data structure
-layouts and accessors, or small macros, inline functions and templates
-(ten or fewer lines in length), you do both of the following:
-
- a) Give prominent notice with each copy of the object code that the
- Library is used in it and that the Library and its use are
- covered by this License.
-
- b) Accompany the object code with a copy of the GNU GPL and this license
- document.
-
- 4. Combined Works.
-
- You may convey a Combined Work under terms of your choice that,
-taken together, effectively do not restrict modification of the
-portions of the Library contained in the Combined Work and reverse
-engineering for debugging such modifications, if you also do each of
-the following:
-
- a) Give prominent notice with each copy of the Combined Work that
- the Library is used in it and that the Library and its use are
- covered by this License.
-
- b) Accompany the Combined Work with a copy of the GNU GPL and this license
- document.
-
- c) For a Combined Work that displays copyright notices during
- execution, include the copyright notice for the Library among
- these notices, as well as a reference directing the user to the
- copies of the GNU GPL and this license document.
-
- d) Do one of the following:
-
- 0) Convey the Minimal Corresponding Source under the terms of this
- License, and the Corresponding Application Code in a form
- suitable for, and under terms that permit, the user to
- recombine or relink the Application with a modified version of
- the Linked Version to produce a modified Combined Work, in the
- manner specified by section 6 of the GNU GPL for conveying
- Corresponding Source.
-
- 1) Use a suitable shared library mechanism for linking with the
- Library. A suitable mechanism is one that (a) uses at run time
- a copy of the Library already present on the user's computer
- system, and (b) will operate properly with a modified version
- of the Library that is interface-compatible with the Linked
- Version.
-
- e) Provide Installation Information, but only if you would otherwise
- be required to provide such information under section 6 of the
- GNU GPL, and only to the extent that such information is
- necessary to install and execute a modified version of the
- Combined Work produced by recombining or relinking the
- Application with a modified version of the Linked Version. (If
- you use option 4d0, the Installation Information must accompany
- the Minimal Corresponding Source and Corresponding Application
- Code. If you use option 4d1, you must provide the Installation
- Information in the manner specified by section 6 of the GNU GPL
- for conveying Corresponding Source.)
-
- 5. Combined Libraries.
-
- You may place library facilities that are a work based on the
-Library side by side in a single library together with other library
-facilities that are not Applications and are not covered by this
-License, and convey such a combined library under terms of your
-choice, if you do both of the following:
-
- a) Accompany the combined library with a copy of the same work based
- on the Library, uncombined with any other library facilities,
- conveyed under the terms of this License.
-
- b) Give prominent notice with the combined library that part of it
- is a work based on the Library, and explaining where to find the
- accompanying uncombined form of the same work.
-
- 6. Revised Versions of the GNU Lesser General Public License.
-
- The Free Software Foundation may publish revised and/or new versions
-of the GNU Lesser General Public License from time to time. Such new
-versions will be similar in spirit to the present version, but may
-differ in detail to address new problems or concerns.
-
- Each version is given a distinguishing version number. If the
-Library as you received it specifies that a certain numbered version
-of the GNU Lesser General Public License "or any later version"
-applies to it, you have the option of following the terms and
-conditions either of that published version or of any later version
-published by the Free Software Foundation. If the Library as you
-received it does not specify a version number of the GNU Lesser
-General Public License, you may choose any version of the GNU Lesser
-General Public License ever published by the Free Software Foundation.
-
- If the Library as you received it specifies that a proxy can decide
-whether future versions of the GNU Lesser General Public License shall
-apply, that proxy's public statement of acceptance of any version is
-permanent authorization for you to choose that version for the
-Library.
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT 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/gopkg.in/yaml.v2/README.md b/vendor/gopkg.in/yaml.v2/README.md
index 7b8bd8670..1884de6a7 100644
--- a/vendor/gopkg.in/yaml.v2/README.md
+++ b/vendor/gopkg.in/yaml.v2/README.md
@@ -42,7 +42,7 @@ The package API for yaml v2 will remain stable as described in [gopkg.in](https:
License
-------
-The yaml package is licensed under the LGPL with an exception that allows it to be linked statically. Please see the LICENSE file for details.
+The yaml package is licensed under the Apache License 2.0. Please see the LICENSE file for details.
Example