diff --git a/Godeps/Godeps.json b/Godeps/Godeps.json index e83dc1b..28d0104 100644 --- a/Godeps/Godeps.json +++ b/Godeps/Godeps.json @@ -1,14 +1,14 @@ { "ImportPath": "github.com/TheNewNormal/corectl", - "GoVersion": "go1.6.2", + "GoVersion": "go1.6.3", "Packages": [ "./..." ], "Deps": [ { "ImportPath": "github.com/BurntSushi/toml", - "Comment": "v0.2.0-19-gbec2dac", - "Rev": "bec2dacf4b590d26237cfebff4471e21ce543494" + "Comment": "v0.2.0-21-g9906417", + "Rev": "99064174e013895bbd9b025c31100bd1d9b590ca" }, { "ImportPath": "github.com/alecthomas/units", @@ -25,8 +25,8 @@ }, { "ImportPath": "github.com/boltdb/bolt", - "Comment": "v1.2.1-11-gacc803f", - "Rev": "acc803f0ced151102ed51bf824f8709ebd6602bc" + "Comment": "v1.2.1-13-g5cc10bb", + "Rev": "5cc10bbbc5c141029940133bb33c9e969512a698" }, { "ImportPath": "github.com/braintree/manners", @@ -39,163 +39,163 @@ }, { "ImportPath": "github.com/coreos/etcd/alarm", - "Comment": "v3.0.0-beta.0-884-g331ec82", - "Rev": "331ec82400fe46df670615f94c78b4ca3a50d4d1" + "Comment": "v3.0.0-beta.0-950-ge001848", + "Rev": "e00184827096b1cc999142e2085bdeadaf0c98db" }, { "ImportPath": "github.com/coreos/etcd/auth", - "Comment": "v3.0.0-beta.0-884-g331ec82", - "Rev": "331ec82400fe46df670615f94c78b4ca3a50d4d1" + "Comment": "v3.0.0-beta.0-950-ge001848", + "Rev": "e00184827096b1cc999142e2085bdeadaf0c98db" }, { "ImportPath": "github.com/coreos/etcd/client", - "Comment": "v3.0.0-beta.0-884-g331ec82", - "Rev": "331ec82400fe46df670615f94c78b4ca3a50d4d1" + "Comment": "v3.0.0-beta.0-950-ge001848", + "Rev": "e00184827096b1cc999142e2085bdeadaf0c98db" }, { "ImportPath": "github.com/coreos/etcd/compactor", - "Comment": "v3.0.0-beta.0-884-g331ec82", - "Rev": "331ec82400fe46df670615f94c78b4ca3a50d4d1" + "Comment": "v3.0.0-beta.0-950-ge001848", + "Rev": "e00184827096b1cc999142e2085bdeadaf0c98db" }, { "ImportPath": "github.com/coreos/etcd/discovery", - "Comment": "v3.0.0-beta.0-884-g331ec82", - "Rev": "331ec82400fe46df670615f94c78b4ca3a50d4d1" + "Comment": "v3.0.0-beta.0-950-ge001848", + "Rev": "e00184827096b1cc999142e2085bdeadaf0c98db" }, { "ImportPath": "github.com/coreos/etcd/error", - "Comment": "v3.0.0-beta.0-884-g331ec82", - "Rev": "331ec82400fe46df670615f94c78b4ca3a50d4d1" + "Comment": "v3.0.0-beta.0-950-ge001848", + "Rev": "e00184827096b1cc999142e2085bdeadaf0c98db" }, { "ImportPath": "github.com/coreos/etcd/etcdserver", - "Comment": "v3.0.0-beta.0-884-g331ec82", - "Rev": "331ec82400fe46df670615f94c78b4ca3a50d4d1" + "Comment": "v3.0.0-beta.0-950-ge001848", + "Rev": "e00184827096b1cc999142e2085bdeadaf0c98db" }, { "ImportPath": "github.com/coreos/etcd/lease", - "Comment": "v3.0.0-beta.0-884-g331ec82", - "Rev": "331ec82400fe46df670615f94c78b4ca3a50d4d1" + "Comment": "v3.0.0-beta.0-950-ge001848", + "Rev": "e00184827096b1cc999142e2085bdeadaf0c98db" }, { "ImportPath": "github.com/coreos/etcd/mvcc", - "Comment": "v3.0.0-beta.0-884-g331ec82", - "Rev": "331ec82400fe46df670615f94c78b4ca3a50d4d1" + "Comment": "v3.0.0-beta.0-950-ge001848", + "Rev": "e00184827096b1cc999142e2085bdeadaf0c98db" }, { "ImportPath": "github.com/coreos/etcd/pkg/adt", - "Comment": "v3.0.0-beta.0-884-g331ec82", - "Rev": "331ec82400fe46df670615f94c78b4ca3a50d4d1" + "Comment": "v3.0.0-beta.0-950-ge001848", + "Rev": "e00184827096b1cc999142e2085bdeadaf0c98db" }, { "ImportPath": "github.com/coreos/etcd/pkg/contention", - "Comment": "v3.0.0-beta.0-884-g331ec82", - "Rev": "331ec82400fe46df670615f94c78b4ca3a50d4d1" + "Comment": "v3.0.0-beta.0-950-ge001848", + "Rev": "e00184827096b1cc999142e2085bdeadaf0c98db" }, { "ImportPath": "github.com/coreos/etcd/pkg/crc", - "Comment": "v3.0.0-beta.0-884-g331ec82", - "Rev": "331ec82400fe46df670615f94c78b4ca3a50d4d1" + "Comment": "v3.0.0-beta.0-950-ge001848", + "Rev": "e00184827096b1cc999142e2085bdeadaf0c98db" }, { "ImportPath": "github.com/coreos/etcd/pkg/fileutil", - "Comment": "v3.0.0-beta.0-884-g331ec82", - "Rev": "331ec82400fe46df670615f94c78b4ca3a50d4d1" + "Comment": "v3.0.0-beta.0-950-ge001848", + "Rev": "e00184827096b1cc999142e2085bdeadaf0c98db" }, { "ImportPath": "github.com/coreos/etcd/pkg/httputil", - "Comment": "v3.0.0-beta.0-884-g331ec82", - "Rev": "331ec82400fe46df670615f94c78b4ca3a50d4d1" + "Comment": "v3.0.0-beta.0-950-ge001848", + "Rev": "e00184827096b1cc999142e2085bdeadaf0c98db" }, { "ImportPath": "github.com/coreos/etcd/pkg/idutil", - "Comment": "v3.0.0-beta.0-884-g331ec82", - "Rev": "331ec82400fe46df670615f94c78b4ca3a50d4d1" + "Comment": "v3.0.0-beta.0-950-ge001848", + "Rev": "e00184827096b1cc999142e2085bdeadaf0c98db" }, { "ImportPath": "github.com/coreos/etcd/pkg/ioutil", - "Comment": "v3.0.0-beta.0-884-g331ec82", - "Rev": "331ec82400fe46df670615f94c78b4ca3a50d4d1" + "Comment": "v3.0.0-beta.0-950-ge001848", + "Rev": "e00184827096b1cc999142e2085bdeadaf0c98db" }, { "ImportPath": "github.com/coreos/etcd/pkg/logutil", - "Comment": "v3.0.0-beta.0-884-g331ec82", - "Rev": "331ec82400fe46df670615f94c78b4ca3a50d4d1" + "Comment": "v3.0.0-beta.0-950-ge001848", + "Rev": "e00184827096b1cc999142e2085bdeadaf0c98db" }, { "ImportPath": "github.com/coreos/etcd/pkg/netutil", - "Comment": "v3.0.0-beta.0-884-g331ec82", - "Rev": "331ec82400fe46df670615f94c78b4ca3a50d4d1" + "Comment": "v3.0.0-beta.0-950-ge001848", + "Rev": "e00184827096b1cc999142e2085bdeadaf0c98db" }, { "ImportPath": "github.com/coreos/etcd/pkg/pathutil", - "Comment": "v3.0.0-beta.0-884-g331ec82", - "Rev": "331ec82400fe46df670615f94c78b4ca3a50d4d1" + "Comment": "v3.0.0-beta.0-950-ge001848", + "Rev": "e00184827096b1cc999142e2085bdeadaf0c98db" }, { "ImportPath": "github.com/coreos/etcd/pkg/pbutil", - "Comment": "v3.0.0-beta.0-884-g331ec82", - "Rev": "331ec82400fe46df670615f94c78b4ca3a50d4d1" + "Comment": "v3.0.0-beta.0-950-ge001848", + "Rev": "e00184827096b1cc999142e2085bdeadaf0c98db" }, { "ImportPath": "github.com/coreos/etcd/pkg/runtime", - "Comment": "v3.0.0-beta.0-884-g331ec82", - "Rev": "331ec82400fe46df670615f94c78b4ca3a50d4d1" + "Comment": "v3.0.0-beta.0-950-ge001848", + "Rev": "e00184827096b1cc999142e2085bdeadaf0c98db" }, { "ImportPath": "github.com/coreos/etcd/pkg/schedule", - "Comment": "v3.0.0-beta.0-884-g331ec82", - "Rev": "331ec82400fe46df670615f94c78b4ca3a50d4d1" + "Comment": "v3.0.0-beta.0-950-ge001848", + "Rev": "e00184827096b1cc999142e2085bdeadaf0c98db" }, { "ImportPath": "github.com/coreos/etcd/pkg/tlsutil", - "Comment": "v3.0.0-beta.0-884-g331ec82", - "Rev": "331ec82400fe46df670615f94c78b4ca3a50d4d1" + "Comment": "v3.0.0-beta.0-950-ge001848", + "Rev": "e00184827096b1cc999142e2085bdeadaf0c98db" }, { "ImportPath": "github.com/coreos/etcd/pkg/transport", - "Comment": "v3.0.0-beta.0-884-g331ec82", - "Rev": "331ec82400fe46df670615f94c78b4ca3a50d4d1" + "Comment": "v3.0.0-beta.0-950-ge001848", + "Rev": "e00184827096b1cc999142e2085bdeadaf0c98db" }, { "ImportPath": "github.com/coreos/etcd/pkg/types", - "Comment": "v3.0.0-beta.0-884-g331ec82", - "Rev": "331ec82400fe46df670615f94c78b4ca3a50d4d1" + "Comment": "v3.0.0-beta.0-950-ge001848", + "Rev": "e00184827096b1cc999142e2085bdeadaf0c98db" }, { "ImportPath": "github.com/coreos/etcd/pkg/wait", - "Comment": "v3.0.0-beta.0-884-g331ec82", - "Rev": "331ec82400fe46df670615f94c78b4ca3a50d4d1" + "Comment": "v3.0.0-beta.0-950-ge001848", + "Rev": "e00184827096b1cc999142e2085bdeadaf0c98db" }, { "ImportPath": "github.com/coreos/etcd/raft", - "Comment": "v3.0.0-beta.0-884-g331ec82", - "Rev": "331ec82400fe46df670615f94c78b4ca3a50d4d1" + "Comment": "v3.0.0-beta.0-950-ge001848", + "Rev": "e00184827096b1cc999142e2085bdeadaf0c98db" }, { "ImportPath": "github.com/coreos/etcd/rafthttp", - "Comment": "v3.0.0-beta.0-884-g331ec82", - "Rev": "331ec82400fe46df670615f94c78b4ca3a50d4d1" + "Comment": "v3.0.0-beta.0-950-ge001848", + "Rev": "e00184827096b1cc999142e2085bdeadaf0c98db" }, { "ImportPath": "github.com/coreos/etcd/snap", - "Comment": "v3.0.0-beta.0-884-g331ec82", - "Rev": "331ec82400fe46df670615f94c78b4ca3a50d4d1" + "Comment": "v3.0.0-beta.0-950-ge001848", + "Rev": "e00184827096b1cc999142e2085bdeadaf0c98db" }, { "ImportPath": "github.com/coreos/etcd/store", - "Comment": "v3.0.0-beta.0-884-g331ec82", - "Rev": "331ec82400fe46df670615f94c78b4ca3a50d4d1" + "Comment": "v3.0.0-beta.0-950-ge001848", + "Rev": "e00184827096b1cc999142e2085bdeadaf0c98db" }, { "ImportPath": "github.com/coreos/etcd/version", - "Comment": "v3.0.0-beta.0-884-g331ec82", - "Rev": "331ec82400fe46df670615f94c78b4ca3a50d4d1" + "Comment": "v3.0.0-beta.0-950-ge001848", + "Rev": "e00184827096b1cc999142e2085bdeadaf0c98db" }, { "ImportPath": "github.com/coreos/etcd/wal", - "Comment": "v3.0.0-beta.0-884-g331ec82", - "Rev": "331ec82400fe46df670615f94c78b4ca3a50d4d1" + "Comment": "v3.0.0-beta.0-950-ge001848", + "Rev": "e00184827096b1cc999142e2085bdeadaf0c98db" }, { "ImportPath": "github.com/coreos/fuze/config", @@ -208,18 +208,18 @@ }, { "ImportPath": "github.com/coreos/go-systemd/activation", - "Comment": "v10-11-gd403902", - "Rev": "d4039021cfc2d0ea21d34afda21631314e83f75a" + "Comment": "v10-13-gd6c05a1", + "Rev": "d6c05a1dcbb5ac02b7653da4d99e5db340c20778" }, { "ImportPath": "github.com/coreos/go-systemd/journal", - "Comment": "v10-11-gd403902", - "Rev": "d4039021cfc2d0ea21d34afda21631314e83f75a" + "Comment": "v10-13-gd6c05a1", + "Rev": "d6c05a1dcbb5ac02b7653da4d99e5db340c20778" }, { "ImportPath": "github.com/coreos/go-systemd/unit", - "Comment": "v10-11-gd403902", - "Rev": "d4039021cfc2d0ea21d34afda21631314e83f75a" + "Comment": "v10-13-gd6c05a1", + "Rev": "d6c05a1dcbb5ac02b7653da4d99e5db340c20778" }, { "ImportPath": "github.com/coreos/ignition/config/types", @@ -248,7 +248,7 @@ }, { "ImportPath": "github.com/dustin/go-humanize", - "Rev": "fef948f2d241bd1fd0631108ecc2c9553bae60bf" + "Rev": "2fcb5204cdc65b4bec9fd0a87606bb0d0e3c54e8" }, { "ImportPath": "github.com/everdev/mack", @@ -265,8 +265,8 @@ }, { "ImportPath": "github.com/gogo/protobuf/proto", - "Comment": "v0.2-22-g2752d97", - "Rev": "2752d97bbd91927dd1c43296dbf8700e50e2708c" + "Comment": "v0.2-47-ge57a569", + "Rev": "e57a569e1882958f6b188cb42231d6db87701f2a" }, { "ImportPath": "github.com/golang/protobuf/jsonpb", @@ -282,7 +282,7 @@ }, { "ImportPath": "github.com/google/go-github/github", - "Rev": "dc287189c098690cab775b75e22cf0482d47f9ac" + "Rev": "b5e5babef39c18002f177a134fc49dc5013374ba" }, { "ImportPath": "github.com/google/go-querystring/query", @@ -295,8 +295,8 @@ }, { "ImportPath": "github.com/gorilla/mux", - "Comment": "v1.1-13-g9fa818a", - "Rev": "9fa818a44c2bf1396a17f9d5a3c0f6dd39d2ff8e" + "Comment": "v1.1-15-gd391bea", + "Rev": "d391bea3118c9fc17a88d62c9189bb791255e0ef" }, { "ImportPath": "github.com/gorilla/rpc", @@ -354,8 +354,8 @@ }, { "ImportPath": "github.com/pkg/errors", - "Comment": "v0.7.0-5-ga2d6902", - "Rev": "a2d6902c6d2a2f194eb3fb474981ab7867c81505" + "Comment": "v0.7.0-6-gcc5fbb7", + "Rev": "cc5fbb72d9b1b5f664ff3c11ed7896ee23ad9276" }, { "ImportPath": "github.com/pkg/sftp", @@ -373,15 +373,15 @@ }, { "ImportPath": "github.com/prometheus/common/expfmt", - "Rev": "4402f4e5ea79ec15f3c574773b6a5198fbea215f" + "Rev": "610701b0cb96fe82d0166b8e07979b174b6f06ae" }, { "ImportPath": "github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg", - "Rev": "4402f4e5ea79ec15f3c574773b6a5198fbea215f" + "Rev": "610701b0cb96fe82d0166b8e07979b174b6f06ae" }, { "ImportPath": "github.com/prometheus/common/model", - "Rev": "4402f4e5ea79ec15f3c574773b6a5198fbea215f" + "Rev": "610701b0cb96fe82d0166b8e07979b174b6f06ae" }, { "ImportPath": "github.com/prometheus/procfs", @@ -403,7 +403,7 @@ }, { "ImportPath": "github.com/shurcooL/httpfs/vfsutil", - "Rev": "f4a60bdbdd5a8f203c1ad5b6c95232f346eae1f5" + "Rev": "be05fd7ae2c9f6b39b5e0ba52ca3b60366278b66" }, { "ImportPath": "github.com/shurcooL/sanitized_anchor_name", @@ -449,7 +449,7 @@ }, { "ImportPath": "github.com/spf13/cobra", - "Rev": "b24564e919247d7c870fe0ed3738c98d8741aca4" + "Rev": "dbb7c2d02e284aa24423e3e6e105969dffe6e4d6" }, { "ImportPath": "github.com/spf13/jwalterweatherman", @@ -457,11 +457,11 @@ }, { "ImportPath": "github.com/spf13/pflag", - "Rev": "367864438f1b1a3c7db4da06a2f55b144e6784e0" + "Rev": "1560c1005499d61b80f865c04d39ca7505bf7f0b" }, { "ImportPath": "github.com/spf13/viper", - "Rev": "c1ccc378a054ea8d4e38d8c67f6938d4760b53dd" + "Rev": "b53595fb56a492ecef90ee0457595a999eb6ec15" }, { "ImportPath": "github.com/ugorji/go/codec", @@ -481,64 +481,64 @@ }, { "ImportPath": "golang.org/x/crypto/bcrypt", - "Rev": "10c26747e67d76ad4fafe6087c6f4073c3b22942" + "Rev": "911fafb28f4ee7c7bd483539a6c96190bbbccc3f" }, { "ImportPath": "golang.org/x/crypto/blowfish", - "Rev": "10c26747e67d76ad4fafe6087c6f4073c3b22942" + "Rev": "911fafb28f4ee7c7bd483539a6c96190bbbccc3f" }, { "ImportPath": "golang.org/x/crypto/cast5", - "Rev": "10c26747e67d76ad4fafe6087c6f4073c3b22942" + "Rev": "911fafb28f4ee7c7bd483539a6c96190bbbccc3f" }, { "ImportPath": "golang.org/x/crypto/curve25519", - "Rev": "10c26747e67d76ad4fafe6087c6f4073c3b22942" + "Rev": "911fafb28f4ee7c7bd483539a6c96190bbbccc3f" }, { "ImportPath": "golang.org/x/crypto/ed25519", - "Rev": "10c26747e67d76ad4fafe6087c6f4073c3b22942" + "Rev": "911fafb28f4ee7c7bd483539a6c96190bbbccc3f" }, { "ImportPath": "golang.org/x/crypto/openpgp", - "Rev": "10c26747e67d76ad4fafe6087c6f4073c3b22942" + "Rev": "911fafb28f4ee7c7bd483539a6c96190bbbccc3f" }, { "ImportPath": "golang.org/x/crypto/ssh", - "Rev": "10c26747e67d76ad4fafe6087c6f4073c3b22942" + "Rev": "911fafb28f4ee7c7bd483539a6c96190bbbccc3f" }, { "ImportPath": "golang.org/x/net/context", - "Rev": "45b61eaf18dd5c1b942e7666ff170b77dbbaf87b" + "Rev": "4d38db76854b199960801a1734443fd02870d7e1" }, { "ImportPath": "golang.org/x/net/http2", - "Rev": "45b61eaf18dd5c1b942e7666ff170b77dbbaf87b" + "Rev": "4d38db76854b199960801a1734443fd02870d7e1" }, { "ImportPath": "golang.org/x/net/internal/timeseries", - "Rev": "45b61eaf18dd5c1b942e7666ff170b77dbbaf87b" + "Rev": "4d38db76854b199960801a1734443fd02870d7e1" }, { "ImportPath": "golang.org/x/net/lex/httplex", - "Rev": "45b61eaf18dd5c1b942e7666ff170b77dbbaf87b" + "Rev": "4d38db76854b199960801a1734443fd02870d7e1" }, { "ImportPath": "golang.org/x/net/trace", - "Rev": "45b61eaf18dd5c1b942e7666ff170b77dbbaf87b" + "Rev": "4d38db76854b199960801a1734443fd02870d7e1" }, { "ImportPath": "golang.org/x/sys/unix", - "Rev": "b518c298ac9dc94b6ac0757394f50d10c5dfa25a" + "Rev": "a646d33e2ee3172a661fc09bca23bb4889a41bc8" }, { "ImportPath": "golang.org/x/tools/godoc/vfs", - "Rev": "c550f66b0b48fb80f7076e0a5f8a0d736e3bb7bd" + "Rev": "55296b3bebf97ef1b14b5b86a4ecd6337ef99bb2" }, { "ImportPath": "google.golang.org/grpc", - "Comment": "v1.0.0-6-g02fca89", - "Rev": "02fca896ff5f50c6bbbee0860345a49344b37a03" + "Comment": "v1.0.0-34-gd017580", + "Rev": "d017580d29c7407650a21d78959701936645a3af" }, { "ImportPath": "gopkg.in/yaml.v2", @@ -546,8 +546,8 @@ }, { "ImportPath": "k8s.io/minikube/pkg/util", - "Comment": "v0.5.0-70-gc948edf", - "Rev": "c948edf63a7047f8eb1c1b108863d78c0d21d058" + "Comment": "v0.5.0-80-gd28e007", + "Rev": "d28e007db8d097710769a51d086d22d11429c997" } ] } diff --git a/vendor/github.com/BurntSushi/toml/.travis.yml b/vendor/github.com/BurntSushi/toml/.travis.yml index 43caf6d..8b8afc4 100644 --- a/vendor/github.com/BurntSushi/toml/.travis.yml +++ b/vendor/github.com/BurntSushi/toml/.travis.yml @@ -2,6 +2,10 @@ language: go go: - 1.1 - 1.2 + - 1.3 + - 1.4 + - 1.5 + - 1.6 - tip install: - go install ./... @@ -9,4 +13,3 @@ install: script: - export PATH="$PATH:$HOME/gopath/bin" - make test - diff --git a/vendor/github.com/boltdb/bolt/README.md b/vendor/github.com/boltdb/bolt/README.md index 1c3039e..e8a64f5 100644 --- a/vendor/github.com/boltdb/bolt/README.md +++ b/vendor/github.com/boltdb/bolt/README.md @@ -807,6 +807,7 @@ them via pull request. Below is a list of public, open source projects that use Bolt: +* [BoltDbWeb](https://github.com/evnix/boltdbweb) - A web based GUI for BoltDB files. * [Operation Go: A Routine Mission](http://gocode.io) - An online programming game for Golang using Bolt for user accounts and a leaderboard. * [Bazil](https://bazil.org/) - A file system that lets your data reside where it is most convenient for it to reside. * [DVID](https://github.com/janelia-flyem/dvid) - Added Bolt as optional storage engine and testing it against Basho-tuned leveldb. diff --git a/vendor/github.com/coreos/etcd/auth/authpb/auth.pb.go b/vendor/github.com/coreos/etcd/auth/authpb/auth.pb.go index 9f84308..448e1ea 100644 --- a/vendor/github.com/coreos/etcd/auth/authpb/auth.pb.go +++ b/vendor/github.com/coreos/etcd/auth/authpb/auth.pb.go @@ -18,7 +18,7 @@ package authpb import ( "fmt" - proto "github.com/gogo/protobuf/proto" + proto "github.com/golang/protobuf/proto" math "math" ) @@ -32,7 +32,7 @@ var _ = math.Inf // This is a compile-time assertion to ensure that this generated file // is compatible with the proto package it is being compiled against. -const _ = proto.GoGoProtoPackageIsVersion1 +const _ = proto.ProtoPackageIsVersion1 type Permission_Type int32 @@ -798,23 +798,23 @@ var ( ) var fileDescriptorAuth = []byte{ - // 276 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xe2, 0xe2, 0x4a, 0x2c, 0x2d, 0xc9, - 0xd0, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x62, 0x03, 0xb1, 0x0b, 0x92, 0xa4, 0x44, 0xd2, 0xf3, - 0xd3, 0xf3, 0xc1, 0x42, 0xfa, 0x20, 0x16, 0x44, 0x56, 0xc9, 0x87, 0x8b, 0x25, 0xb4, 0x38, 0xb5, - 0x48, 0x48, 0x88, 0x8b, 0x25, 0x2f, 0x31, 0x37, 0x55, 0x82, 0x51, 0x81, 0x51, 0x83, 0x27, 0x08, - 0xcc, 0x16, 0x92, 0xe2, 0xe2, 0x28, 0x48, 0x2c, 0x2e, 0x2e, 0xcf, 0x2f, 0x4a, 0x91, 0x60, 0x02, - 0x8b, 0xc3, 0xf9, 0x42, 0x22, 0x5c, 0xac, 0x45, 0xf9, 0x39, 0xa9, 0xc5, 0x12, 0xcc, 0x0a, 0xcc, - 0x1a, 0x9c, 0x41, 0x10, 0x8e, 0xd2, 0x1c, 0x46, 0x2e, 0xae, 0x80, 0xd4, 0xa2, 0xdc, 0xcc, 0xe2, - 0xe2, 0xcc, 0xfc, 0x3c, 0x21, 0x63, 0xa0, 0x01, 0x40, 0x5e, 0x48, 0x65, 0x01, 0xc4, 0x60, 0x3e, - 0x23, 0x71, 0x3d, 0x88, 0x6b, 0xf4, 0x10, 0xaa, 0xf4, 0x40, 0xd2, 0x41, 0x70, 0x85, 0x42, 0x02, - 0x5c, 0xcc, 0xd9, 0xa9, 0x95, 0x50, 0x0b, 0x41, 0x4c, 0x21, 0x69, 0x2e, 0xce, 0xa2, 0xc4, 0xbc, - 0xf4, 0xd4, 0xf8, 0xd4, 0xbc, 0x14, 0xa0, 0x7d, 0x60, 0x87, 0x80, 0x05, 0x5c, 0xf3, 0x52, 0x94, - 0xb4, 0xb8, 0x58, 0xc0, 0xda, 0x38, 0xb8, 0x58, 0x82, 0x5c, 0x1d, 0x5d, 0x04, 0x18, 0x84, 0x38, - 0xb9, 0x58, 0xc3, 0x83, 0x3c, 0x43, 0x5c, 0x05, 0x18, 0x85, 0x78, 0xb9, 0x38, 0x41, 0x82, 0x10, - 0x2e, 0x93, 0x52, 0x08, 0x50, 0x0d, 0xd0, 0x9d, 0x58, 0x3d, 0x6b, 0xc1, 0xc5, 0x0b, 0xb4, 0x0b, - 0xe1, 0x2c, 0xa0, 0x03, 0x98, 0x35, 0xb8, 0x8d, 0x84, 0x30, 0x1d, 0x1c, 0x84, 0xaa, 0xd0, 0x49, - 0xe4, 0xc4, 0x43, 0x39, 0x86, 0x0b, 0x40, 0x7c, 0xe2, 0x91, 0x1c, 0xe3, 0x05, 0x20, 0x7e, 0x00, - 0xc4, 0x49, 0x6c, 0xe0, 0xf0, 0x35, 0x06, 0x04, 0x00, 0x00, 0xff, 0xff, 0x9e, 0x31, 0x53, 0xfd, - 0x8b, 0x01, 0x00, 0x00, + // 288 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x6c, 0x90, 0xc1, 0x4a, 0xc3, 0x30, + 0x1c, 0xc6, 0x9b, 0xb6, 0x1b, 0xed, 0x5f, 0x27, 0x25, 0x0c, 0x0c, 0x13, 0x42, 0xe9, 0xa9, 0x78, + 0xa8, 0xb0, 0x5d, 0xbc, 0x2a, 0xf6, 0x20, 0x78, 0x90, 0x50, 0xf1, 0x28, 0x1d, 0x0d, 0x75, 0x6c, + 0x6d, 0x4a, 0x32, 0x91, 0xbe, 0x89, 0x07, 0x1f, 0x68, 0xc7, 0x3d, 0x82, 0xab, 0x2f, 0x22, 0x4d, + 0x64, 0x43, 0xdc, 0xed, 0xfb, 0xbe, 0xff, 0x97, 0xe4, 0x97, 0x3f, 0x40, 0xfe, 0xb6, 0x7e, 0x4d, + 0x1a, 0x29, 0xd6, 0x02, 0x0f, 0x7b, 0xdd, 0xcc, 0x27, 0xe3, 0x52, 0x94, 0x42, 0x47, 0x57, 0xbd, + 0x32, 0xd3, 0xe8, 0x01, 0xdc, 0x27, 0xc5, 0x25, 0xc6, 0xe0, 0xd6, 0x79, 0xc5, 0x09, 0x0a, 0x51, + 0x7c, 0xca, 0xb4, 0xc6, 0x13, 0xf0, 0x9a, 0x5c, 0xa9, 0x77, 0x21, 0x0b, 0x62, 0xeb, 0x7c, 0xef, + 0xf1, 0x18, 0x06, 0x52, 0xac, 0xb8, 0x22, 0x4e, 0xe8, 0xc4, 0x3e, 0x33, 0x26, 0xfa, 0x44, 0x00, + 0x8f, 0x5c, 0x56, 0x0b, 0xa5, 0x16, 0xa2, 0xc6, 0x33, 0xf0, 0x1a, 0x2e, 0xab, 0xac, 0x6d, 0xcc, + 0xc5, 0x67, 0xd3, 0xf3, 0xc4, 0xd0, 0x24, 0x87, 0x56, 0xd2, 0x8f, 0xd9, 0xbe, 0x88, 0x03, 0x70, + 0x96, 0xbc, 0xfd, 0x7d, 0xb0, 0x97, 0xf8, 0x02, 0x7c, 0x99, 0xd7, 0x25, 0x7f, 0xe1, 0x75, 0x41, + 0x1c, 0x03, 0xa2, 0x83, 0xb4, 0x2e, 0xa2, 0x4b, 0x70, 0xf5, 0x31, 0x0f, 0x5c, 0x96, 0xde, 0xdc, + 0x05, 0x16, 0xf6, 0x61, 0xf0, 0xcc, 0xee, 0xb3, 0x34, 0x40, 0x78, 0x04, 0x7e, 0x1f, 0x1a, 0x6b, + 0x47, 0x19, 0xb8, 0x4c, 0xac, 0xf8, 0xd1, 0xcf, 0x5e, 0xc3, 0x68, 0xc9, 0xdb, 0x03, 0x16, 0xb1, + 0x43, 0x27, 0x3e, 0x99, 0xe2, 0xff, 0xc0, 0xec, 0x6f, 0xf1, 0x96, 0x6c, 0x76, 0xd4, 0xda, 0xee, + 0xa8, 0xb5, 0xe9, 0x28, 0xda, 0x76, 0x14, 0x7d, 0x75, 0x14, 0x7d, 0x7c, 0x53, 0x6b, 0x3e, 0xd4, + 0x3b, 0x9e, 0xfd, 0x04, 0x00, 0x00, 0xff, 0xff, 0xcc, 0x76, 0x8d, 0x4f, 0x8f, 0x01, 0x00, 0x00, } diff --git a/vendor/github.com/coreos/etcd/auth/simple_token.go b/vendor/github.com/coreos/etcd/auth/simple_token.go index df2a78e..ddbe8c3 100644 --- a/vendor/github.com/coreos/etcd/auth/simple_token.go +++ b/vendor/github.com/coreos/etcd/auth/simple_token.go @@ -20,6 +20,7 @@ package auth import ( "crypto/rand" "math/big" + "strings" ) const ( @@ -53,3 +54,14 @@ func (as *authStore) assignSimpleTokenToUser(username, token string) { as.simpleTokens[token] = username as.simpleTokensMu.Unlock() } + +func (as *authStore) invalidateUser(username string) { + as.simpleTokensMu.Lock() + defer as.simpleTokensMu.Unlock() + + for token, name := range as.simpleTokens { + if strings.Compare(name, username) == 0 { + delete(as.simpleTokens, token) + } + } +} diff --git a/vendor/github.com/coreos/etcd/auth/store.go b/vendor/github.com/coreos/etcd/auth/store.go index 719a1ac..84c34af 100644 --- a/vendor/github.com/coreos/etcd/auth/store.go +++ b/vendor/github.com/coreos/etcd/auth/store.go @@ -16,6 +16,7 @@ package auth import ( "bytes" + "encoding/binary" "errors" "fmt" "sort" @@ -35,6 +36,8 @@ var ( authEnabled = []byte{1} authDisabled = []byte{0} + revisionKey = []byte("authRevision") + authBucketName = []byte("auth") authUsersBucketName = []byte("authUsers") authRolesBucketName = []byte("authRoles") @@ -52,6 +55,7 @@ var ( ErrRoleNotGranted = errors.New("auth: role is not granted to the user") ErrPermissionNotGranted = errors.New("auth: permission is not granted to the role") ErrAuthNotEnabled = errors.New("auth: authentication is not enabled") + ErrAuthOldRevision = errors.New("auth: revision in header is old") // BcryptCost is the algorithm cost / strength for hashing auth passwords BcryptCost = bcrypt.DefaultCost @@ -60,8 +64,15 @@ var ( const ( rootUser = "root" rootRole = "root" + + revBytesLen = 8 ) +type AuthInfo struct { + Username string + Revision uint64 +} + type AuthStore interface { // AuthEnable turns on the authentication feature AuthEnable() error @@ -114,23 +125,27 @@ type AuthStore interface { // RoleList gets a list of all roles RoleList(r *pb.AuthRoleListRequest) (*pb.AuthRoleListResponse, error) - // UsernameFromToken gets a username from the given Token - UsernameFromToken(token string) (string, bool) + // AuthInfoFromToken gets a username from the given Token and current revision number + // (The revision number is used for preventing the TOCTOU problem) + AuthInfoFromToken(token string) (*AuthInfo, bool) // IsPutPermitted checks put permission of the user - IsPutPermitted(username string, key []byte) bool + IsPutPermitted(authInfo *AuthInfo, key []byte) error // IsRangePermitted checks range permission of the user - IsRangePermitted(username string, key, rangeEnd []byte) bool + IsRangePermitted(authInfo *AuthInfo, key, rangeEnd []byte) error // IsDeleteRangePermitted checks delete-range permission of the user - IsDeleteRangePermitted(username string, key, rangeEnd []byte) bool + IsDeleteRangePermitted(authInfo *AuthInfo, key, rangeEnd []byte) error // IsAdminPermitted checks admin permission of the user - IsAdminPermitted(username string) bool + IsAdminPermitted(authInfo *AuthInfo) error // GenSimpleToken produces a simple random string GenSimpleToken() (string, error) + + // Revision gets current revision of authStore + Revision() uint64 } type authStore struct { @@ -142,6 +157,8 @@ type authStore struct { simpleTokensMu sync.RWMutex simpleTokens map[string]string // token -> username + + revision uint64 } func (as *authStore) AuthEnable() error { @@ -170,6 +187,8 @@ func (as *authStore) AuthEnable() error { as.rangePermCache = make(map[string]*unifiedRangePermissions) + as.revision = getRevision(tx) + plog.Noticef("Authentication enabled") return nil @@ -180,6 +199,7 @@ func (as *authStore) AuthDisable() { tx := b.BatchTx() tx.Lock() tx.UnsafePut(authBucketName, enableFlagKey, authDisabled) + as.commitRevision(tx) tx.Unlock() b.ForceCommit() @@ -235,6 +255,9 @@ func (as *authStore) Recover(be backend.Backend) { enabled = true } } + + as.revision = getRevision(tx) + tx.Unlock() as.enabledMu.Lock() @@ -265,6 +288,8 @@ func (as *authStore) UserAdd(r *pb.AuthUserAddRequest) (*pb.AuthUserAddResponse, putUser(tx, newUser) + as.commitRevision(tx) + plog.Noticef("added a new user: %s", r.Name) return &pb.AuthUserAddResponse{}, nil @@ -282,6 +307,11 @@ func (as *authStore) UserDelete(r *pb.AuthUserDeleteRequest) (*pb.AuthUserDelete delUser(tx, r.Name) + as.commitRevision(tx) + + as.invalidateCachedPerm(r.Name) + as.invalidateUser(r.Name) + plog.Noticef("deleted a user: %s", r.Name) return &pb.AuthUserDeleteResponse{}, nil @@ -313,6 +343,11 @@ func (as *authStore) UserChangePassword(r *pb.AuthUserChangePasswordRequest) (*p putUser(tx, updatedUser) + as.commitRevision(tx) + + as.invalidateCachedPerm(r.Name) + as.invalidateUser(r.Name) + plog.Noticef("changed a password of a user: %s", r.Name) return &pb.AuthUserChangePasswordResponse{}, nil @@ -348,6 +383,8 @@ func (as *authStore) UserGrantRole(r *pb.AuthUserGrantRoleRequest) (*pb.AuthUser as.invalidateCachedPerm(r.User) + as.commitRevision(tx) + plog.Noticef("granted role %s to user %s", r.Role, r.User) return &pb.AuthUserGrantRoleResponse{}, nil } @@ -416,6 +453,8 @@ func (as *authStore) UserRevokeRole(r *pb.AuthUserRevokeRoleRequest) (*pb.AuthUs as.invalidateCachedPerm(r.Name) + as.commitRevision(tx) + plog.Noticef("revoked role %s from user %s", r.Role, r.Name) return &pb.AuthUserRevokeRoleResponse{}, nil } @@ -485,6 +524,8 @@ func (as *authStore) RoleRevokePermission(r *pb.AuthRoleRevokePermissionRequest) // It should be optimized. as.clearCachedPerm() + as.commitRevision(tx) + plog.Noticef("revoked key %s from role %s", r.Key, r.Role) return &pb.AuthRoleRevokePermissionResponse{}, nil } @@ -513,6 +554,8 @@ func (as *authStore) RoleDelete(r *pb.AuthRoleDeleteRequest) (*pb.AuthRoleDelete delRole(tx, r.Role) + as.commitRevision(tx) + plog.Noticef("deleted role %s", r.Role) return &pb.AuthRoleDeleteResponse{}, nil } @@ -533,16 +576,18 @@ func (as *authStore) RoleAdd(r *pb.AuthRoleAddRequest) (*pb.AuthRoleAddResponse, putRole(tx, newRole) + as.commitRevision(tx) + plog.Noticef("Role %s is created", r.Name) return &pb.AuthRoleAddResponse{}, nil } -func (as *authStore) UsernameFromToken(token string) (string, bool) { +func (as *authStore) AuthInfoFromToken(token string) (*AuthInfo, bool) { as.simpleTokensMu.RLock() defer as.simpleTokensMu.RUnlock() t, ok := as.simpleTokens[token] - return t, ok + return &AuthInfo{Username: t, Revision: as.revision}, ok } type permSlice []*authpb.Permission @@ -594,15 +639,21 @@ func (as *authStore) RoleGrantPermission(r *pb.AuthRoleGrantPermissionRequest) ( // It should be optimized. as.clearCachedPerm() + as.commitRevision(tx) + plog.Noticef("role %s's permission of key %s is updated as %s", r.Name, r.Perm.Key, authpb.Permission_Type_name[int32(r.Perm.PermType)]) return &pb.AuthRoleGrantPermissionResponse{}, nil } -func (as *authStore) isOpPermitted(userName string, key, rangeEnd []byte, permTyp authpb.Permission_Type) bool { +func (as *authStore) isOpPermitted(userName string, revision uint64, key, rangeEnd []byte, permTyp authpb.Permission_Type) error { // TODO(mitake): this function would be costly so we need a caching mechanism if !as.isAuthEnabled() { - return true + return nil + } + + if revision < as.revision { + return ErrAuthOldRevision } tx := as.be.BatchTx() @@ -612,43 +663,47 @@ func (as *authStore) isOpPermitted(userName string, key, rangeEnd []byte, permTy user := getUser(tx, userName) if user == nil { plog.Errorf("invalid user name %s for permission checking", userName) - return false + return ErrPermissionDenied } if as.isRangeOpPermitted(tx, userName, key, rangeEnd, permTyp) { - return true + return nil } - return false + return ErrPermissionDenied } -func (as *authStore) IsPutPermitted(username string, key []byte) bool { - return as.isOpPermitted(username, key, nil, authpb.WRITE) +func (as *authStore) IsPutPermitted(authInfo *AuthInfo, key []byte) error { + return as.isOpPermitted(authInfo.Username, authInfo.Revision, key, nil, authpb.WRITE) } -func (as *authStore) IsRangePermitted(username string, key, rangeEnd []byte) bool { - return as.isOpPermitted(username, key, rangeEnd, authpb.READ) +func (as *authStore) IsRangePermitted(authInfo *AuthInfo, key, rangeEnd []byte) error { + return as.isOpPermitted(authInfo.Username, authInfo.Revision, key, rangeEnd, authpb.READ) } -func (as *authStore) IsDeleteRangePermitted(username string, key, rangeEnd []byte) bool { - return as.isOpPermitted(username, key, rangeEnd, authpb.WRITE) +func (as *authStore) IsDeleteRangePermitted(authInfo *AuthInfo, key, rangeEnd []byte) error { + return as.isOpPermitted(authInfo.Username, authInfo.Revision, key, rangeEnd, authpb.WRITE) } -func (as *authStore) IsAdminPermitted(username string) bool { +func (as *authStore) IsAdminPermitted(authInfo *AuthInfo) error { if !as.isAuthEnabled() { - return true + return nil } tx := as.be.BatchTx() tx.Lock() defer tx.Unlock() - u := getUser(tx, username) + u := getUser(tx, authInfo.Username) if u == nil { - return false + return ErrUserNotFound + } + + if !hasRootRole(u) { + return ErrPermissionDenied } - return hasRootRole(u) + return nil } func getUser(tx backend.BatchTx, username string) *authpb.User { @@ -760,13 +815,18 @@ func NewAuthStore(be backend.Backend) *authStore { tx.UnsafeCreateBucket(authUsersBucketName) tx.UnsafeCreateBucket(authRolesBucketName) - tx.Unlock() - be.ForceCommit() - - return &authStore{ + as := &authStore{ be: be, simpleTokens: make(map[string]string), + revision: 0, } + + as.commitRevision(tx) + + tx.Unlock() + be.ForceCommit() + + return as } func hasRootRole(u *authpb.User) bool { @@ -777,3 +837,23 @@ func hasRootRole(u *authpb.User) bool { } return false } + +func (as *authStore) commitRevision(tx backend.BatchTx) { + as.revision++ + revBytes := make([]byte, revBytesLen) + binary.BigEndian.PutUint64(revBytes, as.revision) + tx.UnsafePut(authBucketName, revisionKey, revBytes) +} + +func getRevision(tx backend.BatchTx) uint64 { + _, vs := tx.UnsafeRange(authBucketName, []byte(revisionKey), nil, 0) + if len(vs) != 1 { + plog.Panicf("failed to get the key of auth store revision") + } + + return binary.BigEndian.Uint64(vs[0]) +} + +func (as *authStore) Revision() uint64 { + return as.revision +} diff --git a/vendor/github.com/coreos/etcd/compactor/compactor_test.go b/vendor/github.com/coreos/etcd/compactor/compactor_test.go index 3390a24..b15f892 100644 --- a/vendor/github.com/coreos/etcd/compactor/compactor_test.go +++ b/vendor/github.com/coreos/etcd/compactor/compactor_test.go @@ -70,11 +70,13 @@ func TestPeriodicPause(t *testing.T) { tb.Run() tb.Pause() + // tb will collect 3 hours of revisions but not compact since paused n := int(time.Hour / checkCompactionInterval) for i := 0; i < 3*n; i++ { - rg.Wait(1) fc.Advance(checkCompactionInterval) + rg.Wait(1) } + // tb ends up waiting for the clock select { case a := <-compactable.Chan(): @@ -82,16 +84,19 @@ func TestPeriodicPause(t *testing.T) { case <-time.After(10 * time.Millisecond): } + // tb resumes to being blocked on the clock tb.Resume() - rg.Wait(1) - fc.Advance(checkCompactionInterval) + // unblock clock, will kick off a compaction at hour 3 + fc.Advance(checkCompactionInterval) a, err := compactable.Wait(1) if err != nil { t.Fatal(err) } - if !reflect.DeepEqual(a[0].Params[0], &pb.CompactionRequest{Revision: int64(2*n) + 2}) { - t.Errorf("compact request = %v, want %v", a[0].Params[0], &pb.CompactionRequest{Revision: int64(2*n) + 2}) + // compact the revision from hour 2 + wreq := &pb.CompactionRequest{Revision: int64(2*n + 1)} + if !reflect.DeepEqual(a[0].Params[0], wreq) { + t.Errorf("compact request = %v, want %v", a[0].Params[0], wreq.Revision) } } diff --git a/vendor/github.com/coreos/etcd/etcdserver/api/v3rpc/rpctypes/error.go b/vendor/github.com/coreos/etcd/etcdserver/api/v3rpc/rpctypes/error.go index 3f4510e..b41d1c8 100644 --- a/vendor/github.com/coreos/etcd/etcdserver/api/v3rpc/rpctypes/error.go +++ b/vendor/github.com/coreos/etcd/etcdserver/api/v3rpc/rpctypes/error.go @@ -53,6 +53,7 @@ var ( ErrGRPCNoLeader = grpc.Errorf(codes.Unavailable, "etcdserver: no leader") ErrGRPCNotCapable = grpc.Errorf(codes.Unavailable, "etcdserver: not capable") + ErrGRPCStopped = grpc.Errorf(codes.Unavailable, "etcdserver: server stopped") errStringToError = map[string]error{ grpc.ErrorDesc(ErrGRPCEmptyKey): ErrGRPCEmptyKey, @@ -87,6 +88,7 @@ var ( grpc.ErrorDesc(ErrGRPCNoLeader): ErrGRPCNoLeader, grpc.ErrorDesc(ErrGRPCNotCapable): ErrGRPCNotCapable, + grpc.ErrorDesc(ErrGRPCStopped): ErrGRPCStopped, } // client-side error @@ -122,6 +124,7 @@ var ( ErrNoLeader = Error(ErrGRPCNoLeader) ErrNotCapable = Error(ErrGRPCNotCapable) + ErrStopped = Error(ErrGRPCStopped) ) // EtcdError defines gRPC server errors. diff --git a/vendor/github.com/coreos/etcd/etcdserver/api/v3rpc/watch.go b/vendor/github.com/coreos/etcd/etcdserver/api/v3rpc/watch.go index ffe722e..fbf8f06 100644 --- a/vendor/github.com/coreos/etcd/etcdserver/api/v3rpc/watch.go +++ b/vendor/github.com/coreos/etcd/etcdserver/api/v3rpc/watch.go @@ -172,16 +172,7 @@ func (sws *serverWatchStream) recvLoop() error { // support >= key queries creq.RangeEnd = []byte{} } - filters := make([]mvcc.FilterFunc, 0, len(creq.Filters)) - for _, ft := range creq.Filters { - switch ft { - case pb.WatchCreateRequest_NOPUT: - filters = append(filters, filterNoPut) - case pb.WatchCreateRequest_NODELETE: - filters = append(filters, filterNoDelete) - default: - } - } + filters := FiltersFromRequest(creq) wsrev := sws.watchStream.Rev() rev := creq.StartRevision @@ -304,7 +295,8 @@ func (sws *serverWatchStream) sendLoop() { } sws.mu.Lock() - if _, ok := sws.progress[wresp.WatchID]; ok { + if len(evs) > 0 && sws.progress[wresp.WatchID] { + // elide next progress update if sent a key update sws.progress[wresp.WatchID] = false } sws.mu.Unlock() @@ -372,3 +364,17 @@ func filterNoDelete(e mvccpb.Event) bool { func filterNoPut(e mvccpb.Event) bool { return e.Type == mvccpb.PUT } + +func FiltersFromRequest(creq *pb.WatchCreateRequest) []mvcc.FilterFunc { + filters := make([]mvcc.FilterFunc, 0, len(creq.Filters)) + for _, ft := range creq.Filters { + switch ft { + case pb.WatchCreateRequest_NOPUT: + filters = append(filters, filterNoPut) + case pb.WatchCreateRequest_NODELETE: + filters = append(filters, filterNoDelete) + default: + } + } + return filters +} diff --git a/vendor/github.com/coreos/etcd/etcdserver/apply_auth.go b/vendor/github.com/coreos/etcd/etcdserver/apply_auth.go index 22a2a84..842657d 100644 --- a/vendor/github.com/coreos/etcd/etcdserver/apply_auth.go +++ b/vendor/github.com/coreos/etcd/etcdserver/apply_auth.go @@ -27,8 +27,9 @@ type authApplierV3 struct { // mu serializes Apply so that user isn't corrupted and so that // serialized requests don't leak data from TOCTOU errors - mu sync.Mutex - user string + mu sync.Mutex + + authInfo auth.AuthInfo } func newAuthApplierV3(as auth.AuthStore, base applierV3) *authApplierV3 { @@ -41,46 +42,57 @@ func (aa *authApplierV3) Apply(r *pb.InternalRaftRequest) *applyResult { if r.Header != nil { // backward-compatible with pre-3.0 releases when internalRaftRequest // does not have header field - aa.user = r.Header.Username + aa.authInfo.Username = r.Header.Username + aa.authInfo.Revision = r.Header.AuthRevision } - if needAdminPermission(r) && !aa.as.IsAdminPermitted(aa.user) { - aa.user = "" - return &applyResult{err: auth.ErrPermissionDenied} + if needAdminPermission(r) { + if err := aa.as.IsAdminPermitted(&aa.authInfo); err != nil { + aa.authInfo.Username = "" + aa.authInfo.Revision = 0 + return &applyResult{err: err} + } } ret := aa.applierV3.Apply(r) - aa.user = "" + aa.authInfo.Username = "" + aa.authInfo.Revision = 0 return ret } func (aa *authApplierV3) Put(txnID int64, r *pb.PutRequest) (*pb.PutResponse, error) { - if !aa.as.IsPutPermitted(aa.user, r.Key) { - return nil, auth.ErrPermissionDenied + if err := aa.as.IsPutPermitted(&aa.authInfo, r.Key); err != nil { + return nil, err } - if r.PrevKv && !aa.as.IsRangePermitted(aa.user, r.Key, nil) { - return nil, auth.ErrPermissionDenied + if r.PrevKv { + err := aa.as.IsRangePermitted(&aa.authInfo, r.Key, nil) + if err != nil { + return nil, err + } } return aa.applierV3.Put(txnID, r) } func (aa *authApplierV3) Range(txnID int64, r *pb.RangeRequest) (*pb.RangeResponse, error) { - if !aa.as.IsRangePermitted(aa.user, r.Key, r.RangeEnd) { - return nil, auth.ErrPermissionDenied + if err := aa.as.IsRangePermitted(&aa.authInfo, r.Key, r.RangeEnd); err != nil { + return nil, err } return aa.applierV3.Range(txnID, r) } func (aa *authApplierV3) DeleteRange(txnID int64, r *pb.DeleteRangeRequest) (*pb.DeleteRangeResponse, error) { - if !aa.as.IsDeleteRangePermitted(aa.user, r.Key, r.RangeEnd) { - return nil, auth.ErrPermissionDenied + if err := aa.as.IsDeleteRangePermitted(&aa.authInfo, r.Key, r.RangeEnd); err != nil { + return nil, err } - if r.PrevKv && !aa.as.IsRangePermitted(aa.user, r.Key, r.RangeEnd) { - return nil, auth.ErrPermissionDenied + if r.PrevKv { + err := aa.as.IsRangePermitted(&aa.authInfo, r.Key, r.RangeEnd) + if err != nil { + return nil, err + } } return aa.applierV3.DeleteRange(txnID, r) } -func (aa *authApplierV3) checkTxnReqsPermission(reqs []*pb.RequestOp) bool { +func (aa *authApplierV3) checkTxnReqsPermission(reqs []*pb.RequestOp) error { for _, requ := range reqs { switch tv := requ.Request.(type) { case *pb.RequestOp_RequestRange: @@ -88,8 +100,8 @@ func (aa *authApplierV3) checkTxnReqsPermission(reqs []*pb.RequestOp) bool { continue } - if !aa.as.IsRangePermitted(aa.user, tv.RequestRange.Key, tv.RequestRange.RangeEnd) { - return false + if err := aa.as.IsRangePermitted(&aa.authInfo, tv.RequestRange.Key, tv.RequestRange.RangeEnd); err != nil { + return err } case *pb.RequestOp_RequestPut: @@ -97,8 +109,8 @@ func (aa *authApplierV3) checkTxnReqsPermission(reqs []*pb.RequestOp) bool { continue } - if !aa.as.IsPutPermitted(aa.user, tv.RequestPut.Key) { - return false + if err := aa.as.IsPutPermitted(&aa.authInfo, tv.RequestPut.Key); err != nil { + return err } case *pb.RequestOp_RequestDeleteRange: @@ -106,31 +118,35 @@ func (aa *authApplierV3) checkTxnReqsPermission(reqs []*pb.RequestOp) bool { continue } - if tv.RequestDeleteRange.PrevKv && !aa.as.IsRangePermitted(aa.user, tv.RequestDeleteRange.Key, tv.RequestDeleteRange.RangeEnd) { - return false + if tv.RequestDeleteRange.PrevKv { + err := aa.as.IsRangePermitted(&aa.authInfo, tv.RequestDeleteRange.Key, tv.RequestDeleteRange.RangeEnd) + if err != nil { + return err + } } - if !aa.as.IsDeleteRangePermitted(aa.user, tv.RequestDeleteRange.Key, tv.RequestDeleteRange.RangeEnd) { - return false + err := aa.as.IsDeleteRangePermitted(&aa.authInfo, tv.RequestDeleteRange.Key, tv.RequestDeleteRange.RangeEnd) + if err != nil { + return err } } } - return true + return nil } func (aa *authApplierV3) Txn(rt *pb.TxnRequest) (*pb.TxnResponse, error) { for _, c := range rt.Compare { - if !aa.as.IsRangePermitted(aa.user, c.Key, nil) { - return nil, auth.ErrPermissionDenied + if err := aa.as.IsRangePermitted(&aa.authInfo, c.Key, nil); err != nil { + return nil, err } } - if !aa.checkTxnReqsPermission(rt.Success) { - return nil, auth.ErrPermissionDenied + if err := aa.checkTxnReqsPermission(rt.Success); err != nil { + return nil, err } - if !aa.checkTxnReqsPermission(rt.Failure) { - return nil, auth.ErrPermissionDenied + if err := aa.checkTxnReqsPermission(rt.Failure); err != nil { + return nil, err } return aa.applierV3.Txn(rt) diff --git a/vendor/github.com/coreos/etcd/etcdserver/etcdserverpb/etcdserver.pb.go b/vendor/github.com/coreos/etcd/etcdserver/etcdserverpb/etcdserver.pb.go index c1fde43..746e9a1 100644 --- a/vendor/github.com/coreos/etcd/etcdserver/etcdserverpb/etcdserver.pb.go +++ b/vendor/github.com/coreos/etcd/etcdserver/etcdserverpb/etcdserver.pb.go @@ -99,7 +99,7 @@ package etcdserverpb import ( "fmt" - proto "github.com/gogo/protobuf/proto" + proto "github.com/golang/protobuf/proto" math "math" ) @@ -113,7 +113,7 @@ var _ = math.Inf // This is a compile-time assertion to ensure that this generated file // is compatible with the proto package it is being compiled against. -const _ = proto.GoGoProtoPackageIsVersion1 +const _ = proto.ProtoPackageIsVersion1 type Request struct { ID uint64 `protobuf:"varint,1,opt,name=ID,json=iD" json:"ID"` @@ -1011,30 +1011,31 @@ var ( ) var fileDescriptorEtcdserver = []byte{ - // 388 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x5c, 0x92, 0xd1, 0xee, 0xd2, 0x30, - 0x14, 0xc6, 0xff, 0xdb, 0xca, 0x60, 0x15, 0x15, 0x1b, 0x62, 0x4e, 0x88, 0x41, 0x43, 0xbc, 0xf0, - 0x4a, 0xdf, 0x01, 0xe1, 0x82, 0x44, 0x0d, 0x82, 0xd1, 0xeb, 0xba, 0x1d, 0xa1, 0x09, 0x5b, 0x47, - 0xdb, 0x4d, 0xde, 0xc0, 0x57, 0xe3, 0xd2, 0x27, 0x30, 0xea, 0x93, 0xd8, 0x16, 0x86, 0xd5, 0x8b, - 0x26, 0xcb, 0xef, 0xfb, 0xce, 0xe9, 0xd7, 0x73, 0x46, 0x47, 0x68, 0xf2, 0x42, 0xa3, 0x6a, 0x51, - 0xbd, 0xac, 0x95, 0x34, 0x92, 0x0d, 0xff, 0x92, 0xfa, 0xf3, 0x64, 0xbc, 0x93, 0x3b, 0xe9, 0x85, - 0x57, 0xee, 0xeb, 0xe2, 0x99, 0x7d, 0x23, 0xb4, 0xbf, 0xc1, 0x63, 0x83, 0xda, 0xb0, 0x31, 0x8d, - 0x57, 0x0b, 0x88, 0x9e, 0x45, 0x2f, 0xc8, 0x9c, 0x9c, 0x7f, 0x3c, 0xbd, 0xdb, 0xc4, 0x62, 0xc1, - 0x9e, 0xd0, 0xf4, 0x2d, 0x9a, 0xbd, 0x2c, 0x20, 0xb6, 0x4a, 0x76, 0x55, 0xd2, 0xd2, 0x33, 0x06, - 0x94, 0xac, 0xb9, 0xd9, 0x43, 0x12, 0x68, 0xa4, 0xb6, 0x84, 0x3d, 0xa6, 0xc9, 0x47, 0x7e, 0x00, - 0x12, 0x08, 0x49, 0xcb, 0x0f, 0x8e, 0x2f, 0x84, 0x82, 0x9e, 0xe5, 0x83, 0x8e, 0x17, 0x42, 0xb1, - 0x19, 0xcd, 0xd6, 0x0a, 0x5b, 0x5b, 0xd3, 0x20, 0xa4, 0x41, 0x55, 0x56, 0x77, 0xb8, 0xf3, 0xac, - 0xaa, 0x02, 0x4f, 0xd0, 0x0f, 0x82, 0x7a, 0x8f, 0xc7, 0x9d, 0x67, 0x79, 0x12, 0xda, 0xc0, 0xe0, - 0x76, 0x4b, 0x74, 0xf1, 0x78, 0xcc, 0x9e, 0x53, 0xba, 0x3c, 0xd5, 0x42, 0x71, 0x23, 0x64, 0x05, - 0x99, 0x35, 0x25, 0xd7, 0x46, 0x14, 0x6f, 0xdc, 0xbd, 0xed, 0x13, 0x17, 0x06, 0x68, 0x10, 0x95, - 0x7c, 0xb5, 0x84, 0x4d, 0x68, 0x6f, 0x2b, 0xaa, 0x1c, 0xe1, 0x5e, 0x90, 0xa1, 0xa7, 0x1d, 0x72, - 0xf7, 0x6f, 0x30, 0x6f, 0x94, 0x16, 0x2d, 0xc2, 0x30, 0x28, 0xcd, 0x54, 0x87, 0xdd, 0x4c, 0xb7, - 0x52, 0x19, 0x2c, 0xe0, 0x7e, 0x60, 0x48, 0xb5, 0x67, 0x4e, 0x7d, 0xdf, 0x48, 0xd5, 0x94, 0xf0, - 0x20, 0x54, 0x8f, 0x9e, 0xb9, 0x54, 0x1f, 0x44, 0x89, 0xf0, 0x30, 0x48, 0x4d, 0x8c, 0x25, 0xbe, - 0xab, 0x51, 0xc8, 0x4b, 0x18, 0xfd, 0xd3, 0xd5, 0x33, 0x36, 0x75, 0x8b, 0xfe, 0xa2, 0x50, 0xef, - 0xe1, 0x51, 0x30, 0x95, 0xbe, 0xba, 0xc0, 0xd9, 0x1b, 0x3a, 0xb0, 0x7b, 0xe6, 0x05, 0x37, 0xdc, - 0x75, 0x7a, 0x27, 0x0b, 0xfc, 0xef, 0x6f, 0x48, 0x2b, 0xcf, 0xdc, 0x0b, 0x5f, 0x1f, 0x1a, 0x6d, - 0x50, 0x59, 0x43, 0x1c, 0x6e, 0x21, 0xef, 0xf0, 0x7c, 0x74, 0xfe, 0x35, 0xbd, 0x3b, 0xff, 0x9e, - 0x46, 0xdf, 0xed, 0xf9, 0x69, 0xcf, 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfb, 0x8e, 0x1a, 0x0d, - 0xa0, 0x02, 0x00, 0x00, + // 404 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x5c, 0x92, 0x41, 0x6e, 0x13, 0x31, + 0x14, 0x86, 0xe3, 0xc4, 0x99, 0x64, 0x4c, 0x81, 0x62, 0x45, 0xe8, 0xa9, 0x42, 0x43, 0x14, 0xb1, + 0xc8, 0x0a, 0xee, 0x50, 0xd2, 0x45, 0x24, 0x8a, 0x4a, 0x8a, 0xca, 0xda, 0x64, 0x1e, 0x8d, 0xa5, + 0xcc, 0x78, 0x6a, 0xbf, 0x19, 0x72, 0x03, 0xae, 0xc0, 0x91, 0xb2, 0xe4, 0x04, 0x08, 0xc2, 0x45, + 0x90, 0x3d, 0x9d, 0x60, 0xba, 0xb3, 0xbe, 0xff, 0xf7, 0xef, 0xdf, 0xf6, 0x13, 0xa7, 0x48, 0xeb, + 0xdc, 0xa1, 0x6d, 0xd0, 0xbe, 0xae, 0xac, 0x21, 0x23, 0x4f, 0xfe, 0x91, 0xea, 0xf3, 0xd9, 0xe4, + 0xd6, 0xdc, 0x9a, 0x20, 0xbc, 0xf1, 0xab, 0xd6, 0x33, 0xfb, 0xc6, 0xc5, 0x68, 0x85, 0x77, 0x35, + 0x3a, 0x92, 0x13, 0xd1, 0x5f, 0x2e, 0x80, 0x4d, 0xd9, 0x9c, 0x9f, 0xf3, 0xfd, 0xcf, 0x97, 0xbd, + 0x55, 0x5f, 0x2f, 0xe4, 0x0b, 0x91, 0x5c, 0x22, 0x6d, 0x4c, 0x0e, 0xfd, 0x29, 0x9b, 0xa7, 0xf7, + 0x4a, 0x52, 0x04, 0x26, 0x41, 0xf0, 0x2b, 0x45, 0x1b, 0x18, 0x44, 0x1a, 0xaf, 0x14, 0x6d, 0xe4, + 0x73, 0x31, 0xb8, 0x51, 0x5b, 0xe0, 0x91, 0x30, 0x68, 0xd4, 0xd6, 0xf3, 0x85, 0xb6, 0x30, 0x9c, + 0xb2, 0xf9, 0xb8, 0xe3, 0xb9, 0xb6, 0x72, 0x26, 0xd2, 0x2b, 0x8b, 0xcd, 0x8d, 0xda, 0xd6, 0x08, + 0x49, 0xb4, 0x2b, 0xad, 0x3a, 0xdc, 0x79, 0x96, 0x65, 0x8e, 0x3b, 0x18, 0x45, 0x45, 0x83, 0x27, + 0xe0, 0xce, 0x73, 0xb1, 0xd3, 0x8e, 0x60, 0x7c, 0x3c, 0x85, 0xb5, 0x9e, 0x80, 0xe5, 0x2b, 0x21, + 0x2e, 0x76, 0x95, 0xb6, 0x8a, 0xb4, 0x29, 0x21, 0x9d, 0xb2, 0xf9, 0xe0, 0x3e, 0x48, 0xe0, 0x91, + 0xfb, 0xbb, 0x7d, 0x52, 0x9a, 0x40, 0x44, 0x55, 0xf9, 0x57, 0xa5, 0x49, 0x9e, 0x89, 0xe1, 0xb5, + 0x2e, 0xd7, 0x08, 0x8f, 0xa2, 0x0e, 0x43, 0xe7, 0x91, 0x3f, 0x7f, 0x85, 0xeb, 0xda, 0x3a, 0xdd, + 0x20, 0x9c, 0x44, 0x5b, 0x53, 0xdb, 0x61, 0xff, 0xa6, 0xd7, 0xc6, 0x12, 0xe6, 0xf0, 0x38, 0x32, + 0x24, 0x2e, 0x30, 0xaf, 0x7e, 0xa8, 0x8d, 0xad, 0x0b, 0x78, 0x12, 0xab, 0x77, 0x81, 0xf9, 0x56, + 0x1f, 0x75, 0x81, 0xf0, 0x34, 0x6a, 0xcd, 0x49, 0x17, 0x6d, 0x2a, 0x59, 0x54, 0x05, 0x9c, 0xfe, + 0x97, 0x1a, 0x98, 0xcc, 0xfc, 0x47, 0x7f, 0xb1, 0xe8, 0x36, 0xf0, 0x2c, 0x7a, 0x95, 0x91, 0x6d, + 0xe1, 0xec, 0x9d, 0x18, 0x5f, 0x22, 0xa9, 0x5c, 0x91, 0xf2, 0x49, 0xef, 0x4d, 0x8e, 0x0f, 0xa6, + 0x21, 0x29, 0x03, 0xf3, 0x37, 0x7c, 0xbb, 0xad, 0x1d, 0xa1, 0x5d, 0x2e, 0xc2, 0x50, 0x1c, 0x7f, + 0x61, 0xdd, 0xe1, 0xf3, 0xc9, 0xfe, 0x77, 0xd6, 0xdb, 0x1f, 0x32, 0xf6, 0xe3, 0x90, 0xb1, 0x5f, + 0x87, 0x8c, 0x7d, 0xff, 0x93, 0xf5, 0xfe, 0x06, 0x00, 0x00, 0xff, 0xff, 0x80, 0x62, 0xfc, 0x40, + 0xa4, 0x02, 0x00, 0x00, } diff --git a/vendor/github.com/coreos/etcd/etcdserver/etcdserverpb/raft_internal.pb.go b/vendor/github.com/coreos/etcd/etcdserver/etcdserverpb/raft_internal.pb.go index 76caf68..84c114f 100644 --- a/vendor/github.com/coreos/etcd/etcdserver/etcdserverpb/raft_internal.pb.go +++ b/vendor/github.com/coreos/etcd/etcdserver/etcdserverpb/raft_internal.pb.go @@ -7,7 +7,7 @@ package etcdserverpb import ( "fmt" - proto "github.com/gogo/protobuf/proto" + proto "github.com/golang/protobuf/proto" math "math" ) @@ -23,6 +23,8 @@ type RequestHeader struct { ID uint64 `protobuf:"varint,1,opt,name=ID,json=iD,proto3" json:"ID,omitempty"` // username is a username that is associated with an auth token of gRPC connection Username string `protobuf:"bytes,2,opt,name=username,proto3" json:"username,omitempty"` + // auth_revision is a revision number of auth.authStore. It is not related to mvcc + AuthRevision uint64 `protobuf:"varint,3,opt,name=auth_revision,json=authRevision,proto3" json:"auth_revision,omitempty"` } func (m *RequestHeader) Reset() { *m = RequestHeader{} } @@ -124,6 +126,11 @@ func (m *RequestHeader) MarshalTo(data []byte) (int, error) { i = encodeVarintRaftInternal(data, i, uint64(len(m.Username))) i += copy(data[i:], m.Username) } + if m.AuthRevision != 0 { + data[i] = 0x18 + i++ + i = encodeVarintRaftInternal(data, i, uint64(m.AuthRevision)) + } return i, nil } @@ -535,6 +542,9 @@ func (m *RequestHeader) Size() (n int) { if l > 0 { n += 1 + l + sovRaftInternal(uint64(l)) } + if m.AuthRevision != 0 { + n += 1 + sovRaftInternal(uint64(m.AuthRevision)) + } return n } @@ -765,6 +775,25 @@ func (m *RequestHeader) Unmarshal(data []byte) error { } m.Username = string(data[iNdEx:postIndex]) iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field AuthRevision", wireType) + } + m.AuthRevision = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaftInternal + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := data[iNdEx] + iNdEx++ + m.AuthRevision |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex skippy, err := skipRaftInternal(data[iNdEx:]) @@ -2006,56 +2035,57 @@ var ( ) var fileDescriptorRaftInternal = []byte{ - // 808 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x7c, 0x96, 0x4b, 0x6f, 0xd3, 0x4a, - 0x14, 0xc7, 0x6f, 0xd2, 0x67, 0x26, 0x69, 0x6e, 0xef, 0xb4, 0xbd, 0x77, 0x6e, 0x2a, 0x95, 0x36, - 0x88, 0x37, 0x14, 0xd4, 0x2e, 0x59, 0x40, 0x68, 0xaa, 0xb6, 0x52, 0x85, 0x2a, 0xab, 0x48, 0x48, - 0x2c, 0xac, 0x69, 0x3c, 0xa4, 0x06, 0xbf, 0xb0, 0x27, 0xa5, 0x7c, 0x2b, 0x5e, 0x1f, 0xa2, 0x0b, - 0x1e, 0x05, 0xbe, 0x00, 0xb0, 0x62, 0xc5, 0x06, 0x3e, 0x00, 0xf3, 0xf2, 0xd8, 0x4e, 0xc6, 0x5d, - 0x44, 0xb2, 0xcf, 0xf9, 0x9f, 0xdf, 0x39, 0xd3, 0xf9, 0x8f, 0xa7, 0x60, 0x2e, 0xc6, 0x8f, 0xa9, - 0xed, 0x06, 0x94, 0xc4, 0x01, 0xf6, 0x56, 0xa3, 0x38, 0xa4, 0x21, 0x6c, 0x10, 0xda, 0x73, 0x12, - 0x12, 0x1f, 0x91, 0x38, 0x3a, 0x68, 0xcd, 0xf7, 0xc3, 0x7e, 0x28, 0x12, 0x37, 0xf9, 0x93, 0xd4, - 0xb4, 0x66, 0x33, 0x8d, 0x8a, 0xd4, 0xe2, 0xa8, 0x27, 0x1f, 0xdb, 0xb7, 0xc1, 0x8c, 0x45, 0x9e, - 0x0d, 0x48, 0x42, 0xb7, 0x09, 0x76, 0x48, 0x0c, 0x9b, 0xa0, 0xba, 0xd3, 0x45, 0x95, 0xe5, 0xca, - 0xe5, 0x71, 0xab, 0xea, 0x76, 0x61, 0x0b, 0x4c, 0x0f, 0x12, 0xde, 0xd2, 0x27, 0xa8, 0xca, 0xa2, - 0x35, 0x4b, 0xbf, 0xb7, 0x7f, 0x36, 0xc1, 0xdc, 0x8e, 0x1a, 0xc8, 0x62, 0xd3, 0x29, 0xd2, 0x08, - 0xe3, 0x02, 0xa8, 0x1e, 0xad, 0x89, 0xea, 0xfa, 0xda, 0xc2, 0x6a, 0x7e, 0xe4, 0x55, 0x55, 0x62, - 0x31, 0x01, 0xbc, 0x05, 0x26, 0x62, 0x1c, 0xf4, 0x09, 0x1a, 0x13, 0xca, 0xd6, 0x90, 0x92, 0xa7, - 0x52, 0xb9, 0x14, 0xc2, 0xab, 0x60, 0x2c, 0x1a, 0x50, 0x34, 0x2e, 0xf4, 0xa8, 0xa8, 0xdf, 0x1b, - 0xa4, 0xf3, 0x58, 0x5c, 0x04, 0x37, 0x40, 0xc3, 0x21, 0x1e, 0xa1, 0xc4, 0x96, 0x4d, 0x26, 0x44, - 0xd1, 0x72, 0xb1, 0xa8, 0x2b, 0x14, 0x85, 0x56, 0x75, 0x27, 0x8b, 0xf1, 0x86, 0xf4, 0x38, 0x40, - 0x93, 0xa6, 0x86, 0xfb, 0xc7, 0x81, 0x6e, 0xc8, 0x44, 0xf0, 0x0e, 0x00, 0xbd, 0xd0, 0x8f, 0x70, - 0x8f, 0xba, 0x61, 0x80, 0xa6, 0x44, 0xc9, 0xb9, 0x62, 0xc9, 0x86, 0xce, 0xa7, 0x95, 0xb9, 0x12, - 0x78, 0x17, 0xd4, 0x3d, 0x82, 0x13, 0x62, 0xf7, 0xd9, 0xc4, 0x14, 0x4d, 0x9b, 0x08, 0xbb, 0x5c, - 0xb0, 0xc5, 0xf3, 0x9a, 0xe0, 0xe9, 0x10, 0x5f, 0xb3, 0x24, 0xc4, 0xe4, 0x28, 0x7c, 0x4a, 0x50, - 0xcd, 0xb4, 0x66, 0x81, 0xb0, 0x84, 0x40, 0xaf, 0xd9, 0xcb, 0x62, 0x7c, 0x5b, 0xb0, 0x87, 0x63, - 0x1f, 0x01, 0xd3, 0xb6, 0x74, 0x78, 0x4a, 0x6f, 0x8b, 0x10, 0xc2, 0x75, 0x30, 0x79, 0x28, 0xdc, - 0x84, 0x1c, 0x51, 0xb2, 0x68, 0xdc, 0x73, 0x69, 0x38, 0x4b, 0x49, 0x61, 0x07, 0xd4, 0xf1, 0x80, - 0x1e, 0xda, 0x24, 0xc0, 0x07, 0x1e, 0x41, 0x3f, 0x8c, 0x7f, 0xb0, 0x0e, 0x53, 0x6c, 0x0a, 0x81, - 0x5e, 0x2e, 0xd6, 0x21, 0xd8, 0x05, 0x0d, 0x81, 0x70, 0xdc, 0x44, 0x30, 0x7e, 0x4d, 0x99, 0xd6, - 0xcb, 0x19, 0x5d, 0xa9, 0xd0, 0xeb, 0xc5, 0x59, 0x0c, 0xde, 0x97, 0x14, 0x12, 0x50, 0xb7, 0x87, - 0x29, 0x41, 0xbf, 0x25, 0xe5, 0x4a, 0x91, 0x92, 0xfa, 0xbe, 0x93, 0x93, 0xa6, 0xb8, 0x42, 0x3d, - 0xdc, 0x04, 0x33, 0x62, 0x2a, 0x7e, 0x6c, 0x6c, 0xec, 0x38, 0xe8, 0xdd, 0x74, 0xd9, 0x58, 0x0f, - 0xd8, 0x5b, 0xc7, 0x71, 0x0a, 0x63, 0xa9, 0x18, 0x1b, 0x6b, 0x36, 0xc3, 0x48, 0x4f, 0xa2, 0xf7, - 0x92, 0x74, 0xde, 0x4c, 0x52, 0x66, 0x56, 0xb0, 0x26, 0x2e, 0x84, 0x8b, 0x63, 0xf5, 0x09, 0x45, - 0x1f, 0xce, 0x1c, 0x6b, 0x8b, 0xd0, 0x91, 0xb1, 0x58, 0x0c, 0xf6, 0xc1, 0xff, 0x19, 0xa6, 0x77, - 0xc8, 0x4f, 0x89, 0x1d, 0xe1, 0x24, 0x79, 0x1e, 0xc6, 0x0e, 0xfa, 0x28, 0x91, 0xd7, 0xcc, 0xc8, - 0x0d, 0xa1, 0xde, 0x53, 0xe2, 0x94, 0xfe, 0x2f, 0x36, 0xa6, 0xe1, 0x43, 0x30, 0x9f, 0x9b, 0x97, - 0xdb, 0xdb, 0x8e, 0x43, 0xb6, 0xc9, 0xa7, 0xb2, 0xc7, 0xc5, 0x92, 0xb1, 0xc5, 0xd1, 0x08, 0xb3, - 0xad, 0xfe, 0x07, 0x0f, 0x67, 0xe0, 0x23, 0xb0, 0x90, 0x91, 0xe5, 0x49, 0x91, 0xe8, 0x4f, 0x12, - 0x7d, 0xc9, 0x8c, 0x56, 0x47, 0x26, 0xc7, 0x86, 0x78, 0x24, 0x05, 0xb7, 0x41, 0x33, 0x83, 0x7b, - 0x6e, 0x42, 0xd1, 0x67, 0x49, 0x5d, 0x31, 0x53, 0x77, 0x99, 0xa4, 0xe0, 0xa3, 0x34, 0xa8, 0x49, - 0x7c, 0x34, 0x49, 0xfa, 0x52, 0x4a, 0xe2, 0xad, 0x47, 0x48, 0x69, 0x50, 0x6f, 0xbd, 0x20, 0x71, - 0x47, 0xbe, 0xac, 0x95, 0x6d, 0x3d, 0xaf, 0x19, 0x76, 0xa4, 0x8a, 0x69, 0x47, 0x0a, 0x8c, 0x72, - 0xe4, 0xab, 0x5a, 0x99, 0x23, 0x79, 0x95, 0xc1, 0x91, 0x59, 0xb8, 0x38, 0x16, 0x77, 0xe4, 0xeb, - 0x33, 0xc7, 0x1a, 0x76, 0xa4, 0x8a, 0xc1, 0x27, 0xa0, 0x95, 0xc3, 0x08, 0xa3, 0x44, 0x24, 0xf6, - 0xdd, 0x24, 0xe1, 0xdf, 0xe1, 0x37, 0x92, 0x79, 0xbd, 0x84, 0xc9, 0xe5, 0x7b, 0x5a, 0x9d, 0xf2, - 0xff, 0xc3, 0xe6, 0x3c, 0xf4, 0xc1, 0x62, 0xd6, 0x4b, 0x59, 0x27, 0xd7, 0xec, 0xad, 0x6c, 0x76, - 0xc3, 0xdc, 0x4c, 0xba, 0x64, 0xb4, 0x1b, 0xc2, 0x25, 0x82, 0xf6, 0xdf, 0x60, 0x66, 0xd3, 0x8f, - 0xe8, 0x0b, 0x8b, 0x24, 0x51, 0x18, 0x24, 0xa4, 0x1d, 0x81, 0xc5, 0x33, 0x3e, 0x44, 0x10, 0x82, - 0x71, 0x71, 0x71, 0x57, 0xc4, 0xc5, 0x2d, 0x9e, 0xf9, 0x85, 0xae, 0xcf, 0xa7, 0xba, 0xd0, 0xd3, - 0x77, 0xb8, 0x02, 0x1a, 0x89, 0xeb, 0x47, 0x6c, 0x2d, 0x94, 0x35, 0x0e, 0xc4, 0x45, 0x5c, 0xb3, - 0xea, 0x32, 0xb6, 0xcf, 0x43, 0xf7, 0x66, 0x4f, 0xbe, 0x2d, 0xfd, 0x75, 0xf2, 0x7d, 0xa9, 0x72, - 0xca, 0x7e, 0x5f, 0xd9, 0xef, 0x60, 0x52, 0xfc, 0x27, 0xb1, 0xfe, 0x27, 0x00, 0x00, 0xff, 0xff, - 0xdc, 0xb1, 0xbb, 0xb7, 0xa1, 0x08, 0x00, 0x00, + // 831 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x7c, 0x56, 0xdb, 0x4e, 0xdb, 0x4a, + 0x14, 0x25, 0xe1, 0x9a, 0x49, 0xc8, 0xe1, 0x0c, 0x70, 0xce, 0x9c, 0x20, 0x71, 0x20, 0xa8, 0xf7, + 0x96, 0x56, 0xf0, 0x01, 0x6d, 0x4a, 0x10, 0x20, 0xa1, 0x0a, 0x59, 0x54, 0xaa, 0xd4, 0x07, 0x77, + 0x88, 0xa7, 0xc1, 0xad, 0x63, 0xbb, 0xf6, 0x84, 0xd2, 0x3f, 0xe9, 0x67, 0xf4, 0xf6, 0x11, 0x3c, + 0xf4, 0x42, 0xdb, 0x1f, 0xe8, 0xe5, 0xa5, 0x4f, 0x7d, 0x69, 0x3f, 0xa0, 0x73, 0xf3, 0xd8, 0x4e, + 0xc6, 0x3c, 0x44, 0xb2, 0xd7, 0xac, 0xbd, 0xd6, 0x1e, 0xef, 0x35, 0x0c, 0x60, 0x36, 0xc2, 0x0f, + 0xa9, 0xed, 0xfa, 0x94, 0x44, 0x3e, 0xf6, 0x56, 0xc3, 0x28, 0xa0, 0x01, 0xac, 0x11, 0xda, 0x71, + 0x62, 0x12, 0x1d, 0x91, 0x28, 0x3c, 0x68, 0xcc, 0x75, 0x83, 0x6e, 0x20, 0x16, 0xae, 0xf3, 0x27, + 0xc9, 0x69, 0xcc, 0xa4, 0x1c, 0x85, 0x54, 0xa2, 0xb0, 0x23, 0x1f, 0x9b, 0x0f, 0xc0, 0xb4, 0x45, + 0x9e, 0xf4, 0x49, 0x4c, 0xb7, 0x09, 0x76, 0x48, 0x04, 0xeb, 0xa0, 0xbc, 0xd3, 0x46, 0xa5, 0xa5, + 0xd2, 0xc5, 0x31, 0xab, 0xec, 0xb6, 0x61, 0x03, 0x4c, 0xf5, 0x63, 0x6e, 0xd9, 0x23, 0xa8, 0xcc, + 0xd0, 0x8a, 0xa5, 0xdf, 0xe1, 0x0a, 0x98, 0xc6, 0x7d, 0x7a, 0x68, 0x47, 0xe4, 0xc8, 0x8d, 0xdd, + 0xc0, 0x47, 0xa3, 0xa2, 0xac, 0xc6, 0x41, 0x4b, 0x61, 0xcd, 0x9f, 0x75, 0x30, 0xbb, 0xa3, 0xba, + 0xb6, 0xd8, 0x16, 0x94, 0xdd, 0x90, 0xd1, 0x39, 0x50, 0x3e, 0x5a, 0x13, 0x16, 0xd5, 0xb5, 0xf9, + 0xd5, 0xec, 0xbe, 0x56, 0x55, 0x89, 0xc5, 0x08, 0xf0, 0x06, 0x18, 0x8f, 0xb0, 0xdf, 0x25, 0xc2, + 0xab, 0xba, 0xd6, 0x18, 0x60, 0xf2, 0xa5, 0x84, 0x2e, 0x89, 0xf0, 0x32, 0x18, 0x0d, 0xfb, 0x14, + 0x8d, 0x09, 0x3e, 0xca, 0xf3, 0xf7, 0xfa, 0x49, 0x3f, 0x16, 0x27, 0xc1, 0x0d, 0x50, 0x73, 0x88, + 0x47, 0x28, 0xb1, 0xa5, 0xc9, 0xb8, 0x28, 0x5a, 0xca, 0x17, 0xb5, 0x05, 0x23, 0x67, 0x55, 0x75, + 0x52, 0x8c, 0x1b, 0xd2, 0x63, 0x1f, 0x4d, 0x98, 0x0c, 0xf7, 0x8f, 0x7d, 0x6d, 0xc8, 0x48, 0xf0, + 0x26, 0x00, 0x9d, 0xa0, 0x17, 0xe2, 0x0e, 0xe5, 0xdf, 0x6f, 0x52, 0x94, 0xfc, 0x9f, 0x2f, 0xd9, + 0xd0, 0xeb, 0x49, 0x65, 0xa6, 0x04, 0xde, 0x02, 0x55, 0x8f, 0xe0, 0x98, 0xd8, 0x5d, 0xd6, 0x31, + 0x45, 0x53, 0x26, 0x85, 0x5d, 0x4e, 0xd8, 0xe2, 0xeb, 0x5a, 0xc1, 0xd3, 0x10, 0xdf, 0xb3, 0x54, + 0x60, 0x63, 0x0c, 0x1e, 0x13, 0x54, 0x31, 0xed, 0x59, 0x48, 0x58, 0x82, 0xa0, 0xf7, 0xec, 0xa5, + 0x18, 0x1f, 0x0b, 0xf6, 0x70, 0xd4, 0x43, 0xc0, 0x34, 0x96, 0x16, 0x5f, 0xd2, 0x63, 0x11, 0x44, + 0xb8, 0x0e, 0x26, 0x0e, 0x45, 0xe4, 0x90, 0x23, 0x4a, 0x16, 0x8c, 0x33, 0x97, 0xa9, 0xb4, 0x14, + 0x15, 0xb6, 0x40, 0x55, 0x24, 0x8e, 0xf8, 0xf8, 0xc0, 0x23, 0xe8, 0x87, 0xf1, 0x83, 0xb5, 0x18, + 0x63, 0x53, 0x10, 0xf4, 0x76, 0xb1, 0x86, 0x60, 0x1b, 0x88, 0x7c, 0xda, 0x8e, 0x1b, 0x0b, 0x8d, + 0x5f, 0x93, 0xa6, 0xfd, 0x72, 0x8d, 0xb6, 0x64, 0xe8, 0xfd, 0xe2, 0x14, 0x83, 0x77, 0xa4, 0x0a, + 0xf1, 0xa9, 0xdb, 0xc1, 0x94, 0xa0, 0xdf, 0x52, 0xe5, 0x52, 0x5e, 0x25, 0xc9, 0x7d, 0x2b, 0x43, + 0x4d, 0xe4, 0x72, 0xf5, 0x70, 0x53, 0x1d, 0x25, 0x7e, 0xb6, 0x6c, 0xec, 0x38, 0xe8, 0xed, 0x54, + 0x51, 0x5b, 0x77, 0xd9, 0x5b, 0xcb, 0x71, 0x72, 0x6d, 0x29, 0x8c, 0xb5, 0x35, 0x93, 0xca, 0xc8, + 0x4c, 0xa2, 0x77, 0x52, 0x69, 0xc5, 0xac, 0xa4, 0xc2, 0xac, 0xc4, 0xea, 0x38, 0x07, 0xe7, 0xdb, + 0xea, 0x12, 0x8a, 0xde, 0x9f, 0xd9, 0xd6, 0x16, 0xa1, 0x43, 0x6d, 0x31, 0x0c, 0x76, 0xc1, 0x7f, + 0xa9, 0x4c, 0xe7, 0x90, 0x9f, 0x12, 0x3b, 0xc4, 0x71, 0xfc, 0x34, 0x88, 0x1c, 0xf4, 0x41, 0x4a, + 0x5e, 0x31, 0x4b, 0x6e, 0x08, 0xf6, 0x9e, 0x22, 0x27, 0xea, 0xff, 0x60, 0xe3, 0x32, 0xbc, 0x07, + 0xe6, 0x32, 0xfd, 0xf2, 0x78, 0xdb, 0x51, 0xc0, 0x86, 0x7c, 0x2a, 0x3d, 0xce, 0x17, 0xb4, 0x2d, + 0x8e, 0x46, 0x90, 0x8e, 0xfa, 0x6f, 0x3c, 0xb8, 0x02, 0xef, 0x83, 0xf9, 0x54, 0x59, 0x9e, 0x14, + 0x29, 0xfd, 0x51, 0x4a, 0x5f, 0x30, 0x4b, 0xab, 0x23, 0x93, 0xd1, 0x86, 0x78, 0x68, 0x09, 0x6e, + 0x83, 0x7a, 0x2a, 0xee, 0xb9, 0x31, 0x45, 0x9f, 0xa4, 0xea, 0xb2, 0x59, 0x75, 0x97, 0x51, 0x72, + 0x39, 0x4a, 0x40, 0xad, 0xc4, 0x5b, 0x93, 0x4a, 0x9f, 0x0b, 0x95, 0xb8, 0xf5, 0x90, 0x52, 0x02, + 0xea, 0xd1, 0x0b, 0x25, 0x9e, 0xc8, 0x17, 0x95, 0xa2, 0xd1, 0xf3, 0x9a, 0xc1, 0x44, 0x2a, 0x4c, + 0x27, 0x52, 0xc8, 0xa8, 0x44, 0xbe, 0xac, 0x14, 0x25, 0x92, 0x57, 0x19, 0x12, 0x99, 0xc2, 0xf9, + 0xb6, 0x78, 0x22, 0x5f, 0x9d, 0xd9, 0xd6, 0x60, 0x22, 0x15, 0x06, 0x1f, 0x81, 0x46, 0x46, 0x46, + 0x04, 0x25, 0x24, 0x51, 0xcf, 0x8d, 0xc5, 0x3d, 0xf6, 0x5a, 0x6a, 0x5e, 0x2d, 0xd0, 0xe4, 0xf4, + 0x3d, 0xcd, 0x4e, 0xf4, 0xff, 0xc5, 0xe6, 0x75, 0xd8, 0x03, 0x0b, 0xa9, 0x97, 0x8a, 0x4e, 0xc6, + 0xec, 0x8d, 0x34, 0xbb, 0x66, 0x36, 0x93, 0x29, 0x19, 0x76, 0x43, 0xb8, 0x80, 0xd0, 0xfc, 0x0b, + 0x4c, 0x6f, 0xf6, 0x42, 0xfa, 0xcc, 0x22, 0x71, 0x18, 0xf8, 0x31, 0x69, 0x86, 0x60, 0xe1, 0x8c, + 0x3f, 0x44, 0x10, 0x82, 0x31, 0x71, 0xbb, 0x97, 0xc4, 0xed, 0x2e, 0x9e, 0xf9, 0xad, 0xaf, 0xcf, + 0xa7, 0xba, 0xf5, 0x93, 0x77, 0xb8, 0x0c, 0x6a, 0xb1, 0xdb, 0x0b, 0xd9, 0x5e, 0x28, 0x33, 0x96, + 0x97, 0x7e, 0xc5, 0xaa, 0x4a, 0x6c, 0x9f, 0x43, 0xb7, 0xe7, 0x4e, 0xbe, 0x2e, 0x8e, 0x9c, 0x7c, + 0x5b, 0x2c, 0x9d, 0xb2, 0xdf, 0x17, 0xf6, 0x7b, 0xfe, 0x7d, 0x71, 0xe4, 0x60, 0x42, 0xfc, 0xcb, + 0xb1, 0xfe, 0x27, 0x00, 0x00, 0xff, 0xff, 0x02, 0x23, 0xd2, 0x00, 0xca, 0x08, 0x00, 0x00, } diff --git a/vendor/github.com/coreos/etcd/etcdserver/etcdserverpb/raft_internal.proto b/vendor/github.com/coreos/etcd/etcdserver/etcdserverpb/raft_internal.proto index 3ad0d1b..25d45d3 100644 --- a/vendor/github.com/coreos/etcd/etcdserver/etcdserverpb/raft_internal.proto +++ b/vendor/github.com/coreos/etcd/etcdserver/etcdserverpb/raft_internal.proto @@ -14,6 +14,8 @@ message RequestHeader { uint64 ID = 1; // username is a username that is associated with an auth token of gRPC connection string username = 2; + // auth_revision is a revision number of auth.authStore. It is not related to mvcc + uint64 auth_revision = 3; } // An InternalRaftRequest is the union of all requests which can be diff --git a/vendor/github.com/coreos/etcd/etcdserver/etcdserverpb/rpc.pb.go b/vendor/github.com/coreos/etcd/etcdserver/etcdserverpb/rpc.pb.go index ad07392..65a7206 100644 --- a/vendor/github.com/coreos/etcd/etcdserver/etcdserverpb/rpc.pb.go +++ b/vendor/github.com/coreos/etcd/etcdserver/etcdserverpb/rpc.pb.go @@ -7,7 +7,7 @@ package etcdserverpb import ( "fmt" - proto "github.com/gogo/protobuf/proto" + proto "github.com/golang/protobuf/proto" math "math" @@ -15407,207 +15407,209 @@ var ( ) var fileDescriptorRpc = []byte{ - // 3218 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xb4, 0x3a, 0xcd, 0x6f, 0x1b, 0xd7, - 0xf1, 0x5e, 0x92, 0x22, 0xc5, 0x21, 0x45, 0xcb, 0x4f, 0xb2, 0x43, 0xad, 0x65, 0x59, 0x7e, 0xfe, - 0x4c, 0x9c, 0x88, 0xbf, 0x28, 0xf9, 0xf5, 0xd0, 0x16, 0x01, 0x28, 0x91, 0x71, 0x54, 0x29, 0x92, - 0xb3, 0xa2, 0x95, 0x14, 0x08, 0x2a, 0xac, 0xc8, 0xb5, 0x44, 0x88, 0x5f, 0xd9, 0x5d, 0xca, 0x56, - 0xda, 0x02, 0x45, 0xd0, 0x1c, 0xda, 0x63, 0x73, 0x28, 0x9a, 0x1e, 0xfb, 0x37, 0xf4, 0xd6, 0x3f, - 0xa0, 0xe8, 0xa5, 0x01, 0x7a, 0xec, 0xa5, 0x28, 0x7a, 0xe8, 0xa1, 0xf7, 0xa2, 0xa7, 0xf6, 0x7d, - 0xee, 0xbe, 0x5d, 0xbe, 0xa5, 0x94, 0x6e, 0x73, 0xb0, 0xb5, 0x6f, 0xde, 0xbc, 0x99, 0x79, 0xf3, - 0x66, 0xe6, 0xcd, 0xcc, 0x23, 0x14, 0xdd, 0x51, 0x7b, 0x6d, 0xe4, 0x0e, 0xfd, 0x21, 0x2a, 0x3b, - 0x7e, 0xbb, 0xe3, 0x39, 0xee, 0x99, 0xe3, 0x8e, 0x8e, 0xcc, 0xc5, 0xe3, 0xe1, 0xf1, 0x90, 0x4d, - 0xd4, 0xe8, 0x17, 0xc7, 0x31, 0x97, 0x28, 0x4e, 0xad, 0x7f, 0xd6, 0x6e, 0xb3, 0xff, 0x46, 0x47, - 0xb5, 0xd3, 0x33, 0x31, 0x75, 0x93, 0x4d, 0xd9, 0x63, 0xff, 0x84, 0xfd, 0x47, 0xa6, 0xe8, 0x1f, - 0x31, 0xb9, 0x7c, 0x3c, 0x1c, 0x1e, 0xf7, 0x9c, 0x9a, 0x3d, 0xea, 0xd6, 0xec, 0xc1, 0x60, 0xe8, - 0xdb, 0x7e, 0x77, 0x38, 0xf0, 0xf8, 0x2c, 0xfe, 0xdc, 0x80, 0x8a, 0xe5, 0x78, 0x23, 0x02, 0x71, - 0xde, 0x73, 0xec, 0x8e, 0xe3, 0xa2, 0x5b, 0x00, 0xed, 0xde, 0xd8, 0xf3, 0x1d, 0xf7, 0xb0, 0xdb, - 0xa9, 0x1a, 0xab, 0xc6, 0xa3, 0x9c, 0x55, 0x14, 0x90, 0xad, 0x0e, 0xba, 0x09, 0xc5, 0xbe, 0xd3, - 0x3f, 0xe2, 0xb3, 0x19, 0x36, 0x3b, 0xcb, 0x01, 0x64, 0xd2, 0x84, 0x59, 0xd7, 0x39, 0xeb, 0x7a, - 0x84, 0x43, 0x35, 0x4b, 0xe6, 0xb2, 0x56, 0x30, 0xa6, 0x0b, 0x5d, 0xfb, 0xb9, 0x7f, 0x48, 0xc8, - 0xf4, 0xab, 0x39, 0xbe, 0x90, 0x02, 0x5a, 0x64, 0x8c, 0xbf, 0xca, 0x42, 0xd9, 0xb2, 0x07, 0xc7, - 0x8e, 0xe5, 0x7c, 0x32, 0x76, 0x3c, 0x1f, 0xcd, 0x43, 0xf6, 0xd4, 0x39, 0x67, 0xec, 0xcb, 0x16, - 0xfd, 0xe4, 0xeb, 0x09, 0xc6, 0xa1, 0x33, 0xe0, 0x8c, 0xcb, 0x74, 0x3d, 0x01, 0x34, 0x07, 0x1d, - 0xb4, 0x08, 0x33, 0xbd, 0x6e, 0xbf, 0xeb, 0x0b, 0xae, 0x7c, 0x10, 0x11, 0x27, 0x17, 0x13, 0x67, - 0x13, 0xc0, 0x1b, 0xba, 0xfe, 0xe1, 0xd0, 0x25, 0x9b, 0xae, 0xce, 0x90, 0xd9, 0xca, 0xfa, 0xbd, - 0x35, 0xf5, 0x20, 0xd6, 0x54, 0x81, 0xd6, 0xf6, 0x09, 0xf2, 0x1e, 0xc5, 0xb5, 0x8a, 0x9e, 0xfc, - 0x44, 0xef, 0x42, 0x89, 0x11, 0xf1, 0x6d, 0xf7, 0xd8, 0xf1, 0xab, 0x79, 0x46, 0xe5, 0xfe, 0x05, - 0x54, 0x5a, 0x0c, 0xd9, 0x62, 0xec, 0xf9, 0x37, 0xc2, 0x50, 0x26, 0xf8, 0x5d, 0xbb, 0xd7, 0xfd, - 0xd4, 0x3e, 0xea, 0x39, 0xd5, 0x02, 0x21, 0x34, 0x6b, 0x45, 0x60, 0x74, 0xff, 0x44, 0x0d, 0xde, - 0xe1, 0x70, 0xd0, 0x3b, 0xaf, 0xce, 0x32, 0x84, 0x59, 0x0a, 0xd8, 0x23, 0x63, 0x76, 0x68, 0xc3, - 0xf1, 0xc0, 0xe7, 0xb3, 0x45, 0x36, 0x5b, 0x64, 0x10, 0x3a, 0x8d, 0xd7, 0xa0, 0x18, 0xc8, 0x8f, - 0x66, 0x21, 0xb7, 0xbb, 0xb7, 0xdb, 0x9c, 0xbf, 0x82, 0x00, 0xf2, 0xf5, 0xfd, 0xcd, 0xe6, 0x6e, - 0x63, 0xde, 0x40, 0x25, 0x28, 0x34, 0x9a, 0x7c, 0x90, 0xc1, 0x1b, 0x00, 0xa1, 0xa4, 0xa8, 0x00, - 0xd9, 0xed, 0xe6, 0xf7, 0x09, 0x3e, 0xc1, 0x39, 0x68, 0x5a, 0xfb, 0x5b, 0x7b, 0xbb, 0x64, 0x01, - 0x59, 0xbc, 0x69, 0x35, 0xeb, 0xad, 0xe6, 0x7c, 0x86, 0x62, 0xbc, 0xbf, 0xd7, 0x98, 0xcf, 0xa2, - 0x22, 0xcc, 0x1c, 0xd4, 0x77, 0x9e, 0x35, 0xe7, 0x73, 0xf8, 0x0b, 0x03, 0xe6, 0xc4, 0xde, 0xb9, - 0x7d, 0xa1, 0xb7, 0x21, 0x7f, 0xc2, 0x6c, 0x8c, 0x1d, 0x6b, 0x69, 0x7d, 0x39, 0xa6, 0xa8, 0x88, - 0x1d, 0x5a, 0x02, 0x97, 0xe8, 0x26, 0x7b, 0x7a, 0xe6, 0x91, 0x13, 0xcf, 0x92, 0x25, 0xf3, 0x6b, - 0xdc, 0xf8, 0xd7, 0xb6, 0x9d, 0xf3, 0x03, 0xbb, 0x37, 0x76, 0x2c, 0x3a, 0x89, 0x10, 0xe4, 0xfa, - 0x43, 0xd7, 0x61, 0xa7, 0x3f, 0x6b, 0xb1, 0x6f, 0x6a, 0x12, 0x4c, 0x01, 0xe2, 0xe4, 0xf9, 0x00, - 0xb7, 0x01, 0x9e, 0x8e, 0xfd, 0x64, 0x2b, 0x23, 0xab, 0xce, 0x28, 0x5d, 0x61, 0x61, 0x7c, 0xc0, - 0xcc, 0xcb, 0xb1, 0x3d, 0x27, 0x30, 0x2f, 0x3a, 0x40, 0xaf, 0x40, 0x61, 0x44, 0xec, 0xe9, 0xf0, - 0xf4, 0x8c, 0xf1, 0x98, 0xb5, 0xf2, 0x74, 0xb8, 0x7d, 0x86, 0x07, 0x50, 0x62, 0x4c, 0x52, 0xed, - 0xfb, 0xd5, 0x90, 0x7a, 0x86, 0x2d, 0x9b, 0xdc, 0xbb, 0xe4, 0xf7, 0x31, 0xa0, 0x86, 0xd3, 0x73, - 0x7c, 0x27, 0x8d, 0x0b, 0x29, 0xbb, 0xc9, 0x46, 0x76, 0xf3, 0x0b, 0x03, 0x16, 0x22, 0xe4, 0x53, - 0x6d, 0xab, 0x0a, 0x85, 0x0e, 0x23, 0xc6, 0x25, 0xc8, 0x5a, 0x72, 0x88, 0x1e, 0xc3, 0xac, 0x10, - 0xc0, 0x23, 0x12, 0xe8, 0x4f, 0xbb, 0xc0, 0x65, 0xf2, 0xf0, 0x3f, 0x0c, 0x28, 0x8a, 0x8d, 0xee, - 0x8d, 0x50, 0x1d, 0xe6, 0x5c, 0x3e, 0x38, 0x64, 0xfb, 0x11, 0x12, 0x99, 0xc9, 0x9e, 0xf8, 0xde, - 0x15, 0xab, 0x2c, 0x96, 0x30, 0x30, 0xfa, 0x0e, 0x94, 0x24, 0x89, 0xd1, 0xd8, 0x17, 0x2a, 0xaf, - 0x46, 0x09, 0x84, 0x96, 0x43, 0x96, 0x83, 0x40, 0x27, 0x40, 0xd4, 0x82, 0x45, 0xb9, 0x98, 0xef, - 0x46, 0x88, 0x91, 0x65, 0x54, 0x56, 0xa3, 0x54, 0x26, 0x8f, 0x8a, 0x50, 0x43, 0x62, 0xbd, 0x32, - 0xb9, 0x51, 0x84, 0x82, 0x80, 0xe2, 0x7f, 0x1a, 0x00, 0x52, 0xa1, 0x64, 0xbf, 0x0d, 0xa8, 0xb8, - 0x62, 0x14, 0xd9, 0xf0, 0x4d, 0xed, 0x86, 0xc5, 0x39, 0x5c, 0xb1, 0xe6, 0xe4, 0x22, 0xbe, 0xe5, - 0x77, 0xa0, 0x1c, 0x50, 0x09, 0xf7, 0xbc, 0xa4, 0xd9, 0x73, 0x40, 0xa1, 0x24, 0x17, 0xd0, 0x5d, - 0x7f, 0x08, 0xd7, 0x83, 0xf5, 0x9a, 0x6d, 0xdf, 0x99, 0xb2, 0xed, 0x80, 0xe0, 0x82, 0xa4, 0xa0, - 0x6e, 0x1c, 0x68, 0xdc, 0xe6, 0x60, 0xfc, 0x65, 0x16, 0x0a, 0x9b, 0xc3, 0xfe, 0xc8, 0x76, 0xe9, - 0x19, 0xe5, 0x09, 0x7c, 0xdc, 0xf3, 0xd9, 0x76, 0x2b, 0xeb, 0x77, 0xa3, 0x1c, 0x04, 0x9a, 0xfc, - 0x6b, 0x31, 0x54, 0x4b, 0x2c, 0xa1, 0x8b, 0x45, 0x98, 0xce, 0x5c, 0x62, 0xb1, 0x08, 0xd2, 0x62, - 0x89, 0xf4, 0xa5, 0x6c, 0xe8, 0x4b, 0x26, 0x14, 0xc8, 0xc2, 0xf0, 0x6a, 0x21, 0x7b, 0x91, 0x00, - 0xe2, 0xba, 0x57, 0xdb, 0xae, 0x63, 0x53, 0x7d, 0xc8, 0xeb, 0x67, 0x46, 0xe0, 0x54, 0xf8, 0x84, - 0x25, 0xaf, 0xa1, 0xbb, 0x50, 0xee, 0x0f, 0x3b, 0x21, 0x5e, 0x5e, 0xe0, 0x95, 0x08, 0x34, 0x40, - 0xba, 0x21, 0x83, 0x12, 0xbd, 0x17, 0xca, 0x64, 0x96, 0x0f, 0xf1, 0x9b, 0x30, 0x17, 0xd9, 0x2b, - 0x0d, 0xbf, 0xcd, 0x0f, 0x9e, 0xd5, 0x77, 0x78, 0xac, 0x7e, 0xc2, 0xc2, 0xb3, 0x45, 0x62, 0x35, - 0x09, 0xf9, 0x3b, 0xcd, 0xfd, 0x7d, 0x12, 0xd9, 0xbf, 0x1b, 0x2c, 0x11, 0xc1, 0x5d, 0x89, 0xe9, - 0x57, 0x94, 0x98, 0x6e, 0xc8, 0x98, 0x9e, 0x09, 0x63, 0x7a, 0x76, 0xa3, 0x02, 0x65, 0xae, 0x90, - 0xc3, 0xf1, 0x80, 0x08, 0x86, 0x7f, 0x43, 0xcc, 0xb2, 0xf5, 0x72, 0x20, 0x23, 0x4e, 0x0d, 0x0a, - 0x6d, 0x4e, 0x9c, 0x1c, 0x10, 0x75, 0xe0, 0xeb, 0x5a, 0x1d, 0x5b, 0x12, 0x0b, 0xbd, 0x09, 0x05, - 0x6f, 0xdc, 0x6e, 0x3b, 0x9e, 0x8c, 0xef, 0xaf, 0xc4, 0x63, 0x88, 0xf0, 0x70, 0x4b, 0xe2, 0xd1, - 0x25, 0xcf, 0xed, 0x6e, 0x6f, 0xcc, 0xa2, 0xfd, 0xf4, 0x25, 0x02, 0x0f, 0xff, 0xca, 0x80, 0x12, - 0x93, 0x32, 0x55, 0xe0, 0x5a, 0x86, 0x22, 0x93, 0xc1, 0xe9, 0x88, 0xd0, 0x45, 0x6e, 0xd8, 0x00, - 0x80, 0xbe, 0x45, 0x42, 0xab, 0x58, 0x27, 0xa3, 0x57, 0x55, 0x4f, 0x96, 0x48, 0x16, 0xa2, 0xe2, - 0x6d, 0xb8, 0xc6, 0xb4, 0xd2, 0xa6, 0x59, 0x99, 0xd4, 0xa3, 0x9a, 0xb7, 0x18, 0xb1, 0xbc, 0x85, - 0xcc, 0x8d, 0x4e, 0xce, 0xbd, 0x6e, 0xdb, 0xee, 0x09, 0x29, 0x82, 0x31, 0xfe, 0x1e, 0x20, 0x95, - 0x58, 0x9a, 0xed, 0xe2, 0x39, 0x28, 0xbd, 0x67, 0x7b, 0x27, 0x42, 0x24, 0xfc, 0x11, 0x94, 0xf9, - 0x30, 0x95, 0x0e, 0xc9, 0x3d, 0x7d, 0x42, 0xa8, 0x30, 0xc1, 0xe7, 0x2c, 0xf6, 0x8d, 0xaf, 0xc1, - 0xd5, 0xfd, 0x81, 0x3d, 0xf2, 0x4e, 0x86, 0x32, 0xb8, 0xd2, 0xac, 0x74, 0x3e, 0x84, 0xa5, 0xe2, - 0xf8, 0x10, 0xae, 0xba, 0x4e, 0xdf, 0xee, 0x0e, 0xba, 0x83, 0xe3, 0xc3, 0xa3, 0x73, 0xdf, 0xf1, - 0x44, 0xd2, 0x5a, 0x09, 0xc0, 0x1b, 0x14, 0x4a, 0x45, 0x3b, 0xea, 0x0d, 0x8f, 0x84, 0x8b, 0xb3, - 0x6f, 0xfc, 0x5b, 0x03, 0xca, 0x1f, 0xda, 0x7e, 0x5b, 0x6a, 0x01, 0x6d, 0x41, 0x25, 0x70, 0x6c, - 0x06, 0x11, 0xb2, 0xc4, 0x22, 0x3c, 0x5b, 0xb3, 0x29, 0x1c, 0x5d, 0x46, 0xf8, 0xb9, 0xb6, 0x0a, - 0x60, 0xa4, 0xec, 0x41, 0xdb, 0xe9, 0x05, 0xa4, 0x32, 0xc9, 0xa4, 0x18, 0xa2, 0x4a, 0x4a, 0x05, - 0x6c, 0x5c, 0x0d, 0x6f, 0x3f, 0xee, 0x96, 0x5f, 0x66, 0x00, 0x4d, 0xca, 0xf0, 0x75, 0x13, 0x82, - 0xfb, 0x50, 0xf1, 0x88, 0xb7, 0xfb, 0x87, 0xb1, 0x94, 0x7e, 0x8e, 0x41, 0x83, 0xe0, 0x44, 0x34, - 0x4c, 0x6a, 0x89, 0x63, 0x62, 0xd2, 0xde, 0x21, 0x29, 0x2f, 0xba, 0xcf, 0xcf, 0x45, 0x36, 0x54, - 0x91, 0xe0, 0x5d, 0x06, 0x45, 0x4d, 0xe2, 0xb9, 0xdd, 0x1e, 0x49, 0xff, 0x3d, 0x12, 0x0d, 0xb3, - 0x24, 0x02, 0x3f, 0xbe, 0x48, 0x6b, 0x6b, 0xef, 0x32, 0xfc, 0xd6, 0xf9, 0x88, 0xc4, 0x0c, 0xb1, - 0x56, 0xcd, 0x53, 0xf2, 0x91, 0x3c, 0xe5, 0x3e, 0x40, 0x88, 0x4f, 0xa3, 0xd6, 0xee, 0xde, 0xd3, - 0x67, 0x2d, 0x12, 0xd5, 0xca, 0x30, 0xbb, 0xbb, 0xd7, 0x68, 0xee, 0x34, 0x69, 0x5c, 0xc3, 0x35, - 0xa9, 0x1b, 0x55, 0x87, 0x68, 0x09, 0x66, 0x5f, 0x50, 0xa8, 0xac, 0x79, 0x48, 0x5e, 0xc2, 0xc6, - 0x5b, 0x1d, 0xfc, 0x77, 0x92, 0xc8, 0x0a, 0x2b, 0x48, 0x65, 0x8a, 0x2a, 0x8b, 0x4c, 0x84, 0x05, - 0x4d, 0x8a, 0xb8, 0x75, 0x74, 0x44, 0xee, 0x25, 0x87, 0xd4, 0xdd, 0xf9, 0x61, 0x93, 0x29, 0xae, - 0xd6, 0x60, 0x4c, 0xae, 0x99, 0xf9, 0x36, 0x77, 0xf7, 0xd8, 0x3d, 0x63, 0x5d, 0x15, 0xf0, 0xe0, - 0x90, 0xee, 0x43, 0xde, 0x39, 0x73, 0x06, 0xbe, 0x57, 0x2d, 0xb1, 0xd8, 0x34, 0x27, 0x33, 0xab, - 0x26, 0x85, 0x5a, 0x62, 0x12, 0xff, 0x3f, 0x5c, 0xdb, 0xa1, 0xa9, 0xed, 0x13, 0x62, 0x04, 0x6a, - 0x92, 0xdc, 0x6a, 0xed, 0x08, 0xad, 0x64, 0xfd, 0xd6, 0x0e, 0xaa, 0x40, 0x66, 0xab, 0x21, 0xf6, - 0x90, 0xe9, 0x36, 0xf0, 0x67, 0x06, 0x20, 0x75, 0x5d, 0x2a, 0x35, 0xc5, 0x88, 0x4b, 0xf6, 0xd9, - 0x90, 0x3d, 0xc9, 0xc6, 0x1d, 0xd7, 0x1d, 0xba, 0x4c, 0x21, 0x45, 0x8b, 0x0f, 0xf0, 0x3d, 0x21, - 0x03, 0xd9, 0xf3, 0xf0, 0x34, 0xb0, 0x79, 0x4e, 0xcd, 0x08, 0x44, 0xdd, 0x86, 0x85, 0x08, 0x56, - 0xaa, 0x18, 0xf9, 0x10, 0xae, 0x33, 0x62, 0xdb, 0x8e, 0x33, 0xaa, 0xf7, 0xba, 0x67, 0x89, 0x5c, - 0x47, 0x70, 0x23, 0x8e, 0xf8, 0xcd, 0xea, 0x08, 0x9f, 0x40, 0xfe, 0x7d, 0x56, 0x95, 0x2b, 0xb2, - 0xe4, 0x18, 0x2e, 0x09, 0x74, 0x03, 0xbb, 0xcf, 0x0b, 0x9c, 0xa2, 0xc5, 0xbe, 0xd9, 0xa5, 0xe2, - 0x38, 0xee, 0x33, 0x6b, 0x87, 0x5f, 0x5e, 0x45, 0x2b, 0x18, 0xa3, 0x15, 0xda, 0x0f, 0xe8, 0x12, - 0xf3, 0x60, 0xb3, 0x39, 0x36, 0xab, 0x40, 0x48, 0x6d, 0x39, 0xcf, 0x39, 0xd5, 0x3b, 0x1d, 0xe5, - 0x02, 0x0b, 0xe8, 0x19, 0x51, 0x7a, 0xf8, 0x05, 0x5c, 0x53, 0xf0, 0x53, 0xa9, 0xe1, 0x75, 0xc8, - 0xf3, 0xd6, 0x83, 0x88, 0x9d, 0x8b, 0xd1, 0x55, 0x9c, 0x8d, 0x25, 0x70, 0x48, 0x7c, 0x58, 0x10, - 0x10, 0xa7, 0x3f, 0xd4, 0x9d, 0x15, 0xd3, 0x0f, 0xde, 0x81, 0xc5, 0x28, 0x5a, 0x2a, 0x13, 0xa9, - 0x4b, 0xa6, 0xcf, 0x46, 0x1d, 0x25, 0x14, 0xc7, 0x0f, 0x45, 0x55, 0x58, 0x26, 0xa6, 0xb0, 0x40, - 0x20, 0x49, 0x22, 0x95, 0x40, 0x0b, 0x52, 0xfd, 0x3b, 0x5d, 0x2f, 0xb8, 0x70, 0x3f, 0x05, 0xa4, - 0x02, 0x53, 0x1d, 0xca, 0x1a, 0x14, 0xb8, 0xc2, 0x65, 0x4e, 0xa7, 0x3f, 0x15, 0x89, 0x44, 0x05, - 0x6a, 0x38, 0xcf, 0x5d, 0xfb, 0xb8, 0xef, 0x04, 0x31, 0x87, 0x66, 0x32, 0x2a, 0x30, 0xd5, 0x8e, - 0xff, 0x48, 0x6e, 0xf1, 0x7a, 0xcf, 0x76, 0xfb, 0x52, 0xf9, 0xef, 0x40, 0x9e, 0xa7, 0x48, 0xa2, - 0x8c, 0x78, 0x10, 0x25, 0xa3, 0xe2, 0xf2, 0x41, 0x9d, 0x27, 0x54, 0x62, 0x15, 0x3d, 0x2c, 0xd1, - 0xf1, 0x6a, 0xc4, 0x3a, 0x60, 0x0d, 0xf4, 0x06, 0xcc, 0xd8, 0x74, 0x09, 0xf3, 0xc5, 0x4a, 0x3c, - 0x39, 0x65, 0xd4, 0xd8, 0x75, 0xc6, 0xb1, 0xf0, 0xdb, 0x50, 0x52, 0x38, 0xd0, 0x9c, 0xfb, 0x49, - 0x53, 0x5c, 0x59, 0xf5, 0xcd, 0xd6, 0xd6, 0x01, 0x4f, 0xc5, 0x2b, 0x00, 0x8d, 0x66, 0x30, 0xce, - 0x90, 0x64, 0x8c, 0xaf, 0x12, 0x1e, 0xae, 0xca, 0x63, 0x24, 0xc9, 0x93, 0xb9, 0x94, 0x3c, 0x2f, - 0x61, 0x4e, 0x6c, 0x3f, 0x95, 0x0d, 0xbc, 0x49, 0x34, 0x4c, 0xc9, 0x48, 0x13, 0x58, 0xd2, 0xb0, - 0x95, 0xde, 0xc9, 0x11, 0x31, 0x49, 0x62, 0xf6, 0x7d, 0xdb, 0x1f, 0x7b, 0xd2, 0x04, 0xfe, 0x60, - 0x40, 0x45, 0x42, 0xd2, 0x76, 0x1c, 0x64, 0xa5, 0xc6, 0x63, 0x5e, 0x50, 0xa7, 0xdd, 0x80, 0x7c, - 0xe7, 0x68, 0xbf, 0xfb, 0xa9, 0xec, 0xeb, 0x88, 0x11, 0x85, 0xf7, 0x38, 0x1f, 0xde, 0xa7, 0x14, - 0x23, 0x5a, 0x02, 0xd0, 0x8e, 0xe5, 0xd6, 0xa0, 0xe3, 0xbc, 0x64, 0x37, 0x6d, 0xce, 0x0a, 0x01, - 0x2c, 0x6b, 0x17, 0xfd, 0x4c, 0x96, 0x99, 0xa8, 0xfd, 0x4d, 0x62, 0xe4, 0xf5, 0xb1, 0x7f, 0xd2, - 0x1c, 0xd0, 0x56, 0x9e, 0xdc, 0xe1, 0x22, 0x20, 0x0a, 0x6c, 0x74, 0x3d, 0x15, 0xda, 0x84, 0x05, - 0x0a, 0x25, 0x76, 0x4f, 0x72, 0xfa, 0x30, 0x62, 0xc8, 0xb0, 0x6d, 0xc4, 0xc2, 0xb6, 0xed, 0x79, - 0x2f, 0x86, 0x6e, 0x47, 0x6c, 0x2d, 0x18, 0xe3, 0x06, 0x27, 0xfe, 0xcc, 0x8b, 0x04, 0xe6, 0xaf, - 0x4b, 0xe5, 0x51, 0x48, 0xe5, 0x89, 0xe3, 0x4f, 0xa1, 0x82, 0x1f, 0xc3, 0x75, 0x89, 0x29, 0x4a, - 0xf9, 0x29, 0xc8, 0x7b, 0x70, 0x4b, 0x22, 0x6f, 0x9e, 0xd0, 0x7c, 0xf3, 0xa9, 0x60, 0xf8, 0xdf, - 0xca, 0xb9, 0x01, 0xd5, 0x40, 0x4e, 0x96, 0x83, 0x0c, 0x7b, 0xaa, 0x00, 0x63, 0x4f, 0xd8, 0x0c, - 0xa1, 0x45, 0xbf, 0x29, 0xcc, 0x25, 0x28, 0xf2, 0x12, 0xa4, 0xdf, 0x78, 0x13, 0x96, 0x24, 0x0d, - 0x91, 0x1d, 0x44, 0x89, 0x4c, 0x08, 0xa4, 0x23, 0x22, 0x14, 0x46, 0x97, 0x4e, 0x57, 0xbb, 0x8a, - 0x19, 0x55, 0x2d, 0xa3, 0x69, 0x28, 0x34, 0xaf, 0x73, 0x8b, 0xa0, 0x82, 0xa9, 0x41, 0x5b, 0x80, - 0x29, 0x01, 0x15, 0x2c, 0x0e, 0x82, 0x82, 0x27, 0x0e, 0x62, 0x82, 0xf4, 0xc7, 0xb0, 0x12, 0x08, - 0x41, 0xf5, 0xf6, 0x94, 0x18, 0x6b, 0xd7, 0xf3, 0x94, 0x5a, 0x54, 0xb7, 0xf1, 0x07, 0x90, 0x1b, - 0x39, 0x22, 0xa6, 0x94, 0xd6, 0xd1, 0x1a, 0x7f, 0x75, 0x58, 0x53, 0x16, 0xb3, 0x79, 0xdc, 0x81, - 0xdb, 0x92, 0x3a, 0xd7, 0xa8, 0x96, 0x7c, 0x5c, 0x28, 0x59, 0xa7, 0x70, 0xb5, 0x4e, 0xd6, 0x29, - 0x59, 0x7e, 0xf6, 0xb2, 0x4e, 0xa1, 0x77, 0x85, 0xea, 0x5b, 0xa9, 0xee, 0x8a, 0x6d, 0xae, 0xd3, - 0xc0, 0x25, 0x53, 0x11, 0x3b, 0x82, 0xc5, 0xa8, 0x27, 0xa7, 0x0a, 0x63, 0x24, 0xeb, 0xf5, 0x89, - 0x0a, 0x65, 0x10, 0xe3, 0x03, 0x29, 0x70, 0xe0, 0xe6, 0xa9, 0x04, 0xb6, 0x43, 0x62, 0xcc, 0x24, - 0xd3, 0xca, 0x4b, 0x4f, 0x53, 0xe6, 0x33, 0x7c, 0x80, 0x77, 0xe1, 0x46, 0x3c, 0x4c, 0xa4, 0x12, - 0xf9, 0x80, 0x1b, 0xb0, 0x2e, 0x92, 0xa4, 0xa2, 0xfb, 0x41, 0x18, 0x0c, 0x94, 0x80, 0x92, 0x8a, - 0xa4, 0x05, 0xa6, 0x2e, 0xbe, 0xfc, 0x2f, 0xec, 0x35, 0x08, 0x37, 0xa9, 0x88, 0x79, 0x21, 0xb1, - 0xf4, 0xc7, 0x1f, 0xc6, 0x88, 0xec, 0xd4, 0x18, 0x21, 0x9c, 0x24, 0x8c, 0x62, 0xdf, 0x80, 0xd1, - 0x09, 0x1e, 0x61, 0x00, 0x4d, 0xcb, 0x83, 0xde, 0x21, 0x01, 0x0f, 0x36, 0x90, 0x86, 0xad, 0x86, - 0xdd, 0x54, 0x87, 0xf1, 0x61, 0x18, 0x3b, 0x27, 0x22, 0x73, 0x2a, 0xc2, 0x1f, 0xc1, 0x6a, 0x72, - 0x50, 0x4e, 0x43, 0xf9, 0x35, 0x0c, 0xc5, 0x20, 0xa1, 0x54, 0x5e, 0x19, 0x4b, 0x50, 0xd8, 0xdd, - 0xdb, 0x7f, 0x5a, 0xdf, 0x24, 0xa9, 0xec, 0xfa, 0x9f, 0xb3, 0x90, 0xd9, 0x3e, 0x40, 0x3f, 0x80, - 0x19, 0xfe, 0x06, 0x31, 0xe5, 0x89, 0xc6, 0x9c, 0xf6, 0x9a, 0x81, 0x97, 0x3f, 0xfb, 0xd3, 0xdf, - 0xbe, 0xc8, 0xdc, 0xc0, 0xd7, 0x6a, 0x67, 0x6f, 0xd9, 0xbd, 0xd1, 0x89, 0x5d, 0x3b, 0x3d, 0xab, - 0xb1, 0x3b, 0xe1, 0xdb, 0xc6, 0x6b, 0xe8, 0x00, 0xb2, 0xf4, 0x85, 0x22, 0xf1, 0xfd, 0xc6, 0x4c, - 0x7e, 0xe5, 0xc0, 0x26, 0xa3, 0xbc, 0x88, 0xaf, 0xaa, 0x94, 0x47, 0x63, 0x9f, 0xd2, 0x6d, 0x41, - 0x49, 0x79, 0xa8, 0x40, 0x17, 0xbe, 0xec, 0x98, 0x17, 0x3f, 0x82, 0xe0, 0x2b, 0x54, 0xda, 0xd6, - 0xcb, 0x41, 0x5c, 0xda, 0xb0, 0xb1, 0x1e, 0x97, 0x56, 0x69, 0x66, 0xeb, 0xa5, 0xf5, 0x5f, 0x0e, - 0xa8, 0xb4, 0x43, 0xf1, 0x74, 0xd2, 0xf6, 0xd1, 0x6d, 0x4d, 0x27, 0x5e, 0xed, 0x39, 0x9b, 0xab, - 0xc9, 0x08, 0x82, 0xd3, 0x1d, 0xc6, 0xe9, 0x26, 0xbe, 0xa1, 0x72, 0x6a, 0x07, 0x78, 0x84, 0xe1, - 0xfa, 0x09, 0xcc, 0xb0, 0x4e, 0x19, 0x3a, 0x94, 0x1f, 0xa6, 0xa6, 0xc7, 0x97, 0x70, 0xbe, 0x91, - 0x1e, 0x1b, 0x5e, 0x62, 0xdc, 0x16, 0x70, 0x25, 0xe0, 0xc6, 0x9a, 0x65, 0x84, 0xcb, 0x23, 0xe3, - 0xff, 0x8c, 0xf5, 0x7f, 0x65, 0x60, 0x86, 0xb5, 0x54, 0xd0, 0x08, 0x20, 0xec, 0x3d, 0xc5, 0xf7, - 0x39, 0xd1, 0xcd, 0x8a, 0xef, 0x73, 0xb2, 0x6d, 0x85, 0x6f, 0x33, 0xce, 0x4b, 0x78, 0x31, 0xe0, - 0xcc, 0x9e, 0x7b, 0x6b, 0xc7, 0x14, 0x8b, 0xaa, 0xf5, 0x05, 0x94, 0x94, 0x1e, 0x12, 0xd2, 0x51, - 0x8c, 0x34, 0xa1, 0xe2, 0x46, 0xa0, 0x69, 0x40, 0xe1, 0xbb, 0x8c, 0xe9, 0x2d, 0x5c, 0x55, 0x95, - 0xcb, 0xf9, 0xba, 0x0c, 0x93, 0x32, 0xfe, 0x29, 0x29, 0x89, 0xa2, 0x7d, 0x24, 0x74, 0x57, 0x43, - 0x3a, 0xde, 0x8e, 0x32, 0xef, 0x4d, 0x47, 0x4a, 0x14, 0x81, 0xf3, 0x3f, 0x25, 0x98, 0x36, 0xc5, - 0x94, 0xba, 0xff, 0x37, 0x7d, 0x92, 0xe3, 0x3f, 0x08, 0x41, 0x3e, 0x14, 0x83, 0x6e, 0x0e, 0x5a, - 0xd1, 0x55, 0xfa, 0x61, 0x1a, 0x6c, 0xde, 0x4e, 0x9c, 0x17, 0x22, 0x3c, 0x60, 0x22, 0xac, 0xe2, - 0x9b, 0x81, 0x08, 0xe2, 0x87, 0x27, 0x35, 0x5e, 0xd0, 0xd6, 0xec, 0x4e, 0x87, 0x2a, 0xe2, 0x27, - 0xa4, 0xa4, 0x57, 0x9b, 0x34, 0xe8, 0x8e, 0xb6, 0xc7, 0xa0, 0xf6, 0x79, 0x4c, 0x3c, 0x0d, 0x45, - 0xf0, 0x7f, 0x95, 0xf1, 0xbf, 0x8b, 0x57, 0x92, 0xf8, 0xbb, 0x0c, 0x3f, 0x2a, 0x02, 0x6f, 0xcb, - 0xe8, 0x45, 0x88, 0x74, 0x7d, 0xf4, 0x22, 0x44, 0xbb, 0x3a, 0x17, 0x8b, 0x30, 0x66, 0xf8, 0x54, - 0x84, 0x97, 0x00, 0x61, 0xd7, 0x06, 0x69, 0x95, 0xab, 0x14, 0x06, 0x71, 0xcb, 0x9f, 0x6c, 0xf8, - 0xe0, 0x87, 0x8c, 0xf7, 0x1d, 0xbc, 0x9c, 0xc4, 0xbb, 0x47, 0xb0, 0xa9, 0x9f, 0xff, 0x2e, 0x07, - 0xa5, 0xf7, 0xed, 0xee, 0xc0, 0x77, 0x06, 0xb4, 0x19, 0x8d, 0x8e, 0x61, 0x86, 0x45, 0xfe, 0xb8, - 0xbb, 0xab, 0xad, 0x94, 0xb8, 0xbb, 0x47, 0xfa, 0x0c, 0xf8, 0x3e, 0x63, 0x7d, 0x1b, 0x9b, 0x01, - 0xeb, 0x7e, 0x48, 0xbf, 0xc6, 0x7a, 0x04, 0x74, 0xcb, 0xa7, 0x90, 0xe7, 0x3d, 0x01, 0x14, 0xa3, - 0x16, 0xe9, 0x1d, 0x98, 0xcb, 0xfa, 0xc9, 0x44, 0x2b, 0x53, 0x79, 0x79, 0x0c, 0x99, 0x32, 0xfb, - 0x21, 0x40, 0xd8, 0x84, 0x8a, 0xeb, 0x77, 0xa2, 0x67, 0x65, 0xae, 0x26, 0x23, 0x08, 0xc6, 0xaf, - 0x31, 0xc6, 0xf7, 0xf0, 0x6d, 0x2d, 0xe3, 0x4e, 0xb0, 0x80, 0x32, 0x6f, 0x43, 0x8e, 0x3e, 0xb8, - 0xa1, 0x58, 0xe8, 0x57, 0xde, 0xe4, 0x4c, 0x53, 0x37, 0x25, 0x58, 0xdd, 0x63, 0xac, 0x56, 0xf0, - 0x92, 0x96, 0x15, 0x7d, 0x78, 0xa3, 0x4c, 0xc6, 0x30, 0x2b, 0xdf, 0xd9, 0xd0, 0xad, 0x98, 0xce, - 0xa2, 0x6f, 0x72, 0xe6, 0x4a, 0xd2, 0xb4, 0x60, 0xf8, 0x88, 0x31, 0xc4, 0xf8, 0x96, 0x5e, 0xa9, - 0x02, 0x9d, 0x30, 0x25, 0x01, 0xe4, 0xe7, 0xf3, 0x90, 0xa3, 0x39, 0x08, 0x8d, 0xdd, 0x61, 0xe9, - 0x16, 0xd7, 0xf0, 0x44, 0xc3, 0x24, 0xae, 0xe1, 0xc9, 0xaa, 0x4f, 0x13, 0xbb, 0xd9, 0xcf, 0xe2, - 0x1c, 0x86, 0x45, 0x77, 0xec, 0x43, 0x49, 0x29, 0xf0, 0x90, 0x86, 0x62, 0xb4, 0x1d, 0x13, 0x8f, - 0xdd, 0x9a, 0xea, 0x10, 0xaf, 0x32, 0xa6, 0x26, 0xbe, 0x1e, 0x65, 0xda, 0xe1, 0x68, 0x94, 0xeb, - 0x8f, 0xa0, 0xac, 0x56, 0x82, 0x48, 0x43, 0x34, 0xd6, 0xef, 0x89, 0xc7, 0x0a, 0x5d, 0x21, 0xa9, - 0x71, 0x9a, 0xe0, 0x47, 0x80, 0x12, 0x97, 0x72, 0xff, 0x04, 0x0a, 0xa2, 0x3e, 0xd4, 0xed, 0x37, - 0xda, 0x21, 0xd2, 0xed, 0x37, 0x56, 0x5c, 0x6a, 0x12, 0x01, 0xc6, 0x96, 0xe6, 0xc1, 0x32, 0x40, - 0x0b, 0x96, 0xa4, 0x8c, 0x48, 0x62, 0x19, 0xf6, 0x3c, 0x92, 0x58, 0x2a, 0x35, 0xc8, 0x54, 0x96, - 0xc7, 0x8e, 0x2f, 0x6c, 0x59, 0x26, 0xf8, 0x28, 0x81, 0xa2, 0x1a, 0x0d, 0xf1, 0x34, 0x14, 0xc1, - 0x15, 0x33, 0xae, 0xcb, 0xf8, 0x15, 0x0d, 0x57, 0x11, 0x0a, 0xd1, 0x8f, 0x01, 0xc2, 0x62, 0x36, - 0x7e, 0x1d, 0x6b, 0x3b, 0x62, 0xf1, 0xeb, 0x58, 0x5f, 0x0f, 0x6b, 0x3c, 0x38, 0x64, 0xce, 0x7f, - 0x6d, 0x43, 0xd9, 0xff, 0xd2, 0x00, 0x34, 0x59, 0xfc, 0xa2, 0xc7, 0x7a, 0x16, 0xda, 0x66, 0x9b, - 0xf9, 0xfa, 0xe5, 0x90, 0x13, 0xa3, 0x67, 0x28, 0x57, 0x9b, 0x2d, 0x19, 0xbd, 0xa0, 0x92, 0x7d, - 0x6e, 0xc0, 0x5c, 0xa4, 0x7c, 0x46, 0x0f, 0x12, 0xce, 0x39, 0xd6, 0xb0, 0x33, 0x1f, 0x5e, 0x88, - 0x97, 0x98, 0xb1, 0x28, 0x56, 0x21, 0xb3, 0xb5, 0x9f, 0x91, 0xa4, 0x29, 0x5a, 0x73, 0xa3, 0x04, - 0x06, 0x13, 0x5d, 0x3f, 0xf3, 0xd1, 0xc5, 0x88, 0x97, 0x38, 0xad, 0x30, 0x81, 0x23, 0x6e, 0x21, - 0x4a, 0x75, 0x9d, 0x5b, 0x44, 0x9b, 0x86, 0x3a, 0xb7, 0x88, 0xd5, 0xf9, 0x49, 0x6e, 0x41, 0xab, - 0x5e, 0xc5, 0x13, 0x45, 0x41, 0x9f, 0xc4, 0x72, 0xba, 0x27, 0xc6, 0xba, 0x01, 0x53, 0x59, 0x86, - 0x9e, 0x28, 0xcb, 0x79, 0x94, 0x40, 0xf1, 0x02, 0x4f, 0x8c, 0x77, 0x03, 0x92, 0x3c, 0x91, 0x71, - 0x55, 0x3c, 0x31, 0xac, 0xbe, 0x75, 0x9e, 0x38, 0xd1, 0x12, 0xd5, 0x79, 0xe2, 0x64, 0x01, 0x9f, - 0x74, 0xb6, 0x8c, 0x79, 0xc4, 0x13, 0x17, 0x34, 0xd5, 0x3a, 0x7a, 0x3d, 0x41, 0xa7, 0xda, 0x76, - 0xab, 0xf9, 0xc6, 0x25, 0xb1, 0xa7, 0x7b, 0x00, 0x3f, 0x0d, 0xe9, 0x01, 0xbf, 0x36, 0x60, 0x51, - 0x57, 0xee, 0xa3, 0x04, 0x66, 0x09, 0xbd, 0x5a, 0x73, 0xed, 0xb2, 0xe8, 0x97, 0xd0, 0x5b, 0xe0, - 0x13, 0x1b, 0xe5, 0xdf, 0xff, 0x75, 0xc5, 0xf8, 0x8a, 0xfc, 0xfb, 0x0b, 0xf9, 0x77, 0x94, 0x67, - 0xbf, 0x4b, 0x7f, 0xeb, 0x3f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x6f, 0xc2, 0x22, 0x9e, 0x1e, 0x2f, - 0x00, 0x00, + // 3251 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xb4, 0x5a, 0x4f, 0x73, 0x1b, 0xc7, + 0xb1, 0xe7, 0x02, 0x20, 0x40, 0x34, 0x40, 0x10, 0x1a, 0x52, 0x32, 0xb8, 0x92, 0x28, 0x6a, 0xf4, + 0x8f, 0x92, 0x6c, 0xc2, 0xa6, 0xfd, 0xde, 0x41, 0xef, 0x95, 0xab, 0x28, 0x02, 0x16, 0x19, 0xd2, + 0xa4, 0xbc, 0xa4, 0x64, 0xa7, 0xca, 0x15, 0xd6, 0x12, 0x18, 0x01, 0x28, 0x02, 0xbb, 0xf0, 0xee, + 0x02, 0x12, 0x9d, 0xa4, 0x2a, 0xe5, 0x8a, 0x0f, 0xc9, 0x31, 0x3e, 0x24, 0x71, 0x8e, 0xf9, 0x0c, + 0xb9, 0xe5, 0x03, 0xa4, 0x72, 0x89, 0xab, 0x72, 0xcc, 0x25, 0xe5, 0xe4, 0x90, 0x43, 0xee, 0xa9, + 0x9c, 0x92, 0x9a, 0x7f, 0xbb, 0xb3, 0x8b, 0x5d, 0x90, 0xce, 0xc6, 0x17, 0x72, 0xa7, 0xa7, 0xa7, + 0x7f, 0x3d, 0x3d, 0xd3, 0xbd, 0xdd, 0xbd, 0x80, 0xa2, 0x33, 0x6c, 0xad, 0x0f, 0x1d, 0xdb, 0xb3, + 0x51, 0x99, 0x78, 0xad, 0xb6, 0x4b, 0x9c, 0x31, 0x71, 0x86, 0x27, 0xfa, 0x52, 0xc7, 0xee, 0xd8, + 0x6c, 0xa2, 0x4e, 0x9f, 0x38, 0x8f, 0xbe, 0x4c, 0x79, 0xea, 0x83, 0x71, 0xab, 0xc5, 0xfe, 0x0c, + 0x4f, 0xea, 0xa7, 0x63, 0x31, 0x75, 0x95, 0x4d, 0x99, 0x23, 0xaf, 0xcb, 0xfe, 0x0c, 0x4f, 0xd8, + 0x3f, 0x31, 0x79, 0xad, 0x63, 0xdb, 0x9d, 0x3e, 0xa9, 0x9b, 0xc3, 0x5e, 0xdd, 0xb4, 0x2c, 0xdb, + 0x33, 0xbd, 0x9e, 0x6d, 0xb9, 0x7c, 0x16, 0x7f, 0xae, 0x41, 0xc5, 0x20, 0xee, 0xd0, 0xb6, 0x5c, + 0xb2, 0x4d, 0xcc, 0x36, 0x71, 0xd0, 0x75, 0x80, 0x56, 0x7f, 0xe4, 0x7a, 0xc4, 0x39, 0xee, 0xb5, + 0x6b, 0xda, 0xaa, 0xb6, 0x96, 0x33, 0x8a, 0x82, 0xb2, 0xd3, 0x46, 0x57, 0xa1, 0x38, 0x20, 0x83, + 0x13, 0x3e, 0x9b, 0x61, 0xb3, 0x73, 0x9c, 0xb0, 0xd3, 0x46, 0x3a, 0xcc, 0x39, 0x64, 0xdc, 0x73, + 0x7b, 0xb6, 0x55, 0xcb, 0xae, 0x6a, 0x6b, 0x59, 0xc3, 0x1f, 0xd3, 0x85, 0x8e, 0xf9, 0xc2, 0x3b, + 0xf6, 0x88, 0x33, 0xa8, 0xe5, 0xf8, 0x42, 0x4a, 0x38, 0x22, 0xce, 0x00, 0x7f, 0x95, 0x85, 0xb2, + 0x61, 0x5a, 0x1d, 0x62, 0x90, 0x4f, 0x46, 0xc4, 0xf5, 0x50, 0x15, 0xb2, 0xa7, 0xe4, 0x8c, 0xc1, + 0x97, 0x0d, 0xfa, 0xc8, 0xd7, 0x5b, 0x1d, 0x72, 0x4c, 0x2c, 0x0e, 0x5c, 0xa6, 0xeb, 0xad, 0x0e, + 0x69, 0x5a, 0x6d, 0xb4, 0x04, 0xb3, 0xfd, 0xde, 0xa0, 0xe7, 0x09, 0x54, 0x3e, 0x08, 0xa9, 0x93, + 0x8b, 0xa8, 0xb3, 0x05, 0xe0, 0xda, 0x8e, 0x77, 0x6c, 0x3b, 0x6d, 0xe2, 0xd4, 0x66, 0x57, 0xb5, + 0xb5, 0xca, 0xc6, 0xed, 0x75, 0xf5, 0x20, 0xd6, 0x55, 0x85, 0xd6, 0x0f, 0x6d, 0xc7, 0x3b, 0xa0, + 0xbc, 0x46, 0xd1, 0x95, 0x8f, 0xe8, 0x3d, 0x28, 0x31, 0x21, 0x9e, 0xe9, 0x74, 0x88, 0x57, 0xcb, + 0x33, 0x29, 0x77, 0xce, 0x91, 0x72, 0xc4, 0x98, 0x0d, 0x06, 0xcf, 0x9f, 0x11, 0x86, 0xb2, 0x4b, + 0x9c, 0x9e, 0xd9, 0xef, 0x7d, 0x6a, 0x9e, 0xf4, 0x49, 0xad, 0xb0, 0xaa, 0xad, 0xcd, 0x19, 0x21, + 0x1a, 0xdd, 0xff, 0x29, 0x39, 0x73, 0x8f, 0x6d, 0xab, 0x7f, 0x56, 0x9b, 0x63, 0x0c, 0x73, 0x94, + 0x70, 0x60, 0xf5, 0xcf, 0xd8, 0xa1, 0xd9, 0x23, 0xcb, 0xe3, 0xb3, 0x45, 0x36, 0x5b, 0x64, 0x14, + 0x3a, 0x8d, 0xd7, 0xa1, 0xe8, 0xeb, 0x8f, 0xe6, 0x20, 0xb7, 0x7f, 0xb0, 0xdf, 0xac, 0xce, 0x20, + 0x80, 0xfc, 0xe6, 0xe1, 0x56, 0x73, 0xbf, 0x51, 0xd5, 0x50, 0x09, 0x0a, 0x8d, 0x26, 0x1f, 0x64, + 0xf0, 0x63, 0x80, 0x40, 0x53, 0x54, 0x80, 0xec, 0x6e, 0xf3, 0xbb, 0xd5, 0x19, 0xca, 0xf3, 0xbc, + 0x69, 0x1c, 0xee, 0x1c, 0xec, 0x57, 0x35, 0xba, 0x78, 0xcb, 0x68, 0x6e, 0x1e, 0x35, 0xab, 0x19, + 0xca, 0xf1, 0xfe, 0x41, 0xa3, 0x9a, 0x45, 0x45, 0x98, 0x7d, 0xbe, 0xb9, 0xf7, 0xac, 0x59, 0xcd, + 0xe1, 0x2f, 0x34, 0x98, 0x17, 0x7b, 0xe7, 0xf7, 0x0b, 0xbd, 0x03, 0xf9, 0x2e, 0xbb, 0x63, 0xec, + 0x58, 0x4b, 0x1b, 0xd7, 0x22, 0x86, 0x0a, 0xdd, 0x43, 0x43, 0xf0, 0x22, 0x0c, 0xd9, 0xd3, 0xb1, + 0x5b, 0xcb, 0xac, 0x66, 0xd7, 0x4a, 0x1b, 0xd5, 0x75, 0x7e, 0xf9, 0xd7, 0x77, 0xc9, 0xd9, 0x73, + 0xb3, 0x3f, 0x22, 0x06, 0x9d, 0x44, 0x08, 0x72, 0x03, 0xdb, 0x21, 0xec, 0xf4, 0xe7, 0x0c, 0xf6, + 0x4c, 0xaf, 0x04, 0x33, 0x80, 0x38, 0x79, 0x3e, 0xc0, 0x2d, 0x80, 0xa7, 0x23, 0x2f, 0xf9, 0x96, + 0x2d, 0xc1, 0xec, 0x98, 0xca, 0x15, 0x37, 0x8c, 0x0f, 0xd8, 0xf5, 0x22, 0xa6, 0x4b, 0xfc, 0xeb, + 0x45, 0x07, 0xe8, 0x35, 0x28, 0x0c, 0x1d, 0x32, 0x3e, 0x3e, 0x1d, 0x33, 0x8c, 0x39, 0x23, 0x4f, + 0x87, 0xbb, 0x63, 0x6c, 0x41, 0x89, 0x81, 0xa4, 0xda, 0xf7, 0xfd, 0x40, 0x7a, 0x86, 0x2d, 0x9b, + 0xdc, 0xbb, 0xc4, 0xfb, 0x18, 0x50, 0x83, 0xf4, 0x89, 0x47, 0xd2, 0xb8, 0x90, 0xb2, 0x9b, 0x6c, + 0x68, 0x37, 0x3f, 0xd3, 0x60, 0x31, 0x24, 0x3e, 0xd5, 0xb6, 0x6a, 0x50, 0x68, 0x33, 0x61, 0x5c, + 0x83, 0xac, 0x21, 0x87, 0xe8, 0x21, 0xcc, 0x09, 0x05, 0xdc, 0x5a, 0x36, 0xe1, 0xb4, 0x0b, 0x5c, + 0x27, 0x17, 0xff, 0x5d, 0x83, 0xa2, 0xd8, 0xe8, 0xc1, 0x10, 0x6d, 0xc2, 0xbc, 0xc3, 0x07, 0xc7, + 0x6c, 0x3f, 0x42, 0x23, 0x3d, 0xd9, 0x13, 0xb7, 0x67, 0x8c, 0xb2, 0x58, 0xc2, 0xc8, 0xe8, 0xff, + 0xa0, 0x24, 0x45, 0x0c, 0x47, 0x9e, 0x30, 0x79, 0x2d, 0x2c, 0x20, 0xb8, 0x39, 0xdb, 0x33, 0x06, + 0x08, 0xf6, 0xa7, 0x23, 0x0f, 0x1d, 0xc1, 0x92, 0x5c, 0xcc, 0x77, 0x23, 0xd4, 0xc8, 0x32, 0x29, + 0xab, 0x61, 0x29, 0x93, 0x47, 0xb5, 0x3d, 0x63, 0x20, 0xb1, 0x5e, 0x99, 0x7c, 0x5c, 0x84, 0x82, + 0xa0, 0xe2, 0x7f, 0x68, 0x00, 0xd2, 0xa0, 0x07, 0x43, 0xd4, 0x80, 0x8a, 0x23, 0x46, 0xa1, 0x0d, + 0x5f, 0x8d, 0xdd, 0xb0, 0x38, 0x87, 0x19, 0x63, 0x5e, 0x2e, 0xe2, 0x5b, 0x7e, 0x17, 0xca, 0xbe, + 0x94, 0x60, 0xcf, 0xcb, 0x31, 0x7b, 0xf6, 0x25, 0x94, 0xe4, 0x02, 0xba, 0xeb, 0x0f, 0xe1, 0xb2, + 0xbf, 0x3e, 0x66, 0xdb, 0x37, 0xa7, 0x6c, 0xdb, 0x17, 0xb8, 0x28, 0x25, 0xa8, 0x1b, 0x07, 0x1a, + 0xb7, 0x39, 0x19, 0x7f, 0x99, 0x85, 0xc2, 0x96, 0x3d, 0x18, 0x9a, 0x0e, 0x3d, 0xa3, 0xbc, 0x43, + 0xdc, 0x51, 0xdf, 0x63, 0xdb, 0xad, 0x6c, 0xdc, 0x0a, 0x23, 0x08, 0x36, 0xf9, 0xdf, 0x60, 0xac, + 0x86, 0x58, 0x42, 0x17, 0x8b, 0x30, 0x9d, 0xb9, 0xc0, 0x62, 0x11, 0xa4, 0xc5, 0x12, 0xe9, 0x4b, + 0xd9, 0xc0, 0x97, 0x74, 0x28, 0x8c, 0x89, 0x13, 0xbc, 0x5a, 0xb6, 0x67, 0x0c, 0x49, 0x40, 0xf7, + 0x61, 0xa1, 0xe5, 0x10, 0x93, 0xda, 0x43, 0xbe, 0x7e, 0x66, 0x05, 0x4f, 0x85, 0x4f, 0x18, 0xf2, + 0x35, 0x74, 0x0b, 0xca, 0x03, 0xbb, 0x1d, 0xf0, 0xe5, 0x05, 0x5f, 0x69, 0x60, 0xb7, 0x7d, 0xa6, + 0x2b, 0x32, 0x28, 0xd1, 0xf7, 0x42, 0x79, 0x7b, 0x46, 0x84, 0x25, 0xfc, 0x16, 0xcc, 0x87, 0xf6, + 0x4a, 0xc3, 0x6f, 0xf3, 0x83, 0x67, 0x9b, 0x7b, 0x3c, 0x56, 0x3f, 0x61, 0xe1, 0xd9, 0xa8, 0x6a, + 0x34, 0xe4, 0xef, 0x35, 0x0f, 0x0f, 0xab, 0x19, 0xfc, 0xff, 0xfe, 0x12, 0x11, 0xdc, 0x95, 0x98, + 0x3e, 0xa3, 0xc4, 0x74, 0x4d, 0xc6, 0xf4, 0x4c, 0x10, 0xd3, 0xb3, 0x8f, 0x2b, 0x50, 0xe6, 0x06, + 0x39, 0x1e, 0x59, 0x3d, 0xdb, 0xc2, 0xbf, 0xd6, 0x00, 0x8e, 0x5e, 0x59, 0x32, 0xe2, 0xd4, 0xa1, + 0xd0, 0xe2, 0xc2, 0x6b, 0x1a, 0x73, 0xe0, 0xcb, 0xb1, 0x36, 0x36, 0x24, 0x17, 0x7a, 0x0b, 0x0a, + 0xee, 0xa8, 0xd5, 0x22, 0xae, 0x8c, 0xef, 0xaf, 0x45, 0x63, 0x88, 0xf0, 0x70, 0x43, 0xf2, 0xd1, + 0x25, 0x2f, 0xcc, 0x5e, 0x7f, 0xc4, 0xa2, 0xfd, 0xf4, 0x25, 0x82, 0x0f, 0xff, 0x52, 0x83, 0x12, + 0xd3, 0x32, 0x55, 0xe0, 0xba, 0x06, 0x45, 0xa6, 0x03, 0x69, 0x8b, 0xd0, 0x35, 0x67, 0x04, 0x04, + 0xf4, 0xbf, 0x50, 0x94, 0x57, 0x56, 0x46, 0xaf, 0x5a, 0xbc, 0xd8, 0x83, 0xa1, 0x11, 0xb0, 0xe2, + 0x5d, 0xb8, 0xc4, 0xac, 0xd2, 0xa2, 0x59, 0x99, 0xb4, 0xa3, 0x9a, 0xb7, 0x68, 0x91, 0xbc, 0x45, + 0x87, 0xb9, 0x61, 0xf7, 0xcc, 0xed, 0xb5, 0xcc, 0xbe, 0xd0, 0xc2, 0x1f, 0xe3, 0xef, 0x00, 0x52, + 0x85, 0xa5, 0xd9, 0x2e, 0x9e, 0x87, 0xd2, 0xb6, 0xe9, 0x76, 0x85, 0x4a, 0xf8, 0x23, 0x28, 0xf3, + 0x61, 0x2a, 0x1b, 0x22, 0xc8, 0x75, 0x4d, 0xb7, 0xcb, 0x14, 0x9f, 0x37, 0xd8, 0x33, 0xbe, 0x04, + 0x0b, 0x87, 0x96, 0x39, 0x74, 0xbb, 0xb6, 0x0c, 0xae, 0x34, 0x2b, 0xad, 0x06, 0xb4, 0x54, 0x88, + 0xf7, 0x60, 0xc1, 0x21, 0x03, 0xb3, 0x67, 0xf5, 0xac, 0xce, 0xf1, 0xc9, 0x99, 0x47, 0x5c, 0x91, + 0xb4, 0x56, 0x7c, 0xf2, 0x63, 0x4a, 0xa5, 0xaa, 0x9d, 0xf4, 0xed, 0x13, 0xe1, 0xe2, 0xec, 0x19, + 0xff, 0x46, 0x83, 0xf2, 0x87, 0xa6, 0xd7, 0x92, 0x56, 0x40, 0x3b, 0x50, 0xf1, 0x1d, 0x9b, 0x51, + 0x84, 0x2e, 0x91, 0x08, 0xcf, 0xd6, 0x6c, 0x09, 0x47, 0x97, 0x11, 0x7e, 0xbe, 0xa5, 0x12, 0x98, + 0x28, 0xd3, 0x6a, 0x91, 0xbe, 0x2f, 0x2a, 0x93, 0x2c, 0x8a, 0x31, 0xaa, 0xa2, 0x54, 0xc2, 0xe3, + 0x85, 0xe0, 0xed, 0xc7, 0xdd, 0xf2, 0xcb, 0x0c, 0xa0, 0x49, 0x1d, 0xbe, 0x69, 0x42, 0x70, 0x07, + 0x2a, 0xae, 0x67, 0x3a, 0xde, 0x71, 0x24, 0xa5, 0x9f, 0x67, 0x54, 0x3f, 0x38, 0xdd, 0x83, 0x85, + 0xa1, 0x63, 0x77, 0x1c, 0xe2, 0xba, 0xc7, 0x96, 0xed, 0xf5, 0x5e, 0x9c, 0x89, 0x6c, 0xa8, 0x22, + 0xc9, 0xfb, 0x8c, 0x8a, 0x9a, 0x50, 0x78, 0xd1, 0xeb, 0x7b, 0xc4, 0x71, 0x6b, 0xb3, 0xab, 0xd9, + 0xb5, 0xca, 0xc6, 0xc3, 0xf3, 0xac, 0xb6, 0xfe, 0x1e, 0xe3, 0x3f, 0x3a, 0x1b, 0x12, 0x43, 0xae, + 0x55, 0xf3, 0x94, 0x7c, 0x28, 0x4f, 0xb9, 0x03, 0x10, 0xf0, 0xd3, 0xa8, 0xb5, 0x7f, 0xf0, 0xf4, + 0xd9, 0x51, 0x75, 0x06, 0x95, 0x61, 0x6e, 0xff, 0xa0, 0xd1, 0xdc, 0x6b, 0xd2, 0xb8, 0x86, 0xeb, + 0xd2, 0x36, 0xaa, 0x0d, 0xd1, 0x32, 0xcc, 0xbd, 0xa4, 0x54, 0x59, 0xf3, 0x64, 0x8d, 0x02, 0x1b, + 0xef, 0xb4, 0xf1, 0xdf, 0x34, 0x98, 0x17, 0xb7, 0x20, 0xd5, 0x55, 0x54, 0x21, 0x32, 0x21, 0x08, + 0x9a, 0x14, 0xf1, 0xdb, 0xd1, 0x16, 0xb9, 0x97, 0x1c, 0x52, 0x77, 0xe7, 0x87, 0x4d, 0xda, 0xc2, + 0xac, 0xfe, 0x18, 0xdd, 0x87, 0x6a, 0x8b, 0xbb, 0x7b, 0xe4, 0x3d, 0x63, 0x2c, 0x08, 0xba, 0x7f, + 0x48, 0x77, 0x20, 0x4f, 0xc6, 0xc4, 0xf2, 0xdc, 0x5a, 0x89, 0xc5, 0xa6, 0x79, 0x99, 0x59, 0x35, + 0x29, 0xd5, 0x10, 0x93, 0xf8, 0x7f, 0xe0, 0xd2, 0x1e, 0x4d, 0x6d, 0x9f, 0x38, 0xa6, 0xa5, 0x26, + 0xc9, 0x47, 0x47, 0x7b, 0xc2, 0x2a, 0x59, 0xef, 0x68, 0x0f, 0x55, 0x20, 0xb3, 0xd3, 0x10, 0x7b, + 0xc8, 0xf4, 0x1a, 0xf8, 0x33, 0x0d, 0x90, 0xba, 0x2e, 0x95, 0x99, 0x22, 0xc2, 0x25, 0x7c, 0x36, + 0x80, 0x5f, 0x82, 0x59, 0xe2, 0x38, 0xb6, 0xc3, 0x0c, 0x52, 0x34, 0xf8, 0x00, 0xdf, 0x16, 0x3a, + 0x18, 0x64, 0x6c, 0x9f, 0xfa, 0x77, 0x9e, 0x4b, 0xd3, 0x7c, 0x55, 0x77, 0x61, 0x31, 0xc4, 0x95, + 0x2a, 0x46, 0xde, 0x83, 0xcb, 0x4c, 0xd8, 0x2e, 0x21, 0xc3, 0xcd, 0x7e, 0x6f, 0x9c, 0x88, 0x3a, + 0x84, 0x2b, 0x51, 0xc6, 0x6f, 0xd7, 0x46, 0xb8, 0x0b, 0xf9, 0xf7, 0x59, 0x55, 0xae, 0xe8, 0x92, + 0x63, 0xbc, 0x08, 0x72, 0x96, 0x39, 0xe0, 0x05, 0x4e, 0xd1, 0x60, 0xcf, 0xec, 0xa5, 0x42, 0x88, + 0xf3, 0xcc, 0xd8, 0xe3, 0x2f, 0xaf, 0xa2, 0xe1, 0x8f, 0xd1, 0x0a, 0x40, 0xab, 0xdf, 0x23, 0x96, + 0xc7, 0x66, 0x73, 0x6c, 0x56, 0xa1, 0xe0, 0x75, 0xa8, 0x72, 0xa4, 0xcd, 0x76, 0x5b, 0x79, 0x81, + 0xf9, 0xf2, 0xb4, 0xb0, 0x3c, 0xfc, 0x12, 0x2e, 0x29, 0xfc, 0xa9, 0xcc, 0xf0, 0x3a, 0xe4, 0x79, + 0xeb, 0x41, 0xc4, 0xce, 0xa5, 0xf0, 0x2a, 0x0e, 0x63, 0x08, 0x1e, 0x7c, 0x07, 0x16, 0x05, 0x85, + 0x0c, 0xec, 0xb8, 0xb3, 0x62, 0xf6, 0xc1, 0x7b, 0xb0, 0x14, 0x66, 0x4b, 0x75, 0x45, 0x36, 0x25, + 0xe8, 0xb3, 0x61, 0x5b, 0x09, 0xc5, 0xd1, 0x43, 0x51, 0x0d, 0x96, 0x89, 0x18, 0xcc, 0x57, 0x48, + 0x8a, 0x48, 0xa5, 0xd0, 0xa2, 0x34, 0xff, 0x5e, 0xcf, 0xf5, 0x5f, 0xb8, 0x9f, 0x02, 0x52, 0x89, + 0xa9, 0x0e, 0x65, 0x1d, 0x0a, 0xdc, 0xe0, 0x32, 0xa7, 0x8b, 0x3f, 0x15, 0xc9, 0x44, 0x15, 0x6a, + 0x90, 0x17, 0x8e, 0xd9, 0x19, 0x10, 0x3f, 0xe6, 0xd0, 0x4c, 0x46, 0x25, 0xa6, 0xda, 0xf1, 0x1f, + 0x34, 0x28, 0x6f, 0xf6, 0x4d, 0x67, 0x20, 0x8d, 0xff, 0x2e, 0xe4, 0x79, 0x8a, 0x24, 0xca, 0x88, + 0xbb, 0x61, 0x31, 0x2a, 0x2f, 0x1f, 0x6c, 0xf2, 0x84, 0x4a, 0xac, 0xa2, 0x87, 0x25, 0x3a, 0x5e, + 0x8d, 0x48, 0x07, 0xac, 0x81, 0xde, 0x80, 0x59, 0x93, 0x2e, 0x61, 0xbe, 0x58, 0x89, 0x26, 0xa7, + 0x4c, 0x1a, 0x7b, 0x9d, 0x71, 0x2e, 0xfc, 0x0e, 0x94, 0x14, 0x04, 0x9a, 0x73, 0x3f, 0x69, 0x8a, + 0x57, 0xd6, 0xe6, 0xd6, 0xd1, 0xce, 0x73, 0x9e, 0x8a, 0x57, 0x00, 0x1a, 0x4d, 0x7f, 0x9c, 0xc1, + 0x1f, 0x89, 0x55, 0xc2, 0xc3, 0x55, 0x7d, 0xb4, 0x24, 0x7d, 0x32, 0x17, 0xd2, 0xe7, 0x15, 0xcc, + 0x8b, 0xed, 0xa7, 0xba, 0x03, 0x6f, 0x41, 0x9e, 0xc9, 0x93, 0x57, 0x60, 0x39, 0x06, 0x56, 0x7a, + 0x27, 0x67, 0xc4, 0x0b, 0x30, 0x7f, 0xe8, 0x99, 0xde, 0xc8, 0x95, 0x57, 0xe0, 0xf7, 0x1a, 0x54, + 0x24, 0x25, 0x6d, 0xc7, 0x41, 0x56, 0x6a, 0x3c, 0xe6, 0xf9, 0x75, 0xda, 0x15, 0xc8, 0xb7, 0x4f, + 0x0e, 0x7b, 0x9f, 0xca, 0xbe, 0x8e, 0x18, 0x51, 0x7a, 0x9f, 0xe3, 0xf0, 0x3e, 0xa5, 0x18, 0xd1, + 0x12, 0xc0, 0x31, 0x5f, 0x78, 0x3b, 0x56, 0x9b, 0xbc, 0x62, 0x6f, 0xda, 0x9c, 0x11, 0x10, 0x58, + 0xd6, 0x2e, 0xfa, 0x99, 0x2c, 0x33, 0x51, 0xfb, 0x9b, 0x8b, 0x70, 0x69, 0x73, 0xe4, 0x75, 0x9b, + 0x96, 0x79, 0xd2, 0x97, 0x41, 0x00, 0x2f, 0x01, 0xa2, 0xc4, 0x46, 0xcf, 0x55, 0xa9, 0x4d, 0x58, + 0xa4, 0x54, 0x62, 0x79, 0xbd, 0x96, 0x12, 0x31, 0x64, 0xd8, 0xd6, 0x22, 0x61, 0xdb, 0x74, 0xdd, + 0x97, 0xb6, 0xd3, 0x16, 0x5b, 0xf3, 0xc7, 0xb8, 0xc1, 0x85, 0x3f, 0x73, 0x43, 0x81, 0xf9, 0x9b, + 0x4a, 0x59, 0x0b, 0xa4, 0x3c, 0x21, 0xde, 0x14, 0x29, 0xf8, 0x21, 0x5c, 0x96, 0x9c, 0xa2, 0x94, + 0x9f, 0xc2, 0x7c, 0x00, 0xd7, 0x25, 0xf3, 0x56, 0x97, 0xe6, 0x9b, 0x4f, 0x05, 0xe0, 0x7f, 0xaa, + 0xe7, 0x63, 0xa8, 0xf9, 0x7a, 0xb2, 0x1c, 0xc4, 0xee, 0xab, 0x0a, 0x8c, 0x5c, 0x71, 0x67, 0x8a, + 0x06, 0x7b, 0xa6, 0x34, 0xc7, 0xee, 0xfb, 0x2f, 0x41, 0xfa, 0x8c, 0xb7, 0x60, 0x59, 0xca, 0x10, + 0xd9, 0x41, 0x58, 0xc8, 0x84, 0x42, 0x71, 0x42, 0x84, 0xc1, 0xe8, 0xd2, 0xe9, 0x66, 0x57, 0x39, + 0xc3, 0xa6, 0x65, 0x32, 0x35, 0x45, 0xe6, 0x65, 0x7e, 0x23, 0xa8, 0x62, 0x6a, 0xd0, 0x16, 0x64, + 0x2a, 0x40, 0x25, 0x8b, 0x83, 0xa0, 0xe4, 0x89, 0x83, 0x98, 0x10, 0xfd, 0x31, 0xac, 0xf8, 0x4a, + 0x50, 0xbb, 0x3d, 0x25, 0xce, 0xa0, 0xe7, 0xba, 0x4a, 0x2d, 0x1a, 0xb7, 0xf1, 0xbb, 0x90, 0x1b, + 0x12, 0x11, 0x53, 0x4a, 0x1b, 0x68, 0x9d, 0x7f, 0x75, 0x58, 0x57, 0x16, 0xb3, 0x79, 0xdc, 0x86, + 0x1b, 0x52, 0x3a, 0xb7, 0x68, 0xac, 0xf8, 0xa8, 0x52, 0xb2, 0x4e, 0xe1, 0x66, 0x9d, 0xac, 0x53, + 0xb2, 0xfc, 0xec, 0x65, 0x9d, 0x42, 0xdf, 0x15, 0xaa, 0x6f, 0xa5, 0x7a, 0x57, 0xec, 0x72, 0x9b, + 0xfa, 0x2e, 0x99, 0x4a, 0xd8, 0x09, 0x2c, 0x85, 0x3d, 0x39, 0x55, 0x18, 0x5b, 0x82, 0x59, 0xcf, + 0x3e, 0x25, 0x32, 0x88, 0xf1, 0x81, 0x54, 0xd8, 0x77, 0xf3, 0x54, 0x0a, 0x9b, 0x81, 0x30, 0x76, + 0x25, 0xd3, 0xea, 0x4b, 0x4f, 0x53, 0xe6, 0x33, 0x7c, 0x80, 0xf7, 0xe1, 0x4a, 0x34, 0x4c, 0xa4, + 0x52, 0xf9, 0x39, 0xbf, 0xc0, 0x71, 0x91, 0x24, 0x95, 0xdc, 0x0f, 0x82, 0x60, 0xa0, 0x04, 0x94, + 0x54, 0x22, 0x0d, 0xd0, 0xe3, 0xe2, 0xcb, 0x7f, 0xe3, 0xbe, 0xfa, 0xe1, 0x26, 0x95, 0x30, 0x37, + 0x10, 0x96, 0xfe, 0xf8, 0x83, 0x18, 0x91, 0x9d, 0x1a, 0x23, 0x84, 0x93, 0x04, 0x51, 0xec, 0x5b, + 0xb8, 0x74, 0x02, 0x23, 0x08, 0xa0, 0x69, 0x31, 0xe8, 0x3b, 0xc4, 0xc7, 0x60, 0x03, 0x79, 0xb1, + 0xd5, 0xb0, 0x9b, 0xea, 0x30, 0x3e, 0x0c, 0x62, 0xe7, 0x44, 0x64, 0x4e, 0x25, 0xf8, 0x23, 0x58, + 0x4d, 0x0e, 0xca, 0x69, 0x24, 0x3f, 0xc0, 0x50, 0xf4, 0x13, 0x4a, 0xe5, 0x2b, 0x63, 0x09, 0x0a, + 0xfb, 0x07, 0x87, 0x4f, 0x37, 0xb7, 0x9a, 0x55, 0x6d, 0xe3, 0x4f, 0x59, 0xc8, 0xec, 0x3e, 0x47, + 0xdf, 0x83, 0x59, 0xfe, 0x0d, 0x62, 0xca, 0x27, 0x1a, 0x7d, 0xda, 0xd7, 0x0c, 0x7c, 0xed, 0xb3, + 0x3f, 0xfe, 0xf5, 0x8b, 0xcc, 0x15, 0x7c, 0xa9, 0x3e, 0x7e, 0xdb, 0xec, 0x0f, 0xbb, 0x66, 0xfd, + 0x74, 0x5c, 0x67, 0xef, 0x84, 0x47, 0xda, 0x03, 0xf4, 0x1c, 0xb2, 0x4f, 0x47, 0x1e, 0x4a, 0xfc, + 0x7e, 0xa3, 0x27, 0x7f, 0xe5, 0xc0, 0x3a, 0x93, 0xbc, 0x84, 0x17, 0x54, 0xc9, 0xc3, 0x91, 0x47, + 0xe5, 0x1e, 0x41, 0x49, 0xf9, 0x50, 0x81, 0xce, 0xfd, 0xb2, 0xa3, 0x9f, 0xff, 0x11, 0x04, 0xcf, + 0x50, 0x6d, 0x8f, 0x5e, 0x59, 0x51, 0x6d, 0x83, 0xc6, 0x7a, 0x54, 0x5b, 0xa5, 0x99, 0x1d, 0xaf, + 0xad, 0xf7, 0xca, 0xa2, 0xda, 0xda, 0xe2, 0xd3, 0x49, 0xcb, 0x43, 0x37, 0x62, 0x3a, 0xf1, 0x6a, + 0xcf, 0x59, 0x5f, 0x4d, 0x66, 0x10, 0x48, 0x37, 0x19, 0xd2, 0x55, 0x7c, 0x45, 0x45, 0x6a, 0xf9, + 0x7c, 0x8f, 0xb4, 0x07, 0x1b, 0x5d, 0x98, 0x65, 0x9d, 0x32, 0x74, 0x2c, 0x1f, 0xf4, 0x98, 0x1e, + 0x5f, 0xc2, 0xf9, 0x86, 0x7a, 0x6c, 0x78, 0x99, 0xa1, 0x2d, 0xe2, 0x8a, 0x8f, 0xc6, 0x9a, 0x65, + 0x8f, 0xb4, 0x07, 0x6b, 0xda, 0x9b, 0xda, 0xc6, 0x3f, 0x33, 0x30, 0xcb, 0x5a, 0x2a, 0x68, 0x08, + 0x10, 0xf4, 0x9e, 0xa2, 0xfb, 0x9c, 0xe8, 0x66, 0x45, 0xf7, 0x39, 0xd9, 0xb6, 0xc2, 0x37, 0x18, + 0xf2, 0x32, 0x5e, 0xf2, 0x91, 0xd9, 0xe7, 0xde, 0x7a, 0x87, 0x72, 0x51, 0xb3, 0xbe, 0x84, 0x92, + 0xd2, 0x43, 0x42, 0x71, 0x12, 0x43, 0x4d, 0xa8, 0xe8, 0x25, 0x88, 0x69, 0x40, 0xe1, 0x5b, 0x0c, + 0xf4, 0x3a, 0xae, 0xa9, 0xc6, 0xe5, 0xb8, 0x0e, 0xe3, 0xa4, 0xc0, 0x3f, 0xd6, 0xa0, 0x12, 0xee, + 0x23, 0xa1, 0x5b, 0x31, 0xa2, 0xa3, 0xed, 0x28, 0xfd, 0xf6, 0x74, 0xa6, 0x44, 0x15, 0x38, 0xfe, + 0x29, 0x21, 0x43, 0x93, 0x72, 0x4a, 0xdb, 0xff, 0x2b, 0x0b, 0x85, 0x2d, 0xfe, 0x83, 0x10, 0xe4, + 0x41, 0xd1, 0xef, 0xe6, 0xa0, 0x95, 0xb8, 0x4a, 0x3f, 0x48, 0x83, 0xf5, 0x1b, 0x89, 0xf3, 0x42, + 0x85, 0xbb, 0x4c, 0x85, 0x55, 0x7c, 0xd5, 0x57, 0x41, 0xfc, 0xf0, 0xa4, 0xce, 0x0b, 0xda, 0xba, + 0xd9, 0x6e, 0x53, 0x43, 0xfc, 0x48, 0x83, 0xb2, 0xda, 0xa4, 0x41, 0x37, 0x63, 0x7b, 0x0c, 0x6a, + 0x9f, 0x47, 0xc7, 0xd3, 0x58, 0x04, 0xfe, 0x7d, 0x86, 0x7f, 0x0b, 0xaf, 0x24, 0xe1, 0x3b, 0x8c, + 0x3f, 0xac, 0x02, 0x6f, 0xcb, 0xc4, 0xab, 0x10, 0xea, 0xfa, 0xc4, 0xab, 0x10, 0xee, 0xea, 0x9c, + 0xaf, 0xc2, 0x88, 0xf1, 0x53, 0x15, 0x5e, 0x01, 0x04, 0x5d, 0x1b, 0x14, 0x6b, 0x5c, 0xa5, 0x30, + 0x88, 0xde, 0xfc, 0xc9, 0x86, 0x0f, 0xbe, 0xc7, 0xb0, 0x6f, 0xe2, 0x6b, 0x49, 0xd8, 0xfd, 0x9e, + 0x4b, 0x3d, 0x60, 0xe3, 0xb7, 0x39, 0x28, 0xbd, 0x6f, 0xf6, 0x2c, 0x8f, 0x58, 0xa6, 0xd5, 0x22, + 0xa8, 0x03, 0xb3, 0x2c, 0xf2, 0x47, 0xdd, 0x5d, 0x6d, 0xa5, 0x44, 0xdd, 0x3d, 0xd4, 0x67, 0xc0, + 0x77, 0x18, 0xf4, 0x0d, 0xac, 0xfb, 0xd0, 0x83, 0x40, 0x7e, 0x9d, 0xf5, 0x08, 0xe8, 0x96, 0x4f, + 0x21, 0xcf, 0x7b, 0x02, 0x28, 0x22, 0x2d, 0xd4, 0x3b, 0xd0, 0xaf, 0xc5, 0x4f, 0x26, 0xde, 0x32, + 0x15, 0xcb, 0x65, 0xcc, 0x14, 0xec, 0xfb, 0x00, 0x41, 0x13, 0x2a, 0x6a, 0xdf, 0x89, 0x9e, 0x95, + 0xbe, 0x9a, 0xcc, 0x20, 0x80, 0x1f, 0x30, 0xe0, 0xdb, 0xf8, 0x46, 0x2c, 0x70, 0xdb, 0x5f, 0x40, + 0xc1, 0x5b, 0x90, 0xdb, 0x36, 0xdd, 0x2e, 0x8a, 0x84, 0x7e, 0xe5, 0x9b, 0x9c, 0xae, 0xc7, 0x4d, + 0x09, 0xa8, 0xdb, 0x0c, 0x6a, 0x05, 0x2f, 0xc7, 0x42, 0x75, 0x4d, 0x97, 0x46, 0x52, 0x34, 0x82, + 0x39, 0xf9, 0x9d, 0x0d, 0x5d, 0x8f, 0xd8, 0x2c, 0xfc, 0x4d, 0x4e, 0x5f, 0x49, 0x9a, 0x16, 0x80, + 0x6b, 0x0c, 0x10, 0xe3, 0xeb, 0xf1, 0x46, 0x15, 0xec, 0x8f, 0xb4, 0x07, 0x6f, 0x6a, 0x1b, 0x3f, + 0xad, 0x42, 0x8e, 0xe6, 0x20, 0x34, 0x76, 0x07, 0xa5, 0x5b, 0xd4, 0xc2, 0x13, 0x0d, 0x93, 0xa8, + 0x85, 0x27, 0xab, 0xbe, 0x98, 0xd8, 0xcd, 0x7e, 0x16, 0x47, 0x18, 0x17, 0xdd, 0xb1, 0x07, 0x25, + 0xa5, 0xc0, 0x43, 0x31, 0x12, 0xc3, 0xed, 0x98, 0x68, 0xec, 0x8e, 0xa9, 0x0e, 0xf1, 0x2a, 0x03, + 0xd5, 0xf1, 0xe5, 0x30, 0x68, 0x9b, 0xb3, 0x51, 0xd4, 0x1f, 0x40, 0x59, 0xad, 0x04, 0x51, 0x8c, + 0xd0, 0x48, 0xbf, 0x27, 0x1a, 0x2b, 0xe2, 0x0a, 0xc9, 0x18, 0xa7, 0xf1, 0x7f, 0x04, 0x28, 0x79, + 0x29, 0xfa, 0x27, 0x50, 0x10, 0xf5, 0x61, 0xdc, 0x7e, 0xc3, 0x1d, 0xa2, 0xb8, 0xfd, 0x46, 0x8a, + 0xcb, 0x98, 0x44, 0x80, 0xc1, 0xd2, 0x3c, 0x58, 0x06, 0x68, 0x01, 0xf9, 0x84, 0x78, 0x49, 0x90, + 0x41, 0xcf, 0x23, 0x09, 0x52, 0xa9, 0x41, 0xa6, 0x42, 0x76, 0x88, 0x27, 0xee, 0xb2, 0x4c, 0xf0, + 0x51, 0x82, 0x44, 0x35, 0x1a, 0xe2, 0x69, 0x2c, 0x02, 0x15, 0x33, 0xd4, 0x6b, 0xf8, 0xb5, 0x18, + 0x54, 0x11, 0x0a, 0xd1, 0x0f, 0x01, 0x82, 0x62, 0x36, 0xfa, 0x3a, 0x8e, 0xed, 0x88, 0x45, 0x5f, + 0xc7, 0xf1, 0xf5, 0x70, 0x8c, 0x07, 0x07, 0xe0, 0xfc, 0xd7, 0x36, 0x14, 0xfe, 0xe7, 0x1a, 0xa0, + 0xc9, 0xe2, 0x17, 0x3d, 0x8c, 0x87, 0x88, 0x6d, 0xb6, 0xe9, 0xaf, 0x5f, 0x8c, 0x39, 0x31, 0x7a, + 0x06, 0x7a, 0xb5, 0xd8, 0x92, 0xe1, 0x4b, 0xaa, 0xd9, 0xe7, 0x1a, 0xcc, 0x87, 0xca, 0x67, 0x74, + 0x37, 0xe1, 0x9c, 0x23, 0x0d, 0x3b, 0xfd, 0xde, 0xb9, 0x7c, 0x89, 0x19, 0x8b, 0x72, 0x2b, 0x64, + 0xb6, 0xf6, 0x13, 0x0d, 0x2a, 0xe1, 0x9a, 0x1b, 0x25, 0x00, 0x4c, 0x74, 0xfd, 0xf4, 0xb5, 0xf3, + 0x19, 0x2f, 0x70, 0x5a, 0x41, 0x02, 0xf7, 0x09, 0x14, 0x44, 0xa9, 0x1e, 0xe7, 0x16, 0xe1, 0xa6, + 0x61, 0x9c, 0x5b, 0x44, 0xea, 0xfc, 0x24, 0xb7, 0xa0, 0x55, 0xaf, 0xe2, 0x89, 0xa2, 0xa0, 0x4f, + 0x82, 0x9c, 0xee, 0x89, 0x91, 0x6e, 0xc0, 0x54, 0xc8, 0xc0, 0x13, 0x65, 0x39, 0x8f, 0x12, 0x24, + 0x9e, 0xe3, 0x89, 0xd1, 0x6e, 0x40, 0x92, 0x27, 0x32, 0x54, 0xc5, 0x13, 0x83, 0xea, 0x3b, 0xce, + 0x13, 0x27, 0x5a, 0xa2, 0x71, 0x9e, 0x38, 0x59, 0xc0, 0x27, 0x9d, 0x2d, 0x03, 0x0f, 0x79, 0xe2, + 0x62, 0x4c, 0xb5, 0x8e, 0x5e, 0x4f, 0xb0, 0x69, 0x6c, 0xbb, 0x55, 0x7f, 0xe3, 0x82, 0xdc, 0xd3, + 0x3d, 0x80, 0x9f, 0x86, 0xf4, 0x80, 0x5f, 0x69, 0xb0, 0x14, 0x57, 0xee, 0xa3, 0x04, 0xb0, 0x84, + 0x5e, 0xad, 0xbe, 0x7e, 0x51, 0xf6, 0x0b, 0xd8, 0xcd, 0xf7, 0x89, 0xc7, 0xd5, 0xdf, 0x7d, 0xbd, + 0xa2, 0x7d, 0xf5, 0xf5, 0x8a, 0xf6, 0xe7, 0xaf, 0x57, 0xb4, 0x5f, 0xfc, 0x65, 0x65, 0xe6, 0x24, + 0xcf, 0x7e, 0x9b, 0xfe, 0xf6, 0xbf, 0x03, 0x00, 0x00, 0xff, 0xff, 0xe5, 0x8e, 0xc4, 0x1c, 0x22, + 0x2f, 0x00, 0x00, } diff --git a/vendor/github.com/coreos/etcd/etcdserver/server.go b/vendor/github.com/coreos/etcd/etcdserver/server.go index ec51ca2..28336f5 100644 --- a/vendor/github.com/coreos/etcd/etcdserver/server.go +++ b/vendor/github.com/coreos/etcd/etcdserver/server.go @@ -1044,6 +1044,7 @@ func (s *EtcdServer) applyEntryNormal(e *raftpb.Entry) { s.consistIndex.setConsistentIndex(e.Index) shouldApplyV3 = true } + defer s.setAppliedIndex(e.Index) // raft state machine may generate noop entry when leader confirmation. // skip it in advance to avoid some potential bug in the future @@ -1082,7 +1083,6 @@ func (s *EtcdServer) applyEntryNormal(e *raftpb.Entry) { if s.w.IsRegistered(id) || !noSideEffect(&raftReq) { ar = s.applyV3.Apply(&raftReq) } - s.setAppliedIndex(e.Index) if ar == nil { return diff --git a/vendor/github.com/coreos/etcd/etcdserver/server_test.go b/vendor/github.com/coreos/etcd/etcdserver/server_test.go index 0531f72..dd8da43 100644 --- a/vendor/github.com/coreos/etcd/etcdserver/server_test.go +++ b/vendor/github.com/coreos/etcd/etcdserver/server_test.go @@ -1357,9 +1357,10 @@ func (n *nodeRecorder) Step(ctx context.Context, msg raftpb.Message) error { n.Record(testutil.Action{Name: "Step"}) return nil } -func (n *nodeRecorder) Status() raft.Status { return raft.Status{} } -func (n *nodeRecorder) Ready() <-chan raft.Ready { return nil } -func (n *nodeRecorder) Advance() {} +func (n *nodeRecorder) Status() raft.Status { return raft.Status{} } +func (n *nodeRecorder) Ready() <-chan raft.Ready { return nil } +func (n *nodeRecorder) ReadIndex(ctx context.Context, rctx []byte) error { return nil } +func (n *nodeRecorder) Advance() {} func (n *nodeRecorder) ApplyConfChange(conf raftpb.ConfChange) *raftpb.ConfState { n.Record(testutil.Action{Name: "ApplyConfChange", Params: []interface{}{conf}}) return &raftpb.ConfState{} diff --git a/vendor/github.com/coreos/etcd/etcdserver/v3_server.go b/vendor/github.com/coreos/etcd/etcdserver/v3_server.go index ce0e584..de738c7 100644 --- a/vendor/github.com/coreos/etcd/etcdserver/v3_server.go +++ b/vendor/github.com/coreos/etcd/etcdserver/v3_server.go @@ -19,6 +19,7 @@ import ( "strings" "time" + "github.com/coreos/etcd/auth" pb "github.com/coreos/etcd/etcdserver/etcdserverpb" "github.com/coreos/etcd/lease" "github.com/coreos/etcd/lease/leasehttp" @@ -87,15 +88,34 @@ func (s *EtcdServer) Range(ctx context.Context, r *pb.RangeRequest) (*pb.RangeRe var err error if r.Serializable { - var user string - user, err = s.usernameFromCtx(ctx) - if err != nil { - return nil, err + for { + authInfo, err := s.authInfoFromCtx(ctx) + if err != nil { + return nil, err + } + + hdr := &pb.RequestHeader{} + if authInfo != nil { + hdr.Username = authInfo.Username + hdr.AuthRevision = authInfo.Revision + } + + result = s.applyV3.Apply(&pb.InternalRaftRequest{Header: hdr, Range: r}) + + if result.err != nil { + if result.err == auth.ErrAuthOldRevision { + continue + } + break + } + + if authInfo == nil || authInfo.Revision == s.authStore.Revision() { + break + } + + // The revision that authorized this request is obsolete. + // For avoiding TOCTOU problem, retry of the request is required. } - result = s.applyV3.Apply( - &pb.InternalRaftRequest{ - Header: &pb.RequestHeader{Username: user}, - Range: r}) } else { result, err = s.processInternalRaftRequest(ctx, pb.InternalRaftRequest{Range: r}) } @@ -135,14 +155,34 @@ func (s *EtcdServer) Txn(ctx context.Context, r *pb.TxnRequest) (*pb.TxnResponse var err error if isTxnSerializable(r) { - user, err := s.usernameFromCtx(ctx) - if err != nil { - return nil, err + for { + authInfo, err := s.authInfoFromCtx(ctx) + if err != nil { + return nil, err + } + + hdr := &pb.RequestHeader{} + if authInfo != nil { + hdr.Username = authInfo.Username + hdr.AuthRevision = authInfo.Revision + } + + result = s.applyV3.Apply(&pb.InternalRaftRequest{Header: hdr, Txn: r}) + + if result.err != nil { + if result.err == auth.ErrAuthOldRevision { + continue + } + break + } + + if authInfo == nil || authInfo.Revision == s.authStore.Revision() { + break + } + + // The revision that authorized this request is obsolete. + // For avoiding TOCTOU problem, retry of this request is required. } - result = s.applyV3.Apply( - &pb.InternalRaftRequest{ - Header: &pb.RequestHeader{Username: user}, - Txn: r}) } else { result, err = s.processInternalRaftRequest(ctx, pb.InternalRaftRequest{Txn: r}) } @@ -170,7 +210,7 @@ func isTxnSerializable(r *pb.TxnRequest) bool { } func (s *EtcdServer) Compact(ctx context.Context, r *pb.CompactionRequest) (*pb.CompactionResponse, error) { - result, err := s.processInternalRaftRequest(ctx, pb.InternalRaftRequest{Compaction: r}) + result, err := s.processInternalRaftRequestOnce(ctx, pb.InternalRaftRequest{Compaction: r}) if r.Physical && result != nil && result.physc != nil { <-result.physc // The compaction is done deleting keys; the hash is now settled @@ -203,7 +243,7 @@ func (s *EtcdServer) LeaseGrant(ctx context.Context, r *pb.LeaseGrantRequest) (* // only use positive int64 id's r.ID = int64(s.reqIDGen.Next() & ((1 << 63) - 1)) } - result, err := s.processInternalRaftRequest(ctx, pb.InternalRaftRequest{LeaseGrant: r}) + result, err := s.processInternalRaftRequestOnce(ctx, pb.InternalRaftRequest{LeaseGrant: r}) if err != nil { return nil, err } @@ -214,7 +254,7 @@ func (s *EtcdServer) LeaseGrant(ctx context.Context, r *pb.LeaseGrantRequest) (* } func (s *EtcdServer) LeaseRevoke(ctx context.Context, r *pb.LeaseRevokeRequest) (*pb.LeaseRevokeResponse, error) { - result, err := s.processInternalRaftRequest(ctx, pb.InternalRaftRequest{LeaseRevoke: r}) + result, err := s.processInternalRaftRequestOnce(ctx, pb.InternalRaftRequest{LeaseRevoke: r}) if err != nil { return nil, err } @@ -260,7 +300,7 @@ func (s *EtcdServer) LeaseRenew(id lease.LeaseID) (int64, error) { } func (s *EtcdServer) Alarm(ctx context.Context, r *pb.AlarmRequest) (*pb.AlarmResponse, error) { - result, err := s.processInternalRaftRequest(ctx, pb.InternalRaftRequest{Alarm: r}) + result, err := s.processInternalRaftRequestOnce(ctx, pb.InternalRaftRequest{Alarm: r}) if err != nil { return nil, err } @@ -271,7 +311,7 @@ func (s *EtcdServer) Alarm(ctx context.Context, r *pb.AlarmRequest) (*pb.AlarmRe } func (s *EtcdServer) AuthEnable(ctx context.Context, r *pb.AuthEnableRequest) (*pb.AuthEnableResponse, error) { - result, err := s.processInternalRaftRequest(ctx, pb.InternalRaftRequest{AuthEnable: r}) + result, err := s.processInternalRaftRequestOnce(ctx, pb.InternalRaftRequest{AuthEnable: r}) if err != nil { return nil, err } @@ -304,7 +344,7 @@ func (s *EtcdServer) Authenticate(ctx context.Context, r *pb.AuthenticateRequest SimpleToken: st, } - result, err := s.processInternalRaftRequest(ctx, pb.InternalRaftRequest{Authenticate: internalReq}) + result, err := s.processInternalRaftRequestOnce(ctx, pb.InternalRaftRequest{Authenticate: internalReq}) if err != nil { return nil, err } @@ -487,31 +527,31 @@ func (s *EtcdServer) isValidSimpleToken(token string) bool { return true } -func (s *EtcdServer) usernameFromCtx(ctx context.Context) (string, error) { +func (s *EtcdServer) authInfoFromCtx(ctx context.Context) (*auth.AuthInfo, error) { md, ok := metadata.FromContext(ctx) if !ok { - return "", nil + return nil, nil } ts, tok := md["token"] if !tok { - return "", nil + return nil, nil } token := ts[0] if !s.isValidSimpleToken(token) { - return "", ErrInvalidAuthToken + return nil, ErrInvalidAuthToken } - username, uok := s.AuthStore().UsernameFromToken(token) + authInfo, uok := s.AuthStore().AuthInfoFromToken(token) if !uok { plog.Warningf("invalid auth token: %s", token) - return "", ErrInvalidAuthToken + return nil, ErrInvalidAuthToken } - return username, nil + return authInfo, nil } -func (s *EtcdServer) processInternalRaftRequest(ctx context.Context, r pb.InternalRaftRequest) (*applyResult, error) { +func (s *EtcdServer) processInternalRaftRequestOnce(ctx context.Context, r pb.InternalRaftRequest) (*applyResult, error) { ai := s.getAppliedIndex() ci := s.getCommittedIndex() if ci > ai+maxGapBetweenApplyAndCommitIndex { @@ -521,11 +561,15 @@ func (s *EtcdServer) processInternalRaftRequest(ctx context.Context, r pb.Intern r.Header = &pb.RequestHeader{ ID: s.reqIDGen.Next(), } - username, err := s.usernameFromCtx(ctx) + + authInfo, err := s.authInfoFromCtx(ctx) if err != nil { return nil, err } - r.Header.Username = username + if authInfo != nil { + r.Header.Username = authInfo.Username + r.Header.AuthRevision = authInfo.Revision + } data, err := r.Marshal() if err != nil { @@ -562,5 +606,18 @@ func (s *EtcdServer) processInternalRaftRequest(ctx context.Context, r pb.Intern } } +func (s *EtcdServer) processInternalRaftRequest(ctx context.Context, r pb.InternalRaftRequest) (*applyResult, error) { + var result *applyResult + var err error + for { + result, err = s.processInternalRaftRequestOnce(ctx, r) + if err != auth.ErrAuthOldRevision { + break + } + } + + return result, err +} + // Watchable returns a watchable interface attached to the etcdserver. func (s *EtcdServer) Watchable() mvcc.WatchableKV { return s.KV() } diff --git a/vendor/github.com/coreos/etcd/lease/leasepb/lease.pb.go b/vendor/github.com/coreos/etcd/lease/leasepb/lease.pb.go index 1c03019..62115a3 100644 --- a/vendor/github.com/coreos/etcd/lease/leasepb/lease.pb.go +++ b/vendor/github.com/coreos/etcd/lease/leasepb/lease.pb.go @@ -16,7 +16,7 @@ package leasepb import ( "fmt" - proto "github.com/gogo/protobuf/proto" + proto "github.com/golang/protobuf/proto" math "math" ) @@ -30,7 +30,7 @@ var _ = math.Inf // This is a compile-time assertion to ensure that this generated file // is compatible with the proto package it is being compiled against. -const _ = proto.GoGoProtoPackageIsVersion1 +const _ = proto.ProtoPackageIsVersion1 type Lease struct { ID int64 `protobuf:"varint,1,opt,name=ID,json=iD,proto3" json:"ID,omitempty"` @@ -319,13 +319,13 @@ var ( ) var fileDescriptorLease = []byte{ - // 117 bytes of a gzipped FileDescriptorProto + // 126 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xe2, 0xe2, 0xce, 0x49, 0x4d, 0x2c, 0x4e, 0xd5, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x62, 0x07, 0x73, 0x0a, 0x92, 0xa4, 0x44, 0xd2, 0xf3, 0xd3, 0xf3, 0xc1, 0x62, 0xfa, 0x20, 0x16, 0x44, 0x5a, 0x49, 0x93, 0x8b, 0xd5, 0x07, 0xa4, 0x40, 0x88, 0x8f, 0x8b, 0xc9, 0xd3, 0x45, 0x82, 0x51, 0x81, 0x51, 0x83, 0x39, 0x88, 0x29, 0xd3, 0x45, 0x48, 0x80, 0x8b, 0x39, 0x24, 0xc4, 0x47, 0x82, 0x09, 0x2c, 0xc0, 0x5c, 0x12, 0xe2, 0xe3, - 0x24, 0x72, 0xe2, 0xa1, 0x1c, 0xc3, 0x05, 0x20, 0x3e, 0xf1, 0x48, 0x8e, 0xf1, 0x02, 0x10, 0x3f, - 0x00, 0xe2, 0x24, 0x36, 0xb0, 0x39, 0xc6, 0x80, 0x00, 0x00, 0x00, 0xff, 0xff, 0x8c, 0x1d, 0x92, - 0xdc, 0x75, 0x00, 0x00, 0x00, + 0x24, 0x71, 0xe2, 0xa1, 0x1c, 0xc3, 0x85, 0x87, 0x72, 0x0c, 0x27, 0x1e, 0xc9, 0x31, 0x5e, 0x78, + 0x24, 0xc7, 0xf8, 0xe0, 0x91, 0x1c, 0xe3, 0x8c, 0xc7, 0x72, 0x0c, 0x49, 0x6c, 0x60, 0xb3, 0x8c, + 0x01, 0x01, 0x00, 0x00, 0xff, 0xff, 0x0d, 0xa0, 0x42, 0x1a, 0x79, 0x00, 0x00, 0x00, } diff --git a/vendor/github.com/coreos/etcd/mvcc/mvccpb/kv.pb.go b/vendor/github.com/coreos/etcd/mvcc/mvccpb/kv.pb.go index e2732ed..e7575ca 100644 --- a/vendor/github.com/coreos/etcd/mvcc/mvccpb/kv.pb.go +++ b/vendor/github.com/coreos/etcd/mvcc/mvccpb/kv.pb.go @@ -17,7 +17,7 @@ package mvccpb import ( "fmt" - proto "github.com/gogo/protobuf/proto" + proto "github.com/golang/protobuf/proto" math "math" ) @@ -31,7 +31,7 @@ var _ = math.Inf // This is a compile-time assertion to ensure that this generated file // is compatible with the proto package it is being compiled against. -const _ = proto.GoGoProtoPackageIsVersion1 +const _ = proto.ProtoPackageIsVersion1 type Event_EventType int32 @@ -708,24 +708,24 @@ var ( ) var fileDescriptorKv = []byte{ - // 292 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x74, 0x90, 0xc1, 0x4a, 0xc3, 0x40, - 0x10, 0x86, 0xbb, 0x4d, 0x9b, 0xd4, 0x69, 0xa9, 0x61, 0x09, 0x18, 0x3c, 0x94, 0x98, 0x8b, 0x8a, - 0x10, 0xa1, 0xbe, 0x81, 0x98, 0x53, 0x3d, 0x48, 0x88, 0x5e, 0x4b, 0x1a, 0x87, 0x52, 0xd2, 0x76, - 0x43, 0x1a, 0x17, 0xf2, 0x3c, 0xde, 0x7d, 0x8e, 0x1e, 0xfb, 0x08, 0xea, 0x93, 0xb8, 0x3b, 0x6b, - 0xea, 0xc9, 0xc3, 0x2c, 0x33, 0xff, 0xff, 0xb1, 0xfb, 0xcf, 0xc2, 0xa0, 0x90, 0x51, 0x59, 0x89, - 0x5a, 0x70, 0x7b, 0x23, 0xf3, 0xbc, 0x5c, 0x9c, 0x7b, 0x4b, 0xb1, 0x14, 0x24, 0xdd, 0xea, 0xce, - 0xb8, 0xe1, 0x07, 0x83, 0xc1, 0x0c, 0x9b, 0x97, 0x6c, 0xfd, 0x86, 0xdc, 0x05, 0xab, 0xc0, 0xc6, - 0x67, 0x01, 0xbb, 0x1a, 0x25, 0xba, 0xe5, 0x97, 0x70, 0x9a, 0x57, 0x98, 0xd5, 0x38, 0xaf, 0x50, - 0xae, 0x76, 0x2b, 0xb1, 0xf5, 0xbb, 0xca, 0xb5, 0x92, 0xb1, 0x91, 0x93, 0x5f, 0x95, 0x5f, 0xc0, - 0x68, 0x23, 0x5e, 0xff, 0x28, 0x8b, 0xa8, 0xa1, 0xd2, 0x8e, 0x88, 0x0f, 0x8e, 0xc4, 0x8a, 0xdc, - 0x1e, 0xb9, 0xed, 0xc8, 0x3d, 0xe8, 0x4b, 0x1d, 0xc0, 0xef, 0xd3, 0xcb, 0x66, 0xd0, 0xea, 0x1a, - 0xb3, 0x1d, 0xfa, 0x36, 0xd1, 0x66, 0x08, 0xdf, 0x19, 0xf4, 0x63, 0x89, 0xdb, 0x9a, 0xdf, 0x40, - 0xaf, 0x6e, 0x4a, 0xa4, 0xb8, 0xe3, 0xe9, 0x59, 0x64, 0xf6, 0x8c, 0xc8, 0x34, 0x67, 0xaa, 0xec, - 0x84, 0x20, 0x1e, 0x40, 0xb7, 0x90, 0x94, 0x7d, 0x38, 0x75, 0x5b, 0xb4, 0x5d, 0x3c, 0x51, 0x1e, - 0xbf, 0x06, 0xa7, 0x54, 0xf1, 0xe7, 0x0a, 0xb3, 0xfe, 0xc1, 0x6c, 0x0d, 0xcc, 0x64, 0x18, 0xc0, - 0xc9, 0xf1, 0x7e, 0xee, 0x80, 0xf5, 0xf4, 0x9c, 0xba, 0x1d, 0x0e, 0x60, 0x3f, 0xc4, 0x8f, 0x71, - 0x1a, 0xbb, 0xec, 0xde, 0xdb, 0x7f, 0x4d, 0x3a, 0x07, 0x55, 0xfb, 0xef, 0x09, 0x3b, 0xa8, 0xfa, - 0x54, 0xb5, 0xb0, 0xe9, 0xcf, 0xef, 0x7e, 0x02, 0x00, 0x00, 0xff, 0xff, 0xbb, 0x86, 0x36, 0x07, - 0x9d, 0x01, 0x00, 0x00, + // 303 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x6c, 0x90, 0x41, 0x4e, 0xc2, 0x40, + 0x14, 0x86, 0x3b, 0x14, 0x0a, 0x3e, 0x08, 0x36, 0x13, 0x12, 0x27, 0x2e, 0x26, 0x95, 0x8d, 0x18, + 0x13, 0x4c, 0xf0, 0x06, 0xc6, 0xae, 0x70, 0x61, 0x1a, 0x74, 0x4b, 0x4a, 0x79, 0x21, 0xa4, 0x94, + 0x69, 0x4a, 0x9d, 0xa4, 0x37, 0x71, 0xef, 0xde, 0x73, 0xb0, 0xe4, 0x08, 0x52, 0x2f, 0x62, 0xfa, + 0xc6, 0xe2, 0xc6, 0xcd, 0xe4, 0xfd, 0xff, 0xff, 0x65, 0xe6, 0x7f, 0x03, 0x9d, 0x58, 0x8f, 0xd3, + 0x4c, 0xe5, 0x8a, 0x3b, 0x89, 0x8e, 0xa2, 0x74, 0x71, 0x39, 0x58, 0xa9, 0x95, 0x22, 0xeb, 0xae, + 0x9a, 0x4c, 0x3a, 0xfc, 0x64, 0xd0, 0x99, 0x62, 0xf1, 0x1a, 0x6e, 0xde, 0x90, 0xbb, 0x60, 0xc7, + 0x58, 0x08, 0xe6, 0xb1, 0x51, 0x2f, 0xa8, 0x46, 0x7e, 0x0d, 0xe7, 0x51, 0x86, 0x61, 0x8e, 0xf3, + 0x0c, 0xf5, 0x7a, 0xb7, 0x56, 0x5b, 0xd1, 0xf0, 0xd8, 0xc8, 0x0e, 0xfa, 0xc6, 0x0e, 0x7e, 0x5d, + 0x7e, 0x05, 0xbd, 0x44, 0x2d, 0xff, 0x28, 0x9b, 0xa8, 0x6e, 0xa2, 0x96, 0x27, 0x44, 0x40, 0x5b, + 0x63, 0x46, 0x69, 0x93, 0xd2, 0x5a, 0xf2, 0x01, 0xb4, 0x74, 0x55, 0x40, 0xb4, 0xe8, 0x65, 0x23, + 0x2a, 0x77, 0x83, 0xe1, 0x0e, 0x85, 0x43, 0xb4, 0x11, 0xc3, 0x0f, 0x06, 0x2d, 0x5f, 0xe3, 0x36, + 0xe7, 0xb7, 0xd0, 0xcc, 0x8b, 0x14, 0xa9, 0x6e, 0x7f, 0x72, 0x31, 0x36, 0x7b, 0x8e, 0x29, 0x34, + 0xe7, 0xac, 0x48, 0x31, 0x20, 0x88, 0x7b, 0xd0, 0x88, 0x35, 0x75, 0xef, 0x4e, 0xdc, 0x1a, 0xad, + 0x17, 0x0f, 0x1a, 0xb1, 0xe6, 0x37, 0xd0, 0x4e, 0x33, 0xd4, 0xf3, 0x58, 0x53, 0xf9, 0xff, 0x30, + 0xa7, 0x02, 0xa6, 0x7a, 0xe8, 0xc1, 0xd9, 0xe9, 0x7e, 0xde, 0x06, 0xfb, 0xf9, 0x65, 0xe6, 0x5a, + 0x1c, 0xc0, 0x79, 0xf4, 0x9f, 0xfc, 0x99, 0xef, 0xb2, 0x07, 0xb1, 0x3f, 0x4a, 0xeb, 0x70, 0x94, + 0xd6, 0xbe, 0x94, 0xec, 0x50, 0x4a, 0xf6, 0x55, 0x4a, 0xf6, 0xfe, 0x2d, 0xad, 0x85, 0x43, 0xff, + 0x7e, 0xff, 0x13, 0x00, 0x00, 0xff, 0xff, 0xb5, 0x45, 0x92, 0x5d, 0xa1, 0x01, 0x00, 0x00, } diff --git a/vendor/github.com/coreos/etcd/pkg/fileutil/purge.go b/vendor/github.com/coreos/etcd/pkg/fileutil/purge.go index 77d021a..53bda0c 100644 --- a/vendor/github.com/coreos/etcd/pkg/fileutil/purge.go +++ b/vendor/github.com/coreos/etcd/pkg/fileutil/purge.go @@ -23,6 +23,11 @@ import ( ) func PurgeFile(dirname string, suffix string, max uint, interval time.Duration, stop <-chan struct{}) <-chan error { + return purgeFile(dirname, suffix, max, interval, stop, nil) +} + +// purgeFile is the internal implementation for PurgeFile which can post purged files to purgec if non-nil. +func purgeFile(dirname string, suffix string, max uint, interval time.Duration, stop <-chan struct{}, purgec chan<- string) <-chan error { errC := make(chan error, 1) go func() { for { @@ -38,6 +43,7 @@ func PurgeFile(dirname string, suffix string, max uint, interval time.Duration, } } sort.Strings(newfnames) + fnames = newfnames for len(newfnames) > int(max) { f := path.Join(dirname, newfnames[0]) l, err := TryLockFile(f, os.O_WRONLY, PrivateFileMode) @@ -56,6 +62,11 @@ func PurgeFile(dirname string, suffix string, max uint, interval time.Duration, plog.Infof("purged file %s successfully", f) newfnames = newfnames[1:] } + if purgec != nil { + for i := 0; i < len(fnames)-len(newfnames); i++ { + purgec <- fnames[i] + } + } select { case <-time.After(interval): case <-stop: diff --git a/vendor/github.com/coreos/etcd/pkg/fileutil/purge_test.go b/vendor/github.com/coreos/etcd/pkg/fileutil/purge_test.go index f3c10fc..6960ce6 100644 --- a/vendor/github.com/coreos/etcd/pkg/fileutil/purge_test.go +++ b/vendor/github.com/coreos/etcd/pkg/fileutil/purge_test.go @@ -31,44 +31,48 @@ func TestPurgeFile(t *testing.T) { } defer os.RemoveAll(dir) - for i := 0; i < 5; i++ { - var f *os.File - f, err = os.Create(path.Join(dir, fmt.Sprintf("%d.test", i))) - if err != nil { + // minimal file set + for i := 0; i < 3; i++ { + f, ferr := os.Create(path.Join(dir, fmt.Sprintf("%d.test", i))) + if ferr != nil { t.Fatal(err) } f.Close() } - stop := make(chan struct{}) + stop, purgec := make(chan struct{}), make(chan string, 10) - // keep at most 3 most recent files - errch := PurgeFile(dir, "test", 3, time.Millisecond, stop) - - // create 5 more files - for i := 5; i < 10; i++ { - var f *os.File - f, err = os.Create(path.Join(dir, fmt.Sprintf("%d.test", i))) - if err != nil { - t.Fatal(err) + // keep 3 most recent files + errch := purgeFile(dir, "test", 3, time.Millisecond, stop, purgec) + select { + case f := <-purgec: + t.Errorf("unexpected purge on %q", f) + case <-time.After(10 * time.Millisecond): + } + + // rest of the files + for i := 4; i < 10; i++ { + go func(n int) { + f, ferr := os.Create(path.Join(dir, fmt.Sprintf("%d.test", n))) + if ferr != nil { + t.Fatal(err) + } + f.Close() + }(i) + } + + // watch files purge away + for i := 4; i < 10; i++ { + select { + case <-purgec: + case <-time.After(time.Second): + t.Errorf("purge took too long") } - f.Close() - time.Sleep(10 * time.Millisecond) } - // purge routine should purge 7 out of 10 files and only keep the - // 3 most recent ones. - // Wait for purging for at most 300ms. - var fnames []string - for i := 0; i < 30; i++ { - fnames, err = ReadDir(dir) - if err != nil { - t.Fatal(err) - } - if len(fnames) <= 3 { - break - } - time.Sleep(10 * time.Millisecond) + fnames, rerr := ReadDir(dir) + if rerr != nil { + t.Fatal(rerr) } wnames := []string{"7.test", "8.test", "9.test"} if !reflect.DeepEqual(fnames, wnames) { @@ -77,9 +81,11 @@ func TestPurgeFile(t *testing.T) { // no error should be reported from purge routine select { + case f := <-purgec: + t.Errorf("unexpected purge on %q", f) case err := <-errch: t.Errorf("unexpected purge error %v", err) - case <-time.After(time.Millisecond): + case <-time.After(10 * time.Millisecond): } close(stop) } @@ -107,29 +113,33 @@ func TestPurgeFileHoldingLockFile(t *testing.T) { t.Fatal(err) } - stop := make(chan struct{}) - errch := PurgeFile(dir, "test", 3, time.Millisecond, stop) + stop, purgec := make(chan struct{}), make(chan string, 10) + errch := purgeFile(dir, "test", 3, time.Millisecond, stop, purgec) - var fnames []string - for i := 0; i < 10; i++ { - fnames, err = ReadDir(dir) - if err != nil { - t.Fatal(err) - } - if len(fnames) <= 5 { - break + for i := 0; i < 5; i++ { + select { + case <-purgec: + case <-time.After(time.Second): + t.Fatalf("purge took too long") } - time.Sleep(10 * time.Millisecond) } + + fnames, rerr := ReadDir(dir) + if rerr != nil { + t.Fatal(rerr) + } + wnames := []string{"5.test", "6.test", "7.test", "8.test", "9.test"} if !reflect.DeepEqual(fnames, wnames) { t.Errorf("filenames = %v, want %v", fnames, wnames) } select { + case s := <-purgec: + t.Errorf("unexpected purge %q", s) case err = <-errch: t.Errorf("unexpected purge error %v", err) - case <-time.After(time.Millisecond): + case <-time.After(10 * time.Millisecond): } // remove the purge barrier @@ -137,15 +147,18 @@ func TestPurgeFileHoldingLockFile(t *testing.T) { t.Fatal(err) } - for i := 0; i < 10; i++ { - fnames, err = ReadDir(dir) - if err != nil { - t.Fatal(err) + // wait for rest of purges (5, 6) + for i := 0; i < 2; i++ { + select { + case <-purgec: + case <-time.After(time.Second): + t.Fatalf("purge took too long") } - if len(fnames) <= 3 { - break - } - time.Sleep(10 * time.Millisecond) + } + + fnames, rerr = ReadDir(dir) + if rerr != nil { + t.Fatal(rerr) } wnames = []string{"7.test", "8.test", "9.test"} if !reflect.DeepEqual(fnames, wnames) { @@ -153,9 +166,11 @@ func TestPurgeFileHoldingLockFile(t *testing.T) { } select { + case f := <-purgec: + t.Errorf("unexpected purge on %q", f) case err := <-errch: t.Errorf("unexpected purge error %v", err) - case <-time.After(time.Millisecond): + case <-time.After(10 * time.Millisecond): } close(stop) diff --git a/vendor/github.com/coreos/etcd/pkg/transport/listener.go b/vendor/github.com/coreos/etcd/pkg/transport/listener.go index d94757b..78407ad 100644 --- a/vendor/github.com/coreos/etcd/pkg/transport/listener.go +++ b/vendor/github.com/coreos/etcd/pkg/transport/listener.go @@ -34,27 +34,30 @@ import ( "github.com/coreos/etcd/pkg/tlsutil" ) -func NewListener(addr string, scheme string, tlscfg *tls.Config) (l net.Listener, err error) { +func NewListener(addr, scheme string, tlscfg *tls.Config) (l net.Listener, err error) { + if l, err = newListener(addr, scheme); err != nil { + return nil, err + } + return wrapTLS(addr, scheme, tlscfg, l) +} + +func newListener(addr string, scheme string) (net.Listener, error) { if scheme == "unix" || scheme == "unixs" { // unix sockets via unix://laddr - l, err = NewUnixListener(addr) - } else { - l, err = net.Listen("tcp", addr) + return NewUnixListener(addr) } + return net.Listen("tcp", addr) +} - if err != nil { - return nil, err +func wrapTLS(addr, scheme string, tlscfg *tls.Config, l net.Listener) (net.Listener, error) { + if scheme != "https" && scheme != "unixs" { + return l, nil } - - if scheme == "https" || scheme == "unixs" { - if tlscfg == nil { - return nil, fmt.Errorf("cannot listen on TLS for %s: KeyFile and CertFile are not presented", scheme+"://"+addr) - } - - l = tls.NewListener(l, tlscfg) + if tlscfg == nil { + l.Close() + return nil, fmt.Errorf("cannot listen on TLS for %s: KeyFile and CertFile are not presented", scheme+"://"+addr) } - - return l, nil + return tls.NewListener(l, tlscfg), nil } type TLSInfo struct { diff --git a/vendor/github.com/coreos/etcd/pkg/transport/timeout_listener.go b/vendor/github.com/coreos/etcd/pkg/transport/timeout_listener.go index f176c43..0f4df5f 100644 --- a/vendor/github.com/coreos/etcd/pkg/transport/timeout_listener.go +++ b/vendor/github.com/coreos/etcd/pkg/transport/timeout_listener.go @@ -24,15 +24,19 @@ import ( // If read/write on the accepted connection blocks longer than its time limit, // it will return timeout error. func NewTimeoutListener(addr string, scheme string, tlscfg *tls.Config, rdtimeoutd, wtimeoutd time.Duration) (net.Listener, error) { - ln, err := NewListener(addr, scheme, tlscfg) + ln, err := newListener(addr, scheme) if err != nil { return nil, err } - return &rwTimeoutListener{ + ln = &rwTimeoutListener{ Listener: ln, rdtimeoutd: rdtimeoutd, wtimeoutd: wtimeoutd, - }, nil + } + if ln, err = wrapTLS(addr, scheme, tlscfg, ln); err != nil { + return nil, err + } + return ln, nil } type rwTimeoutListener struct { diff --git a/vendor/github.com/coreos/etcd/raft/node.go b/vendor/github.com/coreos/etcd/raft/node.go index 3f5f146..56b3bee 100644 --- a/vendor/github.com/coreos/etcd/raft/node.go +++ b/vendor/github.com/coreos/etcd/raft/node.go @@ -157,6 +157,18 @@ type Node interface { // in snapshots. Will never return nil; it returns a pointer only // to match MemoryStorage.Compact. ApplyConfChange(cc pb.ConfChange) *pb.ConfState + + // ReadIndex request a read state. The read state will be set in the ready. + // Read state has a read index. Once the application advances further than the read + // index, any linearizable read requests issued before the read request can be + // processed safely. The read state will have the same rctx attached. + // + // Note: the current implementation depends on the leader lease. If the clock drift is unbounded, + // leader might keep the lease longer than it should (clock can move backward/pause without any bound). + // ReadIndex is not safe in that case. + // TODO: add clock drift bound into raft configuration. + ReadIndex(ctx context.Context, rctx []byte) error + // Status returns the current status of the raft state machine. Status() Status // ReportUnreachable reports the given node is not reachable for the last send. @@ -487,8 +499,8 @@ func (n *node) ReportSnapshot(id uint64, status SnapshotStatus) { } } -func (n *node) ReadIndex(ctx context.Context, id uint64, rctx []byte) error { - return n.step(ctx, pb.Message{Type: pb.MsgReadIndex, From: id, Entries: []pb.Entry{{Data: rctx}}}) +func (n *node) ReadIndex(ctx context.Context, rctx []byte) error { + return n.step(ctx, pb.Message{Type: pb.MsgReadIndex, Entries: []pb.Entry{{Data: rctx}}}) } func newReady(r *raft, prevSoftSt *SoftState, prevHardSt pb.HardState) Ready { diff --git a/vendor/github.com/coreos/etcd/raft/node_test.go b/vendor/github.com/coreos/etcd/raft/node_test.go index ef27a4c..410cca9 100644 --- a/vendor/github.com/coreos/etcd/raft/node_test.go +++ b/vendor/github.com/coreos/etcd/raft/node_test.go @@ -180,7 +180,7 @@ func TestNodeReadIndex(t *testing.T) { r.step = appendStep wrequestCtx = []byte("somedata2") - n.ReadIndex(context.TODO(), r.id, wrequestCtx) + n.ReadIndex(context.TODO(), wrequestCtx) n.Stop() if len(msgs) != 1 { diff --git a/vendor/github.com/coreos/etcd/raft/raft.go b/vendor/github.com/coreos/etcd/raft/raft.go index ab048b5..c4ba9e7 100644 --- a/vendor/github.com/coreos/etcd/raft/raft.go +++ b/vendor/github.com/coreos/etcd/raft/raft.go @@ -681,8 +681,12 @@ func stepLeader(r *raft, m pb.Message) { if r.checkQuorum { ri = r.raftLog.committed } - - r.send(pb.Message{To: m.From, Type: pb.MsgReadIndexResp, Index: ri, Entries: m.Entries}) + if m.From == None || m.From == r.id { // from local member + r.readState.Index = ri + r.readState.RequestCtx = m.Entries[0].Data + } else { + r.send(pb.Message{To: m.From, Type: pb.MsgReadIndexResp, Index: ri, Entries: m.Entries}) + } return } diff --git a/vendor/github.com/coreos/etcd/raft/raftpb/raft.pb.go b/vendor/github.com/coreos/etcd/raft/raftpb/raft.pb.go index 7f1b8fb..5d3e11a 100644 --- a/vendor/github.com/coreos/etcd/raft/raftpb/raft.pb.go +++ b/vendor/github.com/coreos/etcd/raft/raftpb/raft.pb.go @@ -22,7 +22,7 @@ package raftpb import ( "fmt" - proto "github.com/gogo/protobuf/proto" + proto "github.com/golang/protobuf/proto" math "math" ) @@ -36,7 +36,7 @@ var _ = math.Inf // This is a compile-time assertion to ensure that this generated file // is compatible with the proto package it is being compiled against. -const _ = proto.GoGoProtoPackageIsVersion1 +const _ = proto.ProtoPackageIsVersion1 type EntryType int32 @@ -1836,53 +1836,54 @@ var ( ) var fileDescriptorRaft = []byte{ - // 760 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x64, 0x54, 0xcd, 0x4e, 0xdb, 0x4a, - 0x14, 0xc6, 0x89, 0xf3, 0x77, 0x12, 0xc2, 0x30, 0xe4, 0x5e, 0x59, 0xe8, 0x8a, 0xcb, 0xb5, 0xee, - 0xa2, 0xa2, 0x82, 0xb6, 0x2c, 0xba, 0xe8, 0x0e, 0x42, 0x25, 0x90, 0x0a, 0x6a, 0x03, 0x74, 0xd1, - 0xaa, 0xaa, 0x86, 0x78, 0xe2, 0xa4, 0xc5, 0x1e, 0x6b, 0x3c, 0xa1, 0xb0, 0xa9, 0xfa, 0x00, 0x7d, - 0x85, 0x3e, 0x43, 0x5f, 0x83, 0x25, 0x4f, 0x50, 0xb5, 0x7d, 0x92, 0x9e, 0x19, 0x8f, 0x13, 0x9b, - 0x2c, 0x2c, 0xcd, 0x7c, 0xdf, 0x99, 0x73, 0xbe, 0xf9, 0xce, 0x19, 0x03, 0x48, 0x36, 0x52, 0x3b, - 0x89, 0x14, 0x4a, 0xd0, 0xba, 0x5e, 0x27, 0x17, 0xeb, 0xbd, 0x50, 0x84, 0xc2, 0x40, 0x8f, 0xf4, - 0x2a, 0x63, 0xfd, 0xcf, 0x50, 0x7b, 0x1e, 0x2b, 0x79, 0x43, 0x1f, 0x82, 0x7b, 0x76, 0x93, 0x70, - 0xcf, 0xd9, 0x74, 0x1e, 0x74, 0x77, 0x57, 0x77, 0xb2, 0x53, 0x3b, 0x86, 0xd4, 0xc4, 0xbe, 0x7b, - 0xfb, 0xe3, 0xdf, 0xa5, 0x81, 0xab, 0x70, 0x4d, 0x3d, 0x0c, 0xe6, 0x32, 0xf2, 0x2a, 0x18, 0xec, - 0xce, 0x18, 0x44, 0xe8, 0x3a, 0xd4, 0x8e, 0xe2, 0x80, 0x5f, 0x7b, 0xd5, 0x02, 0x55, 0x9b, 0x68, - 0x88, 0x52, 0x70, 0x0f, 0x98, 0x62, 0x9e, 0x8b, 0x54, 0x67, 0xe0, 0x06, 0xb8, 0xf6, 0xbf, 0x38, - 0x40, 0x4e, 0x63, 0x96, 0xa4, 0x63, 0xa1, 0x8e, 0xb9, 0x62, 0x1a, 0xa4, 0x4f, 0x01, 0x86, 0x22, - 0x1e, 0xbd, 0x4f, 0x15, 0x53, 0x99, 0xa2, 0xf6, 0x5c, 0x51, 0x1f, 0x99, 0x53, 0x4d, 0xd8, 0xe4, - 0xad, 0x61, 0x0e, 0xe8, 0xe2, 0xa6, 0x52, 0x49, 0x97, 0x2d, 0x8e, 0x92, 0xb5, 0xc0, 0x92, 0x2e, - 0x83, 0xf8, 0x6f, 0xa0, 0x99, 0x2b, 0xd0, 0x12, 0xb5, 0x02, 0x53, 0xd3, 0x4a, 0xa4, 0xcf, 0xa0, - 0x19, 0x59, 0x65, 0x26, 0x71, 0x7b, 0xd7, 0xcb, 0xb5, 0xdc, 0x57, 0x6e, 0xf3, 0xce, 0xe2, 0xfd, - 0x6f, 0x55, 0x68, 0x1c, 0xf3, 0x34, 0x65, 0x21, 0xa7, 0xdb, 0x60, 0xcc, 0xb3, 0x0e, 0xaf, 0xe5, - 0x39, 0x2c, 0xbd, 0xe0, 0x71, 0x0f, 0x2a, 0x4a, 0x94, 0x6e, 0x82, 0x7b, 0x7d, 0x8d, 0x91, 0x14, - 0xf7, 0xae, 0xa1, 0x91, 0xd9, 0x05, 0xdd, 0x85, 0x9e, 0x6c, 0x40, 0xe3, 0x52, 0x84, 0xa6, 0x61, - 0xb5, 0x02, 0x99, 0x83, 0x73, 0xdb, 0xea, 0x8b, 0xb6, 0x6d, 0x43, 0x83, 0xe3, 0x08, 0x4c, 0x78, - 0xea, 0x35, 0x36, 0xab, 0x78, 0xf7, 0xe5, 0xd2, 0x64, 0xe4, 0xa9, 0x6c, 0x0c, 0xfd, 0x07, 0xea, - 0x43, 0x11, 0x45, 0x13, 0xe5, 0x35, 0x0b, 0xb9, 0x2c, 0x46, 0x77, 0xa1, 0x99, 0x5a, 0xc7, 0xbc, - 0x96, 0x71, 0x92, 0xdc, 0x77, 0x32, 0x77, 0x30, 0x8f, 0xd3, 0x19, 0x25, 0xff, 0xc0, 0x87, 0xca, - 0x03, 0x3c, 0xd1, 0xcc, 0x33, 0x66, 0x18, 0xfd, 0x1f, 0x47, 0xdd, 0xac, 0x0e, 0x27, 0xb1, 0xf2, - 0xda, 0x85, 0x9a, 0x05, 0x1c, 0xad, 0x69, 0xe0, 0x90, 0x28, 0x7e, 0xad, 0xbc, 0x8e, 0x69, 0x6c, - 0xbe, 0xf5, 0xdf, 0x41, 0xeb, 0x90, 0xc9, 0x20, 0x1b, 0x9f, 0xdc, 0x41, 0x67, 0xc1, 0x41, 0x64, - 0xae, 0x04, 0x8e, 0x62, 0x69, 0xde, 0x35, 0x52, 0xb8, 0x70, 0x75, 0xf1, 0xc2, 0xfe, 0x7f, 0xd0, - 0x9a, 0x8d, 0x2b, 0x36, 0xb4, 0x16, 0x8b, 0x00, 0x8d, 0x74, 0xd0, 0x48, 0x77, 0x90, 0x6d, 0xfc, - 0xaf, 0x0e, 0x80, 0x8e, 0xe9, 0x8f, 0x59, 0x1c, 0x9a, 0xae, 0x1f, 0x1d, 0x94, 0x14, 0x54, 0x26, - 0x07, 0xf4, 0xb1, 0x7d, 0x9c, 0x15, 0x33, 0x3a, 0x7f, 0x17, 0x9f, 0x42, 0x76, 0x6e, 0x61, 0x7a, - 0x50, 0xd7, 0x09, 0xe6, 0xc7, 0x5c, 0x25, 0x5d, 0xb1, 0xc1, 0xb4, 0x21, 0x7d, 0x6b, 0x88, 0x5b, - 0x32, 0x64, 0xeb, 0x09, 0xb4, 0x66, 0x4f, 0x9e, 0xae, 0x40, 0xdb, 0x6c, 0x4e, 0x84, 0x8c, 0xd8, - 0x25, 0x59, 0xa2, 0x6b, 0xb0, 0x62, 0x80, 0x79, 0x61, 0xe2, 0x6c, 0x7d, 0xaf, 0x40, 0xbb, 0x30, - 0xc4, 0x14, 0xa0, 0x7e, 0x9c, 0x86, 0x87, 0xd3, 0x04, 0x0f, 0xb4, 0x71, 0xfc, 0xd3, 0x70, 0x9f, - 0x33, 0x45, 0x1c, 0xbb, 0x79, 0x29, 0x45, 0x42, 0x2a, 0x36, 0x6a, 0x2f, 0x49, 0x48, 0x95, 0x76, - 0x01, 0xb2, 0xf5, 0x80, 0xa7, 0x09, 0x71, 0x6d, 0xe0, 0x6b, 0xf4, 0x97, 0xd4, 0xb4, 0x08, 0xbb, - 0x31, 0x6c, 0xdd, 0xb2, 0x7a, 0x60, 0x48, 0x83, 0x12, 0xe8, 0xe8, 0x62, 0x9c, 0x49, 0x75, 0xa1, - 0xab, 0x34, 0xd1, 0x41, 0x52, 0x44, 0xcc, 0xa1, 0x16, 0x3e, 0xec, 0x2e, 0xa2, 0xe7, 0xb1, 0xe4, - 0x6c, 0x38, 0x66, 0x17, 0x97, 0x9c, 0x00, 0x5d, 0x85, 0x65, 0x9b, 0x48, 0x37, 0x68, 0x9a, 0x92, - 0xb6, 0x0d, 0xeb, 0x8f, 0xf9, 0xf0, 0xe3, 0xab, 0xa9, 0x90, 0xd3, 0x88, 0x74, 0xe8, 0x5f, 0xb0, - 0x8a, 0xd8, 0x99, 0x64, 0x71, 0x3a, 0xe2, 0xf2, 0x05, 0x67, 0x01, 0x97, 0x64, 0xd9, 0x9e, 0x3e, - 0x9b, 0x44, 0x5c, 0x4c, 0xd5, 0x89, 0xf8, 0x44, 0xba, 0x56, 0xcc, 0x00, 0x23, 0xcc, 0x3f, 0x90, - 0xac, 0x58, 0x31, 0x33, 0xc4, 0x88, 0x21, 0x5b, 0x6f, 0xa1, 0x5b, 0x6e, 0x9d, 0xae, 0x31, 0x47, - 0xf6, 0x82, 0x40, 0xf7, 0x0e, 0xed, 0xf3, 0xa0, 0x37, 0x87, 0x07, 0x3c, 0x12, 0x57, 0xdc, 0x30, - 0x4e, 0x99, 0x39, 0x4f, 0xf0, 0x67, 0x93, 0x31, 0x95, 0xfd, 0xde, 0xed, 0xaf, 0x8d, 0xa5, 0x3b, - 0xfc, 0x6e, 0x7f, 0x6f, 0x38, 0x77, 0xf8, 0xfd, 0xc4, 0xef, 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, - 0x32, 0x70, 0x89, 0x36, 0x12, 0x06, 0x00, 0x00, + // 776 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x64, 0x54, 0xcd, 0x6e, 0xdb, 0x38, + 0x10, 0xb6, 0x64, 0xf9, 0x6f, 0xe4, 0x38, 0x0c, 0xe3, 0x5d, 0x10, 0x41, 0xe0, 0xf5, 0x1a, 0x7b, + 0x30, 0xb2, 0x48, 0x76, 0xd7, 0x87, 0x3d, 0xf4, 0x96, 0xd8, 0x05, 0x12, 0xa0, 0x0e, 0x5a, 0xc7, + 0xe9, 0xa1, 0x45, 0x51, 0x30, 0x16, 0x2d, 0xbb, 0x8d, 0x44, 0x81, 0xa2, 0xd3, 0xe4, 0x52, 0xf4, + 0x01, 0xfa, 0x00, 0xbd, 0xf4, 0x19, 0xfa, 0x1a, 0x39, 0xe6, 0x09, 0x8a, 0x26, 0x7d, 0x91, 0x82, + 0x14, 0x65, 0x4b, 0xf1, 0x8d, 0xfc, 0xbe, 0xe1, 0xcc, 0x37, 0xdf, 0x8c, 0x04, 0x20, 0xe8, 0x54, + 0x1e, 0x44, 0x82, 0x4b, 0x8e, 0xcb, 0xea, 0x1c, 0x5d, 0xec, 0x34, 0x7d, 0xee, 0x73, 0x0d, 0xfd, + 0xa3, 0x4e, 0x09, 0xdb, 0xf9, 0x08, 0xa5, 0xa7, 0xa1, 0x14, 0x37, 0xf8, 0x6f, 0x70, 0xc6, 0x37, + 0x11, 0x23, 0x56, 0xdb, 0xea, 0x36, 0x7a, 0x5b, 0x07, 0xc9, 0xab, 0x03, 0x4d, 0x2a, 0xe2, 0xc8, + 0xb9, 0xfd, 0xfe, 0x47, 0x61, 0xe4, 0xc8, 0x9b, 0x88, 0x61, 0x02, 0xce, 0x98, 0x89, 0x80, 0xd8, + 0x6d, 0xab, 0xeb, 0x2c, 0x19, 0x26, 0x02, 0xbc, 0x03, 0xa5, 0x93, 0xd0, 0x63, 0xd7, 0xa4, 0x98, + 0xa1, 0x4a, 0x73, 0x05, 0x61, 0x0c, 0xce, 0x80, 0x4a, 0x4a, 0x9c, 0xb6, 0xd5, 0xad, 0x8f, 0x1c, + 0x8f, 0x4a, 0xda, 0xf9, 0x64, 0x01, 0x3a, 0x0b, 0x69, 0x14, 0xcf, 0xb8, 0x1c, 0x32, 0x49, 0x15, + 0x88, 0xff, 0x07, 0x98, 0xf0, 0x70, 0xfa, 0x36, 0x96, 0x54, 0x26, 0x8a, 0xdc, 0x95, 0xa2, 0x3e, + 0x0f, 0xa7, 0x67, 0x8a, 0x30, 0xc9, 0x6b, 0x93, 0x14, 0x50, 0xc5, 0x75, 0xa5, 0x9c, 0x2e, 0x53, + 0x9c, 0x80, 0x16, 0x98, 0xd3, 0xa5, 0x91, 0xce, 0x2b, 0xa8, 0xa6, 0x0a, 0x94, 0x44, 0xa5, 0x40, + 0xd7, 0x34, 0x12, 0xf1, 0x13, 0xa8, 0x06, 0x46, 0x99, 0x4e, 0xec, 0xf6, 0x48, 0xaa, 0xe5, 0xb1, + 0x72, 0x93, 0x77, 0x19, 0xdf, 0xf9, 0x5a, 0x84, 0xca, 0x90, 0xc5, 0x31, 0xf5, 0x19, 0xde, 0x07, + 0x6d, 0x9e, 0x71, 0x78, 0x3b, 0xcd, 0x61, 0xe8, 0x35, 0x8f, 0x9b, 0x60, 0x4b, 0x9e, 0xeb, 0xc4, + 0x96, 0x5c, 0xb5, 0x31, 0x15, 0xfc, 0x51, 0x1b, 0x0a, 0x59, 0x36, 0xe8, 0xac, 0xcd, 0xa4, 0x05, + 0x95, 0x4b, 0xee, 0xeb, 0x81, 0x95, 0x32, 0x64, 0x0a, 0xae, 0x6c, 0x2b, 0xaf, 0xdb, 0xb6, 0x0f, + 0x15, 0x16, 0x4a, 0x31, 0x67, 0x31, 0xa9, 0xb4, 0x8b, 0x5d, 0xb7, 0xb7, 0x91, 0xdb, 0x8c, 0x34, + 0x95, 0x89, 0xc1, 0xbb, 0x50, 0x9e, 0xf0, 0x20, 0x98, 0x4b, 0x52, 0xcd, 0xe4, 0x32, 0x18, 0xee, + 0x41, 0x35, 0x36, 0x8e, 0x91, 0x9a, 0x76, 0x12, 0x3d, 0x76, 0x32, 0x75, 0x30, 0x8d, 0x53, 0x19, + 0x05, 0x7b, 0xc7, 0x26, 0x92, 0x40, 0xdb, 0xea, 0x56, 0xd3, 0x8c, 0x09, 0x86, 0xff, 0x02, 0x48, + 0x4e, 0xc7, 0xf3, 0x50, 0x12, 0x37, 0x53, 0x33, 0x83, 0x63, 0x02, 0x95, 0x09, 0x0f, 0x25, 0xbb, + 0x96, 0xa4, 0xae, 0x07, 0x9b, 0x5e, 0x3b, 0x6f, 0xa0, 0x76, 0x4c, 0x85, 0x97, 0xac, 0x4f, 0xea, + 0xa0, 0xb5, 0xe6, 0x20, 0x01, 0xe7, 0x8a, 0x4b, 0x96, 0xdf, 0x77, 0x85, 0x64, 0x1a, 0x2e, 0xae, + 0x37, 0xdc, 0xf9, 0x13, 0x6a, 0xcb, 0x75, 0xc5, 0x4d, 0x28, 0x85, 0xdc, 0x63, 0x31, 0xb1, 0xda, + 0xc5, 0xae, 0x33, 0x4a, 0x2e, 0x9d, 0xcf, 0x16, 0x80, 0x8a, 0xe9, 0xcf, 0x68, 0xe8, 0xeb, 0xa9, + 0x9f, 0x0c, 0x72, 0x0a, 0xec, 0xf9, 0x00, 0xff, 0x6b, 0x3e, 0x4e, 0x5b, 0xaf, 0xce, 0xef, 0xd9, + 0x4f, 0x21, 0x79, 0xb7, 0xb6, 0x3d, 0xbb, 0x50, 0x3e, 0xe5, 0x1e, 0x3b, 0x19, 0xe4, 0x75, 0x85, + 0x1a, 0x53, 0x86, 0xf4, 0x8d, 0x21, 0x4e, 0xce, 0x90, 0xbd, 0xff, 0xa0, 0xb6, 0xfc, 0xe4, 0xf1, + 0x26, 0xb8, 0xfa, 0x72, 0xca, 0x45, 0x40, 0x2f, 0x51, 0x01, 0x6f, 0xc3, 0xa6, 0x06, 0x56, 0x85, + 0x91, 0xb5, 0xf7, 0xcd, 0x06, 0x37, 0xb3, 0xc4, 0x18, 0xa0, 0x3c, 0x8c, 0xfd, 0xe3, 0x45, 0x84, + 0x0a, 0xd8, 0x85, 0xca, 0x30, 0xf6, 0x8f, 0x18, 0x95, 0xc8, 0x32, 0x97, 0xe7, 0x82, 0x47, 0xc8, + 0x36, 0x51, 0x87, 0x51, 0x84, 0x8a, 0xb8, 0x01, 0x90, 0x9c, 0x47, 0x2c, 0x8e, 0x90, 0x63, 0x02, + 0x5f, 0x72, 0xc9, 0x50, 0x49, 0x89, 0x30, 0x17, 0xcd, 0x96, 0x0d, 0xab, 0x16, 0x06, 0x55, 0x30, + 0x82, 0xba, 0x2a, 0xc6, 0xa8, 0x90, 0x17, 0xaa, 0x4a, 0x15, 0x37, 0x01, 0x65, 0x11, 0xfd, 0xa8, + 0x86, 0x31, 0x34, 0x86, 0xb1, 0x7f, 0x1e, 0x0a, 0x46, 0x27, 0x33, 0x7a, 0x71, 0xc9, 0x10, 0xe0, + 0x2d, 0xd8, 0x30, 0x89, 0xd4, 0x80, 0x16, 0x31, 0x72, 0x4d, 0x58, 0x7f, 0xc6, 0x26, 0xef, 0x5f, + 0x2c, 0xb8, 0x58, 0x04, 0xa8, 0x8e, 0x7f, 0x83, 0xad, 0x61, 0xec, 0x8f, 0x05, 0x0d, 0xe3, 0x29, + 0x13, 0xcf, 0x18, 0xf5, 0x98, 0x40, 0x1b, 0xe6, 0xf5, 0x78, 0x1e, 0x30, 0xbe, 0x90, 0xa7, 0xfc, + 0x03, 0x6a, 0x18, 0x31, 0x23, 0x46, 0x3d, 0xfd, 0x0f, 0x44, 0x9b, 0x46, 0xcc, 0x12, 0xd1, 0x62, + 0xd0, 0xde, 0x6b, 0x68, 0xe4, 0x47, 0xa7, 0x6a, 0xac, 0x90, 0x43, 0xcf, 0x53, 0xb3, 0x43, 0x05, + 0x4c, 0xa0, 0xb9, 0x82, 0x47, 0x2c, 0xe0, 0x57, 0x4c, 0x33, 0x56, 0x9e, 0x39, 0x8f, 0x3c, 0x2a, + 0x13, 0xc6, 0x3e, 0x22, 0xb7, 0xf7, 0xad, 0xc2, 0xdd, 0x7d, 0xab, 0x70, 0xfb, 0xd0, 0xb2, 0xee, + 0x1e, 0x5a, 0xd6, 0x8f, 0x87, 0x96, 0xf5, 0xe5, 0x67, 0xab, 0xf0, 0x2b, 0x00, 0x00, 0xff, 0xff, + 0xdc, 0x70, 0xcb, 0xda, 0x16, 0x06, 0x00, 0x00, } diff --git a/vendor/github.com/coreos/etcd/snap/snappb/snap.pb.go b/vendor/github.com/coreos/etcd/snap/snappb/snap.pb.go index 8b23ed6..11c86df 100644 --- a/vendor/github.com/coreos/etcd/snap/snappb/snap.pb.go +++ b/vendor/github.com/coreos/etcd/snap/snappb/snap.pb.go @@ -16,7 +16,7 @@ package snappb import ( "fmt" - proto "github.com/gogo/protobuf/proto" + proto "github.com/golang/protobuf/proto" math "math" ) @@ -30,7 +30,7 @@ var _ = math.Inf // This is a compile-time assertion to ensure that this generated file // is compatible with the proto package it is being compiled against. -const _ = proto.GoGoProtoPackageIsVersion1 +const _ = proto.ProtoPackageIsVersion1 type Snapshot struct { Crc uint32 `protobuf:"varint,1,opt,name=crc" json:"crc"` @@ -337,13 +337,13 @@ var ( ) var fileDescriptorSnap = []byte{ - // 118 bytes of a gzipped FileDescriptorProto + // 126 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xe2, 0xe2, 0x2a, 0xce, 0x4b, 0x2c, 0xd0, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x62, 0x03, 0xb1, 0x0b, 0x92, 0xa4, 0x44, 0xd2, 0xf3, 0xd3, 0xf3, 0xc1, 0x42, 0xfa, 0x20, 0x16, 0x44, 0x56, 0xc9, 0x8c, 0x8b, 0x03, 0x24, 0x5f, 0x9c, 0x91, 0x5f, 0x22, 0x24, 0xc6, 0xc5, 0x9c, 0x5c, 0x94, 0x2c, 0xc1, 0xa8, 0xc0, 0xa8, 0xc1, 0xeb, 0xc4, 0x72, 0xe2, 0x9e, 0x3c, 0x43, 0x10, 0x48, 0x40, 0x48, 0x88, 0x8b, 0x25, 0x25, 0xb1, 0x24, - 0x51, 0x82, 0x09, 0x28, 0xc1, 0x13, 0x04, 0x66, 0x3b, 0x09, 0x9c, 0x78, 0x28, 0xc7, 0x70, 0xe2, - 0x91, 0x1c, 0xe3, 0x05, 0x20, 0x7e, 0x00, 0xc4, 0x80, 0x00, 0x00, 0x00, 0xff, 0xff, 0x0d, 0x03, - 0x97, 0xa7, 0x74, 0x00, 0x00, 0x00, + 0x51, 0x82, 0x49, 0x81, 0x51, 0x83, 0x27, 0x08, 0xcc, 0x76, 0x12, 0x39, 0xf1, 0x50, 0x8e, 0xe1, + 0xc4, 0x23, 0x39, 0xc6, 0x0b, 0x8f, 0xe4, 0x18, 0x1f, 0x3c, 0x92, 0x63, 0x9c, 0xf1, 0x58, 0x8e, + 0x01, 0x10, 0x00, 0x00, 0xff, 0xff, 0xd8, 0x0f, 0x32, 0xb2, 0x78, 0x00, 0x00, 0x00, } diff --git a/vendor/github.com/coreos/etcd/wal/walpb/record.pb.go b/vendor/github.com/coreos/etcd/wal/walpb/record.pb.go index e164fdc..bc715a8 100644 --- a/vendor/github.com/coreos/etcd/wal/walpb/record.pb.go +++ b/vendor/github.com/coreos/etcd/wal/walpb/record.pb.go @@ -17,7 +17,7 @@ package walpb import ( "fmt" - proto "github.com/gogo/protobuf/proto" + proto "github.com/golang/protobuf/proto" math "math" ) @@ -31,7 +31,7 @@ var _ = math.Inf // This is a compile-time assertion to ensure that this generated file // is compatible with the proto package it is being compiled against. -const _ = proto.GoGoProtoPackageIsVersion1 +const _ = proto.ProtoPackageIsVersion1 type Record struct { Type int64 `protobuf:"varint,1,opt,name=type" json:"type"` @@ -501,16 +501,17 @@ var ( ) var fileDescriptorRecord = []byte{ - // 175 bytes of a gzipped FileDescriptorProto + // 186 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xe2, 0xe2, 0x29, 0x4a, 0x4d, 0xce, 0x2f, 0x4a, 0xd1, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x62, 0x2d, 0x4f, 0xcc, 0x29, 0x48, 0x92, 0x12, 0x49, 0xcf, 0x4f, 0xcf, 0x07, 0x8b, 0xe8, 0x83, 0x58, 0x10, 0x49, 0x25, 0x3f, 0x2e, 0xb6, 0x20, 0xb0, 0x62, 0x21, 0x09, 0x2e, 0x96, 0x92, 0xca, 0x82, 0x54, 0x09, 0x46, 0x05, 0x46, 0x0d, 0x66, 0x27, 0x96, 0x13, 0xf7, 0xe4, 0x19, 0x82, 0xc0, 0x22, 0x42, 0x62, 0x5c, 0xcc, 0xc9, 0x45, - 0xc9, 0x12, 0x4c, 0x40, 0x09, 0x5e, 0xa8, 0x04, 0x48, 0x40, 0x48, 0x88, 0x8b, 0x25, 0x25, 0xb1, - 0x24, 0x51, 0x82, 0x19, 0x28, 0xc1, 0x13, 0x04, 0x66, 0x2b, 0x39, 0x70, 0x71, 0x04, 0xe7, 0x25, - 0x16, 0x14, 0x67, 0xe4, 0x97, 0x08, 0x49, 0x71, 0xb1, 0x66, 0xe6, 0xa5, 0xa4, 0x56, 0x80, 0x8d, - 0x64, 0x81, 0xea, 0x84, 0x08, 0x81, 0x6d, 0x4b, 0x2d, 0xca, 0x05, 0x1b, 0xca, 0x02, 0xb7, 0x0d, - 0x28, 0xe2, 0x24, 0x70, 0xe2, 0xa1, 0x1c, 0xc3, 0x89, 0x47, 0x72, 0x8c, 0x17, 0x80, 0xf8, 0x01, - 0x10, 0x03, 0x02, 0x00, 0x00, 0xff, 0xff, 0xe5, 0x20, 0xf5, 0xbc, 0xcf, 0x00, 0x00, 0x00, + 0xc9, 0x12, 0x4c, 0x0a, 0x8c, 0x1a, 0xbc, 0x50, 0x09, 0x90, 0x80, 0x90, 0x10, 0x17, 0x4b, 0x4a, + 0x62, 0x49, 0xa2, 0x04, 0xb3, 0x02, 0xa3, 0x06, 0x4f, 0x10, 0x98, 0xad, 0xe4, 0xc0, 0xc5, 0x11, + 0x9c, 0x97, 0x58, 0x50, 0x9c, 0x91, 0x5f, 0x22, 0x24, 0xc5, 0xc5, 0x9a, 0x99, 0x97, 0x92, 0x5a, + 0x01, 0x36, 0x92, 0x05, 0xaa, 0x13, 0x22, 0x04, 0xb6, 0x2d, 0xb5, 0x28, 0x17, 0x6c, 0x28, 0x0b, + 0xdc, 0xb6, 0xd4, 0xa2, 0x5c, 0x27, 0x91, 0x13, 0x0f, 0xe5, 0x18, 0x4e, 0x3c, 0x92, 0x63, 0xbc, + 0xf0, 0x48, 0x8e, 0xf1, 0xc1, 0x23, 0x39, 0xc6, 0x19, 0x8f, 0xe5, 0x18, 0x00, 0x01, 0x00, 0x00, + 0xff, 0xff, 0x7f, 0x5e, 0x5c, 0x46, 0xd3, 0x00, 0x00, 0x00, } diff --git a/vendor/github.com/dustin/go-humanize/times.go b/vendor/github.com/dustin/go-humanize/times.go index 49906b3..815f630 100644 --- a/vendor/github.com/dustin/go-humanize/times.go +++ b/vendor/github.com/dustin/go-humanize/times.go @@ -9,9 +9,7 @@ import ( // Seconds-based time units const ( - Minute = 60 - Hour = 60 * Minute - Day = 24 * Hour + Day = 24 * time.Hour Week = 7 * Day Month = 30 * Day Year = 12 * Month @@ -25,18 +23,35 @@ func Time(then time.Time) string { return RelTime(then, time.Now(), "ago", "from now") } -var magnitudes = []struct { - d int64 - format string - divby int64 -}{ - {1, "now", 1}, - {2, "1 second %s", 1}, - {Minute, "%d seconds %s", 1}, - {2 * Minute, "1 minute %s", 1}, - {Hour, "%d minutes %s", Minute}, - {2 * Hour, "1 hour %s", 1}, - {Day, "%d hours %s", Hour}, +// A RelTimeMagnitude struct contains a relative time point at which +// the relative format of time will switch to a new format string. A +// slice of these in ascending order by their "D" field is passed to +// CustomRelTime to format durations. +// +// The Format field is a string that may contain a "%s" which will be +// replaced with the appropriate signed label (e.g. "ago" or "from +// now") and a "%d" that will be replaced by the quantity. +// +// The DivBy field is the amount of time the time difference must be +// divided by in order to display correctly. +// +// e.g. if D is 2*time.Minute and you want to display "%d minutes %s" +// DivBy should be time.Minute so whatever the duration is will be +// expressed in minutes. +type RelTimeMagnitude struct { + D time.Duration + Format string + DivBy time.Duration +} + +var defaultMagnitudes = []RelTimeMagnitude{ + {time.Second, "now", time.Second}, + {2 * time.Second, "1 second %s", 1}, + {time.Minute, "%d seconds %s", time.Second}, + {2 * time.Minute, "1 minute %s", 1}, + {time.Hour, "%d minutes %s", time.Minute}, + {2 * time.Hour, "1 hour %s", 1}, + {Day, "%d hours %s", time.Hour}, {2 * Day, "1 day %s", 1}, {Week, "%d days %s", Day}, {2 * Week, "1 week %s", 1}, @@ -57,34 +72,43 @@ var magnitudes = []struct { // // RelTime(timeInPast, timeInFuture, "earlier", "later") -> "3 weeks earlier" func RelTime(a, b time.Time, albl, blbl string) string { + return CustomRelTime(a, b, albl, blbl, defaultMagnitudes) +} + +// CustomRelTime formats a time into a relative string. +// +// It takes two times two labels and a table of relative time formats. +// In addition to the generic time delta string (e.g. 5 minutes), the +// labels are used applied so that the label corresponding to the +// smaller time is applied. +func CustomRelTime(a, b time.Time, albl, blbl string, magnitudes []RelTimeMagnitude) string { lbl := albl - diff := b.Unix() - a.Unix() + diff := b.Sub(a) - after := a.After(b) - if after { + if a.After(b) { lbl = blbl - diff = a.Unix() - b.Unix() + diff = a.Sub(b) } n := sort.Search(len(magnitudes), func(i int) bool { - return magnitudes[i].d > diff + return magnitudes[i].D >= diff }) mag := magnitudes[n] args := []interface{}{} escaped := false - for _, ch := range mag.format { + for _, ch := range mag.Format { if escaped { switch ch { case 's': args = append(args, lbl) case 'd': - args = append(args, diff/mag.divby) + args = append(args, diff/mag.DivBy) } escaped = false } else { escaped = ch == '%' } } - return fmt.Sprintf(mag.format, args...) + return fmt.Sprintf(mag.Format, args...) } diff --git a/vendor/github.com/dustin/go-humanize/times_test.go b/vendor/github.com/dustin/go-humanize/times_test.go index 528daa4..bbbc741 100644 --- a/vendor/github.com/dustin/go-humanize/times_test.go +++ b/vendor/github.com/dustin/go-humanize/times_test.go @@ -7,57 +7,59 @@ import ( ) func TestPast(t *testing.T) { - now := time.Now().Unix() + now := time.Now() testList{ - {"now", Time(time.Unix(now, 0)), "now"}, - {"1 second ago", Time(time.Unix(now-1, 0)), "1 second ago"}, - {"12 seconds ago", Time(time.Unix(now-12, 0)), "12 seconds ago"}, - {"30 seconds ago", Time(time.Unix(now-30, 0)), "30 seconds ago"}, - {"45 seconds ago", Time(time.Unix(now-45, 0)), "45 seconds ago"}, - {"1 minute ago", Time(time.Unix(now-63, 0)), "1 minute ago"}, - {"15 minutes ago", Time(time.Unix(now-15*Minute, 0)), "15 minutes ago"}, - {"1 hour ago", Time(time.Unix(now-63*Minute, 0)), "1 hour ago"}, - {"2 hours ago", Time(time.Unix(now-2*Hour, 0)), "2 hours ago"}, - {"21 hours ago", Time(time.Unix(now-21*Hour, 0)), "21 hours ago"}, - {"1 day ago", Time(time.Unix(now-26*Hour, 0)), "1 day ago"}, - {"2 days ago", Time(time.Unix(now-49*Hour, 0)), "2 days ago"}, - {"3 days ago", Time(time.Unix(now-3*Day, 0)), "3 days ago"}, - {"1 week ago (1)", Time(time.Unix(now-7*Day, 0)), "1 week ago"}, - {"1 week ago (2)", Time(time.Unix(now-12*Day, 0)), "1 week ago"}, - {"2 weeks ago", Time(time.Unix(now-15*Day, 0)), "2 weeks ago"}, - {"1 month ago", Time(time.Unix(now-39*Day, 0)), "1 month ago"}, - {"3 months ago", Time(time.Unix(now-99*Day, 0)), "3 months ago"}, - {"1 year ago (1)", Time(time.Unix(now-365*Day, 0)), "1 year ago"}, - {"1 year ago (1)", Time(time.Unix(now-400*Day, 0)), "1 year ago"}, - {"2 years ago (1)", Time(time.Unix(now-548*Day, 0)), "2 years ago"}, - {"2 years ago (2)", Time(time.Unix(now-725*Day, 0)), "2 years ago"}, - {"2 years ago (3)", Time(time.Unix(now-800*Day, 0)), "2 years ago"}, - {"3 years ago", Time(time.Unix(now-3*Year, 0)), "3 years ago"}, - {"long ago", Time(time.Unix(now-LongTime, 0)), "a long while ago"}, + {"now", Time(now), "now"}, + {"1 second ago", Time(now.Add(-1 * time.Second)), "1 second ago"}, + {"12 seconds ago", Time(now.Add(-12 * time.Second)), "12 seconds ago"}, + {"30 seconds ago", Time(now.Add(-30 * time.Second)), "30 seconds ago"}, + {"45 seconds ago", Time(now.Add(-45 * time.Second)), "45 seconds ago"}, + {"1 minute ago", Time(now.Add(-63 * time.Second)), "1 minute ago"}, + {"15 minutes ago", Time(now.Add(-15 * time.Minute)), "15 minutes ago"}, + {"1 hour ago", Time(now.Add(-63 * time.Minute)), "1 hour ago"}, + {"2 hours ago", Time(now.Add(-2 * time.Hour)), "2 hours ago"}, + {"21 hours ago", Time(now.Add(-21 * time.Hour)), "21 hours ago"}, + {"1 day ago", Time(now.Add(-26 * time.Hour)), "1 day ago"}, + {"2 days ago", Time(now.Add(-49 * time.Hour)), "2 days ago"}, + {"3 days ago", Time(now.Add(-3 * Day)), "3 days ago"}, + {"1 week ago (1)", Time(now.Add(-7 * Day)), "1 week ago"}, + {"1 week ago (2)", Time(now.Add(-12 * Day)), "1 week ago"}, + {"2 weeks ago", Time(now.Add(-15 * Day)), "2 weeks ago"}, + {"1 month ago", Time(now.Add(-39 * Day)), "1 month ago"}, + {"3 months ago", Time(now.Add(-99 * Day)), "3 months ago"}, + {"1 year ago (1)", Time(now.Add(-365 * Day)), "1 year ago"}, + {"1 year ago (1)", Time(now.Add(-400 * Day)), "1 year ago"}, + {"2 years ago (1)", Time(now.Add(-548 * Day)), "2 years ago"}, + {"2 years ago (2)", Time(now.Add(-725 * Day)), "2 years ago"}, + {"2 years ago (3)", Time(now.Add(-800 * Day)), "2 years ago"}, + {"3 years ago", Time(now.Add(-3 * Year)), "3 years ago"}, + {"long ago", Time(now.Add(-LongTime)), "a long while ago"}, }.validate(t) } func TestFuture(t *testing.T) { - now := time.Now().Unix() + // Add a little time so that these things properly line up in + // the future. + now := time.Now().Add(time.Millisecond * 250) testList{ - {"now", Time(time.Unix(now, 0)), "now"}, - {"1 second from now", Time(time.Unix(now+1, 0)), "1 second from now"}, - {"12 seconds from now", Time(time.Unix(now+12, 0)), "12 seconds from now"}, - {"30 seconds from now", Time(time.Unix(now+30, 0)), "30 seconds from now"}, - {"45 seconds from now", Time(time.Unix(now+45, 0)), "45 seconds from now"}, - {"15 minutes from now", Time(time.Unix(now+15*Minute, 0)), "15 minutes from now"}, - {"2 hours from now", Time(time.Unix(now+2*Hour, 0)), "2 hours from now"}, - {"21 hours from now", Time(time.Unix(now+21*Hour, 0)), "21 hours from now"}, - {"1 day from now", Time(time.Unix(now+26*Hour, 0)), "1 day from now"}, - {"2 days from now", Time(time.Unix(now+49*Hour, 0)), "2 days from now"}, - {"3 days from now", Time(time.Unix(now+3*Day, 0)), "3 days from now"}, - {"1 week from now (1)", Time(time.Unix(now+7*Day, 0)), "1 week from now"}, - {"1 week from now (2)", Time(time.Unix(now+12*Day, 0)), "1 week from now"}, - {"2 weeks from now", Time(time.Unix(now+15*Day, 0)), "2 weeks from now"}, - {"1 month from now", Time(time.Unix(now+30*Day, 0)), "1 month from now"}, - {"1 year from now", Time(time.Unix(now+365*Day, 0)), "1 year from now"}, - {"2 years from now", Time(time.Unix(now+2*Year, 0)), "2 years from now"}, - {"a while from now", Time(time.Unix(now+LongTime, 0)), "a long while from now"}, + {"now", Time(now), "now"}, + {"1 second from now", Time(now.Add(+1 * time.Second)), "1 second from now"}, + {"12 seconds from now", Time(now.Add(+12 * time.Second)), "12 seconds from now"}, + {"30 seconds from now", Time(now.Add(+30 * time.Second)), "30 seconds from now"}, + {"45 seconds from now", Time(now.Add(+45 * time.Second)), "45 seconds from now"}, + {"15 minutes from now", Time(now.Add(+15 * time.Minute)), "15 minutes from now"}, + {"2 hours from now", Time(now.Add(+2 * time.Hour)), "2 hours from now"}, + {"21 hours from now", Time(now.Add(+21 * time.Hour)), "21 hours from now"}, + {"1 day from now", Time(now.Add(+26 * time.Hour)), "1 day from now"}, + {"2 days from now", Time(now.Add(+49 * time.Hour)), "2 days from now"}, + {"3 days from now", Time(now.Add(+3 * Day)), "3 days from now"}, + {"1 week from now (1)", Time(now.Add(+7 * Day)), "1 week from now"}, + {"1 week from now (2)", Time(now.Add(+12 * Day)), "1 week from now"}, + {"2 weeks from now", Time(now.Add(+15 * Day)), "2 weeks from now"}, + {"1 month from now", Time(now.Add(+30 * Day)), "1 month from now"}, + {"1 year from now", Time(now.Add(+365 * Day)), "1 year from now"}, + {"2 years from now", Time(now.Add(+2 * Year)), "2 years from now"}, + {"a while from now", Time(now.Add(+LongTime)), "a long while from now"}, }.validate(t) } diff --git a/vendor/github.com/gogo/protobuf/proto/all_test.go b/vendor/github.com/gogo/protobuf/proto/all_test.go index 3b87278..8c97b2b 100644 --- a/vendor/github.com/gogo/protobuf/proto/all_test.go +++ b/vendor/github.com/gogo/protobuf/proto/all_test.go @@ -1311,7 +1311,7 @@ func TestRequiredFieldEnforcement(t *testing.T) { _, err := Marshal(pb) if err == nil { t.Error("marshal: expected error, got nil") - } else if strings.Index(err.Error(), "Label") < 0 { + } else if _, ok := err.(*RequiredNotSetError); !ok || !strings.Contains(err.Error(), "Label") { t.Errorf("marshal: bad error type: %v", err) } @@ -1322,16 +1322,42 @@ func TestRequiredFieldEnforcement(t *testing.T) { err = Unmarshal(buf, pb) if err == nil { t.Error("unmarshal: expected error, got nil") - } else if strings.Index(err.Error(), "{Unknown}") < 0 { + } else if _, ok := err.(*RequiredNotSetError); !ok || !strings.Contains(err.Error(), "{Unknown}") { + t.Errorf("unmarshal: bad error type: %v", err) + } +} + +// Verify that absent required fields in groups cause Marshal/Unmarshal to return errors. +func TestRequiredFieldEnforcementGroups(t *testing.T) { + pb := &GoTestRequiredGroupField{Group: &GoTestRequiredGroupField_Group{}} + if _, err := Marshal(pb); err == nil { + t.Error("marshal: expected error, got nil") + } else if _, ok := err.(*RequiredNotSetError); !ok || !strings.Contains(err.Error(), "Group.Field") { + t.Errorf("marshal: bad error type: %v", err) + } + + buf := []byte{11, 12} + if err := Unmarshal(buf, pb); err == nil { + t.Error("unmarshal: expected error, got nil") + } else if _, ok := err.(*RequiredNotSetError); !ok || !strings.Contains(err.Error(), "Group.{Unknown}") { t.Errorf("unmarshal: bad error type: %v", err) } } func TestTypedNilMarshal(t *testing.T) { // A typed nil should return ErrNil and not crash. - _, err := Marshal((*GoEnum)(nil)) - if err != ErrNil { - t.Errorf("Marshal: got err %v, want ErrNil", err) + { + var m *GoEnum + if _, err := Marshal(m); err != ErrNil { + t.Errorf("Marshal(%#v): got %v, want ErrNil", m, err) + } + } + + { + m := &Communique{Union: &Communique_Msg{nil}} + if _, err := Marshal(m); err == nil || err == ErrNil { + t.Errorf("Marshal(%#v): got %v, want errOneofHasNil", m, err) + } } } @@ -1958,6 +1984,40 @@ func TestMapFieldWithNil(t *testing.T) { } } +func TestDecodeMapFieldMissingKey(t *testing.T) { + b := []byte{ + 0x0A, 0x03, // message, tag 1 (name_mapping), of length 3 bytes + // no key + 0x12, 0x01, 0x6D, // string value of length 1 byte, value "m" + } + got := &MessageWithMap{} + err := Unmarshal(b, got) + if err != nil { + t.Fatalf("failed to marshal map with missing key: %v", err) + } + want := &MessageWithMap{NameMapping: map[int32]string{0: "m"}} + if !Equal(got, want) { + t.Errorf("Unmarshaled map with no key was not as expected. got: %v, want %v", got, want) + } +} + +func TestDecodeMapFieldMissingValue(t *testing.T) { + b := []byte{ + 0x0A, 0x02, // message, tag 1 (name_mapping), of length 2 bytes + 0x08, 0x01, // varint key, value 1 + // no value + } + got := &MessageWithMap{} + err := Unmarshal(b, got) + if err != nil { + t.Fatalf("failed to marshal map with missing value: %v", err) + } + want := &MessageWithMap{NameMapping: map[int32]string{1: ""}} + if !Equal(got, want) { + t.Errorf("Unmarshaled map with no value was not as expected. got: %v, want %v", got, want) + } +} + func TestOneof(t *testing.T) { m := &Communique{} b, err := Marshal(m) diff --git a/vendor/github.com/gogo/protobuf/proto/clone_test.go b/vendor/github.com/gogo/protobuf/proto/clone_test.go index f065210..1a16eb5 100644 --- a/vendor/github.com/gogo/protobuf/proto/clone_test.go +++ b/vendor/github.com/gogo/protobuf/proto/clone_test.go @@ -195,6 +195,9 @@ var mergeTests = []struct { NameMapping: map[int32]string{6: "Nigel"}, MsgMapping: map[int64]*pb.FloatingPoint{ 0x4001: {F: proto.Float64(2.0)}, + 0x4002: { + F: proto.Float64(2.0), + }, }, ByteMapping: map[bool][]byte{true: []byte("wowsa")}, }, @@ -203,6 +206,12 @@ var mergeTests = []struct { 6: "Bruce", // should be overwritten 7: "Andrew", }, + MsgMapping: map[int64]*pb.FloatingPoint{ + 0x4002: { + F: proto.Float64(3.0), + Exact: proto.Bool(true), + }, // the entire message should be overwritten + }, }, want: &pb.MessageWithMap{ NameMapping: map[int32]string{ @@ -211,6 +220,9 @@ var mergeTests = []struct { }, MsgMapping: map[int64]*pb.FloatingPoint{ 0x4001: {F: proto.Float64(2.0)}, + 0x4002: { + F: proto.Float64(2.0), + }, }, ByteMapping: map[bool][]byte{true: []byte("wowsa")}, }, @@ -254,6 +266,27 @@ var mergeTests = []struct { Union: &pb.Communique_Name{Name: "Bobby Tables"}, }, }, + { + src: &proto3pb.Message{ + Terrain: map[string]*proto3pb.Nested{ + "kay_a": {Cute: true}, // replace + "kay_b": {Bunny: "rabbit"}, // insert + }, + }, + dst: &proto3pb.Message{ + Terrain: map[string]*proto3pb.Nested{ + "kay_a": {Bunny: "lost"}, // replaced + "kay_c": {Bunny: "bunny"}, // keep + }, + }, + want: &proto3pb.Message{ + Terrain: map[string]*proto3pb.Nested{ + "kay_a": {Cute: true}, + "kay_b": {Bunny: "rabbit"}, + "kay_c": {Bunny: "bunny"}, + }, + }, + }, } func TestMerge(t *testing.T) { diff --git a/vendor/github.com/gogo/protobuf/proto/decode.go b/vendor/github.com/gogo/protobuf/proto/decode.go index cb5b213..343cd99 100644 --- a/vendor/github.com/gogo/protobuf/proto/decode.go +++ b/vendor/github.com/gogo/protobuf/proto/decode.go @@ -378,6 +378,11 @@ func (o *Buffer) unmarshalType(st reflect.Type, prop *StructProperties, is_group wire := int(u & 0x7) if wire == WireEndGroup { if is_group { + if required > 0 { + // Not enough information to determine the exact field. + // (See below.) + return &RequiredNotSetError{"{Unknown}"} + } return nil // input is satisfied } return fmt.Errorf("proto: %s: wiretype end group for non-group", st) @@ -773,10 +778,11 @@ func (o *Buffer) dec_new_map(p *Properties, base structPointer) error { } } keyelem, valelem := keyptr.Elem(), valptr.Elem() - if !keyelem.IsValid() || !valelem.IsValid() { - // We did not decode the key or the value in the map entry. - // Either way, it's an invalid map entry. - return fmt.Errorf("proto: bad map data: missing key/val") + if !keyelem.IsValid() { + keyelem = reflect.Zero(p.mtype.Key()) + } + if !valelem.IsValid() { + valelem = reflect.Zero(p.mtype.Elem()) } v.SetMapIndex(keyelem, valelem) diff --git a/vendor/github.com/gogo/protobuf/proto/encode.go b/vendor/github.com/gogo/protobuf/proto/encode.go index 231b074..401c114 100644 --- a/vendor/github.com/gogo/protobuf/proto/encode.go +++ b/vendor/github.com/gogo/protobuf/proto/encode.go @@ -64,8 +64,16 @@ var ( // a struct with a repeated field containing a nil element. errRepeatedHasNil = errors.New("proto: repeated field has nil element") + // errOneofHasNil is the error returned if Marshal is called with + // a struct with a oneof field containing a nil element. + errOneofHasNil = errors.New("proto: oneof field has nil value") + // ErrNil is the error returned if Marshal is called with nil. ErrNil = errors.New("proto: Marshal called with nil") + + // ErrTooLarge is the error returned if Marshal is called with a + // message that encodes to >2GB. + ErrTooLarge = errors.New("proto: message encodes to over 2 GB") ) // The fundamental encoders that put bytes on the wire. @@ -74,6 +82,10 @@ var ( const maxVarintBytes = 10 // maximum length of a varint +// maxMarshalSize is the largest allowed size of an encoded protobuf, +// since C++ and Java use signed int32s for the size. +const maxMarshalSize = 1<<31 - 1 + // EncodeVarint returns the varint encoding of x. // This is the format for the // int32, int64, uint32, uint64, bool, and enum @@ -273,6 +285,9 @@ func (p *Buffer) Marshal(pb Message) error { stats.Encode++ } + if len(p.buf) > maxMarshalSize { + return ErrTooLarge + } return err } @@ -1216,13 +1231,18 @@ func (o *Buffer) enc_struct(prop *StructProperties, base structPointer) error { return err } } + if len(o.buf) > maxMarshalSize { + return ErrTooLarge + } } } // Do oneof fields. if prop.oneofMarshaler != nil { m := structPointer_Interface(base, prop.stype).(Message) - if err := prop.oneofMarshaler(m, o); err != nil { + if err := prop.oneofMarshaler(m, o); err == ErrNil { + return errOneofHasNil + } else if err != nil { return err } } @@ -1230,6 +1250,9 @@ func (o *Buffer) enc_struct(prop *StructProperties, base structPointer) error { // Add unrecognized fields at the end. if prop.unrecField.IsValid() { v := *structPointer_Bytes(base, prop.unrecField) + if len(o.buf)+len(v) > maxMarshalSize { + return ErrTooLarge + } if len(v) > 0 { o.buf = append(o.buf, v...) } diff --git a/vendor/github.com/gogo/protobuf/proto/equal.go b/vendor/github.com/gogo/protobuf/proto/equal.go index f5db1de..a9b3591 100644 --- a/vendor/github.com/gogo/protobuf/proto/equal.go +++ b/vendor/github.com/gogo/protobuf/proto/equal.go @@ -184,6 +184,13 @@ func equalAny(v1, v2 reflect.Value, prop *Properties) bool { } return true case reflect.Ptr: + // Maps may have nil values in them, so check for nil. + if v1.IsNil() && v2.IsNil() { + return true + } + if v1.IsNil() != v2.IsNil() { + return false + } return equalAny(v1.Elem(), v2.Elem(), prop) case reflect.Slice: if v1.Type().Elem().Kind() == reflect.Uint8 { diff --git a/vendor/github.com/gogo/protobuf/proto/extensions.go b/vendor/github.com/gogo/protobuf/proto/extensions.go index 6180347..798b884 100644 --- a/vendor/github.com/gogo/protobuf/proto/extensions.go +++ b/vendor/github.com/gogo/protobuf/proto/extensions.go @@ -101,15 +101,13 @@ type Extension struct { } // SetRawExtension is for testing only. -func SetRawExtension(base extendableProto, id int32, b []byte) { +func SetRawExtension(base Message, id int32, b []byte) { if ebase, ok := base.(extensionsMap); ok { ebase.ExtensionMap()[id] = Extension{enc: b} } else if ebase, ok := base.(extensionsBytes); ok { clearExtension(base, id) ext := ebase.GetExtensions() *ext = append(*ext, b...) - } else { - panic("unreachable") } } @@ -233,7 +231,7 @@ func sizeExtensionMap(m map[int32]Extension) (n int) { } // HasExtension returns whether the given extension is present in pb. -func HasExtension(pb extendableProto, extension *ExtensionDesc) bool { +func HasExtension(pb Message, extension *ExtensionDesc) bool { // TODO: Check types, field numbers, etc.? if epb, doki := pb.(extensionsMap); doki { _, ok := epb.ExtensionMap()[extension.Field] @@ -258,7 +256,7 @@ func HasExtension(pb extendableProto, extension *ExtensionDesc) bool { } return false } - panic("unreachable") + return false } func deleteExtension(pb extensionsBytes, theFieldNum int32, offset int) int { @@ -281,7 +279,7 @@ func deleteExtension(pb extensionsBytes, theFieldNum int32, offset int) int { return -1 } -func clearExtension(pb extendableProto, fieldNum int32) { +func clearExtension(pb Message, fieldNum int32) { if epb, doki := pb.(extensionsMap); doki { delete(epb.ExtensionMap(), fieldNum) } else if epb, doki := pb.(extensionsBytes); doki { @@ -289,21 +287,23 @@ func clearExtension(pb extendableProto, fieldNum int32) { for offset != -1 { offset = deleteExtension(epb, fieldNum, offset) } - } else { - panic("unreachable") } } // ClearExtension removes the given extension from pb. -func ClearExtension(pb extendableProto, extension *ExtensionDesc) { +func ClearExtension(pb Message, extension *ExtensionDesc) { // TODO: Check types, field numbers, etc.? clearExtension(pb, extension.Field) } // GetExtension parses and returns the given extension of pb. // If the extension is not present it returns ErrMissingExtension. -func GetExtension(pb extendableProto, extension *ExtensionDesc) (interface{}, error) { - if err := checkExtensionTypes(pb, extension); err != nil { +func GetExtension(pb Message, extension *ExtensionDesc) (interface{}, error) { + epb, ok := pb.(extendableProto) + if !ok { + return nil, errors.New("proto: not an extendable proto") + } + if err := checkExtensionTypes(epb, extension); err != nil { return nil, err } @@ -360,7 +360,7 @@ func GetExtension(pb extendableProto, extension *ExtensionDesc) (interface{}, er } return defaultExtensionValue(extension) } - panic("unreachable") + return nil, errors.New("proto: not an extendable proto") } // defaultExtensionValue returns the default value for extension. @@ -436,8 +436,7 @@ func decodeExtension(b []byte, extension *ExtensionDesc) (interface{}, error) { func GetExtensions(pb Message, es []*ExtensionDesc) (extensions []interface{}, err error) { epb, ok := pb.(extendableProto) if !ok { - err = errors.New("proto: not an extendable proto") - return + return nil, errors.New("proto: not an extendable proto") } extensions = make([]interface{}, len(es)) for i, e := range es { @@ -491,6 +490,20 @@ func setExtension(pb extendableProto, extension *ExtensionDesc, value interface{ return nil } +// ClearAllExtensions clears all extensions from pb. +func ClearAllExtensions(pb Message) { + if epb, doki := pb.(extensionsMap); doki { + m := epb.ExtensionMap() + for k := range m { + delete(m, k) + } + } else if epb, doki := pb.(extensionsBytes); doki { + ext := epb.GetExtensions() + *ext = []byte{} + } + return +} + // A global registry of extensions. // The generated code will register the generated descriptors by calling RegisterExtension. diff --git a/vendor/github.com/gogo/protobuf/proto/extensions_test.go b/vendor/github.com/gogo/protobuf/proto/extensions_test.go index 49ea43e..e640a86 100644 --- a/vendor/github.com/gogo/protobuf/proto/extensions_test.go +++ b/vendor/github.com/gogo/protobuf/proto/extensions_test.go @@ -428,3 +428,28 @@ func TestUnmarshalRepeatingNonRepeatedExtension(t *testing.T) { } } } + +func TestClearAllExtensions(t *testing.T) { + // unregistered extension + desc := &proto.ExtensionDesc{ + ExtendedType: (*pb.MyMessage)(nil), + ExtensionType: (*bool)(nil), + Field: 101010100, + Name: "emptyextension", + Tag: "varint,0,opt", + } + m := &pb.MyMessage{} + if proto.HasExtension(m, desc) { + t.Errorf("proto.HasExtension(%s): got true, want false", proto.MarshalTextString(m)) + } + if err := proto.SetExtension(m, desc, proto.Bool(true)); err != nil { + t.Errorf("proto.SetExtension(m, desc, true): got error %q, want nil", err) + } + if !proto.HasExtension(m, desc) { + t.Errorf("proto.HasExtension(%s): got false, want true", proto.MarshalTextString(m)) + } + proto.ClearAllExtensions(m) + if proto.HasExtension(m, desc) { + t.Errorf("proto.HasExtension(%s): got true, want false", proto.MarshalTextString(m)) + } +} diff --git a/vendor/github.com/gogo/protobuf/proto/pointer_reflect.go b/vendor/github.com/gogo/protobuf/proto/pointer_reflect.go index 749919d..9899141 100644 --- a/vendor/github.com/gogo/protobuf/proto/pointer_reflect.go +++ b/vendor/github.com/gogo/protobuf/proto/pointer_reflect.go @@ -29,7 +29,7 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// +build appengine +// +build appengine js // This file contains an implementation of proto field accesses using package reflect. // It is slower than the code in pointer_unsafe.go but it avoids package unsafe and can diff --git a/vendor/github.com/gogo/protobuf/proto/pointer_unsafe.go b/vendor/github.com/gogo/protobuf/proto/pointer_unsafe.go index e9be0fe..ceece77 100644 --- a/vendor/github.com/gogo/protobuf/proto/pointer_unsafe.go +++ b/vendor/github.com/gogo/protobuf/proto/pointer_unsafe.go @@ -29,7 +29,7 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// +build !appengine +// +build !appengine,!js // This file contains the implementation of the proto field accesses using package unsafe. diff --git a/vendor/github.com/gogo/protobuf/proto/properties.go b/vendor/github.com/gogo/protobuf/proto/properties.go index 5e6a0b3..5e372f2 100644 --- a/vendor/github.com/gogo/protobuf/proto/properties.go +++ b/vendor/github.com/gogo/protobuf/proto/properties.go @@ -770,9 +770,11 @@ func getPropertiesLocked(t reflect.Type) *StructProperties { if f.Name == "XXX_unrecognized" { // special case prop.unrecField = toField(&f) } - oneof := f.Tag.Get("protobuf_oneof") != "" // special case - if oneof { + oneof := f.Tag.Get("protobuf_oneof") // special case + if oneof != "" { isOneofMessage = true + // Oneof fields don't use the traditional protobuf tag. + p.OrigName = oneof } prop.Prop[i] = p prop.order[i] = i @@ -783,7 +785,7 @@ func getPropertiesLocked(t reflect.Type) *StructProperties { } print("\n") } - if p.enc == nil && !strings.HasPrefix(f.Name, "XXX_") && !oneof { + if p.enc == nil && !strings.HasPrefix(f.Name, "XXX_") && oneof == "" { fmt.Fprintln(os.Stderr, "proto: no encoder for", f.Name, f.Type.String(), "[GetProperties]") } } @@ -921,3 +923,17 @@ func MessageName(x Message) string { return revProtoTypes[reflect.TypeOf(x)] } // MessageType returns the message type (pointer to struct) for a named message. func MessageType(name string) reflect.Type { return protoTypes[name] } + +// A registry of all linked proto files. +var ( + protoFiles = make(map[string][]byte) // file name => fileDescriptor +) + +// RegisterFile is called from generated code and maps from the +// full file name of a .proto file to its compressed FileDescriptorProto. +func RegisterFile(filename string, fileDescriptor []byte) { + protoFiles[filename] = fileDescriptor +} + +// FileDescriptor returns the compressed FileDescriptorProto for a .proto file. +func FileDescriptor(filename string) []byte { return protoFiles[filename] } diff --git a/vendor/github.com/gogo/protobuf/proto/proto3_proto/proto3.pb.go b/vendor/github.com/gogo/protobuf/proto/proto3_proto/proto3.pb.go index 28303e1..a6ed8c2 100644 --- a/vendor/github.com/gogo/protobuf/proto/proto3_proto/proto3.pb.go +++ b/vendor/github.com/gogo/protobuf/proto/proto3_proto/proto3.pb.go @@ -66,6 +66,7 @@ type Message struct { Score float32 `protobuf:"fixed32,9,opt,name=score,proto3" json:"score,omitempty"` Key []uint64 `protobuf:"varint,5,rep,name=key" json:"key,omitempty"` Nested *Nested `protobuf:"bytes,6,opt,name=nested" json:"nested,omitempty"` + RFunny []Message_Humour `protobuf:"varint,16,rep,name=r_funny,json=rFunny,enum=proto3_proto.Message_Humour" json:"r_funny,omitempty"` Terrain map[string]*Nested `protobuf:"bytes,10,rep,name=terrain" json:"terrain,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value"` Proto2Field *testdata.SubDefaults `protobuf:"bytes,11,opt,name=proto2_field,json=proto2Field" json:"proto2_field,omitempty"` Proto2Value map[string]*testdata.SubDefaults `protobuf:"bytes,13,rep,name=proto2_value,json=proto2Value" json:"proto2_value,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value"` @@ -106,6 +107,7 @@ func (m *Message) GetProto2Value() map[string]*testdata.SubDefaults { type Nested struct { Bunny string `protobuf:"bytes,1,opt,name=bunny,proto3" json:"bunny,omitempty"` + Cute bool `protobuf:"varint,2,opt,name=cute,proto3" json:"cute,omitempty"` } func (m *Nested) Reset() { *m = Nested{} } @@ -136,41 +138,45 @@ func init() { proto.RegisterEnum("proto3_proto.Message_Humour", Message_Humour_name, Message_Humour_value) } +func init() { proto.RegisterFile("proto3_proto/proto3.proto", fileDescriptorProto3) } + var fileDescriptorProto3 = []byte{ - // 550 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x7c, 0x53, 0x6d, 0x8f, 0xd2, 0x40, - 0x10, 0x96, 0x77, 0x98, 0x96, 0xb3, 0xd9, 0x60, 0xb2, 0x12, 0x63, 0x10, 0x13, 0x73, 0xf1, 0xa5, - 0x24, 0xf8, 0xe5, 0x62, 0x8c, 0xe6, 0xc0, 0x33, 0x92, 0x03, 0x24, 0xcb, 0xe1, 0xc5, 0x4f, 0xcd, - 0x16, 0x96, 0xd2, 0x48, 0xb7, 0xa4, 0xdd, 0x9a, 0xf0, 0x77, 0xfc, 0x55, 0xfe, 0x1c, 0xb7, 0xbb, - 0xe5, 0xae, 0x77, 0xc1, 0xfb, 0xd4, 0xd9, 0x67, 0x9e, 0x99, 0x67, 0xf6, 0x99, 0x2d, 0x3c, 0xdd, - 0x45, 0xa1, 0x08, 0xdf, 0x3b, 0xea, 0xd3, 0xd3, 0x07, 0x5b, 0x7d, 0x90, 0x99, 0x4f, 0xb5, 0xfb, - 0x9e, 0x2f, 0x36, 0x89, 0x6b, 0x2f, 0xc3, 0xa0, 0xe7, 0x85, 0x5e, 0xc6, 0x75, 0x93, 0xb5, 0x0e, - 0x7a, 0x82, 0xc5, 0x62, 0x45, 0x05, 0x55, 0x81, 0xee, 0xd0, 0xfd, 0x5b, 0x81, 0xda, 0x84, 0xc5, - 0x31, 0xf5, 0x18, 0x42, 0x50, 0xe6, 0x34, 0x60, 0xb8, 0xd0, 0x29, 0x9c, 0x36, 0x88, 0x8a, 0xd1, - 0x19, 0xd4, 0x37, 0xfe, 0x96, 0x46, 0xbe, 0xd8, 0xe3, 0xa2, 0xc4, 0x4f, 0xfa, 0xcf, 0xec, 0xbc, - 0xa8, 0x9d, 0x15, 0xdb, 0xdf, 0x92, 0x20, 0x4c, 0x22, 0x72, 0xc3, 0x46, 0x1d, 0x30, 0x37, 0xcc, - 0xf7, 0x36, 0xc2, 0xf1, 0xb9, 0xb3, 0x0c, 0x70, 0x49, 0x56, 0x37, 0x09, 0x68, 0x6c, 0xc4, 0x87, - 0x41, 0xaa, 0x97, 0x8e, 0x83, 0xcb, 0x32, 0x63, 0x12, 0x15, 0xa3, 0x17, 0x60, 0x46, 0x2c, 0x4e, - 0xb6, 0xc2, 0x59, 0x86, 0x09, 0x17, 0xb8, 0x26, 0x73, 0x25, 0x62, 0x68, 0x6c, 0x98, 0x42, 0xe8, - 0x25, 0x34, 0x45, 0x94, 0x30, 0x27, 0x5e, 0x86, 0x22, 0x0e, 0x28, 0xc7, 0x75, 0xc9, 0xa9, 0x13, - 0x33, 0x05, 0xe7, 0x19, 0x86, 0x5a, 0x50, 0x91, 0xf9, 0x88, 0xe1, 0x86, 0x4c, 0x16, 0x89, 0x3e, - 0x20, 0x0b, 0x4a, 0xbf, 0xd8, 0x1e, 0x57, 0x3a, 0xa5, 0xd3, 0x32, 0x49, 0x43, 0xf4, 0x16, 0xaa, - 0x5c, 0xba, 0xc1, 0x56, 0xb8, 0x2a, 0x89, 0x46, 0xbf, 0x75, 0xf7, 0x76, 0x53, 0x95, 0x23, 0x19, - 0x07, 0x7d, 0x84, 0x9a, 0x60, 0x51, 0x44, 0x7d, 0x8e, 0x41, 0xf6, 0x30, 0xfa, 0xdd, 0xe3, 0x66, - 0x5c, 0x69, 0xd2, 0x05, 0x17, 0xd1, 0x9e, 0x1c, 0x4a, 0xa4, 0x97, 0x7a, 0x5f, 0x7d, 0x67, 0xed, - 0xb3, 0xed, 0x0a, 0x1b, 0x4a, 0xf1, 0x89, 0x7d, 0xd8, 0x8b, 0x3d, 0x4f, 0xdc, 0x2f, 0x6c, 0x4d, - 0xe5, 0x4d, 0x63, 0x62, 0x68, 0xea, 0xd7, 0x94, 0x89, 0x46, 0x37, 0x95, 0xbf, 0xe9, 0x36, 0x61, - 0xb8, 0xa9, 0xc4, 0x5f, 0x1d, 0x17, 0x9f, 0x29, 0xe6, 0x8f, 0x94, 0xa8, 0x07, 0xc8, 0x5a, 0x29, - 0xa4, 0x3d, 0x03, 0x33, 0x3f, 0xdd, 0xc1, 0x12, 0xbd, 0x73, 0x65, 0xc9, 0x6b, 0xa8, 0x68, 0x95, - 0xe2, 0x03, 0x8e, 0x68, 0xca, 0x87, 0xe2, 0x59, 0xa1, 0xbd, 0x00, 0xeb, 0xbe, 0xe4, 0x91, 0xae, - 0x6f, 0xee, 0x76, 0xfd, 0xcf, 0xad, 0x6f, 0xdb, 0x76, 0x3f, 0x43, 0x55, 0xbf, 0x29, 0x64, 0x40, - 0x6d, 0x31, 0xbd, 0x9c, 0x7e, 0xbf, 0x9e, 0x5a, 0x8f, 0x50, 0x1d, 0xca, 0xb3, 0xc5, 0x74, 0x6e, - 0x15, 0x50, 0x13, 0x1a, 0xf3, 0xf1, 0xf9, 0x6c, 0x7e, 0x35, 0x1a, 0x5e, 0x5a, 0x45, 0xf4, 0x18, - 0x8c, 0xc1, 0x68, 0x3c, 0x76, 0x06, 0xe7, 0xa3, 0xf1, 0xc5, 0x4f, 0xab, 0xd4, 0x7d, 0x0e, 0x55, - 0x3d, 0x6c, 0xfa, 0x18, 0xdc, 0x84, 0xf3, 0xc3, 0x3c, 0xfa, 0xd0, 0xfd, 0x53, 0x80, 0x93, 0xcc, - 0xb3, 0x6b, 0xf9, 0xe3, 0x4c, 0xe8, 0x0e, 0x49, 0x73, 0xdc, 0xbd, 0x60, 0x4e, 0x40, 0x77, 0x3b, - 0x9f, 0x7b, 0x92, 0x9f, 0xfa, 0xfc, 0xee, 0xa8, 0xcf, 0x59, 0x8d, 0x3d, 0x90, 0x05, 0x13, 0xcd, - 0xcf, 0xec, 0x76, 0x6f, 0x91, 0xf6, 0x27, 0xb0, 0xee, 0x13, 0xf2, 0xe6, 0xd4, 0xb5, 0x39, 0xad, - 0xbc, 0x39, 0x66, 0xce, 0x05, 0xb7, 0xaa, 0xa5, 0xff, 0x05, 0x00, 0x00, 0xff, 0xff, 0x9d, 0xf0, - 0x9a, 0xf4, 0x05, 0x04, 0x00, 0x00, + // 580 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x84, 0x53, 0xdd, 0x6a, 0xdb, 0x4c, + 0x10, 0xfd, 0xfc, 0x13, 0x59, 0x19, 0xc9, 0xf9, 0xc4, 0xe2, 0xc2, 0xd6, 0xf4, 0xc2, 0x75, 0xa1, + 0x84, 0xfe, 0xc8, 0xa0, 0x52, 0x08, 0xa5, 0xb4, 0xc4, 0x6e, 0x42, 0x4d, 0x6c, 0xd7, 0xac, 0xe3, + 0x86, 0x5e, 0x09, 0xc9, 0x5e, 0xcb, 0xa2, 0x96, 0x64, 0xa4, 0x55, 0xc1, 0x4f, 0xd1, 0x77, 0xe8, + 0x93, 0x76, 0x7f, 0xe4, 0x44, 0x09, 0x6e, 0x7b, 0xa5, 0xd9, 0x33, 0xe7, 0xcc, 0xcc, 0x9e, 0x59, + 0xc1, 0xe3, 0x6d, 0x9a, 0xb0, 0xe4, 0x8d, 0x2b, 0x3f, 0x3d, 0x75, 0xb0, 0xe5, 0x07, 0x99, 0xe5, + 0x54, 0xdb, 0x09, 0x42, 0xb6, 0xce, 0x7d, 0x7b, 0x91, 0x44, 0xbd, 0x20, 0x09, 0x0a, 0xae, 0x9f, + 0xaf, 0x54, 0xd0, 0x63, 0x34, 0x63, 0x4b, 0x8f, 0x79, 0x32, 0x50, 0x15, 0xba, 0x3f, 0x35, 0x68, + 0x8c, 0x69, 0x96, 0x79, 0x01, 0x45, 0x08, 0xea, 0xb1, 0x17, 0x51, 0x5c, 0xe9, 0x54, 0x4e, 0x8f, + 0x89, 0x8c, 0xd1, 0x19, 0xe8, 0xeb, 0x70, 0xe3, 0xa5, 0x21, 0xdb, 0xe1, 0x2a, 0xc7, 0x4f, 0x9c, + 0x27, 0x76, 0xb9, 0xa9, 0x5d, 0x88, 0xed, 0xcf, 0x79, 0x94, 0xe4, 0x29, 0xb9, 0x65, 0xa3, 0x0e, + 0x98, 0x6b, 0x1a, 0x06, 0x6b, 0xe6, 0x86, 0xb1, 0xbb, 0x88, 0x70, 0x8d, 0xab, 0x9b, 0x04, 0x14, + 0x36, 0x8c, 0x07, 0x91, 0xe8, 0x27, 0xc6, 0xc1, 0x75, 0x9e, 0x31, 0x89, 0x8c, 0xd1, 0x53, 0x30, + 0x53, 0x9a, 0xe5, 0x1b, 0xe6, 0x2e, 0x92, 0x3c, 0x66, 0xb8, 0xc1, 0x73, 0x35, 0x62, 0x28, 0x6c, + 0x20, 0x20, 0xf4, 0x0c, 0x9a, 0x2c, 0xcd, 0xa9, 0x9b, 0x2d, 0x12, 0x96, 0x45, 0x5e, 0x8c, 0x75, + 0xce, 0xd1, 0x89, 0x29, 0xc0, 0x59, 0x81, 0xa1, 0x16, 0x1c, 0xf1, 0x7c, 0x4a, 0xf1, 0x31, 0x4f, + 0x56, 0x89, 0x3a, 0x20, 0x0b, 0x6a, 0xdf, 0xe9, 0x0e, 0x1f, 0x75, 0x6a, 0xa7, 0x75, 0x22, 0x42, + 0xf4, 0x0a, 0xb4, 0x98, 0xbb, 0x41, 0x97, 0x58, 0xe3, 0x44, 0xc3, 0x69, 0xdd, 0xbf, 0xdd, 0x44, + 0xe6, 0x48, 0xc1, 0x41, 0x6f, 0xa1, 0x91, 0xba, 0xab, 0x3c, 0x8e, 0x77, 0xd8, 0xe2, 0x35, 0xfe, + 0x65, 0x86, 0x96, 0x5e, 0x0a, 0x2e, 0x7a, 0x0f, 0x0d, 0x46, 0xd3, 0xd4, 0x0b, 0x63, 0x0c, 0x5c, + 0x66, 0x38, 0xdd, 0xc3, 0xb2, 0x6b, 0x45, 0xba, 0x88, 0x59, 0xba, 0x23, 0x7b, 0x09, 0x5f, 0x81, + 0x5a, 0xb3, 0xe3, 0xae, 0x42, 0xba, 0x59, 0x62, 0x43, 0x0e, 0xfa, 0xc8, 0xde, 0xaf, 0xd3, 0x9e, + 0xe5, 0xfe, 0x27, 0xba, 0xf2, 0xb8, 0x41, 0x19, 0x31, 0x14, 0xf5, 0x52, 0x30, 0xd1, 0xf0, 0x56, + 0xf9, 0xc3, 0xdb, 0xe4, 0x14, 0x37, 0x65, 0xf3, 0xe7, 0x87, 0x9b, 0x4f, 0x25, 0xf3, 0xab, 0x20, + 0xaa, 0x01, 0x8a, 0x52, 0x12, 0x69, 0x4f, 0xc1, 0x2c, 0x4f, 0xb7, 0x77, 0x52, 0x3d, 0x15, 0xe9, + 0xe4, 0x0b, 0x38, 0x52, 0x5d, 0xaa, 0x7f, 0x31, 0x52, 0x51, 0xde, 0x55, 0xcf, 0x2a, 0xed, 0x39, + 0x58, 0x0f, 0x5b, 0x1e, 0xa8, 0xfa, 0xf2, 0x7e, 0xd5, 0x3f, 0xdc, 0xfa, 0xae, 0x6c, 0xf7, 0x23, + 0x68, 0xca, 0x7d, 0x64, 0x40, 0x63, 0x3e, 0xb9, 0x9a, 0x7c, 0xb9, 0x99, 0x58, 0xff, 0x21, 0x1d, + 0xea, 0xd3, 0xf9, 0x64, 0x66, 0x55, 0x50, 0x13, 0x8e, 0x67, 0xa3, 0xf3, 0xe9, 0xec, 0x7a, 0x38, + 0xb8, 0xb2, 0xaa, 0xe8, 0x7f, 0x30, 0xfa, 0xc3, 0xd1, 0xc8, 0xed, 0x9f, 0x0f, 0x47, 0x17, 0xdf, + 0xac, 0x5a, 0xd7, 0x01, 0x4d, 0x0d, 0x2b, 0xde, 0x90, 0x2f, 0x77, 0xad, 0xe6, 0x51, 0x07, 0xf1, + 0x6a, 0x17, 0x39, 0x53, 0x03, 0xe9, 0x44, 0xc6, 0xdd, 0x5f, 0x15, 0x38, 0x29, 0x7c, 0xbc, 0xe1, + 0xff, 0xe0, 0xd8, 0xdb, 0x22, 0x6e, 0x98, 0xbf, 0x63, 0xd4, 0x8d, 0xbc, 0xed, 0x36, 0x8c, 0x03, + 0x5e, 0x43, 0x78, 0xff, 0xfa, 0xa0, 0xf7, 0x85, 0xc6, 0xee, 0x73, 0xc1, 0x58, 0xf1, 0x8b, 0x15, + 0xf8, 0x77, 0x48, 0xfb, 0x03, 0x58, 0x0f, 0x09, 0x65, 0xc3, 0x74, 0x65, 0x58, 0xab, 0x6c, 0x98, + 0x59, 0x72, 0xc6, 0xd7, 0x54, 0xeb, 0xdf, 0x01, 0x00, 0x00, 0xff, 0xff, 0x75, 0x74, 0x87, 0xb4, + 0x50, 0x04, 0x00, 0x00, } diff --git a/vendor/github.com/gogo/protobuf/proto/proto3_proto/proto3.proto b/vendor/github.com/gogo/protobuf/proto/proto3_proto/proto3.proto index ca67001..5169d75 100644 --- a/vendor/github.com/gogo/protobuf/proto/proto3_proto/proto3.proto +++ b/vendor/github.com/gogo/protobuf/proto/proto3_proto/proto3.proto @@ -53,6 +53,7 @@ message Message { repeated uint64 key = 5; Nested nested = 6; + repeated Humour r_funny = 16; map terrain = 10; testdata.SubDefaults proto2_field = 11; @@ -61,6 +62,7 @@ message Message { message Nested { string bunny = 1; + bool cute = 2; } message MessageWithMap { diff --git a/vendor/github.com/gogo/protobuf/proto/testdata/test.pb.go b/vendor/github.com/gogo/protobuf/proto/testdata/test.pb.go index edfa957..025865e 100644 --- a/vendor/github.com/gogo/protobuf/proto/testdata/test.pb.go +++ b/vendor/github.com/gogo/protobuf/proto/testdata/test.pb.go @@ -12,6 +12,7 @@ It has these top-level messages: GoEnum GoTestField GoTest + GoTestRequiredGroupField GoSkipTest NonPackedTest PackedTest @@ -20,6 +21,7 @@ It has these top-level messages: NewMessage InnerMessage OtherMessage + RequiredInnerMessage MyMessage Ext ComplexExtension @@ -192,7 +194,7 @@ func (x *MyMessage_Color) UnmarshalJSON(data []byte) error { *x = MyMessage_Color(value) return nil } -func (MyMessage_Color) EnumDescriptor() ([]byte, []int) { return fileDescriptorTest, []int{11, 0} } +func (MyMessage_Color) EnumDescriptor() ([]byte, []int) { return fileDescriptorTest, []int{13, 0} } type DefaultsMessage_DefaultsEnum int32 @@ -230,7 +232,7 @@ func (x *DefaultsMessage_DefaultsEnum) UnmarshalJSON(data []byte) error { return nil } func (DefaultsMessage_DefaultsEnum) EnumDescriptor() ([]byte, []int) { - return fileDescriptorTest, []int{14, 0} + return fileDescriptorTest, []int{16, 0} } type Defaults_Color int32 @@ -268,7 +270,7 @@ func (x *Defaults_Color) UnmarshalJSON(data []byte) error { *x = Defaults_Color(value) return nil } -func (Defaults_Color) EnumDescriptor() ([]byte, []int) { return fileDescriptorTest, []int{19, 0} } +func (Defaults_Color) EnumDescriptor() ([]byte, []int) { return fileDescriptorTest, []int{21, 0} } type RepeatedEnum_Color int32 @@ -299,7 +301,7 @@ func (x *RepeatedEnum_Color) UnmarshalJSON(data []byte) error { *x = RepeatedEnum_Color(value) return nil } -func (RepeatedEnum_Color) EnumDescriptor() ([]byte, []int) { return fileDescriptorTest, []int{21, 0} } +func (RepeatedEnum_Color) EnumDescriptor() ([]byte, []int) { return fileDescriptorTest, []int{23, 0} } type GoEnum struct { Foo *FOO `protobuf:"varint,1,req,name=foo,enum=testdata.FOO" json:"foo,omitempty"` @@ -957,9 +959,10 @@ type GoTest_RequiredGroup struct { XXX_unrecognized []byte `json:"-"` } -func (m *GoTest_RequiredGroup) Reset() { *m = GoTest_RequiredGroup{} } -func (m *GoTest_RequiredGroup) String() string { return proto.CompactTextString(m) } -func (*GoTest_RequiredGroup) ProtoMessage() {} +func (m *GoTest_RequiredGroup) Reset() { *m = GoTest_RequiredGroup{} } +func (m *GoTest_RequiredGroup) String() string { return proto.CompactTextString(m) } +func (*GoTest_RequiredGroup) ProtoMessage() {} +func (*GoTest_RequiredGroup) Descriptor() ([]byte, []int) { return fileDescriptorTest, []int{2, 0} } func (m *GoTest_RequiredGroup) GetRequiredField() string { if m != nil && m.RequiredField != nil { @@ -973,9 +976,10 @@ type GoTest_RepeatedGroup struct { XXX_unrecognized []byte `json:"-"` } -func (m *GoTest_RepeatedGroup) Reset() { *m = GoTest_RepeatedGroup{} } -func (m *GoTest_RepeatedGroup) String() string { return proto.CompactTextString(m) } -func (*GoTest_RepeatedGroup) ProtoMessage() {} +func (m *GoTest_RepeatedGroup) Reset() { *m = GoTest_RepeatedGroup{} } +func (m *GoTest_RepeatedGroup) String() string { return proto.CompactTextString(m) } +func (*GoTest_RepeatedGroup) ProtoMessage() {} +func (*GoTest_RepeatedGroup) Descriptor() ([]byte, []int) { return fileDescriptorTest, []int{2, 1} } func (m *GoTest_RepeatedGroup) GetRequiredField() string { if m != nil && m.RequiredField != nil { @@ -989,9 +993,10 @@ type GoTest_OptionalGroup struct { XXX_unrecognized []byte `json:"-"` } -func (m *GoTest_OptionalGroup) Reset() { *m = GoTest_OptionalGroup{} } -func (m *GoTest_OptionalGroup) String() string { return proto.CompactTextString(m) } -func (*GoTest_OptionalGroup) ProtoMessage() {} +func (m *GoTest_OptionalGroup) Reset() { *m = GoTest_OptionalGroup{} } +func (m *GoTest_OptionalGroup) String() string { return proto.CompactTextString(m) } +func (*GoTest_OptionalGroup) ProtoMessage() {} +func (*GoTest_OptionalGroup) Descriptor() ([]byte, []int) { return fileDescriptorTest, []int{2, 2} } func (m *GoTest_OptionalGroup) GetRequiredField() string { if m != nil && m.RequiredField != nil { @@ -1000,6 +1005,43 @@ func (m *GoTest_OptionalGroup) GetRequiredField() string { return "" } +// For testing a group containing a required field. +type GoTestRequiredGroupField struct { + Group *GoTestRequiredGroupField_Group `protobuf:"group,1,req,name=Group,json=group" json:"group,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *GoTestRequiredGroupField) Reset() { *m = GoTestRequiredGroupField{} } +func (m *GoTestRequiredGroupField) String() string { return proto.CompactTextString(m) } +func (*GoTestRequiredGroupField) ProtoMessage() {} +func (*GoTestRequiredGroupField) Descriptor() ([]byte, []int) { return fileDescriptorTest, []int{3} } + +func (m *GoTestRequiredGroupField) GetGroup() *GoTestRequiredGroupField_Group { + if m != nil { + return m.Group + } + return nil +} + +type GoTestRequiredGroupField_Group struct { + Field *int32 `protobuf:"varint,2,req,name=Field,json=field" json:"Field,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *GoTestRequiredGroupField_Group) Reset() { *m = GoTestRequiredGroupField_Group{} } +func (m *GoTestRequiredGroupField_Group) String() string { return proto.CompactTextString(m) } +func (*GoTestRequiredGroupField_Group) ProtoMessage() {} +func (*GoTestRequiredGroupField_Group) Descriptor() ([]byte, []int) { + return fileDescriptorTest, []int{3, 0} +} + +func (m *GoTestRequiredGroupField_Group) GetField() int32 { + if m != nil && m.Field != nil { + return *m.Field + } + return 0 +} + // For testing skipping of unrecognized fields. // Numbers are all big, larger than tag numbers in GoTestField, // the message used in the corresponding test. @@ -1015,7 +1057,7 @@ type GoSkipTest struct { func (m *GoSkipTest) Reset() { *m = GoSkipTest{} } func (m *GoSkipTest) String() string { return proto.CompactTextString(m) } func (*GoSkipTest) ProtoMessage() {} -func (*GoSkipTest) Descriptor() ([]byte, []int) { return fileDescriptorTest, []int{3} } +func (*GoSkipTest) Descriptor() ([]byte, []int) { return fileDescriptorTest, []int{4} } func (m *GoSkipTest) GetSkipInt32() int32 { if m != nil && m.SkipInt32 != nil { @@ -1058,9 +1100,10 @@ type GoSkipTest_SkipGroup struct { XXX_unrecognized []byte `json:"-"` } -func (m *GoSkipTest_SkipGroup) Reset() { *m = GoSkipTest_SkipGroup{} } -func (m *GoSkipTest_SkipGroup) String() string { return proto.CompactTextString(m) } -func (*GoSkipTest_SkipGroup) ProtoMessage() {} +func (m *GoSkipTest_SkipGroup) Reset() { *m = GoSkipTest_SkipGroup{} } +func (m *GoSkipTest_SkipGroup) String() string { return proto.CompactTextString(m) } +func (*GoSkipTest_SkipGroup) ProtoMessage() {} +func (*GoSkipTest_SkipGroup) Descriptor() ([]byte, []int) { return fileDescriptorTest, []int{4, 0} } func (m *GoSkipTest_SkipGroup) GetGroupInt32() int32 { if m != nil && m.GroupInt32 != nil { @@ -1086,7 +1129,7 @@ type NonPackedTest struct { func (m *NonPackedTest) Reset() { *m = NonPackedTest{} } func (m *NonPackedTest) String() string { return proto.CompactTextString(m) } func (*NonPackedTest) ProtoMessage() {} -func (*NonPackedTest) Descriptor() ([]byte, []int) { return fileDescriptorTest, []int{4} } +func (*NonPackedTest) Descriptor() ([]byte, []int) { return fileDescriptorTest, []int{5} } func (m *NonPackedTest) GetA() []int32 { if m != nil { @@ -1103,7 +1146,7 @@ type PackedTest struct { func (m *PackedTest) Reset() { *m = PackedTest{} } func (m *PackedTest) String() string { return proto.CompactTextString(m) } func (*PackedTest) ProtoMessage() {} -func (*PackedTest) Descriptor() ([]byte, []int) { return fileDescriptorTest, []int{5} } +func (*PackedTest) Descriptor() ([]byte, []int) { return fileDescriptorTest, []int{6} } func (m *PackedTest) GetB() []int32 { if m != nil { @@ -1121,7 +1164,7 @@ type MaxTag struct { func (m *MaxTag) Reset() { *m = MaxTag{} } func (m *MaxTag) String() string { return proto.CompactTextString(m) } func (*MaxTag) ProtoMessage() {} -func (*MaxTag) Descriptor() ([]byte, []int) { return fileDescriptorTest, []int{6} } +func (*MaxTag) Descriptor() ([]byte, []int) { return fileDescriptorTest, []int{7} } func (m *MaxTag) GetLastField() string { if m != nil && m.LastField != nil { @@ -1139,7 +1182,7 @@ type OldMessage struct { func (m *OldMessage) Reset() { *m = OldMessage{} } func (m *OldMessage) String() string { return proto.CompactTextString(m) } func (*OldMessage) ProtoMessage() {} -func (*OldMessage) Descriptor() ([]byte, []int) { return fileDescriptorTest, []int{7} } +func (*OldMessage) Descriptor() ([]byte, []int) { return fileDescriptorTest, []int{8} } func (m *OldMessage) GetNested() *OldMessage_Nested { if m != nil { @@ -1163,7 +1206,7 @@ type OldMessage_Nested struct { func (m *OldMessage_Nested) Reset() { *m = OldMessage_Nested{} } func (m *OldMessage_Nested) String() string { return proto.CompactTextString(m) } func (*OldMessage_Nested) ProtoMessage() {} -func (*OldMessage_Nested) Descriptor() ([]byte, []int) { return fileDescriptorTest, []int{7, 0} } +func (*OldMessage_Nested) Descriptor() ([]byte, []int) { return fileDescriptorTest, []int{8, 0} } func (m *OldMessage_Nested) GetName() string { if m != nil && m.Name != nil { @@ -1184,7 +1227,7 @@ type NewMessage struct { func (m *NewMessage) Reset() { *m = NewMessage{} } func (m *NewMessage) String() string { return proto.CompactTextString(m) } func (*NewMessage) ProtoMessage() {} -func (*NewMessage) Descriptor() ([]byte, []int) { return fileDescriptorTest, []int{8} } +func (*NewMessage) Descriptor() ([]byte, []int) { return fileDescriptorTest, []int{9} } func (m *NewMessage) GetNested() *NewMessage_Nested { if m != nil { @@ -1209,7 +1252,7 @@ type NewMessage_Nested struct { func (m *NewMessage_Nested) Reset() { *m = NewMessage_Nested{} } func (m *NewMessage_Nested) String() string { return proto.CompactTextString(m) } func (*NewMessage_Nested) ProtoMessage() {} -func (*NewMessage_Nested) Descriptor() ([]byte, []int) { return fileDescriptorTest, []int{8, 0} } +func (*NewMessage_Nested) Descriptor() ([]byte, []int) { return fileDescriptorTest, []int{9, 0} } func (m *NewMessage_Nested) GetName() string { if m != nil && m.Name != nil { @@ -1235,7 +1278,7 @@ type InnerMessage struct { func (m *InnerMessage) Reset() { *m = InnerMessage{} } func (m *InnerMessage) String() string { return proto.CompactTextString(m) } func (*InnerMessage) ProtoMessage() {} -func (*InnerMessage) Descriptor() ([]byte, []int) { return fileDescriptorTest, []int{9} } +func (*InnerMessage) Descriptor() ([]byte, []int) { return fileDescriptorTest, []int{10} } const Default_InnerMessage_Port int32 = 4000 @@ -1272,7 +1315,7 @@ type OtherMessage struct { func (m *OtherMessage) Reset() { *m = OtherMessage{} } func (m *OtherMessage) String() string { return proto.CompactTextString(m) } func (*OtherMessage) ProtoMessage() {} -func (*OtherMessage) Descriptor() ([]byte, []int) { return fileDescriptorTest, []int{10} } +func (*OtherMessage) Descriptor() ([]byte, []int) { return fileDescriptorTest, []int{11} } var extRange_OtherMessage = []proto.ExtensionRange{ {100, 536870911}, @@ -1316,16 +1359,34 @@ func (m *OtherMessage) GetInner() *InnerMessage { return nil } +type RequiredInnerMessage struct { + LeoFinallyWonAnOscar *InnerMessage `protobuf:"bytes,1,req,name=leo_finally_won_an_oscar,json=leoFinallyWonAnOscar" json:"leo_finally_won_an_oscar,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *RequiredInnerMessage) Reset() { *m = RequiredInnerMessage{} } +func (m *RequiredInnerMessage) String() string { return proto.CompactTextString(m) } +func (*RequiredInnerMessage) ProtoMessage() {} +func (*RequiredInnerMessage) Descriptor() ([]byte, []int) { return fileDescriptorTest, []int{12} } + +func (m *RequiredInnerMessage) GetLeoFinallyWonAnOscar() *InnerMessage { + if m != nil { + return m.LeoFinallyWonAnOscar + } + return nil +} + type MyMessage struct { - Count *int32 `protobuf:"varint,1,req,name=count" json:"count,omitempty"` - Name *string `protobuf:"bytes,2,opt,name=name" json:"name,omitempty"` - Quote *string `protobuf:"bytes,3,opt,name=quote" json:"quote,omitempty"` - Pet []string `protobuf:"bytes,4,rep,name=pet" json:"pet,omitempty"` - Inner *InnerMessage `protobuf:"bytes,5,opt,name=inner" json:"inner,omitempty"` - Others []*OtherMessage `protobuf:"bytes,6,rep,name=others" json:"others,omitempty"` - RepInner []*InnerMessage `protobuf:"bytes,12,rep,name=rep_inner,json=repInner" json:"rep_inner,omitempty"` - Bikeshed *MyMessage_Color `protobuf:"varint,7,opt,name=bikeshed,enum=testdata.MyMessage_Color" json:"bikeshed,omitempty"` - Somegroup *MyMessage_SomeGroup `protobuf:"group,8,opt,name=SomeGroup,json=somegroup" json:"somegroup,omitempty"` + Count *int32 `protobuf:"varint,1,req,name=count" json:"count,omitempty"` + Name *string `protobuf:"bytes,2,opt,name=name" json:"name,omitempty"` + Quote *string `protobuf:"bytes,3,opt,name=quote" json:"quote,omitempty"` + Pet []string `protobuf:"bytes,4,rep,name=pet" json:"pet,omitempty"` + Inner *InnerMessage `protobuf:"bytes,5,opt,name=inner" json:"inner,omitempty"` + Others []*OtherMessage `protobuf:"bytes,6,rep,name=others" json:"others,omitempty"` + WeMustGoDeeper *RequiredInnerMessage `protobuf:"bytes,13,opt,name=we_must_go_deeper,json=weMustGoDeeper" json:"we_must_go_deeper,omitempty"` + RepInner []*InnerMessage `protobuf:"bytes,12,rep,name=rep_inner,json=repInner" json:"rep_inner,omitempty"` + Bikeshed *MyMessage_Color `protobuf:"varint,7,opt,name=bikeshed,enum=testdata.MyMessage_Color" json:"bikeshed,omitempty"` + Somegroup *MyMessage_SomeGroup `protobuf:"group,8,opt,name=SomeGroup,json=somegroup" json:"somegroup,omitempty"` // This field becomes [][]byte in the generated code. RepBytes [][]byte `protobuf:"bytes,10,rep,name=rep_bytes,json=repBytes" json:"rep_bytes,omitempty"` Bigfloat *float64 `protobuf:"fixed64,11,opt,name=bigfloat" json:"bigfloat,omitempty"` @@ -1336,7 +1397,7 @@ type MyMessage struct { func (m *MyMessage) Reset() { *m = MyMessage{} } func (m *MyMessage) String() string { return proto.CompactTextString(m) } func (*MyMessage) ProtoMessage() {} -func (*MyMessage) Descriptor() ([]byte, []int) { return fileDescriptorTest, []int{11} } +func (*MyMessage) Descriptor() ([]byte, []int) { return fileDescriptorTest, []int{13} } var extRange_MyMessage = []proto.ExtensionRange{ {100, 536870911}, @@ -1394,6 +1455,13 @@ func (m *MyMessage) GetOthers() []*OtherMessage { return nil } +func (m *MyMessage) GetWeMustGoDeeper() *RequiredInnerMessage { + if m != nil { + return m.WeMustGoDeeper + } + return nil +} + func (m *MyMessage) GetRepInner() []*InnerMessage { if m != nil { return m.RepInner @@ -1434,9 +1502,10 @@ type MyMessage_SomeGroup struct { XXX_unrecognized []byte `json:"-"` } -func (m *MyMessage_SomeGroup) Reset() { *m = MyMessage_SomeGroup{} } -func (m *MyMessage_SomeGroup) String() string { return proto.CompactTextString(m) } -func (*MyMessage_SomeGroup) ProtoMessage() {} +func (m *MyMessage_SomeGroup) Reset() { *m = MyMessage_SomeGroup{} } +func (m *MyMessage_SomeGroup) String() string { return proto.CompactTextString(m) } +func (*MyMessage_SomeGroup) ProtoMessage() {} +func (*MyMessage_SomeGroup) Descriptor() ([]byte, []int) { return fileDescriptorTest, []int{13, 0} } func (m *MyMessage_SomeGroup) GetGroupField() int32 { if m != nil && m.GroupField != nil { @@ -1453,7 +1522,7 @@ type Ext struct { func (m *Ext) Reset() { *m = Ext{} } func (m *Ext) String() string { return proto.CompactTextString(m) } func (*Ext) ProtoMessage() {} -func (*Ext) Descriptor() ([]byte, []int) { return fileDescriptorTest, []int{12} } +func (*Ext) Descriptor() ([]byte, []int) { return fileDescriptorTest, []int{14} } func (m *Ext) GetData() string { if m != nil && m.Data != nil { @@ -1496,7 +1565,7 @@ type ComplexExtension struct { func (m *ComplexExtension) Reset() { *m = ComplexExtension{} } func (m *ComplexExtension) String() string { return proto.CompactTextString(m) } func (*ComplexExtension) ProtoMessage() {} -func (*ComplexExtension) Descriptor() ([]byte, []int) { return fileDescriptorTest, []int{13} } +func (*ComplexExtension) Descriptor() ([]byte, []int) { return fileDescriptorTest, []int{15} } func (m *ComplexExtension) GetFirst() int32 { if m != nil && m.First != nil { @@ -1527,7 +1596,7 @@ type DefaultsMessage struct { func (m *DefaultsMessage) Reset() { *m = DefaultsMessage{} } func (m *DefaultsMessage) String() string { return proto.CompactTextString(m) } func (*DefaultsMessage) ProtoMessage() {} -func (*DefaultsMessage) Descriptor() ([]byte, []int) { return fileDescriptorTest, []int{14} } +func (*DefaultsMessage) Descriptor() ([]byte, []int) { return fileDescriptorTest, []int{16} } var extRange_DefaultsMessage = []proto.ExtensionRange{ {100, 536870911}, @@ -1551,7 +1620,7 @@ type MyMessageSet struct { func (m *MyMessageSet) Reset() { *m = MyMessageSet{} } func (m *MyMessageSet) String() string { return proto.CompactTextString(m) } func (*MyMessageSet) ProtoMessage() {} -func (*MyMessageSet) Descriptor() ([]byte, []int) { return fileDescriptorTest, []int{15} } +func (*MyMessageSet) Descriptor() ([]byte, []int) { return fileDescriptorTest, []int{17} } func (m *MyMessageSet) Marshal() ([]byte, error) { return proto.MarshalMessageSet(m.ExtensionMap()) @@ -1591,7 +1660,7 @@ type Empty struct { func (m *Empty) Reset() { *m = Empty{} } func (m *Empty) String() string { return proto.CompactTextString(m) } func (*Empty) ProtoMessage() {} -func (*Empty) Descriptor() ([]byte, []int) { return fileDescriptorTest, []int{16} } +func (*Empty) Descriptor() ([]byte, []int) { return fileDescriptorTest, []int{18} } type MessageList struct { Message []*MessageList_Message `protobuf:"group,1,rep,name=Message,json=message" json:"message,omitempty"` @@ -1601,7 +1670,7 @@ type MessageList struct { func (m *MessageList) Reset() { *m = MessageList{} } func (m *MessageList) String() string { return proto.CompactTextString(m) } func (*MessageList) ProtoMessage() {} -func (*MessageList) Descriptor() ([]byte, []int) { return fileDescriptorTest, []int{17} } +func (*MessageList) Descriptor() ([]byte, []int) { return fileDescriptorTest, []int{19} } func (m *MessageList) GetMessage() []*MessageList_Message { if m != nil { @@ -1616,9 +1685,10 @@ type MessageList_Message struct { XXX_unrecognized []byte `json:"-"` } -func (m *MessageList_Message) Reset() { *m = MessageList_Message{} } -func (m *MessageList_Message) String() string { return proto.CompactTextString(m) } -func (*MessageList_Message) ProtoMessage() {} +func (m *MessageList_Message) Reset() { *m = MessageList_Message{} } +func (m *MessageList_Message) String() string { return proto.CompactTextString(m) } +func (*MessageList_Message) ProtoMessage() {} +func (*MessageList_Message) Descriptor() ([]byte, []int) { return fileDescriptorTest, []int{19, 0} } func (m *MessageList_Message) GetName() string { if m != nil && m.Name != nil { @@ -1643,7 +1713,7 @@ type Strings struct { func (m *Strings) Reset() { *m = Strings{} } func (m *Strings) String() string { return proto.CompactTextString(m) } func (*Strings) ProtoMessage() {} -func (*Strings) Descriptor() ([]byte, []int) { return fileDescriptorTest, []int{18} } +func (*Strings) Descriptor() ([]byte, []int) { return fileDescriptorTest, []int{20} } func (m *Strings) GetStringField() string { if m != nil && m.StringField != nil { @@ -1690,7 +1760,7 @@ type Defaults struct { func (m *Defaults) Reset() { *m = Defaults{} } func (m *Defaults) String() string { return proto.CompactTextString(m) } func (*Defaults) ProtoMessage() {} -func (*Defaults) Descriptor() ([]byte, []int) { return fileDescriptorTest, []int{19} } +func (*Defaults) Descriptor() ([]byte, []int) { return fileDescriptorTest, []int{21} } const Default_Defaults_F_Bool bool = true const Default_Defaults_F_Int32 int32 = 32 @@ -1854,7 +1924,7 @@ type SubDefaults struct { func (m *SubDefaults) Reset() { *m = SubDefaults{} } func (m *SubDefaults) String() string { return proto.CompactTextString(m) } func (*SubDefaults) ProtoMessage() {} -func (*SubDefaults) Descriptor() ([]byte, []int) { return fileDescriptorTest, []int{20} } +func (*SubDefaults) Descriptor() ([]byte, []int) { return fileDescriptorTest, []int{22} } const Default_SubDefaults_N int64 = 7 @@ -1873,7 +1943,7 @@ type RepeatedEnum struct { func (m *RepeatedEnum) Reset() { *m = RepeatedEnum{} } func (m *RepeatedEnum) String() string { return proto.CompactTextString(m) } func (*RepeatedEnum) ProtoMessage() {} -func (*RepeatedEnum) Descriptor() ([]byte, []int) { return fileDescriptorTest, []int{21} } +func (*RepeatedEnum) Descriptor() ([]byte, []int) { return fileDescriptorTest, []int{23} } func (m *RepeatedEnum) GetColor() []RepeatedEnum_Color { if m != nil { @@ -1896,7 +1966,7 @@ type MoreRepeated struct { func (m *MoreRepeated) Reset() { *m = MoreRepeated{} } func (m *MoreRepeated) String() string { return proto.CompactTextString(m) } func (*MoreRepeated) ProtoMessage() {} -func (*MoreRepeated) Descriptor() ([]byte, []int) { return fileDescriptorTest, []int{22} } +func (*MoreRepeated) Descriptor() ([]byte, []int) { return fileDescriptorTest, []int{24} } func (m *MoreRepeated) GetBools() []bool { if m != nil { @@ -1955,7 +2025,7 @@ type GroupOld struct { func (m *GroupOld) Reset() { *m = GroupOld{} } func (m *GroupOld) String() string { return proto.CompactTextString(m) } func (*GroupOld) ProtoMessage() {} -func (*GroupOld) Descriptor() ([]byte, []int) { return fileDescriptorTest, []int{23} } +func (*GroupOld) Descriptor() ([]byte, []int) { return fileDescriptorTest, []int{25} } func (m *GroupOld) GetG() *GroupOld_G { if m != nil { @@ -1969,9 +2039,10 @@ type GroupOld_G struct { XXX_unrecognized []byte `json:"-"` } -func (m *GroupOld_G) Reset() { *m = GroupOld_G{} } -func (m *GroupOld_G) String() string { return proto.CompactTextString(m) } -func (*GroupOld_G) ProtoMessage() {} +func (m *GroupOld_G) Reset() { *m = GroupOld_G{} } +func (m *GroupOld_G) String() string { return proto.CompactTextString(m) } +func (*GroupOld_G) ProtoMessage() {} +func (*GroupOld_G) Descriptor() ([]byte, []int) { return fileDescriptorTest, []int{25, 0} } func (m *GroupOld_G) GetX() int32 { if m != nil && m.X != nil { @@ -1988,7 +2059,7 @@ type GroupNew struct { func (m *GroupNew) Reset() { *m = GroupNew{} } func (m *GroupNew) String() string { return proto.CompactTextString(m) } func (*GroupNew) ProtoMessage() {} -func (*GroupNew) Descriptor() ([]byte, []int) { return fileDescriptorTest, []int{24} } +func (*GroupNew) Descriptor() ([]byte, []int) { return fileDescriptorTest, []int{26} } func (m *GroupNew) GetG() *GroupNew_G { if m != nil { @@ -2003,9 +2074,10 @@ type GroupNew_G struct { XXX_unrecognized []byte `json:"-"` } -func (m *GroupNew_G) Reset() { *m = GroupNew_G{} } -func (m *GroupNew_G) String() string { return proto.CompactTextString(m) } -func (*GroupNew_G) ProtoMessage() {} +func (m *GroupNew_G) Reset() { *m = GroupNew_G{} } +func (m *GroupNew_G) String() string { return proto.CompactTextString(m) } +func (*GroupNew_G) ProtoMessage() {} +func (*GroupNew_G) Descriptor() ([]byte, []int) { return fileDescriptorTest, []int{26, 0} } func (m *GroupNew_G) GetX() int32 { if m != nil && m.X != nil { @@ -2023,13 +2095,14 @@ func (m *GroupNew_G) GetY() int32 { type FloatingPoint struct { F *float64 `protobuf:"fixed64,1,req,name=f" json:"f,omitempty"` + Exact *bool `protobuf:"varint,2,opt,name=exact" json:"exact,omitempty"` XXX_unrecognized []byte `json:"-"` } func (m *FloatingPoint) Reset() { *m = FloatingPoint{} } func (m *FloatingPoint) String() string { return proto.CompactTextString(m) } func (*FloatingPoint) ProtoMessage() {} -func (*FloatingPoint) Descriptor() ([]byte, []int) { return fileDescriptorTest, []int{25} } +func (*FloatingPoint) Descriptor() ([]byte, []int) { return fileDescriptorTest, []int{27} } func (m *FloatingPoint) GetF() float64 { if m != nil && m.F != nil { @@ -2038,6 +2111,13 @@ func (m *FloatingPoint) GetF() float64 { return 0 } +func (m *FloatingPoint) GetExact() bool { + if m != nil && m.Exact != nil { + return *m.Exact + } + return false +} + type MessageWithMap struct { NameMapping map[int32]string `protobuf:"bytes,1,rep,name=name_mapping,json=nameMapping" json:"name_mapping,omitempty" protobuf_key:"varint,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` MsgMapping map[int64]*FloatingPoint `protobuf:"bytes,2,rep,name=msg_mapping,json=msgMapping" json:"msg_mapping,omitempty" protobuf_key:"zigzag64,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` @@ -2049,7 +2129,7 @@ type MessageWithMap struct { func (m *MessageWithMap) Reset() { *m = MessageWithMap{} } func (m *MessageWithMap) String() string { return proto.CompactTextString(m) } func (*MessageWithMap) ProtoMessage() {} -func (*MessageWithMap) Descriptor() ([]byte, []int) { return fileDescriptorTest, []int{26} } +func (*MessageWithMap) Descriptor() ([]byte, []int) { return fileDescriptorTest, []int{28} } func (m *MessageWithMap) GetNameMapping() map[int32]string { if m != nil { @@ -2108,7 +2188,7 @@ type Oneof struct { func (m *Oneof) Reset() { *m = Oneof{} } func (m *Oneof) String() string { return proto.CompactTextString(m) } func (*Oneof) ProtoMessage() {} -func (*Oneof) Descriptor() ([]byte, []int) { return fileDescriptorTest, []int{27} } +func (*Oneof) Descriptor() ([]byte, []int) { return fileDescriptorTest, []int{29} } type isOneof_Union interface { isOneof_Union() @@ -2651,9 +2731,10 @@ type Oneof_F_Group struct { XXX_unrecognized []byte `json:"-"` } -func (m *Oneof_F_Group) Reset() { *m = Oneof_F_Group{} } -func (m *Oneof_F_Group) String() string { return proto.CompactTextString(m) } -func (*Oneof_F_Group) ProtoMessage() {} +func (m *Oneof_F_Group) Reset() { *m = Oneof_F_Group{} } +func (m *Oneof_F_Group) String() string { return proto.CompactTextString(m) } +func (*Oneof_F_Group) ProtoMessage() {} +func (*Oneof_F_Group) Descriptor() ([]byte, []int) { return fileDescriptorTest, []int{29, 0} } func (m *Oneof_F_Group) GetX() int32 { if m != nil && m.X != nil { @@ -2680,7 +2761,7 @@ type Communique struct { func (m *Communique) Reset() { *m = Communique{} } func (m *Communique) String() string { return proto.CompactTextString(m) } func (*Communique) ProtoMessage() {} -func (*Communique) Descriptor() ([]byte, []int) { return fileDescriptorTest, []int{28} } +func (*Communique) Descriptor() ([]byte, []int) { return fileDescriptorTest, []int{30} } type isCommunique_Union interface { isCommunique_Union() @@ -3582,6 +3663,8 @@ func init() { proto.RegisterType((*GoTest_RequiredGroup)(nil), "testdata.GoTest.RequiredGroup") proto.RegisterType((*GoTest_RepeatedGroup)(nil), "testdata.GoTest.RepeatedGroup") proto.RegisterType((*GoTest_OptionalGroup)(nil), "testdata.GoTest.OptionalGroup") + proto.RegisterType((*GoTestRequiredGroupField)(nil), "testdata.GoTestRequiredGroupField") + proto.RegisterType((*GoTestRequiredGroupField_Group)(nil), "testdata.GoTestRequiredGroupField.Group") proto.RegisterType((*GoSkipTest)(nil), "testdata.GoSkipTest") proto.RegisterType((*GoSkipTest_SkipGroup)(nil), "testdata.GoSkipTest.SkipGroup") proto.RegisterType((*NonPackedTest)(nil), "testdata.NonPackedTest") @@ -3593,6 +3676,7 @@ func init() { proto.RegisterType((*NewMessage_Nested)(nil), "testdata.NewMessage.Nested") proto.RegisterType((*InnerMessage)(nil), "testdata.InnerMessage") proto.RegisterType((*OtherMessage)(nil), "testdata.OtherMessage") + proto.RegisterType((*RequiredInnerMessage)(nil), "testdata.RequiredInnerMessage") proto.RegisterType((*MyMessage)(nil), "testdata.MyMessage") proto.RegisterType((*MyMessage_SomeGroup)(nil), "testdata.MyMessage.SomeGroup") proto.RegisterType((*Ext)(nil), "testdata.Ext") @@ -3712,272 +3796,283 @@ func init() { proto.RegisterExtension(E_X250) } +func init() { proto.RegisterFile("test.proto", fileDescriptorTest) } + var fileDescriptorTest = []byte{ - // 4253 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x94, 0x7a, 0xd9, 0x77, 0x1b, 0x47, - 0x76, 0xbe, 0x1b, 0x3b, 0x0a, 0x20, 0xd1, 0x6c, 0xc9, 0x12, 0x44, 0x2d, 0x96, 0x31, 0x63, 0x5b, - 0x92, 0x6d, 0x0e, 0xd1, 0x00, 0x49, 0x09, 0x9e, 0xdf, 0x9c, 0x23, 0x4a, 0x24, 0x87, 0x67, 0x44, - 0x82, 0xbf, 0x26, 0xed, 0x39, 0xe3, 0x3c, 0xe0, 0x80, 0x62, 0x83, 0x84, 0x05, 0xa0, 0x21, 0x00, - 0x8c, 0xa5, 0xe4, 0x25, 0x2f, 0xc9, 0x6b, 0xb6, 0x97, 0xbc, 0xe6, 0x29, 0x4f, 0x49, 0xce, 0xc9, - 0x5f, 0x11, 0xdb, 0xb3, 0x7a, 0xd6, 0xac, 0x93, 0x7d, 0x99, 0xec, 0xdb, 0x4c, 0x92, 0x93, 0x73, - 0x92, 0x7b, 0x6f, 0xdd, 0xee, 0xae, 0x6e, 0xa0, 0x9b, 0x94, 0x1e, 0x4c, 0x74, 0xd5, 0xf7, 0xdd, - 0xba, 0x55, 0xfd, 0xd5, 0xbd, 0x75, 0xab, 0x2d, 0xc4, 0xc4, 0x1e, 0x4f, 0x96, 0x86, 0x23, 0x67, - 0xe2, 0x18, 0x39, 0xfc, 0x7d, 0xd4, 0x9e, 0xb4, 0x2b, 0xb7, 0x45, 0x66, 0xcb, 0xd9, 0x18, 0x9c, - 0xf6, 0x8d, 0x57, 0x44, 0xb2, 0xe3, 0x38, 0x65, 0xed, 0x66, 0xe2, 0xd6, 0xbc, 0x39, 0xb7, 0xe4, - 0x22, 0x96, 0x36, 0x9b, 0x4d, 0x0b, 0x7b, 0x2a, 0x6b, 0xa2, 0xb0, 0xe5, 0x1c, 0x40, 0xf3, 0x66, - 0xd7, 0xee, 0x1d, 0x19, 0x17, 0x45, 0xfa, 0x51, 0xfb, 0xd0, 0xee, 0x11, 0x23, 0x6f, 0xa5, 0x7b, - 0xf8, 0x60, 0x18, 0x22, 0x75, 0xf0, 0x7c, 0x68, 0x97, 0x13, 0xd4, 0x98, 0x9a, 0xc0, 0xef, 0xca, - 0x2f, 0xde, 0xc0, 0x41, 0x90, 0x69, 0xdc, 0x16, 0xa9, 0x2f, 0x75, 0x07, 0x47, 0x3c, 0xca, 0xcb, - 0xfe, 0x28, 0xb2, 0x7f, 0xe9, 0x4b, 0xdb, 0xbb, 0x0f, 0xad, 0xd4, 0x13, 0x80, 0xa0, 0xfd, 0x83, - 0xf6, 0x61, 0x0f, 0x4d, 0x69, 0x68, 0x7f, 0x82, 0x0f, 0xd8, 0xba, 0xd7, 0x1e, 0xb5, 0xfb, 0xe5, - 0x24, 0xb4, 0xa6, 0xad, 0xf4, 0x10, 0x1f, 0x8c, 0x77, 0xc4, 0x9c, 0x65, 0x3f, 0x3d, 0xed, 0x8e, - 0xec, 0x23, 0x72, 0xae, 0x9c, 0x02, 0xfb, 0x85, 0x69, 0xfb, 0xd4, 0x69, 0xcd, 0x8d, 0x54, 0xac, - 0x24, 0x0f, 0xed, 0xf6, 0xc4, 0x25, 0xa7, 0x6f, 0x26, 0x63, 0xc9, 0x0a, 0x16, 0xc9, 0xcd, 0xe1, - 0xa4, 0xeb, 0x0c, 0xda, 0x3d, 0x49, 0xce, 0x80, 0x5f, 0xd1, 0x64, 0x47, 0xc5, 0x1a, 0xaf, 0x8b, - 0xd2, 0x66, 0x6b, 0xdd, 0x71, 0x7a, 0x2d, 0xd7, 0xa3, 0xb2, 0x00, 0xc7, 0x73, 0xd6, 0x5c, 0x07, - 0x5b, 0xdd, 0x29, 0x19, 0xb7, 0x84, 0xbe, 0xd9, 0xda, 0x1e, 0x4c, 0x6a, 0xa6, 0x0f, 0x2c, 0x00, - 0x30, 0x6d, 0xcd, 0x77, 0xa8, 0x79, 0x0a, 0xb9, 0x5a, 0xf7, 0x91, 0x45, 0x40, 0x26, 0x25, 0x72, - 0xb5, 0xee, 0x21, 0xdf, 0x12, 0xc6, 0x66, 0x6b, 0xb3, 0xfb, 0xcc, 0x3e, 0x52, 0xad, 0xce, 0x01, - 0x36, 0x6b, 0xe9, 0x1d, 0xee, 0x98, 0x81, 0x56, 0x2d, 0xcf, 0x03, 0x3a, 0xe3, 0xa2, 0x15, 0xdb, - 0x77, 0xc4, 0xc2, 0x66, 0xeb, 0xdd, 0x6e, 0xd0, 0xe1, 0x12, 0x80, 0xe7, 0xac, 0x52, 0x47, 0xb6, - 0x4f, 0x63, 0x55, 0xc3, 0x3a, 0x60, 0x53, 0x8c, 0x55, 0xec, 0xd2, 0xec, 0x36, 0x7b, 0x4e, 0x7b, - 0xe2, 0x43, 0x17, 0x00, 0x9a, 0x80, 0xd9, 0x51, 0x73, 0xd0, 0xea, 0x43, 0xe7, 0x14, 0x24, 0xe3, - 0x43, 0x0d, 0x80, 0x6a, 0x60, 0x55, 0xb6, 0x07, 0xb1, 0xfb, 0x93, 0x51, 0x77, 0x70, 0xec, 0x63, - 0x2f, 0x90, 0x7e, 0x4b, 0x1d, 0xd9, 0x1e, 0xf4, 0x60, 0xfd, 0x39, 0xbc, 0x5c, 0x1f, 0x6a, 0x03, - 0xb4, 0x08, 0x1e, 0x50, 0x73, 0xc8, 0x6a, 0x68, 0x0d, 0x3a, 0x00, 0x5d, 0x40, 0xab, 0x33, 0xd6, - 0x60, 0x3f, 0xb4, 0x06, 0xc7, 0x80, 0x35, 0x18, 0xab, 0xac, 0x81, 0xaa, 0x19, 0x29, 0xc4, 0xf2, - 0x45, 0xd0, 0xab, 0xaf, 0x19, 0xd9, 0x18, 0xd4, 0x0c, 0x03, 0x5f, 0x06, 0xa0, 0xa2, 0x99, 0x10, - 0x92, 0x06, 0x67, 0xe4, 0x25, 0x40, 0x2a, 0x9a, 0x61, 0x64, 0x48, 0x33, 0x8c, 0xbd, 0x0c, 0xd8, - 0x80, 0x66, 0xa6, 0xd0, 0xaa, 0xe5, 0x32, 0xa0, 0x03, 0x9a, 0x61, 0x74, 0x50, 0x33, 0x0c, 0xbe, - 0x02, 0x60, 0x55, 0x33, 0x61, 0xac, 0x6a, 0x78, 0x11, 0xb0, 0xaa, 0x66, 0xd4, 0xd9, 0xb9, 0x9a, - 0x61, 0xe8, 0x55, 0x80, 0x2a, 0x9a, 0x51, 0xad, 0x7a, 0x9a, 0x61, 0xe8, 0x35, 0x80, 0xaa, 0x9a, - 0x51, 0xb1, 0x9e, 0x66, 0x18, 0x7b, 0x1d, 0xb0, 0xaa, 0x66, 0x18, 0x7b, 0x5b, 0xd5, 0x0c, 0x43, - 0x3f, 0xd2, 0x00, 0xab, 0x88, 0x86, 0xa1, 0x6f, 0x06, 0x44, 0xc3, 0xd8, 0x8f, 0x11, 0xab, 0xaa, - 0x26, 0x0c, 0x56, 0x57, 0xe1, 0x13, 0x04, 0xab, 0xb2, 0x61, 0xb0, 0x2f, 0x1b, 0x37, 0x04, 0x95, - 0x6f, 0x40, 0xa4, 0x72, 0x65, 0xe3, 0xc6, 0x30, 0x55, 0x36, 0x1e, 0xf0, 0x15, 0x0a, 0xb5, 0x2c, - 0x9b, 0x29, 0x24, 0x8c, 0xee, 0x21, 0x6f, 0x02, 0xd2, 0x93, 0x8d, 0x87, 0x0c, 0xc8, 0xc6, 0xc3, - 0xbe, 0x0a, 0x58, 0x45, 0x36, 0x33, 0xd0, 0xaa, 0xe5, 0x0a, 0xa0, 0x15, 0xd9, 0x78, 0x68, 0x55, - 0x36, 0x1e, 0xf8, 0x33, 0x00, 0xf6, 0x65, 0x33, 0x8d, 0x55, 0x0d, 0x7f, 0x16, 0xb0, 0xbe, 0x6c, - 0x82, 0xb3, 0x93, 0xb2, 0xf1, 0xa0, 0xaf, 0x01, 0xd4, 0x93, 0x4d, 0xd0, 0x2a, 0xcb, 0xc6, 0x83, - 0xbe, 0x0e, 0x50, 0x5f, 0x36, 0x41, 0x2c, 0xcb, 0xc6, 0xc3, 0xbe, 0x41, 0xf9, 0xcd, 0x95, 0x8d, - 0x87, 0x55, 0x64, 0xe3, 0x41, 0x7f, 0x13, 0x73, 0xa1, 0x27, 0x1b, 0x0f, 0xaa, 0xca, 0xc6, 0xc3, - 0xfe, 0x16, 0x62, 0x7d, 0xd9, 0x4c, 0x83, 0xd5, 0x55, 0xf8, 0x6d, 0x04, 0xfb, 0xb2, 0xf1, 0xc0, - 0x4b, 0xe4, 0x04, 0xca, 0xe6, 0xc8, 0xee, 0xb4, 0x4f, 0x7b, 0x28, 0xb1, 0x5b, 0xa8, 0x9b, 0x46, - 0x6a, 0x32, 0x3a, 0xb5, 0xd1, 0x13, 0xe8, 0x7c, 0xe8, 0xf6, 0x01, 0x7e, 0xc1, 0x95, 0x8f, 0x4f, - 0xb8, 0x8d, 0xfa, 0x69, 0x24, 0x40, 0xba, 0x25, 0xa9, 0xa1, 0x69, 0x3c, 0xf8, 0xe2, 0xe3, 0xef, - 0xa0, 0x8a, 0x1a, 0x09, 0x50, 0x6f, 0x49, 0x2a, 0xc9, 0xc7, 0xd7, 0xc4, 0x05, 0x5f, 0x4a, 0x3e, - 0xe3, 0x4d, 0xd4, 0x52, 0x23, 0x59, 0x33, 0x97, 0xad, 0x05, 0x57, 0x50, 0xb3, 0x48, 0x81, 0x61, - 0xde, 0x42, 0x49, 0x35, 0x92, 0xab, 0x75, 0x8f, 0xa4, 0x8e, 0x64, 0xa2, 0x0c, 0x59, 0x58, 0x3e, - 0xe7, 0x6d, 0x54, 0x56, 0x23, 0x05, 0x03, 0x2d, 0x83, 0x18, 0x65, 0xf7, 0x0c, 0x4e, 0x60, 0x9c, - 0x25, 0x54, 0x58, 0x23, 0x05, 0xe3, 0xb8, 0x9c, 0xe0, 0x38, 0x0b, 0xae, 0xd0, 0x7c, 0xca, 0xe7, - 0x50, 0x69, 0x8d, 0x4c, 0xad, 0x5a, 0xaf, 0xae, 0xdc, 0x83, 0x55, 0xa0, 0x7e, 0x9f, 0x53, 0xc7, - 0x71, 0x58, 0x72, 0x3e, 0x69, 0x19, 0x35, 0xd7, 0xc8, 0x98, 0x6b, 0xd5, 0xbb, 0xe6, 0x5d, 0x18, - 0x49, 0x02, 0x7c, 0xd6, 0x17, 0x90, 0xc5, 0xe2, 0xf3, 0x59, 0x55, 0x54, 0x5f, 0x43, 0x3f, 0xb1, - 0x7b, 0x3d, 0xe7, 0xad, 0x9b, 0x95, 0x0f, 0x9d, 0x51, 0xef, 0xe8, 0xd5, 0x8a, 0x00, 0xbe, 0x84, - 0xaa, 0xa3, 0x2e, 0xb8, 0x82, 0xf4, 0xe9, 0xbf, 0x8c, 0xe7, 0xb0, 0x62, 0x23, 0xbb, 0xde, 0x3d, - 0x1e, 0x38, 0x63, 0x1b, 0x7c, 0x25, 0x44, 0x68, 0x4d, 0xf6, 0xc3, 0xeb, 0xf8, 0x2b, 0x48, 0x5b, - 0x68, 0x24, 0xdf, 0x06, 0x51, 0xe8, 0xac, 0xd0, 0x19, 0x9c, 0xc0, 0x3a, 0xfe, 0x2a, 0x72, 0x0c, - 0xe0, 0x80, 0x30, 0x74, 0x16, 0xaa, 0xcf, 0x59, 0x13, 0x97, 0x42, 0x79, 0xb1, 0x35, 0x6c, 0x3f, - 0x7e, 0x02, 0x3c, 0x13, 0xd3, 0xe3, 0x7a, 0x42, 0xd7, 0xac, 0x0b, 0x81, 0x14, 0xb9, 0x47, 0xdd, - 0xc6, 0x3d, 0x71, 0x39, 0x9c, 0x28, 0x5d, 0x66, 0x0d, 0xf3, 0x25, 0x31, 0x2f, 0x06, 0x73, 0x66, - 0x88, 0xaa, 0x04, 0x60, 0x97, 0x5a, 0xc7, 0x04, 0xea, 0x53, 0xfd, 0x48, 0xcc, 0xd4, 0xff, 0x27, - 0xae, 0x4c, 0xa7, 0x52, 0x97, 0xbc, 0x82, 0x19, 0x95, 0xc8, 0x97, 0xc2, 0x59, 0x75, 0x8a, 0x3e, - 0x63, 0xec, 0x55, 0x4c, 0xb1, 0x2a, 0x7d, 0x6a, 0xf4, 0x77, 0x44, 0x79, 0x2a, 0xd9, 0xba, 0xec, - 0x35, 0xcc, 0xb9, 0xc4, 0x7e, 0x39, 0x94, 0x77, 0xc3, 0xe4, 0x19, 0x43, 0xdf, 0xc5, 0x24, 0xac, - 0x90, 0xa7, 0x46, 0xa6, 0x25, 0x0b, 0xa6, 0x63, 0x97, 0x7b, 0x0f, 0xb3, 0x32, 0x2f, 0x59, 0x20, - 0x33, 0xab, 0xe3, 0x86, 0xf2, 0xb3, 0xcb, 0x6d, 0x60, 0x9a, 0xe6, 0x71, 0x83, 0xa9, 0x9a, 0xc9, - 0x9f, 0x47, 0xf2, 0xfe, 0xec, 0x19, 0xff, 0x38, 0x89, 0x09, 0x96, 0xd9, 0xfb, 0xb3, 0xa6, 0xec, - 0xb1, 0x67, 0x4c, 0xf9, 0x27, 0xc8, 0x36, 0x14, 0xf6, 0xd4, 0x9c, 0x1f, 0x0a, 0xaf, 0xe2, 0x38, - 0x1e, 0x39, 0xa7, 0xc3, 0xf2, 0x26, 0x1c, 0xed, 0x84, 0x79, 0x63, 0xaa, 0xfa, 0x71, 0x0f, 0x79, - 0x5b, 0x88, 0xb2, 0x82, 0x24, 0x69, 0x45, 0xda, 0x95, 0x56, 0xf6, 0x60, 0xdc, 0xd9, 0x56, 0x24, - 0xca, 0xb3, 0xa2, 0x90, 0xd0, 0x8a, 0x1b, 0xf4, 0xa5, 0x95, 0xf7, 0x61, 0x53, 0xcd, 0xb2, 0xe2, - 0xa6, 0x00, 0xb6, 0x12, 0x20, 0x2d, 0xae, 0xf8, 0xf5, 0x16, 0xf5, 0x1b, 0x9f, 0x0d, 0x17, 0x60, - 0x5b, 0x74, 0x7e, 0x0e, 0x56, 0x5a, 0x92, 0xa6, 0x38, 0x37, 0x4d, 0xfb, 0xff, 0x11, 0xb4, 0x80, - 0x37, 0xd3, 0xb4, 0x9f, 0x9a, 0x41, 0xab, 0xfc, 0x9a, 0x06, 0xc5, 0x26, 0xd4, 0x93, 0x46, 0x4e, - 0xa4, 0xde, 0x6b, 0x6e, 0x3f, 0xd4, 0x5f, 0xc2, 0x5f, 0xeb, 0xcd, 0xe6, 0x23, 0x5d, 0x33, 0xf2, - 0x22, 0xbd, 0xfe, 0x95, 0x83, 0x8d, 0x7d, 0x3d, 0x61, 0x94, 0x44, 0x61, 0x73, 0x7b, 0x77, 0x6b, - 0xc3, 0xda, 0xb3, 0xb6, 0x77, 0x0f, 0xf4, 0x24, 0xf6, 0x6d, 0x3e, 0x6a, 0xde, 0x3f, 0xd0, 0x53, - 0x46, 0x56, 0x24, 0xb1, 0x2d, 0x6d, 0x08, 0x91, 0xd9, 0x3f, 0x80, 0xfe, 0x2d, 0x3d, 0x83, 0x56, - 0x0e, 0xb6, 0x77, 0x36, 0xf4, 0x2c, 0x22, 0x0f, 0xde, 0xdd, 0x7b, 0xb4, 0xa1, 0xe7, 0xf0, 0xe7, - 0x7d, 0xcb, 0xba, 0xff, 0x15, 0x3d, 0x8f, 0xa4, 0x9d, 0xfb, 0x7b, 0xba, 0xa0, 0xee, 0xfb, 0xeb, - 0xd0, 0x5d, 0x30, 0x8a, 0x22, 0xb7, 0xf9, 0xee, 0xee, 0x83, 0x83, 0xed, 0xe6, 0xae, 0x5e, 0xac, - 0xfc, 0x7a, 0x42, 0x88, 0x2d, 0x67, 0xff, 0x49, 0x77, 0x48, 0x55, 0xf1, 0x75, 0x21, 0xc6, 0xf0, - 0xbb, 0x45, 0xd2, 0xe3, 0xca, 0x2e, 0x8f, 0x2d, 0x14, 0x74, 0x8c, 0x57, 0x45, 0x91, 0xba, 0x3b, - 0x32, 0x14, 0x50, 0x41, 0x97, 0xb5, 0x0a, 0xd8, 0xc6, 0xd1, 0x21, 0x08, 0x59, 0xad, 0x53, 0x1d, - 0x97, 0x51, 0x20, 0xab, 0x75, 0xa8, 0xef, 0xe9, 0xb1, 0x35, 0xa6, 0xb0, 0x4e, 0xb5, 0x5b, 0xde, - 0xa2, 0x71, 0x65, 0xa0, 0x07, 0x91, 0xd3, 0x98, 0x52, 0x16, 0xa5, 0x69, 0x89, 0xba, 0xee, 0x2e, - 0xe1, 0x0f, 0x29, 0x0b, 0x9f, 0xb0, 0xd8, 0x14, 0x79, 0xaf, 0x1d, 0xc7, 0xa2, 0x56, 0x9e, 0x91, - 0x4e, 0x33, 0x12, 0xd4, 0xe4, 0x4d, 0x49, 0x02, 0xd8, 0x9b, 0x05, 0xf2, 0x46, 0x92, 0xa4, 0x3b, - 0x95, 0xeb, 0x62, 0x6e, 0xd7, 0x19, 0xc8, 0x2d, 0x44, 0xab, 0x54, 0x14, 0x5a, 0xbb, 0xac, 0x51, - 0x09, 0xa3, 0xb5, 0x2b, 0x37, 0x84, 0x50, 0xfa, 0x74, 0xa1, 0x1d, 0xca, 0x3e, 0xda, 0x88, 0xda, - 0x61, 0xe5, 0x4d, 0x91, 0xd9, 0x69, 0x3f, 0x3b, 0x68, 0x1f, 0xc3, 0x58, 0xa2, 0xd7, 0x1e, 0x4f, - 0x60, 0x6d, 0x50, 0x2a, 0xff, 0x0b, 0xff, 0x34, 0x3a, 0x71, 0xe5, 0xb1, 0x55, 0x4a, 0xe5, 0xa9, - 0x10, 0xcd, 0xde, 0xd1, 0x8e, 0x3d, 0x1e, 0xb7, 0x8f, 0x6d, 0x38, 0x2f, 0x64, 0x06, 0x60, 0xd4, - 0xc6, 0x6b, 0x0a, 0x2c, 0xe6, 0xaf, 0xfa, 0xab, 0xe0, 0xa3, 0x96, 0x76, 0x09, 0x62, 0x31, 0x14, - 0x3c, 0x48, 0x0e, 0x4e, 0xfb, 0x74, 0x59, 0x91, 0xb6, 0xf0, 0xe7, 0xe2, 0x35, 0x91, 0x91, 0x18, - 0xbc, 0x14, 0x19, 0xb4, 0xfb, 0x76, 0x59, 0x8e, 0x4b, 0xbf, 0x2b, 0xbf, 0xa4, 0x09, 0xb1, 0x6b, - 0x7f, 0x78, 0x8e, 0x31, 0x7d, 0x54, 0xcc, 0x98, 0x49, 0x39, 0xe6, 0x3b, 0x71, 0x63, 0xa2, 0xce, - 0x3a, 0x8e, 0x73, 0xd4, 0x92, 0xaf, 0x58, 0xde, 0xab, 0xe4, 0xb1, 0x85, 0xde, 0x5a, 0xe5, 0x7d, - 0x51, 0xdc, 0x1e, 0x0c, 0xec, 0x91, 0xeb, 0x13, 0x98, 0x38, 0x71, 0xc6, 0x13, 0xbe, 0xe0, 0xa1, - 0xdf, 0x46, 0x59, 0xa4, 0x86, 0xce, 0x68, 0x22, 0xe7, 0xd9, 0x48, 0xc1, 0x99, 0x66, 0xd9, 0xa2, - 0x16, 0xe3, 0x9a, 0xc8, 0x3f, 0x76, 0x80, 0xfe, 0x18, 0x27, 0x91, 0xa4, 0xda, 0xc2, 0x6f, 0xa8, - 0xfc, 0x82, 0x26, 0x8a, 0xcd, 0xc9, 0x89, 0x6f, 0x1c, 0x7c, 0x7f, 0x62, 0x3f, 0x27, 0xf7, 0xc0, - 0x77, 0xf8, 0x89, 0x57, 0x3b, 0x3f, 0xdd, 0xee, 0x9d, 0xca, 0x0b, 0x9f, 0xa2, 0x25, 0x1f, 0x8c, - 0x4b, 0x22, 0xf3, 0xa1, 0xdd, 0x3d, 0x3e, 0x99, 0x90, 0xcd, 0x84, 0xc5, 0x4f, 0x50, 0x26, 0xa4, - 0xbb, 0xe8, 0x6c, 0x39, 0x45, 0xeb, 0x75, 0xc9, 0x5f, 0x2f, 0x75, 0x0e, 0x96, 0x04, 0xdd, 0xc9, - 0xe5, 0x8e, 0xf4, 0x9f, 0x83, 0x7f, 0x89, 0xca, 0xff, 0x24, 0x45, 0x7e, 0xe7, 0xb9, 0xeb, 0x05, - 0x8c, 0xf9, 0xd8, 0x39, 0x1d, 0xc8, 0x39, 0xa6, 0x2d, 0xf9, 0xe0, 0xad, 0x5d, 0x42, 0x59, 0x3b, - 0x40, 0x3e, 0x3d, 0x75, 0x26, 0x36, 0xb9, 0x91, 0xb7, 0xe4, 0x03, 0xce, 0x62, 0x68, 0x4f, 0xc0, - 0x07, 0xac, 0xfc, 0xf0, 0xa7, 0xef, 0x57, 0xfa, 0x1c, 0x7e, 0xc1, 0xf9, 0x37, 0xe3, 0xe0, 0xaa, - 0x8c, 0xcb, 0x19, 0xba, 0x74, 0x52, 0xe0, 0xea, 0x6a, 0x59, 0x8c, 0x02, 0x99, 0xe4, 0x21, 0x9e, - 0xb7, 0xe4, 0x08, 0xc5, 0x30, 0x25, 0x30, 0x42, 0x0e, 0x80, 0xd4, 0x60, 0xac, 0x88, 0xdc, 0x61, - 0xf7, 0x89, 0x3d, 0x3e, 0x81, 0x17, 0x93, 0x05, 0xaf, 0xe6, 0xcd, 0x2b, 0x3e, 0xc7, 0x5b, 0x8b, - 0xa5, 0x07, 0x4e, 0xcf, 0x19, 0x59, 0x1e, 0x14, 0xf2, 0x6d, 0x7e, 0xec, 0xf4, 0x6d, 0x29, 0x96, - 0x1c, 0xa5, 0x89, 0xeb, 0xb3, 0x78, 0xfb, 0x00, 0x72, 0xc3, 0x81, 0x8b, 0x37, 0xae, 0x4a, 0x47, - 0x0f, 0xf1, 0x30, 0x58, 0x16, 0x54, 0xec, 0xa2, 0x43, 0x74, 0x38, 0x34, 0x16, 0xd1, 0xa1, 0xe3, - 0x0e, 0xe6, 0x78, 0x88, 0x76, 0x58, 0x29, 0x79, 0xcf, 0x8b, 0x6f, 0x41, 0x1c, 0x71, 0x0d, 0xfa, - 0x71, 0x44, 0xee, 0xdd, 0x3c, 0x6d, 0x2e, 0x19, 0x47, 0xe4, 0xc6, 0x7d, 0x4d, 0xa4, 0xc9, 0x6d, - 0x8c, 0xb9, 0xd6, 0x06, 0x86, 0x78, 0x88, 0xb9, 0x5b, 0xd6, 0xc6, 0xc6, 0x2e, 0xc4, 0x78, 0x8c, - 0xf6, 0x8f, 0xde, 0xdd, 0xd0, 0x13, 0xca, 0xeb, 0xff, 0x0d, 0x4d, 0x24, 0x37, 0x9e, 0xd1, 0x2b, - 0xc6, 0x69, 0xb8, 0xdb, 0x03, 0x7f, 0x9b, 0xab, 0x22, 0xd5, 0x77, 0x46, 0xb6, 0x71, 0x61, 0xc6, - 0x2c, 0xcb, 0xc7, 0xf4, 0x3a, 0x95, 0x7b, 0x51, 0xb0, 0x62, 0x11, 0xde, 0x7c, 0x43, 0xa4, 0x26, - 0x36, 0xd8, 0x9c, 0xc9, 0x3b, 0x91, 0x03, 0x20, 0xc0, 0x84, 0x98, 0x04, 0x9b, 0xf4, 0x10, 0x5e, - 0xc9, 0x4c, 0x68, 0x97, 0xa6, 0xc7, 0x90, 0xca, 0x7b, 0x42, 0x7f, 0xe0, 0xf4, 0x87, 0x3d, 0xfb, - 0x19, 0x8c, 0x64, 0x0f, 0xc6, 0x90, 0xff, 0x50, 0x84, 0x9d, 0xee, 0x88, 0xb6, 0x24, 0xdd, 0x7e, - 0xd2, 0x03, 0x6e, 0x91, 0xb1, 0x0d, 0x5b, 0xed, 0x88, 0xa3, 0x0f, 0x3f, 0x21, 0x7a, 0x72, 0xd2, - 0x1d, 0xe1, 0x6e, 0xc4, 0xa0, 0x29, 0x1f, 0x2a, 0x5b, 0xa2, 0xc4, 0xa7, 0xe6, 0x31, 0x0f, 0x5c, - 0xb9, 0x23, 0x8a, 0x6e, 0x13, 0x5d, 0x05, 0xc3, 0xc2, 0xbd, 0xbf, 0x61, 0x35, 0x61, 0x35, 0x61, - 0x59, 0x9b, 0xbb, 0x1b, 0xb0, 0x96, 0xf0, 0xe3, 0xe0, 0xcb, 0xcd, 0xc0, 0x52, 0x5e, 0x13, 0x45, - 0xcf, 0xf7, 0x7d, 0x7b, 0x42, 0x3d, 0x18, 0x5d, 0xb3, 0x8d, 0x44, 0x4e, 0xab, 0x64, 0x45, 0x7a, - 0xa3, 0x3f, 0x9c, 0x3c, 0xaf, 0xfc, 0xac, 0x28, 0x30, 0xe8, 0x51, 0x17, 0x9c, 0x5d, 0x13, 0xd9, - 0x3e, 0xcf, 0x57, 0xa3, 0x03, 0x8c, 0xaa, 0x29, 0x1f, 0xe7, 0xfe, 0xb6, 0x5c, 0xf4, 0x62, 0x4d, - 0x64, 0x95, 0xc0, 0xc4, 0xfb, 0x33, 0xa1, 0xee, 0x4f, 0xb9, 0x93, 0x93, 0xca, 0x4e, 0xae, 0xec, - 0x88, 0xac, 0x4c, 0x27, 0x63, 0x4a, 0x91, 0xb2, 0xf8, 0x91, 0x62, 0x92, 0x6f, 0xbe, 0x20, 0xdb, - 0xe4, 0x7d, 0x2c, 0xc8, 0x8d, 0x04, 0xcb, 0x08, 0x19, 0x87, 0x04, 0x35, 0x49, 0xb9, 0xfd, 0x4e, - 0x5a, 0xe4, 0xdc, 0x95, 0x02, 0x89, 0x67, 0x64, 0xc5, 0x41, 0xa6, 0xdc, 0x8a, 0x38, 0x4d, 0x35, - 0x06, 0x74, 0x66, 0xb9, 0xaa, 0xe0, 0x50, 0x89, 0xe5, 0x6f, 0x46, 0x56, 0x11, 0x5e, 0x27, 0x24, - 0xea, 0xa4, 0x57, 0xeb, 0x66, 0x64, 0x9d, 0x60, 0xdc, 0x14, 0x79, 0xaf, 0x32, 0xa0, 0xe0, 0xc6, - 0x85, 0x6d, 0xce, 0x2d, 0x05, 0x14, 0x04, 0x18, 0x48, 0xfb, 0x55, 0x6c, 0xae, 0xe3, 0xe7, 0xfa, - 0x9c, 0x7b, 0xbe, 0xa7, 0x0b, 0x69, 0xb7, 0x64, 0xcd, 0xf2, 0x89, 0xde, 0x07, 0x80, 0x85, 0xac, - 0x52, 0x9f, 0x66, 0xf9, 0xd4, 0x0e, 0x80, 0x2c, 0x9f, 0xd3, 0x69, 0xeb, 0xfb, 0xc5, 0x68, 0x46, - 0x9e, 0xcd, 0x61, 0x39, 0x73, 0xee, 0x69, 0x9c, 0xf6, 0xa5, 0x5f, 0x79, 0x66, 0xf9, 0x04, 0x6e, - 0xbc, 0x89, 0x10, 0xb9, 0xfc, 0x10, 0x02, 0x66, 0x97, 0x99, 0x59, 0x2e, 0x33, 0x61, 0x52, 0x59, - 0xae, 0x2e, 0x29, 0x24, 0x28, 0x25, 0x65, 0x46, 0x96, 0x94, 0xc6, 0x0d, 0x32, 0x27, 0x27, 0x55, - 0xf4, 0xcb, 0xc7, 0x2c, 0x1f, 0xd9, 0xfd, 0x7e, 0x3a, 0xff, 0x78, 0xa5, 0x62, 0x96, 0x0f, 0xe5, - 0xc6, 0x2a, 0xbe, 0x2f, 0xd4, 0x37, 0x9c, 0x7d, 0x30, 0x08, 0x96, 0x7d, 0xe1, 0xb9, 0xef, 0x54, - 0xc6, 0xc0, 0x86, 0x8c, 0x20, 0xf0, 0x2a, 0x69, 0x37, 0x2c, 0x22, 0x6f, 0xaf, 0x3b, 0xe8, 0xc0, - 0xa1, 0x08, 0x57, 0x22, 0x09, 0x3f, 0xa1, 0x0f, 0x5b, 0xa4, 0x06, 0x76, 0xb1, 0x4f, 0xa7, 0xbe, - 0xd4, 0xdb, 0xb2, 0x13, 0x9b, 0x20, 0x57, 0xa6, 0xa1, 0xb3, 0x3d, 0x80, 0xd3, 0x0d, 0xf1, 0x06, - 0xed, 0x81, 0x95, 0xea, 0x40, 0x83, 0xf1, 0x86, 0x48, 0x8e, 0x4f, 0x0f, 0xcb, 0x46, 0xf8, 0x5b, - 0xc1, 0xfe, 0xe9, 0xa1, 0xeb, 0x8a, 0x85, 0x08, 0xb0, 0x9f, 0x03, 0x81, 0xb6, 0x7e, 0xc6, 0x1e, - 0x39, 0xe5, 0x0b, 0xb4, 0x84, 0x2f, 0x59, 0x59, 0x68, 0x79, 0x1f, 0x1a, 0xce, 0x19, 0xfc, 0xe0, - 0xa4, 0x54, 0x50, 0xec, 0xc2, 0x71, 0x57, 0x1b, 0xc8, 0xb4, 0xdb, 0xd0, 0xd6, 0x2c, 0x6d, 0x50, - 0x39, 0x10, 0x45, 0xf7, 0x54, 0x4e, 0xf3, 0x35, 0x71, 0x27, 0x81, 0x59, 0xda, 0x9f, 0xf3, 0xe6, - 0x35, 0xdf, 0x3d, 0x15, 0xc6, 0xe9, 0x42, 0x42, 0x2b, 0x7a, 0xc8, 0x15, 0xad, 0xf2, 0x43, 0x48, - 0xf8, 0x3b, 0x10, 0x1d, 0xbd, 0x1b, 0x48, 0xd8, 0xa0, 0x87, 0xb0, 0x33, 0xc6, 0x64, 0x36, 0x67, - 0xc9, 0x07, 0xe3, 0x35, 0x51, 0xa4, 0x1f, 0x6e, 0x35, 0x95, 0xf0, 0x8a, 0xf5, 0x02, 0xb5, 0x73, - 0x09, 0x05, 0x3b, 0x1e, 0x5e, 0xe2, 0x98, 0x23, 0x19, 0xfd, 0x36, 0x3e, 0x23, 0x0a, 0xf8, 0xd7, - 0x65, 0xa6, 0xbc, 0xd3, 0x9f, 0xc0, 0x66, 0x26, 0xbe, 0x21, 0xe6, 0xe8, 0xed, 0x7b, 0xb0, 0xac, - 0x57, 0x98, 0x17, 0x65, 0x07, 0x03, 0xcb, 0x22, 0x2b, 0x43, 0xc1, 0x98, 0xbe, 0xff, 0xe4, 0x2d, - 0xf7, 0x11, 0xc3, 0x2b, 0x1d, 0xab, 0x65, 0x8e, 0xce, 0x5a, 0xfc, 0x54, 0xb9, 0x2f, 0x72, 0x94, - 0xa5, 0xe0, 0x4c, 0x68, 0x54, 0x84, 0x76, 0x5c, 0xb6, 0x29, 0x47, 0x5e, 0x54, 0xce, 0xcc, 0xdc, - 0xbd, 0xb4, 0x65, 0x69, 0xc7, 0x8b, 0x0b, 0x42, 0xdb, 0xc2, 0x43, 0xec, 0x33, 0x0e, 0xd3, 0xda, - 0xb3, 0x4a, 0x93, 0x4d, 0xc0, 0x11, 0x2f, 0xce, 0x04, 0x74, 0x4b, 0x13, 0xaf, 0x4c, 0x99, 0xc0, - 0xa7, 0xe7, 0xfc, 0x31, 0x4c, 0x7b, 0x8e, 0x87, 0x66, 0xda, 0x9e, 0xe0, 0xf8, 0x9e, 0x03, 0xf3, - 0xc3, 0xee, 0x0e, 0x1d, 0x6e, 0xe0, 0x50, 0xdc, 0xa9, 0x7c, 0x9a, 0x12, 0xf3, 0x1c, 0x44, 0xbf, - 0xdc, 0x9d, 0x9c, 0xec, 0xb4, 0x87, 0xc6, 0x23, 0x51, 0xc4, 0xf8, 0xd9, 0xea, 0xb7, 0x87, 0x43, - 0xdc, 0xa8, 0x1a, 0x1d, 0x2a, 0x6e, 0x4f, 0x05, 0x65, 0xc6, 0x2f, 0xed, 0x02, 0x78, 0x47, 0x62, - 0x37, 0x06, 0x93, 0xd1, 0x73, 0xab, 0x30, 0xf0, 0x5b, 0x8c, 0x6d, 0x51, 0xe8, 0x8f, 0x8f, 0x3d, - 0x63, 0x09, 0x32, 0x76, 0x2b, 0xd2, 0xd8, 0xce, 0xf8, 0x38, 0x60, 0x4b, 0xf4, 0xbd, 0x06, 0x74, - 0x0c, 0x23, 0xaf, 0x67, 0x2b, 0x79, 0x86, 0x63, 0x18, 0x24, 0x82, 0x8e, 0x1d, 0xfa, 0x2d, 0x50, - 0xf7, 0x0a, 0xdc, 0x48, 0x13, 0x07, 0x2b, 0x0e, 0xd2, 0x4a, 0xc1, 0x7c, 0x3d, 0xd2, 0x16, 0xc4, - 0xa4, 0x03, 0x07, 0xfe, 0x23, 0x0d, 0xe1, 0x16, 0xa4, 0xc7, 0xc5, 0x2f, 0x08, 0x3d, 0x3c, 0x7f, - 0xf5, 0x20, 0x9b, 0x9e, 0x71, 0x90, 0xcd, 0xf3, 0x41, 0xb6, 0x91, 0xb8, 0xab, 0x2d, 0xbe, 0x27, - 0x4a, 0xa1, 0x29, 0xab, 0x74, 0x43, 0xd2, 0xdf, 0x56, 0xe9, 0x05, 0xf3, 0xb2, 0xf2, 0x29, 0x56, - 0x7d, 0xb5, 0xaa, 0x5d, 0xf0, 0x2b, 0x3c, 0x7d, 0xd5, 0x70, 0x2e, 0xe6, 0x80, 0x4d, 0xfc, 0x77, - 0xc4, 0x5c, 0x60, 0xca, 0x2a, 0x39, 0x7f, 0xc6, 0xa4, 0x2a, 0x3f, 0x9f, 0x16, 0xe9, 0xe6, 0xc0, - 0x76, 0x3a, 0xc6, 0xe5, 0x60, 0x46, 0xfc, 0xe2, 0x4b, 0x6e, 0x36, 0xbc, 0x12, 0xca, 0x86, 0xd0, - 0xe3, 0xe6, 0xc2, 0x2b, 0xa1, 0x5c, 0xe8, 0x76, 0x41, 0xc0, 0xbe, 0x3e, 0x95, 0x09, 0xa1, 0xd3, - 0x4f, 0x83, 0xd7, 0xa7, 0xd2, 0xa0, 0xdf, 0x0d, 0xec, 0xab, 0xe1, 0x1c, 0x08, 0xbd, 0x5e, 0xfe, - 0xbb, 0x1a, 0xce, 0x7f, 0x5e, 0x27, 0x30, 0xaf, 0x84, 0x72, 0x1f, 0xb9, 0x24, 0xb3, 0xde, 0xd5, - 0x70, 0xd6, 0x23, 0x1e, 0xe7, 0xbb, 0xab, 0xe1, 0x7c, 0x47, 0x9d, 0x9c, 0xdf, 0xae, 0x84, 0xf2, - 0x1b, 0x19, 0x95, 0x89, 0xed, 0x6a, 0x38, 0xb1, 0x49, 0x9e, 0xe2, 0xa9, 0x9a, 0xd5, 0xbc, 0x4e, - 0xf0, 0xd4, 0x0c, 0xa5, 0xb4, 0xe8, 0x73, 0x3d, 0xbd, 0x0b, 0x0a, 0xef, 0x75, 0x5c, 0x36, 0xf7, - 0xc8, 0x59, 0x8a, 0xf9, 0x5a, 0x4d, 0xab, 0xe9, 0x1e, 0xb9, 0x4c, 0x91, 0xed, 0x70, 0xdd, 0xa8, - 0x53, 0x8c, 0x52, 0x64, 0x49, 0x2f, 0x7f, 0x69, 0xb3, 0x45, 0xb1, 0x8a, 0xe6, 0x25, 0x4f, 0xef, - 0xb7, 0x20, 0x18, 0xb5, 0x1e, 0xb5, 0x47, 0xc7, 0x00, 0x6c, 0x41, 0x25, 0xee, 0xd5, 0xde, 0xf8, - 0xfe, 0x0b, 0x1d, 0xee, 0xc1, 0x12, 0xfd, 0x92, 0x2b, 0xae, 0x23, 0xea, 0xd5, 0x58, 0x5e, 0x8b, - 0x97, 0x71, 0xd1, 0xa4, 0x31, 0x8a, 0x7a, 0x0b, 0x1c, 0xf5, 0xd6, 0xe1, 0x74, 0x79, 0x3a, 0x80, - 0x13, 0xf1, 0x7a, 0x5e, 0x64, 0x27, 0xce, 0xa8, 0xdf, 0x9e, 0x38, 0x95, 0x1f, 0x41, 0x45, 0x0d, - 0x27, 0xe6, 0x3e, 0x74, 0x3c, 0x85, 0xc2, 0x11, 0xd2, 0x5e, 0xbf, 0xfd, 0x04, 0xe2, 0x87, 0xdd, - 0x7a, 0x3c, 0x72, 0xf7, 0x41, 0x1e, 0x9b, 0x76, 0xec, 0x07, 0x20, 0xf1, 0xb2, 0x7b, 0x18, 0x27, - 0xed, 0x90, 0x24, 0xf9, 0x70, 0x7e, 0x91, 0x8f, 0x97, 0x19, 0x7e, 0x87, 0xee, 0x01, 0x53, 0x56, - 0x0c, 0x59, 0x7e, 0x7b, 0xf4, 0x84, 0x92, 0x9f, 0xd8, 0xfd, 0x61, 0xeb, 0x31, 0x49, 0x05, 0xe5, - 0x90, 0xc6, 0xe7, 0x07, 0xb0, 0x8b, 0x93, 0x90, 0x1a, 0x49, 0x24, 0x67, 0xbc, 0x17, 0xc4, 0x41, - 0x1e, 0x4c, 0x42, 0xec, 0x23, 0xd9, 0x14, 0xcc, 0x05, 0xe5, 0x44, 0x20, 0x93, 0x10, 0xc2, 0xa0, - 0xdf, 0x9b, 0xf7, 0x9d, 0x92, 0x48, 0x6e, 0x36, 0x9b, 0x98, 0xe5, 0xe1, 0x4f, 0x55, 0xd7, 0x1a, - 0x9f, 0x13, 0xb9, 0xe3, 0x91, 0x6d, 0x63, 0x78, 0x98, 0x5d, 0x5d, 0x7c, 0x40, 0x59, 0xcd, 0x03, - 0x35, 0xe0, 0x68, 0xfc, 0x58, 0xd6, 0x17, 0x46, 0x44, 0xd5, 0x59, 0xfe, 0x5d, 0x79, 0x17, 0xb1, - 0xe8, 0x77, 0x87, 0x2b, 0x12, 0xcb, 0xb5, 0xd1, 0xd8, 0x83, 0x82, 0xaf, 0x75, 0x96, 0xc1, 0x8f, - 0x64, 0x76, 0x89, 0x33, 0x98, 0x1b, 0x71, 0x53, 0x63, 0x43, 0x2c, 0x0c, 0x1c, 0xf7, 0xfe, 0xbf, - 0x75, 0x24, 0xf7, 0xd8, 0x95, 0xe9, 0x43, 0x9b, 0x6b, 0xdc, 0x96, 0xdf, 0xdc, 0x06, 0x0e, 0x77, - 0xc8, 0x5d, 0xd9, 0x78, 0x20, 0x74, 0xc5, 0x0c, 0x15, 0x99, 0x71, 0x56, 0x3a, 0xf2, 0x23, 0x9f, - 0x67, 0x85, 0xf6, 0x7d, 0xc8, 0x88, 0xdc, 0x99, 0x31, 0x46, 0x8e, 0xe5, 0x17, 0x53, 0xcf, 0x08, - 0x85, 0xba, 0x69, 0x23, 0x18, 0x6b, 0xa2, 0x8d, 0x9c, 0xc8, 0x8f, 0xa9, 0xaa, 0x91, 0xd5, 0x7a, - 0x68, 0x55, 0x4e, 0xcf, 0x74, 0xa5, 0x2b, 0xbf, 0x85, 0x7a, 0x56, 0x64, 0x00, 0x9c, 0x61, 0x26, - 0xde, 0x99, 0x0f, 0xe4, 0x67, 0xd2, 0x80, 0x99, 0x29, 0x6f, 0xc6, 0x67, 0x7a, 0xf3, 0x44, 0x7e, - 0x93, 0xf4, 0xcc, 0xec, 0xcf, 0xf2, 0x66, 0x7c, 0xa6, 0x37, 0x3d, 0xf9, 0xb5, 0x32, 0x60, 0x06, - 0xbc, 0xd9, 0x12, 0x86, 0xfa, 0xaa, 0x39, 0x4f, 0xc4, 0xd8, 0xe9, 0xcb, 0x6f, 0xd0, 0xfe, 0xcb, - 0x96, 0x94, 0x59, 0x86, 0xe2, 0x1d, 0x1a, 0xc8, 0xcf, 0xd3, 0x41, 0x43, 0xe0, 0xd1, 0xb6, 0xb8, - 0xa0, 0x4e, 0xec, 0x1c, 0x2e, 0x39, 0x60, 0xa9, 0x64, 0x2d, 0xf8, 0x53, 0x63, 0xce, 0x4c, 0x53, - 0xf1, 0x4e, 0x0d, 0xc1, 0x94, 0x3e, 0x65, 0x0a, 0xbc, 0xba, 0x2f, 0x4a, 0x8a, 0xa9, 0x43, 0xca, - 0xd0, 0xd1, 0x66, 0x9e, 0xca, 0xff, 0x4f, 0xc0, 0x33, 0x83, 0x19, 0x3d, 0xfc, 0xc6, 0x38, 0xc7, - 0x45, 0x1b, 0x19, 0xc9, 0x8f, 0xdc, 0xbe, 0x2f, 0xc4, 0x08, 0x6d, 0x09, 0xaa, 0xb4, 0xe3, 0xac, - 0x8c, 0xe5, 0xe7, 0x6f, 0xdf, 0x15, 0x24, 0x34, 0xba, 0x81, 0xe9, 0xd8, 0x98, 0xe4, 0x62, 0x6c, - 0x4c, 0x28, 0x22, 0xbf, 0x1e, 0x09, 0x58, 0x52, 0xaf, 0x42, 0x94, 0x69, 0xe3, 0x23, 0xbc, 0x84, - 0xf9, 0xf3, 0x07, 0xa4, 0x8f, 0x34, 0x59, 0x17, 0xd7, 0x96, 0xb0, 0x74, 0xb6, 0xe6, 0x8e, 0x02, - 0x71, 0x69, 0x43, 0xcc, 0x9d, 0x3b, 0x28, 0x7d, 0xac, 0xc9, 0xea, 0x12, 0x2d, 0x59, 0xc5, 0xa3, - 0x60, 0x64, 0x9a, 0x3b, 0x77, 0x58, 0xfa, 0x44, 0x93, 0x57, 0x11, 0x75, 0xd3, 0x33, 0xe2, 0x46, - 0xa6, 0xb9, 0x73, 0x87, 0xa5, 0xaf, 0xca, 0xda, 0x31, 0x51, 0xaf, 0xa9, 0x46, 0x28, 0x16, 0xcc, - 0x9f, 0x3f, 0x2c, 0x7d, 0x4d, 0xa3, 0x6b, 0x89, 0x44, 0xbd, 0xee, 0xad, 0x8b, 0x17, 0x99, 0xe6, - 0xcf, 0x1f, 0x96, 0xbe, 0xae, 0xd1, 0xe5, 0x45, 0xa2, 0xbe, 0x12, 0x30, 0x13, 0xf4, 0xe6, 0xec, - 0xb0, 0xf4, 0x0d, 0x8d, 0xee, 0x13, 0x12, 0xf5, 0x55, 0xcf, 0xcc, 0xfe, 0x94, 0x37, 0x67, 0x87, - 0xa5, 0x6f, 0xd2, 0x29, 0x1e, 0xcc, 0xac, 0x05, 0xcc, 0x50, 0x64, 0x2a, 0xbd, 0x40, 0x58, 0xfa, - 0x96, 0x46, 0xd7, 0x3e, 0x89, 0xfa, 0x5d, 0xcb, 0x1d, 0xdd, 0x8f, 0x4c, 0xa5, 0x17, 0x08, 0x4b, - 0x9f, 0x6a, 0x74, 0x3b, 0x94, 0xa8, 0xdf, 0x0b, 0x1a, 0xa2, 0xc8, 0xa4, 0xbf, 0x48, 0x58, 0xfa, - 0x36, 0x5a, 0x2a, 0x35, 0x12, 0x2b, 0xcb, 0x96, 0xeb, 0x80, 0x12, 0x99, 0xf4, 0x17, 0x09, 0x4b, - 0xdf, 0x41, 0x53, 0x3a, 0x98, 0xaa, 0x86, 0x4c, 0x81, 0x57, 0x0f, 0x44, 0xf1, 0xbc, 0x61, 0xe9, - 0xbb, 0xea, 0xad, 0x5b, 0xe1, 0x48, 0x89, 0x4d, 0x7b, 0xca, 0x3b, 0x3b, 0x33, 0x30, 0x7d, 0x8f, - 0x6a, 0x9c, 0xc6, 0xdc, 0x17, 0xe5, 0xcd, 0x94, 0x24, 0xf8, 0xaf, 0x4f, 0x86, 0xa9, 0x1d, 0x7f, - 0x7f, 0x9c, 0x19, 0xa3, 0xbe, 0xaf, 0xd1, 0xf5, 0x55, 0x91, 0x0d, 0x12, 0xde, 0xdb, 0x29, 0x32, - 0x60, 0x7d, 0xe0, 0xcf, 0xf2, 0xac, 0x68, 0xf5, 0x03, 0xed, 0x45, 0xc2, 0x55, 0x03, 0x6f, 0x6b, - 0xbd, 0xc5, 0xa0, 0x96, 0xcf, 0x8b, 0xd4, 0x33, 0x73, 0xb9, 0xaa, 0x1e, 0xc9, 0xd4, 0x5b, 0x5b, - 0x19, 0xa4, 0x0a, 0x66, 0x49, 0xb9, 0xd8, 0xc6, 0x6b, 0x5b, 0x8b, 0x58, 0xcc, 0x36, 0x23, 0xd9, - 0x1f, 0xc7, 0xb0, 0x4d, 0x66, 0xd7, 0x22, 0xd9, 0x9f, 0xc4, 0xb0, 0x6b, 0xcc, 0xae, 0x47, 0xb2, - 0xbf, 0x1a, 0xc3, 0xae, 0x33, 0x7b, 0x25, 0x92, 0xfd, 0xb5, 0x18, 0xf6, 0x0a, 0xb3, 0x57, 0x23, - 0xd9, 0x5f, 0x8f, 0x61, 0xaf, 0x32, 0x7b, 0x2d, 0x92, 0xfd, 0x8d, 0x18, 0xf6, 0x1a, 0xb3, 0xef, - 0x46, 0xb2, 0xbf, 0x19, 0xc3, 0xbe, 0xcb, 0xec, 0x7b, 0x91, 0xec, 0x6f, 0xc5, 0xb0, 0xef, 0x49, - 0x76, 0x75, 0x39, 0x92, 0xfd, 0x69, 0x34, 0xbb, 0xba, 0xcc, 0xec, 0x68, 0xad, 0x7d, 0x3b, 0x86, - 0xcd, 0x5a, 0xab, 0x46, 0x6b, 0xed, 0x3b, 0x31, 0x6c, 0xd6, 0x5a, 0x35, 0x5a, 0x6b, 0xdf, 0x8d, - 0x61, 0xb3, 0xd6, 0xaa, 0xd1, 0x5a, 0xfb, 0x5e, 0x0c, 0x9b, 0xb5, 0x56, 0x8d, 0xd6, 0xda, 0xf7, - 0x63, 0xd8, 0xac, 0xb5, 0x6a, 0xb4, 0xd6, 0x7e, 0x10, 0xc3, 0x66, 0xad, 0x55, 0xa3, 0xb5, 0xf6, - 0x7b, 0x31, 0x6c, 0xd6, 0x5a, 0x35, 0x5a, 0x6b, 0xbf, 0x1f, 0xc3, 0x66, 0xad, 0x55, 0xa3, 0xb5, - 0xf6, 0x07, 0x31, 0x6c, 0xd6, 0x9a, 0x19, 0xad, 0xb5, 0x3f, 0x8c, 0x66, 0x9b, 0xac, 0x35, 0x33, - 0x5a, 0x6b, 0x7f, 0x14, 0xc3, 0x66, 0xad, 0x99, 0xd1, 0x5a, 0xfb, 0xe3, 0x18, 0x36, 0x6b, 0xcd, - 0x8c, 0xd6, 0xda, 0x0f, 0x63, 0xd8, 0xac, 0x35, 0x33, 0x5a, 0x6b, 0x7f, 0x12, 0xc3, 0x66, 0xad, - 0x99, 0xd1, 0x5a, 0xfb, 0xd3, 0x18, 0x36, 0x6b, 0xcd, 0x8c, 0xd6, 0xda, 0x9f, 0xc5, 0xb0, 0x59, - 0x6b, 0x66, 0xb4, 0xd6, 0xfe, 0x3c, 0x86, 0xcd, 0x5a, 0x33, 0xa3, 0xb5, 0xf6, 0x17, 0x31, 0x6c, - 0xd6, 0x9a, 0x19, 0xad, 0xb5, 0xbf, 0x8c, 0x61, 0xb3, 0xd6, 0x6a, 0xd1, 0x5a, 0xfb, 0xab, 0x68, - 0x76, 0x8d, 0xb5, 0x56, 0x8b, 0xd6, 0xda, 0x5f, 0xc7, 0xb0, 0x59, 0x6b, 0xb5, 0x68, 0xad, 0xfd, - 0x4d, 0x0c, 0x9b, 0xb5, 0x56, 0x8b, 0xd6, 0xda, 0xdf, 0xc6, 0xb0, 0x59, 0x6b, 0xb5, 0x68, 0xad, - 0xfd, 0x28, 0x86, 0xcd, 0x5a, 0xab, 0x45, 0x6b, 0xed, 0xef, 0x62, 0xd8, 0xac, 0xb5, 0x5a, 0xb4, - 0xd6, 0xfe, 0x3e, 0x86, 0xcd, 0x5a, 0xab, 0x45, 0x6b, 0xed, 0x1f, 0x62, 0xd8, 0xac, 0xb5, 0x5a, - 0xb4, 0xd6, 0xfe, 0x31, 0x86, 0xcd, 0x5a, 0xab, 0x45, 0x6b, 0xed, 0x9f, 0x62, 0xd8, 0xac, 0xb5, - 0x7a, 0xb4, 0xd6, 0xfe, 0x39, 0x9a, 0x5d, 0x67, 0xad, 0xd5, 0xa3, 0xb5, 0xf6, 0x2f, 0x31, 0x6c, - 0xd6, 0x5a, 0x3d, 0x5a, 0x6b, 0xff, 0x1a, 0xc3, 0x66, 0xad, 0xd5, 0xa3, 0xb5, 0xf6, 0x6f, 0x31, - 0x6c, 0xd6, 0x5a, 0x3d, 0x5a, 0x6b, 0xff, 0x1e, 0xc3, 0x66, 0xad, 0xd5, 0xa3, 0xb5, 0xf6, 0x1f, - 0x31, 0x6c, 0xd6, 0x5a, 0x3d, 0x5a, 0x6b, 0x3f, 0x8e, 0x61, 0xb3, 0xd6, 0xea, 0xd1, 0x5a, 0xfb, - 0x49, 0x0c, 0x9b, 0xb5, 0x56, 0x8f, 0xd6, 0xda, 0x7f, 0xc6, 0xb0, 0x59, 0x6b, 0xf5, 0x68, 0xad, - 0xfd, 0x57, 0x0c, 0x9b, 0xb5, 0xb6, 0x12, 0xad, 0xb5, 0xff, 0x8e, 0x66, 0xaf, 0x2c, 0xff, 0x5f, - 0x00, 0x00, 0x00, 0xff, 0xff, 0x53, 0x6a, 0x15, 0xef, 0x13, 0x38, 0x00, 0x00, + // 4397 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x94, 0x5a, 0x4b, 0x77, 0x1b, 0x47, + 0x76, 0x76, 0xe3, 0x8d, 0x02, 0x48, 0x80, 0x2d, 0x59, 0x82, 0xa8, 0x87, 0x65, 0xcc, 0xd8, 0x96, + 0x64, 0x9b, 0x43, 0x36, 0x40, 0x52, 0x82, 0x27, 0x3e, 0x47, 0x94, 0x48, 0x0e, 0xcf, 0x88, 0x04, + 0xd3, 0xa4, 0xed, 0x33, 0xca, 0x02, 0x07, 0x24, 0x1b, 0x20, 0x2c, 0x00, 0x0d, 0x01, 0x60, 0x24, + 0x26, 0x9b, 0x6c, 0x92, 0x6d, 0x5e, 0x9b, 0x6c, 0xb3, 0xca, 0x2a, 0xc9, 0x39, 0xf9, 0x13, 0x89, + 0xed, 0x79, 0x7a, 0x9e, 0x79, 0x4e, 0xde, 0x8f, 0xc9, 0xfb, 0x35, 0x4e, 0xb2, 0xc9, 0xdc, 0x7b, + 0xeb, 0x76, 0x77, 0x75, 0x03, 0xdd, 0xa4, 0xbc, 0xb0, 0xba, 0xab, 0xbe, 0xef, 0xd6, 0xad, 0xea, + 0xaf, 0xee, 0xad, 0x5b, 0xa0, 0x10, 0x63, 0x6b, 0x34, 0x5e, 0x18, 0x0c, 0xed, 0xb1, 0xad, 0x67, + 0xf0, 0xf9, 0xa8, 0x39, 0x6e, 0x96, 0x6f, 0x8b, 0xd4, 0xa6, 0xbd, 0xde, 0x3f, 0xe9, 0xe9, 0xaf, + 0x88, 0x78, 0xcb, 0xb6, 0x4b, 0xda, 0xcd, 0xd8, 0xad, 0x59, 0x63, 0x66, 0xc1, 0x41, 0x2c, 0x6c, + 0xd4, 0xeb, 0x26, 0xf6, 0x94, 0x57, 0x45, 0x6e, 0xd3, 0xde, 0x87, 0xe6, 0x8d, 0x8e, 0xd5, 0x3d, + 0xd2, 0x2f, 0x8a, 0xe4, 0xa3, 0xe6, 0x81, 0xd5, 0x25, 0x46, 0xd6, 0x4c, 0x76, 0xf1, 0x45, 0xd7, + 0x45, 0x62, 0xff, 0x74, 0x60, 0x95, 0x62, 0xd4, 0x98, 0x18, 0xc3, 0x73, 0xf9, 0x97, 0x6f, 0xe0, + 0x20, 0xc8, 0xd4, 0x6f, 0x8b, 0xc4, 0x97, 0x3b, 0xfd, 0x23, 0x1e, 0xe5, 0x65, 0x6f, 0x14, 0xd9, + 0xbf, 0xf0, 0xe5, 0xad, 0x9d, 0x87, 0x66, 0xe2, 0x09, 0x40, 0xd0, 0xfe, 0x7e, 0xf3, 0xa0, 0x8b, + 0xa6, 0x34, 0xb4, 0x3f, 0xc6, 0x17, 0x6c, 0xdd, 0x6d, 0x0e, 0x9b, 0xbd, 0x52, 0x1c, 0x5a, 0x93, + 0x66, 0x72, 0x80, 0x2f, 0xfa, 0x3b, 0x62, 0xc6, 0xb4, 0x9e, 0x9e, 0x74, 0x86, 0xd6, 0x11, 0x39, + 0x57, 0x4a, 0x80, 0xfd, 0xdc, 0xa4, 0x7d, 0xea, 0x34, 0x67, 0x86, 0x2a, 0x56, 0x92, 0x07, 0x56, + 0x73, 0xec, 0x90, 0x93, 0x37, 0xe3, 0x91, 0x64, 0x05, 0x8b, 0xe4, 0xfa, 0x60, 0xdc, 0xb1, 0xfb, + 0xcd, 0xae, 0x24, 0xa7, 0xc0, 0xaf, 0x70, 0xb2, 0xad, 0x62, 0xf5, 0xd7, 0x45, 0x61, 0xa3, 0xb1, + 0x66, 0xdb, 0xdd, 0x86, 0xe3, 0x51, 0x49, 0x80, 0xe3, 0x19, 0x73, 0xa6, 0x85, 0xad, 0xce, 0x94, + 0xf4, 0x5b, 0xa2, 0xb8, 0xd1, 0xd8, 0xea, 0x8f, 0x2b, 0x86, 0x07, 0xcc, 0x01, 0x30, 0x69, 0xce, + 0xb6, 0xa8, 0x79, 0x02, 0xb9, 0x52, 0xf5, 0x90, 0x79, 0x40, 0xc6, 0x25, 0x72, 0xa5, 0xea, 0x22, + 0xdf, 0x12, 0xfa, 0x46, 0x63, 0xa3, 0xf3, 0xdc, 0x3a, 0x52, 0xad, 0xce, 0x00, 0x36, 0x6d, 0x16, + 0x5b, 0xdc, 0x31, 0x05, 0xad, 0x5a, 0x9e, 0x05, 0x74, 0xca, 0x41, 0x2b, 0xb6, 0xef, 0x88, 0xb9, + 0x8d, 0xc6, 0x7b, 0x1d, 0xbf, 0xc3, 0x05, 0x00, 0xcf, 0x98, 0x85, 0x96, 0x6c, 0x9f, 0xc4, 0xaa, + 0x86, 0x8b, 0x80, 0x4d, 0x30, 0x56, 0xb1, 0x4b, 0xb3, 0xdb, 0xe8, 0xda, 0xcd, 0xb1, 0x07, 0x9d, + 0x03, 0x68, 0x0c, 0x66, 0x47, 0xcd, 0x7e, 0xab, 0x0f, 0xed, 0x13, 0x90, 0x8c, 0x07, 0xd5, 0x01, + 0xaa, 0x81, 0x55, 0xd9, 0xee, 0xc7, 0xee, 0x8d, 0x87, 0x9d, 0x7e, 0xdb, 0xc3, 0x5e, 0x20, 0xfd, + 0x16, 0x5a, 0xb2, 0xdd, 0xef, 0xc1, 0xda, 0x29, 0x7c, 0x5c, 0x0f, 0x6a, 0x01, 0x34, 0x0f, 0x1e, + 0x50, 0x73, 0xc0, 0x6a, 0x60, 0x0d, 0x5a, 0x00, 0x9d, 0x43, 0xab, 0x53, 0xd6, 0x60, 0x2f, 0xb0, + 0x06, 0x6d, 0xc0, 0xea, 0x8c, 0x55, 0xd6, 0x40, 0xd5, 0x8c, 0x14, 0x62, 0xe9, 0x22, 0xe8, 0xd5, + 0xd3, 0x8c, 0x6c, 0xf4, 0x6b, 0x86, 0x81, 0x2f, 0x03, 0x50, 0xd1, 0x4c, 0x00, 0x49, 0x83, 0x33, + 0xf2, 0x12, 0x20, 0x15, 0xcd, 0x30, 0x32, 0xa0, 0x19, 0xc6, 0x5e, 0x06, 0xac, 0x4f, 0x33, 0x13, + 0x68, 0xd5, 0x72, 0x09, 0xd0, 0x3e, 0xcd, 0x30, 0xda, 0xaf, 0x19, 0x06, 0x5f, 0x01, 0xb0, 0xaa, + 0x99, 0x20, 0x56, 0x35, 0x3c, 0x0f, 0x58, 0x55, 0x33, 0xea, 0xec, 0x1c, 0xcd, 0x30, 0xf4, 0x2a, + 0x40, 0x15, 0xcd, 0xa8, 0x56, 0x5d, 0xcd, 0x30, 0xf4, 0x1a, 0x40, 0x55, 0xcd, 0xa8, 0x58, 0x57, + 0x33, 0x8c, 0xbd, 0x0e, 0x58, 0x55, 0x33, 0x8c, 0xbd, 0xad, 0x6a, 0x86, 0xa1, 0x1f, 0x69, 0x80, + 0x55, 0x44, 0xc3, 0xd0, 0x37, 0x7d, 0xa2, 0x61, 0xec, 0xc7, 0x88, 0x55, 0x55, 0x13, 0x04, 0xab, + 0xab, 0xf0, 0x09, 0x82, 0x55, 0xd9, 0x30, 0xd8, 0x93, 0x8d, 0x13, 0x82, 0x4a, 0x37, 0x20, 0x52, + 0x39, 0xb2, 0x71, 0x62, 0x98, 0x2a, 0x1b, 0x17, 0xf8, 0x0a, 0x85, 0x5a, 0x96, 0xcd, 0x04, 0x12, + 0x46, 0x77, 0x91, 0x37, 0x01, 0xe9, 0xca, 0xc6, 0x45, 0xfa, 0x64, 0xe3, 0x62, 0x5f, 0x05, 0xac, + 0x22, 0x9b, 0x29, 0x68, 0xd5, 0x72, 0x19, 0xd0, 0x8a, 0x6c, 0x5c, 0xb4, 0x2a, 0x1b, 0x17, 0xfc, + 0x39, 0x00, 0x7b, 0xb2, 0x99, 0xc4, 0xaa, 0x86, 0x3f, 0x0f, 0x58, 0x4f, 0x36, 0xfe, 0xd9, 0x49, + 0xd9, 0xb8, 0xd0, 0xd7, 0x00, 0xea, 0xca, 0xc6, 0x6f, 0x95, 0x65, 0xe3, 0x42, 0x5f, 0x07, 0xa8, + 0x27, 0x1b, 0x3f, 0x96, 0x65, 0xe3, 0x62, 0xdf, 0xa0, 0xfc, 0xe6, 0xc8, 0xc6, 0xc5, 0x2a, 0xb2, + 0x71, 0xa1, 0xbf, 0x8d, 0xb9, 0xd0, 0x95, 0x8d, 0x0b, 0x55, 0x65, 0xe3, 0x62, 0x7f, 0x07, 0xb1, + 0x9e, 0x6c, 0x26, 0xc1, 0xea, 0x2a, 0xfc, 0x2e, 0x82, 0x3d, 0xd9, 0xb8, 0xe0, 0x05, 0x72, 0x02, + 0x65, 0x73, 0x64, 0xb5, 0x9a, 0x27, 0x5d, 0x94, 0xd8, 0x2d, 0xd4, 0x4d, 0x2d, 0x31, 0x1e, 0x9e, + 0x58, 0xe8, 0x09, 0x74, 0x3e, 0x74, 0xfa, 0x00, 0x3f, 0xe7, 0xc8, 0xc7, 0x23, 0xdc, 0x46, 0xfd, + 0xd4, 0x62, 0x20, 0xdd, 0x82, 0xd4, 0xd0, 0x24, 0x1e, 0x7c, 0xf1, 0xf0, 0x77, 0x50, 0x45, 0xb5, + 0x18, 0xa8, 0xb7, 0x20, 0x95, 0xe4, 0xe1, 0x2b, 0xe2, 0x82, 0x27, 0x25, 0x8f, 0xf1, 0x26, 0x6a, + 0xa9, 0x16, 0xaf, 0x18, 0x8b, 0xe6, 0x9c, 0x23, 0xa8, 0x69, 0x24, 0xdf, 0x30, 0x6f, 0xa1, 0xa4, + 0x6a, 0xf1, 0x95, 0xaa, 0x4b, 0x52, 0x47, 0x32, 0x50, 0x86, 0x2c, 0x2c, 0x8f, 0xf3, 0x36, 0x2a, + 0xab, 0x96, 0x80, 0x81, 0x16, 0x41, 0x8c, 0xb2, 0x7b, 0x0a, 0xc7, 0x37, 0xce, 0x02, 0x2a, 0xac, + 0x96, 0x80, 0x71, 0x1c, 0x8e, 0x7f, 0x9c, 0x39, 0x47, 0x68, 0x1e, 0xe5, 0x0b, 0xa8, 0xb4, 0x5a, + 0xaa, 0xb2, 0x54, 0x5d, 0x5a, 0xbe, 0x07, 0xab, 0x40, 0xfd, 0x1e, 0xa7, 0x8a, 0xe3, 0xb0, 0xe4, + 0x3c, 0xd2, 0x22, 0x6a, 0xae, 0x96, 0x32, 0x56, 0x97, 0xee, 0x1a, 0x77, 0x61, 0x24, 0x09, 0xf0, + 0x58, 0xef, 0x22, 0x8b, 0xc5, 0xe7, 0xb1, 0x96, 0x50, 0x7d, 0xb5, 0xe2, 0xb1, 0xd5, 0xed, 0xda, + 0x6f, 0xdd, 0x2c, 0x3f, 0xb3, 0x87, 0xdd, 0xa3, 0x57, 0xcb, 0x02, 0xf8, 0x12, 0xaa, 0x8e, 0x3a, + 0xe7, 0x08, 0xd2, 0xa3, 0xff, 0x2a, 0x9e, 0xc3, 0xf2, 0xb5, 0xf4, 0x5a, 0xa7, 0xdd, 0xb7, 0x47, + 0x16, 0xf8, 0x4a, 0x88, 0xc0, 0x9a, 0xec, 0x05, 0xd7, 0xf1, 0xd7, 0x90, 0x36, 0x57, 0x8b, 0xbf, + 0x0d, 0xa2, 0x28, 0xb2, 0x42, 0xa7, 0x70, 0x7c, 0xeb, 0xf8, 0xeb, 0xc8, 0xd1, 0x81, 0x03, 0xc2, + 0x28, 0xb2, 0x50, 0x3d, 0xce, 0xaa, 0xb8, 0x14, 0xc8, 0x8b, 0x8d, 0x41, 0xf3, 0xf0, 0x09, 0xf0, + 0x0c, 0x4c, 0x8f, 0x6b, 0xb1, 0xa2, 0x66, 0x5e, 0xf0, 0xa5, 0xc8, 0x5d, 0xea, 0xd6, 0xef, 0x89, + 0xcb, 0xc1, 0x44, 0xe9, 0x30, 0x2b, 0x98, 0x2f, 0x89, 0x79, 0xd1, 0x9f, 0x33, 0x03, 0x54, 0x25, + 0x00, 0x3b, 0xd4, 0x2a, 0x26, 0x50, 0x8f, 0xea, 0x45, 0x62, 0xa6, 0xfe, 0x94, 0xb8, 0x32, 0x99, + 0x4a, 0x1d, 0xf2, 0x32, 0x66, 0x54, 0x22, 0x5f, 0x0a, 0x66, 0xd5, 0x09, 0xfa, 0x94, 0xb1, 0x57, + 0x30, 0xc5, 0xaa, 0xf4, 0x89, 0xd1, 0xdf, 0x11, 0xa5, 0x89, 0x64, 0xeb, 0xb0, 0x57, 0x31, 0xe7, + 0x12, 0xfb, 0xe5, 0x40, 0xde, 0x0d, 0x92, 0xa7, 0x0c, 0x7d, 0x17, 0x93, 0xb0, 0x42, 0x9e, 0x18, + 0x99, 0x96, 0xcc, 0x9f, 0x8e, 0x1d, 0xee, 0x3d, 0xcc, 0xca, 0xbc, 0x64, 0xbe, 0xcc, 0xac, 0x8e, + 0x1b, 0xc8, 0xcf, 0x0e, 0xb7, 0x86, 0x69, 0x9a, 0xc7, 0xf5, 0xa7, 0x6a, 0x26, 0x7f, 0x11, 0xc9, + 0x7b, 0xd3, 0x67, 0xfc, 0xe3, 0x38, 0x26, 0x58, 0x66, 0xef, 0x4d, 0x9b, 0xb2, 0xcb, 0x9e, 0x32, + 0xe5, 0xcf, 0x90, 0xad, 0x2b, 0xec, 0x89, 0x39, 0x3f, 0x14, 0x6e, 0xc5, 0xd1, 0x1e, 0xda, 0x27, + 0x83, 0xd2, 0x06, 0x1c, 0xed, 0x84, 0x71, 0x63, 0xa2, 0xfa, 0x71, 0x0e, 0x79, 0x9b, 0x88, 0x32, + 0xfd, 0x24, 0x69, 0x45, 0xda, 0x95, 0x56, 0x76, 0x61, 0xdc, 0xe9, 0x56, 0x24, 0xca, 0xb5, 0xa2, + 0x90, 0xd0, 0x8a, 0x13, 0xf4, 0xa5, 0x95, 0xc7, 0xb0, 0xa9, 0xa6, 0x59, 0x71, 0x52, 0x00, 0x5b, + 0xf1, 0x91, 0xe6, 0x97, 0xbd, 0x7a, 0x8b, 0xfa, 0xf5, 0xcf, 0x07, 0x0b, 0xb0, 0x4d, 0x3a, 0x3f, + 0xfb, 0x2b, 0x2d, 0x49, 0x53, 0x9c, 0x9b, 0xa4, 0xfd, 0x74, 0x08, 0xcd, 0xe7, 0xcd, 0x24, 0xed, + 0x67, 0xa6, 0xd0, 0xca, 0xbf, 0xa1, 0x41, 0xb1, 0x09, 0xf5, 0xa4, 0x9e, 0x11, 0x89, 0xf7, 0xeb, + 0x5b, 0x0f, 0x8b, 0x2f, 0xe1, 0xd3, 0x5a, 0xbd, 0xfe, 0xa8, 0xa8, 0xe9, 0x59, 0x91, 0x5c, 0xfb, + 0xca, 0xfe, 0xfa, 0x5e, 0x31, 0xa6, 0x17, 0x44, 0x6e, 0x63, 0x6b, 0x67, 0x73, 0xdd, 0xdc, 0x35, + 0xb7, 0x76, 0xf6, 0x8b, 0x71, 0xec, 0xdb, 0x78, 0x54, 0xbf, 0xbf, 0x5f, 0x4c, 0xe8, 0x69, 0x11, + 0xc7, 0xb6, 0xa4, 0x2e, 0x44, 0x6a, 0x6f, 0x1f, 0xfa, 0x37, 0x8b, 0x29, 0xb4, 0xb2, 0xbf, 0xb5, + 0xbd, 0x5e, 0x4c, 0x23, 0x72, 0xff, 0xbd, 0xdd, 0x47, 0xeb, 0xc5, 0x0c, 0x3e, 0xde, 0x37, 0xcd, + 0xfb, 0x5f, 0x29, 0x66, 0x91, 0xb4, 0x7d, 0x7f, 0xb7, 0x28, 0xa8, 0xfb, 0xfe, 0x1a, 0x74, 0xe7, + 0xf4, 0xbc, 0xc8, 0x6c, 0xbc, 0xb7, 0xf3, 0x60, 0x7f, 0xab, 0xbe, 0x53, 0xcc, 0x97, 0x4f, 0x45, + 0x49, 0x2e, 0xb3, 0x6f, 0x15, 0x65, 0x51, 0xf8, 0xae, 0x48, 0xca, 0x2f, 0xa3, 0x91, 0x4a, 0x6e, + 0x05, 0xbf, 0xcc, 0x24, 0x65, 0x41, 0x7e, 0x23, 0x49, 0x9b, 0xbf, 0x2e, 0x92, 0x72, 0x95, 0xa0, + 0x54, 0x96, 0xab, 0x13, 0xa3, 0x52, 0x31, 0xd9, 0xa2, 0x55, 0xf9, 0xcd, 0x98, 0x10, 0x9b, 0xf6, + 0xde, 0x93, 0xce, 0x80, 0x0a, 0xf2, 0xeb, 0x42, 0x8c, 0xe0, 0xb9, 0x41, 0xaa, 0xe7, 0xa2, 0x32, + 0x8b, 0x2d, 0x14, 0xef, 0xf4, 0x57, 0x45, 0x9e, 0xba, 0x5b, 0x32, 0x0a, 0x51, 0x2d, 0x99, 0x36, + 0x73, 0xd8, 0xc6, 0x81, 0xc9, 0x0f, 0x59, 0xa9, 0x52, 0x09, 0x99, 0x52, 0x20, 0x2b, 0x55, 0xfd, + 0x15, 0x41, 0xaf, 0x8d, 0x11, 0x65, 0x14, 0x2a, 0x1b, 0xb3, 0x26, 0x8d, 0x2b, 0x73, 0x0c, 0xec, + 0x2f, 0x1a, 0x53, 0xce, 0xbb, 0x30, 0xb9, 0x3b, 0x1c, 0x77, 0x17, 0xf0, 0x41, 0xce, 0xd6, 0x23, + 0xcc, 0xd7, 0x45, 0xd6, 0x6d, 0xc7, 0xb1, 0xa8, 0x95, 0x67, 0x54, 0xa4, 0x19, 0x09, 0x6a, 0x72, + 0xa7, 0x24, 0x01, 0xec, 0xcd, 0x1c, 0x79, 0x23, 0x49, 0xd2, 0x9d, 0xf2, 0x75, 0x31, 0xb3, 0x63, + 0xf7, 0xe5, 0xee, 0xa5, 0x55, 0xca, 0x0b, 0xad, 0x59, 0xd2, 0xa8, 0x7a, 0xd2, 0x9a, 0xe5, 0x1b, + 0x42, 0x28, 0x7d, 0x45, 0xa1, 0x1d, 0xc8, 0x3e, 0x8a, 0x01, 0xda, 0x41, 0xf9, 0x4d, 0x91, 0xda, + 0x6e, 0x3e, 0xdf, 0x6f, 0xb6, 0x61, 0x2c, 0xd1, 0x6d, 0x8e, 0xc6, 0x0d, 0x5a, 0xfa, 0xd2, 0xff, + 0xc3, 0x7f, 0x1a, 0x1d, 0xf6, 0xb2, 0xd8, 0x2a, 0x55, 0xfa, 0x54, 0x88, 0x7a, 0xf7, 0x68, 0xdb, + 0x1a, 0x8d, 0x9a, 0x6d, 0x0b, 0x8e, 0x2a, 0xa9, 0x3e, 0x18, 0xb5, 0xf0, 0x86, 0x04, 0xef, 0x11, + 0xae, 0x7a, 0xab, 0xe0, 0xa1, 0x16, 0x76, 0x08, 0x62, 0x32, 0x14, 0x3c, 0x88, 0xf7, 0x4f, 0x7a, + 0x74, 0x4f, 0x92, 0x34, 0xf1, 0x71, 0xfe, 0x9a, 0x48, 0x49, 0x0c, 0xde, 0xc7, 0xf4, 0x9b, 0x3d, + 0xab, 0x24, 0xc7, 0xa5, 0xe7, 0xf2, 0xaf, 0x68, 0x42, 0xec, 0x58, 0xcf, 0xce, 0x31, 0xa6, 0x87, + 0x8a, 0x18, 0x33, 0x2e, 0xc7, 0x7c, 0x27, 0x6a, 0x4c, 0xd4, 0x59, 0xcb, 0xb6, 0x8f, 0x1a, 0xf2, + 0x13, 0xcb, 0x2b, 0x9d, 0x2c, 0xb6, 0xd0, 0x57, 0x2b, 0x3f, 0x16, 0xf9, 0xad, 0x7e, 0xdf, 0x1a, + 0x3a, 0x3e, 0x81, 0x89, 0x63, 0x7b, 0x34, 0xe6, 0xbb, 0x25, 0x7a, 0xd6, 0x4b, 0x22, 0x31, 0xb0, + 0x87, 0x63, 0x39, 0xcf, 0x5a, 0x02, 0x8e, 0x53, 0x8b, 0x26, 0xb5, 0xe8, 0xd7, 0x44, 0xf6, 0xd0, + 0x06, 0xfa, 0x21, 0x4e, 0x22, 0x4e, 0x65, 0x8d, 0xd7, 0x50, 0xfe, 0x25, 0x4d, 0xe4, 0xeb, 0xe3, + 0x63, 0xcf, 0x38, 0xf8, 0xfe, 0xc4, 0x3a, 0x25, 0xf7, 0xc0, 0x77, 0x78, 0xc4, 0xad, 0xf2, 0xb3, + 0xcd, 0xee, 0x89, 0xbc, 0x6b, 0xca, 0x9b, 0xf2, 0x45, 0xbf, 0x24, 0x52, 0xcf, 0xac, 0x4e, 0xfb, + 0x78, 0x4c, 0x36, 0x63, 0x26, 0xbf, 0x41, 0x85, 0x92, 0xec, 0xa0, 0xb3, 0xa5, 0x04, 0xad, 0xd7, + 0x25, 0x6f, 0xbd, 0xd4, 0x39, 0x98, 0x12, 0x74, 0x27, 0x93, 0x39, 0x2a, 0xfe, 0x02, 0xfc, 0x17, + 0x2b, 0xb7, 0xc4, 0x45, 0x67, 0xf3, 0xfa, 0x26, 0xbb, 0x23, 0x4a, 0x5d, 0xcb, 0x06, 0x91, 0x40, + 0x80, 0xeb, 0x9e, 0x36, 0x9e, 0xd9, 0xfd, 0x46, 0xb3, 0xdf, 0xb0, 0x47, 0x87, 0xcd, 0x21, 0x2d, + 0x40, 0xf8, 0x10, 0x17, 0x81, 0xb7, 0x21, 0x69, 0x1f, 0xd8, 0xfd, 0xfb, 0xfd, 0x3a, 0x72, 0xca, + 0xbf, 0x9f, 0x10, 0xd9, 0xed, 0x53, 0xc7, 0x3a, 0xcc, 0xed, 0xd0, 0x3e, 0xe9, 0xcb, 0xb5, 0x84, + 0x30, 0x40, 0x2f, 0xee, 0x37, 0x8a, 0x29, 0xdf, 0x08, 0x90, 0x4f, 0x4f, 0xec, 0xb1, 0x45, 0xd3, + 0xcd, 0x9a, 0xf2, 0x05, 0x57, 0x6b, 0x60, 0x8d, 0x61, 0xae, 0x58, 0xdc, 0xe2, 0xa3, 0x37, 0xff, + 0xe4, 0x39, 0xe6, 0x0f, 0x47, 0xfc, 0x94, 0x8d, 0xab, 0x3f, 0x2a, 0xa5, 0xe8, 0x5e, 0x4d, 0x81, + 0xab, 0x5f, 0xc5, 0x64, 0x94, 0xbe, 0x25, 0xe6, 0x9e, 0x59, 0x8d, 0xde, 0x09, 0x6c, 0x9b, 0xb6, + 0x0d, 0xc7, 0x3f, 0x48, 0x18, 0x43, 0x08, 0x2a, 0x38, 0x92, 0x12, 0x13, 0xa6, 0x2d, 0xa4, 0x39, + 0xfb, 0xcc, 0xda, 0x06, 0xde, 0xa6, 0xfd, 0x90, 0x58, 0xa0, 0xec, 0x2c, 0x64, 0xbf, 0x86, 0x74, + 0x36, 0x1f, 0x1c, 0xdd, 0x47, 0xcd, 0x00, 0x90, 0x1a, 0xf4, 0x65, 0x91, 0x39, 0xe8, 0x3c, 0xb1, + 0x46, 0xc7, 0xa0, 0xa5, 0x34, 0x0c, 0x3b, 0x6b, 0x5c, 0xf1, 0x38, 0xee, 0xb2, 0x2e, 0x3c, 0xb0, + 0xbb, 0xf6, 0xd0, 0x74, 0xa1, 0x70, 0x3a, 0xc9, 0x8e, 0xec, 0x9e, 0x25, 0xf5, 0x9d, 0xa1, 0xa4, + 0x7a, 0x7d, 0x1a, 0x6f, 0x0f, 0x40, 0x4e, 0x04, 0x73, 0xf0, 0xfa, 0x55, 0xe9, 0xe8, 0x01, 0x1e, + 0x9d, 0x4b, 0x82, 0xae, 0x06, 0xd0, 0x21, 0x3a, 0x4a, 0xeb, 0xf3, 0xe8, 0x50, 0xbb, 0x85, 0x27, + 0x22, 0x08, 0xd0, 0x58, 0x57, 0xba, 0xef, 0xf3, 0x6f, 0x41, 0xe8, 0x73, 0x0c, 0x7a, 0xa1, 0x4f, + 0x86, 0x9b, 0x2c, 0xc5, 0x03, 0x19, 0xfa, 0x64, 0xac, 0x79, 0x4d, 0x24, 0xc9, 0x6d, 0xcc, 0x50, + 0xe6, 0x3a, 0x26, 0x44, 0xc8, 0x50, 0x9b, 0xe6, 0xfa, 0xfa, 0x0e, 0x64, 0x44, 0xcc, 0x8d, 0x8f, + 0xde, 0x5b, 0x2f, 0xc6, 0x14, 0xc5, 0xfe, 0x96, 0x26, 0xe2, 0xeb, 0xcf, 0x49, 0x2d, 0x38, 0x0d, + 0x67, 0x47, 0xe3, 0xb3, 0xb1, 0x22, 0x12, 0x3d, 0x7b, 0x68, 0xe9, 0x17, 0xa6, 0xcc, 0xb2, 0xd4, + 0xa6, 0xef, 0xa5, 0xdc, 0x22, 0x83, 0x15, 0x93, 0xf0, 0xc6, 0x1b, 0x22, 0x31, 0xb6, 0xc0, 0xe6, + 0x54, 0xde, 0xb1, 0x1c, 0x00, 0x01, 0x06, 0x84, 0x51, 0x88, 0x2b, 0x07, 0xf0, 0x49, 0xa6, 0x42, + 0x3b, 0x34, 0x3d, 0x86, 0x94, 0xdf, 0x17, 0xc5, 0x07, 0x76, 0x6f, 0xd0, 0xb5, 0x9e, 0xc3, 0x48, + 0x56, 0x7f, 0x04, 0xa7, 0x05, 0xd4, 0x73, 0xab, 0x33, 0xa4, 0x28, 0xa2, 0xc9, 0x04, 0x08, 0x2f, + 0xb8, 0xab, 0x47, 0x16, 0x44, 0x87, 0x23, 0x0e, 0x98, 0xfc, 0x86, 0xe8, 0xf1, 0x71, 0x67, 0x88, + 0x01, 0x04, 0xe3, 0xbc, 0x7c, 0x29, 0x6f, 0x8a, 0x02, 0xd7, 0x18, 0x23, 0x1e, 0xb8, 0x7c, 0x47, + 0xe4, 0x9d, 0x26, 0xba, 0x38, 0x87, 0x85, 0x7b, 0xbc, 0x6e, 0xd6, 0x61, 0x35, 0x61, 0x59, 0xeb, + 0x3b, 0xeb, 0xb0, 0x96, 0xf0, 0xb0, 0xff, 0x41, 0xdd, 0xb7, 0x94, 0xd7, 0x44, 0xde, 0xf5, 0x7d, + 0xcf, 0x1a, 0x53, 0x0f, 0x26, 0x84, 0x74, 0x2d, 0x96, 0xd1, 0xca, 0x69, 0x91, 0x5c, 0xef, 0x0d, + 0xc6, 0xa7, 0xe5, 0x9f, 0x17, 0x39, 0x06, 0x3d, 0xea, 0x80, 0xb3, 0xab, 0x22, 0xdd, 0xe3, 0xf9, + 0x6a, 0x74, 0xdc, 0x53, 0x35, 0xe5, 0xe1, 0x9c, 0x67, 0xd3, 0x41, 0xcf, 0x57, 0x44, 0x5a, 0x89, + 0xa5, 0xbc, 0xd5, 0x63, 0xea, 0x56, 0x97, 0x41, 0x21, 0xae, 0x04, 0x85, 0xf2, 0xb6, 0x48, 0xcb, + 0x0c, 0x38, 0xa2, 0xac, 0x2e, 0x4b, 0x45, 0x29, 0x26, 0xf9, 0xe5, 0x73, 0xb2, 0x4d, 0x1e, 0x54, + 0x40, 0x6e, 0x24, 0x58, 0x46, 0xc8, 0xd0, 0x29, 0xa8, 0x49, 0xca, 0xed, 0xf7, 0x92, 0x22, 0xe3, + 0xac, 0x14, 0x48, 0x3c, 0x25, 0xeb, 0x33, 0x32, 0xe5, 0xdc, 0x1f, 0x24, 0xa9, 0x22, 0x83, 0xce, + 0x34, 0xd7, 0x60, 0x1c, 0xdd, 0xf1, 0xb2, 0x20, 0x25, 0x6b, 0x2e, 0xb7, 0x13, 0xce, 0x16, 0x71, + 0xf7, 0x66, 0x20, 0x25, 0xab, 0x2a, 0xfd, 0xa6, 0xc8, 0xba, 0x75, 0x14, 0xc5, 0x63, 0xbe, 0x06, + 0xc8, 0x38, 0x85, 0x93, 0x82, 0x00, 0x03, 0x49, 0xaf, 0xe6, 0xcf, 0xb4, 0xbc, 0xe3, 0x49, 0xc6, + 0xa9, 0x86, 0xe8, 0xfa, 0xde, 0x29, 0xf0, 0xd3, 0x5c, 0xff, 0x78, 0x00, 0xb0, 0x90, 0x56, 0xaa, + 0xf9, 0x34, 0xd7, 0x38, 0x00, 0x48, 0x73, 0x55, 0x43, 0x5b, 0xdf, 0x2b, 0xdd, 0x53, 0xb2, 0x92, + 0x81, 0xe5, 0xcc, 0x38, 0xb5, 0x0b, 0xed, 0x4b, 0xaf, 0x4e, 0x4f, 0x73, 0xbd, 0xa2, 0xbf, 0x89, + 0x10, 0xb9, 0xfc, 0x10, 0x02, 0xa6, 0x17, 0xe5, 0x69, 0x2e, 0xca, 0x61, 0x52, 0x69, 0xae, 0xc5, + 0x29, 0x24, 0x28, 0x05, 0x78, 0x4a, 0x16, 0xe0, 0xfa, 0x0d, 0x32, 0x27, 0x27, 0x95, 0xf7, 0x8a, + 0xed, 0x34, 0x17, 0x38, 0x5e, 0x3f, 0x1d, 0xd9, 0xdc, 0xc2, 0x3a, 0xcd, 0x25, 0x8c, 0xbe, 0x82, + 0xdf, 0x0b, 0xf5, 0x0d, 0xc7, 0x35, 0x0c, 0x82, 0x25, 0x4f, 0x78, 0xce, 0x37, 0x95, 0x31, 0xb0, + 0x26, 0x23, 0x08, 0x7c, 0x4a, 0xda, 0x0d, 0xf3, 0xc8, 0xdb, 0xed, 0xf4, 0x5b, 0x70, 0x8e, 0xc3, + 0x95, 0x88, 0xc3, 0x23, 0xf4, 0x61, 0x8b, 0xd4, 0xc0, 0x0e, 0xf6, 0x15, 0xa9, 0x2f, 0xf1, 0xb6, + 0xec, 0xc4, 0x26, 0x48, 0xef, 0x49, 0xe8, 0x6c, 0xf6, 0xe1, 0x40, 0x46, 0xbc, 0x7e, 0xb3, 0x6f, + 0x26, 0x5a, 0xd0, 0xa0, 0xbf, 0x21, 0xe2, 0xa3, 0x93, 0x83, 0x92, 0x1e, 0xfc, 0x65, 0x65, 0xef, + 0xe4, 0xc0, 0x71, 0xc5, 0x44, 0x04, 0xd8, 0xcf, 0x80, 0x40, 0x1b, 0x3f, 0x67, 0x0d, 0xed, 0xd2, + 0x05, 0x5a, 0xc2, 0x97, 0xcc, 0x34, 0xb4, 0x3c, 0x86, 0x86, 0x73, 0x06, 0x3f, 0x38, 0xdc, 0xe5, + 0x14, 0xbb, 0x50, 0x1c, 0x68, 0x7d, 0x79, 0x52, 0xa8, 0x69, 0xab, 0xa6, 0xd6, 0x2f, 0xef, 0x8b, + 0xbc, 0x53, 0xc3, 0xd0, 0x7c, 0x0d, 0xdc, 0x49, 0x60, 0x96, 0xf6, 0xe7, 0xac, 0x71, 0x4d, 0x4d, + 0x51, 0x1e, 0x8c, 0xd3, 0x85, 0x84, 0x96, 0x8b, 0x01, 0x57, 0xb4, 0xf2, 0x0f, 0xe1, 0x8c, 0xb2, + 0x0d, 0xd1, 0xd1, 0xbd, 0xaf, 0x85, 0x0d, 0x7a, 0x00, 0x3b, 0x63, 0x44, 0x66, 0x33, 0xa6, 0x7c, + 0xd1, 0x5f, 0x13, 0x79, 0x7a, 0x70, 0x6a, 0xcf, 0x98, 0x7b, 0xb5, 0x91, 0xa3, 0x76, 0x2e, 0x38, + 0x61, 0xc7, 0xc3, 0x47, 0x1c, 0x71, 0x24, 0xa3, 0x67, 0xfd, 0x73, 0x22, 0x87, 0xff, 0x3a, 0xcc, + 0x84, 0x7b, 0x60, 0x15, 0xd8, 0xcc, 0xc4, 0x37, 0xc4, 0x0c, 0x7d, 0x7d, 0x17, 0x96, 0x76, 0xaf, + 0x31, 0xf2, 0xb2, 0x83, 0x81, 0x25, 0x91, 0x96, 0xa1, 0x60, 0x44, 0xbf, 0x96, 0x65, 0x4d, 0xe7, + 0x15, 0xc3, 0x2b, 0x55, 0x02, 0x32, 0xdd, 0xa7, 0x4d, 0x7e, 0x2b, 0xdf, 0x17, 0x19, 0xca, 0x52, + 0x70, 0x8c, 0xd5, 0xcb, 0x42, 0x6b, 0x97, 0x2c, 0xca, 0x91, 0x17, 0x95, 0x63, 0x3e, 0x77, 0x2f, + 0x6c, 0x9a, 0x5a, 0x7b, 0x7e, 0x4e, 0x68, 0x9b, 0x78, 0xee, 0x7e, 0xce, 0x61, 0x5a, 0x7b, 0x5e, + 0xae, 0xb3, 0x09, 0x38, 0x95, 0x46, 0x99, 0x80, 0x6e, 0x69, 0xe2, 0x95, 0x09, 0x13, 0xf8, 0x76, + 0xca, 0x3f, 0x1d, 0x6a, 0xa7, 0xe5, 0x8a, 0x98, 0xa1, 0xed, 0x09, 0x8e, 0xef, 0xda, 0x30, 0x3f, + 0xec, 0x6e, 0xd1, 0x39, 0x09, 0xce, 0xf1, 0x2d, 0xfc, 0x06, 0xd6, 0xf3, 0xe6, 0xa1, 0x3c, 0x71, + 0xc2, 0x37, 0xa0, 0x97, 0xf2, 0xa7, 0x09, 0x31, 0xcb, 0xa1, 0xf5, 0x83, 0xce, 0xf8, 0x78, 0xbb, + 0x39, 0xd0, 0x1f, 0x89, 0x3c, 0x46, 0xd5, 0x46, 0xaf, 0x39, 0x18, 0xe0, 0xf6, 0xd5, 0xe8, 0xa8, + 0x71, 0x7b, 0x22, 0x54, 0x33, 0x7e, 0x61, 0x07, 0xc0, 0xdb, 0x12, 0xbb, 0xde, 0x1f, 0x0f, 0x4f, + 0xcd, 0x5c, 0xdf, 0x6b, 0x81, 0x03, 0x50, 0xae, 0x37, 0x6a, 0xbb, 0xc6, 0x62, 0x64, 0xec, 0x56, + 0xa8, 0xb1, 0xed, 0x51, 0xdb, 0x67, 0x4b, 0xf4, 0xdc, 0x06, 0x74, 0x0c, 0xe3, 0xb1, 0x6b, 0x2b, + 0x7e, 0x86, 0x63, 0x18, 0x3a, 0xfc, 0x8e, 0x1d, 0x78, 0x2d, 0xfa, 0x43, 0xa8, 0x15, 0x61, 0x7b, + 0x8d, 0x6d, 0x2c, 0x9d, 0x48, 0x41, 0x39, 0xe3, 0xf5, 0x50, 0x5b, 0x10, 0xa9, 0xf6, 0x6d, 0xf8, + 0x9f, 0x34, 0x84, 0x1b, 0x93, 0x5e, 0xe7, 0xdf, 0x15, 0xc5, 0xe0, 0xfc, 0xd5, 0x13, 0x79, 0x72, + 0xca, 0x89, 0x3c, 0xcb, 0x27, 0xf2, 0x5a, 0xec, 0xae, 0x36, 0xff, 0xbe, 0x28, 0x04, 0xa6, 0xac, + 0xd2, 0x75, 0x49, 0x7f, 0x5b, 0xa5, 0xe7, 0x8c, 0xcb, 0xca, 0xcf, 0xd9, 0xea, 0x07, 0x57, 0xed, + 0x82, 0x5f, 0xc1, 0xe9, 0xab, 0x86, 0x33, 0x11, 0x95, 0x02, 0xf1, 0xdf, 0x11, 0x33, 0xbe, 0x29, + 0xab, 0xe4, 0xec, 0x19, 0x93, 0x2a, 0xff, 0x62, 0x52, 0x24, 0xeb, 0x7d, 0xcb, 0x6e, 0xe9, 0x97, + 0xfd, 0x79, 0xf2, 0x4b, 0x2f, 0x39, 0x39, 0xf2, 0x4a, 0x20, 0x47, 0x42, 0x8f, 0x93, 0x21, 0xaf, + 0x04, 0x32, 0xa4, 0xd3, 0x05, 0x61, 0xfc, 0xfa, 0x44, 0x7e, 0x84, 0x4e, 0x2f, 0x39, 0x5e, 0x9f, + 0x48, 0x8e, 0x5e, 0x37, 0xb0, 0xaf, 0x06, 0x33, 0x23, 0xf4, 0xba, 0x59, 0xf1, 0x6a, 0x30, 0x2b, + 0xba, 0x9d, 0xc0, 0xbc, 0x12, 0xc8, 0x88, 0xe4, 0x92, 0xcc, 0x85, 0x57, 0x83, 0xb9, 0x90, 0x78, + 0x9c, 0x05, 0xaf, 0x06, 0xb3, 0x20, 0x75, 0x72, 0xd6, 0xbb, 0x12, 0xc8, 0x7a, 0x64, 0x54, 0xa6, + 0xbb, 0xab, 0xc1, 0x74, 0x27, 0x79, 0x8a, 0xa7, 0x6a, 0xae, 0x73, 0x3b, 0xc1, 0x53, 0x23, 0x90, + 0xe8, 0xc2, 0x4f, 0xfb, 0xf4, 0x2d, 0x28, 0xe8, 0x57, 0x71, 0xd9, 0x9c, 0x83, 0x68, 0x21, 0xe2, + 0x17, 0x7f, 0x5a, 0x4d, 0xe7, 0x20, 0x66, 0x88, 0x74, 0x8b, 0x0b, 0xe0, 0x22, 0x45, 0x2e, 0x45, + 0x96, 0xf4, 0xf1, 0x17, 0x36, 0x1a, 0x14, 0xc1, 0x68, 0x5e, 0xf2, 0x4c, 0x7f, 0x0b, 0x42, 0x54, + 0xe3, 0x51, 0x73, 0xd8, 0x06, 0x60, 0x63, 0xbf, 0xd9, 0x76, 0x2f, 0x11, 0xf0, 0xfb, 0xe7, 0x5a, + 0xdc, 0x83, 0x77, 0x0d, 0x97, 0x1c, 0x71, 0x1d, 0x51, 0xaf, 0xc6, 0xf2, 0x9a, 0xbf, 0x8c, 0x8b, + 0x26, 0x8d, 0x51, 0x2c, 0x9c, 0xe3, 0x58, 0xb8, 0x06, 0x67, 0xce, 0x93, 0x3e, 0x9c, 0x93, 0xd7, + 0xb2, 0x22, 0x3d, 0xb6, 0x87, 0xbd, 0xe6, 0xd8, 0x2e, 0xff, 0x48, 0x13, 0x02, 0xce, 0xd1, 0x3d, + 0xe8, 0x78, 0x0a, 0x15, 0x30, 0x24, 0xc3, 0x5e, 0xf3, 0x09, 0xc4, 0x0f, 0xab, 0x71, 0x38, 0x74, + 0xf6, 0x41, 0x16, 0x9b, 0xb6, 0xad, 0x07, 0x20, 0xf1, 0x92, 0x73, 0x44, 0x27, 0xed, 0x90, 0x24, + 0xf9, 0xc8, 0x7e, 0x91, 0x0f, 0x9d, 0x29, 0xfe, 0x86, 0xce, 0xb1, 0x53, 0xd6, 0x11, 0x69, 0xfe, + 0x7a, 0xf4, 0x86, 0x92, 0x1f, 0x5b, 0xbd, 0x41, 0xe3, 0x90, 0xa4, 0x82, 0x72, 0x48, 0xe2, 0xfb, + 0x03, 0xd8, 0xc5, 0x71, 0x48, 0x98, 0x24, 0x92, 0x33, 0xbe, 0x0b, 0xe2, 0x20, 0x3b, 0xc6, 0x21, + 0xf6, 0x91, 0x6c, 0x72, 0xc6, 0x9c, 0x72, 0x4e, 0x90, 0xa9, 0x09, 0x61, 0xd0, 0xef, 0xce, 0xfb, + 0x4e, 0x41, 0xc4, 0x37, 0xea, 0x75, 0xcc, 0xfd, 0xf0, 0xcf, 0x52, 0x51, 0xab, 0x7d, 0x41, 0x64, + 0xda, 0x43, 0xcb, 0xc2, 0xf0, 0x30, 0xbd, 0xe6, 0xf8, 0x90, 0x72, 0x9d, 0x0b, 0xaa, 0xc1, 0x81, + 0xf9, 0x50, 0x56, 0x1d, 0x7a, 0x48, 0x59, 0x5b, 0xfa, 0x03, 0x79, 0xa9, 0x32, 0xef, 0x75, 0x07, + 0xeb, 0x14, 0xd3, 0xb1, 0x51, 0xdb, 0x85, 0x32, 0xb0, 0x71, 0x96, 0xc1, 0x8f, 0x64, 0x76, 0x89, + 0x32, 0x98, 0x19, 0x72, 0x53, 0x6d, 0x5d, 0xcc, 0xf5, 0x6d, 0xe7, 0x37, 0x94, 0xc6, 0x91, 0xdc, + 0x63, 0x57, 0x26, 0x8f, 0x72, 0x8e, 0x71, 0x4b, 0xfe, 0x6e, 0xd9, 0xb7, 0xb9, 0x43, 0xee, 0xca, + 0xda, 0x03, 0x51, 0x54, 0xcc, 0x50, 0xe9, 0x19, 0x65, 0xa5, 0x25, 0x7f, 0x28, 0x75, 0xad, 0xd0, + 0xbe, 0x0f, 0x18, 0x91, 0x3b, 0x33, 0xc2, 0x48, 0x5b, 0xfe, 0xea, 0xec, 0x1a, 0xa1, 0x50, 0x37, + 0x69, 0x04, 0x63, 0x4d, 0xb8, 0x91, 0x63, 0xf9, 0x83, 0xb4, 0x6a, 0x64, 0xa5, 0x1a, 0x58, 0x95, + 0x93, 0x33, 0x5d, 0xe9, 0xc8, 0xdf, 0x93, 0x5d, 0x2b, 0x32, 0x00, 0x4e, 0x31, 0x13, 0xed, 0xcc, + 0x87, 0xf2, 0xa7, 0x66, 0x9f, 0x99, 0x09, 0x6f, 0x46, 0x67, 0x7a, 0xf3, 0x44, 0xfe, 0xae, 0xeb, + 0x9a, 0xd9, 0x9b, 0xe6, 0xcd, 0xe8, 0x4c, 0x6f, 0xba, 0xf2, 0x17, 0x5f, 0x9f, 0x19, 0xf0, 0x66, + 0x53, 0xe8, 0xea, 0xa7, 0xe6, 0x3c, 0x11, 0x61, 0xa7, 0x27, 0x7f, 0xc7, 0xf7, 0x3e, 0xb6, 0xa4, + 0x4c, 0x33, 0x14, 0xed, 0x50, 0x5f, 0xfe, 0xc4, 0xef, 0x37, 0x04, 0x1e, 0x6d, 0x89, 0x0b, 0xea, + 0xc4, 0xce, 0xe1, 0x92, 0x0d, 0x96, 0x0a, 0xe6, 0x9c, 0x37, 0x35, 0xe6, 0x4c, 0x35, 0x15, 0xed, + 0xd4, 0x00, 0x4c, 0x15, 0x27, 0x4c, 0x81, 0x57, 0xf7, 0x45, 0x41, 0x31, 0x75, 0x40, 0x19, 0x3a, + 0xdc, 0xcc, 0x53, 0xf9, 0xb7, 0x16, 0xae, 0x19, 0xcc, 0xe8, 0xc1, 0x2f, 0xc6, 0x39, 0x2e, 0xdc, + 0xc8, 0x50, 0xfe, 0xa1, 0x80, 0xe7, 0x0b, 0x31, 0x02, 0x5b, 0x82, 0xea, 0xef, 0x28, 0x2b, 0x23, + 0xf9, 0x27, 0x04, 0x9e, 0x2b, 0x48, 0xa8, 0x75, 0x7c, 0xd3, 0xb1, 0x30, 0xc9, 0x45, 0xd8, 0x18, + 0x53, 0x44, 0x7e, 0x3d, 0x14, 0xb0, 0xa0, 0x5e, 0x90, 0x28, 0xd3, 0xc6, 0x57, 0xf8, 0x08, 0xb3, + 0xe7, 0x0f, 0x48, 0x1f, 0x69, 0xb2, 0x5a, 0xae, 0x2c, 0x60, 0x41, 0x6d, 0xce, 0x1c, 0xf9, 0xe2, + 0xd2, 0xba, 0x98, 0x39, 0x77, 0x50, 0xfa, 0x58, 0x93, 0x35, 0x27, 0x5a, 0x32, 0xf3, 0x47, 0xfe, + 0xc8, 0x34, 0x73, 0xee, 0xb0, 0xf4, 0x89, 0x26, 0x2f, 0x28, 0xaa, 0x86, 0x6b, 0xc4, 0x89, 0x4c, + 0x33, 0xe7, 0x0e, 0x4b, 0x5f, 0x95, 0x15, 0x65, 0xac, 0x5a, 0x51, 0x8d, 0x50, 0x2c, 0x98, 0x3d, + 0x7f, 0x58, 0xfa, 0x9a, 0x46, 0x97, 0x15, 0xb1, 0x6a, 0xd5, 0x5d, 0x17, 0x37, 0x32, 0xcd, 0x9e, + 0x3f, 0x2c, 0x7d, 0x5d, 0xa3, 0x2b, 0x8d, 0x58, 0x75, 0xd9, 0x67, 0xc6, 0xef, 0xcd, 0xd9, 0x61, + 0xe9, 0x1b, 0x1a, 0xdd, 0x32, 0xc4, 0xaa, 0x2b, 0xae, 0x99, 0xbd, 0x09, 0x6f, 0xce, 0x0e, 0x4b, + 0xdf, 0xa4, 0x53, 0x3c, 0x98, 0x59, 0xf5, 0x99, 0xa1, 0xc8, 0x54, 0x78, 0x81, 0xb0, 0xf4, 0x2d, + 0x8d, 0x2e, 0x83, 0x62, 0xd5, 0xbb, 0xa6, 0x33, 0xba, 0x17, 0x99, 0x0a, 0x2f, 0x10, 0x96, 0x3e, + 0xd5, 0xe8, 0xce, 0x28, 0x56, 0xbd, 0xe7, 0x37, 0x44, 0x91, 0xa9, 0xf8, 0x22, 0x61, 0xe9, 0xdb, + 0x68, 0xa9, 0x50, 0x8b, 0x2d, 0x2f, 0x9a, 0x8e, 0x03, 0x4a, 0x64, 0x2a, 0xbe, 0x48, 0x58, 0xfa, + 0x0e, 0x9a, 0x2a, 0x82, 0xa9, 0xa5, 0x80, 0x29, 0xf0, 0xea, 0x81, 0xc8, 0x9f, 0x37, 0x2c, 0x7d, + 0x57, 0xbd, 0x8b, 0xcb, 0x1d, 0x29, 0xb1, 0x69, 0x57, 0xf9, 0x66, 0x67, 0x06, 0xa6, 0xef, 0x51, + 0x8d, 0x53, 0x9b, 0xf9, 0x92, 0xbc, 0xaf, 0x92, 0x04, 0xef, 0xf3, 0xc9, 0x30, 0xb5, 0xed, 0xed, + 0x8f, 0x33, 0x63, 0xd4, 0xf7, 0x35, 0xba, 0xd4, 0xca, 0xb3, 0x41, 0xc2, 0xbb, 0x3b, 0x45, 0x06, + 0xac, 0x0f, 0xbd, 0x59, 0x9e, 0x15, 0xad, 0x7e, 0xa0, 0xbd, 0x48, 0xb8, 0xaa, 0xe1, 0x1d, 0xae, + 0xbb, 0x18, 0xd4, 0xf2, 0x45, 0x91, 0x78, 0x6e, 0x2c, 0x2e, 0xa9, 0x47, 0x32, 0xf5, 0x2e, 0x57, + 0x06, 0xa9, 0x9c, 0x51, 0x50, 0xae, 0xbb, 0xf1, 0x32, 0xd7, 0x24, 0x16, 0xb3, 0x8d, 0x50, 0xf6, + 0xc7, 0x11, 0x6c, 0x83, 0xd9, 0x95, 0x50, 0xf6, 0x27, 0x11, 0xec, 0x0a, 0xb3, 0xab, 0xa1, 0xec, + 0xaf, 0x46, 0xb0, 0xab, 0xcc, 0x5e, 0x0e, 0x65, 0x7f, 0x2d, 0x82, 0xbd, 0xcc, 0xec, 0x95, 0x50, + 0xf6, 0xd7, 0x23, 0xd8, 0x2b, 0xcc, 0x5e, 0x0d, 0x65, 0x7f, 0x23, 0x82, 0xbd, 0xca, 0xec, 0xbb, + 0xa1, 0xec, 0x6f, 0x46, 0xb0, 0xef, 0x32, 0xfb, 0x5e, 0x28, 0xfb, 0x5b, 0x11, 0xec, 0x7b, 0x92, + 0xbd, 0xb4, 0x18, 0xca, 0xfe, 0x34, 0x9c, 0xbd, 0xb4, 0xc8, 0xec, 0x70, 0xad, 0x7d, 0x3b, 0x82, + 0xcd, 0x5a, 0x5b, 0x0a, 0xd7, 0xda, 0x77, 0x22, 0xd8, 0xac, 0xb5, 0xa5, 0x70, 0xad, 0x7d, 0x37, + 0x82, 0xcd, 0x5a, 0x5b, 0x0a, 0xd7, 0xda, 0xf7, 0x22, 0xd8, 0xac, 0xb5, 0xa5, 0x70, 0xad, 0x7d, + 0x3f, 0x82, 0xcd, 0x5a, 0x5b, 0x0a, 0xd7, 0xda, 0x0f, 0x22, 0xd8, 0xac, 0xb5, 0xa5, 0x70, 0xad, + 0xfd, 0x61, 0x04, 0x9b, 0xb5, 0xb6, 0x14, 0xae, 0xb5, 0x3f, 0x8a, 0x60, 0xb3, 0xd6, 0x96, 0xc2, + 0xb5, 0xf6, 0xc7, 0x11, 0x6c, 0xd6, 0x9a, 0x11, 0xae, 0xb5, 0x3f, 0x09, 0x67, 0x1b, 0xac, 0x35, + 0x23, 0x5c, 0x6b, 0x7f, 0x1a, 0xc1, 0x66, 0xad, 0x19, 0xe1, 0x5a, 0xfb, 0xb3, 0x08, 0x36, 0x6b, + 0xcd, 0x08, 0xd7, 0xda, 0x0f, 0x23, 0xd8, 0xac, 0x35, 0x23, 0x5c, 0x6b, 0x7f, 0x1e, 0xc1, 0x66, + 0xad, 0x19, 0xe1, 0x5a, 0xfb, 0x8b, 0x08, 0x36, 0x6b, 0xcd, 0x08, 0xd7, 0xda, 0x5f, 0x46, 0xb0, + 0x59, 0x6b, 0x46, 0xb8, 0xd6, 0xfe, 0x2a, 0x82, 0xcd, 0x5a, 0x33, 0xc2, 0xb5, 0xf6, 0xd7, 0x11, + 0x6c, 0xd6, 0x9a, 0x11, 0xae, 0xb5, 0xbf, 0x89, 0x60, 0xb3, 0xd6, 0x2a, 0xe1, 0x5a, 0xfb, 0xdb, + 0x70, 0x76, 0x85, 0xb5, 0x56, 0x09, 0xd7, 0xda, 0xdf, 0x45, 0xb0, 0x59, 0x6b, 0x95, 0x70, 0xad, + 0xfd, 0x7d, 0x04, 0x9b, 0xb5, 0x56, 0x09, 0xd7, 0xda, 0x3f, 0x44, 0xb0, 0x59, 0x6b, 0x95, 0x70, + 0xad, 0xfd, 0x28, 0x82, 0xcd, 0x5a, 0xab, 0x84, 0x6b, 0xed, 0x1f, 0x23, 0xd8, 0xac, 0xb5, 0x4a, + 0xb8, 0xd6, 0xfe, 0x29, 0x82, 0xcd, 0x5a, 0xab, 0x84, 0x6b, 0xed, 0x9f, 0x23, 0xd8, 0xac, 0xb5, + 0x4a, 0xb8, 0xd6, 0xfe, 0x25, 0x82, 0xcd, 0x5a, 0xab, 0x84, 0x6b, 0xed, 0x5f, 0x23, 0xd8, 0xac, + 0xb5, 0x6a, 0xb8, 0xd6, 0xfe, 0x2d, 0x9c, 0x5d, 0x65, 0xad, 0x55, 0xc3, 0xb5, 0xf6, 0xef, 0x11, + 0x6c, 0xd6, 0x5a, 0x35, 0x5c, 0x6b, 0xff, 0x11, 0xc1, 0x66, 0xad, 0x55, 0xc3, 0xb5, 0xf6, 0x9f, + 0x11, 0x6c, 0xd6, 0x5a, 0x35, 0x5c, 0x6b, 0xff, 0x15, 0xc1, 0x66, 0xad, 0x55, 0xc3, 0xb5, 0xf6, + 0xdf, 0x11, 0x6c, 0xd6, 0x5a, 0x35, 0x5c, 0x6b, 0x3f, 0x8e, 0x60, 0xb3, 0xd6, 0xaa, 0xe1, 0x5a, + 0xfb, 0x2c, 0x82, 0xcd, 0x5a, 0xab, 0x86, 0x6b, 0xed, 0x7f, 0x22, 0xd8, 0xac, 0xb5, 0x6a, 0xb8, + 0xd6, 0xfe, 0x37, 0x82, 0xcd, 0x5a, 0x5b, 0x0e, 0xd7, 0xda, 0xff, 0x85, 0xb3, 0x97, 0x17, 0x7f, + 0x12, 0x00, 0x00, 0xff, 0xff, 0x40, 0x32, 0xb7, 0xac, 0x57, 0x39, 0x00, 0x00, } diff --git a/vendor/github.com/gogo/protobuf/proto/testdata/test.proto b/vendor/github.com/gogo/protobuf/proto/testdata/test.proto index 698c8ce..70e3cfc 100644 --- a/vendor/github.com/gogo/protobuf/proto/testdata/test.proto +++ b/vendor/github.com/gogo/protobuf/proto/testdata/test.proto @@ -169,6 +169,13 @@ message GoTest { }; } +// For testing a group containing a required field. +message GoTestRequiredGroupField { + required group Group = 1 { + required int32 Field = 2; + }; +} + // For testing skipping of unrecognized fields. // Numbers are all big, larger than tag numbers in GoTestField, // the message used in the corresponding test. @@ -237,6 +244,10 @@ message OtherMessage { extensions 100 to max; } +message RequiredInnerMessage { + required InnerMessage leo_finally_won_an_oscar = 1; +} + message MyMessage { required int32 count = 1; optional string name = 2; @@ -244,6 +255,7 @@ message MyMessage { repeated string pet = 4; optional InnerMessage inner = 5; repeated OtherMessage others = 6; + optional RequiredInnerMessage we_must_go_deeper = 13; repeated InnerMessage rep_inner = 12; enum Color { @@ -483,6 +495,7 @@ message GroupNew { message FloatingPoint { required double f = 1; + optional bool exact = 2; } message MessageWithMap { diff --git a/vendor/github.com/gogo/protobuf/proto/text.go b/vendor/github.com/gogo/protobuf/proto/text.go index e2b99b1..9a04909 100644 --- a/vendor/github.com/gogo/protobuf/proto/text.go +++ b/vendor/github.com/gogo/protobuf/proto/text.go @@ -159,7 +159,7 @@ func (w *textWriter) indent() { w.ind++ } func (w *textWriter) unindent() { if w.ind == 0 { - log.Printf("proto: textWriter unindented too far") + log.Print("proto: textWriter unindented too far") return } w.ind-- @@ -335,7 +335,8 @@ func writeStruct(w *textWriter, sv reflect.Value) error { } inner := fv.Elem().Elem() // interface -> *T -> T tag := inner.Type().Field(0).Tag.Get("protobuf") - props.Parse(tag) // Overwrite the outer props. + props = new(Properties) // Overwrite the outer props var, but not its pointee. + props.Parse(tag) // Write the value in the oneof, not the oneof itself. fv = inner.Field(0) @@ -727,7 +728,14 @@ func (w *textWriter) writeIndent() { w.complete = false } -func marshalText(w io.Writer, pb Message, compact bool) error { +// TextMarshaler is a configurable text format marshaler. +type TextMarshaler struct { + Compact bool // use compact text format (one line). +} + +// Marshal writes a given protocol buffer in text format. +// The only errors returned are from w. +func (m *TextMarshaler) Marshal(w io.Writer, pb Message) error { val := reflect.ValueOf(pb) if pb == nil || val.IsNil() { w.Write([]byte("")) @@ -742,7 +750,7 @@ func marshalText(w io.Writer, pb Message, compact bool) error { aw := &textWriter{ w: ww, complete: true, - compact: compact, + compact: m.Compact, } if tm, ok := pb.(encoding.TextMarshaler); ok { @@ -769,25 +777,29 @@ func marshalText(w io.Writer, pb Message, compact bool) error { return nil } +// Text is the same as Marshal, but returns the string directly. +func (m *TextMarshaler) Text(pb Message) string { + var buf bytes.Buffer + m.Marshal(&buf, pb) + return buf.String() +} + +var ( + defaultTextMarshaler = TextMarshaler{} + compactTextMarshaler = TextMarshaler{Compact: true} +) + +// TODO: consider removing some of the Marshal functions below. + // MarshalText writes a given protocol buffer in text format. // The only errors returned are from w. -func MarshalText(w io.Writer, pb Message) error { - return marshalText(w, pb, false) -} +func MarshalText(w io.Writer, pb Message) error { return defaultTextMarshaler.Marshal(w, pb) } // MarshalTextString is the same as MarshalText, but returns the string directly. -func MarshalTextString(pb Message) string { - var buf bytes.Buffer - marshalText(&buf, pb, false) - return buf.String() -} +func MarshalTextString(pb Message) string { return defaultTextMarshaler.Text(pb) } // CompactText writes a given protocol buffer in compact text format (one line). -func CompactText(w io.Writer, pb Message) error { return marshalText(w, pb, true) } +func CompactText(w io.Writer, pb Message) error { return compactTextMarshaler.Marshal(w, pb) } // CompactTextString is the same as CompactText, but returns the string directly. -func CompactTextString(pb Message) string { - var buf bytes.Buffer - marshalText(&buf, pb, true) - return buf.String() -} +func CompactTextString(pb Message) string { return compactTextMarshaler.Text(pb) } diff --git a/vendor/github.com/gogo/protobuf/proto/text_parser.go b/vendor/github.com/gogo/protobuf/proto/text_parser.go index 61b4bc8..2940578 100644 --- a/vendor/github.com/gogo/protobuf/proto/text_parser.go +++ b/vendor/github.com/gogo/protobuf/proto/text_parser.go @@ -571,8 +571,9 @@ func (p *textParser) readStruct(sv reflect.Value, terminator string) error { // The map entry should be this sequence of tokens: // < key : KEY value : VALUE > - // Technically the "key" and "value" could come in any order, - // but in practice they won't. + // However, implementations may omit key or value, and technically + // we should support them in any order. See b/28924776 for a time + // this went wrong. tok := p.next() var terminator string @@ -584,32 +585,39 @@ func (p *textParser) readStruct(sv reflect.Value, terminator string) error { default: return p.errorf("expected '{' or '<', found %q", tok.value) } - if err := p.consumeToken("key"); err != nil { - return err - } - if err := p.consumeToken(":"); err != nil { - return err - } - if err := p.readAny(key, props.mkeyprop); err != nil { - return err - } - if err := p.consumeOptionalSeparator(); err != nil { - return err - } - if err := p.consumeToken("value"); err != nil { - return err - } - if err := p.checkForColon(props.mvalprop, dst.Type().Elem()); err != nil { - return err - } - if err := p.readAny(val, props.mvalprop); err != nil { - return err - } - if err := p.consumeOptionalSeparator(); err != nil { - return err - } - if err := p.consumeToken(terminator); err != nil { - return err + for { + tok := p.next() + if tok.err != nil { + return tok.err + } + if tok.value == terminator { + break + } + switch tok.value { + case "key": + if err := p.consumeToken(":"); err != nil { + return err + } + if err := p.readAny(key, props.mkeyprop); err != nil { + return err + } + if err := p.consumeOptionalSeparator(); err != nil { + return err + } + case "value": + if err := p.checkForColon(props.mvalprop, dst.Type().Elem()); err != nil { + return err + } + if err := p.readAny(val, props.mvalprop); err != nil { + return err + } + if err := p.consumeOptionalSeparator(); err != nil { + return err + } + default: + p.back() + return p.errorf(`expected "key", "value", or %q, found %q`, terminator, tok.value) + } } dst.SetMapIndex(key, val) @@ -632,7 +640,8 @@ func (p *textParser) readStruct(sv reflect.Value, terminator string) error { return err } reqFieldErr = err - } else if props.Required { + } + if props.Required { reqCount-- } diff --git a/vendor/github.com/gogo/protobuf/proto/text_parser_test.go b/vendor/github.com/gogo/protobuf/proto/text_parser_test.go index 72fe408..2ba7253 100644 --- a/vendor/github.com/gogo/protobuf/proto/text_parser_test.go +++ b/vendor/github.com/gogo/protobuf/proto/text_parser_test.go @@ -336,6 +336,16 @@ var unMarshalTextTests = []UnmarshalTextTest{ }, }, + // Missing required field in a required submessage + { + in: `count: 42 we_must_go_deeper < leo_finally_won_an_oscar <> >`, + err: `proto: required field "testdata.InnerMessage.host" not set`, + out: &MyMessage{ + Count: Int32(42), + WeMustGoDeeper: &RequiredInnerMessage{LeoFinallyWonAnOscar: &InnerMessage{}}, + }, + }, + // Repeated non-repeated field { in: `name: "Rob" name: "Russ"`, @@ -498,7 +508,10 @@ func TestMapParsing(t *testing.T) { const in = `name_mapping: name_mapping:` + `msg_mapping:,>` + // separating commas are okay `msg_mapping>` + // no colon after "value" - `byte_mapping:` + `msg_mapping:>` + // omitted key + `msg_mapping:` + // omitted value + `byte_mapping:` + + `byte_mapping:<>` // omitted key and value want := &MessageWithMap{ NameMapping: map[int32]string{ 1: "Beatles", @@ -507,9 +520,12 @@ func TestMapParsing(t *testing.T) { MsgMapping: map[int64]*FloatingPoint{ -4: {F: Float64(2.0)}, -2: {F: Float64(4.0)}, + 0: {F: Float64(5.0)}, + 1: nil, }, ByteMapping: map[bool][]byte{ - true: []byte("so be it"), + false: nil, + true: []byte("so be it"), }, } if err := UnmarshalText(in, m); err != nil { diff --git a/vendor/github.com/google/go-github/github/activity_notifications.go b/vendor/github.com/google/go-github/github/activity_notifications.go index 8890388..b538a7b 100644 --- a/vendor/github.com/google/go-github/github/activity_notifications.go +++ b/vendor/github.com/google/go-github/github/activity_notifications.go @@ -96,20 +96,17 @@ func (s *ActivityService) ListRepositoryNotifications(owner, repo string, opt *N } type markReadOptions struct { - LastReadAt time.Time `url:"last_read_at,omitempty"` + LastReadAt time.Time `json:"last_read_at,omitempty"` } // MarkNotificationsRead marks all notifications up to lastRead as read. // // GitHub API Docs: https://developer.github.com/v3/activity/notifications/#mark-as-read func (s *ActivityService) MarkNotificationsRead(lastRead time.Time) (*Response, error) { - u := fmt.Sprintf("notifications") - u, err := addOptions(u, markReadOptions{lastRead}) - if err != nil { - return nil, err + opts := &markReadOptions{ + LastReadAt: lastRead, } - - req, err := s.client.NewRequest("PUT", u, nil) + req, err := s.client.NewRequest("PUT", "notifications", opts) if err != nil { return nil, err } @@ -122,13 +119,11 @@ func (s *ActivityService) MarkNotificationsRead(lastRead time.Time) (*Response, // // GitHub API Docs: https://developer.github.com/v3/activity/notifications/#mark-notifications-as-read-in-a-repository func (s *ActivityService) MarkRepositoryNotificationsRead(owner, repo string, lastRead time.Time) (*Response, error) { - u := fmt.Sprintf("repos/%v/%v/notifications", owner, repo) - u, err := addOptions(u, markReadOptions{lastRead}) - if err != nil { - return nil, err + opts := &markReadOptions{ + LastReadAt: lastRead, } - - req, err := s.client.NewRequest("PUT", u, nil) + u := fmt.Sprintf("repos/%v/%v/notifications", owner, repo) + req, err := s.client.NewRequest("PUT", u, opts) if err != nil { return nil, err } diff --git a/vendor/github.com/google/go-github/github/activity_notifications_test.go b/vendor/github.com/google/go-github/github/activity_notifications_test.go index 81b4ffa..8f6a581 100644 --- a/vendor/github.com/google/go-github/github/activity_notifications_test.go +++ b/vendor/github.com/google/go-github/github/activity_notifications_test.go @@ -73,9 +73,8 @@ func TestActivityService_MarkNotificationsRead(t *testing.T) { mux.HandleFunc("/notifications", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PUT") - testFormValues(t, r, values{ - "last_read_at": "2006-01-02T15:04:05Z", - }) + testHeader(t, r, "Content-Type", "application/json") + testBody(t, r, `{"last_read_at":"2006-01-02T15:04:05Z"}`+"\n") w.WriteHeader(http.StatusResetContent) }) @@ -92,9 +91,8 @@ func TestActivityService_MarkRepositoryNotificationsRead(t *testing.T) { mux.HandleFunc("/repos/o/r/notifications", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PUT") - testFormValues(t, r, values{ - "last_read_at": "2006-01-02T15:04:05Z", - }) + testHeader(t, r, "Content-Type", "application/json") + testBody(t, r, `{"last_read_at":"2006-01-02T15:04:05Z"}`+"\n") w.WriteHeader(http.StatusResetContent) }) diff --git a/vendor/github.com/google/go-github/github/github.go b/vendor/github.com/google/go-github/github/github.go index 4faf09c..591bc54 100644 --- a/vendor/github.com/google/go-github/github/github.go +++ b/vendor/github.com/google/go-github/github/github.go @@ -81,6 +81,9 @@ const ( // https://developer.github.com/changes/2016-04-21-oauth-authorizations-grants-api-preview/ mediaTypeOAuthGrantAuthorizationsPreview = "application/vnd.github.damage-preview+json" + + // https://developer.github.com/changes/2016-07-06-github-pages-preiew-api/ + mediaTypePagesPreview = "application/vnd.github.mister-fantastic-preview+json" ) // A Client manages communication with the GitHub API. @@ -220,9 +223,12 @@ func (c *Client) NewRequest(method, urlStr string, body interface{}) (*http.Requ return nil, err } - req.Header.Add("Accept", mediaTypeV3) + if body != nil { + req.Header.Set("Content-Type", "application/json") + } + req.Header.Set("Accept", mediaTypeV3) if c.UserAgent != "" { - req.Header.Add("User-Agent", c.UserAgent) + req.Header.Set("User-Agent", c.UserAgent) } return req, nil } @@ -243,12 +249,12 @@ func (c *Client) NewUploadRequest(urlStr string, reader io.Reader, size int64, m } req.ContentLength = size - if len(mediaType) == 0 { + if mediaType == "" { mediaType = defaultMediaType } - req.Header.Add("Content-Type", mediaType) - req.Header.Add("Accept", mediaTypeV3) - req.Header.Add("User-Agent", c.UserAgent) + req.Header.Set("Content-Type", mediaType) + req.Header.Set("Accept", mediaTypeV3) + req.Header.Set("User-Agent", c.UserAgent) return req, nil } @@ -756,7 +762,7 @@ func (t *BasicAuthTransport) RoundTrip(req *http.Request) (*http.Response, error req = cloneRequest(req) // per RoundTrip contract req.SetBasicAuth(t.Username, t.Password) if t.OTP != "" { - req.Header.Add(headerOTP, t.OTP) + req.Header.Set(headerOTP, t.OTP) } return t.transport().RoundTrip(req) } diff --git a/vendor/github.com/google/go-github/github/github_test.go b/vendor/github.com/google/go-github/github/github_test.go index 39b0766..e166bb0 100644 --- a/vendor/github.com/google/go-github/github/github_test.go +++ b/vendor/github.com/google/go-github/github/github_test.go @@ -101,7 +101,7 @@ func testFormValues(t *testing.T, r *http.Request, values values) { func testHeader(t *testing.T, r *http.Request, header string, want string) { if got := r.Header.Get(header); got != want { - t.Errorf("Header.Get(%q) returned %s, want %s", header, got, want) + t.Errorf("Header.Get(%q) returned %q, want %q", header, got, want) } } diff --git a/vendor/github.com/google/go-github/github/repos_pages.go b/vendor/github.com/google/go-github/github/repos_pages.go index 8594edc..ccd24f3 100644 --- a/vendor/github.com/google/go-github/github/repos_pages.go +++ b/vendor/github.com/google/go-github/github/repos_pages.go @@ -13,6 +13,7 @@ type Pages struct { Status *string `json:"status,omitempty"` CNAME *string `json:"cname,omitempty"` Custom404 *bool `json:"custom_404,omitempty"` + HTMLURL *string `json:"html_url,omitempty"` } // PagesError represents a build error for a GitHub Pages site. @@ -42,6 +43,9 @@ func (s *RepositoriesService) GetPagesInfo(owner string, repo string) (*Pages, * return nil, nil, err } + // TODO: remove custom Accept header when this API fully launches. + req.Header.Set("Accept", mediaTypePagesPreview) + site := new(Pages) resp, err := s.client.Do(req, site) if err != nil { @@ -88,3 +92,25 @@ func (s *RepositoriesService) GetLatestPagesBuild(owner string, repo string) (*P return build, resp, err } + +// RequestPageBuild requests a build of a GitHub Pages site without needing to push new commit. +// +// GitHub API docs: https://developer.github.com/v3/repos/pages/#request-a-page-build +func (s *RepositoriesService) RequestPageBuild(owner string, repo string) (*PagesBuild, *Response, error) { + u := fmt.Sprintf("repos/%v/%v/pages/builds", owner, repo) + req, err := s.client.NewRequest("POST", u, nil) + if err != nil { + return nil, nil, err + } + + // TODO: remove custom Accept header when this API fully launches. + req.Header.Set("Accept", mediaTypePagesPreview) + + build := new(PagesBuild) + resp, err := s.client.Do(req, build) + if err != nil { + return nil, resp, err + } + + return build, resp, err +} diff --git a/vendor/github.com/google/go-github/github/repos_pages_test.go b/vendor/github.com/google/go-github/github/repos_pages_test.go index 2bfd8f6..830d77f 100644 --- a/vendor/github.com/google/go-github/github/repos_pages_test.go +++ b/vendor/github.com/google/go-github/github/repos_pages_test.go @@ -18,7 +18,8 @@ func TestRepositoriesService_GetPagesInfo(t *testing.T) { mux.HandleFunc("/repos/o/r/pages", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") - fmt.Fprint(w, `{"url":"u","status":"s","cname":"c","custom_404":false}`) + testHeader(t, r, "Accept", mediaTypePagesPreview) + fmt.Fprint(w, `{"url":"u","status":"s","cname":"c","custom_404":false,"html_url":"h"}`) }) page, _, err := client.Repositories.GetPagesInfo("o", "r") @@ -26,7 +27,7 @@ func TestRepositoriesService_GetPagesInfo(t *testing.T) { t.Errorf("Repositories.GetPagesInfo returned error: %v", err) } - want := &Pages{URL: String("u"), Status: String("s"), CNAME: String("c"), Custom404: Bool(false)} + want := &Pages{URL: String("u"), Status: String("s"), CNAME: String("c"), Custom404: Bool(false), HTMLURL: String("h")} if !reflect.DeepEqual(page, want) { t.Errorf("Repositories.GetPagesInfo returned %+v, want %+v", page, want) } @@ -71,3 +72,24 @@ func TestRepositoriesService_GetLatestPagesBuild(t *testing.T) { t.Errorf("Repositories.GetLatestPagesBuild returned %+v, want %+v", build, want) } } + +func TestRepositoriesService_RequestPageBuild(t *testing.T) { + setup() + defer teardown() + + mux.HandleFunc("/repos/o/r/pages/builds", func(w http.ResponseWriter, r *http.Request) { + testMethod(t, r, "POST") + testHeader(t, r, "Accept", mediaTypePagesPreview) + fmt.Fprint(w, `{"url":"u","status":"s"}`) + }) + + build, _, err := client.Repositories.RequestPageBuild("o", "r") + if err != nil { + t.Errorf("Repositories.RequestPageBuild returned error: %v", err) + } + + want := &PagesBuild{URL: String("u"), Status: String("s")} + if !reflect.DeepEqual(build, want) { + t.Errorf("Repositories.RequestPageBuild returned %+v, want %+v", build, want) + } +} diff --git a/vendor/github.com/gorilla/mux/README.md b/vendor/github.com/gorilla/mux/README.md index 960ef7c..93091e4 100644 --- a/vendor/github.com/gorilla/mux/README.md +++ b/vendor/github.com/gorilla/mux/README.md @@ -118,7 +118,7 @@ Then register routes in the subrouter: ```go s.HandleFunc("/products/", ProductsHandler) s.HandleFunc("/products/{key}", ProductHandler) -s.HandleFunc("/articles/{category}/{id:[0-9]+}"), ArticleHandler) +s.HandleFunc("/articles/{category}/{id:[0-9]+}", ArticleHandler) ``` The three URL paths we registered above will only be tested if the domain is `www.example.com`, because the subrouter is tested first. This is not only convenient, but also optimizes request matching. You can create subrouters combining any attribute matchers accepted by a route. diff --git a/vendor/github.com/pkg/errors/README.md b/vendor/github.com/pkg/errors/README.md index 6ea6422..273db3c 100644 --- a/vendor/github.com/pkg/errors/README.md +++ b/vendor/github.com/pkg/errors/README.md @@ -2,6 +2,8 @@ Package errors provides simple error handling primitives. +`go get github.com/pkg/errors` + The traditional error handling idiom in Go is roughly akin to ```go if err != nil { diff --git a/vendor/github.com/pkg/errors/errors.go b/vendor/github.com/pkg/errors/errors.go index 6c45c8d..71f1431 100644 --- a/vendor/github.com/pkg/errors/errors.go +++ b/vendor/github.com/pkg/errors/errors.go @@ -28,7 +28,7 @@ // to reverse the operation of errors.Wrap to retrieve the original error // for inspection. Any error value which implements this interface // -// type Causer interface { +// type causer interface { // Cause() error // } // @@ -43,6 +43,9 @@ // // unknown error // } // +// causer interface is not exported by this package, but is considered a part +// of stable public API. +// // Formatted printing of errors // // All error values returned from this package implement fmt.Formatter and can @@ -77,6 +80,9 @@ // } // } // +// stackTracer interface is not exported by this package, but is considered a part +// of stable public API. +// // See the documentation for Frame.Format for more details. package errors @@ -191,7 +197,7 @@ func Wrapf(err error, format string, args ...interface{}) error { // An error value has a cause if it implements the following // interface: // -// type Causer interface { +// type causer interface { // Cause() error // } // diff --git a/vendor/github.com/spf13/cobra/.travis.yml b/vendor/github.com/spf13/cobra/.travis.yml index 2bbf623..6e84be5 100644 --- a/vendor/github.com/spf13/cobra/.travis.yml +++ b/vendor/github.com/spf13/cobra/.travis.yml @@ -2,7 +2,7 @@ language: go go: - 1.4.3 - 1.5.4 - - 1.6.2 + - 1.6.3 - tip matrix: diff --git a/vendor/github.com/spf13/cobra/command.go b/vendor/github.com/spf13/cobra/command.go index 5b64187..083e4ea 100644 --- a/vendor/github.com/spf13/cobra/command.go +++ b/vendor/github.com/spf13/cobra/command.go @@ -214,6 +214,13 @@ func (c *Command) UsageFunc() (f func(*Command) error) { } } +// Output the usage for the command +// Used when a user provides invalid input +// Can be defined by user by overriding UsageFunc +func (c *Command) Usage() error { + return c.UsageFunc()(c) +} + // HelpFunc returns either the function set by SetHelpFunc for this command // or a parent, or it returns a function with default help behavior func (c *Command) HelpFunc() func(*Command, []string) { @@ -233,11 +240,19 @@ func (c *Command) HelpFunc() func(*Command, []string) { } } +// Output the help for the command +// Used when a user calls help [command] +// Can be defined by user by overriding HelpFunc +func (c *Command) Help() error { + c.HelpFunc()(c, []string{}) + return nil +} + func (c *Command) UsageString() string { tmpOutput := c.output bb := new(bytes.Buffer) c.SetOutput(bb) - c.UsageFunc()(c) + c.Usage() c.output = tmpOutput return bb.String() } @@ -720,9 +735,9 @@ func (c *Command) initHelpCmd() { cmd, _, e := c.Root().Find(args) if cmd == nil || e != nil { c.Printf("Unknown help topic %#q.", args) - c.Root().UsageFunc()(cmd) + c.Root().Usage() } else { - cmd.HelpFunc()(cmd, args) + cmd.Help() } }, } diff --git a/vendor/github.com/spf13/pflag/.travis.yml b/vendor/github.com/spf13/pflag/.travis.yml index 780c7ff..580ad22 100644 --- a/vendor/github.com/spf13/pflag/.travis.yml +++ b/vendor/github.com/spf13/pflag/.travis.yml @@ -3,8 +3,8 @@ sudo: false language: go go: - - 1.5 - - 1.6 + - 1.5.4 + - 1.6.3 - tip install: diff --git a/vendor/github.com/spf13/viper/.travis.yml b/vendor/github.com/spf13/viper/.travis.yml index 4bb6878..f27ab60 100644 --- a/vendor/github.com/spf13/viper/.travis.yml +++ b/vendor/github.com/spf13/viper/.travis.yml @@ -2,7 +2,7 @@ language: go go: - 1.4.3 - 1.5.4 - - 1.6.2 + - 1.6.3 - tip os: 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 5bd8c2b..548a9b9 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{ diff --git a/vendor/golang.org/x/crypto/ssh/terminal/util.go b/vendor/golang.org/x/crypto/ssh/terminal/util.go index 0763c9a..7e60b31 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/net/http2/client_conn_pool.go b/vendor/golang.org/x/net/http2/client_conn_pool.go index 547e238..cb34cc2 100644 --- a/vendor/golang.org/x/net/http2/client_conn_pool.go +++ b/vendor/golang.org/x/net/http2/client_conn_pool.go @@ -53,7 +53,7 @@ const ( ) func (p *clientConnPool) getClientConn(req *http.Request, addr string, dialOnMiss bool) (*ClientConn, error) { - if req.Close && dialOnMiss { + if isConnectionCloseRequest(req) && dialOnMiss { // It gets its own connection. cc, err := p.t.dialClientConn(addr) if err != nil { diff --git a/vendor/golang.org/x/net/http2/transport.go b/vendor/golang.org/x/net/http2/transport.go index fb8dd99..2b1f3a4 100644 --- a/vendor/golang.org/x/net/http2/transport.go +++ b/vendor/golang.org/x/net/http2/transport.go @@ -747,30 +747,34 @@ func (cc *ClientConn) RoundTrip(req *http.Request) (*http.Response, error) { bodyWritten := false ctx := reqContext(req) + handleReadLoopResponse := func(re resAndError) (*http.Response, error) { + res := re.res + if re.err != nil || res.StatusCode > 299 { + // On error or status code 3xx, 4xx, 5xx, etc abort any + // ongoing write, assuming that the server doesn't care + // about our request body. If the server replied with 1xx or + // 2xx, however, then assume the server DOES potentially + // want our body (e.g. full-duplex streaming: + // golang.org/issue/13444). If it turns out the server + // doesn't, they'll RST_STREAM us soon enough. This is a + // heuristic to avoid adding knobs to Transport. Hopefully + // we can keep it. + bodyWriter.cancel() + cs.abortRequestBodyWrite(errStopReqBodyWrite) + } + if re.err != nil { + cc.forgetStreamID(cs.ID) + return nil, re.err + } + res.Request = req + res.TLS = cc.tlsState + return res, nil + } + for { select { case re := <-readLoopResCh: - res := re.res - if re.err != nil || res.StatusCode > 299 { - // On error or status code 3xx, 4xx, 5xx, etc abort any - // ongoing write, assuming that the server doesn't care - // about our request body. If the server replied with 1xx or - // 2xx, however, then assume the server DOES potentially - // want our body (e.g. full-duplex streaming: - // golang.org/issue/13444). If it turns out the server - // doesn't, they'll RST_STREAM us soon enough. This is a - // heuristic to avoid adding knobs to Transport. Hopefully - // we can keep it. - bodyWriter.cancel() - cs.abortRequestBodyWrite(errStopReqBodyWrite) - } - if re.err != nil { - cc.forgetStreamID(cs.ID) - return nil, re.err - } - res.Request = req - res.TLS = cc.tlsState - return res, nil + return handleReadLoopResponse(re) case <-respHeaderTimer: cc.forgetStreamID(cs.ID) if !hasBody || bodyWritten { @@ -804,6 +808,12 @@ func (cc *ClientConn) RoundTrip(req *http.Request) (*http.Response, error) { // forgetStreamID. return nil, cs.resetErr case err := <-bodyWriter.resc: + // Prefer the read loop's response, if available. Issue 16102. + select { + case re := <-readLoopResCh: + return handleReadLoopResponse(re) + default: + } if err != nil { return nil, err } @@ -1593,7 +1603,7 @@ func (rl *clientConnReadLoop) endStreamError(cs *clientStream, err error) { } cs.bufPipe.closeWithErrorAndCode(err, code) delete(rl.activeRes, cs.ID) - if cs.req.Close || cs.req.Header.Get("Connection") == "close" { + if isConnectionCloseRequest(cs.req) { rl.closeWhenIdle = true } } @@ -1866,3 +1876,9 @@ func (s bodyWriterState) scheduleBodyWrite() { s.timer.Reset(s.delay) } } + +// isConnectionCloseRequest reports whether req should use its own +// connection for a single request and then close the connection. +func isConnectionCloseRequest(req *http.Request) bool { + return req.Close || httplex.HeaderValuesContainsToken(req.Header["Connection"], "close") +} diff --git a/vendor/google.golang.org/grpc/call.go b/vendor/google.golang.org/grpc/call.go index 84ac178..d6326ea 100644 --- a/vendor/google.golang.org/grpc/call.go +++ b/vendor/google.golang.org/grpc/call.go @@ -90,7 +90,10 @@ func sendRequest(ctx context.Context, codec Codec, compressor Compressor, callHd return nil, transport.StreamErrorf(codes.Internal, "grpc: %v", err) } err = t.Write(stream, outBuf, opts) - if err != nil { + // t.NewStream(...) could lead to an early rejection of the RPC (e.g., the service/method + // does not exist.) so that t.Write could get io.EOF from wait(...). Leave the following + // recvResponse to get the final status. + if err != nil && err != io.EOF { return nil, err } // Sent successfully. diff --git a/vendor/google.golang.org/grpc/clientconn_test.go b/vendor/google.golang.org/grpc/clientconn_test.go index 29db8bf..71ba45e 100644 --- a/vendor/google.golang.org/grpc/clientconn_test.go +++ b/vendor/google.golang.org/grpc/clientconn_test.go @@ -73,7 +73,7 @@ func TestCredentialsMisuse(t *testing.T) { t.Fatalf("Failed to create authenticator %v", err) } // Two conflicting credential configurations - if _, err := Dial("Non-Existent.Server:80", WithTransportCredentials(tlsCreds), WithTimeout(time.Millisecond), WithBlock(), WithInsecure()); err != errCredentialsConflict { + if _, err := Dial("Non-Existent.Server:80", WithTransportCredentials(tlsCreds), WithBlock(), WithInsecure()); err != errCredentialsConflict { t.Fatalf("Dial(_, _) = _, %v, want _, %v", err, errCredentialsConflict) } rpcCreds, err := oauth.NewJWTAccessFromKey(nil) @@ -81,7 +81,7 @@ func TestCredentialsMisuse(t *testing.T) { t.Fatalf("Failed to create credentials %v", err) } // security info on insecure connection - if _, err := Dial("Non-Existent.Server:80", WithPerRPCCredentials(rpcCreds), WithTimeout(time.Millisecond), WithBlock(), WithInsecure()); err != errTransportCredentialsMissing { + if _, err := Dial("Non-Existent.Server:80", WithPerRPCCredentials(rpcCreds), WithBlock(), WithInsecure()); err != errTransportCredentialsMissing { t.Fatalf("Dial(_, _) = _, %v, want _, %v", err, errTransportCredentialsMissing) } } @@ -123,4 +123,5 @@ func testBackoffConfigSet(t *testing.T, expected *BackoffConfig, opts ...DialOpt if actual != *expected { t.Fatalf("unexpected backoff config on connection: %v, want %v", actual, expected) } + conn.Close() } diff --git a/vendor/google.golang.org/grpc/stream.go b/vendor/google.golang.org/grpc/stream.go index 7a3bef5..4c3136c 100644 --- a/vendor/google.golang.org/grpc/stream.go +++ b/vendor/google.golang.org/grpc/stream.go @@ -84,12 +84,9 @@ type ClientStream interface { // Header returns the header metadata received from the server if there // is any. It blocks if the metadata is not ready to read. Header() (metadata.MD, error) - // Trailer returns the trailer metadata from the server. It must be called - // after stream.Recv() returns non-nil error (including io.EOF) for - // bi-directional streaming and server streaming or stream.CloseAndRecv() - // returns for client streaming in order to receive trailer metadata if - // present. Otherwise, it could returns an empty MD even though trailer - // is present. + // Trailer returns the trailer metadata from the server, if there is any. + // It must only be called after stream.CloseAndRecv has returned, or + // stream.Recv has returned a non-nil error (including io.EOF). Trailer() metadata.MD // CloseSend closes the send direction of the stream. It closes the stream // when non-nil error is met. @@ -183,12 +180,21 @@ func NewClientStream(ctx context.Context, desc *StreamDesc, cc *ClientConn, meth cs.t = t cs.s = s cs.p = &parser{r: s} - // Listen on ctx.Done() to detect cancellation when there is no pending - // I/O operations on this stream. + // Listen on ctx.Done() to detect cancellation and s.Done() to detect normal termination + // when there is no pending I/O operations on this stream. go func() { select { case <-t.Error(): // Incur transport error, simply exit. + case <-s.Done(): + // TODO: The trace of the RPC is terminated here when there is no pending + // I/O, which is probably not the optimal solution. + if s.StatusCode() == codes.OK { + cs.finish(nil) + } else { + cs.finish(Errorf(s.StatusCode(), "%s", s.StatusDesc())) + } + cs.closeTransportStream(nil) case <-s.Context().Done(): err := s.Context().Err() cs.finish(err) @@ -251,7 +257,17 @@ func (cs *clientStream) SendMsg(m interface{}) (err error) { if err != nil { cs.finish(err) } - if err == nil || err == io.EOF { + if err == nil { + return + } + if err == io.EOF { + // Specialize the process for server streaming. SendMesg is only called + // once when creating the stream object. io.EOF needs to be skipped when + // the rpc is early finished (before the stream object is created.). + // TODO: It is probably better to move this into the generated code. + if !cs.desc.ClientStreams && cs.desc.ServerStreams { + err = nil + } return } if _, ok := err.(transport.ConnectionError); !ok { @@ -326,7 +342,7 @@ func (cs *clientStream) CloseSend() (err error) { } }() if err == nil || err == io.EOF { - return + return nil } if _, ok := err.(transport.ConnectionError); !ok { cs.closeTransportStream(err) diff --git a/vendor/google.golang.org/grpc/test/end2end_test.go b/vendor/google.golang.org/grpc/test/end2end_test.go index cc8bae5..fdac581 100644 --- a/vendor/google.golang.org/grpc/test/end2end_test.go +++ b/vendor/google.golang.org/grpc/test/end2end_test.go @@ -90,7 +90,8 @@ var ( var raceMode bool // set by race_test.go in race mode type testServer struct { - security string // indicate the authentication protocol used by this server. + security string // indicate the authentication protocol used by this server. + earlyFail bool // whether to error out the execution of a service handler prematurely. } func (s *testServer) EmptyCall(ctx context.Context, in *testpb.Empty) (*testpb.Empty, error) { @@ -219,6 +220,9 @@ func (s *testServer) StreamingInputCall(stream testpb.TestService_StreamingInput } p := in.GetPayload().GetBody() sum += len(p) + if s.earlyFail { + return grpc.Errorf(codes.NotFound, "not found") + } } } @@ -404,10 +408,9 @@ func (te *test) tearDown() { // modify it before calling its startServer and clientConn methods. func newTest(t *testing.T, e env) *test { te := &test{ - t: t, - e: e, - testServer: &testServer{security: e.security}, - maxStream: math.MaxUint32, + t: t, + e: e, + maxStream: math.MaxUint32, } te.ctx, te.cancel = context.WithCancel(context.Background()) return te @@ -415,7 +418,8 @@ func newTest(t *testing.T, e env) *test { // startServer starts a gRPC server listening. Callers should defer a // call to te.tearDown to clean up. -func (te *test) startServer() { +func (te *test) startServer(ts testpb.TestServiceServer) { + te.testServer = ts e := te.e te.t.Logf("Running test in %s environment...", e.name) sopts := []grpc.ServerOption{grpc.MaxConcurrentStreams(te.maxStream)} @@ -545,7 +549,7 @@ func testTimeoutOnDeadServer(t *testing.T, e env) { "grpc: Conn.resetTransport failed to create client transport: connection error", "grpc: Conn.resetTransport failed to create client transport: connection error: desc = \"transport: dial unix", ) - te.startServer() + te.startServer(&testServer{security: e.security}) defer te.tearDown() cc := te.clientConn() @@ -554,10 +558,7 @@ func testTimeoutOnDeadServer(t *testing.T, e env) { t.Fatalf("TestService/EmptyCall(_, _) = _, %v, want _, ", err) } te.srv.Stop() - // Set -1 as the timeout to make sure if transportMonitor gets error - // notification in time the failure path of the 1st invoke of - // ClientConn.wait hits the deadline exceeded error. - ctx, _ := context.WithTimeout(context.Background(), -1) + ctx, _ := context.WithTimeout(context.Background(), time.Millisecond) if _, err := tc.EmptyCall(ctx, &testpb.Empty{}, grpc.FailFast(false)); grpc.Code(err) != codes.DeadlineExceeded { t.Fatalf("TestService/EmptyCall(%v, _) = _, %v, want _, error code: %d", ctx, err, codes.DeadlineExceeded) } @@ -580,7 +581,7 @@ func testFailFast(t *testing.T, e env) { "grpc: Conn.resetTransport failed to create client transport: connection error", "grpc: Conn.resetTransport failed to create client transport: connection error: desc = \"transport: dial unix", ) - te.startServer() + te.startServer(&testServer{security: e.security}) defer te.tearDown() cc := te.clientConn() @@ -629,7 +630,7 @@ func testHealthCheckOnSuccess(t *testing.T, e env) { hs := health.NewHealthServer() hs.SetServingStatus("grpc.health.v1.Health", 1) te.healthServer = hs - te.startServer() + te.startServer(&testServer{security: e.security}) defer te.tearDown() cc := te.clientConn() @@ -655,7 +656,7 @@ func testHealthCheckOnFailure(t *testing.T, e env) { hs := health.NewHealthServer() hs.SetServingStatus("grpc.health.v1.HealthCheck", 1) te.healthServer = hs - te.startServer() + te.startServer(&testServer{security: e.security}) defer te.tearDown() cc := te.clientConn() @@ -679,7 +680,7 @@ func TestHealthCheckOff(t *testing.T) { func testHealthCheckOff(t *testing.T, e env) { te := newTest(t, e) - te.startServer() + te.startServer(&testServer{security: e.security}) defer te.tearDown() want := grpc.Errorf(codes.Unimplemented, "unknown service grpc.health.v1.Health") if _, err := healthCheck(1*time.Second, te.clientConn(), ""); !equalErrors(err, want) { @@ -698,7 +699,7 @@ func testHealthCheckServingStatus(t *testing.T, e env) { te := newTest(t, e) hs := health.NewHealthServer() te.healthServer = hs - te.startServer() + te.startServer(&testServer{security: e.security}) defer te.tearDown() cc := te.clientConn() @@ -741,7 +742,7 @@ func TestErrorChanNoIO(t *testing.T) { func testErrorChanNoIO(t *testing.T, e env) { te := newTest(t, e) - te.startServer() + te.startServer(&testServer{security: e.security}) defer te.tearDown() tc := testpb.NewTestServiceClient(te.clientConn()) @@ -760,7 +761,7 @@ func TestEmptyUnaryWithUserAgent(t *testing.T) { func testEmptyUnaryWithUserAgent(t *testing.T, e env) { te := newTest(t, e) te.userAgent = testAppUA - te.startServer() + te.startServer(&testServer{security: e.security}) defer te.tearDown() cc := te.clientConn() @@ -786,7 +787,7 @@ func TestFailedEmptyUnary(t *testing.T) { func testFailedEmptyUnary(t *testing.T, e env) { te := newTest(t, e) - te.startServer() + te.startServer(&testServer{security: e.security}) defer te.tearDown() tc := testpb.NewTestServiceClient(te.clientConn()) @@ -806,7 +807,7 @@ func TestLargeUnary(t *testing.T) { func testLargeUnary(t *testing.T, e env) { te := newTest(t, e) - te.startServer() + te.startServer(&testServer{security: e.security}) defer te.tearDown() tc := testpb.NewTestServiceClient(te.clientConn()) @@ -843,7 +844,7 @@ func TestMetadataUnaryRPC(t *testing.T) { func testMetadataUnaryRPC(t *testing.T, e env) { te := newTest(t, e) - te.startServer() + te.startServer(&testServer{security: e.security}) defer te.tearDown() tc := testpb.NewTestServiceClient(te.clientConn()) @@ -889,7 +890,7 @@ func TestMalformedHTTP2Metadata(t *testing.T) { func testMalformedHTTP2Metadata(t *testing.T, e env) { te := newTest(t, e) - te.startServer() + te.startServer(&testServer{security: e.security}) defer te.tearDown() tc := testpb.NewTestServiceClient(te.clientConn()) @@ -951,7 +952,7 @@ func TestRetry(t *testing.T) { func testRetry(t *testing.T, e env) { te := newTest(t, e) te.declareLogNoise("transport: http2Client.notifyError got notified that the client transport was broken") - te.startServer() + te.startServer(&testServer{security: e.security}) defer te.tearDown() cc := te.clientConn() @@ -1000,7 +1001,7 @@ func TestRPCTimeout(t *testing.T) { // TODO(zhaoq): Have a better test coverage of timeout and cancellation mechanism. func testRPCTimeout(t *testing.T, e env) { te := newTest(t, e) - te.startServer() + te.startServer(&testServer{security: e.security}) defer te.tearDown() cc := te.clientConn() @@ -1037,7 +1038,7 @@ func TestCancel(t *testing.T) { func testCancel(t *testing.T, e env) { te := newTest(t, e) te.declareLogNoise("grpc: the client connection is closing; please retry") - te.startServer() + te.startServer(&testServer{security: e.security}) defer te.tearDown() cc := te.clientConn() @@ -1075,7 +1076,7 @@ func testCancelNoIO(t *testing.T, e env) { te := newTest(t, e) te.declareLogNoise("http2Client.notifyError got notified that the client transport was broken") te.maxStream = 1 // Only allows 1 live stream per server transport. - te.startServer() + te.startServer(&testServer{security: e.security}) defer te.tearDown() cc := te.clientConn() @@ -1145,8 +1146,7 @@ func TestNoService(t *testing.T) { func testNoService(t *testing.T, e env) { te := newTest(t, e) - te.testServer = nil // register nothing - te.startServer() + te.startServer(nil) defer te.tearDown() cc := te.clientConn() @@ -1170,7 +1170,7 @@ func TestPingPong(t *testing.T) { func testPingPong(t *testing.T, e env) { te := newTest(t, e) - te.startServer() + te.startServer(&testServer{security: e.security}) defer te.tearDown() tc := testpb.NewTestServiceClient(te.clientConn()) @@ -1230,7 +1230,7 @@ func TestMetadataStreamingRPC(t *testing.T) { func testMetadataStreamingRPC(t *testing.T, e env) { te := newTest(t, e) - te.startServer() + te.startServer(&testServer{security: e.security}) defer te.tearDown() tc := testpb.NewTestServiceClient(te.clientConn()) @@ -1301,7 +1301,7 @@ func TestServerStreaming(t *testing.T) { func testServerStreaming(t *testing.T, e env) { te := newTest(t, e) - te.startServer() + te.startServer(&testServer{security: e.security}) defer te.tearDown() tc := testpb.NewTestServiceClient(te.clientConn()) @@ -1356,7 +1356,7 @@ func TestFailedServerStreaming(t *testing.T) { func testFailedServerStreaming(t *testing.T, e env) { te := newTest(t, e) - te.startServer() + te.startServer(&testServer{security: e.security}) defer te.tearDown() tc := testpb.NewTestServiceClient(te.clientConn()) @@ -1412,8 +1412,7 @@ func TestServerStreaming_Concurrent(t *testing.T) { func testServerStreaming_Concurrent(t *testing.T, e env) { te := newTest(t, e) - te.testServer = concurrentSendServer{} - te.startServer() + te.startServer(concurrentSendServer{}) defer te.tearDown() cc := te.clientConn() @@ -1471,7 +1470,7 @@ func TestClientStreaming(t *testing.T) { func testClientStreaming(t *testing.T, e env) { te := newTest(t, e) - te.startServer() + te.startServer(&testServer{security: e.security}) defer te.tearDown() tc := testpb.NewTestServiceClient(te.clientConn()) @@ -1504,6 +1503,46 @@ func testClientStreaming(t *testing.T, e env) { } } +func TestClientStreamingError(t *testing.T) { + defer leakCheck(t)() + for _, e := range listTestEnv() { + testClientStreamingError(t, e) + } +} + +func testClientStreamingError(t *testing.T, e env) { + te := newTest(t, e) + te.startServer(&testServer{security: e.security, earlyFail: true}) + defer te.tearDown() + tc := testpb.NewTestServiceClient(te.clientConn()) + + stream, err := tc.StreamingInputCall(te.ctx) + if err != nil { + t.Fatalf("%v.StreamingInputCall(_) = _, %v, want ", tc, err) + } + payload, err := newPayload(testpb.PayloadType_COMPRESSABLE, 1) + if err != nil { + t.Fatal(err) + } + + req := &testpb.StreamingInputCallRequest{ + Payload: payload, + } + // The 1st request should go through. + if err := stream.Send(req); err != nil { + t.Fatalf("%v.Send(%v) = %v, want ", stream, req, err) + } + for { + if err := stream.Send(req); err != io.EOF { + continue + } + if _, err := stream.CloseAndRecv(); grpc.Code(err) != codes.NotFound { + t.Fatalf("%v.CloseAndRecv() = %v, want error %d", stream, err, codes.NotFound) + } + break + } +} + func TestExceedMaxStreamsLimit(t *testing.T) { defer leakCheck(t)() for _, e := range listTestEnv() { @@ -1519,7 +1558,7 @@ func testExceedMaxStreamsLimit(t *testing.T, e env) { "grpc: the client connection is closing", ) te.maxStream = 1 // Only allows 1 live stream per server transport. - te.startServer() + te.startServer(&testServer{security: e.security}) defer te.tearDown() cc := te.clientConn() @@ -1560,7 +1599,7 @@ func testStreamsQuotaRecovery(t *testing.T, e env) { "grpc: the client connection is closing", ) te.maxStream = 1 // Allows 1 live stream. - te.startServer() + te.startServer(&testServer{security: e.security}) defer te.tearDown() cc := te.clientConn() @@ -1611,7 +1650,7 @@ func testCompressServerHasNoSupport(t *testing.T, e env) { te := newTest(t, e) te.serverCompression = false te.clientCompression = true - te.startServer() + te.startServer(&testServer{security: e.security}) defer te.tearDown() tc := testpb.NewTestServiceClient(te.clientConn()) @@ -1667,7 +1706,7 @@ func testCompressOK(t *testing.T, e env) { te := newTest(t, e) te.serverCompression = true te.clientCompression = true - te.startServer() + te.startServer(&testServer{security: e.security}) defer te.tearDown() tc := testpb.NewTestServiceClient(te.clientConn()) @@ -1730,7 +1769,7 @@ func errInjector(ctx context.Context, req interface{}, info *grpc.UnaryServerInf func testUnaryServerInterceptor(t *testing.T, e env) { te := newTest(t, e) te.unaryInt = errInjector - te.startServer() + te.startServer(&testServer{security: e.security}) defer te.tearDown() tc := testpb.NewTestServiceClient(te.clientConn()) @@ -1761,7 +1800,7 @@ func fullDuplexOnly(srv interface{}, ss grpc.ServerStream, info *grpc.StreamServ func testStreamServerInterceptor(t *testing.T, e env) { te := newTest(t, e) te.streamInt = fullDuplexOnly - te.startServer() + te.startServer(&testServer{security: e.security}) defer te.tearDown() tc := testpb.NewTestServiceClient(te.clientConn()) @@ -1825,12 +1864,12 @@ func TestClientRequestBodyError_UnexpectedEOF(t *testing.T) { func testClientRequestBodyError_UnexpectedEOF(t *testing.T, e env) { te := newTest(t, e) - te.testServer = &funcServer{unaryCall: func(ctx context.Context, in *testpb.SimpleRequest) (*testpb.SimpleResponse, error) { + ts := &funcServer{unaryCall: func(ctx context.Context, in *testpb.SimpleRequest) (*testpb.SimpleResponse, error) { errUnexpectedCall := errors.New("unexpected call func server method") t.Error(errUnexpectedCall) return nil, errUnexpectedCall }} - te.startServer() + te.startServer(ts) defer te.tearDown() te.withServerTester(func(st *serverTester) { st.writeHeadersGRPC(1, "/grpc.testing.TestService/UnaryCall") @@ -1850,12 +1889,12 @@ func TestClientRequestBodyError_CloseAfterLength(t *testing.T) { func testClientRequestBodyError_CloseAfterLength(t *testing.T, e env) { te := newTest(t, e) te.declareLogNoise("Server.processUnaryRPC failed to write status") - te.testServer = &funcServer{unaryCall: func(ctx context.Context, in *testpb.SimpleRequest) (*testpb.SimpleResponse, error) { + ts := &funcServer{unaryCall: func(ctx context.Context, in *testpb.SimpleRequest) (*testpb.SimpleResponse, error) { errUnexpectedCall := errors.New("unexpected call func server method") t.Error(errUnexpectedCall) return nil, errUnexpectedCall }} - te.startServer() + te.startServer(ts) defer te.tearDown() te.withServerTester(func(st *serverTester) { st.writeHeadersGRPC(1, "/grpc.testing.TestService/UnaryCall") @@ -1875,11 +1914,11 @@ func TestClientRequestBodyError_Cancel(t *testing.T) { func testClientRequestBodyError_Cancel(t *testing.T, e env) { te := newTest(t, e) gotCall := make(chan bool, 1) - te.testServer = &funcServer{unaryCall: func(ctx context.Context, in *testpb.SimpleRequest) (*testpb.SimpleResponse, error) { + ts := &funcServer{unaryCall: func(ctx context.Context, in *testpb.SimpleRequest) (*testpb.SimpleResponse, error) { gotCall <- true return new(testpb.SimpleResponse), nil }} - te.startServer() + te.startServer(ts) defer te.tearDown() te.withServerTester(func(st *serverTester) { st.writeHeadersGRPC(1, "/grpc.testing.TestService/UnaryCall") @@ -1912,12 +1951,12 @@ func TestClientRequestBodyError_Cancel_StreamingInput(t *testing.T) { func testClientRequestBodyError_Cancel_StreamingInput(t *testing.T, e env) { te := newTest(t, e) recvErr := make(chan error, 1) - te.testServer = &funcServer{streamingInputCall: func(stream testpb.TestService_StreamingInputCallServer) error { + ts := &funcServer{streamingInputCall: func(stream testpb.TestService_StreamingInputCallServer) error { _, err := stream.Recv() recvErr <- err return nil }} - te.startServer() + te.startServer(ts) defer te.tearDown() te.withServerTester(func(st *serverTester) { st.writeHeadersGRPC(1, "/grpc.testing.TestService/StreamingInputCall") diff --git a/vendor/google.golang.org/grpc/transport/http2_client.go b/vendor/google.golang.org/grpc/transport/http2_client.go index f66435f..4f22be0 100644 --- a/vendor/google.golang.org/grpc/transport/http2_client.go +++ b/vendor/google.golang.org/grpc/transport/http2_client.go @@ -202,6 +202,7 @@ func (t *http2Client) newStream(ctx context.Context, callHdr *CallHdr) *Stream { // TODO(zhaoq): Handle uint32 overflow of Stream.id. s := &Stream{ id: t.nextID, + done: make(chan struct{}), method: callHdr.Method, sendCompress: callHdr.SendCompress, buf: newRecvBuffer(), @@ -278,7 +279,7 @@ func (t *http2Client) NewStream(ctx context.Context, callHdr *CallHdr) (_ *Strea checkStreamsQuota := t.streamsQuota != nil t.mu.Unlock() if checkStreamsQuota { - sq, err := wait(ctx, t.shutdownChan, t.streamsQuota.acquire()) + sq, err := wait(ctx, nil, t.shutdownChan, t.streamsQuota.acquire()) if err != nil { return nil, err } @@ -287,7 +288,7 @@ func (t *http2Client) NewStream(ctx context.Context, callHdr *CallHdr) (_ *Strea t.streamsQuota.add(sq - 1) } } - if _, err := wait(ctx, t.shutdownChan, t.writableChan); err != nil { + if _, err := wait(ctx, nil, t.shutdownChan, t.writableChan); err != nil { // Return the quota back now because there is no stream returned to the caller. if _, ok := err.(StreamError); ok && checkStreamsQuota { t.streamsQuota.add(1) @@ -414,11 +415,6 @@ func (t *http2Client) CloseStream(s *Stream, err error) { if updateStreams { t.streamsQuota.add(1) } - // In case stream sending and receiving are invoked in separate - // goroutines (e.g., bi-directional streaming), the caller needs - // to call cancel on the stream to interrupt the blocking on - // other goroutines. - s.cancel() s.mu.Lock() if q := s.fc.resetPendingData(); q > 0 { if n := t.fc.onRead(q); n > 0 { @@ -504,15 +500,15 @@ func (t *http2Client) Write(s *Stream, data []byte, opts *Options) error { size := http2MaxFrameLen s.sendQuotaPool.add(0) // Wait until the stream has some quota to send the data. - sq, err := wait(s.ctx, t.shutdownChan, s.sendQuotaPool.acquire()) + sq, err := wait(s.ctx, s.done, t.shutdownChan, s.sendQuotaPool.acquire()) if err != nil { return err } t.sendQuotaPool.add(0) // Wait until the transport has some quota to send the data. - tq, err := wait(s.ctx, t.shutdownChan, t.sendQuotaPool.acquire()) + tq, err := wait(s.ctx, s.done, t.shutdownChan, t.sendQuotaPool.acquire()) if err != nil { - if _, ok := err.(StreamError); ok { + if _, ok := err.(StreamError); ok || err == io.EOF { t.sendQuotaPool.cancel() } return err @@ -544,8 +540,8 @@ func (t *http2Client) Write(s *Stream, data []byte, opts *Options) error { // Indicate there is a writer who is about to write a data frame. t.framer.adjustNumWriters(1) // Got some quota. Try to acquire writing privilege on the transport. - if _, err := wait(s.ctx, t.shutdownChan, t.writableChan); err != nil { - if _, ok := err.(StreamError); ok { + if _, err := wait(s.ctx, s.done, t.shutdownChan, t.writableChan); err != nil { + if _, ok := err.(StreamError); ok || err == io.EOF { // Return the connection quota back. t.sendQuotaPool.add(len(p)) } @@ -593,11 +589,7 @@ func (t *http2Client) Write(s *Stream, data []byte, opts *Options) error { } s.mu.Lock() if s.state != streamDone { - if s.state == streamReadDone { - s.state = streamDone - } else { - s.state = streamWriteDone - } + s.state = streamWriteDone } s.mu.Unlock() return nil @@ -655,6 +647,7 @@ func (t *http2Client) handleData(f *http2.DataFrame) { s.state = streamDone s.statusCode = codes.Internal s.statusDesc = err.Error() + close(s.done) s.mu.Unlock() s.write(recvMsg{err: io.EOF}) t.controlBuf.put(&resetStream{s.id, http2.ErrCodeFlowControl}) @@ -672,13 +665,14 @@ func (t *http2Client) handleData(f *http2.DataFrame) { // the read direction is closed, and set the status appropriately. if f.FrameHeader.Flags.Has(http2.FlagDataEndStream) { s.mu.Lock() - if s.state == streamWriteDone { - s.state = streamDone - } else { - s.state = streamReadDone + if s.state == streamDone { + s.mu.Unlock() + return } + s.state = streamDone s.statusCode = codes.Internal s.statusDesc = "server closed the stream without sending trailers" + close(s.done) s.mu.Unlock() s.write(recvMsg{err: io.EOF}) } @@ -704,6 +698,7 @@ func (t *http2Client) handleRSTStream(f *http2.RSTStreamFrame) { grpclog.Println("transport: http2Client.handleRSTStream found no mapped gRPC status for the received http2 error ", f.ErrCode) s.statusCode = codes.Unknown } + close(s.done) s.mu.Unlock() s.write(recvMsg{err: io.EOF}) } @@ -780,11 +775,11 @@ func (t *http2Client) operateHeaders(frame *http2.MetaHeadersFrame) { if len(state.mdata) > 0 { s.trailer = state.mdata } - s.state = streamDone s.statusCode = state.statusCode s.statusDesc = state.statusDesc + close(s.done) + s.state = streamDone s.mu.Unlock() - s.write(recvMsg{err: io.EOF}) } diff --git a/vendor/google.golang.org/grpc/transport/http2_server.go b/vendor/google.golang.org/grpc/transport/http2_server.go index cee1542..9e35fdd 100644 --- a/vendor/google.golang.org/grpc/transport/http2_server.go +++ b/vendor/google.golang.org/grpc/transport/http2_server.go @@ -364,11 +364,7 @@ func (t *http2Server) handleData(f *http2.DataFrame) { // Received the end of stream from the client. s.mu.Lock() if s.state != streamDone { - if s.state == streamWriteDone { - s.state = streamDone - } else { - s.state = streamReadDone - } + s.state = streamReadDone } s.mu.Unlock() s.write(recvMsg{err: io.EOF}) @@ -455,7 +451,7 @@ func (t *http2Server) WriteHeader(s *Stream, md metadata.MD) error { } s.headerOk = true s.mu.Unlock() - if _, err := wait(s.ctx, t.shutdownChan, t.writableChan); err != nil { + if _, err := wait(s.ctx, nil, t.shutdownChan, t.writableChan); err != nil { return err } t.hBuf.Reset() @@ -495,7 +491,7 @@ func (t *http2Server) WriteStatus(s *Stream, statusCode codes.Code, statusDesc s headersSent = true } s.mu.Unlock() - if _, err := wait(s.ctx, t.shutdownChan, t.writableChan); err != nil { + if _, err := wait(s.ctx, nil, t.shutdownChan, t.writableChan); err != nil { return err } t.hBuf.Reset() @@ -544,7 +540,7 @@ func (t *http2Server) Write(s *Stream, data []byte, opts *Options) error { } s.mu.Unlock() if writeHeaderFrame { - if _, err := wait(s.ctx, t.shutdownChan, t.writableChan); err != nil { + if _, err := wait(s.ctx, nil, t.shutdownChan, t.writableChan); err != nil { return err } t.hBuf.Reset() @@ -572,13 +568,13 @@ func (t *http2Server) Write(s *Stream, data []byte, opts *Options) error { size := http2MaxFrameLen s.sendQuotaPool.add(0) // Wait until the stream has some quota to send the data. - sq, err := wait(s.ctx, t.shutdownChan, s.sendQuotaPool.acquire()) + sq, err := wait(s.ctx, nil, t.shutdownChan, s.sendQuotaPool.acquire()) if err != nil { return err } t.sendQuotaPool.add(0) // Wait until the transport has some quota to send the data. - tq, err := wait(s.ctx, t.shutdownChan, t.sendQuotaPool.acquire()) + tq, err := wait(s.ctx, nil, t.shutdownChan, t.sendQuotaPool.acquire()) if err != nil { if _, ok := err.(StreamError); ok { t.sendQuotaPool.cancel() @@ -604,7 +600,7 @@ func (t *http2Server) Write(s *Stream, data []byte, opts *Options) error { t.framer.adjustNumWriters(1) // Got some quota. Try to acquire writing privilege on the // transport. - if _, err := wait(s.ctx, t.shutdownChan, t.writableChan); err != nil { + if _, err := wait(s.ctx, nil, t.shutdownChan, t.writableChan); err != nil { if _, ok := err.(StreamError); ok { // Return the connection quota back. t.sendQuotaPool.add(ps) diff --git a/vendor/google.golang.org/grpc/transport/transport.go b/vendor/google.golang.org/grpc/transport/transport.go index 599f25d..6038fe4 100644 --- a/vendor/google.golang.org/grpc/transport/transport.go +++ b/vendor/google.golang.org/grpc/transport/transport.go @@ -158,7 +158,7 @@ const ( streamActive streamState = iota streamWriteDone // EndStream sent streamReadDone // EndStream received - streamDone // sendDone and recvDone or RSTStreamFrame is sent or received. + streamDone // the entire stream is finished. ) // Stream represents an RPC in the transport layer. @@ -169,6 +169,8 @@ type Stream struct { // ctx is the associated context of the stream. ctx context.Context cancel context.CancelFunc + // done is closed when the final status arrives. + done chan struct{} // method records the associated RPC method of the stream. method string recvCompress string @@ -214,6 +216,10 @@ func (s *Stream) SetSendCompress(str string) { s.sendCompress = str } +func (s *Stream) Done() <-chan struct{} { + return s.done +} + // Header acquires the key-value pairs of header metadata once it // is available. It blocks until i) the metadata is ready or ii) there is no // header metadata or iii) the stream is cancelled/expired. @@ -501,12 +507,22 @@ func ContextErr(err error) StreamError { // wait blocks until it can receive from ctx.Done, closing, or proceed. // If it receives from ctx.Done, it returns 0, the StreamError for ctx.Err. +// If it receives from done, it returns 0, io.EOF if ctx is not done; otherwise +// it return the StreamError for ctx.Err. // If it receives from closing, it returns 0, ErrConnClosing. // If it receives from proceed, it returns the received integer, nil. -func wait(ctx context.Context, closing <-chan struct{}, proceed <-chan int) (int, error) { +func wait(ctx context.Context, done, closing <-chan struct{}, proceed <-chan int) (int, error) { select { case <-ctx.Done(): return 0, ContextErr(ctx.Err()) + case <-done: + // User cancellation has precedence. + select { + case <-ctx.Done(): + return 0, ContextErr(ctx.Err()) + default: + } + return 0, io.EOF case <-closing: return 0, ErrConnClosing case i := <-proceed: diff --git a/vendor/google.golang.org/grpc/transport/transport_test.go b/vendor/google.golang.org/grpc/transport/transport_test.go index ce015da..5a517e0 100644 --- a/vendor/google.golang.org/grpc/transport/transport_test.go +++ b/vendor/google.golang.org/grpc/transport/transport_test.go @@ -433,14 +433,21 @@ func TestMaxStreams(t *testing.T) { } done := make(chan struct{}) ch := make(chan int) + ready := make(chan struct{}) go func() { for { select { case <-time.After(5 * time.Millisecond): - ch <- 0 + select { + case ch <- 0: + case <-ready: + return + } case <-time.After(5 * time.Second): close(done) return + case <-ready: + return } } }() @@ -467,6 +474,7 @@ func TestMaxStreams(t *testing.T) { } cc.mu.Unlock() } + close(ready) // Close the pending stream so that the streams quota becomes available for the next new stream. ct.CloseStream(s, nil) select { @@ -690,7 +698,8 @@ func TestClientWithMisbehavedServer(t *testing.T) { Host: "localhost", Method: "foo.MaxFrame", } - for i := 0; i < int(initialConnWindowSize/initialWindowSize+10); i++ { + // Make the server flood the traffic to violate flow control window size of the connection. + for { s, err := ct.NewStream(context.Background(), callHdr) if err != nil { break