From 02fdf31829cccc99d825d135bc4df0b0819abe9f Mon Sep 17 00:00:00 2001 From: Rzy <465386466@qq.com> Date: Wed, 19 Jun 2024 18:05:50 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B0=9D=E8=AF=95=E8=A7=A3=E5=AF=86=E6=95=B0?= =?UTF-8?q?=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cmd/api/doc/vo/base.api | 11 +- .../internal/logic/transfer/marketLogic.go | 58 +- .../internal/middleware/decryptMiddleware.go | 42 + cmd/api/internal/svc/serviceContext.go | 30 +- cmd/api/internal/types/extraTypes.go | 23 + cmd/api/internal/types/types.go | 15 +- genModel/merchantModel.go | 27 + genModel/merchantModel_gen.go | 160 +++ rpc/transfer.proto | 59 +- rpc/transfer/transfer.pb.go | 1166 ++++++----------- rpc/transfer/transfer_grpc.pb.go | 0 rpc/transferClient/transfer.go | 3 - sh/create.sh | 7 +- untils/market/market.go | 1 + untils/rsa/rsa.go | 111 ++ untils/rsa/rsa_test.go | 33 + 16 files changed, 894 insertions(+), 852 deletions(-) create mode 100644 cmd/api/internal/middleware/decryptMiddleware.go create mode 100644 cmd/api/internal/types/extraTypes.go create mode 100755 genModel/merchantModel.go create mode 100755 genModel/merchantModel_gen.go mode change 100755 => 100644 rpc/transfer.proto mode change 100755 => 100644 rpc/transfer/transfer.pb.go mode change 100755 => 100644 rpc/transfer/transfer_grpc.pb.go create mode 100644 untils/market/market.go create mode 100644 untils/rsa/rsa.go create mode 100644 untils/rsa/rsa_test.go diff --git a/cmd/api/doc/vo/base.api b/cmd/api/doc/vo/base.api index f08b5f0..317bc2d 100755 --- a/cmd/api/doc/vo/base.api +++ b/cmd/api/doc/vo/base.api @@ -6,17 +6,10 @@ type Empty {} type Req{ VendorNo string `json:"vendorNo"` - Data ReqData `json:"data"` + Data string `json:"data"` Sign string `json:"sign"` } -type ReqData{ - SipOrderNo string `json:"sipOrderNo"` - VoucherTag string `json:"voucherTag"` - AccountType int32 `json:"accountType"` - AccountNo string `json:"accountNo"` - AccountInfo string `json:"accountInfo"` - Num int `json:"num"` -} + diff --git a/cmd/api/internal/logic/transfer/marketLogic.go b/cmd/api/internal/logic/transfer/marketLogic.go index c6a1556..924d6ff 100755 --- a/cmd/api/internal/logic/transfer/marketLogic.go +++ b/cmd/api/internal/logic/transfer/marketLogic.go @@ -2,7 +2,9 @@ package transfer import ( "context" + "encoding/json" "rs/rpc/transfer" + "rs/untils/rsa" "github.com/jinzhu/copier" "github.com/zeromicro/go-zero/core/logx" @@ -30,25 +32,61 @@ func (l *MarketLogic) Market(req *types.Req) (resp *types.Resp, err error) { reqData transfer.RsCouponGrantReq res types.Resp ) - prefix := req.Data.VoucherTag[0:6] - prefixData, err := l.svcCtx.ProductRedirectConf.FindOneByProductNoPrefix(l.ctx, prefix) - if err != nil { - return nil, err - } + + DecryptData, _ := l.Decrypt(req.VendorNo, req.Data) _ = copier.Copy(&reqData, &req) - if prefixData == nil { + tagLen := len(DecryptData.VoucherTag) + if tagLen > 6 { + //如果没有解析出来,直接投递给荣数,让荣数自行处理转发 result, _err := l.svcCtx.TransferRpc.RsCouponGrant(l.ctx, &reqData) if _err != nil { return nil, err } _ = copier.Copy(&res, &result) } else { - result, _err := l.svcCtx.TransferRpc.ZltxRsMiXue(l.ctx, &reqData) - if _err != nil { + prefix := DecryptData.VoucherTag[0:6] + prefixData, err := l.svcCtx.ProductRedirectConf.FindOneByProductNoPrefix(l.ctx, prefix) + if err != nil { return nil, err } - _ = copier.Copy(&res, &result) + if prefixData == nil { + result, _err := l.svcCtx.TransferRpc.RsCouponGrant(l.ctx, &reqData) + if _err != nil { + return nil, _err + } + _ = copier.Copy(&res, &result) + } else { + result, _err := l.svcCtx.TransferRpc.ZltxRsMiXue(l.ctx, &reqData) + if _err != nil { + return nil, _err + } + _ = copier.Copy(&res, &result) + } } - return &res, nil } + +func (l *MarketLogic) Decrypt(vendorNo string, encryptData string) (types.DecryptReqData, error) { + var ( + decryptData types.DecryptReqData + deCrypt []byte + ) + merchantInfo, err := l.svcCtx.Merchant.FindOneByMerchantId(l.ctx, vendorNo) + if err != nil { + return decryptData, err + } + + // 修改请求体 + switch merchantInfo.SignatureMethod { + default: + privateKeyPEM := `-----BEGIN RSA PRIVATE KEY----- +` + merchantInfo.RsaPrivateKey.String + ` +-----END RSA PRIVATE KEY-----` + deCrypt, err = rsa.Decrypt(privateKeyPEM, encryptData) + if err != nil { + return decryptData, err + } + } + _ = json.Unmarshal(deCrypt, &decryptData) + return decryptData, nil +} diff --git a/cmd/api/internal/middleware/decryptMiddleware.go b/cmd/api/internal/middleware/decryptMiddleware.go new file mode 100644 index 0000000..bc85319 --- /dev/null +++ b/cmd/api/internal/middleware/decryptMiddleware.go @@ -0,0 +1,42 @@ +package middleware + +import ( + "rs/cmd/api/internal/types" +) + +type DecryptMiddleware struct { + svcCtx *types.BaseServiceContext +} + +func NewDecryptMiddleware(svcCtx *types.BaseServiceContext) *DecryptMiddleware { + return &DecryptMiddleware{ + svcCtx: svcCtx, + } +} + +type BaseReq struct { + VendorNo string `json:"vendorNo"` + Data string `json:"data"` + Sign string `json:"sign"` + DecryptData string `json:"decrypt_data"` +} + +//func (m *DecryptMiddleware) Handle(next http.HandlerFunc) http.HandlerFunc { +// return func(w http.ResponseWriter, r *http.Request) { +// var ( +// baseReq BaseReq +// deCrypt []byte +// ) +// +// body, err := io.ReadAll(r.Body) +// +// defer r.Body.Close() +// _ = json.Unmarshal(body, &baseReq) +// +// baseReq.DecryptData = string(deCrypt) +// baseReqJson, _ := json.Marshal(baseReq) +// r.Body = io.NopCloser(bytes.NewReader(baseReqJson)) +// // 创建一个新的Reader并设置为请求的Body +// next(w, r) +// } +//} diff --git a/cmd/api/internal/svc/serviceContext.go b/cmd/api/internal/svc/serviceContext.go index 79923f8..0fbadae 100755 --- a/cmd/api/internal/svc/serviceContext.go +++ b/cmd/api/internal/svc/serviceContext.go @@ -2,27 +2,33 @@ package svc import ( "github.com/zeromicro/go-zero/core/stores/sqlx" - "github.com/zeromicro/go-zero/zrpc" + "github.com/zeromicro/go-zero/rest" "rs/cmd/api/internal/config" + "rs/cmd/api/internal/types" "rs/genModel" - "rs/rpc/transferClient" ) type ServiceContext struct { - Config config.Config - TransferRpc transferClient.Transfer // 调用transfer服务 - ProductRedirectConf genModel.ProductRedirectConfModel + *types.BaseServiceContext + DecryptMiddleware rest.Middleware } func NewServiceContext(c config.Config) *ServiceContext { - conn := zrpc.MustNewClient(zrpc.RpcClientConf{ - Target: c.Nacos.Target, - }) + //conn := zrpc.MustNewClient(zrpc.RpcClientConf{ + // Target: c.Nacos.Target, + //}) sqlConn := sqlx.NewMysql(c.DB.Coupon.DataSource) - client := transferClient.NewTransfer(conn) - return &ServiceContext{ - Config: c, - TransferRpc: client, + //client := transferClient.NewTransfer(conn) + + base := types.BaseServiceContext{ + Config: c, + //TransferRpc: client, ProductRedirectConf: genModel.NewProductRedirectConfModel(sqlConn, c.Cache), + Merchant: genModel.NewMerchantModel(sqlConn, c.Cache), } + return &ServiceContext{ + BaseServiceContext: &base, + //DecryptMiddleware: middleware.NewDecryptMiddleware(&base).Handle, + } + } diff --git a/cmd/api/internal/types/extraTypes.go b/cmd/api/internal/types/extraTypes.go new file mode 100644 index 0000000..f26d178 --- /dev/null +++ b/cmd/api/internal/types/extraTypes.go @@ -0,0 +1,23 @@ +package types + +import ( + "rs/cmd/api/internal/config" + "rs/genModel" + "rs/rpc/transferClient" +) + +type BaseServiceContext struct { + Config config.Config + TransferRpc transferClient.Transfer // 调用transfer服务 + ProductRedirectConf genModel.ProductRedirectConfModel + Merchant genModel.MerchantModel +} + +type DecryptReqData struct { + SipOrderNo string `json:"sipOrderNo"` + VoucherTag string `json:"voucherTag"` + AccountType int32 `json:"accountType"` + AccountNo string `json:"accountNo"` + AccountInfo string `json:"accountInfo,optional"` + Num int `json:"num"` +} diff --git a/cmd/api/internal/types/types.go b/cmd/api/internal/types/types.go index 18f3f8b..1ee113b 100644 --- a/cmd/api/internal/types/types.go +++ b/cmd/api/internal/types/types.go @@ -5,18 +5,9 @@ type Empty struct { } type Req struct { - VendorNo string `json:"vendorNo"` - Data ReqData `json:"data"` - Sign string `json:"sign"` -} - -type ReqData struct { - SipOrderNo string `json:"sipOrderNo"` - VoucherTag string `json:"voucherTag"` - AccountType int32 `json:"accountType"` - AccountNo string `json:"accountNo"` - AccountInfo string `json:"accountInfo"` - Num int `json:"num"` + VendorNo string `json:"vendorNo"` + Data string `json:"data"` + Sign string `json:"sign"` } type Resp struct { diff --git a/genModel/merchantModel.go b/genModel/merchantModel.go new file mode 100755 index 0000000..39e8ff4 --- /dev/null +++ b/genModel/merchantModel.go @@ -0,0 +1,27 @@ +package genModel + +import ( + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlx" +) + +var _ MerchantModel = (*customMerchantModel)(nil) + +type ( + // MerchantModel is an interface to be customized, add more methods here, + // and implement the added methods in customMerchantModel. + MerchantModel interface { + merchantModel + } + + customMerchantModel struct { + *defaultMerchantModel + } +) + +// NewMerchantModel returns a model for the database table. +func NewMerchantModel(conn sqlx.SqlConn, c cache.CacheConf, opts ...cache.Option) MerchantModel { + return &customMerchantModel{ + defaultMerchantModel: newMerchantModel(conn, c, opts...), + } +} diff --git a/genModel/merchantModel_gen.go b/genModel/merchantModel_gen.go new file mode 100755 index 0000000..1aeafb8 --- /dev/null +++ b/genModel/merchantModel_gen.go @@ -0,0 +1,160 @@ +// Code generated by goctl. DO NOT EDIT. + +package genModel + +import ( + "context" + "database/sql" + "fmt" + "strings" + "time" + + "github.com/zeromicro/go-zero/core/stores/builder" + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlc" + "github.com/zeromicro/go-zero/core/stores/sqlx" + "github.com/zeromicro/go-zero/core/stringx" +) + +var ( + merchantFieldNames = builder.RawFieldNames(&Merchant{}) + merchantRows = strings.Join(merchantFieldNames, ",") + merchantRowsExpectAutoSet = strings.Join(stringx.Remove(merchantFieldNames, "`id`", "`create_at`", "`create_time`", "`created_at`", "`update_at`", "`update_time`", "`updated_at`"), ",") + merchantRowsWithPlaceHolder = strings.Join(stringx.Remove(merchantFieldNames, "`id`", "`create_at`", "`create_time`", "`created_at`", "`update_at`", "`update_time`", "`updated_at`"), "=?,") + "=?" + + cacheCouponOpenMerchantIdPrefix = "cache:couponOpen:merchant:id:" + cacheCouponOpenMerchantMerchantIdPrefix = "cache:couponOpen:merchant:merchantId:" +) + +type ( + merchantModel interface { + Insert(ctx context.Context, data *Merchant) (sql.Result, error) + FindOne(ctx context.Context, id uint64) (*Merchant, error) + FindOneByMerchantId(ctx context.Context, merchantId string) (*Merchant, error) + Update(ctx context.Context, data *Merchant) error + Delete(ctx context.Context, id uint64) error + } + + defaultMerchantModel struct { + sqlc.CachedConn + table string + } + + Merchant struct { + Id uint64 `db:"id"` + MerchantId string `db:"merchant_id"` // 商户号 + FullName string `db:"full_name"` // 商户全称 + Status int64 `db:"status"` // 状态 1可用 2禁用 + SignatureMethod uint64 `db:"signature_method"` // 签名方式1 Rsa2 2 Sm + RsaPublicKey sql.NullString `db:"rsa_public_key"` // rsa公钥 + RsaPrivateKey sql.NullString `db:"rsa_private_key"` // rsa私钥 + MchRsaPublicKey sql.NullString `db:"mch_rsa_public_key"` + Sm2PublicKey sql.NullString `db:"sm2_public_key"` // 国密sm2公钥 + Sm2PrivateKey sql.NullString `db:"sm2_private_key"` // 国密sm2私钥 + MchSm2PublicKey sql.NullString `db:"mch_sm2_public_key"` // 商户侧国密sm2公钥 + Sm4SecretKey sql.NullString `db:"sm4_secret_key"` // 国密sm4报文加密密钥 + IpAccess sql.NullString `db:"ip_access"` // ip白名单["192.168.6.18"] + RequestRate sql.NullString `db:"request_rate"` // 请求频率限制{ "default": "500", "wechat_coupon_send" : "500"} + UpdateTime sql.NullTime `db:"update_time"` // 更新时间 + CreateTime time.Time `db:"create_time"` // 创建时间 + Password string `db:"password"` // 登陆密码 + Phone sql.NullString `db:"phone"` // 手机号 + } +) + +func newMerchantModel(conn sqlx.SqlConn, c cache.CacheConf, opts ...cache.Option) *defaultMerchantModel { + return &defaultMerchantModel{ + CachedConn: sqlc.NewConn(conn, c, opts...), + table: "`merchant`", + } +} + +func (m *defaultMerchantModel) Delete(ctx context.Context, id uint64) error { + data, err := m.FindOne(ctx, id) + if err != nil { + return err + } + + couponOpenMerchantIdKey := fmt.Sprintf("%s%v", cacheCouponOpenMerchantIdPrefix, id) + couponOpenMerchantMerchantIdKey := fmt.Sprintf("%s%v", cacheCouponOpenMerchantMerchantIdPrefix, data.MerchantId) + _, err = m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("delete from %s where `id` = ?", m.table) + return conn.ExecCtx(ctx, query, id) + }, couponOpenMerchantIdKey, couponOpenMerchantMerchantIdKey) + return err +} + +func (m *defaultMerchantModel) FindOne(ctx context.Context, id uint64) (*Merchant, error) { + couponOpenMerchantIdKey := fmt.Sprintf("%s%v", cacheCouponOpenMerchantIdPrefix, id) + var resp Merchant + err := m.QueryRowCtx(ctx, &resp, couponOpenMerchantIdKey, func(ctx context.Context, conn sqlx.SqlConn, v any) error { + query := fmt.Sprintf("select %s from %s where `id` = ? limit 1", merchantRows, m.table) + return conn.QueryRowCtx(ctx, v, query, id) + }) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultMerchantModel) FindOneByMerchantId(ctx context.Context, merchantId string) (*Merchant, error) { + couponOpenMerchantMerchantIdKey := fmt.Sprintf("%s%v", cacheCouponOpenMerchantMerchantIdPrefix, merchantId) + var resp Merchant + err := m.QueryRowIndexCtx(ctx, &resp, couponOpenMerchantMerchantIdKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v any) (i any, e error) { + query := fmt.Sprintf("select %s from %s where `merchant_id` = ? limit 1", merchantRows, m.table) + if err := conn.QueryRowCtx(ctx, &resp, query, merchantId); err != nil { + return nil, err + } + return resp.Id, nil + }, m.queryPrimary) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultMerchantModel) Insert(ctx context.Context, data *Merchant) (sql.Result, error) { + couponOpenMerchantIdKey := fmt.Sprintf("%s%v", cacheCouponOpenMerchantIdPrefix, data.Id) + couponOpenMerchantMerchantIdKey := fmt.Sprintf("%s%v", cacheCouponOpenMerchantMerchantIdPrefix, data.MerchantId) + ret, err := m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", m.table, merchantRowsExpectAutoSet) + return conn.ExecCtx(ctx, query, data.MerchantId, data.FullName, data.Status, data.SignatureMethod, data.RsaPublicKey, data.RsaPrivateKey, data.MchRsaPublicKey, data.Sm2PublicKey, data.Sm2PrivateKey, data.MchSm2PublicKey, data.Sm4SecretKey, data.IpAccess, data.RequestRate, data.Password, data.Phone) + }, couponOpenMerchantIdKey, couponOpenMerchantMerchantIdKey) + return ret, err +} + +func (m *defaultMerchantModel) Update(ctx context.Context, newData *Merchant) error { + data, err := m.FindOne(ctx, newData.Id) + if err != nil { + return err + } + + couponOpenMerchantIdKey := fmt.Sprintf("%s%v", cacheCouponOpenMerchantIdPrefix, data.Id) + couponOpenMerchantMerchantIdKey := fmt.Sprintf("%s%v", cacheCouponOpenMerchantMerchantIdPrefix, data.MerchantId) + _, err = m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("update %s set %s where `id` = ?", m.table, merchantRowsWithPlaceHolder) + return conn.ExecCtx(ctx, query, newData.MerchantId, newData.FullName, newData.Status, newData.SignatureMethod, newData.RsaPublicKey, newData.RsaPrivateKey, newData.MchRsaPublicKey, newData.Sm2PublicKey, newData.Sm2PrivateKey, newData.MchSm2PublicKey, newData.Sm4SecretKey, newData.IpAccess, newData.RequestRate, newData.Password, newData.Phone, newData.Id) + }, couponOpenMerchantIdKey, couponOpenMerchantMerchantIdKey) + return err +} + +func (m *defaultMerchantModel) formatPrimary(primary any) string { + return fmt.Sprintf("%s%v", cacheCouponOpenMerchantIdPrefix, primary) +} + +func (m *defaultMerchantModel) queryPrimary(ctx context.Context, conn sqlx.SqlConn, v, primary any) error { + query := fmt.Sprintf("select %s from %s where `id` = ? limit 1", merchantRows, m.table) + return conn.QueryRowCtx(ctx, v, query, primary) +} + +func (m *defaultMerchantModel) tableName() string { + return m.table +} diff --git a/rpc/transfer.proto b/rpc/transfer.proto old mode 100755 new mode 100644 index 3910c89..45dbf69 --- a/rpc/transfer.proto +++ b/rpc/transfer.proto @@ -7,6 +7,7 @@ option go_package="./transfer"; message DefaultRes { string code=1; + string message=2; } @@ -36,15 +37,15 @@ service Transfer { message RsCouponGrantReq { string vendorNo = 1; - Data data = 2; - message Data{ - string sipOrderNo = 1; - string voucherTag = 2; - int32 accountType = 3; - string accountNo = 4; - string accountInfo = 5; - int32 num = 6; - } + string data = 2; +// message Data{ +// string sipOrderNo = 1; +// string voucherTag = 2; +// int32 accountType = 3; +// string accountNo = 4; +// string accountInfo = 5; +// int32 num = 6; +// } string sign = 3; } @@ -149,7 +150,8 @@ message MarketKeySendReq { message ZltxRechargeProductRes { string code=1; - repeated Product products=2; + string message=2; + repeated Product products=3; message Product{ int64 productId=1; string channelPrice=2; @@ -171,7 +173,7 @@ message ZltxOrderSmsRes { } message ZltxOrderSmsReq { - string merchantId = 1; + int64 merchantId = 1; uint64 timeStamp = 2; string sign = 3; string outTradeNo = 4; @@ -185,14 +187,14 @@ message ZltxOrderCardQueryRes { string outTradeNo=4; } message ZltxOrderCardQueryReq { - string merchantId = 1; + int64 merchantId = 1; uint64 timeStamp = 2; string sign = 3; string outTradeNo = 4; } message ZltxOrderCardReq { - string merchantId = 1; + int64 merchantId = 1; string sign = 2; uint64 timeStamp = 3; string outTradeNo = 4; @@ -215,46 +217,21 @@ message ZltxOrderRechargeQueryRes { string outTradeNo=4; } message ZltxOrderRechargeQueryReq { - string merchantId = 1; + uint64 merchantId = 1; uint64 timeStamp = 2; string sign = 3; string outTradeNo = 4; } message ZltxOrderRechargeReq { - string merchantId = 1; + uint64 merchantId = 1; string sign = 2; uint64 timeStamp = 3; string outTradeNo = 4; int64 productId=5; - string mobile=6; + string rechargeAccount=6; uint32 accountType=7; int32 number=8; string notifyUrl=9; string extendParameter=10; } - - - - -message GetResellerByAppIdReq { - string appId = 1; -} - -message GetResellerByAppIdRes { - int64 id=1; - string merchantId=2; - string resellerId=3; - string appId=4; - string posId=5; - string storeId=6; - int32 apiMod=7; - string publicKey=8; - string privateKey=9; - string merchantPublicKey=10; - string secretKey=11; - string notifyUrl=12; - string subscribeEvent=13; - int32 status=14; - string createTime=15; -} \ No newline at end of file diff --git a/rpc/transfer/transfer.pb.go b/rpc/transfer/transfer.pb.go old mode 100755 new mode 100644 index c3833ee..d68b413 --- a/rpc/transfer/transfer.pb.go +++ b/rpc/transfer/transfer.pb.go @@ -143,9 +143,17 @@ type RsCouponGrantReq struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - VendorNo string `protobuf:"bytes,1,opt,name=vendorNo,proto3" json:"vendorNo,omitempty"` - Data *RsCouponGrantReq_Data `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"` - Sign string `protobuf:"bytes,3,opt,name=sign,proto3" json:"sign,omitempty"` + VendorNo string `protobuf:"bytes,1,opt,name=vendorNo,proto3" json:"vendorNo,omitempty"` + Data string `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"` + // message Data{ + // string sipOrderNo = 1; + // string voucherTag = 2; + // int32 accountType = 3; + // string accountNo = 4; + // string accountInfo = 5; + // int32 num = 6; + // } + Sign string `protobuf:"bytes,3,opt,name=sign,proto3" json:"sign,omitempty"` } func (x *RsCouponGrantReq) Reset() { @@ -187,11 +195,11 @@ func (x *RsCouponGrantReq) GetVendorNo() string { return "" } -func (x *RsCouponGrantReq) GetData() *RsCouponGrantReq_Data { +func (x *RsCouponGrantReq) GetData() string { if x != nil { return x.Data } - return nil + return "" } func (x *RsCouponGrantReq) GetSign() string { @@ -800,7 +808,8 @@ type ZltxRechargeProductRes struct { unknownFields protoimpl.UnknownFields Code string `protobuf:"bytes,1,opt,name=code,proto3" json:"code,omitempty"` - Products []*ZltxRechargeProductRes_Product `protobuf:"bytes,2,rep,name=products,proto3" json:"products,omitempty"` + Message string `protobuf:"bytes,2,opt,name=message,proto3" json:"message,omitempty"` + Products []*ZltxRechargeProductRes_Product `protobuf:"bytes,3,rep,name=products,proto3" json:"products,omitempty"` } func (x *ZltxRechargeProductRes) Reset() { @@ -842,6 +851,13 @@ func (x *ZltxRechargeProductRes) GetCode() string { return "" } +func (x *ZltxRechargeProductRes) GetMessage() string { + if x != nil { + return x.Message + } + return "" +} + func (x *ZltxRechargeProductRes) GetProducts() []*ZltxRechargeProductRes_Product { if x != nil { return x.Products @@ -980,7 +996,7 @@ type ZltxOrderSmsReq struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - MerchantId string `protobuf:"bytes,1,opt,name=merchantId,proto3" json:"merchantId,omitempty"` + MerchantId int64 `protobuf:"varint,1,opt,name=merchantId,proto3" json:"merchantId,omitempty"` TimeStamp uint64 `protobuf:"varint,2,opt,name=timeStamp,proto3" json:"timeStamp,omitempty"` Sign string `protobuf:"bytes,3,opt,name=sign,proto3" json:"sign,omitempty"` OutTradeNo string `protobuf:"bytes,4,opt,name=outTradeNo,proto3" json:"outTradeNo,omitempty"` @@ -1018,11 +1034,11 @@ func (*ZltxOrderSmsReq) Descriptor() ([]byte, []int) { return file_transfer_proto_rawDescGZIP(), []int{13} } -func (x *ZltxOrderSmsReq) GetMerchantId() string { +func (x *ZltxOrderSmsReq) GetMerchantId() int64 { if x != nil { return x.MerchantId } - return "" + return 0 } func (x *ZltxOrderSmsReq) GetTimeStamp() uint64 { @@ -1122,7 +1138,7 @@ type ZltxOrderCardQueryReq struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - MerchantId string `protobuf:"bytes,1,opt,name=merchantId,proto3" json:"merchantId,omitempty"` + MerchantId int64 `protobuf:"varint,1,opt,name=merchantId,proto3" json:"merchantId,omitempty"` TimeStamp uint64 `protobuf:"varint,2,opt,name=timeStamp,proto3" json:"timeStamp,omitempty"` Sign string `protobuf:"bytes,3,opt,name=sign,proto3" json:"sign,omitempty"` OutTradeNo string `protobuf:"bytes,4,opt,name=outTradeNo,proto3" json:"outTradeNo,omitempty"` @@ -1160,11 +1176,11 @@ func (*ZltxOrderCardQueryReq) Descriptor() ([]byte, []int) { return file_transfer_proto_rawDescGZIP(), []int{15} } -func (x *ZltxOrderCardQueryReq) GetMerchantId() string { +func (x *ZltxOrderCardQueryReq) GetMerchantId() int64 { if x != nil { return x.MerchantId } - return "" + return 0 } func (x *ZltxOrderCardQueryReq) GetTimeStamp() uint64 { @@ -1193,7 +1209,7 @@ type ZltxOrderCardReq struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - MerchantId string `protobuf:"bytes,1,opt,name=merchantId,proto3" json:"merchantId,omitempty"` + MerchantId int64 `protobuf:"varint,1,opt,name=merchantId,proto3" json:"merchantId,omitempty"` Sign string `protobuf:"bytes,2,opt,name=sign,proto3" json:"sign,omitempty"` TimeStamp uint64 `protobuf:"varint,3,opt,name=timeStamp,proto3" json:"timeStamp,omitempty"` OutTradeNo string `protobuf:"bytes,4,opt,name=outTradeNo,proto3" json:"outTradeNo,omitempty"` @@ -1237,11 +1253,11 @@ func (*ZltxOrderCardReq) Descriptor() ([]byte, []int) { return file_transfer_proto_rawDescGZIP(), []int{16} } -func (x *ZltxOrderCardReq) GetMerchantId() string { +func (x *ZltxOrderCardReq) GetMerchantId() int64 { if x != nil { return x.MerchantId } - return "" + return 0 } func (x *ZltxOrderCardReq) GetSign() string { @@ -1383,7 +1399,7 @@ type ZltxOrderRechargeQueryReq struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - MerchantId string `protobuf:"bytes,1,opt,name=merchantId,proto3" json:"merchantId,omitempty"` + MerchantId uint64 `protobuf:"varint,1,opt,name=merchantId,proto3" json:"merchantId,omitempty"` TimeStamp uint64 `protobuf:"varint,2,opt,name=timeStamp,proto3" json:"timeStamp,omitempty"` Sign string `protobuf:"bytes,3,opt,name=sign,proto3" json:"sign,omitempty"` OutTradeNo string `protobuf:"bytes,4,opt,name=outTradeNo,proto3" json:"outTradeNo,omitempty"` @@ -1421,11 +1437,11 @@ func (*ZltxOrderRechargeQueryReq) Descriptor() ([]byte, []int) { return file_transfer_proto_rawDescGZIP(), []int{18} } -func (x *ZltxOrderRechargeQueryReq) GetMerchantId() string { +func (x *ZltxOrderRechargeQueryReq) GetMerchantId() uint64 { if x != nil { return x.MerchantId } - return "" + return 0 } func (x *ZltxOrderRechargeQueryReq) GetTimeStamp() uint64 { @@ -1454,12 +1470,12 @@ type ZltxOrderRechargeReq struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - MerchantId string `protobuf:"bytes,1,opt,name=merchantId,proto3" json:"merchantId,omitempty"` + MerchantId uint64 `protobuf:"varint,1,opt,name=merchantId,proto3" json:"merchantId,omitempty"` Sign string `protobuf:"bytes,2,opt,name=sign,proto3" json:"sign,omitempty"` TimeStamp uint64 `protobuf:"varint,3,opt,name=timeStamp,proto3" json:"timeStamp,omitempty"` OutTradeNo string `protobuf:"bytes,4,opt,name=outTradeNo,proto3" json:"outTradeNo,omitempty"` ProductId int64 `protobuf:"varint,5,opt,name=productId,proto3" json:"productId,omitempty"` - Mobile string `protobuf:"bytes,6,opt,name=mobile,proto3" json:"mobile,omitempty"` + RechargeAccount string `protobuf:"bytes,6,opt,name=rechargeAccount,proto3" json:"rechargeAccount,omitempty"` AccountType uint32 `protobuf:"varint,7,opt,name=accountType,proto3" json:"accountType,omitempty"` Number int32 `protobuf:"varint,8,opt,name=number,proto3" json:"number,omitempty"` NotifyUrl string `protobuf:"bytes,9,opt,name=notifyUrl,proto3" json:"notifyUrl,omitempty"` @@ -1498,11 +1514,11 @@ func (*ZltxOrderRechargeReq) Descriptor() ([]byte, []int) { return file_transfer_proto_rawDescGZIP(), []int{19} } -func (x *ZltxOrderRechargeReq) GetMerchantId() string { +func (x *ZltxOrderRechargeReq) GetMerchantId() uint64 { if x != nil { return x.MerchantId } - return "" + return 0 } func (x *ZltxOrderRechargeReq) GetSign() string { @@ -1533,9 +1549,9 @@ func (x *ZltxOrderRechargeReq) GetProductId() int64 { return 0 } -func (x *ZltxOrderRechargeReq) GetMobile() string { +func (x *ZltxOrderRechargeReq) GetRechargeAccount() string { if x != nil { - return x.Mobile + return x.RechargeAccount } return "" } @@ -1568,299 +1584,6 @@ func (x *ZltxOrderRechargeReq) GetExtendParameter() string { return "" } -type GetResellerByAppIdReq struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - AppId string `protobuf:"bytes,1,opt,name=appId,proto3" json:"appId,omitempty"` -} - -func (x *GetResellerByAppIdReq) Reset() { - *x = GetResellerByAppIdReq{} - if protoimpl.UnsafeEnabled { - mi := &file_transfer_proto_msgTypes[20] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *GetResellerByAppIdReq) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetResellerByAppIdReq) ProtoMessage() {} - -func (x *GetResellerByAppIdReq) ProtoReflect() protoreflect.Message { - mi := &file_transfer_proto_msgTypes[20] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GetResellerByAppIdReq.ProtoReflect.Descriptor instead. -func (*GetResellerByAppIdReq) Descriptor() ([]byte, []int) { - return file_transfer_proto_rawDescGZIP(), []int{20} -} - -func (x *GetResellerByAppIdReq) GetAppId() string { - if x != nil { - return x.AppId - } - return "" -} - -type GetResellerByAppIdRes struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Id int64 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` - MerchantId string `protobuf:"bytes,2,opt,name=merchantId,proto3" json:"merchantId,omitempty"` - ResellerId string `protobuf:"bytes,3,opt,name=resellerId,proto3" json:"resellerId,omitempty"` - AppId string `protobuf:"bytes,4,opt,name=appId,proto3" json:"appId,omitempty"` - PosId string `protobuf:"bytes,5,opt,name=posId,proto3" json:"posId,omitempty"` - StoreId string `protobuf:"bytes,6,opt,name=storeId,proto3" json:"storeId,omitempty"` - ApiMod int32 `protobuf:"varint,7,opt,name=apiMod,proto3" json:"apiMod,omitempty"` - PublicKey string `protobuf:"bytes,8,opt,name=publicKey,proto3" json:"publicKey,omitempty"` - PrivateKey string `protobuf:"bytes,9,opt,name=privateKey,proto3" json:"privateKey,omitempty"` - MerchantPublicKey string `protobuf:"bytes,10,opt,name=merchantPublicKey,proto3" json:"merchantPublicKey,omitempty"` - SecretKey string `protobuf:"bytes,11,opt,name=secretKey,proto3" json:"secretKey,omitempty"` - NotifyUrl string `protobuf:"bytes,12,opt,name=notifyUrl,proto3" json:"notifyUrl,omitempty"` - SubscribeEvent string `protobuf:"bytes,13,opt,name=subscribeEvent,proto3" json:"subscribeEvent,omitempty"` - Status int32 `protobuf:"varint,14,opt,name=status,proto3" json:"status,omitempty"` - CreateTime string `protobuf:"bytes,15,opt,name=createTime,proto3" json:"createTime,omitempty"` -} - -func (x *GetResellerByAppIdRes) Reset() { - *x = GetResellerByAppIdRes{} - if protoimpl.UnsafeEnabled { - mi := &file_transfer_proto_msgTypes[21] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *GetResellerByAppIdRes) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetResellerByAppIdRes) ProtoMessage() {} - -func (x *GetResellerByAppIdRes) ProtoReflect() protoreflect.Message { - mi := &file_transfer_proto_msgTypes[21] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GetResellerByAppIdRes.ProtoReflect.Descriptor instead. -func (*GetResellerByAppIdRes) Descriptor() ([]byte, []int) { - return file_transfer_proto_rawDescGZIP(), []int{21} -} - -func (x *GetResellerByAppIdRes) GetId() int64 { - if x != nil { - return x.Id - } - return 0 -} - -func (x *GetResellerByAppIdRes) GetMerchantId() string { - if x != nil { - return x.MerchantId - } - return "" -} - -func (x *GetResellerByAppIdRes) GetResellerId() string { - if x != nil { - return x.ResellerId - } - return "" -} - -func (x *GetResellerByAppIdRes) GetAppId() string { - if x != nil { - return x.AppId - } - return "" -} - -func (x *GetResellerByAppIdRes) GetPosId() string { - if x != nil { - return x.PosId - } - return "" -} - -func (x *GetResellerByAppIdRes) GetStoreId() string { - if x != nil { - return x.StoreId - } - return "" -} - -func (x *GetResellerByAppIdRes) GetApiMod() int32 { - if x != nil { - return x.ApiMod - } - return 0 -} - -func (x *GetResellerByAppIdRes) GetPublicKey() string { - if x != nil { - return x.PublicKey - } - return "" -} - -func (x *GetResellerByAppIdRes) GetPrivateKey() string { - if x != nil { - return x.PrivateKey - } - return "" -} - -func (x *GetResellerByAppIdRes) GetMerchantPublicKey() string { - if x != nil { - return x.MerchantPublicKey - } - return "" -} - -func (x *GetResellerByAppIdRes) GetSecretKey() string { - if x != nil { - return x.SecretKey - } - return "" -} - -func (x *GetResellerByAppIdRes) GetNotifyUrl() string { - if x != nil { - return x.NotifyUrl - } - return "" -} - -func (x *GetResellerByAppIdRes) GetSubscribeEvent() string { - if x != nil { - return x.SubscribeEvent - } - return "" -} - -func (x *GetResellerByAppIdRes) GetStatus() int32 { - if x != nil { - return x.Status - } - return 0 -} - -func (x *GetResellerByAppIdRes) GetCreateTime() string { - if x != nil { - return x.CreateTime - } - return "" -} - -type RsCouponGrantReq_Data struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - SipOrderNo string `protobuf:"bytes,1,opt,name=sipOrderNo,proto3" json:"sipOrderNo,omitempty"` - VoucherTag string `protobuf:"bytes,2,opt,name=voucherTag,proto3" json:"voucherTag,omitempty"` - AccountType int32 `protobuf:"varint,3,opt,name=accountType,proto3" json:"accountType,omitempty"` - AccountNo string `protobuf:"bytes,4,opt,name=accountNo,proto3" json:"accountNo,omitempty"` - AccountInfo string `protobuf:"bytes,5,opt,name=accountInfo,proto3" json:"accountInfo,omitempty"` - Num int32 `protobuf:"varint,6,opt,name=num,proto3" json:"num,omitempty"` -} - -func (x *RsCouponGrantReq_Data) Reset() { - *x = RsCouponGrantReq_Data{} - if protoimpl.UnsafeEnabled { - mi := &file_transfer_proto_msgTypes[22] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *RsCouponGrantReq_Data) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*RsCouponGrantReq_Data) ProtoMessage() {} - -func (x *RsCouponGrantReq_Data) ProtoReflect() protoreflect.Message { - mi := &file_transfer_proto_msgTypes[22] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use RsCouponGrantReq_Data.ProtoReflect.Descriptor instead. -func (*RsCouponGrantReq_Data) Descriptor() ([]byte, []int) { - return file_transfer_proto_rawDescGZIP(), []int{2, 0} -} - -func (x *RsCouponGrantReq_Data) GetSipOrderNo() string { - if x != nil { - return x.SipOrderNo - } - return "" -} - -func (x *RsCouponGrantReq_Data) GetVoucherTag() string { - if x != nil { - return x.VoucherTag - } - return "" -} - -func (x *RsCouponGrantReq_Data) GetAccountType() int32 { - if x != nil { - return x.AccountType - } - return 0 -} - -func (x *RsCouponGrantReq_Data) GetAccountNo() string { - if x != nil { - return x.AccountNo - } - return "" -} - -func (x *RsCouponGrantReq_Data) GetAccountInfo() string { - if x != nil { - return x.AccountInfo - } - return "" -} - -func (x *RsCouponGrantReq_Data) GetNum() int32 { - if x != nil { - return x.Num - } - return 0 -} - type RsCouponGrantRes_Data struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1874,7 +1597,7 @@ type RsCouponGrantRes_Data struct { func (x *RsCouponGrantRes_Data) Reset() { *x = RsCouponGrantRes_Data{} if protoimpl.UnsafeEnabled { - mi := &file_transfer_proto_msgTypes[23] + mi := &file_transfer_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1887,7 +1610,7 @@ func (x *RsCouponGrantRes_Data) String() string { func (*RsCouponGrantRes_Data) ProtoMessage() {} func (x *RsCouponGrantRes_Data) ProtoReflect() protoreflect.Message { - mi := &file_transfer_proto_msgTypes[23] + mi := &file_transfer_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1940,7 +1663,7 @@ type RsCouponGrantRes_Data_VoucherInfo struct { func (x *RsCouponGrantRes_Data_VoucherInfo) Reset() { *x = RsCouponGrantRes_Data_VoucherInfo{} if protoimpl.UnsafeEnabled { - mi := &file_transfer_proto_msgTypes[24] + mi := &file_transfer_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1953,7 +1676,7 @@ func (x *RsCouponGrantRes_Data_VoucherInfo) String() string { func (*RsCouponGrantRes_Data_VoucherInfo) ProtoMessage() {} func (x *RsCouponGrantRes_Data_VoucherInfo) ProtoReflect() protoreflect.Message { - mi := &file_transfer_proto_msgTypes[24] + mi := &file_transfer_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2024,7 +1747,7 @@ type MarketQueryRes_Data struct { func (x *MarketQueryRes_Data) Reset() { *x = MarketQueryRes_Data{} if protoimpl.UnsafeEnabled { - mi := &file_transfer_proto_msgTypes[25] + mi := &file_transfer_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2037,7 +1760,7 @@ func (x *MarketQueryRes_Data) String() string { func (*MarketQueryRes_Data) ProtoMessage() {} func (x *MarketQueryRes_Data) ProtoReflect() protoreflect.Message { - mi := &file_transfer_proto_msgTypes[25] + mi := &file_transfer_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2088,7 +1811,7 @@ type MarketKeyDiscardRes_Data struct { func (x *MarketKeyDiscardRes_Data) Reset() { *x = MarketKeyDiscardRes_Data{} if protoimpl.UnsafeEnabled { - mi := &file_transfer_proto_msgTypes[26] + mi := &file_transfer_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2101,7 +1824,7 @@ func (x *MarketKeyDiscardRes_Data) String() string { func (*MarketKeyDiscardRes_Data) ProtoMessage() {} func (x *MarketKeyDiscardRes_Data) ProtoReflect() protoreflect.Message { - mi := &file_transfer_proto_msgTypes[26] + mi := &file_transfer_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2161,7 +1884,7 @@ type MarketKeySendRes_Data struct { func (x *MarketKeySendRes_Data) Reset() { *x = MarketKeySendRes_Data{} if protoimpl.UnsafeEnabled { - mi := &file_transfer_proto_msgTypes[27] + mi := &file_transfer_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2174,7 +1897,7 @@ func (x *MarketKeySendRes_Data) String() string { func (*MarketKeySendRes_Data) ProtoMessage() {} func (x *MarketKeySendRes_Data) ProtoReflect() protoreflect.Message { - mi := &file_transfer_proto_msgTypes[27] + mi := &file_transfer_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2246,7 +1969,7 @@ type ZltxRechargeProductRes_Product struct { func (x *ZltxRechargeProductRes_Product) Reset() { *x = ZltxRechargeProductRes_Product{} if protoimpl.UnsafeEnabled { - mi := &file_transfer_proto_msgTypes[28] + mi := &file_transfer_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2259,7 +1982,7 @@ func (x *ZltxRechargeProductRes_Product) String() string { func (*ZltxRechargeProductRes_Product) ProtoMessage() {} func (x *ZltxRechargeProductRes_Product) ProtoReflect() protoreflect.Message { - mi := &file_transfer_proto_msgTypes[28] + mi := &file_transfer_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2317,362 +2040,319 @@ var file_transfer_proto_rawDesc = []byte{ 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x67, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x73, 0x69, 0x67, 0x6e, 0x22, 0xb4, 0x02, 0x0a, 0x10, 0x52, 0x73, 0x43, 0x6f, 0x75, - 0x70, 0x6f, 0x6e, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x12, 0x1a, 0x0a, 0x08, 0x76, - 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x4e, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x76, - 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x4e, 0x6f, 0x12, 0x33, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, - 0x2e, 0x52, 0x73, 0x43, 0x6f, 0x75, 0x70, 0x6f, 0x6e, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x52, 0x65, - 0x71, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, - 0x73, 0x69, 0x67, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x73, 0x69, 0x67, 0x6e, - 0x1a, 0xba, 0x01, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x69, 0x70, - 0x4f, 0x72, 0x64, 0x65, 0x72, 0x4e, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, - 0x69, 0x70, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x4e, 0x6f, 0x12, 0x1e, 0x0a, 0x0a, 0x76, 0x6f, 0x75, - 0x63, 0x68, 0x65, 0x72, 0x54, 0x61, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x76, - 0x6f, 0x75, 0x63, 0x68, 0x65, 0x72, 0x54, 0x61, 0x67, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x63, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, - 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, - 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x4e, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x4e, 0x6f, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x63, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, - 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x6e, - 0x75, 0x6d, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6e, 0x75, 0x6d, 0x22, 0xff, 0x03, - 0x0a, 0x10, 0x52, 0x73, 0x43, 0x6f, 0x75, 0x70, 0x6f, 0x6e, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x52, - 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x33, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, - 0x72, 0x2e, 0x52, 0x73, 0x43, 0x6f, 0x75, 0x70, 0x6f, 0x6e, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x52, - 0x65, 0x73, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x1a, 0xef, 0x02, - 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x69, 0x70, 0x4f, 0x72, 0x64, - 0x65, 0x72, 0x4e, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x69, 0x70, 0x4f, - 0x72, 0x64, 0x65, 0x72, 0x4e, 0x6f, 0x12, 0x24, 0x0a, 0x0d, 0x76, 0x65, 0x6e, 0x64, 0x6f, 0x72, - 0x4f, 0x72, 0x64, 0x65, 0x72, 0x4e, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x76, - 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x4e, 0x6f, 0x12, 0x4d, 0x0a, 0x0b, - 0x76, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x03, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x2b, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x2e, 0x52, 0x73, 0x43, - 0x6f, 0x75, 0x70, 0x6f, 0x6e, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x2e, 0x44, 0x61, - 0x74, 0x61, 0x2e, 0x56, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, - 0x76, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x1a, 0xd1, 0x01, 0x0a, 0x0b, - 0x56, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x20, 0x0a, 0x0b, 0x76, - 0x6f, 0x75, 0x63, 0x68, 0x65, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x76, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x28, 0x0a, - 0x0f, 0x76, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x72, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x76, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x72, 0x50, - 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x76, 0x6f, 0x75, 0x63, 0x68, - 0x65, 0x72, 0x44, 0x65, 0x73, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x76, 0x6f, - 0x75, 0x63, 0x68, 0x65, 0x72, 0x44, 0x65, 0x73, 0x63, 0x12, 0x1c, 0x0a, 0x09, 0x71, 0x72, 0x43, - 0x6f, 0x64, 0x65, 0x55, 0x72, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x71, 0x72, - 0x43, 0x6f, 0x64, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, - 0x54, 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, - 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x22, - 0xe0, 0x01, 0x0a, 0x0e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, - 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x65, 0x72, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x10, 0x0a, 0x03, - 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6d, 0x73, 0x67, 0x12, 0x31, - 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x74, - 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x04, 0x64, 0x61, 0x74, - 0x61, 0x1a, 0x6f, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x1d, 0x0a, 0x0a, 0x76, 0x6f, 0x75, - 0x63, 0x68, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, - 0x6f, 0x75, 0x63, 0x68, 0x65, 0x72, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x76, 0x6f, 0x75, 0x63, - 0x68, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, - 0x76, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x76, - 0x6f, 0x75, 0x63, 0x68, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0d, 0x76, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x22, 0xf1, 0x01, 0x0a, 0x0e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x61, 0x70, 0x70, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x61, 0x70, 0x70, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, - 0x73, 0x69, 0x67, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x73, 0x69, 0x67, 0x6e, - 0x12, 0x19, 0x0a, 0x08, 0x72, 0x65, 0x71, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x71, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x15, 0x0a, 0x06, 0x6d, - 0x65, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6d, 0x65, 0x6d, - 0x49, 0x64, 0x12, 0x22, 0x0a, 0x0d, 0x72, 0x65, 0x71, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, - 0x5f, 0x6e, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x71, 0x53, 0x65, - 0x72, 0x69, 0x61, 0x6c, 0x4e, 0x6f, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x12, 0x1d, 0x0a, 0x0a, 0x76, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x72, 0x5f, - 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x6f, 0x75, 0x63, 0x68, 0x65, - 0x72, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x76, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x72, 0x5f, 0x63, - 0x6f, 0x64, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x76, 0x6f, 0x75, 0x63, 0x68, - 0x65, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x22, 0xff, 0x01, 0x0a, 0x13, 0x4d, 0x61, 0x72, 0x6b, 0x65, - 0x74, 0x4b, 0x65, 0x79, 0x44, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x12, 0x18, - 0x0a, 0x07, 0x65, 0x72, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x65, 0x72, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6d, 0x73, 0x67, 0x12, 0x36, 0x0a, 0x04, 0x64, 0x61, - 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, - 0x66, 0x65, 0x72, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x44, 0x69, 0x73, - 0x63, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x04, 0x64, 0x61, - 0x74, 0x61, 0x1a, 0x83, 0x01, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x1d, 0x0a, 0x0a, 0x76, - 0x6f, 0x75, 0x63, 0x68, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x76, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x72, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x76, 0x6f, - 0x75, 0x63, 0x68, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x76, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x21, 0x0a, - 0x0c, 0x76, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x72, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x76, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x72, 0x44, 0x61, 0x74, 0x65, - 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0xf6, 0x01, 0x0a, 0x13, 0x4d, 0x61, 0x72, - 0x6b, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x44, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, - 0x12, 0x15, 0x0a, 0x06, 0x61, 0x70, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x61, 0x70, 0x70, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x67, 0x6e, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x73, 0x69, 0x67, 0x6e, 0x12, 0x19, 0x0a, 0x08, 0x72, - 0x65, 0x71, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, - 0x65, 0x71, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x15, 0x0a, 0x06, 0x6d, 0x65, 0x6d, 0x5f, 0x69, 0x64, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6d, 0x65, 0x6d, 0x49, 0x64, 0x12, 0x22, 0x0a, - 0x0d, 0x72, 0x65, 0x71, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x5f, 0x6e, 0x6f, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x71, 0x53, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x4e, - 0x6f, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, - 0x1d, 0x0a, 0x0a, 0x76, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x72, 0x49, 0x64, 0x12, 0x21, - 0x0a, 0x0c, 0x76, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x76, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x72, 0x43, 0x6f, 0x64, - 0x65, 0x22, 0xc2, 0x02, 0x0a, 0x10, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x53, - 0x65, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x43, 0x6f, 0x64, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x65, 0x72, 0x72, 0x43, 0x6f, 0x64, 0x65, - 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6d, - 0x73, 0x67, 0x12, 0x33, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1f, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x2e, 0x4d, 0x61, 0x72, 0x6b, - 0x65, 0x74, 0x4b, 0x65, 0x79, 0x53, 0x65, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x2e, 0x44, 0x61, 0x74, - 0x61, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x1a, 0xcc, 0x01, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, - 0x12, 0x1d, 0x0a, 0x0a, 0x76, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, + 0x52, 0x04, 0x73, 0x69, 0x67, 0x6e, 0x22, 0x56, 0x0a, 0x10, 0x52, 0x73, 0x43, 0x6f, 0x75, 0x70, + 0x6f, 0x6e, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x12, 0x1a, 0x0a, 0x08, 0x76, 0x65, + 0x6e, 0x64, 0x6f, 0x72, 0x4e, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x76, 0x65, + 0x6e, 0x64, 0x6f, 0x72, 0x4e, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, + 0x67, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x73, 0x69, 0x67, 0x6e, 0x22, 0xff, + 0x03, 0x0a, 0x10, 0x52, 0x73, 0x43, 0x6f, 0x75, 0x70, 0x6f, 0x6e, 0x47, 0x72, 0x61, 0x6e, 0x74, + 0x52, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x33, 0x0a, 0x04, 0x64, 0x61, 0x74, + 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, + 0x65, 0x72, 0x2e, 0x52, 0x73, 0x43, 0x6f, 0x75, 0x70, 0x6f, 0x6e, 0x47, 0x72, 0x61, 0x6e, 0x74, + 0x52, 0x65, 0x73, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x1a, 0xef, + 0x02, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x69, 0x70, 0x4f, 0x72, + 0x64, 0x65, 0x72, 0x4e, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x69, 0x70, + 0x4f, 0x72, 0x64, 0x65, 0x72, 0x4e, 0x6f, 0x12, 0x24, 0x0a, 0x0d, 0x76, 0x65, 0x6e, 0x64, 0x6f, + 0x72, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x4e, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, + 0x76, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x4e, 0x6f, 0x12, 0x4d, 0x0a, + 0x0b, 0x76, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x03, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x2e, 0x52, 0x73, + 0x43, 0x6f, 0x75, 0x70, 0x6f, 0x6e, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x2e, 0x44, + 0x61, 0x74, 0x61, 0x2e, 0x56, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x0b, 0x76, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x1a, 0xd1, 0x01, 0x0a, + 0x0b, 0x56, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x20, 0x0a, 0x0b, + 0x76, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x76, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x28, + 0x0a, 0x0f, 0x76, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x72, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x76, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x72, + 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x76, 0x6f, 0x75, 0x63, + 0x68, 0x65, 0x72, 0x44, 0x65, 0x73, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x76, + 0x6f, 0x75, 0x63, 0x68, 0x65, 0x72, 0x44, 0x65, 0x73, 0x63, 0x12, 0x1c, 0x0a, 0x09, 0x71, 0x72, + 0x43, 0x6f, 0x64, 0x65, 0x55, 0x72, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x71, + 0x72, 0x43, 0x6f, 0x64, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x74, 0x61, 0x72, + 0x74, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x61, + 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, + 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, + 0x22, 0xe0, 0x01, 0x0a, 0x0e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x52, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x65, 0x72, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x10, 0x0a, + 0x03, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6d, 0x73, 0x67, 0x12, + 0x31, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x04, 0x64, 0x61, + 0x74, 0x61, 0x1a, 0x6f, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x1d, 0x0a, 0x0a, 0x76, 0x6f, + 0x75, 0x63, 0x68, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x76, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x72, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x76, 0x6f, 0x75, + 0x63, 0x68, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x76, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x25, 0x0a, 0x0e, + 0x76, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x76, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x72, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x22, 0xf1, 0x01, 0x0a, 0x0e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x61, 0x70, 0x70, 0x5f, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x61, 0x70, 0x70, 0x49, 0x64, 0x12, 0x12, 0x0a, + 0x04, 0x73, 0x69, 0x67, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x73, 0x69, 0x67, + 0x6e, 0x12, 0x19, 0x0a, 0x08, 0x72, 0x65, 0x71, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x71, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x15, 0x0a, 0x06, + 0x6d, 0x65, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6d, 0x65, + 0x6d, 0x49, 0x64, 0x12, 0x22, 0x0a, 0x0d, 0x72, 0x65, 0x71, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x61, + 0x6c, 0x5f, 0x6e, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x71, 0x53, + 0x65, 0x72, 0x69, 0x61, 0x6c, 0x4e, 0x6f, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x1d, 0x0a, 0x0a, 0x76, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x72, + 0x5f, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x6f, 0x75, 0x63, 0x68, + 0x65, 0x72, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x76, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x72, 0x5f, + 0x63, 0x6f, 0x64, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x76, 0x6f, 0x75, 0x63, + 0x68, 0x65, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x22, 0xff, 0x01, 0x0a, 0x13, 0x4d, 0x61, 0x72, 0x6b, + 0x65, 0x74, 0x4b, 0x65, 0x79, 0x44, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x12, + 0x18, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x65, 0x72, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x73, 0x67, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6d, 0x73, 0x67, 0x12, 0x36, 0x0a, 0x04, 0x64, + 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x66, 0x65, 0x72, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x44, 0x69, + 0x73, 0x63, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x04, 0x64, + 0x61, 0x74, 0x61, 0x1a, 0x83, 0x01, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x1d, 0x0a, 0x0a, + 0x76, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x76, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x72, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x76, + 0x6f, 0x75, 0x63, 0x68, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x76, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x21, + 0x0a, 0x0c, 0x76, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x72, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x76, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x72, 0x44, 0x61, 0x74, + 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0xf6, 0x01, 0x0a, 0x13, 0x4d, 0x61, + 0x72, 0x6b, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x44, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x52, 0x65, + 0x71, 0x12, 0x15, 0x0a, 0x06, 0x61, 0x70, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x61, 0x70, 0x70, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x67, 0x6e, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x73, 0x69, 0x67, 0x6e, 0x12, 0x19, 0x0a, 0x08, + 0x72, 0x65, 0x71, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x72, 0x65, 0x71, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x15, 0x0a, 0x06, 0x6d, 0x65, 0x6d, 0x5f, 0x69, + 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6d, 0x65, 0x6d, 0x49, 0x64, 0x12, 0x22, + 0x0a, 0x0d, 0x72, 0x65, 0x71, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x5f, 0x6e, 0x6f, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x71, 0x53, 0x65, 0x72, 0x69, 0x61, 0x6c, + 0x4e, 0x6f, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x12, 0x1d, 0x0a, 0x0a, 0x76, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x72, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x76, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x76, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x72, 0x43, 0x6f, - 0x64, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x5f, 0x75, 0x72, 0x6c, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x55, 0x72, 0x6c, 0x12, - 0x23, 0x0a, 0x0d, 0x76, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x72, 0x5f, 0x73, 0x64, 0x61, 0x74, 0x65, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x76, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x72, 0x53, - 0x64, 0x61, 0x74, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x76, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x72, 0x5f, - 0x65, 0x64, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x76, 0x6f, 0x75, - 0x63, 0x68, 0x65, 0x72, 0x45, 0x64, 0x61, 0x74, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x6f, 0x64, - 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6f, - 0x64, 0x65, 0x54, 0x79, 0x70, 0x65, 0x22, 0xc0, 0x02, 0x0a, 0x10, 0x4d, 0x61, 0x72, 0x6b, 0x65, - 0x74, 0x4b, 0x65, 0x79, 0x53, 0x65, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, 0x61, - 0x70, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x61, 0x70, 0x70, - 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x67, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x04, 0x73, 0x69, 0x67, 0x6e, 0x12, 0x19, 0x0a, 0x08, 0x72, 0x65, 0x71, 0x5f, 0x63, 0x6f, - 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x71, 0x43, 0x6f, 0x64, - 0x65, 0x12, 0x15, 0x0a, 0x06, 0x6d, 0x65, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x6d, 0x65, 0x6d, 0x49, 0x64, 0x12, 0x22, 0x0a, 0x0d, 0x72, 0x65, 0x71, 0x5f, - 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x5f, 0x6e, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x72, 0x65, 0x71, 0x53, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x4e, 0x6f, 0x12, 0x1c, 0x0a, 0x09, - 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x15, 0x0a, 0x06, 0x70, 0x6f, - 0x73, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x6f, 0x73, 0x49, - 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x76, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x72, 0x49, 0x64, - 0x12, 0x1f, 0x0a, 0x0b, 0x76, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x72, 0x5f, 0x6e, 0x75, 0x6d, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x76, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x72, 0x4e, 0x75, - 0x6d, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x6f, 0x62, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x6f, 0x18, 0x0a, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x6f, 0x62, 0x69, 0x6c, 0x65, 0x4e, 0x6f, 0x12, 0x19, - 0x0a, 0x08, 0x73, 0x65, 0x6e, 0x64, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x73, 0x65, 0x6e, 0x64, 0x4d, 0x73, 0x67, 0x22, 0x82, 0x02, 0x0a, 0x16, 0x5a, 0x6c, - 0x74, 0x78, 0x52, 0x65, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, - 0x74, 0x52, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x44, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x64, - 0x75, 0x63, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x74, 0x72, 0x61, - 0x6e, 0x73, 0x66, 0x65, 0x72, 0x2e, 0x5a, 0x6c, 0x74, 0x78, 0x52, 0x65, 0x63, 0x68, 0x61, 0x72, - 0x67, 0x65, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x52, 0x65, 0x73, 0x2e, 0x50, 0x72, 0x6f, - 0x64, 0x75, 0x63, 0x74, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x1a, 0x8d, - 0x01, 0x0a, 0x07, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x72, - 0x6f, 0x64, 0x75, 0x63, 0x74, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x70, - 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x49, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x68, 0x61, 0x6e, - 0x6e, 0x65, 0x6c, 0x50, 0x72, 0x69, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, - 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x1a, 0x0a, 0x08, - 0x69, 0x74, 0x65, 0x6d, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x69, 0x74, 0x65, 0x6d, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x6f, 0x72, 0x69, 0x67, - 0x69, 0x6e, 0x61, 0x6c, 0x50, 0x72, 0x69, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0d, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x50, 0x72, 0x69, 0x63, 0x65, 0x22, 0x43, - 0x0a, 0x13, 0x5a, 0x6c, 0x74, 0x78, 0x52, 0x65, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x62, 0x61, 0x6c, - 0x61, 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x62, 0x61, 0x6c, 0x61, - 0x6e, 0x63, 0x65, 0x22, 0x77, 0x0a, 0x0f, 0x5a, 0x6c, 0x74, 0x78, 0x4f, 0x72, 0x64, 0x65, 0x72, - 0x53, 0x6d, 0x73, 0x52, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1e, 0x0a, 0x0a, - 0x6f, 0x75, 0x74, 0x54, 0x72, 0x61, 0x64, 0x65, 0x4e, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x6f, 0x75, 0x74, 0x54, 0x72, 0x61, 0x64, 0x65, 0x4e, 0x6f, 0x22, 0x83, 0x01, 0x0a, - 0x0f, 0x5a, 0x6c, 0x74, 0x78, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x53, 0x6d, 0x73, 0x52, 0x65, 0x71, - 0x12, 0x1e, 0x0a, 0x0a, 0x6d, 0x65, 0x72, 0x63, 0x68, 0x61, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6d, 0x65, 0x72, 0x63, 0x68, 0x61, 0x6e, 0x74, 0x49, 0x64, - 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x12, - 0x0a, 0x04, 0x73, 0x69, 0x67, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x73, 0x69, - 0x67, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x6f, 0x75, 0x74, 0x54, 0x72, 0x61, 0x64, 0x65, 0x4e, 0x6f, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6f, 0x75, 0x74, 0x54, 0x72, 0x61, 0x64, 0x65, - 0x4e, 0x6f, 0x22, 0x7d, 0x0a, 0x15, 0x5a, 0x6c, 0x74, 0x78, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x43, - 0x61, 0x72, 0x64, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x63, - 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, - 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x6f, 0x75, 0x74, 0x54, 0x72, 0x61, 0x64, 0x65, 0x4e, 0x6f, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6f, 0x75, 0x74, 0x54, 0x72, 0x61, 0x64, 0x65, 0x4e, - 0x6f, 0x22, 0x89, 0x01, 0x0a, 0x15, 0x5a, 0x6c, 0x74, 0x78, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x43, - 0x61, 0x72, 0x64, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x12, 0x1e, 0x0a, 0x0a, 0x6d, - 0x65, 0x72, 0x63, 0x68, 0x61, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x76, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x72, 0x43, 0x6f, + 0x64, 0x65, 0x22, 0xc2, 0x02, 0x0a, 0x10, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x4b, 0x65, 0x79, + 0x53, 0x65, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x43, 0x6f, + 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x65, 0x72, 0x72, 0x43, 0x6f, 0x64, + 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6d, 0x73, 0x67, 0x12, 0x33, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1f, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x2e, 0x4d, 0x61, 0x72, + 0x6b, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x53, 0x65, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x2e, 0x44, 0x61, + 0x74, 0x61, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x1a, 0xcc, 0x01, 0x0a, 0x04, 0x44, 0x61, 0x74, + 0x61, 0x12, 0x1d, 0x0a, 0x0a, 0x76, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x72, 0x49, 0x64, + 0x12, 0x21, 0x0a, 0x0c, 0x76, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x64, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x76, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x72, 0x43, + 0x6f, 0x64, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x5f, 0x75, 0x72, 0x6c, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x55, 0x72, 0x6c, + 0x12, 0x23, 0x0a, 0x0d, 0x76, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x72, 0x5f, 0x73, 0x64, 0x61, 0x74, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x76, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x72, + 0x53, 0x64, 0x61, 0x74, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x76, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x72, + 0x5f, 0x65, 0x64, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x76, 0x6f, + 0x75, 0x63, 0x68, 0x65, 0x72, 0x45, 0x64, 0x61, 0x74, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x6f, + 0x64, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, + 0x6f, 0x64, 0x65, 0x54, 0x79, 0x70, 0x65, 0x22, 0xc0, 0x02, 0x0a, 0x10, 0x4d, 0x61, 0x72, 0x6b, + 0x65, 0x74, 0x4b, 0x65, 0x79, 0x53, 0x65, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x12, 0x15, 0x0a, 0x06, + 0x61, 0x70, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x61, 0x70, + 0x70, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x67, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x04, 0x73, 0x69, 0x67, 0x6e, 0x12, 0x19, 0x0a, 0x08, 0x72, 0x65, 0x71, 0x5f, 0x63, + 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x71, 0x43, 0x6f, + 0x64, 0x65, 0x12, 0x15, 0x0a, 0x06, 0x6d, 0x65, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x6d, 0x65, 0x6d, 0x49, 0x64, 0x12, 0x22, 0x0a, 0x0d, 0x72, 0x65, 0x71, + 0x5f, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x5f, 0x6e, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x72, 0x65, 0x71, 0x53, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x4e, 0x6f, 0x12, 0x1c, 0x0a, + 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x15, 0x0a, 0x06, 0x70, + 0x6f, 0x73, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x6f, 0x73, + 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x76, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x72, 0x5f, 0x69, 0x64, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x72, 0x49, + 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x76, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x72, 0x5f, 0x6e, 0x75, 0x6d, + 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x76, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x72, 0x4e, + 0x75, 0x6d, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x6f, 0x62, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x6f, 0x18, + 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x6f, 0x62, 0x69, 0x6c, 0x65, 0x4e, 0x6f, 0x12, + 0x19, 0x0a, 0x08, 0x73, 0x65, 0x6e, 0x64, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x73, 0x65, 0x6e, 0x64, 0x4d, 0x73, 0x67, 0x22, 0x9c, 0x02, 0x0a, 0x16, 0x5a, + 0x6c, 0x74, 0x78, 0x52, 0x65, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x64, 0x75, + 0x63, 0x74, 0x52, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x12, 0x44, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x18, + 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, + 0x2e, 0x5a, 0x6c, 0x74, 0x78, 0x52, 0x65, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x50, 0x72, 0x6f, + 0x64, 0x75, 0x63, 0x74, 0x52, 0x65, 0x73, 0x2e, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x52, + 0x08, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x1a, 0x8d, 0x01, 0x0a, 0x07, 0x50, 0x72, + 0x6f, 0x64, 0x75, 0x63, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, + 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, + 0x74, 0x49, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x50, 0x72, + 0x69, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x68, 0x61, 0x6e, 0x6e, + 0x65, 0x6c, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x74, 0x65, 0x6d, 0x4e, + 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x69, 0x74, 0x65, 0x6d, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x50, + 0x72, 0x69, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6f, 0x72, 0x69, 0x67, + 0x69, 0x6e, 0x61, 0x6c, 0x50, 0x72, 0x69, 0x63, 0x65, 0x22, 0x43, 0x0a, 0x13, 0x5a, 0x6c, 0x74, + 0x78, 0x52, 0x65, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, + 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x63, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x22, 0x77, + 0x0a, 0x0f, 0x5a, 0x6c, 0x74, 0x78, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x53, 0x6d, 0x73, 0x52, 0x65, + 0x73, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, + 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x6f, 0x75, 0x74, 0x54, 0x72, + 0x61, 0x64, 0x65, 0x4e, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6f, 0x75, 0x74, + 0x54, 0x72, 0x61, 0x64, 0x65, 0x4e, 0x6f, 0x22, 0x83, 0x01, 0x0a, 0x0f, 0x5a, 0x6c, 0x74, 0x78, + 0x4f, 0x72, 0x64, 0x65, 0x72, 0x53, 0x6d, 0x73, 0x52, 0x65, 0x71, 0x12, 0x1e, 0x0a, 0x0a, 0x6d, + 0x65, 0x72, 0x63, 0x68, 0x61, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x6d, 0x65, 0x72, 0x63, 0x68, 0x61, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x67, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x73, 0x69, 0x67, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x6f, 0x75, 0x74, 0x54, 0x72, 0x61, 0x64, 0x65, 0x4e, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x6f, 0x75, 0x74, 0x54, 0x72, 0x61, 0x64, 0x65, 0x4e, 0x6f, 0x22, 0xbc, 0x02, - 0x0a, 0x10, 0x5a, 0x6c, 0x74, 0x78, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x43, 0x61, 0x72, 0x64, 0x52, - 0x65, 0x71, 0x12, 0x1e, 0x0a, 0x0a, 0x6d, 0x65, 0x72, 0x63, 0x68, 0x61, 0x6e, 0x74, 0x49, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6d, 0x65, 0x72, 0x63, 0x68, 0x61, 0x6e, 0x74, - 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x67, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x73, 0x69, 0x67, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x53, 0x74, - 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x53, - 0x74, 0x61, 0x6d, 0x70, 0x12, 0x1e, 0x0a, 0x0a, 0x6f, 0x75, 0x74, 0x54, 0x72, 0x61, 0x64, 0x65, - 0x4e, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6f, 0x75, 0x74, 0x54, 0x72, 0x61, - 0x64, 0x65, 0x4e, 0x6f, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x49, - 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, - 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x6f, 0x62, 0x69, 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x6d, 0x6f, 0x62, 0x69, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x63, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x0b, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, - 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x6e, 0x75, - 0x6d, 0x62, 0x65, 0x72, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x55, 0x72, - 0x6c, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x55, - 0x72, 0x6c, 0x12, 0x28, 0x0a, 0x0f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x50, 0x61, 0x72, 0x61, - 0x6d, 0x65, 0x74, 0x65, 0x72, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x65, 0x78, 0x74, - 0x65, 0x6e, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x22, 0x81, 0x01, 0x0a, - 0x19, 0x5a, 0x6c, 0x74, 0x78, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x65, 0x63, 0x68, 0x61, 0x72, - 0x67, 0x65, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, - 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x18, - 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x12, 0x1e, 0x0a, 0x0a, 0x6f, 0x75, 0x74, 0x54, 0x72, 0x61, 0x64, 0x65, 0x4e, 0x6f, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6f, 0x75, 0x74, 0x54, 0x72, 0x61, 0x64, 0x65, 0x4e, 0x6f, - 0x22, 0x8d, 0x01, 0x0a, 0x19, 0x5a, 0x6c, 0x74, 0x78, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x65, - 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x12, 0x1e, - 0x0a, 0x0a, 0x6d, 0x65, 0x72, 0x63, 0x68, 0x61, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0a, 0x6d, 0x65, 0x72, 0x63, 0x68, 0x61, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1c, - 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x12, 0x0a, 0x04, - 0x73, 0x69, 0x67, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x73, 0x69, 0x67, 0x6e, - 0x12, 0x1e, 0x0a, 0x0a, 0x6f, 0x75, 0x74, 0x54, 0x72, 0x61, 0x64, 0x65, 0x4e, 0x6f, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6f, 0x75, 0x74, 0x54, 0x72, 0x61, 0x64, 0x65, 0x4e, 0x6f, - 0x22, 0xc0, 0x02, 0x0a, 0x14, 0x5a, 0x6c, 0x74, 0x78, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x65, - 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x52, 0x65, 0x71, 0x12, 0x1e, 0x0a, 0x0a, 0x6d, 0x65, 0x72, - 0x63, 0x68, 0x61, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6d, - 0x65, 0x72, 0x63, 0x68, 0x61, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x67, - 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x73, 0x69, 0x67, 0x6e, 0x12, 0x1c, 0x0a, - 0x09, 0x74, 0x69, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x1e, 0x0a, 0x0a, 0x6f, + 0x09, 0x52, 0x0a, 0x6f, 0x75, 0x74, 0x54, 0x72, 0x61, 0x64, 0x65, 0x4e, 0x6f, 0x22, 0x7d, 0x0a, + 0x15, 0x5a, 0x6c, 0x74, 0x78, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x43, 0x61, 0x72, 0x64, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1e, 0x0a, 0x0a, + 0x6f, 0x75, 0x74, 0x54, 0x72, 0x61, 0x64, 0x65, 0x4e, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x6f, 0x75, 0x74, 0x54, 0x72, 0x61, 0x64, 0x65, 0x4e, 0x6f, 0x22, 0x89, 0x01, 0x0a, + 0x15, 0x5a, 0x6c, 0x74, 0x78, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x43, 0x61, 0x72, 0x64, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x12, 0x1e, 0x0a, 0x0a, 0x6d, 0x65, 0x72, 0x63, 0x68, 0x61, + 0x6e, 0x74, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x6d, 0x65, 0x72, 0x63, + 0x68, 0x61, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x53, 0x74, + 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x53, + 0x74, 0x61, 0x6d, 0x70, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x67, 0x6e, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x73, 0x69, 0x67, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x6f, 0x75, 0x74, 0x54, + 0x72, 0x61, 0x64, 0x65, 0x4e, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6f, 0x75, + 0x74, 0x54, 0x72, 0x61, 0x64, 0x65, 0x4e, 0x6f, 0x22, 0xbc, 0x02, 0x0a, 0x10, 0x5a, 0x6c, 0x74, + 0x78, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x43, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x12, 0x1e, 0x0a, + 0x0a, 0x6d, 0x65, 0x72, 0x63, 0x68, 0x61, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x0a, 0x6d, 0x65, 0x72, 0x63, 0x68, 0x61, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x12, 0x0a, + 0x04, 0x73, 0x69, 0x67, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x73, 0x69, 0x67, + 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x6d, 0x70, 0x12, + 0x1e, 0x0a, 0x0a, 0x6f, 0x75, 0x74, 0x54, 0x72, 0x61, 0x64, 0x65, 0x4e, 0x6f, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6f, 0x75, 0x74, 0x54, 0x72, 0x61, 0x64, 0x65, 0x4e, 0x6f, 0x12, + 0x1c, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x49, 0x64, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x49, 0x64, 0x12, 0x16, 0x0a, + 0x06, 0x6d, 0x6f, 0x62, 0x69, 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, + 0x6f, 0x62, 0x69, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x54, 0x79, 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x61, 0x63, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, + 0x1c, 0x0a, 0x09, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x55, 0x72, 0x6c, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x55, 0x72, 0x6c, 0x12, 0x28, 0x0a, + 0x0f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, + 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x50, 0x61, + 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x22, 0x81, 0x01, 0x0a, 0x19, 0x5a, 0x6c, 0x74, 0x78, + 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x65, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x52, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x6f, 0x75, 0x74, 0x54, 0x72, 0x61, 0x64, 0x65, 0x4e, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0a, 0x6f, 0x75, 0x74, 0x54, 0x72, 0x61, 0x64, 0x65, 0x4e, 0x6f, 0x12, 0x1c, 0x0a, 0x09, 0x70, - 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x49, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, - 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x6f, 0x62, - 0x69, 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x6f, 0x62, 0x69, 0x6c, - 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x54, - 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x1c, 0x0a, 0x09, 0x6e, - 0x6f, 0x74, 0x69, 0x66, 0x79, 0x55, 0x72, 0x6c, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x55, 0x72, 0x6c, 0x12, 0x28, 0x0a, 0x0f, 0x65, 0x78, 0x74, - 0x65, 0x6e, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x18, 0x0a, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, - 0x74, 0x65, 0x72, 0x22, 0x2d, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x65, 0x6c, 0x6c, - 0x65, 0x72, 0x42, 0x79, 0x41, 0x70, 0x70, 0x49, 0x64, 0x52, 0x65, 0x71, 0x12, 0x14, 0x0a, 0x05, - 0x61, 0x70, 0x70, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x61, 0x70, 0x70, - 0x49, 0x64, 0x22, 0xcd, 0x03, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x65, 0x6c, 0x6c, - 0x65, 0x72, 0x42, 0x79, 0x41, 0x70, 0x70, 0x49, 0x64, 0x52, 0x65, 0x73, 0x12, 0x0e, 0x0a, 0x02, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1e, 0x0a, 0x0a, - 0x6d, 0x65, 0x72, 0x63, 0x68, 0x61, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x6d, 0x65, 0x72, 0x63, 0x68, 0x61, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, - 0x72, 0x65, 0x73, 0x65, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x72, 0x65, 0x73, 0x65, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, - 0x61, 0x70, 0x70, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x61, 0x70, 0x70, - 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x6f, 0x73, 0x49, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x70, 0x6f, 0x73, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x74, 0x6f, 0x72, - 0x65, 0x49, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x74, 0x6f, 0x72, 0x65, - 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x70, 0x69, 0x4d, 0x6f, 0x64, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x06, 0x61, 0x70, 0x69, 0x4d, 0x6f, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x75, - 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, - 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x72, 0x69, 0x76, - 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x72, - 0x69, 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x2c, 0x0a, 0x11, 0x6d, 0x65, 0x72, 0x63, - 0x68, 0x61, 0x6e, 0x74, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x18, 0x0a, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x11, 0x6d, 0x65, 0x72, 0x63, 0x68, 0x61, 0x6e, 0x74, 0x50, 0x75, 0x62, - 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, - 0x4b, 0x65, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x63, 0x72, 0x65, - 0x74, 0x4b, 0x65, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x55, 0x72, - 0x6c, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x55, - 0x72, 0x6c, 0x12, 0x26, 0x0a, 0x0e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x75, 0x62, 0x73, - 0x63, 0x72, 0x69, 0x62, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, - 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, - 0x6d, 0x65, 0x32, 0xa0, 0x07, 0x0a, 0x08, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, - 0x49, 0x0a, 0x11, 0x7a, 0x6c, 0x74, 0x78, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x65, 0x63, 0x68, - 0x61, 0x72, 0x67, 0x65, 0x12, 0x1e, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x2e, + 0x0a, 0x6f, 0x75, 0x74, 0x54, 0x72, 0x61, 0x64, 0x65, 0x4e, 0x6f, 0x22, 0x8d, 0x01, 0x0a, 0x19, 0x5a, 0x6c, 0x74, 0x78, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x65, 0x63, 0x68, 0x61, 0x72, 0x67, - 0x65, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x2e, - 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x73, 0x12, 0x62, 0x0a, 0x16, 0x7a, 0x6c, + 0x65, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x12, 0x1e, 0x0a, 0x0a, 0x6d, 0x65, 0x72, + 0x63, 0x68, 0x61, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x6d, + 0x65, 0x72, 0x63, 0x68, 0x61, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, + 0x65, 0x53, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x74, 0x69, + 0x6d, 0x65, 0x53, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x67, 0x6e, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x73, 0x69, 0x67, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x6f, + 0x75, 0x74, 0x54, 0x72, 0x61, 0x64, 0x65, 0x4e, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0a, 0x6f, 0x75, 0x74, 0x54, 0x72, 0x61, 0x64, 0x65, 0x4e, 0x6f, 0x22, 0xd2, 0x02, 0x0a, 0x14, + 0x5a, 0x6c, 0x74, 0x78, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x65, 0x63, 0x68, 0x61, 0x72, 0x67, + 0x65, 0x52, 0x65, 0x71, 0x12, 0x1e, 0x0a, 0x0a, 0x6d, 0x65, 0x72, 0x63, 0x68, 0x61, 0x6e, 0x74, + 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x6d, 0x65, 0x72, 0x63, 0x68, 0x61, + 0x6e, 0x74, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x67, 0x6e, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x73, 0x69, 0x67, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, + 0x53, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x74, 0x69, 0x6d, + 0x65, 0x53, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x1e, 0x0a, 0x0a, 0x6f, 0x75, 0x74, 0x54, 0x72, 0x61, + 0x64, 0x65, 0x4e, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6f, 0x75, 0x74, 0x54, + 0x72, 0x61, 0x64, 0x65, 0x4e, 0x6f, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, + 0x74, 0x49, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x64, 0x75, + 0x63, 0x74, 0x49, 0x64, 0x12, 0x28, 0x0a, 0x0f, 0x72, 0x65, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, + 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, + 0x65, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x20, + 0x0a, 0x0b, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x6f, 0x74, 0x69, + 0x66, 0x79, 0x55, 0x72, 0x6c, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x6f, 0x74, + 0x69, 0x66, 0x79, 0x55, 0x72, 0x6c, 0x12, 0x28, 0x0a, 0x0f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, + 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, + 0x32, 0xa0, 0x07, 0x0a, 0x08, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, 0x49, 0x0a, + 0x11, 0x7a, 0x6c, 0x74, 0x78, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x65, 0x63, 0x68, 0x61, 0x72, + 0x67, 0x65, 0x12, 0x1e, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x2e, 0x5a, 0x6c, + 0x74, 0x78, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x65, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x52, + 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x2e, 0x44, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x73, 0x12, 0x62, 0x0a, 0x16, 0x7a, 0x6c, 0x74, 0x78, + 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x65, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x12, 0x23, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x2e, 0x5a, 0x6c, 0x74, 0x78, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x65, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x12, 0x23, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x2e, - 0x5a, 0x6c, 0x74, 0x78, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x65, 0x63, 0x68, 0x61, 0x72, 0x67, - 0x65, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x1a, 0x23, 0x2e, 0x74, 0x72, 0x61, 0x6e, - 0x73, 0x66, 0x65, 0x72, 0x2e, 0x5a, 0x6c, 0x74, 0x78, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x65, - 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x12, 0x41, - 0x0a, 0x0d, 0x7a, 0x6c, 0x74, 0x78, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x43, 0x61, 0x72, 0x64, 0x12, - 0x1a, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x2e, 0x5a, 0x6c, 0x74, 0x78, 0x4f, - 0x72, 0x64, 0x65, 0x72, 0x43, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x74, 0x72, - 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, - 0x73, 0x12, 0x56, 0x0a, 0x12, 0x7a, 0x6c, 0x74, 0x78, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x43, 0x61, - 0x72, 0x64, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1f, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, - 0x65, 0x72, 0x2e, 0x5a, 0x6c, 0x74, 0x78, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x43, 0x61, 0x72, 0x64, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x1a, 0x1f, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, - 0x66, 0x65, 0x72, 0x2e, 0x5a, 0x6c, 0x74, 0x78, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x43, 0x61, 0x72, - 0x64, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x12, 0x44, 0x0a, 0x0c, 0x7a, 0x6c, 0x74, - 0x78, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x53, 0x6d, 0x73, 0x12, 0x19, 0x2e, 0x74, 0x72, 0x61, 0x6e, - 0x73, 0x66, 0x65, 0x72, 0x2e, 0x5a, 0x6c, 0x74, 0x78, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x53, 0x6d, - 0x73, 0x52, 0x65, 0x71, 0x1a, 0x19, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x2e, - 0x5a, 0x6c, 0x74, 0x78, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x53, 0x6d, 0x73, 0x52, 0x65, 0x73, 0x12, - 0x47, 0x0a, 0x10, 0x7a, 0x6c, 0x74, 0x78, 0x52, 0x65, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x49, - 0x6e, 0x66, 0x6f, 0x12, 0x14, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x2e, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x1d, 0x2e, 0x74, 0x72, 0x61, 0x6e, - 0x73, 0x66, 0x65, 0x72, 0x2e, 0x5a, 0x6c, 0x74, 0x78, 0x52, 0x65, 0x63, 0x68, 0x61, 0x72, 0x67, - 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x12, 0x4d, 0x0a, 0x13, 0x7a, 0x6c, 0x74, 0x78, - 0x52, 0x65, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x12, - 0x14, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x20, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, - 0x2e, 0x5a, 0x6c, 0x74, 0x78, 0x52, 0x65, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x50, 0x72, 0x6f, - 0x64, 0x75, 0x63, 0x74, 0x52, 0x65, 0x73, 0x12, 0x45, 0x0a, 0x0b, 0x7a, 0x6c, 0x74, 0x78, 0x52, - 0x73, 0x4d, 0x69, 0x58, 0x75, 0x65, 0x12, 0x1a, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, - 0x72, 0x2e, 0x52, 0x73, 0x43, 0x6f, 0x75, 0x70, 0x6f, 0x6e, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x52, - 0x65, 0x71, 0x1a, 0x1a, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x2e, 0x52, 0x73, - 0x43, 0x6f, 0x75, 0x70, 0x6f, 0x6e, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x12, 0x47, - 0x0a, 0x0d, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x53, 0x65, 0x6e, 0x64, 0x12, - 0x1a, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x65, - 0x74, 0x4b, 0x65, 0x79, 0x53, 0x65, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x1a, 0x2e, 0x74, 0x72, - 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x4b, 0x65, 0x79, - 0x53, 0x65, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x12, 0x50, 0x0a, 0x10, 0x6d, 0x61, 0x72, 0x6b, 0x65, - 0x74, 0x4b, 0x65, 0x79, 0x44, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x12, 0x1d, 0x2e, 0x74, 0x72, - 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x4b, 0x65, 0x79, - 0x44, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x1d, 0x2e, 0x74, 0x72, 0x61, - 0x6e, 0x73, 0x66, 0x65, 0x72, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x44, - 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x12, 0x41, 0x0a, 0x0b, 0x6d, 0x61, 0x72, - 0x6b, 0x65, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x18, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, - 0x66, 0x65, 0x72, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, - 0x65, 0x71, 0x1a, 0x18, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x2e, 0x4d, 0x61, - 0x72, 0x6b, 0x65, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x12, 0x47, 0x0a, 0x0d, - 0x72, 0x73, 0x43, 0x6f, 0x75, 0x70, 0x6f, 0x6e, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x12, 0x1a, 0x2e, - 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x2e, 0x52, 0x73, 0x43, 0x6f, 0x75, 0x70, 0x6f, - 0x6e, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x1a, 0x2e, 0x74, 0x72, 0x61, 0x6e, - 0x73, 0x66, 0x65, 0x72, 0x2e, 0x52, 0x73, 0x43, 0x6f, 0x75, 0x70, 0x6f, 0x6e, 0x47, 0x72, 0x61, - 0x6e, 0x74, 0x52, 0x65, 0x73, 0x42, 0x0c, 0x5a, 0x0a, 0x2e, 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, - 0x66, 0x65, 0x72, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x1a, 0x23, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, + 0x65, 0x72, 0x2e, 0x5a, 0x6c, 0x74, 0x78, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x65, 0x63, 0x68, + 0x61, 0x72, 0x67, 0x65, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x12, 0x41, 0x0a, 0x0d, + 0x7a, 0x6c, 0x74, 0x78, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x43, 0x61, 0x72, 0x64, 0x12, 0x1a, 0x2e, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x2e, 0x5a, 0x6c, 0x74, 0x78, 0x4f, 0x72, 0x64, + 0x65, 0x72, 0x43, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x66, 0x65, 0x72, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x73, 0x12, + 0x56, 0x0a, 0x12, 0x7a, 0x6c, 0x74, 0x78, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x43, 0x61, 0x72, 0x64, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1f, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, + 0x2e, 0x5a, 0x6c, 0x74, 0x78, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x43, 0x61, 0x72, 0x64, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x1a, 0x1f, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, + 0x72, 0x2e, 0x5a, 0x6c, 0x74, 0x78, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x43, 0x61, 0x72, 0x64, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x12, 0x44, 0x0a, 0x0c, 0x7a, 0x6c, 0x74, 0x78, 0x4f, + 0x72, 0x64, 0x65, 0x72, 0x53, 0x6d, 0x73, 0x12, 0x19, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, + 0x65, 0x72, 0x2e, 0x5a, 0x6c, 0x74, 0x78, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x53, 0x6d, 0x73, 0x52, + 0x65, 0x71, 0x1a, 0x19, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x2e, 0x5a, 0x6c, + 0x74, 0x78, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x53, 0x6d, 0x73, 0x52, 0x65, 0x73, 0x12, 0x47, 0x0a, + 0x10, 0x7a, 0x6c, 0x74, 0x78, 0x52, 0x65, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x49, 0x6e, 0x66, + 0x6f, 0x12, 0x14, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x2e, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x1d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, + 0x65, 0x72, 0x2e, 0x5a, 0x6c, 0x74, 0x78, 0x52, 0x65, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x12, 0x4d, 0x0a, 0x13, 0x7a, 0x6c, 0x74, 0x78, 0x52, 0x65, + 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x12, 0x14, 0x2e, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x52, 0x65, 0x71, 0x1a, 0x20, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x2e, 0x5a, + 0x6c, 0x74, 0x78, 0x52, 0x65, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x64, 0x75, + 0x63, 0x74, 0x52, 0x65, 0x73, 0x12, 0x45, 0x0a, 0x0b, 0x7a, 0x6c, 0x74, 0x78, 0x52, 0x73, 0x4d, + 0x69, 0x58, 0x75, 0x65, 0x12, 0x1a, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x2e, + 0x52, 0x73, 0x43, 0x6f, 0x75, 0x70, 0x6f, 0x6e, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x52, 0x65, 0x71, + 0x1a, 0x1a, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x2e, 0x52, 0x73, 0x43, 0x6f, + 0x75, 0x70, 0x6f, 0x6e, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x12, 0x47, 0x0a, 0x0d, + 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x53, 0x65, 0x6e, 0x64, 0x12, 0x1a, 0x2e, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x4b, + 0x65, 0x79, 0x53, 0x65, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x1a, 0x2e, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x66, 0x65, 0x72, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x53, 0x65, + 0x6e, 0x64, 0x52, 0x65, 0x73, 0x12, 0x50, 0x0a, 0x10, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x4b, + 0x65, 0x79, 0x44, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x12, 0x1d, 0x2e, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x66, 0x65, 0x72, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x44, 0x69, + 0x73, 0x63, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x1d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x66, 0x65, 0x72, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x44, 0x69, 0x73, + 0x63, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x12, 0x41, 0x0a, 0x0b, 0x6d, 0x61, 0x72, 0x6b, 0x65, + 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x18, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, + 0x72, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, + 0x1a, 0x18, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x2e, 0x4d, 0x61, 0x72, 0x6b, + 0x65, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x12, 0x47, 0x0a, 0x0d, 0x72, 0x73, + 0x43, 0x6f, 0x75, 0x70, 0x6f, 0x6e, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x12, 0x1a, 0x2e, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x2e, 0x52, 0x73, 0x43, 0x6f, 0x75, 0x70, 0x6f, 0x6e, 0x47, + 0x72, 0x61, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x1a, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, + 0x65, 0x72, 0x2e, 0x52, 0x73, 0x43, 0x6f, 0x75, 0x70, 0x6f, 0x6e, 0x47, 0x72, 0x61, 0x6e, 0x74, + 0x52, 0x65, 0x73, 0x42, 0x0c, 0x5a, 0x0a, 0x2e, 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, + 0x72, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -2687,7 +2367,7 @@ func file_transfer_proto_rawDescGZIP() []byte { return file_transfer_proto_rawDescData } -var file_transfer_proto_msgTypes = make([]protoimpl.MessageInfo, 29) +var file_transfer_proto_msgTypes = make([]protoimpl.MessageInfo, 26) var file_transfer_proto_goTypes = []interface{}{ (*DefaultRes)(nil), // 0: transfer.DefaultRes (*DefaultReq)(nil), // 1: transfer.DefaultReq @@ -2709,53 +2389,49 @@ var file_transfer_proto_goTypes = []interface{}{ (*ZltxOrderRechargeQueryRes)(nil), // 17: transfer.ZltxOrderRechargeQueryRes (*ZltxOrderRechargeQueryReq)(nil), // 18: transfer.ZltxOrderRechargeQueryReq (*ZltxOrderRechargeReq)(nil), // 19: transfer.ZltxOrderRechargeReq - (*GetResellerByAppIdReq)(nil), // 20: transfer.GetResellerByAppIdReq - (*GetResellerByAppIdRes)(nil), // 21: transfer.GetResellerByAppIdRes - (*RsCouponGrantReq_Data)(nil), // 22: transfer.RsCouponGrantReq.Data - (*RsCouponGrantRes_Data)(nil), // 23: transfer.RsCouponGrantRes.Data - (*RsCouponGrantRes_Data_VoucherInfo)(nil), // 24: transfer.RsCouponGrantRes.Data.VoucherInfo - (*MarketQueryRes_Data)(nil), // 25: transfer.MarketQueryRes.Data - (*MarketKeyDiscardRes_Data)(nil), // 26: transfer.MarketKeyDiscardRes.Data - (*MarketKeySendRes_Data)(nil), // 27: transfer.MarketKeySendRes.Data - (*ZltxRechargeProductRes_Product)(nil), // 28: transfer.ZltxRechargeProductRes.Product + (*RsCouponGrantRes_Data)(nil), // 20: transfer.RsCouponGrantRes.Data + (*RsCouponGrantRes_Data_VoucherInfo)(nil), // 21: transfer.RsCouponGrantRes.Data.VoucherInfo + (*MarketQueryRes_Data)(nil), // 22: transfer.MarketQueryRes.Data + (*MarketKeyDiscardRes_Data)(nil), // 23: transfer.MarketKeyDiscardRes.Data + (*MarketKeySendRes_Data)(nil), // 24: transfer.MarketKeySendRes.Data + (*ZltxRechargeProductRes_Product)(nil), // 25: transfer.ZltxRechargeProductRes.Product } var file_transfer_proto_depIdxs = []int32{ - 22, // 0: transfer.RsCouponGrantReq.data:type_name -> transfer.RsCouponGrantReq.Data - 23, // 1: transfer.RsCouponGrantRes.data:type_name -> transfer.RsCouponGrantRes.Data - 25, // 2: transfer.MarketQueryRes.data:type_name -> transfer.MarketQueryRes.Data - 26, // 3: transfer.MarketKeyDiscardRes.data:type_name -> transfer.MarketKeyDiscardRes.Data - 27, // 4: transfer.MarketKeySendRes.data:type_name -> transfer.MarketKeySendRes.Data - 28, // 5: transfer.ZltxRechargeProductRes.products:type_name -> transfer.ZltxRechargeProductRes.Product - 24, // 6: transfer.RsCouponGrantRes.Data.voucherInfo:type_name -> transfer.RsCouponGrantRes.Data.VoucherInfo - 19, // 7: transfer.Transfer.zltxOrderRecharge:input_type -> transfer.ZltxOrderRechargeReq - 18, // 8: transfer.Transfer.zltxOrderRechargeQuery:input_type -> transfer.ZltxOrderRechargeQueryReq - 16, // 9: transfer.Transfer.zltxOrderCard:input_type -> transfer.ZltxOrderCardReq - 15, // 10: transfer.Transfer.zltxOrderCardQuery:input_type -> transfer.ZltxOrderCardQueryReq - 13, // 11: transfer.Transfer.zltxOrderSms:input_type -> transfer.ZltxOrderSmsReq - 1, // 12: transfer.Transfer.zltxRechargeInfo:input_type -> transfer.DefaultReq - 1, // 13: transfer.Transfer.zltxRechargeProduct:input_type -> transfer.DefaultReq - 2, // 14: transfer.Transfer.zltxRsMiXue:input_type -> transfer.RsCouponGrantReq - 9, // 15: transfer.Transfer.marketKeySend:input_type -> transfer.MarketKeySendReq - 7, // 16: transfer.Transfer.marketKeyDiscard:input_type -> transfer.MarketKeyDiscardReq - 5, // 17: transfer.Transfer.marketQuery:input_type -> transfer.MarketQueryReq - 2, // 18: transfer.Transfer.rsCouponGrant:input_type -> transfer.RsCouponGrantReq - 0, // 19: transfer.Transfer.zltxOrderRecharge:output_type -> transfer.DefaultRes - 17, // 20: transfer.Transfer.zltxOrderRechargeQuery:output_type -> transfer.ZltxOrderRechargeQueryRes - 0, // 21: transfer.Transfer.zltxOrderCard:output_type -> transfer.DefaultRes - 14, // 22: transfer.Transfer.zltxOrderCardQuery:output_type -> transfer.ZltxOrderCardQueryRes - 12, // 23: transfer.Transfer.zltxOrderSms:output_type -> transfer.ZltxOrderSmsRes - 11, // 24: transfer.Transfer.zltxRechargeInfo:output_type -> transfer.ZltxRechargeInfoRes - 10, // 25: transfer.Transfer.zltxRechargeProduct:output_type -> transfer.ZltxRechargeProductRes - 3, // 26: transfer.Transfer.zltxRsMiXue:output_type -> transfer.RsCouponGrantRes - 8, // 27: transfer.Transfer.marketKeySend:output_type -> transfer.MarketKeySendRes - 6, // 28: transfer.Transfer.marketKeyDiscard:output_type -> transfer.MarketKeyDiscardRes - 4, // 29: transfer.Transfer.marketQuery:output_type -> transfer.MarketQueryRes - 3, // 30: transfer.Transfer.rsCouponGrant:output_type -> transfer.RsCouponGrantRes - 19, // [19:31] is the sub-list for method output_type - 7, // [7:19] is the sub-list for method input_type - 7, // [7:7] is the sub-list for extension type_name - 7, // [7:7] is the sub-list for extension extendee - 0, // [0:7] is the sub-list for field type_name + 20, // 0: transfer.RsCouponGrantRes.data:type_name -> transfer.RsCouponGrantRes.Data + 22, // 1: transfer.MarketQueryRes.data:type_name -> transfer.MarketQueryRes.Data + 23, // 2: transfer.MarketKeyDiscardRes.data:type_name -> transfer.MarketKeyDiscardRes.Data + 24, // 3: transfer.MarketKeySendRes.data:type_name -> transfer.MarketKeySendRes.Data + 25, // 4: transfer.ZltxRechargeProductRes.products:type_name -> transfer.ZltxRechargeProductRes.Product + 21, // 5: transfer.RsCouponGrantRes.Data.voucherInfo:type_name -> transfer.RsCouponGrantRes.Data.VoucherInfo + 19, // 6: transfer.Transfer.zltxOrderRecharge:input_type -> transfer.ZltxOrderRechargeReq + 18, // 7: transfer.Transfer.zltxOrderRechargeQuery:input_type -> transfer.ZltxOrderRechargeQueryReq + 16, // 8: transfer.Transfer.zltxOrderCard:input_type -> transfer.ZltxOrderCardReq + 15, // 9: transfer.Transfer.zltxOrderCardQuery:input_type -> transfer.ZltxOrderCardQueryReq + 13, // 10: transfer.Transfer.zltxOrderSms:input_type -> transfer.ZltxOrderSmsReq + 1, // 11: transfer.Transfer.zltxRechargeInfo:input_type -> transfer.DefaultReq + 1, // 12: transfer.Transfer.zltxRechargeProduct:input_type -> transfer.DefaultReq + 2, // 13: transfer.Transfer.zltxRsMiXue:input_type -> transfer.RsCouponGrantReq + 9, // 14: transfer.Transfer.marketKeySend:input_type -> transfer.MarketKeySendReq + 7, // 15: transfer.Transfer.marketKeyDiscard:input_type -> transfer.MarketKeyDiscardReq + 5, // 16: transfer.Transfer.marketQuery:input_type -> transfer.MarketQueryReq + 2, // 17: transfer.Transfer.rsCouponGrant:input_type -> transfer.RsCouponGrantReq + 0, // 18: transfer.Transfer.zltxOrderRecharge:output_type -> transfer.DefaultRes + 17, // 19: transfer.Transfer.zltxOrderRechargeQuery:output_type -> transfer.ZltxOrderRechargeQueryRes + 0, // 20: transfer.Transfer.zltxOrderCard:output_type -> transfer.DefaultRes + 14, // 21: transfer.Transfer.zltxOrderCardQuery:output_type -> transfer.ZltxOrderCardQueryRes + 12, // 22: transfer.Transfer.zltxOrderSms:output_type -> transfer.ZltxOrderSmsRes + 11, // 23: transfer.Transfer.zltxRechargeInfo:output_type -> transfer.ZltxRechargeInfoRes + 10, // 24: transfer.Transfer.zltxRechargeProduct:output_type -> transfer.ZltxRechargeProductRes + 3, // 25: transfer.Transfer.zltxRsMiXue:output_type -> transfer.RsCouponGrantRes + 8, // 26: transfer.Transfer.marketKeySend:output_type -> transfer.MarketKeySendRes + 6, // 27: transfer.Transfer.marketKeyDiscard:output_type -> transfer.MarketKeyDiscardRes + 4, // 28: transfer.Transfer.marketQuery:output_type -> transfer.MarketQueryRes + 3, // 29: transfer.Transfer.rsCouponGrant:output_type -> transfer.RsCouponGrantRes + 18, // [18:30] is the sub-list for method output_type + 6, // [6:18] is the sub-list for method input_type + 6, // [6:6] is the sub-list for extension type_name + 6, // [6:6] is the sub-list for extension extendee + 0, // [0:6] is the sub-list for field type_name } func init() { file_transfer_proto_init() } @@ -3005,42 +2681,6 @@ func file_transfer_proto_init() { } } file_transfer_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetResellerByAppIdReq); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_transfer_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetResellerByAppIdRes); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_transfer_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RsCouponGrantReq_Data); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_transfer_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RsCouponGrantRes_Data); i { case 0: return &v.state @@ -3052,7 +2692,7 @@ func file_transfer_proto_init() { return nil } } - file_transfer_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { + file_transfer_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RsCouponGrantRes_Data_VoucherInfo); i { case 0: return &v.state @@ -3064,7 +2704,7 @@ func file_transfer_proto_init() { return nil } } - file_transfer_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { + file_transfer_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*MarketQueryRes_Data); i { case 0: return &v.state @@ -3076,7 +2716,7 @@ func file_transfer_proto_init() { return nil } } - file_transfer_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { + file_transfer_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*MarketKeyDiscardRes_Data); i { case 0: return &v.state @@ -3088,7 +2728,7 @@ func file_transfer_proto_init() { return nil } } - file_transfer_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { + file_transfer_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*MarketKeySendRes_Data); i { case 0: return &v.state @@ -3100,7 +2740,7 @@ func file_transfer_proto_init() { return nil } } - file_transfer_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { + file_transfer_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ZltxRechargeProductRes_Product); i { case 0: return &v.state @@ -3119,7 +2759,7 @@ func file_transfer_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_transfer_proto_rawDesc, NumEnums: 0, - NumMessages: 29, + NumMessages: 26, NumExtensions: 0, NumServices: 1, }, diff --git a/rpc/transfer/transfer_grpc.pb.go b/rpc/transfer/transfer_grpc.pb.go old mode 100755 new mode 100644 diff --git a/rpc/transferClient/transfer.go b/rpc/transferClient/transfer.go index 954dfcf..ed6ba8a 100755 --- a/rpc/transferClient/transfer.go +++ b/rpc/transferClient/transfer.go @@ -15,8 +15,6 @@ import ( type ( DefaultReq = transfer.DefaultReq DefaultRes = transfer.DefaultRes - GetResellerByAppIdReq = transfer.GetResellerByAppIdReq - GetResellerByAppIdRes = transfer.GetResellerByAppIdRes MarketKeyDiscardReq = transfer.MarketKeyDiscardReq MarketKeyDiscardRes = transfer.MarketKeyDiscardRes MarketKeyDiscardRes_Data = transfer.MarketKeyDiscardRes_Data @@ -27,7 +25,6 @@ type ( MarketQueryRes = transfer.MarketQueryRes MarketQueryRes_Data = transfer.MarketQueryRes_Data RsCouponGrantReq = transfer.RsCouponGrantReq - RsCouponGrantReq_Data = transfer.RsCouponGrantReq_Data RsCouponGrantRes = transfer.RsCouponGrantRes RsCouponGrantRes_Data = transfer.RsCouponGrantRes_Data RsCouponGrantRes_Data_VoucherInfo = transfer.RsCouponGrantRes_Data_VoucherInfo diff --git a/sh/create.sh b/sh/create.sh index 0f5709e..8583c32 100755 --- a/sh/create.sh +++ b/sh/create.sh @@ -7,9 +7,12 @@ V_REFLECT="" docker build -t "${IMAGE}" . --no-cache - docker stop "${CONTAINER}" docker rm "${CONTAINER}" -docker run -it -p "${API_PORT}:${API_PORT}" --name "$CONTAINER" "${IMAGE}" \ No newline at end of file +docker run -it -p "${API_PORT}:${API_PORT}" --name "$CONTAINER" "${IMAGE}" + + + +docker run -it -p "10101:10101" --name "transfer_rs" "transfer_rs:v1" \ No newline at end of file diff --git a/untils/market/market.go b/untils/market/market.go new file mode 100644 index 0000000..0274b03 --- /dev/null +++ b/untils/market/market.go @@ -0,0 +1 @@ +package market diff --git a/untils/rsa/rsa.go b/untils/rsa/rsa.go new file mode 100644 index 0000000..b7ca842 --- /dev/null +++ b/untils/rsa/rsa.go @@ -0,0 +1,111 @@ +package rsa + +import ( + "crypto/rand" + "crypto/rsa" + "crypto/sha256" + "crypto/x509" + "encoding/base64" + "encoding/pem" + "fmt" +) + +// parseRSAPublicKeyFromPEM 解析PEM编码的RSA公钥 +func parseRSAPublicKeyFromPEM(pemData []byte) (*rsa.PublicKey, error) { + block, _ := pem.Decode(pemData) + if block == nil || block.Type != "PUBLIC KEY" { + return nil, fmt.Errorf("failed to parse PEM block containing the RSA public key") + } + + pub, err := x509.ParsePKIXPublicKey(block.Bytes) + if err != nil { + return nil, err + } + + switch pub := pub.(type) { + case *rsa.PublicKey: + return pub, nil + default: + return nil, fmt.Errorf("unknown public key type in PKIX wrapping") + } +} + +// encrypt 使用RSA公钥加密数据 +func Encrypt(publicKeyPEM string, plaintext []byte) ([]byte, error) { + // 将PEM编码的公钥转换为[]byte + pemData := []byte(publicKeyPEM) + + // 解析PEM数据以获取公钥 + pubKey, err := parseRSAPublicKeyFromPEM(pemData) + if err != nil { + return nil, err + } + + // 创建用于加密的随机填充 + label := []byte("") // OAEP标签,对于某些情况可能是非空的 + ciphertext, err := rsa.EncryptOAEP(sha256.New(), rand.Reader, pubKey, plaintext, label) + if err != nil { + return nil, err + } + + return ciphertext, nil +} + +// parseRSAPrivateKeyFromPEM 解析PEM编码的RSA私钥 +func parseRSAPrivateKeyFromPEM(pemData []byte) (*rsa.PrivateKey, error) { + block, _ := pem.Decode(pemData) + if block == nil || block.Type != "RSA PRIVATE KEY" { + return nil, fmt.Errorf("failed to parse PEM block containing the RSA private key") + } + + // 尝试使用PKCS#1 v1.5 + priv, err := x509.ParsePKCS1PrivateKey(block.Bytes) + if err != nil { + // 如果失败,尝试使用PKCS#8 + privInterface, err := x509.ParsePKCS8PrivateKey(block.Bytes) + if err != nil { + return nil, err + } + + switch k := privInterface.(type) { + case *rsa.PrivateKey: + priv = k + default: + return nil, fmt.Errorf("unknown private key type in PKCS#8 wrapping") + } + } + + return priv, nil +} + +// decrypt 使用RSA私钥解密数据 +func Decrypt(privateKeyPEM string, encryptedDataBase64 string) ([]byte, error) { + // 将PEM编码的私钥转换为[]byte + pemData := []byte(privateKeyPEM) + + // 解析PEM数据以获取私钥 + privKey, err := parseRSAPrivateKeyFromPEM(pemData) + if err != nil { + return nil, err + } + + // 将Base64编码的加密数据解码为字节切片 + encryptedData, err := base64.StdEncoding.DecodeString(encryptedDataBase64) + if err != nil { + return nil, err + } + + // 根据你的加密方式选择合适的解密函数 + // 这里假设使用的是OAEP填充和SHA-256哈希函数 + label := []byte("") // OAEP标签,对于某些情况可能是非空的 + decrypted, err := rsa.DecryptOAEP(sha256.New(), rand.Reader, privKey, encryptedData, label) + if err != nil { + // 如果失败,可以尝试使用PKCS#1 v1.5填充 + decrypted, err = rsa.DecryptPKCS1v15(rand.Reader, privKey, encryptedData) + if err != nil { + return nil, err + } + } + + return decrypted, nil +} diff --git a/untils/rsa/rsa_test.go b/untils/rsa/rsa_test.go new file mode 100644 index 0000000..6657da4 --- /dev/null +++ b/untils/rsa/rsa_test.go @@ -0,0 +1,33 @@ +package rsa + +import ( + "encoding/base64" + "encoding/json" + "fmt" + "testing" +) + +const prik = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCmjK6SPkrP03ssex5Dxn4KZeVm9rQoJMslru13GNgoGKJAq13xwUGl6lpGlhzM9IMzg0ldOO2a0SQPPjc0fLrDjIgHPfIT6H1hDGkZdPaF4D0OfiHGzlLwXq7FyyyGc2JXILsniMBXcCxNFhbW0jAaJyYrBJb3q84a5y5AtK3IC+eDV6Bj2J4HlQVGKgW9u2ic6Jxl23sacXY6iifi+KEuoXNCJrmYlgRWTaQovLmTCLkErkzxzG9DFRDWGoz25LthDPqcCSUmWEbJ+obwIGB4r2WCbFXvaeVBQORlyVRyNUvYMItjHBQIKinDWZ6y8KzA0YKOoxEfr0KfE8Uk4PQBAgMBAAECggEABTAX0PzelN4uyvTT0sMi/R0YRKPgepP40vtBsNvF10E7Lp4ClAupHpYFSrJq178xu1/2dVBXEGM9hw8GUQd7RCjuD3cFwcp/EKU+Zy6uQ38iZRTskEDa3bC+q3EXzuFXDxqOfIhai262UTlkATw0sjUwJRdkbMxoeWHkSNuH7UBVddxFL8Bq1DKaPzRCqQ8zlkMZHy8Xbf2b8rFoi1oPBoPjHyxCo33zcnSg5xntIoA5pkD6x4z5cAnU55aBoYUiRv7jmG+MVp1jpDvAmJLfUayVZNakgX1r74bMPsl9kpA7dVdgOlWrIkbJE1plVXXswBb8QKN0/Yx2vv/YASSi0QKBgQDaO9BkRjvht/lrsQEur1wXf5ITnsVWsqlUhYQKGHihzOj7e0rGO9QICM4eQZH9ssHfxEXhmEoFdkaqo3Fo47NI+yinpWm+KruwrRFkCGejlKZ4bhn9zWPb8L1qJbN4UD1c5jUNk1B0EEdnLRFg0/O7xm602bGilvY5x2nf0v95+QKBgQDDXyiiGNV7GO4h8OQYJwq0IqenPyIanRgYI3rw//tg147mhWcxT6ms6dMUh9nEXEFali2J1En+aVvx1Xn47CuGrRmZOLaGkw9ESFA/4ngYdea+xgttbKMXm0QwIwvATq2jxxrYEKmnr/+EUUWzIWioM1zQffAhVlkLFVnImquMSQKBgDe7qNfC/A4ELwWqubOTg0BZCxRJqvoePJJiWrs9Tql7rFB1Rz5jDx5SKVmew0r4OP0Nog8gFl9YumlfvlncNPBBfDt8SgoP3ckcGeHjJ5ymHPGKpMaliogj7ivKnw/t5g3wmMHzyksp0SJvZw3Ec22UGrfDFNOCHDXbUJWhzC75AoGBALbM6rAAnH65LNcFFeajYRh69HNAVyCfrFOpnvawDPzntAVs/MjeyNvJTH8BPXjE+UFREvrLbxBkdGsqWx3VnEQ+4pzCu8XfA4HYR33+4G/CoUwO8dJIu7DyzjJcGDqvYzjCqxNPQ+5qdqHPiW+56rq2lDlgHLaUnGwKZh+U2L5BAoGAeogtSQbnZaLQofSGcUOol2fyG24NU1JK3My+N1ypkSpD+y1KiFQeM5kg7UcJB6LBKZ/lRCKcjEMaxMyj57ETMkbRVKBLvsIL5QYolJLIHYqBul0AeFJ4K51SKK2Xk5rFvyuJKkJBux26WodtCXTnEzP1KRZGlSxJeN/V1yXjSEU=" + +const pubk = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApoyukj5Kz9N7LHseQ8Z+CmXlZva0KCTLJa7tdxjYKBiiQKtd8cFBpepaRpYczPSDM4NJXTjtmtEkDz43NHy6w4yIBz3yE+h9YQxpGXT2heA9Dn4hxs5S8F6uxcsshnNiVyC7J4jAV3AsTRYW1tIwGicmKwSW96vOGucuQLStyAvng1egY9ieB5UFRioFvbtonOicZdt7GnF2Ooon4vihLqFzQia5mJYEVk2kKLy5kwi5BK5M8cxvQxUQ1hqM9uS7YQz6nAklJlhGyfqG8CBgeK9lgmxV72nlQUDkZclUcjVL2DCLYxwUCCopw1mesvCswNGCjqMRH69CnxPFJOD0AQIDAQAB" + +func Test_en(t *testing.T) { + data := make(map[string]interface{}, 2) + data["a"] = 1 + data["b"] = "sdadas" + dataJson, _ := json.Marshal(data) + pub := `-----BEGIN PUBLIC KEY----- +` + pubk + ` +-----END PUBLIC KEY-----` + res, err := Encrypt(pub, dataJson) + fmt.Println(base64.StdEncoding.EncodeToString(res), err) +} + +func Test_de(t *testing.T) { + data := "oSpZJFBORDtJDpKjk5q4C1ex7CbgDW+YjMS7gCQHIsn1dgrSXEvjgeuA2jhc29CstkIDjwQ/qhInXVl/M9hphB9oujfegD+FPRspRhDrBY1csuPLDiKZh82LQfPMMXCQcZk73F+OfHl9cX/QLi/2uRUw3UsEO8Hv6o9VM1mSkg+uWAqqFKZKvVXJBTNHRzlQ56LTMZG8kwGGQisoCvi+f+6B/3Kd9co+csMAEeE+gK/Ix+c8jLs5lL8QKZW9vALa8zgTPG3oicxIYHqNoPqc8Z/R+C69k30QRsbWhyixPpSGxGkV9Pvy8czj/t+uoDiZ7hOQugR9ss7DIwZHuyDcHA==" + privateKeyPEM := `-----BEGIN RSA PRIVATE KEY----- +` + prik + ` +-----END RSA PRIVATE KEY-----` + res, err := Decrypt(privateKeyPEM, data) + fmt.Println(string(res), err) +}