Browse Source

Merge pull request #61 from tendermint/interface-fixes

Interface fixes
pull/1780/head
Ethan Buchman 7 years ago
committed by GitHub
parent
commit
2a3f638495
15 changed files with 233 additions and 295 deletions
  1. +3
    -3
      README.md
  2. +6
    -19
      client/local_client.go
  3. +17
    -17
      cmd/abci-cli/abci-cli.go
  4. +2
    -24
      example/block_aware/block_aware_app.go
  5. +0
    -0
      example/block_aware/block_aware_test.go
  6. +2
    -0
      example/counter/counter.go
  7. +2
    -4
      example/dummy/dummy.go
  8. +2
    -3
      example/dummy/dummy_test.go
  9. +4
    -5
      example/example_test.go
  10. +0
    -36
      example/nil/nil_app.go
  11. +4
    -12
      server/socket_server.go
  12. +22
    -46
      types/application.go
  13. +42
    -0
      types/base_app.go
  14. +124
    -123
      types/types.pb.go
  15. +3
    -3
      types/types.proto

+ 3
- 3
README.md View File

@ -76,16 +76,16 @@ ABCI requests/responses are simple Protobuf messages. Check out the [schema fil
* `Path (string)`: Path of request, like an HTTP GET path. Can be used with or in liue of Data. * `Path (string)`: Path of request, like an HTTP GET path. Can be used with or in liue of Data.
* Apps MUST interpret '/store' as a query by key on the underlying store. The key SHOULD be specified in the Data field. * Apps MUST interpret '/store' as a query by key on the underlying store. The key SHOULD be specified in the Data field.
* Apps SHOULD allow queries over specific types like '/accounts/...' or '/votes/...' * Apps SHOULD allow queries over specific types like '/accounts/...' or '/votes/...'
* `Height (uint64)`: The block height for which you want the query (default=0 returns data for the latest committed block)
* `LastHeight (uint64)`: The block height for which you want the query (default=0 returns data for the latest committed block). Note that the corresponding Merkle root hash will only be included in the header of the next block (ie. `LastHeight + 1`)
* `Prove (bool)`: Return Merkle proof with response if possible * `Prove (bool)`: Return Merkle proof with response if possible
* __Returns__: * __Returns__:
* `Code (uint32)`: Response code * `Code (uint32)`: Response code
* `Key ([]byte)`: The key of the matching data * `Key ([]byte)`: The key of the matching data
* `Value ([]byte)`: The value of the matching data * `Value ([]byte)`: The value of the matching data
* `Proof ([]byte)`: Proof for the data, if requested * `Proof ([]byte)`: Proof for the data, if requested
* `Height (uint64)`: The block height from which data was derived
* `LastHeight (uint64)`: The block height from which data was derived. The Merkle root for the proof is included in block `LastHeight + 1`
* `Log (string)`: Debug or error message * `Log (string)`: Debug or error message
*Please note* The current implementation of go-merkle doesn't support querying proofs from past blocks, so for the present moment, any height other than 0 will return an error. Hopefully this will be improved soon(ish)
*Please note* The current implementation of go-merkle doesn't support querying proofs from past blocks, so for the present moment, any height other than 0 will return an error (recall height=0 defaults to latest block). Hopefully this will be improved soon(ish)
#### Info #### Info
* __Returns__: * __Returns__:


+ 6
- 19
client/local_client.go View File

@ -111,9 +111,7 @@ func (app *localClient) CommitAsync() *ReqRes {
func (app *localClient) InitChainAsync(validators []*types.Validator) *ReqRes { func (app *localClient) InitChainAsync(validators []*types.Validator) *ReqRes {
app.mtx.Lock() app.mtx.Lock()
if bcApp, ok := app.Application.(types.BlockchainAware); ok {
bcApp.InitChain(validators)
}
app.Application.InitChain(validators)
reqRes := app.callback( reqRes := app.callback(
types.ToRequestInitChain(validators), types.ToRequestInitChain(validators),
types.ToResponseInitChain(), types.ToResponseInitChain(),
@ -124,9 +122,7 @@ func (app *localClient) InitChainAsync(validators []*types.Validator) *ReqRes {
func (app *localClient) BeginBlockAsync(hash []byte, header *types.Header) *ReqRes { func (app *localClient) BeginBlockAsync(hash []byte, header *types.Header) *ReqRes {
app.mtx.Lock() app.mtx.Lock()
if bcApp, ok := app.Application.(types.BlockchainAware); ok {
bcApp.BeginBlock(hash, header)
}
app.Application.BeginBlock(hash, header)
app.mtx.Unlock() app.mtx.Unlock()
return app.callback( return app.callback(
types.ToRequestBeginBlock(hash, header), types.ToRequestBeginBlock(hash, header),
@ -136,10 +132,7 @@ func (app *localClient) BeginBlockAsync(hash []byte, header *types.Header) *ReqR
func (app *localClient) EndBlockAsync(height uint64) *ReqRes { func (app *localClient) EndBlockAsync(height uint64) *ReqRes {
app.mtx.Lock() app.mtx.Lock()
var resEndBlock types.ResponseEndBlock
if bcApp, ok := app.Application.(types.BlockchainAware); ok {
resEndBlock = bcApp.EndBlock(height)
}
resEndBlock := app.Application.EndBlock(height)
app.mtx.Unlock() app.mtx.Unlock()
return app.callback( return app.callback(
types.ToRequestEndBlock(height), types.ToRequestEndBlock(height),
@ -201,27 +194,21 @@ func (app *localClient) CommitSync() (res types.Result) {
func (app *localClient) InitChainSync(validators []*types.Validator) (err error) { func (app *localClient) InitChainSync(validators []*types.Validator) (err error) {
app.mtx.Lock() app.mtx.Lock()
if bcApp, ok := app.Application.(types.BlockchainAware); ok {
bcApp.InitChain(validators)
}
app.Application.InitChain(validators)
app.mtx.Unlock() app.mtx.Unlock()
return nil return nil
} }
func (app *localClient) BeginBlockSync(hash []byte, header *types.Header) (err error) { func (app *localClient) BeginBlockSync(hash []byte, header *types.Header) (err error) {
app.mtx.Lock() app.mtx.Lock()
if bcApp, ok := app.Application.(types.BlockchainAware); ok {
bcApp.BeginBlock(hash, header)
}
app.Application.BeginBlock(hash, header)
app.mtx.Unlock() app.mtx.Unlock()
return nil return nil
} }
func (app *localClient) EndBlockSync(height uint64) (resEndBlock types.ResponseEndBlock, err error) { func (app *localClient) EndBlockSync(height uint64) (resEndBlock types.ResponseEndBlock, err error) {
app.mtx.Lock() app.mtx.Lock()
if bcApp, ok := app.Application.(types.BlockchainAware); ok {
resEndBlock = bcApp.EndBlock(height)
}
resEndBlock = app.Application.EndBlock(height)
app.mtx.Unlock() app.mtx.Unlock()
return resEndBlock, nil return resEndBlock, nil
} }


+ 17
- 17
cmd/abci-cli/abci-cli.go View File

@ -17,13 +17,13 @@ import (
// Structure for data passed to print response. // Structure for data passed to print response.
type response struct { type response struct {
Data []byte
Code types.CodeType
Key []byte
Value []byte
Log string
Height string
Proof []byte
Data []byte
Code types.CodeType
Key []byte
Value []byte
Log string
LastHeight string
Proof []byte
} }
// client is a global variable so it can be reused by the console // client is a global variable so it can be reused by the console
@ -299,20 +299,20 @@ func cmdQuery(c *cli.Context) error {
return err return err
} }
resQuery, err := client.QuerySync(types.RequestQuery{ resQuery, err := client.QuerySync(types.RequestQuery{
Data: queryBytes,
Path: "/store", // TOOD expose
Height: 0, // TODO expose
Data: queryBytes,
Path: "/store", // TOOD expose
LastHeight: 0, // TODO expose
//Prove: true, // TODO expose //Prove: true, // TODO expose
}) })
if err != nil { if err != nil {
return err return err
} }
printResponse(c, response{ printResponse(c, response{
Code: resQuery.Code,
Key: resQuery.Key,
Value: resQuery.Value,
Log: resQuery.Log,
Height: fmt.Sprintf("%v", resQuery.Height),
Code: resQuery.Code,
Key: resQuery.Key,
Value: resQuery.Value,
Log: resQuery.Log,
LastHeight: fmt.Sprintf("%v", resQuery.LastHeight),
//Proof: resQuery.Proof, //Proof: resQuery.Proof,
}) })
return nil return nil
@ -346,8 +346,8 @@ func printResponse(c *cli.Context, rsp response) {
if rsp.Log != "" { if rsp.Log != "" {
fmt.Printf("-> log: %s\n", rsp.Log) fmt.Printf("-> log: %s\n", rsp.Log)
} }
if rsp.Height != "" {
fmt.Printf("-> height: %s\n", rsp.Height)
if rsp.LastHeight != "" {
fmt.Printf("-> height: %s\n", rsp.LastHeight)
} }
if rsp.Proof != nil { if rsp.Proof != nil {
fmt.Printf("-> proof: %X\n", rsp.Proof) fmt.Printf("-> proof: %X\n", rsp.Proof)


example/chain_aware/chain_aware_app.go → example/block_aware/block_aware_app.go View File


example/chain_aware/chain_aware_test.go → example/block_aware/block_aware_test.go View File


+ 2
- 0
example/counter/counter.go View File

@ -9,6 +9,8 @@ import (
) )
type CounterApplication struct { type CounterApplication struct {
types.BaseApplication
hashCount int hashCount int
txCount int txCount int
serial bool serial bool


+ 2
- 4
example/dummy/dummy.go View File

@ -9,6 +9,8 @@ import (
) )
type DummyApplication struct { type DummyApplication struct {
types.BaseApplication
state merkle.Tree state merkle.Tree
} }
@ -21,10 +23,6 @@ func (app *DummyApplication) Info() (resInfo types.ResponseInfo) {
return types.ResponseInfo{Data: fmt.Sprintf("{\"size\":%v}", app.state.Size())} return types.ResponseInfo{Data: fmt.Sprintf("{\"size\":%v}", app.state.Size())}
} }
func (app *DummyApplication) SetOption(key string, value string) (log string) {
return ""
}
// tx is either "key=value" or just arbitrary bytes // tx is either "key=value" or just arbitrary bytes
func (app *DummyApplication) DeliverTx(tx []byte) types.Result { func (app *DummyApplication) DeliverTx(tx []byte) types.Result {
parts := strings.Split(string(tx), "=") parts := strings.Split(string(tx), "=")


+ 2
- 3
example/dummy/dummy_test.go View File

@ -180,14 +180,13 @@ func makeApplyBlock(t *testing.T, dummy types.Application, heightInt int, diff [
Height: height, Height: height,
} }
dummyChain := dummy.(types.BlockchainAware) // hmm...
dummyChain.BeginBlock(hash, header)
dummy.BeginBlock(hash, header)
for _, tx := range txs { for _, tx := range txs {
if r := dummy.DeliverTx(tx); r.IsErr() { if r := dummy.DeliverTx(tx); r.IsErr() {
t.Fatal(r) t.Fatal(r)
} }
} }
resEndBlock := dummyChain.EndBlock(height)
resEndBlock := dummy.EndBlock(height)
dummy.Commit() dummy.Commit()
valsEqual(t, diff, resEndBlock.Diffs) valsEqual(t, diff, resEndBlock.Diffs)


+ 4
- 5
example/example_test.go View File

@ -14,7 +14,6 @@ import (
"github.com/tendermint/abci/client" "github.com/tendermint/abci/client"
"github.com/tendermint/abci/example/dummy" "github.com/tendermint/abci/example/dummy"
nilapp "github.com/tendermint/abci/example/nil"
"github.com/tendermint/abci/server" "github.com/tendermint/abci/server"
"github.com/tendermint/abci/types" "github.com/tendermint/abci/types"
cmn "github.com/tendermint/go-common" cmn "github.com/tendermint/go-common"
@ -25,14 +24,14 @@ func TestDummy(t *testing.T) {
testStream(t, dummy.NewDummyApplication()) testStream(t, dummy.NewDummyApplication())
} }
func TestNilApp(t *testing.T) {
fmt.Println("### Testing NilApp")
testStream(t, nilapp.NewNilApplication())
func TestBaseApp(t *testing.T) {
fmt.Println("### Testing BaseApp")
testStream(t, types.NewBaseApplication())
} }
func TestGRPC(t *testing.T) { func TestGRPC(t *testing.T) {
fmt.Println("### Testing GRPC") fmt.Println("### Testing GRPC")
testGRPCSync(t, types.NewGRPCApplication(nilapp.NewNilApplication()))
testGRPCSync(t, types.NewGRPCApplication(types.NewBaseApplication()))
} }
func testStream(t *testing.T, app types.Application) { func testStream(t *testing.T, app types.Application) {


+ 0
- 36
example/nil/nil_app.go View File

@ -1,36 +0,0 @@
package nilapp
import (
"github.com/tendermint/abci/types"
)
type NilApplication struct {
}
func NewNilApplication() *NilApplication {
return &NilApplication{}
}
func (app *NilApplication) Info() (resInfo types.ResponseInfo) {
return
}
func (app *NilApplication) SetOption(key string, value string) (log string) {
return ""
}
func (app *NilApplication) DeliverTx(tx []byte) types.Result {
return types.NewResultOK(nil, "")
}
func (app *NilApplication) CheckTx(tx []byte) types.Result {
return types.NewResultOK(nil, "")
}
func (app *NilApplication) Commit() types.Result {
return types.NewResultOK([]byte("nil"), "")
}
func (app *NilApplication) Query(reqQuery types.RequestQuery) (resQuery types.ResponseQuery) {
return resQuery
}

+ 4
- 12
server/socket_server.go View File

@ -187,22 +187,14 @@ func (s *SocketServer) handleRequest(req *types.Request, responses chan<- *types
resQuery := s.app.Query(*r.Query) resQuery := s.app.Query(*r.Query)
responses <- types.ToResponseQuery(resQuery) responses <- types.ToResponseQuery(resQuery)
case *types.Request_InitChain: case *types.Request_InitChain:
if app, ok := s.app.(types.BlockchainAware); ok {
app.InitChain(r.InitChain.Validators)
}
s.app.InitChain(r.InitChain.Validators)
responses <- types.ToResponseInitChain() responses <- types.ToResponseInitChain()
case *types.Request_BeginBlock: case *types.Request_BeginBlock:
if app, ok := s.app.(types.BlockchainAware); ok {
app.BeginBlock(r.BeginBlock.Hash, r.BeginBlock.Header)
}
s.app.BeginBlock(r.BeginBlock.Hash, r.BeginBlock.Header)
responses <- types.ToResponseBeginBlock() responses <- types.ToResponseBeginBlock()
case *types.Request_EndBlock: case *types.Request_EndBlock:
if app, ok := s.app.(types.BlockchainAware); ok {
resEndBlock := app.EndBlock(r.EndBlock.Height)
responses <- types.ToResponseEndBlock(resEndBlock)
} else {
responses <- types.ToResponseEndBlock(types.ResponseEndBlock{})
}
resEndBlock := s.app.EndBlock(r.EndBlock.Height)
responses <- types.ToResponseEndBlock(resEndBlock)
default: default:
responses <- types.ToResponseException("Unknown request") responses <- types.ToResponseException("Unknown request")
} }


+ 22
- 46
types/application.go View File

@ -6,42 +6,25 @@ import (
// Applications // Applications
type Application interface { type Application interface {
// Return application info
Info() ResponseInfo
// Set application option (e.g. mode=mempool, mode=consensus)
SetOption(key string, value string) (log string)
// Deliver a tx
DeliverTx(tx []byte) Result
// Validate a tx for the mempool
CheckTx(tx []byte) Result
// Query for state
Query(reqQuery RequestQuery) ResponseQuery
// Return the application Merkle root hash
Commit() Result
}
// Some applications can choose to implement BlockchainAware
type BlockchainAware interface {
// Initialize blockchain
// validators: genesis validators from TendermintCore
InitChain(validators []*Validator)
// Signals the beginning of a block
BeginBlock(hash []byte, header *Header)
// Signals the end of a block
// diffs: changed validators from app to TendermintCore
EndBlock(height uint64) ResponseEndBlock
// Info/Query Connection
Info() ResponseInfo // Return application info
SetOption(key string, value string) (log string) // Set application option
Query(reqQuery RequestQuery) ResponseQuery // Query for state
// Mempool Connection
CheckTx(tx []byte) Result // Validate a tx for the mempool
// Consensus Connection
InitChain(validators []*Validator) // Initialize blockchain with validators from TendermintCore
BeginBlock(hash []byte, header *Header) // Signals the beginning of a block
DeliverTx(tx []byte) Result // Deliver a tx for full processing
EndBlock(height uint64) ResponseEndBlock // Signals the end of a block, returns changes to the validator set
Commit() Result // Commit the state and return the application Merkle root hash
} }
//------------------------------------ //------------------------------------
// GRPC wrapper for application
type GRPCApplication struct { type GRPCApplication struct {
app Application app Application
} }
@ -88,23 +71,16 @@ func (app *GRPCApplication) Commit(ctx context.Context, req *RequestCommit) (*Re
} }
func (app *GRPCApplication) InitChain(ctx context.Context, req *RequestInitChain) (*ResponseInitChain, error) { func (app *GRPCApplication) InitChain(ctx context.Context, req *RequestInitChain) (*ResponseInitChain, error) {
if chainAware, ok := app.app.(BlockchainAware); ok {
chainAware.InitChain(req.Validators)
}
return &ResponseInitChain{}, nil
app.app.InitChain(req.Validators)
return &ResponseInitChain{}, nil // NOTE: empty return
} }
func (app *GRPCApplication) BeginBlock(ctx context.Context, req *RequestBeginBlock) (*ResponseBeginBlock, error) { func (app *GRPCApplication) BeginBlock(ctx context.Context, req *RequestBeginBlock) (*ResponseBeginBlock, error) {
if chainAware, ok := app.app.(BlockchainAware); ok {
chainAware.BeginBlock(req.Hash, req.Header)
}
return &ResponseBeginBlock{}, nil
app.app.BeginBlock(req.Hash, req.Header)
return &ResponseBeginBlock{}, nil // NOTE: empty return
} }
func (app *GRPCApplication) EndBlock(ctx context.Context, req *RequestEndBlock) (*ResponseEndBlock, error) { func (app *GRPCApplication) EndBlock(ctx context.Context, req *RequestEndBlock) (*ResponseEndBlock, error) {
if chainAware, ok := app.app.(BlockchainAware); ok {
resEndBlock := chainAware.EndBlock(req.Height)
return &resEndBlock, nil
}
return &ResponseEndBlock{}, nil
resEndBlock := app.app.EndBlock(req.Height)
return &resEndBlock, nil
} }

+ 42
- 0
types/base_app.go View File

@ -0,0 +1,42 @@
package types
type BaseApplication struct {
}
func NewBaseApplication() *BaseApplication {
return &BaseApplication{}
}
func (app *BaseApplication) Info() (resInfo ResponseInfo) {
return
}
func (app *BaseApplication) SetOption(key string, value string) (log string) {
return ""
}
func (app *BaseApplication) DeliverTx(tx []byte) Result {
return NewResultOK(nil, "")
}
func (app *BaseApplication) CheckTx(tx []byte) Result {
return NewResultOK(nil, "")
}
func (app *BaseApplication) Commit() Result {
return NewResultOK([]byte("nil"), "")
}
func (app *BaseApplication) Query(reqQuery RequestQuery) (resQuery ResponseQuery) {
return
}
func (app *BaseApplication) InitChain(validators []*Validator) {
}
func (app *BaseApplication) BeginBlock(hash []byte, header *Header) {
}
func (app *BaseApplication) EndBlock(height uint64) (resEndBlock ResponseEndBlock) {
return
}

+ 124
- 123
types/types.pb.go View File

@ -716,10 +716,10 @@ func (m *RequestCheckTx) GetTx() []byte {
} }
type RequestQuery struct { type RequestQuery struct {
Data []byte `protobuf:"bytes,1,opt,name=data,proto3" json:"data,omitempty"`
Path string `protobuf:"bytes,2,opt,name=path" json:"path,omitempty"`
Height uint64 `protobuf:"varint,3,opt,name=height" json:"height,omitempty"`
Prove bool `protobuf:"varint,4,opt,name=prove" json:"prove,omitempty"`
Data []byte `protobuf:"bytes,1,opt,name=data,proto3" json:"data,omitempty"`
Path string `protobuf:"bytes,2,opt,name=path" json:"path,omitempty"`
LastHeight uint64 `protobuf:"varint,3,opt,name=last_height,json=lastHeight" json:"last_height,omitempty"`
Prove bool `protobuf:"varint,4,opt,name=prove" json:"prove,omitempty"`
} }
func (m *RequestQuery) Reset() { *m = RequestQuery{} } func (m *RequestQuery) Reset() { *m = RequestQuery{} }
@ -741,9 +741,9 @@ func (m *RequestQuery) GetPath() string {
return "" return ""
} }
func (m *RequestQuery) GetHeight() uint64 {
func (m *RequestQuery) GetLastHeight() uint64 {
if m != nil { if m != nil {
return m.Height
return m.LastHeight
} }
return 0 return 0
} }
@ -1411,13 +1411,13 @@ func (m *ResponseCheckTx) GetLog() string {
} }
type ResponseQuery struct { type ResponseQuery struct {
Code CodeType `protobuf:"varint,1,opt,name=code,enum=types.CodeType" json:"code,omitempty"`
Index int64 `protobuf:"varint,2,opt,name=index" json:"index,omitempty"`
Key []byte `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"`
Value []byte `protobuf:"bytes,4,opt,name=value,proto3" json:"value,omitempty"`
Proof []byte `protobuf:"bytes,5,opt,name=proof,proto3" json:"proof,omitempty"`
Height uint64 `protobuf:"varint,6,opt,name=height" json:"height,omitempty"`
Log string `protobuf:"bytes,7,opt,name=log" json:"log,omitempty"`
Code CodeType `protobuf:"varint,1,opt,name=code,enum=types.CodeType" json:"code,omitempty"`
Index int64 `protobuf:"varint,2,opt,name=index" json:"index,omitempty"`
Key []byte `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"`
Value []byte `protobuf:"bytes,4,opt,name=value,proto3" json:"value,omitempty"`
Proof []byte `protobuf:"bytes,5,opt,name=proof,proto3" json:"proof,omitempty"`
LastHeight uint64 `protobuf:"varint,6,opt,name=last_height,json=lastHeight" json:"last_height,omitempty"`
Log string `protobuf:"bytes,7,opt,name=log" json:"log,omitempty"`
} }
func (m *ResponseQuery) Reset() { *m = ResponseQuery{} } func (m *ResponseQuery) Reset() { *m = ResponseQuery{} }
@ -1460,9 +1460,9 @@ func (m *ResponseQuery) GetProof() []byte {
return nil return nil
} }
func (m *ResponseQuery) GetHeight() uint64 {
func (m *ResponseQuery) GetLastHeight() uint64 {
if m != nil { if m != nil {
return m.Height
return m.LastHeight
} }
return 0 return 0
} }
@ -2129,112 +2129,113 @@ var _ABCIApplication_serviceDesc = grpc.ServiceDesc{
func init() { proto.RegisterFile("types/types.proto", fileDescriptor0) } func init() { proto.RegisterFile("types/types.proto", fileDescriptor0) }
var fileDescriptor0 = []byte{ var fileDescriptor0 = []byte{
// 1711 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xac, 0x58, 0x4b, 0x6f, 0xe4, 0xc6,
0x11, 0x16, 0xe7, 0x3d, 0x35, 0xd2, 0xa8, 0x55, 0x1a, 0x49, 0xd4, 0x24, 0x87, 0x05, 0x03, 0xc7,
0xda, 0x8d, 0xb3, 0x1b, 0xc8, 0x70, 0xb0, 0x8a, 0x83, 0x00, 0xd2, 0xae, 0xbc, 0x1a, 0x18, 0xde,
0x55, 0xe8, 0xb5, 0x2f, 0x09, 0x32, 0xa0, 0x86, 0x3d, 0x33, 0x8c, 0xa8, 0x26, 0x97, 0x6c, 0xca,
0x52, 0x7e, 0x83, 0xef, 0xf9, 0x09, 0xb9, 0x07, 0xc8, 0x29, 0xf7, 0x00, 0x79, 0x3f, 0x7e, 0x51,
0xd0, 0x0f, 0x3e, 0x45, 0x1a, 0x3e, 0xf8, 0x32, 0x60, 0x3d, 0xbb, 0xab, 0xba, 0xea, 0xeb, 0xea,
0x81, 0x1d, 0x7e, 0x1f, 0xd2, 0xf8, 0x99, 0xfc, 0x7d, 0x1a, 0x46, 0x01, 0x0f, 0xb0, 0x2b, 0x09,
0xeb, 0x2f, 0x1d, 0xe8, 0xdb, 0xf4, 0x5d, 0x42, 0x63, 0x8e, 0x47, 0xd0, 0xa1, 0x8b, 0x75, 0x60,
0x1a, 0x8f, 0x8c, 0xa3, 0xd1, 0x31, 0x3e, 0x55, 0xea, 0x5a, 0x7a, 0xbe, 0x58, 0x07, 0x17, 0x1b,
0xb6, 0xd4, 0xc0, 0x1f, 0x41, 0x77, 0xe9, 0x27, 0xf1, 0xda, 0x6c, 0x49, 0xd5, 0xdd, 0xb2, 0xea,
0x27, 0x42, 0x74, 0xb1, 0x61, 0x2b, 0x1d, 0xe1, 0xd6, 0x63, 0xcb, 0xc0, 0x6c, 0xd7, 0xb9, 0x9d,
0xb1, 0xa5, 0x74, 0x2b, 0x34, 0xf0, 0x39, 0x40, 0x4c, 0xf9, 0x3c, 0x08, 0xb9, 0x17, 0x30, 0xb3,
0x23, 0xf5, 0x0f, 0xca, 0xfa, 0x9f, 0x53, 0xfe, 0x46, 0x8a, 0x2f, 0x36, 0xec, 0x61, 0x9c, 0x12,
0xc2, 0xd2, 0xa5, 0xbe, 0x77, 0x4b, 0xa3, 0x39, 0xbf, 0x33, 0xbb, 0x75, 0x96, 0x2f, 0x95, 0xfc,
0xed, 0x9d, 0xb0, 0x74, 0x53, 0x02, 0x8f, 0x61, 0xb0, 0x58, 0xd3, 0xc5, 0xb5, 0xb0, 0xeb, 0x49,
0xbb, 0xbd, 0xb2, 0xdd, 0x0b, 0x21, 0x95, 0x56, 0xfd, 0x85, 0xfa, 0xc4, 0xa7, 0xd0, 0x5b, 0x04,
0x37, 0x37, 0x1e, 0x37, 0xfb, 0xd2, 0x62, 0x52, 0xb1, 0x90, 0xb2, 0x8b, 0x0d, 0x5b, 0x6b, 0x89,
0x74, 0xbd, 0x4b, 0x68, 0x74, 0x6f, 0x0e, 0xea, 0xd2, 0xf5, 0x4b, 0x21, 0x12, 0xe9, 0x92, 0x3a,
0x22, 0x14, 0x8f, 0x79, 0x7c, 0xbe, 0x58, 0x3b, 0x1e, 0x33, 0x87, 0x75, 0xa1, 0xcc, 0x98, 0xc7,
0x5f, 0x08, 0xb1, 0x08, 0xc5, 0x4b, 0x09, 0xfc, 0x18, 0x46, 0x57, 0x74, 0xe5, 0xb1, 0xf9, 0x95,
0x1f, 0x2c, 0xae, 0x4d, 0x90, 0xa6, 0x66, 0xd9, 0xf4, 0x4c, 0x28, 0x9c, 0x09, 0xf9, 0xc5, 0x86,
0x0d, 0x57, 0x19, 0x85, 0x1f, 0xc1, 0x90, 0x32, 0x57, 0x9b, 0x8e, 0xa4, 0xe9, 0x7e, 0xa5, 0x02,
0x98, 0x9b, 0x1a, 0x0e, 0xa8, 0xfe, 0x3e, 0xeb, 0x43, 0xf7, 0xd6, 0xf1, 0x13, 0x6a, 0xbd, 0x0f,
0xa3, 0x42, 0xa5, 0xa0, 0x09, 0xfd, 0x1b, 0x1a, 0xc7, 0xce, 0x8a, 0xca, 0x72, 0x1a, 0xda, 0x29,
0x69, 0x8d, 0x61, 0xb3, 0x58, 0x27, 0xd6, 0x56, 0x66, 0x28, 0x6a, 0xc1, 0xfa, 0x19, 0x90, 0xea,
0x51, 0x23, 0x81, 0xf6, 0x35, 0xbd, 0xd7, 0x8e, 0xc4, 0x27, 0x4e, 0xf4, 0xb2, 0xb2, 0x00, 0x87,
0xb6, 0xde, 0x83, 0x95, 0xd9, 0x66, 0x87, 0x8d, 0x63, 0x68, 0xf1, 0x3b, 0x69, 0xba, 0x69, 0xb7,
0xf8, 0x9d, 0xf5, 0x08, 0xc6, 0xe5, 0x83, 0x7d, 0xa0, 0xe1, 0x66, 0x1b, 0x94, 0x27, 0x83, 0x08,
0x1d, 0xd7, 0xe1, 0x8e, 0xd6, 0x90, 0xdf, 0x82, 0x17, 0x3a, 0x7c, 0xad, 0x97, 0x97, 0xdf, 0xb8,
0x0f, 0xbd, 0x35, 0xf5, 0x56, 0x6b, 0x2e, 0x2b, 0xbd, 0x63, 0x6b, 0x4a, 0xec, 0x35, 0x8c, 0x82,
0x5b, 0x2a, 0x0b, 0x7a, 0x60, 0x2b, 0xc2, 0xda, 0x86, 0xad, 0x52, 0xb9, 0x58, 0x2f, 0xb3, 0xcd,
0x67, 0xc7, 0x8b, 0x3f, 0x01, 0xb8, 0x75, 0x7c, 0xcf, 0x75, 0x78, 0x10, 0xc5, 0xa6, 0xf1, 0xa8,
0x7d, 0x34, 0x3a, 0x26, 0xfa, 0x54, 0xbe, 0x4c, 0x05, 0x76, 0x41, 0xc7, 0x7a, 0x0d, 0x3b, 0x0f,
0x4e, 0x5a, 0xec, 0x76, 0xed, 0xc4, 0xeb, 0x34, 0x02, 0xf1, 0x8d, 0xef, 0x89, 0xdd, 0x3a, 0x2e,
0x8d, 0x74, 0x0f, 0x6f, 0x69, 0xb7, 0x17, 0x92, 0x69, 0x6b, 0xa1, 0xf5, 0x18, 0xb6, 0x2b, 0xc7,
0x5f, 0x88, 0xd3, 0x28, 0xc6, 0x69, 0x7d, 0xdd, 0x85, 0x81, 0x4d, 0xe3, 0x30, 0x60, 0x31, 0xc5,
0xe7, 0x30, 0xa4, 0x77, 0x0b, 0xaa, 0x3a, 0xd9, 0xa8, 0x54, 0xa2, 0xd2, 0x39, 0x4f, 0xe5, 0xa2,
0x8a, 0x33, 0x65, 0x7c, 0xac, 0x51, 0xa8, 0x0a, 0x2d, 0xda, 0xa8, 0x08, 0x43, 0x1f, 0xa4, 0x30,
0xd4, 0xae, 0xb4, 0xa1, 0xd2, 0xad, 0xe0, 0xd0, 0x63, 0x8d, 0x43, 0x9d, 0x5a, 0xc7, 0x25, 0x20,
0x3a, 0x29, 0x01, 0x51, 0xb7, 0x76, 0xfb, 0x0d, 0x48, 0x74, 0x52, 0x42, 0xa2, 0x5e, 0xad, 0x69,
0x03, 0x14, 0x7d, 0x58, 0x80, 0xa2, 0x7e, 0xa5, 0x03, 0x95, 0x61, 0x0d, 0x16, 0x3d, 0xcb, 0xb0,
0x68, 0x50, 0x41, 0x2f, 0x6d, 0x52, 0x05, 0xa3, 0x0f, 0x52, 0x30, 0x1a, 0xd6, 0x26, 0xad, 0x82,
0x46, 0x27, 0x25, 0x34, 0x82, 0xda, 0x70, 0x1a, 0xe0, 0xe8, 0xe7, 0x65, 0x38, 0x52, 0x98, 0x72,
0x58, 0xb1, 0x6d, 0xc4, 0xa3, 0x9f, 0x16, 0xf1, 0x68, 0xb3, 0x82, 0x82, 0xba, 0x16, 0xbe, 0x11,
0x90, 0x1e, 0x8b, 0x4e, 0xa8, 0x54, 0x9a, 0xe8, 0x45, 0x1a, 0x45, 0x41, 0xa4, 0xb1, 0x44, 0x11,
0xd6, 0x91, 0xe8, 0xf8, 0xbc, 0xbe, 0xbe, 0x01, 0xbc, 0x64, 0xd7, 0x16, 0xaa, 0xcb, 0xfa, 0xbd,
0x91, 0xdb, 0x8a, 0x12, 0x2a, 0xa1, 0xc5, 0x50, 0xa3, 0x85, 0x09, 0xfd, 0x5b, 0x1a, 0xc5, 0xa2,
0x96, 0x14, 0x60, 0xa4, 0x24, 0x3e, 0x81, 0x1d, 0xdf, 0x89, 0xb9, 0x0a, 0x73, 0x5e, 0x82, 0x8f,
0x6d, 0x21, 0x50, 0xf1, 0x29, 0x1c, 0xf9, 0x31, 0xec, 0x16, 0x74, 0x9d, 0x30, 0x9c, 0xcb, 0xa6,
0xee, 0xc8, 0xa6, 0x26, 0x99, 0xf6, 0x69, 0x18, 0x5e, 0x38, 0xf1, 0xda, 0x7a, 0x2f, 0x8f, 0xbf,
0x84, 0xa4, 0x7e, 0xb0, 0x4a, 0x91, 0xd4, 0x0f, 0x56, 0xd6, 0x6f, 0x72, 0xb5, 0x1c, 0x34, 0x7f,
0x00, 0x9d, 0x45, 0xe0, 0xaa, 0xe8, 0xc7, 0xc7, 0xdb, 0x3a, 0xef, 0x2f, 0x02, 0x97, 0xbe, 0xbd,
0x0f, 0xa9, 0x2d, 0x85, 0x59, 0xa4, 0xad, 0x02, 0x2e, 0x6a, 0xff, 0xed, 0xdc, 0xff, 0xaf, 0x05,
0x80, 0x94, 0xaa, 0xf7, 0xbb, 0xf4, 0xfe, 0x47, 0x23, 0x3f, 0x10, 0x85, 0xd6, 0xdf, 0xca, 0xf9,
0x04, 0xba, 0x1e, 0x73, 0xe9, 0x9d, 0xf4, 0xde, 0xb6, 0x15, 0x91, 0x5e, 0x33, 0x6d, 0xb9, 0x62,
0xf9, 0x9a, 0x51, 0x49, 0x56, 0x84, 0x06, 0xf4, 0x60, 0x29, 0x81, 0x61, 0xd3, 0x56, 0x44, 0x01,
0x16, 0x7b, 0x25, 0xf8, 0xd7, 0x9b, 0xee, 0xe7, 0x9b, 0xfe, 0x95, 0xb8, 0x82, 0x8a, 0xdd, 0xf9,
0x5d, 0x66, 0x64, 0x37, 0x3f, 0xcf, 0xac, 0x2f, 0xad, 0x09, 0xe0, 0xc3, 0x86, 0x53, 0x57, 0x6d,
0xb9, 0x95, 0xf0, 0x87, 0xd0, 0x75, 0xbd, 0xe5, 0x32, 0x36, 0x3b, 0x0d, 0x97, 0x8d, 0x12, 0x5b,
0x7f, 0x68, 0x41, 0x4f, 0x5d, 0x15, 0x78, 0x28, 0x60, 0xcb, 0xf1, 0xd8, 0xdc, 0x73, 0xd3, 0x76,
0x91, 0xf4, 0xcc, 0x2d, 0xe4, 0xa4, 0x55, 0xca, 0x09, 0x42, 0x87, 0x7b, 0x37, 0x54, 0x57, 0xba,
0xfc, 0xc6, 0x03, 0xe8, 0xb3, 0xe4, 0x66, 0xce, 0xef, 0x62, 0x99, 0xed, 0x8e, 0xdd, 0x63, 0xc9,
0xcd, 0xdb, 0xbb, 0x18, 0x8f, 0x61, 0xab, 0x50, 0xf7, 0x9e, 0xab, 0xf1, 0x78, 0xac, 0xb7, 0x26,
0xf7, 0x3d, 0x7b, 0x69, 0x8f, 0xb2, 0x0e, 0x98, 0xb9, 0x78, 0x04, 0xb2, 0x21, 0xe6, 0x0a, 0xf3,
0x54, 0xa3, 0xf4, 0x64, 0xde, 0xc6, 0x82, 0xaf, 0x41, 0x51, 0xdc, 0x83, 0xdf, 0x83, 0xa1, 0xc8,
0xa4, 0x52, 0xe9, 0x4b, 0x95, 0x81, 0x60, 0x48, 0xe1, 0xfb, 0xb0, 0x9d, 0xdf, 0xad, 0x4a, 0x65,
0xa0, 0xbc, 0xe4, 0x6c, 0xa9, 0x78, 0x08, 0x83, 0xac, 0x21, 0x87, 0x52, 0xa3, 0xef, 0xe8, 0x3e,
0x9c, 0x41, 0x5f, 0x6f, 0xb1, 0xf6, 0x1e, 0x7e, 0x02, 0xdd, 0xd0, 0x89, 0x78, 0xac, 0xef, 0xbb,
0x14, 0x8e, 0x2f, 0x9d, 0x48, 0x0c, 0x40, 0xfa, 0x36, 0x56, 0x2a, 0xd6, 0x09, 0x6c, 0x95, 0xf8,
0xa2, 0x12, 0x79, 0xc0, 0x1d, 0x5f, 0xdf, 0xc4, 0x8a, 0xc8, 0x96, 0x69, 0xe5, 0xcb, 0x58, 0x27,
0x30, 0xcc, 0xce, 0x50, 0x1c, 0x4b, 0x98, 0x5c, 0x7d, 0xaa, 0x47, 0xaa, 0x4d, 0x5b, 0x53, 0xb2,
0xb0, 0x83, 0xaf, 0xf4, 0x48, 0xd0, 0xb1, 0x15, 0xf1, 0xe4, 0xcf, 0x06, 0x8c, 0x3e, 0x53, 0xf8,
0x27, 0xaa, 0x11, 0xb7, 0x61, 0xf4, 0x3a, 0xf1, 0x7d, 0xcd, 0x22, 0x1b, 0x38, 0x80, 0x8e, 0x80,
0x4d, 0x62, 0xe0, 0x10, 0xba, 0x12, 0x16, 0x49, 0x4b, 0x30, 0x05, 0x1e, 0x92, 0x36, 0x6e, 0xc1,
0x30, 0x03, 0x20, 0xd2, 0x11, 0x64, 0x86, 0xc7, 0xa4, 0x2b, 0xc8, 0x0c, 0x77, 0xc8, 0x0e, 0x8e,
0xa0, 0xaf, 0x61, 0x82, 0x20, 0x02, 0xf4, 0xd4, 0x49, 0x91, 0x5d, 0xe1, 0x5a, 0x36, 0x38, 0x99,
0x08, 0x93, 0xac, 0xb4, 0xc9, 0x1e, 0x8e, 0x01, 0xf2, 0xa2, 0x26, 0xfb, 0xb8, 0x09, 0x83, 0xb4,
0x9c, 0xc9, 0xc1, 0x93, 0x3f, 0x75, 0x61, 0x90, 0x36, 0x12, 0xf6, 0xa0, 0xf5, 0xe6, 0x53, 0xb2,
0x81, 0x3b, 0xb0, 0x35, 0x63, 0x9c, 0x46, 0xcc, 0xf1, 0xcf, 0xc5, 0x0d, 0x40, 0x0c, 0xc1, 0x3a,
0x67, 0x8b, 0xc0, 0xf5, 0xd8, 0x4a, 0xb1, 0x5a, 0xc2, 0xd1, 0x99, 0xe3, 0xbe, 0x0e, 0xd8, 0x82,
0x92, 0x36, 0x12, 0xd8, 0xfc, 0x82, 0x39, 0x09, 0x5f, 0x07, 0x91, 0xf7, 0x3b, 0xea, 0x92, 0x0e,
0xee, 0xc1, 0xce, 0x8c, 0xc5, 0xc9, 0x72, 0xe9, 0x2d, 0x3c, 0xca, 0xf8, 0x27, 0x09, 0x73, 0x63,
0xd2, 0x45, 0x84, 0xf1, 0x17, 0xec, 0x9a, 0x05, 0x5f, 0x31, 0x3d, 0x39, 0x91, 0x1e, 0x9a, 0x30,
0x39, 0x73, 0x62, 0xfa, 0x32, 0x09, 0x7d, 0x6f, 0xe1, 0x70, 0x7a, 0xea, 0xba, 0x11, 0x8d, 0x63,
0x42, 0x85, 0x13, 0x21, 0x29, 0xaf, 0xbd, 0x4c, 0x0d, 0x4a, 0xfe, 0x29, 0x8d, 0xc9, 0x0a, 0x0f,
0x61, 0xef, 0x81, 0x44, 0xae, 0xbc, 0xc6, 0xef, 0x83, 0x59, 0x15, 0xbd, 0x72, 0xe2, 0xcb, 0xc8,
0x5b, 0x50, 0xe2, 0xe1, 0x04, 0x88, 0x92, 0xca, 0xda, 0x9d, 0xb1, 0x30, 0xe1, 0xe4, 0xb7, 0xe9,
0xfa, 0x9a, 0xfb, 0x26, 0xe1, 0x82, 0x7d, 0x5d, 0x61, 0x5f, 0xca, 0xfa, 0x20, 0x3e, 0x1e, 0xc0,
0x6e, 0x81, 0xfd, 0xb9, 0x88, 0x4f, 0x64, 0xe7, 0x26, 0xdf, 0xaf, 0x12, 0x78, 0x2b, 0xe6, 0xf0,
0x24, 0xa2, 0x84, 0xe1, 0x3e, 0xa0, 0x90, 0xe8, 0x94, 0xa4, 0x81, 0x07, 0xe9, 0x0a, 0x9a, 0xaf,
0x57, 0x08, 0xab, 0x6c, 0x3f, 0x59, 0x79, 0x8c, 0xbc, 0xc3, 0x3d, 0x20, 0xaf, 0x82, 0x5b, 0xcd,
0x3d, 0x67, 0xdc, 0xe3, 0xf7, 0xe4, 0xaf, 0x06, 0x4e, 0x60, 0x3b, 0x67, 0xbf, 0x8a, 0x82, 0x24,
0x24, 0x7f, 0x33, 0xf0, 0x00, 0x30, 0xe7, 0x5e, 0x46, 0x41, 0x18, 0xc4, 0x8e, 0x4f, 0xfe, 0x6e,
0xe0, 0x3e, 0xec, 0xbc, 0x0a, 0x6e, 0xb3, 0x53, 0x50, 0x06, 0xff, 0x48, 0x0d, 0x32, 0xfe, 0x67,
0xf4, 0xe6, 0x8a, 0x46, 0xe4, 0x9f, 0x06, 0x1e, 0xc2, 0xa4, 0x28, 0xc8, 0x7c, 0xfd, 0xcb, 0xd0,
0x3b, 0xca, 0x44, 0x5f, 0x06, 0x9c, 0x92, 0x7f, 0xa7, 0x6c, 0x9d, 0x07, 0xed, 0xe8, 0x3f, 0x06,
0xee, 0xc2, 0x38, 0x67, 0x4b, 0xdd, 0xff, 0x1a, 0x38, 0x85, 0xbd, 0x12, 0xd3, 0x63, 0xab, 0x4b,
0xd1, 0x72, 0xe4, 0x7f, 0xc6, 0xf1, 0xd7, 0x5d, 0xd8, 0x3e, 0x3d, 0x7b, 0x31, 0x3b, 0x0d, 0xd5,
0x02, 0xe2, 0xf6, 0x7e, 0xa6, 0x1a, 0x0d, 0x6b, 0x9e, 0xe6, 0xd3, 0xba, 0x41, 0x19, 0x8f, 0x75,
0x3f, 0x62, 0xdd, 0x0b, 0x7d, 0x5a, 0x3b, 0x2f, 0x8b, 0x45, 0xd4, 0x20, 0xf3, 0xf0, 0xa1, 0x3e,
0xad, 0x1b, 0x9a, 0xf1, 0x17, 0x85, 0xfe, 0xc6, 0xa6, 0xe7, 0xfa, 0xb4, 0x71, 0x7c, 0x16, 0xf6,
0xf9, 0xe4, 0xd1, 0xf4, 0x68, 0x9f, 0x36, 0xce, 0xd0, 0xf8, 0x3c, 0x83, 0x0c, 0xac, 0x7f, 0xba,
0x4f, 0x1b, 0xc6, 0x68, 0x91, 0x1e, 0x35, 0x34, 0xd4, 0xbd, 0xc8, 0xa7, 0xb5, 0x93, 0x31, 0x7e,
0x94, 0x62, 0x12, 0xd6, 0xbe, 0xfa, 0xa7, 0xf5, 0xf3, 0xb7, 0x08, 0x32, 0x7f, 0xd6, 0x35, 0x3d,
0xe7, 0xa7, 0x8d, 0x93, 0x35, 0x9e, 0x16, 0x41, 0x0e, 0x1b, 0x1f, 0xf5, 0xd3, 0xe6, 0xf9, 0x1a,
0x3f, 0xce, 0x71, 0x11, 0x1b, 0x9e, 0xf6, 0xd3, 0xa6, 0x11, 0xfb, 0xaa, 0x27, 0xff, 0x35, 0xfa,
0xf0, 0xff, 0x01, 0x00, 0x00, 0xff, 0xff, 0x73, 0x34, 0x90, 0x2d, 0x4a, 0x12, 0x00, 0x00,
// 1723 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xac, 0x58, 0x5b, 0x6f, 0xe3, 0xc6,
0x15, 0x36, 0x75, 0xd7, 0x91, 0x2d, 0x8f, 0x8f, 0x65, 0x5b, 0x56, 0x0b, 0x74, 0xc1, 0x22, 0x8d,
0x77, 0x9b, 0xee, 0x16, 0x0e, 0x52, 0xac, 0x9b, 0xa2, 0x80, 0xbd, 0xeb, 0xac, 0x85, 0x20, 0xbb,
0x2e, 0xb3, 0xc9, 0x4b, 0x8b, 0x0a, 0xb4, 0x38, 0x92, 0x58, 0x4b, 0x24, 0x97, 0x1c, 0x3a, 0x72,
0x7f, 0x43, 0xde, 0xfb, 0x13, 0xfa, 0x0b, 0xfa, 0x94, 0xf7, 0x02, 0xbd, 0x5f, 0x7e, 0x51, 0x71,
0x66, 0x86, 0x57, 0x53, 0x41, 0x1f, 0xf2, 0x22, 0xf0, 0x5c, 0x67, 0xce, 0xcc, 0x39, 0xdf, 0x39,
0x23, 0xd8, 0x13, 0xf7, 0x01, 0x8f, 0x9e, 0xc9, 0xdf, 0xa7, 0x41, 0xe8, 0x0b, 0x1f, 0x9b, 0x92,
0x30, 0xff, 0xdc, 0x80, 0xb6, 0xc5, 0xdf, 0xc5, 0x3c, 0x12, 0x78, 0x02, 0x0d, 0x3e, 0x5d, 0xf8,
0x43, 0xe3, 0x91, 0x71, 0xd2, 0x3b, 0xc5, 0xa7, 0x4a, 0x5d, 0x4b, 0x2f, 0xa7, 0x0b, 0xff, 0x6a,
0xcb, 0x92, 0x1a, 0xf8, 0x63, 0x68, 0xce, 0x96, 0x71, 0xb4, 0x18, 0xd6, 0xa4, 0xea, 0x7e, 0x51,
0xf5, 0x13, 0x12, 0x5d, 0x6d, 0x59, 0x4a, 0x87, 0xdc, 0xba, 0xde, 0xcc, 0x1f, 0xd6, 0xab, 0xdc,
0x8e, 0xbd, 0x99, 0x74, 0x4b, 0x1a, 0xf8, 0x1c, 0x20, 0xe2, 0x62, 0xe2, 0x07, 0xc2, 0xf5, 0xbd,
0x61, 0x43, 0xea, 0x1f, 0x15, 0xf5, 0x3f, 0xe7, 0xe2, 0x8d, 0x14, 0x5f, 0x6d, 0x59, 0xdd, 0x28,
0x21, 0xc8, 0xd2, 0xe1, 0x4b, 0xf7, 0x8e, 0x87, 0x13, 0xb1, 0x1e, 0x36, 0xab, 0x2c, 0x5f, 0x2a,
0xf9, 0xdb, 0x35, 0x59, 0x3a, 0x09, 0x81, 0xa7, 0xd0, 0x99, 0x2e, 0xf8, 0xf4, 0x96, 0xec, 0x5a,
0xd2, 0xee, 0xa0, 0x68, 0xf7, 0x82, 0xa4, 0xd2, 0xaa, 0x3d, 0x55, 0x9f, 0xf8, 0x14, 0x5a, 0x53,
0x7f, 0xb5, 0x72, 0xc5, 0xb0, 0x2d, 0x2d, 0x06, 0x25, 0x0b, 0x29, 0xbb, 0xda, 0xb2, 0xb4, 0x16,
0x1d, 0xd7, 0xbb, 0x98, 0x87, 0xf7, 0xc3, 0x4e, 0xd5, 0x71, 0xfd, 0x8a, 0x44, 0x74, 0x5c, 0x52,
0x87, 0x42, 0x71, 0x3d, 0x57, 0x4c, 0xa6, 0x0b, 0xdb, 0xf5, 0x86, 0xdd, 0xaa, 0x50, 0xc6, 0x9e,
0x2b, 0x5e, 0x90, 0x98, 0x42, 0x71, 0x13, 0x02, 0x3f, 0x86, 0xde, 0x0d, 0x9f, 0xbb, 0xde, 0xe4,
0x66, 0xe9, 0x4f, 0x6f, 0x87, 0x20, 0x4d, 0x87, 0x45, 0xd3, 0x0b, 0x52, 0xb8, 0x20, 0xf9, 0xd5,
0x96, 0x05, 0x37, 0x29, 0x85, 0x1f, 0x41, 0x97, 0x7b, 0x8e, 0x36, 0xed, 0x49, 0xd3, 0xc3, 0x52,
0x06, 0x78, 0x4e, 0x62, 0xd8, 0xe1, 0xfa, 0xfb, 0xa2, 0x0d, 0xcd, 0x3b, 0x7b, 0x19, 0x73, 0xf3,
0x7d, 0xe8, 0xe5, 0x32, 0x05, 0x87, 0xd0, 0x5e, 0xf1, 0x28, 0xb2, 0xe7, 0x5c, 0xa6, 0x53, 0xd7,
0x4a, 0x48, 0xb3, 0x0f, 0xdb, 0xf9, 0x3c, 0x31, 0x77, 0x52, 0x43, 0xca, 0x05, 0xf3, 0xe7, 0xc0,
0xca, 0x57, 0x8d, 0x0c, 0xea, 0xb7, 0xfc, 0x5e, 0x3b, 0xa2, 0x4f, 0x1c, 0xe8, 0x65, 0x65, 0x02,
0x76, 0x2d, 0xbd, 0x07, 0x33, 0xb5, 0x4d, 0x2f, 0x1b, 0xfb, 0x50, 0x13, 0x6b, 0x69, 0xba, 0x6d,
0xd5, 0xc4, 0xda, 0x7c, 0x04, 0xfd, 0xe2, 0xc5, 0x3e, 0xd0, 0x58, 0xa5, 0x1b, 0x94, 0x37, 0x83,
0x08, 0x0d, 0xc7, 0x16, 0xb6, 0xd6, 0x90, 0xdf, 0xc4, 0x0b, 0x6c, 0xb1, 0xd0, 0xcb, 0xcb, 0x6f,
0xfc, 0x01, 0xf4, 0x96, 0x76, 0x24, 0x26, 0x0b, 0xee, 0xce, 0x17, 0x42, 0xa6, 0x7b, 0xc3, 0x02,
0x62, 0x5d, 0x49, 0x0e, 0x6d, 0x3a, 0x08, 0xfd, 0x3b, 0x2e, 0x33, 0xbb, 0x63, 0x29, 0xc2, 0xdc,
0x85, 0x9d, 0x42, 0xde, 0x98, 0x2f, 0xd3, 0x28, 0xd2, 0x7b, 0xc6, 0x9f, 0x02, 0xdc, 0xd9, 0x4b,
0xd7, 0xb1, 0x85, 0x1f, 0x46, 0x43, 0xe3, 0x51, 0xfd, 0xa4, 0x77, 0xca, 0xf4, 0xf5, 0x7c, 0x99,
0x08, 0xac, 0x9c, 0x8e, 0xf9, 0x1a, 0xf6, 0x1e, 0x5c, 0x39, 0x6d, 0x7b, 0x61, 0x47, 0x8b, 0x24,
0x14, 0xfa, 0xc6, 0xf7, 0xa0, 0xb5, 0xe0, 0xb6, 0xc3, 0x43, 0x5d, 0xcc, 0x3b, 0xda, 0xed, 0x95,
0x64, 0x5a, 0x5a, 0x68, 0x3e, 0x86, 0xdd, 0x52, 0x1e, 0xe0, 0x21, 0x59, 0xca, 0x58, 0x0d, 0x19,
0xab, 0xa6, 0xcc, 0xaf, 0x9b, 0xd0, 0xb1, 0x78, 0x14, 0xf8, 0x5e, 0xc4, 0xf1, 0x39, 0x74, 0xf9,
0x7a, 0xca, 0x55, 0x49, 0x1b, 0xa5, 0x94, 0x54, 0x3a, 0x97, 0x89, 0x9c, 0xd2, 0x39, 0x55, 0xc6,
0xc7, 0x1a, 0x8e, 0xca, 0x18, 0xa3, 0x8d, 0xf2, 0x78, 0xf4, 0x41, 0x82, 0x47, 0xf5, 0x52, 0x3d,
0x2a, 0xdd, 0x12, 0x20, 0x3d, 0xd6, 0x80, 0xd4, 0xa8, 0x74, 0x5c, 0x40, 0xa4, 0xb3, 0x02, 0x22,
0x35, 0x2b, 0xb7, 0xbf, 0x01, 0x92, 0xce, 0x0a, 0x90, 0xd4, 0xaa, 0x34, 0xdd, 0x80, 0x49, 0x1f,
0xe6, 0x30, 0xa9, 0x5d, 0x2a, 0x45, 0x65, 0x58, 0x01, 0x4a, 0xcf, 0x52, 0x50, 0xea, 0x94, 0x60,
0x4c, 0x9b, 0x94, 0x51, 0xe9, 0x83, 0x04, 0x95, 0xba, 0x95, 0x87, 0x56, 0x82, 0xa5, 0xb3, 0x02,
0x2c, 0x41, 0x65, 0x38, 0x1b, 0x70, 0xe9, 0x17, 0x45, 0x5c, 0x52, 0xe0, 0x72, 0x5c, 0xb2, 0xdd,
0x08, 0x4c, 0x3f, 0xcb, 0x03, 0xd3, 0x76, 0x09, 0x0e, 0x75, 0x2e, 0x7c, 0x2b, 0x32, 0x3d, 0xa6,
0x4a, 0x28, 0x65, 0x1a, 0xd5, 0x22, 0x0f, 0x43, 0x3f, 0xd4, 0xa0, 0xa2, 0x08, 0xf3, 0x84, 0x4a,
0x3f, 0xcb, 0xaf, 0x6f, 0x41, 0x31, 0x59, 0xb5, 0xb9, 0xec, 0x32, 0xff, 0x60, 0x64, 0xb6, 0x94,
0x42, 0x05, 0xd8, 0xe8, 0x6a, 0xd8, 0x18, 0x42, 0xfb, 0x8e, 0x87, 0x11, 0xe5, 0x92, 0x42, 0x8e,
0x84, 0xc4, 0x27, 0xb0, 0x27, 0xc1, 0x43, 0x86, 0x59, 0x84, 0x90, 0x5d, 0x12, 0xa8, 0xf8, 0x14,
0x8e, 0xfc, 0x04, 0xf6, 0x73, 0xba, 0x76, 0x10, 0x4c, 0x64, 0x51, 0x37, 0x64, 0x51, 0xb3, 0x54,
0xfb, 0x3c, 0x08, 0xae, 0xec, 0x68, 0x61, 0xbe, 0x97, 0xc5, 0x5f, 0x80, 0xd4, 0xa5, 0x3f, 0x4f,
0x20, 0x75, 0xe9, 0xcf, 0xcd, 0xdf, 0x66, 0x6a, 0x19, 0x7a, 0xfe, 0x10, 0x1a, 0x53, 0xdf, 0x51,
0xd1, 0xf7, 0x4f, 0x77, 0xf5, 0xb9, 0xbf, 0xf0, 0x1d, 0xfe, 0xf6, 0x3e, 0xe0, 0x96, 0x14, 0xa6,
0x91, 0xd6, 0x72, 0x00, 0xa9, 0xfd, 0xd7, 0x33, 0xff, 0xbf, 0x21, 0x00, 0x29, 0x64, 0xef, 0x77,
0xe9, 0xfd, 0x1b, 0x23, 0xbb, 0x10, 0x05, 0xdb, 0xff, 0x97, 0xf3, 0x01, 0x34, 0x5d, 0xcf, 0xe1,
0x6b, 0xe9, 0xbd, 0x6e, 0x29, 0x22, 0xe9, 0x37, 0x75, 0xb9, 0x62, 0xb1, 0xdf, 0xa8, 0x43, 0x56,
0x84, 0x06, 0x74, 0x7f, 0x26, 0x81, 0x61, 0xdb, 0x52, 0x44, 0xb9, 0x0f, 0xb4, 0x1e, 0xf4, 0x01,
0xbd, 0xfb, 0x76, 0xb6, 0xfb, 0x5f, 0x53, 0x53, 0xca, 0x97, 0xe9, 0x77, 0x79, 0x34, 0xfb, 0xd9,
0xc5, 0xa6, 0x05, 0x6a, 0x0e, 0x00, 0x1f, 0x56, 0x9e, 0x6a, 0xbe, 0xc5, 0x9a, 0xc2, 0x1f, 0x41,
0xd3, 0x71, 0x67, 0xb3, 0x68, 0xd8, 0xd8, 0xd0, 0x75, 0x94, 0xd8, 0xfc, 0x63, 0x0d, 0x5a, 0xaa,
0x67, 0xe0, 0x31, 0xe1, 0x97, 0xed, 0x7a, 0x13, 0xd7, 0x49, 0xea, 0x46, 0xd2, 0x63, 0x27, 0xd7,
0x33, 0x6a, 0xf9, 0x9e, 0x41, 0xa1, 0x08, 0x77, 0xc5, 0x75, 0xca, 0xcb, 0x6f, 0x3c, 0x82, 0xb6,
0x17, 0xaf, 0x26, 0x62, 0x1d, 0xc9, 0x63, 0x6f, 0x58, 0x2d, 0x2f, 0x5e, 0xbd, 0x5d, 0x47, 0x78,
0x0a, 0x3b, 0xb9, 0x02, 0x70, 0x1d, 0x0d, 0xcc, 0x7d, 0xbd, 0x35, 0xb9, 0xef, 0xf1, 0x4b, 0xab,
0x97, 0x96, 0xc2, 0xd8, 0xc1, 0x13, 0x90, 0x95, 0x31, 0x51, 0xe0, 0xa7, 0x2a, 0xa6, 0x25, 0xcf,
0xad, 0x4f, 0x7c, 0x8d, 0x8e, 0xd4, 0x10, 0xbf, 0x07, 0x5d, 0x3a, 0x49, 0xa5, 0xd2, 0x96, 0x2a,
0x1d, 0x62, 0x48, 0xe1, 0xfb, 0xb0, 0x9b, 0x35, 0x59, 0xa5, 0xd2, 0x51, 0x5e, 0x32, 0xb6, 0x54,
0x3c, 0x86, 0x4e, 0x5a, 0x99, 0x5d, 0xa9, 0xd1, 0xb6, 0x75, 0x41, 0x8e, 0xa1, 0xad, 0xb7, 0x58,
0xd9, 0x90, 0x9f, 0x40, 0x33, 0xb0, 0x43, 0x11, 0xe9, 0xc6, 0x97, 0xe0, 0xf2, 0xb5, 0x1d, 0xd2,
0x48, 0xa4, 0xdb, 0xb2, 0x52, 0x31, 0xcf, 0x60, 0xa7, 0xc0, 0xa7, 0x94, 0x14, 0xbe, 0xb0, 0x97,
0xba, 0x25, 0x2b, 0x22, 0x5d, 0xa6, 0x96, 0x2d, 0x63, 0x9e, 0x41, 0x37, 0xbd, 0x43, 0xba, 0x96,
0x20, 0xbe, 0xf9, 0x54, 0x0f, 0x59, 0xdb, 0x96, 0xa6, 0x64, 0x86, 0xfb, 0x5f, 0xe9, 0xd9, 0xa0,
0x61, 0x29, 0xe2, 0xc9, 0x37, 0x06, 0xf4, 0x3e, 0x53, 0x40, 0x48, 0xd9, 0x88, 0xbb, 0xd0, 0x7b,
0x1d, 0x2f, 0x97, 0x9a, 0xc5, 0xb6, 0xb0, 0x03, 0x0d, 0xc2, 0x4f, 0x66, 0x60, 0x17, 0x9a, 0x12,
0x1f, 0x59, 0x8d, 0x98, 0x04, 0x8c, 0xac, 0x8e, 0x3b, 0xd0, 0x4d, 0x91, 0x88, 0x35, 0x88, 0x4c,
0x81, 0x99, 0x35, 0x89, 0x4c, 0x01, 0x88, 0xed, 0x61, 0x0f, 0xda, 0x1a, 0x2f, 0x18, 0x22, 0x40,
0x4b, 0xdd, 0x14, 0xdb, 0x27, 0xd7, 0xb2, 0xd2, 0xd9, 0x80, 0x4c, 0xd2, 0xd4, 0x66, 0x07, 0xd8,
0x07, 0xc8, 0x92, 0x9a, 0x1d, 0xe2, 0x36, 0x74, 0x92, 0x74, 0x66, 0x47, 0x4f, 0xfe, 0xd4, 0x84,
0x4e, 0x52, 0x48, 0xd8, 0x82, 0xda, 0x9b, 0x4f, 0xd9, 0x16, 0xee, 0xc1, 0xce, 0xd8, 0x13, 0x3c,
0xf4, 0xec, 0xe5, 0x25, 0xb5, 0x02, 0x66, 0x10, 0xeb, 0xd2, 0x9b, 0xfa, 0x8e, 0xeb, 0xcd, 0x15,
0xab, 0x46, 0x8e, 0x2e, 0x6c, 0xe7, 0xb5, 0xef, 0x4d, 0x39, 0xab, 0x23, 0x83, 0xed, 0x2f, 0x3c,
0x3b, 0x16, 0x0b, 0x3f, 0x74, 0x7f, 0xcf, 0x1d, 0xd6, 0xc0, 0x03, 0xd8, 0x1b, 0x7b, 0x51, 0x3c,
0x9b, 0xb9, 0x53, 0x97, 0x7b, 0xe2, 0x93, 0xd8, 0x73, 0x22, 0xd6, 0x44, 0x84, 0xfe, 0x17, 0xde,
0xad, 0xe7, 0x7f, 0xe5, 0xe9, 0x11, 0x8a, 0xb5, 0x70, 0x08, 0x83, 0x0b, 0x3b, 0xe2, 0x2f, 0xe3,
0x60, 0xe9, 0x4e, 0x6d, 0xc1, 0xcf, 0x1d, 0x27, 0xe4, 0x51, 0xc4, 0x38, 0x39, 0x21, 0x49, 0x71,
0xed, 0x59, 0x62, 0x50, 0xf0, 0xcf, 0x79, 0xc4, 0xe6, 0x78, 0x0c, 0x07, 0x0f, 0x24, 0x72, 0xe5,
0x05, 0x7e, 0x1f, 0x86, 0x65, 0xd1, 0x2b, 0x3b, 0xba, 0x0e, 0xdd, 0x29, 0x67, 0x2e, 0x0e, 0x80,
0x29, 0xa9, 0xcc, 0xdd, 0xb1, 0x17, 0xc4, 0x82, 0xfd, 0x2e, 0x59, 0x5f, 0x73, 0xdf, 0xc4, 0x82,
0xd8, 0xb7, 0x25, 0xf6, 0xb5, 0xcc, 0x0f, 0xb6, 0xc4, 0x23, 0xd8, 0xcf, 0xb1, 0x3f, 0xa7, 0xf8,
0xe8, 0x74, 0x56, 0xd9, 0x7e, 0x95, 0xc0, 0x9d, 0x7b, 0xb6, 0x88, 0x43, 0xce, 0x3c, 0x3c, 0x04,
0x24, 0x89, 0x3e, 0x92, 0x24, 0x70, 0x3f, 0x59, 0x41, 0xf3, 0xf5, 0x0a, 0x41, 0x99, 0xbd, 0x8c,
0xe7, 0xae, 0xc7, 0xde, 0xe1, 0x01, 0xb0, 0x57, 0xfe, 0x9d, 0xe6, 0x5e, 0x7a, 0xc2, 0x15, 0xf7,
0xec, 0x2f, 0x06, 0x0e, 0x60, 0x37, 0x63, 0xbf, 0x0a, 0xfd, 0x38, 0x60, 0x7f, 0x35, 0xf0, 0x08,
0x30, 0xe3, 0x5e, 0x87, 0x7e, 0xe0, 0x47, 0xf6, 0x92, 0xfd, 0xcd, 0xc0, 0x43, 0xd8, 0x7b, 0xe5,
0xdf, 0xa5, 0xb7, 0xa0, 0x0c, 0xfe, 0x9e, 0x18, 0xa4, 0xfc, 0xcf, 0xf8, 0xea, 0x86, 0x87, 0xec,
0x1f, 0x06, 0x1e, 0xc3, 0x20, 0x2f, 0x48, 0x7d, 0xfd, 0xd3, 0xd0, 0x3b, 0x4a, 0x45, 0x5f, 0xfa,
0x82, 0xb3, 0x7f, 0x25, 0x6c, 0x7d, 0x0e, 0xda, 0xd1, 0xbf, 0x0d, 0xdc, 0x87, 0x7e, 0xc6, 0x96,
0xba, 0xff, 0x31, 0x70, 0x04, 0x07, 0x05, 0xa6, 0xeb, 0xcd, 0xaf, 0xa9, 0xe4, 0xd8, 0x7f, 0x8d,
0xd3, 0xaf, 0x9b, 0xb0, 0x7b, 0x7e, 0xf1, 0x62, 0x7c, 0x1e, 0xa8, 0x05, 0xa8, 0x8d, 0x3f, 0x53,
0x85, 0x86, 0x15, 0x8f, 0xf5, 0x51, 0xd5, 0xc4, 0x8c, 0xa7, 0xba, 0x1e, 0xb1, 0xea, 0xcd, 0x3e,
0xaa, 0x1c, 0x9c, 0x69, 0x11, 0x35, 0xd1, 0x3c, 0x7c, 0xba, 0x8f, 0xaa, 0xa6, 0x67, 0xfc, 0x65,
0xae, 0xbe, 0x71, 0xd3, 0x03, 0x7e, 0xb4, 0x71, 0x8e, 0x26, 0xfb, 0x6c, 0x04, 0xd9, 0xf4, 0x8c,
0x1f, 0x6d, 0x1c, 0xa6, 0xf1, 0x79, 0x0a, 0x19, 0x58, 0xfd, 0x98, 0x1f, 0x6d, 0x98, 0xa7, 0xe9,
0x78, 0xd4, 0xf4, 0x50, 0xf5, 0x46, 0x1f, 0x55, 0x8e, 0xc8, 0xf8, 0x51, 0x82, 0x49, 0x58, 0xf9,
0x3f, 0xc0, 0xa8, 0x7a, 0x10, 0xa7, 0x20, 0xb3, 0xf7, 0xdd, 0xa6, 0x07, 0xfe, 0x68, 0xe3, 0x88,
0x8d, 0xe7, 0x79, 0x90, 0xc3, 0x8d, 0xcf, 0xfc, 0xd1, 0xe6, 0x41, 0x1b, 0x3f, 0xce, 0x70, 0x11,
0x37, 0x3c, 0xf6, 0x47, 0x9b, 0x66, 0xed, 0x9b, 0x96, 0xfc, 0x1f, 0xe9, 0xc3, 0xff, 0x05, 0x00,
0x00, 0xff, 0xff, 0x3a, 0x61, 0xc1, 0xbf, 0x5c, 0x12, 0x00, 0x00,
} }

+ 3
- 3
types/types.proto View File

@ -115,7 +115,7 @@ message RequestCheckTx{
message RequestQuery{ message RequestQuery{
bytes data = 1; bytes data = 1;
string path = 2; string path = 2;
uint64 height = 3;
uint64 last_height = 3;
bool prove = 4; bool prove = 4;
} }
@ -192,11 +192,11 @@ message ResponseCheckTx{
message ResponseQuery{ message ResponseQuery{
CodeType code = 1; CodeType code = 1;
int64 index = 2;
int64 index = 2;
bytes key = 3; bytes key = 3;
bytes value = 4; bytes value = 4;
bytes proof = 5; bytes proof = 5;
uint64 height = 6;
uint64 last_height = 6;
string log = 7; string log = 7;
} }


Loading…
Cancel
Save