From 12b95a1fa855dd411fe5142ff8631d07365de395 Mon Sep 17 00:00:00 2001 From: shenzhuan Date: Wed, 2 Nov 2022 13:46:41 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AE=A2=E5=8D=95=E6=9C=8D=E5=8A=A1=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E8=AE=A2=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- trade-order/client/client.go | 68 +- trade-order/domain/model/trade.go | 2 + .../domain/repository/trade_repository.go | 42 +- trade-order/proto/trade.pb.go | 1542 +++++++++++++---- trade-order/proto/trade.proto | 89 +- 5 files changed, 1323 insertions(+), 420 deletions(-) diff --git a/trade-order/client/client.go b/trade-order/client/client.go index e8ba2f0..10c79ab 100644 --- a/trade-order/client/client.go +++ b/trade-order/client/client.go @@ -10,6 +10,9 @@ import ( "github.com/opentracing/opentracing-go" "go-micro.dev/v4/client" "go-micro.dev/v4/web" + "strconv" + "strings" + //"goproduct/common" common "git.mashibing.com/msb_47094/shopping-comm" "log" @@ -70,7 +73,7 @@ func main() { //UpdateCartClient := proto.NewUpdateCartService("shop-cart", rpcServer.Client()) //ShowProductDetailClient := proto.NewShowProductDetailService("shop-product", rpcServer.Client()) //ShowDetailSkuClient := proto.NewShowDetailSkuService("shop-product", rpcServer.Client()) - //GetUserTokenClient := proto.NewGetUserTokenService("shop-user", rpcServer.Client()) + GetUserTokenClient := proto.NewGetUserTokenService("shop-user", rpcServer.Client()) //UpdateSkuClient := proto.NewUpdateSkuService("shop-product", rpcServer.Client()) AddTraderClient := proto.NewAddTradeOrderService("trade-order", rpcServer.Client()) //UpdateTraderClient := proto.NewUpdateTradeOrderService("trade-order", rpcServer.Client()) @@ -104,10 +107,47 @@ func main() { // } // c.JSON(http.StatusOK, gin.H{"updateSku-compensate": "SUCCESS", "Message": "回滚库存成功!"}) //}) - router.POST("/cartAdvanceOrder", func(c *gin.Context) { - req := &proto.AddTradeOrderReq{} - if err := c.BindJSON(req); err != nil { - log.Fatalln(err) + router.GET("/cartAdvanceOrder", func(c *gin.Context) { + //开始检验登录 + uuid := c.Request.Header["Uuid"][0] + cc := common.GetInput(uuid) + out := common.SQ(cc) + sum := 0 + for o := range out { + sum += o + } + //Token校验 + //拼接请求信息 + tokenReq := &proto.TokenReq{ + Uuid: uuid, + } + //响应 + tokenResp, err := GetUserTokenClient.GetUserToken(context.TODO(), tokenReq) + if err != nil || tokenResp.IsLogin == false { + log.Println("GetUserToken err : ", err) + common.RespFail(c.Writer, tokenResp, "未登录!") + return + } + //拼接请求信息 + log.Println("GetUserToken success : ", tokenResp) + //结束检验登录 + + //开始订单插入 + tempStr := c.Request.FormValue("cartIds") // 12,355,666 + cartIds := SplitToInt32List(tempStr, ",") + isVirtual, _ := strconv.ParseBool(c.Request.FormValue("isVirtual")) + recipientAddressId, _ := strconv.Atoi(c.Request.FormValue("recipientAddressId")) + + //构建tradeOrder + tradeOrder := &proto.TradeOrder{} + tradeOrder.UserId = int32(sum) + tradeOrder.CreateUser = int32(sum) + tradeOrder.OrderStatus = 1 + req := &proto.AddTradeOrderReq{ + CartIds: cartIds, + IsVirtual: isVirtual, + RecipientAddressId: int32(recipientAddressId), + TradeOrder: tradeOrder, } resp, err = AddTraderClient.AddTradeOrder(context.TODO(), req) fmt.Println(resp) @@ -250,6 +290,24 @@ func (c clientWrapper) Call(ctx context.Context, req client.Request, resp interf } +// 格式化页面传入的cartIds +func SplitToInt32List(str string, sep string) (int32List []int32) { + tempStr := strings.Split(str, sep) + if len(tempStr) > 0 { + for _, item := range tempStr { + if item == "" { + continue + } + val, err := strconv.ParseInt(item, 10, 32) + if err != nil { + continue + } + int32List = append(int32List, int32(val)) + } + } + return int32List +} + func NewClientHystrixWrapper() client.Wrapper { return func(i client.Client) client.Client { return &clientWrapper{i} diff --git a/trade-order/domain/model/trade.go b/trade-order/domain/model/trade.go index ad16e59..dd0ca70 100644 --- a/trade-order/domain/model/trade.go +++ b/trade-order/domain/model/trade.go @@ -27,6 +27,8 @@ type TraderOrder struct { UpdateUser int32 `json:"updateUser"` UpdateTime time.Time `json:"updateTime"` IsDeleted bool `json:"isDeleted"` + PayType int32 `gorm:"default:1" json:"payType"` + IsPackageFree int32 `gorm:"default:1" json:"isPackageFree"` } func (table *TraderOrder) TableName() string { diff --git a/trade-order/domain/repository/trade_repository.go b/trade-order/domain/repository/trade_repository.go index 292e00e..7794dcc 100644 --- a/trade-order/domain/repository/trade_repository.go +++ b/trade-order/domain/repository/trade_repository.go @@ -1,7 +1,12 @@ package repository import ( + "encoding/json" "fmt" + "log" + "math/rand" + "strconv" + "strings" "time" "trade-order/domain/model" "trade-order/proto" @@ -31,13 +36,33 @@ type TradeRepository struct { mysqlDB *gorm.DB } +func SwapToStruct(req, target interface{}) (err error) { + dataByte, err := json.Marshal(req) + if err != nil { + return + } + err = json.Unmarshal(dataByte, target) + return err +} + func (u *TradeRepository) AddTradeOrder(req *proto.AddTradeOrderReq) (obj *model.TraderOrder, err error) { - trade := model.TraderOrder{} - trade.CreateTime = time.Now() // + trade := &model.TraderOrder{} + err = SwapToStruct(req.TradeOrder, trade) + if err != nil { + log.Println("SwapToStruct err :", err) + } + log.Println("SwapToStruct trade :", trade) + now := time.Now() + trade.CreateTime = now // + trade.SubmitTime = now + tp, _ := time.ParseDuration("30m") + trade.ExpireTime = now.Add(tp) //订单失效时间 30m后 + trade.OrderNo = getOrderNo(now, trade.UserId) + tb := u.mysqlDB.Create(&trade) //err = errors.New("400", "测试异常", 400) fmt.Println("repository AddTradeOrder >>>> ", trade) - return &trade, tb.Error //err + return trade, tb.Error //err } func (u *TradeRepository) UpdateTradeOrder(req *proto.AddTradeOrderReq) (obj *model.TraderOrder, err error) { @@ -48,3 +73,14 @@ func (u *TradeRepository) UpdateTradeOrder(req *proto.AddTradeOrderReq) (obj *mo fmt.Println("repository UpdateTradeOrder >>>> ", trade) return &trade, tb.Error //err } + +// 生产 订单号 Y2022 06 27 11 00 53 948 97 103564 +// +// 年 月 日 时 分 秒 毫秒 ID 随机数 +func getOrderNo(time2 time.Time, userID int32) string { + var tradeNo string + tempNum := strconv.Itoa(rand.Intn(999999-100000+1) + 100000) + tradeNo = "Y" + time2.Format("20060102150405.000") + strconv.Itoa(int(userID)) + tempNum + tradeNo = strings.Replace(tradeNo, ".", "", -1) + return tradeNo +} diff --git a/trade-order/proto/trade.pb.go b/trade-order/proto/trade.pb.go index 2a0b345..4764011 100644 --- a/trade-order/proto/trade.pb.go +++ b/trade-order/proto/trade.pb.go @@ -11,6 +11,10 @@ package proto import ( + context "context" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" @@ -24,30 +28,36 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) -// ID int32 `json:"id"` -// UserId int32 `json:"userId"` -// ProductId int32 `gorm:"product_id" json:"productId"` -// ProductSkuId int32 `gorm:"product_sku_id" json:"productSkuId"` -// ProductName string `json:"productName"` -// ProductMainPicture string `gorm:"product_main_picture" json:"productMainPicture"` -// Number int32 `gorm:"default:1" json:"number"` -// CreateUser int32 `gorm:"default:1" json:"createUser"` -// CreateTime time.Time `json:"createTime"` -// UpdateUser int32 `json:"updateUser"` -// UpdateTime time.Time `json:"updateTime"` -// IsDeleted bool `json:"isDeleted"` +// "serverTime": "2022-11-01 11:08:13", +// "expireTime": "2022-11-01 11:38:13", +// "totalAmount": 190.00, +// "productAmount": 190.00, +// "shippingAmount": 0, +// "discountAmount": 0.00, +// "payAmount": 190.00, type TradeOrder struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id int32 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` - UserId int32 `protobuf:"varint,2,opt,name=userId,proto3" json:"userId,omitempty"` - ProductId int32 `protobuf:"varint,3,opt,name=productId,proto3" json:"productId,omitempty"` - ProductSkuId int32 `protobuf:"varint,4,opt,name=productSkuId,proto3" json:"productSkuId,omitempty"` - ProductName string `protobuf:"bytes,5,opt,name=productName,proto3" json:"productName,omitempty"` - ProductMainPicture string `protobuf:"bytes,6,opt,name=productMainPicture,proto3" json:"productMainPicture,omitempty"` - Number int32 `protobuf:"varint,7,opt,name=number,proto3" json:"number,omitempty"` + ServerTime string `protobuf:"bytes,1,opt,name=serverTime,proto3" json:"serverTime,omitempty"` + ExpireTime string `protobuf:"bytes,2,opt,name=expireTime,proto3" json:"expireTime,omitempty"` + TotalAmount float32 `protobuf:"fixed32,3,opt,name=totalAmount,proto3" json:"totalAmount,omitempty"` + ProductAmount float32 `protobuf:"fixed32,4,opt,name=productAmount,proto3" json:"productAmount,omitempty"` + ShippingAmount float32 `protobuf:"fixed32,5,opt,name=shippingAmount,proto3" json:"shippingAmount,omitempty"` + DiscountAmount float32 `protobuf:"fixed32,6,opt,name=discountAmount,proto3" json:"discountAmount,omitempty"` + PayAmount float32 `protobuf:"fixed32,7,opt,name=payAmount,proto3" json:"payAmount,omitempty"` //resp返回需要 + // 新增和修改需要 + ID int32 `protobuf:"varint,8,opt,name=iD,proto3" json:"iD,omitempty"` + IsDeleted bool `protobuf:"varint,9,opt,name=isDeleted,proto3" json:"isDeleted,omitempty"` + OrderStatus int32 `protobuf:"varint,10,opt,name=orderStatus,proto3" json:"orderStatus,omitempty"` + OrderNo string `protobuf:"bytes,11,opt,name=orderNo,proto3" json:"orderNo,omitempty"` + UserId int32 `protobuf:"varint,12,opt,name=userId,proto3" json:"userId,omitempty"` + CreateUser int32 `protobuf:"varint,13,opt,name=createUser,proto3" json:"createUser,omitempty"` + UpdateUser int32 `protobuf:"varint,14,opt,name=updateUser,proto3" json:"updateUser,omitempty"` + CancelReason string `protobuf:"bytes,15,opt,name=cancelReason,proto3" json:"cancelReason,omitempty"` + CreateTime string `protobuf:"bytes,16,opt,name=createTime,proto3" json:"createTime,omitempty"` + SubmitTime string `protobuf:"bytes,17,opt,name=submitTime,proto3" json:"submitTime,omitempty"` } func (x *TradeOrder) Reset() { @@ -82,13 +92,83 @@ func (*TradeOrder) Descriptor() ([]byte, []int) { return file_trade_proto_rawDescGZIP(), []int{0} } -func (x *TradeOrder) GetId() int32 { +func (x *TradeOrder) GetServerTime() string { if x != nil { - return x.Id + return x.ServerTime + } + return "" +} + +func (x *TradeOrder) GetExpireTime() string { + if x != nil { + return x.ExpireTime + } + return "" +} + +func (x *TradeOrder) GetTotalAmount() float32 { + if x != nil { + return x.TotalAmount + } + return 0 +} + +func (x *TradeOrder) GetProductAmount() float32 { + if x != nil { + return x.ProductAmount + } + return 0 +} + +func (x *TradeOrder) GetShippingAmount() float32 { + if x != nil { + return x.ShippingAmount } return 0 } +func (x *TradeOrder) GetDiscountAmount() float32 { + if x != nil { + return x.DiscountAmount + } + return 0 +} + +func (x *TradeOrder) GetPayAmount() float32 { + if x != nil { + return x.PayAmount + } + return 0 +} + +func (x *TradeOrder) GetID() int32 { + if x != nil { + return x.ID + } + return 0 +} + +func (x *TradeOrder) GetIsDeleted() bool { + if x != nil { + return x.IsDeleted + } + return false +} + +func (x *TradeOrder) GetOrderStatus() int32 { + if x != nil { + return x.OrderStatus + } + return 0 +} + +func (x *TradeOrder) GetOrderNo() string { + if x != nil { + return x.OrderNo + } + return "" +} + func (x *TradeOrder) GetUserId() int32 { if x != nil { return x.UserId @@ -96,39 +176,39 @@ func (x *TradeOrder) GetUserId() int32 { return 0 } -func (x *TradeOrder) GetProductId() int32 { +func (x *TradeOrder) GetCreateUser() int32 { if x != nil { - return x.ProductId + return x.CreateUser } return 0 } -func (x *TradeOrder) GetProductSkuId() int32 { +func (x *TradeOrder) GetUpdateUser() int32 { if x != nil { - return x.ProductSkuId + return x.UpdateUser } return 0 } -func (x *TradeOrder) GetProductName() string { +func (x *TradeOrder) GetCancelReason() string { if x != nil { - return x.ProductName + return x.CancelReason } return "" } -func (x *TradeOrder) GetProductMainPicture() string { +func (x *TradeOrder) GetCreateTime() string { if x != nil { - return x.ProductMainPicture + return x.CreateTime } return "" } -func (x *TradeOrder) GetNumber() int32 { +func (x *TradeOrder) GetSubmitTime() string { if x != nil { - return x.Number + return x.SubmitTime } - return 0 + return "" } // 请求 request struct @@ -137,13 +217,10 @@ type AddTradeOrderReq struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Number int32 `protobuf:"varint,1,opt,name=number,proto3" json:"number,omitempty"` - ProductId int32 `protobuf:"varint,2,opt,name=productId,proto3" json:"productId,omitempty"` - ProductSkuId int32 `protobuf:"varint,3,opt,name=productSkuId,proto3" json:"productSkuId,omitempty"` - ProductName string `protobuf:"bytes,4,opt,name=productName,proto3" json:"productName,omitempty"` - ProductMainPicture string `protobuf:"bytes,5,opt,name=productMainPicture,proto3" json:"productMainPicture,omitempty"` - UserId int32 `protobuf:"varint,6,opt,name=userId,proto3" json:"userId,omitempty"` - Id int32 `protobuf:"varint,7,opt,name=id,proto3" json:"id,omitempty"` + CartIds []int32 `protobuf:"varint,1,rep,packed,name=cartIds,proto3" json:"cartIds,omitempty"` + IsVirtual bool `protobuf:"varint,2,opt,name=isVirtual,proto3" json:"isVirtual,omitempty"` + RecipientAddressId int32 `protobuf:"varint,3,opt,name=recipientAddressId,proto3" json:"recipientAddressId,omitempty"` + TradeOrder *TradeOrder `protobuf:"bytes,4,opt,name=tradeOrder,proto3" json:"tradeOrder,omitempty"` } func (x *AddTradeOrderReq) Reset() { @@ -178,53 +255,32 @@ func (*AddTradeOrderReq) Descriptor() ([]byte, []int) { return file_trade_proto_rawDescGZIP(), []int{1} } -func (x *AddTradeOrderReq) GetNumber() int32 { - if x != nil { - return x.Number - } - return 0 -} - -func (x *AddTradeOrderReq) GetProductId() int32 { - if x != nil { - return x.ProductId - } - return 0 -} - -func (x *AddTradeOrderReq) GetProductSkuId() int32 { - if x != nil { - return x.ProductSkuId - } - return 0 -} - -func (x *AddTradeOrderReq) GetProductName() string { +func (x *AddTradeOrderReq) GetCartIds() []int32 { if x != nil { - return x.ProductName + return x.CartIds } - return "" + return nil } -func (x *AddTradeOrderReq) GetProductMainPicture() string { +func (x *AddTradeOrderReq) GetIsVirtual() bool { if x != nil { - return x.ProductMainPicture + return x.IsVirtual } - return "" + return false } -func (x *AddTradeOrderReq) GetUserId() int32 { +func (x *AddTradeOrderReq) GetRecipientAddressId() int32 { if x != nil { - return x.UserId + return x.RecipientAddressId } return 0 } -func (x *AddTradeOrderReq) GetId() int32 { +func (x *AddTradeOrderReq) GetTradeOrder() *TradeOrder { if x != nil { - return x.Id + return x.TradeOrder } - return 0 + return nil } type AddTradeOrderResp struct { @@ -232,12 +288,8 @@ type AddTradeOrderResp struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ProductSimple *ProductDetail `protobuf:"bytes,1,opt,name=productSimple,proto3" json:"productSimple,omitempty"` - ProductSkuSimple *ProductSku `protobuf:"bytes,2,opt,name=productSkuSimple,proto3" json:"productSkuSimple,omitempty"` - ShoppingCartNumber int64 `protobuf:"varint,3,opt,name=shoppingCartNumber,proto3" json:"shoppingCartNumber,omitempty"` - CanSetShoppingCartNumber int64 `protobuf:"varint,4,opt,name=canSetShoppingCartNumber,proto3" json:"canSetShoppingCartNumber,omitempty"` - IsBeyondMaxLimit bool `protobuf:"varint,5,opt,name=isBeyondMaxLimit,proto3" json:"isBeyondMaxLimit,omitempty"` - ID int32 `protobuf:"varint,6,opt,name=ID,proto3" json:"ID,omitempty"` + TradeOrder *TradeOrder `protobuf:"bytes,1,opt,name=tradeOrder,proto3" json:"tradeOrder,omitempty"` + Products []*ProductOrder `protobuf:"bytes,2,rep,name=products,proto3" json:"products,omitempty"` } func (x *AddTradeOrderResp) Reset() { @@ -272,44 +324,137 @@ func (*AddTradeOrderResp) Descriptor() ([]byte, []int) { return file_trade_proto_rawDescGZIP(), []int{2} } -func (x *AddTradeOrderResp) GetProductSimple() *ProductDetail { +func (x *AddTradeOrderResp) GetTradeOrder() *TradeOrder { if x != nil { - return x.ProductSimple + return x.TradeOrder } return nil } -func (x *AddTradeOrderResp) GetProductSkuSimple() *ProductSku { +func (x *AddTradeOrderResp) GetProducts() []*ProductOrder { if x != nil { - return x.ProductSkuSimple + return x.Products } return nil } -func (x *AddTradeOrderResp) GetShoppingCartNumber() int64 { +// * +// "productId": 74, +// "productSkuId": 265, +// "productName": "机器学习观止—核心原理与实践| 林学森 机器学习人工智能计算机", +// "productImageUrl": "https://msb-edu-dev.oss-cn-beijing.aliyuncs.com/mall-product/productO1CN010A7WjS1CP1BmI67Qg-101450072.jpg_430x430q90.jpg", +// "skuDescribe": "", +// "quantity": 1, +// "productPrice": 118.00, +// "realPrice": 118.00, +// "realAmount": 118.00 +type ProductOrder struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ProductId int32 `protobuf:"varint,1,opt,name=productId,proto3" json:"productId,omitempty"` + ProductSkuId int32 `protobuf:"varint,2,opt,name=productSkuId,proto3" json:"productSkuId,omitempty"` + ProductName string `protobuf:"bytes,3,opt,name=productName,proto3" json:"productName,omitempty"` + ProductImageUrl string `protobuf:"bytes,4,opt,name=productImageUrl,proto3" json:"productImageUrl,omitempty"` + SkuDescribe string `protobuf:"bytes,5,opt,name=skuDescribe,proto3" json:"skuDescribe,omitempty"` + Quantity int32 `protobuf:"varint,6,opt,name=quantity,proto3" json:"quantity,omitempty"` + ProductPrice float32 `protobuf:"fixed32,7,opt,name=productPrice,proto3" json:"productPrice,omitempty"` + RealPrice float32 `protobuf:"fixed32,8,opt,name=realPrice,proto3" json:"realPrice,omitempty"` + RealAmount float32 `protobuf:"fixed32,9,opt,name=realAmount,proto3" json:"realAmount,omitempty"` +} + +func (x *ProductOrder) Reset() { + *x = ProductOrder{} + if protoimpl.UnsafeEnabled { + mi := &file_trade_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ProductOrder) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ProductOrder) ProtoMessage() {} + +func (x *ProductOrder) ProtoReflect() protoreflect.Message { + mi := &file_trade_proto_msgTypes[3] + 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 ProductOrder.ProtoReflect.Descriptor instead. +func (*ProductOrder) Descriptor() ([]byte, []int) { + return file_trade_proto_rawDescGZIP(), []int{3} +} + +func (x *ProductOrder) GetProductId() int32 { if x != nil { - return x.ShoppingCartNumber + return x.ProductId } return 0 } -func (x *AddTradeOrderResp) GetCanSetShoppingCartNumber() int64 { +func (x *ProductOrder) GetProductSkuId() int32 { if x != nil { - return x.CanSetShoppingCartNumber + return x.ProductSkuId } return 0 } -func (x *AddTradeOrderResp) GetIsBeyondMaxLimit() bool { +func (x *ProductOrder) GetProductName() string { if x != nil { - return x.IsBeyondMaxLimit + return x.ProductName } - return false + return "" } -func (x *AddTradeOrderResp) GetID() int32 { +func (x *ProductOrder) GetProductImageUrl() string { if x != nil { - return x.ID + return x.ProductImageUrl + } + return "" +} + +func (x *ProductOrder) GetSkuDescribe() string { + if x != nil { + return x.SkuDescribe + } + return "" +} + +func (x *ProductOrder) GetQuantity() int32 { + if x != nil { + return x.Quantity + } + return 0 +} + +func (x *ProductOrder) GetProductPrice() float32 { + if x != nil { + return x.ProductPrice + } + return 0 +} + +func (x *ProductOrder) GetRealPrice() float32 { + if x != nil { + return x.RealPrice + } + return 0 +} + +func (x *ProductOrder) GetRealAmount() float32 { + if x != nil { + return x.RealAmount } return 0 } @@ -333,7 +478,7 @@ type Product struct { func (x *Product) Reset() { *x = Product{} if protoimpl.UnsafeEnabled { - mi := &file_trade_proto_msgTypes[3] + mi := &file_trade_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -346,7 +491,7 @@ func (x *Product) String() string { func (*Product) ProtoMessage() {} func (x *Product) ProtoReflect() protoreflect.Message { - mi := &file_trade_proto_msgTypes[3] + mi := &file_trade_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -359,7 +504,7 @@ func (x *Product) ProtoReflect() protoreflect.Message { // Deprecated: Use Product.ProtoReflect.Descriptor instead. func (*Product) Descriptor() ([]byte, []int) { - return file_trade_proto_rawDescGZIP(), []int{3} + return file_trade_proto_rawDescGZIP(), []int{4} } func (x *Product) GetId() int32 { @@ -438,7 +583,7 @@ type PageReq struct { func (x *PageReq) Reset() { *x = PageReq{} if protoimpl.UnsafeEnabled { - mi := &file_trade_proto_msgTypes[4] + mi := &file_trade_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -451,7 +596,7 @@ func (x *PageReq) String() string { func (*PageReq) ProtoMessage() {} func (x *PageReq) ProtoReflect() protoreflect.Message { - mi := &file_trade_proto_msgTypes[4] + mi := &file_trade_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -464,7 +609,7 @@ func (x *PageReq) ProtoReflect() protoreflect.Message { // Deprecated: Use PageReq.ProtoReflect.Descriptor instead. func (*PageReq) Descriptor() ([]byte, []int) { - return file_trade_proto_rawDescGZIP(), []int{4} + return file_trade_proto_rawDescGZIP(), []int{5} } func (x *PageReq) GetLength() int32 { @@ -495,7 +640,7 @@ type PageResp struct { func (x *PageResp) Reset() { *x = PageResp{} if protoimpl.UnsafeEnabled { - mi := &file_trade_proto_msgTypes[5] + mi := &file_trade_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -508,7 +653,7 @@ func (x *PageResp) String() string { func (*PageResp) ProtoMessage() {} func (x *PageResp) ProtoReflect() protoreflect.Message { - mi := &file_trade_proto_msgTypes[5] + mi := &file_trade_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -521,7 +666,7 @@ func (x *PageResp) ProtoReflect() protoreflect.Message { // Deprecated: Use PageResp.ProtoReflect.Descriptor instead. func (*PageResp) Descriptor() ([]byte, []int) { - return file_trade_proto_rawDescGZIP(), []int{5} + return file_trade_proto_rawDescGZIP(), []int{6} } func (x *PageResp) GetProduct() []*Product { @@ -592,7 +737,7 @@ type ProductDetail struct { func (x *ProductDetail) Reset() { *x = ProductDetail{} if protoimpl.UnsafeEnabled { - mi := &file_trade_proto_msgTypes[6] + mi := &file_trade_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -605,7 +750,7 @@ func (x *ProductDetail) String() string { func (*ProductDetail) ProtoMessage() {} func (x *ProductDetail) ProtoReflect() protoreflect.Message { - mi := &file_trade_proto_msgTypes[6] + mi := &file_trade_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -618,7 +763,7 @@ func (x *ProductDetail) ProtoReflect() protoreflect.Message { // Deprecated: Use ProductDetail.ProtoReflect.Descriptor instead. func (*ProductDetail) Descriptor() ([]byte, []int) { - return file_trade_proto_rawDescGZIP(), []int{6} + return file_trade_proto_rawDescGZIP(), []int{7} } func (x *ProductDetail) GetId() int32 { @@ -759,7 +904,7 @@ type ProductDetailReq struct { func (x *ProductDetailReq) Reset() { *x = ProductDetailReq{} if protoimpl.UnsafeEnabled { - mi := &file_trade_proto_msgTypes[7] + mi := &file_trade_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -772,7 +917,7 @@ func (x *ProductDetailReq) String() string { func (*ProductDetailReq) ProtoMessage() {} func (x *ProductDetailReq) ProtoReflect() protoreflect.Message { - mi := &file_trade_proto_msgTypes[7] + mi := &file_trade_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -785,7 +930,7 @@ func (x *ProductDetailReq) ProtoReflect() protoreflect.Message { // Deprecated: Use ProductDetailReq.ProtoReflect.Descriptor instead. func (*ProductDetailReq) Descriptor() ([]byte, []int) { - return file_trade_proto_rawDescGZIP(), []int{7} + return file_trade_proto_rawDescGZIP(), []int{8} } func (x *ProductDetailReq) GetId() int32 { @@ -807,7 +952,7 @@ type ProductDetailResp struct { func (x *ProductDetailResp) Reset() { *x = ProductDetailResp{} if protoimpl.UnsafeEnabled { - mi := &file_trade_proto_msgTypes[8] + mi := &file_trade_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -820,7 +965,7 @@ func (x *ProductDetailResp) String() string { func (*ProductDetailResp) ProtoMessage() {} func (x *ProductDetailResp) ProtoReflect() protoreflect.Message { - mi := &file_trade_proto_msgTypes[8] + mi := &file_trade_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -833,7 +978,7 @@ func (x *ProductDetailResp) ProtoReflect() protoreflect.Message { // Deprecated: Use ProductDetailResp.ProtoReflect.Descriptor instead. func (*ProductDetailResp) Descriptor() ([]byte, []int) { - return file_trade_proto_rawDescGZIP(), []int{8} + return file_trade_proto_rawDescGZIP(), []int{9} } func (x *ProductDetailResp) GetProductDetail() []*ProductDetail { @@ -863,7 +1008,7 @@ type ProductSku struct { func (x *ProductSku) Reset() { *x = ProductSku{} if protoimpl.UnsafeEnabled { - mi := &file_trade_proto_msgTypes[9] + mi := &file_trade_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -876,7 +1021,7 @@ func (x *ProductSku) String() string { func (*ProductSku) ProtoMessage() {} func (x *ProductSku) ProtoReflect() protoreflect.Message { - mi := &file_trade_proto_msgTypes[9] + mi := &file_trade_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -889,7 +1034,7 @@ func (x *ProductSku) ProtoReflect() protoreflect.Message { // Deprecated: Use ProductSku.ProtoReflect.Descriptor instead. func (*ProductSku) Descriptor() ([]byte, []int) { - return file_trade_proto_rawDescGZIP(), []int{9} + return file_trade_proto_rawDescGZIP(), []int{10} } func (x *ProductSku) GetSkuId() int32 { @@ -939,7 +1084,7 @@ type ProductSkuReq struct { func (x *ProductSkuReq) Reset() { *x = ProductSkuReq{} if protoimpl.UnsafeEnabled { - mi := &file_trade_proto_msgTypes[10] + mi := &file_trade_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -952,7 +1097,7 @@ func (x *ProductSkuReq) String() string { func (*ProductSkuReq) ProtoMessage() {} func (x *ProductSkuReq) ProtoReflect() protoreflect.Message { - mi := &file_trade_proto_msgTypes[10] + mi := &file_trade_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -965,7 +1110,7 @@ func (x *ProductSkuReq) ProtoReflect() protoreflect.Message { // Deprecated: Use ProductSkuReq.ProtoReflect.Descriptor instead. func (*ProductSkuReq) Descriptor() ([]byte, []int) { - return file_trade_proto_rawDescGZIP(), []int{10} + return file_trade_proto_rawDescGZIP(), []int{11} } func (x *ProductSkuReq) GetProductId() int32 { @@ -987,7 +1132,7 @@ type ProductSkuResp struct { func (x *ProductSkuResp) Reset() { *x = ProductSkuResp{} if protoimpl.UnsafeEnabled { - mi := &file_trade_proto_msgTypes[11] + mi := &file_trade_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1000,7 +1145,7 @@ func (x *ProductSkuResp) String() string { func (*ProductSkuResp) ProtoMessage() {} func (x *ProductSkuResp) ProtoReflect() protoreflect.Message { - mi := &file_trade_proto_msgTypes[11] + mi := &file_trade_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1013,7 +1158,7 @@ func (x *ProductSkuResp) ProtoReflect() protoreflect.Message { // Deprecated: Use ProductSkuResp.ProtoReflect.Descriptor instead. func (*ProductSkuResp) Descriptor() ([]byte, []int) { - return file_trade_proto_rawDescGZIP(), []int{11} + return file_trade_proto_rawDescGZIP(), []int{12} } func (x *ProductSkuResp) GetProductSku() []*ProductSku { @@ -1035,7 +1180,7 @@ type TokenReq struct { func (x *TokenReq) Reset() { *x = TokenReq{} if protoimpl.UnsafeEnabled { - mi := &file_trade_proto_msgTypes[12] + mi := &file_trade_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1048,7 +1193,7 @@ func (x *TokenReq) String() string { func (*TokenReq) ProtoMessage() {} func (x *TokenReq) ProtoReflect() protoreflect.Message { - mi := &file_trade_proto_msgTypes[12] + mi := &file_trade_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1061,7 +1206,7 @@ func (x *TokenReq) ProtoReflect() protoreflect.Message { // Deprecated: Use TokenReq.ProtoReflect.Descriptor instead. func (*TokenReq) Descriptor() ([]byte, []int) { - return file_trade_proto_rawDescGZIP(), []int{12} + return file_trade_proto_rawDescGZIP(), []int{13} } func (x *TokenReq) GetUuid() string { @@ -1084,7 +1229,7 @@ type TokenResp struct { func (x *TokenResp) Reset() { *x = TokenResp{} if protoimpl.UnsafeEnabled { - mi := &file_trade_proto_msgTypes[13] + mi := &file_trade_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1097,7 +1242,7 @@ func (x *TokenResp) String() string { func (*TokenResp) ProtoMessage() {} func (x *TokenResp) ProtoReflect() protoreflect.Message { - mi := &file_trade_proto_msgTypes[13] + mi := &file_trade_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1110,7 +1255,7 @@ func (x *TokenResp) ProtoReflect() protoreflect.Message { // Deprecated: Use TokenResp.ProtoReflect.Descriptor instead. func (*TokenResp) Descriptor() ([]byte, []int) { - return file_trade_proto_rawDescGZIP(), []int{13} + return file_trade_proto_rawDescGZIP(), []int{14} } func (x *TokenResp) GetToken() string { @@ -1139,7 +1284,7 @@ type UpdateSkuReq struct { func (x *UpdateSkuReq) Reset() { *x = UpdateSkuReq{} if protoimpl.UnsafeEnabled { - mi := &file_trade_proto_msgTypes[14] + mi := &file_trade_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1152,7 +1297,7 @@ func (x *UpdateSkuReq) String() string { func (*UpdateSkuReq) ProtoMessage() {} func (x *UpdateSkuReq) ProtoReflect() protoreflect.Message { - mi := &file_trade_proto_msgTypes[14] + mi := &file_trade_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1165,7 +1310,7 @@ func (x *UpdateSkuReq) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateSkuReq.ProtoReflect.Descriptor instead. func (*UpdateSkuReq) Descriptor() ([]byte, []int) { - return file_trade_proto_rawDescGZIP(), []int{14} + return file_trade_proto_rawDescGZIP(), []int{15} } func (x *UpdateSkuReq) GetProductSku() *ProductSku { @@ -1186,7 +1331,7 @@ type UpdateSkuResp struct { func (x *UpdateSkuResp) Reset() { *x = UpdateSkuResp{} if protoimpl.UnsafeEnabled { - mi := &file_trade_proto_msgTypes[15] + mi := &file_trade_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1199,7 +1344,7 @@ func (x *UpdateSkuResp) String() string { func (*UpdateSkuResp) ProtoMessage() {} func (x *UpdateSkuResp) ProtoReflect() protoreflect.Message { - mi := &file_trade_proto_msgTypes[15] + mi := &file_trade_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1212,7 +1357,7 @@ func (x *UpdateSkuResp) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateSkuResp.ProtoReflect.Descriptor instead. func (*UpdateSkuResp) Descriptor() ([]byte, []int) { - return file_trade_proto_rawDescGZIP(), []int{15} + return file_trade_proto_rawDescGZIP(), []int{16} } func (x *UpdateSkuResp) GetIsSuccess() bool { @@ -1226,202 +1371,227 @@ var File_trade_proto protoreflect.FileDescriptor var file_trade_proto_rawDesc = []byte{ 0x0a, 0x0b, 0x74, 0x72, 0x61, 0x64, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x05, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xe0, 0x01, 0x0a, 0x0a, 0x54, 0x72, 0x61, 0x64, 0x65, 0x4f, 0x72, - 0x64, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x02, 0x69, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x70, - 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, - 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x49, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x72, 0x6f, - 0x64, 0x75, 0x63, 0x74, 0x53, 0x6b, 0x75, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x0c, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x53, 0x6b, 0x75, 0x49, 0x64, 0x12, 0x20, 0x0a, - 0x0b, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x2e, 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x4d, 0x61, 0x69, 0x6e, 0x50, 0x69, - 0x63, 0x74, 0x75, 0x72, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x70, 0x72, 0x6f, - 0x64, 0x75, 0x63, 0x74, 0x4d, 0x61, 0x69, 0x6e, 0x50, 0x69, 0x63, 0x74, 0x75, 0x72, 0x65, 0x12, - 0x16, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0xe6, 0x01, 0x0a, 0x10, 0x41, 0x64, 0x64, 0x54, - 0x72, 0x61, 0x64, 0x65, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x16, 0x0a, 0x06, - 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x6e, 0x75, - 0x6d, 0x62, 0x65, 0x72, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x49, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, - 0x49, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x53, 0x6b, 0x75, - 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, - 0x74, 0x53, 0x6b, 0x75, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, - 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, 0x6f, - 0x64, 0x75, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x64, - 0x75, 0x63, 0x74, 0x4d, 0x61, 0x69, 0x6e, 0x50, 0x69, 0x63, 0x74, 0x75, 0x72, 0x65, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x4d, 0x61, 0x69, - 0x6e, 0x50, 0x69, 0x63, 0x74, 0x75, 0x72, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, - 0x49, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, - 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, - 0x22, 0xb6, 0x02, 0x0a, 0x11, 0x41, 0x64, 0x64, 0x54, 0x72, 0x61, 0x64, 0x65, 0x4f, 0x72, 0x64, - 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x12, 0x3a, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, - 0x74, 0x53, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x44, 0x65, 0x74, - 0x61, 0x69, 0x6c, 0x52, 0x0d, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x53, 0x69, 0x6d, 0x70, - 0x6c, 0x65, 0x12, 0x3d, 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x53, 0x6b, 0x75, - 0x53, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x53, 0x6b, 0x75, 0x52, - 0x10, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x53, 0x6b, 0x75, 0x53, 0x69, 0x6d, 0x70, 0x6c, - 0x65, 0x12, 0x2e, 0x0a, 0x12, 0x73, 0x68, 0x6f, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x43, 0x61, 0x72, - 0x74, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x73, - 0x68, 0x6f, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x43, 0x61, 0x72, 0x74, 0x4e, 0x75, 0x6d, 0x62, 0x65, - 0x72, 0x12, 0x3a, 0x0a, 0x18, 0x63, 0x61, 0x6e, 0x53, 0x65, 0x74, 0x53, 0x68, 0x6f, 0x70, 0x70, - 0x69, 0x6e, 0x67, 0x43, 0x61, 0x72, 0x74, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x18, 0x63, 0x61, 0x6e, 0x53, 0x65, 0x74, 0x53, 0x68, 0x6f, 0x70, 0x70, - 0x69, 0x6e, 0x67, 0x43, 0x61, 0x72, 0x74, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x2a, 0x0a, - 0x10, 0x69, 0x73, 0x42, 0x65, 0x79, 0x6f, 0x6e, 0x64, 0x4d, 0x61, 0x78, 0x4c, 0x69, 0x6d, 0x69, - 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x69, 0x73, 0x42, 0x65, 0x79, 0x6f, 0x6e, - 0x64, 0x4d, 0x61, 0x78, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x49, 0x44, 0x22, 0xec, 0x02, 0x0a, 0x07, 0x50, 0x72, - 0x6f, 0x64, 0x75, 0x63, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x74, 0x61, - 0x72, 0x74, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x69, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x0d, 0x73, 0x74, 0x61, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, - 0x20, 0x0a, 0x0b, 0x6d, 0x61, 0x69, 0x6e, 0x50, 0x69, 0x63, 0x74, 0x75, 0x72, 0x65, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6d, 0x61, 0x69, 0x6e, 0x50, 0x69, 0x63, 0x74, 0x75, 0x72, - 0x65, 0x12, 0x3b, 0x0a, 0x09, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x4c, 0x69, 0x73, 0x74, 0x18, 0x05, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x72, 0x6f, - 0x64, 0x75, 0x63, 0x74, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x09, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x26, - 0x0a, 0x0e, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x42, 0x75, 0x79, 0x4c, 0x69, 0x6d, 0x69, 0x74, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x42, 0x75, - 0x79, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1a, 0x0a, 0x08, - 0x69, 0x73, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, - 0x69, 0x73, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x64, - 0x75, 0x63, 0x74, 0x54, 0x79, 0x70, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x70, - 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x54, 0x79, 0x70, 0x65, 0x1a, 0x3c, 0x0a, 0x0e, 0x4c, 0x61, - 0x62, 0x65, 0x6c, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3f, 0x0a, 0x07, 0x50, 0x61, 0x67, 0x65, - 0x52, 0x65, 0x71, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x06, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x1c, 0x0a, 0x09, 0x70, - 0x61, 0x67, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, - 0x70, 0x61, 0x67, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x5e, 0x0a, 0x08, 0x50, 0x61, 0x67, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x28, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, - 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x12, - 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, - 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x22, 0xbf, 0x04, 0x0a, 0x0d, 0x50, 0x72, - 0x6f, 0x64, 0x75, 0x63, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x0e, 0x0a, 0x02, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x20, 0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x54, 0x79, 0x70, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x54, 0x79, 0x70, - 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x49, 0x64, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x49, - 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x69, - 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0d, 0x73, 0x74, 0x61, 0x72, 0x74, 0x69, - 0x6e, 0x67, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, - 0x53, 0x74, 0x6f, 0x63, 0x6b, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x74, 0x6f, 0x74, - 0x61, 0x6c, 0x53, 0x74, 0x6f, 0x63, 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x6d, 0x61, 0x69, 0x6e, 0x50, - 0x69, 0x63, 0x74, 0x75, 0x72, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6d, 0x61, - 0x69, 0x6e, 0x50, 0x69, 0x63, 0x74, 0x75, 0x72, 0x65, 0x12, 0x2c, 0x0a, 0x11, 0x72, 0x65, 0x6d, - 0x6f, 0x74, 0x65, 0x41, 0x72, 0x65, 0x61, 0x50, 0x6f, 0x73, 0x74, 0x61, 0x67, 0x65, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x02, 0x52, 0x11, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41, 0x72, 0x65, 0x61, - 0x50, 0x6f, 0x73, 0x74, 0x61, 0x67, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x73, 0x69, 0x6e, 0x67, 0x6c, - 0x65, 0x42, 0x75, 0x79, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x0e, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x42, 0x75, 0x79, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, - 0x1a, 0x0a, 0x08, 0x69, 0x73, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x08, 0x69, 0x73, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, - 0x65, 0x6d, 0x61, 0x72, 0x6b, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x6d, - 0x61, 0x72, 0x6b, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, - 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, - 0x73, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, - 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, - 0x69, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, - 0x72, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, - 0x73, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, - 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, - 0x69, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x49, 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, - 0x18, 0x10, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x49, 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x64, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x18, 0x11, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x69, 0x63, - 0x74, 0x75, 0x72, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x18, 0x12, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, - 0x70, 0x69, 0x63, 0x74, 0x75, 0x72, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x22, 0x0a, 0x10, 0x50, - 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x71, 0x12, - 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x22, - 0x4f, 0x0a, 0x11, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, - 0x52, 0x65, 0x73, 0x70, 0x12, 0x3a, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x44, - 0x65, 0x74, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x70, 0x72, + 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xa8, 0x04, 0x0a, 0x0a, 0x54, 0x72, 0x61, 0x64, 0x65, 0x4f, 0x72, + 0x64, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x54, 0x69, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x54, + 0x69, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x54, 0x69, 0x6d, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x54, + 0x69, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x41, 0x6d, 0x6f, 0x75, + 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x41, + 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, + 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0d, 0x70, 0x72, + 0x6f, 0x64, 0x75, 0x63, 0x74, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x73, + 0x68, 0x69, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x02, 0x52, 0x0e, 0x73, 0x68, 0x69, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x41, 0x6d, 0x6f, + 0x75, 0x6e, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x41, + 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0e, 0x64, 0x69, 0x73, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x70, + 0x61, 0x79, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x02, 0x52, 0x09, + 0x70, 0x61, 0x79, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x44, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x73, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x69, 0x73, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x6f, 0x72, 0x64, 0x65, 0x72, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x6f, 0x72, + 0x64, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x72, 0x64, + 0x65, 0x72, 0x4e, 0x6f, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x72, 0x64, 0x65, + 0x72, 0x4e, 0x6f, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x18, 0x0c, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x75, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x22, 0x0a, 0x0c, 0x63, + 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x0f, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0c, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, + 0x1e, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x10, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, + 0x1e, 0x0a, 0x0a, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x11, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x22, + 0xad, 0x01, 0x0a, 0x10, 0x41, 0x64, 0x64, 0x54, 0x72, 0x61, 0x64, 0x65, 0x4f, 0x72, 0x64, 0x65, + 0x72, 0x52, 0x65, 0x71, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x61, 0x72, 0x74, 0x49, 0x64, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x05, 0x52, 0x07, 0x63, 0x61, 0x72, 0x74, 0x49, 0x64, 0x73, 0x12, 0x1c, + 0x0a, 0x09, 0x69, 0x73, 0x56, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x09, 0x69, 0x73, 0x56, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x12, 0x2e, 0x0a, 0x12, + 0x72, 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x12, 0x72, 0x65, 0x63, 0x69, 0x70, 0x69, + 0x65, 0x6e, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x64, 0x12, 0x31, 0x0a, 0x0a, + 0x74, 0x72, 0x61, 0x64, 0x65, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x11, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x54, 0x72, 0x61, 0x64, 0x65, 0x4f, 0x72, + 0x64, 0x65, 0x72, 0x52, 0x0a, 0x74, 0x72, 0x61, 0x64, 0x65, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x22, + 0x77, 0x0a, 0x11, 0x41, 0x64, 0x64, 0x54, 0x72, 0x61, 0x64, 0x65, 0x4f, 0x72, 0x64, 0x65, 0x72, + 0x52, 0x65, 0x73, 0x70, 0x12, 0x31, 0x0a, 0x0a, 0x74, 0x72, 0x61, 0x64, 0x65, 0x4f, 0x72, 0x64, + 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2e, 0x54, 0x72, 0x61, 0x64, 0x65, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x0a, 0x74, 0x72, 0x61, + 0x64, 0x65, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x12, 0x2f, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x64, 0x75, + 0x63, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x08, + 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x22, 0xbc, 0x02, 0x0a, 0x0c, 0x50, 0x72, 0x6f, + 0x64, 0x75, 0x63, 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x72, 0x6f, + 0x64, 0x75, 0x63, 0x74, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x70, 0x72, + 0x6f, 0x64, 0x75, 0x63, 0x74, 0x49, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x64, 0x75, + 0x63, 0x74, 0x53, 0x6b, 0x75, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x70, + 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x53, 0x6b, 0x75, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x70, + 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, + 0x0f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x55, 0x72, 0x6c, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x49, + 0x6d, 0x61, 0x67, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x73, 0x6b, 0x75, 0x44, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x6b, + 0x75, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x71, 0x75, 0x61, + 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x71, 0x75, 0x61, + 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, + 0x50, 0x72, 0x69, 0x63, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0c, 0x70, 0x72, 0x6f, + 0x64, 0x75, 0x63, 0x74, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x61, + 0x6c, 0x50, 0x72, 0x69, 0x63, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x02, 0x52, 0x09, 0x72, 0x65, + 0x61, 0x6c, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x72, 0x65, 0x61, 0x6c, 0x41, + 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0a, 0x72, 0x65, 0x61, + 0x6c, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xec, 0x02, 0x0a, 0x07, 0x50, 0x72, 0x6f, 0x64, + 0x75, 0x63, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x69, 0x6e, 0x67, 0x50, 0x72, 0x69, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x20, 0x0a, + 0x0b, 0x6d, 0x61, 0x69, 0x6e, 0x50, 0x69, 0x63, 0x74, 0x75, 0x72, 0x65, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x6d, 0x61, 0x69, 0x6e, 0x50, 0x69, 0x63, 0x74, 0x75, 0x72, 0x65, 0x12, + 0x3b, 0x0a, 0x09, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x4c, 0x69, 0x73, 0x74, 0x18, 0x05, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x64, 0x75, + 0x63, 0x74, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x09, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0e, + 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x42, 0x75, 0x79, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x42, 0x75, 0x79, 0x4c, + 0x69, 0x6d, 0x69, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x73, + 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, + 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, + 0x74, 0x54, 0x79, 0x70, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x70, 0x72, 0x6f, + 0x64, 0x75, 0x63, 0x74, 0x54, 0x79, 0x70, 0x65, 0x1a, 0x3c, 0x0a, 0x0e, 0x4c, 0x61, 0x62, 0x65, + 0x6c, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3f, 0x0a, 0x07, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, + 0x71, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x06, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x61, 0x67, + 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x70, 0x61, + 0x67, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x5e, 0x0a, 0x08, 0x50, 0x61, 0x67, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x12, 0x28, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x72, 0x6f, + 0x64, 0x75, 0x63, 0x74, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x12, 0x14, 0x0a, + 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x74, 0x6f, + 0x74, 0x61, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x22, 0xbf, 0x04, 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x64, + 0x75, 0x63, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, + 0x0b, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x54, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, + 0x1e, 0x0a, 0x0a, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x49, 0x64, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x0a, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x49, 0x64, 0x12, + 0x24, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x69, 0x63, 0x65, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0d, 0x73, 0x74, 0x61, 0x72, 0x74, 0x69, 0x6e, 0x67, + 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x74, + 0x6f, 0x63, 0x6b, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, + 0x53, 0x74, 0x6f, 0x63, 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x6d, 0x61, 0x69, 0x6e, 0x50, 0x69, 0x63, + 0x74, 0x75, 0x72, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6d, 0x61, 0x69, 0x6e, + 0x50, 0x69, 0x63, 0x74, 0x75, 0x72, 0x65, 0x12, 0x2c, 0x0a, 0x11, 0x72, 0x65, 0x6d, 0x6f, 0x74, + 0x65, 0x41, 0x72, 0x65, 0x61, 0x50, 0x6f, 0x73, 0x74, 0x61, 0x67, 0x65, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x02, 0x52, 0x11, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41, 0x72, 0x65, 0x61, 0x50, 0x6f, + 0x73, 0x74, 0x61, 0x67, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x42, + 0x75, 0x79, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x73, + 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x42, 0x75, 0x79, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x1a, 0x0a, + 0x08, 0x69, 0x73, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x08, 0x69, 0x73, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x6d, + 0x61, 0x72, 0x6b, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x6d, 0x61, 0x72, + 0x6b, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x18, + 0x0c, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, + 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x18, + 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, + 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x18, + 0x0e, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, + 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x18, + 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, + 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x49, 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x10, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x49, 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x12, + 0x16, 0x0a, 0x06, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x69, 0x63, 0x74, 0x75, + 0x72, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x18, 0x12, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x69, + 0x63, 0x74, 0x75, 0x72, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x22, 0x0a, 0x10, 0x50, 0x72, 0x6f, + 0x64, 0x75, 0x63, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x22, 0x4f, 0x0a, + 0x11, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x65, + 0x73, 0x70, 0x12, 0x3a, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x44, 0x65, 0x74, + 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, + 0x0d, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x22, 0x9c, + 0x01, 0x0a, 0x0a, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x53, 0x6b, 0x75, 0x12, 0x14, 0x0a, + 0x05, 0x73, 0x6b, 0x75, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x73, 0x6b, + 0x75, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x30, 0x0a, 0x13, 0x61, 0x74, 0x74, 0x72, 0x69, + 0x62, 0x75, 0x74, 0x65, 0x53, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x4c, 0x69, 0x73, 0x74, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x53, + 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x6c, + 0x6c, 0x50, 0x72, 0x69, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x02, 0x52, 0x09, 0x73, 0x65, + 0x6c, 0x6c, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x6f, 0x63, 0x6b, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x73, 0x74, 0x6f, 0x63, 0x6b, 0x22, 0x2d, 0x0a, + 0x0d, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x53, 0x6b, 0x75, 0x52, 0x65, 0x71, 0x12, 0x1c, + 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x49, 0x64, 0x22, 0x43, 0x0a, 0x0e, + 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x53, 0x6b, 0x75, 0x52, 0x65, 0x73, 0x70, 0x12, 0x31, + 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x53, 0x6b, 0x75, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x64, 0x75, + 0x63, 0x74, 0x53, 0x6b, 0x75, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x53, 0x6b, + 0x75, 0x22, 0x1e, 0x0a, 0x08, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, + 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, 0x69, + 0x64, 0x22, 0x3b, 0x0a, 0x09, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x12, 0x14, + 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x69, 0x73, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x69, 0x73, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x22, 0x41, + 0x0a, 0x0c, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x6b, 0x75, 0x52, 0x65, 0x71, 0x12, 0x31, + 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x53, 0x6b, 0x75, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x64, 0x75, + 0x63, 0x74, 0x53, 0x6b, 0x75, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x53, 0x6b, + 0x75, 0x22, 0x2d, 0x0a, 0x0d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x6b, 0x75, 0x52, 0x65, + 0x73, 0x70, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x73, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x69, 0x73, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x32, 0x55, 0x0a, 0x0d, 0x41, 0x64, 0x64, 0x54, 0x72, 0x61, 0x64, 0x65, 0x4f, 0x72, 0x64, 0x65, + 0x72, 0x12, 0x44, 0x0a, 0x0d, 0x41, 0x64, 0x64, 0x54, 0x72, 0x61, 0x64, 0x65, 0x4f, 0x72, 0x64, + 0x65, 0x72, 0x12, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x41, 0x64, 0x64, 0x54, 0x72, + 0x61, 0x64, 0x65, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x18, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2e, 0x41, 0x64, 0x64, 0x54, 0x72, 0x61, 0x64, 0x65, 0x4f, 0x72, 0x64, 0x65, + 0x72, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x32, 0x5b, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x54, 0x72, 0x61, 0x64, 0x65, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x12, 0x47, 0x0a, 0x10, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x72, 0x61, 0x64, 0x65, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x12, + 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x41, 0x64, 0x64, 0x54, 0x72, 0x61, 0x64, 0x65, + 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2e, 0x41, 0x64, 0x64, 0x54, 0x72, 0x61, 0x64, 0x65, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x65, + 0x73, 0x70, 0x22, 0x00, 0x32, 0x31, 0x0a, 0x04, 0x50, 0x61, 0x67, 0x65, 0x12, 0x29, 0x0a, 0x04, + 0x50, 0x61, 0x67, 0x65, 0x12, 0x0e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x61, 0x67, + 0x65, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x61, 0x67, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x32, 0x5d, 0x0a, 0x11, 0x53, 0x68, 0x6f, 0x77, 0x50, + 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x48, 0x0a, 0x11, + 0x53, 0x68, 0x6f, 0x77, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, + 0x6c, 0x12, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, + 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x71, 0x1a, 0x18, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, + 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x32, 0x51, 0x0a, 0x0e, 0x53, 0x68, 0x6f, 0x77, 0x50, 0x72, + 0x6f, 0x64, 0x75, 0x63, 0x74, 0x53, 0x6b, 0x75, 0x12, 0x3f, 0x0a, 0x0e, 0x53, 0x68, 0x6f, 0x77, + 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x53, 0x6b, 0x75, 0x12, 0x14, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x53, 0x6b, 0x75, 0x52, 0x65, 0x71, + 0x1a, 0x15, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, + 0x53, 0x6b, 0x75, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x32, 0x52, 0x0a, 0x0d, 0x53, 0x68, 0x6f, + 0x77, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x53, 0x6b, 0x75, 0x12, 0x41, 0x0a, 0x0d, 0x53, 0x68, + 0x6f, 0x77, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x53, 0x6b, 0x75, 0x12, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, - 0x6c, 0x52, 0x0d, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, - 0x22, 0x9c, 0x01, 0x0a, 0x0a, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x53, 0x6b, 0x75, 0x12, - 0x14, 0x0a, 0x05, 0x73, 0x6b, 0x75, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, - 0x73, 0x6b, 0x75, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x30, 0x0a, 0x13, 0x61, 0x74, 0x74, - 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x53, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x4c, 0x69, 0x73, 0x74, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, - 0x65, 0x53, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x73, - 0x65, 0x6c, 0x6c, 0x50, 0x72, 0x69, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x02, 0x52, 0x09, - 0x73, 0x65, 0x6c, 0x6c, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x6f, - 0x63, 0x6b, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x73, 0x74, 0x6f, 0x63, 0x6b, 0x22, - 0x2d, 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x53, 0x6b, 0x75, 0x52, 0x65, 0x71, - 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x49, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x49, 0x64, 0x22, 0x43, - 0x0a, 0x0e, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x53, 0x6b, 0x75, 0x52, 0x65, 0x73, 0x70, - 0x12, 0x31, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x53, 0x6b, 0x75, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x72, 0x6f, - 0x64, 0x75, 0x63, 0x74, 0x53, 0x6b, 0x75, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, - 0x53, 0x6b, 0x75, 0x22, 0x1e, 0x0a, 0x08, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x12, - 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, - 0x75, 0x69, 0x64, 0x22, 0x3b, 0x0a, 0x09, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, - 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x69, 0x73, 0x4c, 0x6f, 0x67, 0x69, - 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x69, 0x73, 0x4c, 0x6f, 0x67, 0x69, 0x6e, - 0x22, 0x41, 0x0a, 0x0c, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x6b, 0x75, 0x52, 0x65, 0x71, - 0x12, 0x31, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x53, 0x6b, 0x75, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x72, 0x6f, - 0x64, 0x75, 0x63, 0x74, 0x53, 0x6b, 0x75, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, - 0x53, 0x6b, 0x75, 0x22, 0x2d, 0x0a, 0x0d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x6b, 0x75, - 0x52, 0x65, 0x73, 0x70, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x73, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, - 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x69, 0x73, 0x53, 0x75, 0x63, 0x63, 0x65, - 0x73, 0x73, 0x32, 0x55, 0x0a, 0x0d, 0x41, 0x64, 0x64, 0x54, 0x72, 0x61, 0x64, 0x65, 0x4f, 0x72, - 0x64, 0x65, 0x72, 0x12, 0x44, 0x0a, 0x0d, 0x41, 0x64, 0x64, 0x54, 0x72, 0x61, 0x64, 0x65, 0x4f, - 0x72, 0x64, 0x65, 0x72, 0x12, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x41, 0x64, 0x64, - 0x54, 0x72, 0x61, 0x64, 0x65, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x18, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x41, 0x64, 0x64, 0x54, 0x72, 0x61, 0x64, 0x65, 0x4f, 0x72, - 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x32, 0x5b, 0x0a, 0x10, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x54, 0x72, 0x61, 0x64, 0x65, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x12, 0x47, 0x0a, - 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x72, 0x61, 0x64, 0x65, 0x4f, 0x72, 0x64, 0x65, - 0x72, 0x12, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x41, 0x64, 0x64, 0x54, 0x72, 0x61, - 0x64, 0x65, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x18, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x2e, 0x41, 0x64, 0x64, 0x54, 0x72, 0x61, 0x64, 0x65, 0x4f, 0x72, 0x64, 0x65, 0x72, - 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x32, 0x31, 0x0a, 0x04, 0x50, 0x61, 0x67, 0x65, 0x12, 0x29, - 0x0a, 0x04, 0x50, 0x61, 0x67, 0x65, 0x12, 0x0e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, - 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, - 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x32, 0x5d, 0x0a, 0x11, 0x53, 0x68, 0x6f, - 0x77, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x48, - 0x0a, 0x11, 0x53, 0x68, 0x6f, 0x77, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x44, 0x65, 0x74, - 0x61, 0x69, 0x6c, 0x12, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x64, - 0x75, 0x63, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x71, 0x1a, 0x18, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x44, 0x65, 0x74, 0x61, - 0x69, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x32, 0x51, 0x0a, 0x0e, 0x53, 0x68, 0x6f, 0x77, - 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x53, 0x6b, 0x75, 0x12, 0x3f, 0x0a, 0x0e, 0x53, 0x68, - 0x6f, 0x77, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x53, 0x6b, 0x75, 0x12, 0x14, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x53, 0x6b, 0x75, 0x52, - 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x64, 0x75, - 0x63, 0x74, 0x53, 0x6b, 0x75, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x32, 0x52, 0x0a, 0x0d, 0x53, - 0x68, 0x6f, 0x77, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x53, 0x6b, 0x75, 0x12, 0x41, 0x0a, 0x0d, - 0x53, 0x68, 0x6f, 0x77, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x53, 0x6b, 0x75, 0x12, 0x17, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x44, 0x65, 0x74, - 0x61, 0x69, 0x6c, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, - 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x53, 0x6b, 0x75, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x32, - 0x43, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, - 0x33, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, - 0x0f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, - 0x1a, 0x10, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, - 0x73, 0x70, 0x22, 0x00, 0x32, 0x45, 0x0a, 0x09, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x6b, - 0x75, 0x12, 0x38, 0x0a, 0x09, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x6b, 0x75, 0x12, 0x13, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x6b, 0x75, - 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x53, 0x6b, 0x75, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x42, 0x0a, 0x5a, 0x08, 0x2e, - 0x2f, 0x3b, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6c, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x72, 0x6f, + 0x64, 0x75, 0x63, 0x74, 0x53, 0x6b, 0x75, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x32, 0x43, 0x0a, + 0x0c, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x33, 0x0a, + 0x0c, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x0f, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x10, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, + 0x22, 0x00, 0x32, 0x45, 0x0a, 0x09, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x6b, 0x75, 0x12, + 0x38, 0x0a, 0x09, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x6b, 0x75, 0x12, 0x13, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x6b, 0x75, 0x52, 0x65, + 0x71, 0x1a, 0x14, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x53, 0x6b, 0x75, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x42, 0x0a, 0x5a, 0x08, 0x2e, 0x2f, 0x3b, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1436,55 +1606,57 @@ func file_trade_proto_rawDescGZIP() []byte { return file_trade_proto_rawDescData } -var file_trade_proto_msgTypes = make([]protoimpl.MessageInfo, 17) +var file_trade_proto_msgTypes = make([]protoimpl.MessageInfo, 18) var file_trade_proto_goTypes = []interface{}{ (*TradeOrder)(nil), // 0: proto.TradeOrder (*AddTradeOrderReq)(nil), // 1: proto.AddTradeOrderReq (*AddTradeOrderResp)(nil), // 2: proto.AddTradeOrderResp - (*Product)(nil), // 3: proto.Product - (*PageReq)(nil), // 4: proto.PageReq - (*PageResp)(nil), // 5: proto.PageResp - (*ProductDetail)(nil), // 6: proto.ProductDetail - (*ProductDetailReq)(nil), // 7: proto.ProductDetailReq - (*ProductDetailResp)(nil), // 8: proto.ProductDetailResp - (*ProductSku)(nil), // 9: proto.ProductSku - (*ProductSkuReq)(nil), // 10: proto.ProductSkuReq - (*ProductSkuResp)(nil), // 11: proto.ProductSkuResp - (*TokenReq)(nil), // 12: proto.TokenReq - (*TokenResp)(nil), // 13: proto.TokenResp - (*UpdateSkuReq)(nil), // 14: proto.UpdateSkuReq - (*UpdateSkuResp)(nil), // 15: proto.UpdateSkuResp - nil, // 16: proto.Product.LabelListEntry + (*ProductOrder)(nil), // 3: proto.ProductOrder + (*Product)(nil), // 4: proto.Product + (*PageReq)(nil), // 5: proto.PageReq + (*PageResp)(nil), // 6: proto.PageResp + (*ProductDetail)(nil), // 7: proto.ProductDetail + (*ProductDetailReq)(nil), // 8: proto.ProductDetailReq + (*ProductDetailResp)(nil), // 9: proto.ProductDetailResp + (*ProductSku)(nil), // 10: proto.ProductSku + (*ProductSkuReq)(nil), // 11: proto.ProductSkuReq + (*ProductSkuResp)(nil), // 12: proto.ProductSkuResp + (*TokenReq)(nil), // 13: proto.TokenReq + (*TokenResp)(nil), // 14: proto.TokenResp + (*UpdateSkuReq)(nil), // 15: proto.UpdateSkuReq + (*UpdateSkuResp)(nil), // 16: proto.UpdateSkuResp + nil, // 17: proto.Product.LabelListEntry } var file_trade_proto_depIdxs = []int32{ - 6, // 0: proto.AddTradeOrderResp.productSimple:type_name -> proto.ProductDetail - 9, // 1: proto.AddTradeOrderResp.productSkuSimple:type_name -> proto.ProductSku - 16, // 2: proto.Product.labelList:type_name -> proto.Product.LabelListEntry - 3, // 3: proto.PageResp.product:type_name -> proto.Product - 6, // 4: proto.ProductDetailResp.productDetail:type_name -> proto.ProductDetail - 9, // 5: proto.ProductSkuResp.productSku:type_name -> proto.ProductSku - 9, // 6: proto.UpdateSkuReq.productSku:type_name -> proto.ProductSku - 1, // 7: proto.AddTradeOrder.AddTradeOrder:input_type -> proto.AddTradeOrderReq - 1, // 8: proto.UpdateTradeOrder.UpdateTradeOrder:input_type -> proto.AddTradeOrderReq - 4, // 9: proto.Page.Page:input_type -> proto.PageReq - 7, // 10: proto.ShowProductDetail.ShowProductDetail:input_type -> proto.ProductDetailReq - 10, // 11: proto.ShowProductSku.ShowProductSku:input_type -> proto.ProductSkuReq - 7, // 12: proto.ShowDetailSku.ShowDetailSku:input_type -> proto.ProductDetailReq - 12, // 13: proto.GetUserToken.GetUserToken:input_type -> proto.TokenReq - 14, // 14: proto.UpdateSku.UpdateSku:input_type -> proto.UpdateSkuReq - 2, // 15: proto.AddTradeOrder.AddTradeOrder:output_type -> proto.AddTradeOrderResp - 2, // 16: proto.UpdateTradeOrder.UpdateTradeOrder:output_type -> proto.AddTradeOrderResp - 5, // 17: proto.Page.Page:output_type -> proto.PageResp - 8, // 18: proto.ShowProductDetail.ShowProductDetail:output_type -> proto.ProductDetailResp - 11, // 19: proto.ShowProductSku.ShowProductSku:output_type -> proto.ProductSkuResp - 11, // 20: proto.ShowDetailSku.ShowDetailSku:output_type -> proto.ProductSkuResp - 13, // 21: proto.GetUserToken.GetUserToken:output_type -> proto.TokenResp - 15, // 22: proto.UpdateSku.UpdateSku:output_type -> proto.UpdateSkuResp - 15, // [15:23] is the sub-list for method output_type - 7, // [7:15] 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 + 0, // 0: proto.AddTradeOrderReq.tradeOrder:type_name -> proto.TradeOrder + 0, // 1: proto.AddTradeOrderResp.tradeOrder:type_name -> proto.TradeOrder + 3, // 2: proto.AddTradeOrderResp.products:type_name -> proto.ProductOrder + 17, // 3: proto.Product.labelList:type_name -> proto.Product.LabelListEntry + 4, // 4: proto.PageResp.product:type_name -> proto.Product + 7, // 5: proto.ProductDetailResp.productDetail:type_name -> proto.ProductDetail + 10, // 6: proto.ProductSkuResp.productSku:type_name -> proto.ProductSku + 10, // 7: proto.UpdateSkuReq.productSku:type_name -> proto.ProductSku + 1, // 8: proto.AddTradeOrder.AddTradeOrder:input_type -> proto.AddTradeOrderReq + 1, // 9: proto.UpdateTradeOrder.UpdateTradeOrder:input_type -> proto.AddTradeOrderReq + 5, // 10: proto.Page.Page:input_type -> proto.PageReq + 8, // 11: proto.ShowProductDetail.ShowProductDetail:input_type -> proto.ProductDetailReq + 11, // 12: proto.ShowProductSku.ShowProductSku:input_type -> proto.ProductSkuReq + 8, // 13: proto.ShowDetailSku.ShowDetailSku:input_type -> proto.ProductDetailReq + 13, // 14: proto.GetUserToken.GetUserToken:input_type -> proto.TokenReq + 15, // 15: proto.UpdateSku.UpdateSku:input_type -> proto.UpdateSkuReq + 2, // 16: proto.AddTradeOrder.AddTradeOrder:output_type -> proto.AddTradeOrderResp + 2, // 17: proto.UpdateTradeOrder.UpdateTradeOrder:output_type -> proto.AddTradeOrderResp + 6, // 18: proto.Page.Page:output_type -> proto.PageResp + 9, // 19: proto.ShowProductDetail.ShowProductDetail:output_type -> proto.ProductDetailResp + 12, // 20: proto.ShowProductSku.ShowProductSku:output_type -> proto.ProductSkuResp + 12, // 21: proto.ShowDetailSku.ShowDetailSku:output_type -> proto.ProductSkuResp + 14, // 22: proto.GetUserToken.GetUserToken:output_type -> proto.TokenResp + 16, // 23: proto.UpdateSku.UpdateSku:output_type -> proto.UpdateSkuResp + 16, // [16:24] is the sub-list for method output_type + 8, // [8:16] is the sub-list for method input_type + 8, // [8:8] is the sub-list for extension type_name + 8, // [8:8] is the sub-list for extension extendee + 0, // [0:8] is the sub-list for field type_name } func init() { file_trade_proto_init() } @@ -1530,7 +1702,7 @@ func file_trade_proto_init() { } } file_trade_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Product); i { + switch v := v.(*ProductOrder); i { case 0: return &v.state case 1: @@ -1542,7 +1714,7 @@ func file_trade_proto_init() { } } file_trade_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PageReq); i { + switch v := v.(*Product); i { case 0: return &v.state case 1: @@ -1554,7 +1726,7 @@ func file_trade_proto_init() { } } file_trade_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PageResp); i { + switch v := v.(*PageReq); i { case 0: return &v.state case 1: @@ -1566,7 +1738,7 @@ func file_trade_proto_init() { } } file_trade_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ProductDetail); i { + switch v := v.(*PageResp); i { case 0: return &v.state case 1: @@ -1578,7 +1750,7 @@ func file_trade_proto_init() { } } file_trade_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ProductDetailReq); i { + switch v := v.(*ProductDetail); i { case 0: return &v.state case 1: @@ -1590,7 +1762,7 @@ func file_trade_proto_init() { } } file_trade_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ProductDetailResp); i { + switch v := v.(*ProductDetailReq); i { case 0: return &v.state case 1: @@ -1602,7 +1774,7 @@ func file_trade_proto_init() { } } file_trade_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ProductSku); i { + switch v := v.(*ProductDetailResp); i { case 0: return &v.state case 1: @@ -1614,7 +1786,7 @@ func file_trade_proto_init() { } } file_trade_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ProductSkuReq); i { + switch v := v.(*ProductSku); i { case 0: return &v.state case 1: @@ -1626,7 +1798,7 @@ func file_trade_proto_init() { } } file_trade_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ProductSkuResp); i { + switch v := v.(*ProductSkuReq); i { case 0: return &v.state case 1: @@ -1638,7 +1810,7 @@ func file_trade_proto_init() { } } file_trade_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TokenReq); i { + switch v := v.(*ProductSkuResp); i { case 0: return &v.state case 1: @@ -1650,7 +1822,7 @@ func file_trade_proto_init() { } } file_trade_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TokenResp); i { + switch v := v.(*TokenReq); i { case 0: return &v.state case 1: @@ -1662,7 +1834,7 @@ func file_trade_proto_init() { } } file_trade_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateSkuReq); i { + switch v := v.(*TokenResp); i { case 0: return &v.state case 1: @@ -1674,6 +1846,18 @@ func file_trade_proto_init() { } } file_trade_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateSkuReq); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_trade_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*UpdateSkuResp); i { case 0: return &v.state @@ -1692,7 +1876,7 @@ func file_trade_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_trade_proto_rawDesc, NumEnums: 0, - NumMessages: 17, + NumMessages: 18, NumExtensions: 0, NumServices: 8, }, @@ -1705,3 +1889,601 @@ func file_trade_proto_init() { file_trade_proto_goTypes = nil file_trade_proto_depIdxs = nil } + +// Reference imports to suppress errors if they are not otherwise used. +var _ context.Context +var _ grpc.ClientConnInterface + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +const _ = grpc.SupportPackageIsVersion6 + +// AddTradeOrderClient is the client API for AddTradeOrder service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. +type AddTradeOrderClient interface { + // rpc 服务 + AddTradeOrder(ctx context.Context, in *AddTradeOrderReq, opts ...grpc.CallOption) (*AddTradeOrderResp, error) +} + +type addTradeOrderClient struct { + cc grpc.ClientConnInterface +} + +func NewAddTradeOrderClient(cc grpc.ClientConnInterface) AddTradeOrderClient { + return &addTradeOrderClient{cc} +} + +func (c *addTradeOrderClient) AddTradeOrder(ctx context.Context, in *AddTradeOrderReq, opts ...grpc.CallOption) (*AddTradeOrderResp, error) { + out := new(AddTradeOrderResp) + err := c.cc.Invoke(ctx, "/proto.AddTradeOrder/AddTradeOrder", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// AddTradeOrderServer is the server API for AddTradeOrder service. +type AddTradeOrderServer interface { + // rpc 服务 + AddTradeOrder(context.Context, *AddTradeOrderReq) (*AddTradeOrderResp, error) +} + +// UnimplementedAddTradeOrderServer can be embedded to have forward compatible implementations. +type UnimplementedAddTradeOrderServer struct { +} + +func (*UnimplementedAddTradeOrderServer) AddTradeOrder(context.Context, *AddTradeOrderReq) (*AddTradeOrderResp, error) { + return nil, status.Errorf(codes.Unimplemented, "method AddTradeOrder not implemented") +} + +func RegisterAddTradeOrderServer(s *grpc.Server, srv AddTradeOrderServer) { + s.RegisterService(&_AddTradeOrder_serviceDesc, srv) +} + +func _AddTradeOrder_AddTradeOrder_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(AddTradeOrderReq) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AddTradeOrderServer).AddTradeOrder(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/proto.AddTradeOrder/AddTradeOrder", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AddTradeOrderServer).AddTradeOrder(ctx, req.(*AddTradeOrderReq)) + } + return interceptor(ctx, in, info, handler) +} + +var _AddTradeOrder_serviceDesc = grpc.ServiceDesc{ + ServiceName: "proto.AddTradeOrder", + HandlerType: (*AddTradeOrderServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "AddTradeOrder", + Handler: _AddTradeOrder_AddTradeOrder_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "trade.proto", +} + +// UpdateTradeOrderClient is the client API for UpdateTradeOrder service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. +type UpdateTradeOrderClient interface { + // rpc 服务 + UpdateTradeOrder(ctx context.Context, in *AddTradeOrderReq, opts ...grpc.CallOption) (*AddTradeOrderResp, error) +} + +type updateTradeOrderClient struct { + cc grpc.ClientConnInterface +} + +func NewUpdateTradeOrderClient(cc grpc.ClientConnInterface) UpdateTradeOrderClient { + return &updateTradeOrderClient{cc} +} + +func (c *updateTradeOrderClient) UpdateTradeOrder(ctx context.Context, in *AddTradeOrderReq, opts ...grpc.CallOption) (*AddTradeOrderResp, error) { + out := new(AddTradeOrderResp) + err := c.cc.Invoke(ctx, "/proto.UpdateTradeOrder/UpdateTradeOrder", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// UpdateTradeOrderServer is the server API for UpdateTradeOrder service. +type UpdateTradeOrderServer interface { + // rpc 服务 + UpdateTradeOrder(context.Context, *AddTradeOrderReq) (*AddTradeOrderResp, error) +} + +// UnimplementedUpdateTradeOrderServer can be embedded to have forward compatible implementations. +type UnimplementedUpdateTradeOrderServer struct { +} + +func (*UnimplementedUpdateTradeOrderServer) UpdateTradeOrder(context.Context, *AddTradeOrderReq) (*AddTradeOrderResp, error) { + return nil, status.Errorf(codes.Unimplemented, "method UpdateTradeOrder not implemented") +} + +func RegisterUpdateTradeOrderServer(s *grpc.Server, srv UpdateTradeOrderServer) { + s.RegisterService(&_UpdateTradeOrder_serviceDesc, srv) +} + +func _UpdateTradeOrder_UpdateTradeOrder_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(AddTradeOrderReq) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(UpdateTradeOrderServer).UpdateTradeOrder(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/proto.UpdateTradeOrder/UpdateTradeOrder", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(UpdateTradeOrderServer).UpdateTradeOrder(ctx, req.(*AddTradeOrderReq)) + } + return interceptor(ctx, in, info, handler) +} + +var _UpdateTradeOrder_serviceDesc = grpc.ServiceDesc{ + ServiceName: "proto.UpdateTradeOrder", + HandlerType: (*UpdateTradeOrderServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "UpdateTradeOrder", + Handler: _UpdateTradeOrder_UpdateTradeOrder_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "trade.proto", +} + +// PageClient is the client API for Page service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. +type PageClient interface { + // rpc 服务 + Page(ctx context.Context, in *PageReq, opts ...grpc.CallOption) (*PageResp, error) +} + +type pageClient struct { + cc grpc.ClientConnInterface +} + +func NewPageClient(cc grpc.ClientConnInterface) PageClient { + return &pageClient{cc} +} + +func (c *pageClient) Page(ctx context.Context, in *PageReq, opts ...grpc.CallOption) (*PageResp, error) { + out := new(PageResp) + err := c.cc.Invoke(ctx, "/proto.Page/Page", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// PageServer is the server API for Page service. +type PageServer interface { + // rpc 服务 + Page(context.Context, *PageReq) (*PageResp, error) +} + +// UnimplementedPageServer can be embedded to have forward compatible implementations. +type UnimplementedPageServer struct { +} + +func (*UnimplementedPageServer) Page(context.Context, *PageReq) (*PageResp, error) { + return nil, status.Errorf(codes.Unimplemented, "method Page not implemented") +} + +func RegisterPageServer(s *grpc.Server, srv PageServer) { + s.RegisterService(&_Page_serviceDesc, srv) +} + +func _Page_Page_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(PageReq) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(PageServer).Page(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/proto.Page/Page", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(PageServer).Page(ctx, req.(*PageReq)) + } + return interceptor(ctx, in, info, handler) +} + +var _Page_serviceDesc = grpc.ServiceDesc{ + ServiceName: "proto.Page", + HandlerType: (*PageServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "Page", + Handler: _Page_Page_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "trade.proto", +} + +// ShowProductDetailClient is the client API for ShowProductDetail service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. +type ShowProductDetailClient interface { + // rpc 服务 + ShowProductDetail(ctx context.Context, in *ProductDetailReq, opts ...grpc.CallOption) (*ProductDetailResp, error) +} + +type showProductDetailClient struct { + cc grpc.ClientConnInterface +} + +func NewShowProductDetailClient(cc grpc.ClientConnInterface) ShowProductDetailClient { + return &showProductDetailClient{cc} +} + +func (c *showProductDetailClient) ShowProductDetail(ctx context.Context, in *ProductDetailReq, opts ...grpc.CallOption) (*ProductDetailResp, error) { + out := new(ProductDetailResp) + err := c.cc.Invoke(ctx, "/proto.ShowProductDetail/ShowProductDetail", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// ShowProductDetailServer is the server API for ShowProductDetail service. +type ShowProductDetailServer interface { + // rpc 服务 + ShowProductDetail(context.Context, *ProductDetailReq) (*ProductDetailResp, error) +} + +// UnimplementedShowProductDetailServer can be embedded to have forward compatible implementations. +type UnimplementedShowProductDetailServer struct { +} + +func (*UnimplementedShowProductDetailServer) ShowProductDetail(context.Context, *ProductDetailReq) (*ProductDetailResp, error) { + return nil, status.Errorf(codes.Unimplemented, "method ShowProductDetail not implemented") +} + +func RegisterShowProductDetailServer(s *grpc.Server, srv ShowProductDetailServer) { + s.RegisterService(&_ShowProductDetail_serviceDesc, srv) +} + +func _ShowProductDetail_ShowProductDetail_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ProductDetailReq) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ShowProductDetailServer).ShowProductDetail(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/proto.ShowProductDetail/ShowProductDetail", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ShowProductDetailServer).ShowProductDetail(ctx, req.(*ProductDetailReq)) + } + return interceptor(ctx, in, info, handler) +} + +var _ShowProductDetail_serviceDesc = grpc.ServiceDesc{ + ServiceName: "proto.ShowProductDetail", + HandlerType: (*ShowProductDetailServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "ShowProductDetail", + Handler: _ShowProductDetail_ShowProductDetail_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "trade.proto", +} + +// ShowProductSkuClient is the client API for ShowProductSku service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. +type ShowProductSkuClient interface { + // rpc 服务 + ShowProductSku(ctx context.Context, in *ProductSkuReq, opts ...grpc.CallOption) (*ProductSkuResp, error) +} + +type showProductSkuClient struct { + cc grpc.ClientConnInterface +} + +func NewShowProductSkuClient(cc grpc.ClientConnInterface) ShowProductSkuClient { + return &showProductSkuClient{cc} +} + +func (c *showProductSkuClient) ShowProductSku(ctx context.Context, in *ProductSkuReq, opts ...grpc.CallOption) (*ProductSkuResp, error) { + out := new(ProductSkuResp) + err := c.cc.Invoke(ctx, "/proto.ShowProductSku/ShowProductSku", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// ShowProductSkuServer is the server API for ShowProductSku service. +type ShowProductSkuServer interface { + // rpc 服务 + ShowProductSku(context.Context, *ProductSkuReq) (*ProductSkuResp, error) +} + +// UnimplementedShowProductSkuServer can be embedded to have forward compatible implementations. +type UnimplementedShowProductSkuServer struct { +} + +func (*UnimplementedShowProductSkuServer) ShowProductSku(context.Context, *ProductSkuReq) (*ProductSkuResp, error) { + return nil, status.Errorf(codes.Unimplemented, "method ShowProductSku not implemented") +} + +func RegisterShowProductSkuServer(s *grpc.Server, srv ShowProductSkuServer) { + s.RegisterService(&_ShowProductSku_serviceDesc, srv) +} + +func _ShowProductSku_ShowProductSku_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ProductSkuReq) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ShowProductSkuServer).ShowProductSku(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/proto.ShowProductSku/ShowProductSku", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ShowProductSkuServer).ShowProductSku(ctx, req.(*ProductSkuReq)) + } + return interceptor(ctx, in, info, handler) +} + +var _ShowProductSku_serviceDesc = grpc.ServiceDesc{ + ServiceName: "proto.ShowProductSku", + HandlerType: (*ShowProductSkuServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "ShowProductSku", + Handler: _ShowProductSku_ShowProductSku_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "trade.proto", +} + +// ShowDetailSkuClient is the client API for ShowDetailSku service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. +type ShowDetailSkuClient interface { + // rpc 服务 + ShowDetailSku(ctx context.Context, in *ProductDetailReq, opts ...grpc.CallOption) (*ProductSkuResp, error) +} + +type showDetailSkuClient struct { + cc grpc.ClientConnInterface +} + +func NewShowDetailSkuClient(cc grpc.ClientConnInterface) ShowDetailSkuClient { + return &showDetailSkuClient{cc} +} + +func (c *showDetailSkuClient) ShowDetailSku(ctx context.Context, in *ProductDetailReq, opts ...grpc.CallOption) (*ProductSkuResp, error) { + out := new(ProductSkuResp) + err := c.cc.Invoke(ctx, "/proto.ShowDetailSku/ShowDetailSku", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// ShowDetailSkuServer is the server API for ShowDetailSku service. +type ShowDetailSkuServer interface { + // rpc 服务 + ShowDetailSku(context.Context, *ProductDetailReq) (*ProductSkuResp, error) +} + +// UnimplementedShowDetailSkuServer can be embedded to have forward compatible implementations. +type UnimplementedShowDetailSkuServer struct { +} + +func (*UnimplementedShowDetailSkuServer) ShowDetailSku(context.Context, *ProductDetailReq) (*ProductSkuResp, error) { + return nil, status.Errorf(codes.Unimplemented, "method ShowDetailSku not implemented") +} + +func RegisterShowDetailSkuServer(s *grpc.Server, srv ShowDetailSkuServer) { + s.RegisterService(&_ShowDetailSku_serviceDesc, srv) +} + +func _ShowDetailSku_ShowDetailSku_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ProductDetailReq) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ShowDetailSkuServer).ShowDetailSku(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/proto.ShowDetailSku/ShowDetailSku", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ShowDetailSkuServer).ShowDetailSku(ctx, req.(*ProductDetailReq)) + } + return interceptor(ctx, in, info, handler) +} + +var _ShowDetailSku_serviceDesc = grpc.ServiceDesc{ + ServiceName: "proto.ShowDetailSku", + HandlerType: (*ShowDetailSkuServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "ShowDetailSku", + Handler: _ShowDetailSku_ShowDetailSku_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "trade.proto", +} + +// GetUserTokenClient is the client API for GetUserToken service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. +type GetUserTokenClient interface { + // rpc 服务 + GetUserToken(ctx context.Context, in *TokenReq, opts ...grpc.CallOption) (*TokenResp, error) +} + +type getUserTokenClient struct { + cc grpc.ClientConnInterface +} + +func NewGetUserTokenClient(cc grpc.ClientConnInterface) GetUserTokenClient { + return &getUserTokenClient{cc} +} + +func (c *getUserTokenClient) GetUserToken(ctx context.Context, in *TokenReq, opts ...grpc.CallOption) (*TokenResp, error) { + out := new(TokenResp) + err := c.cc.Invoke(ctx, "/proto.GetUserToken/GetUserToken", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// GetUserTokenServer is the server API for GetUserToken service. +type GetUserTokenServer interface { + // rpc 服务 + GetUserToken(context.Context, *TokenReq) (*TokenResp, error) +} + +// UnimplementedGetUserTokenServer can be embedded to have forward compatible implementations. +type UnimplementedGetUserTokenServer struct { +} + +func (*UnimplementedGetUserTokenServer) GetUserToken(context.Context, *TokenReq) (*TokenResp, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetUserToken not implemented") +} + +func RegisterGetUserTokenServer(s *grpc.Server, srv GetUserTokenServer) { + s.RegisterService(&_GetUserToken_serviceDesc, srv) +} + +func _GetUserToken_GetUserToken_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(TokenReq) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(GetUserTokenServer).GetUserToken(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/proto.GetUserToken/GetUserToken", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(GetUserTokenServer).GetUserToken(ctx, req.(*TokenReq)) + } + return interceptor(ctx, in, info, handler) +} + +var _GetUserToken_serviceDesc = grpc.ServiceDesc{ + ServiceName: "proto.GetUserToken", + HandlerType: (*GetUserTokenServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "GetUserToken", + Handler: _GetUserToken_GetUserToken_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "trade.proto", +} + +// UpdateSkuClient is the client API for UpdateSku service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. +type UpdateSkuClient interface { + UpdateSku(ctx context.Context, in *UpdateSkuReq, opts ...grpc.CallOption) (*UpdateSkuResp, error) +} + +type updateSkuClient struct { + cc grpc.ClientConnInterface +} + +func NewUpdateSkuClient(cc grpc.ClientConnInterface) UpdateSkuClient { + return &updateSkuClient{cc} +} + +func (c *updateSkuClient) UpdateSku(ctx context.Context, in *UpdateSkuReq, opts ...grpc.CallOption) (*UpdateSkuResp, error) { + out := new(UpdateSkuResp) + err := c.cc.Invoke(ctx, "/proto.UpdateSku/UpdateSku", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// UpdateSkuServer is the server API for UpdateSku service. +type UpdateSkuServer interface { + UpdateSku(context.Context, *UpdateSkuReq) (*UpdateSkuResp, error) +} + +// UnimplementedUpdateSkuServer can be embedded to have forward compatible implementations. +type UnimplementedUpdateSkuServer struct { +} + +func (*UnimplementedUpdateSkuServer) UpdateSku(context.Context, *UpdateSkuReq) (*UpdateSkuResp, error) { + return nil, status.Errorf(codes.Unimplemented, "method UpdateSku not implemented") +} + +func RegisterUpdateSkuServer(s *grpc.Server, srv UpdateSkuServer) { + s.RegisterService(&_UpdateSku_serviceDesc, srv) +} + +func _UpdateSku_UpdateSku_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UpdateSkuReq) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(UpdateSkuServer).UpdateSku(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/proto.UpdateSku/UpdateSku", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(UpdateSkuServer).UpdateSku(ctx, req.(*UpdateSkuReq)) + } + return interceptor(ctx, in, info, handler) +} + +var _UpdateSku_serviceDesc = grpc.ServiceDesc{ + ServiceName: "proto.UpdateSku", + HandlerType: (*UpdateSkuServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "UpdateSku", + Handler: _UpdateSku_UpdateSku_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "trade.proto", +} diff --git a/trade-order/proto/trade.proto b/trade-order/proto/trade.proto index cfdc4fb..629036e 100644 --- a/trade-order/proto/trade.proto +++ b/trade-order/proto/trade.proto @@ -9,27 +9,33 @@ package proto ; //默认在哪个包 //结构体 /* - ID int32 `json:"id"` - UserId int32 `json:"userId"` - ProductId int32 `gorm:"product_id" json:"productId"` - ProductSkuId int32 `gorm:"product_sku_id" json:"productSkuId"` - ProductName string `json:"productName"` - ProductMainPicture string `gorm:"product_main_picture" json:"productMainPicture"` - Number int32 `gorm:"default:1" json:"number"` - CreateUser int32 `gorm:"default:1" json:"createUser"` - CreateTime time.Time `json:"createTime"` - UpdateUser int32 `json:"updateUser"` - UpdateTime time.Time `json:"updateTime"` - IsDeleted bool `json:"isDeleted"` + "serverTime": "2022-11-01 11:08:13", + "expireTime": "2022-11-01 11:38:13", + "totalAmount": 190.00, + "productAmount": 190.00, + "shippingAmount": 0, + "discountAmount": 0.00, + "payAmount": 190.00, */ message TradeOrder { - int32 id = 1; - int32 userId = 2; - int32 productId =3; - int32 productSkuId = 4; - string productName = 5; - string productMainPicture = 6; - int32 number = 7; + string serverTime = 1; + string expireTime = 2; + float totalAmount =3; + float productAmount = 4; + float shippingAmount = 5; + float discountAmount = 6; + float payAmount = 7; //resp返回需要 + //新增和修改需要 + int32 iD = 8; + bool isDeleted = 9; + int32 orderStatus = 10; + string orderNo = 11; + int32 userId =12 ; + int32 createUser =13; + int32 updateUser =14; + string cancelReason =15; + string createTime =16; + string submitTime =17; } /** 前端请求信息 新增购物车 @@ -41,23 +47,42 @@ message TradeOrder { **/ //请求 request struct message AddTradeOrderReq { - int32 number = 1; - int32 productId = 2; - int32 productSkuId =3; - string productName = 4; - string productMainPicture = 5; - int32 userId =6; - int32 id = 7; + repeated int32 cartIds = 1; + bool isVirtual = 2; + int32 recipientAddressId =3; + TradeOrder tradeOrder = 4; } message AddTradeOrderResp{ - ProductDetail productSimple = 1; - ProductSku productSkuSimple =2; - int64 shoppingCartNumber = 3; - int64 canSetShoppingCartNumber = 4; - bool isBeyondMaxLimit = 5; - int32 ID = 6; + TradeOrder tradeOrder = 1; + repeated ProductOrder products =2; +} +//订单商品 +/** +"productId": 74, + "productSkuId": 265, + "productName": "机器学习观止—核心原理与实践| 林学森 机器学习人工智能计算机", + "productImageUrl": "https://msb-edu-dev.oss-cn-beijing.aliyuncs.com/mall-product/productO1CN010A7WjS1CP1BmI67Qg-101450072.jpg_430x430q90.jpg", + "skuDescribe": "", + "quantity": 1, + "productPrice": 118.00, + "realPrice": 118.00, + "realAmount": 118.00 + */ +message ProductOrder { + int32 productId = 1; + int32 productSkuId = 2; + string productName = 3; + string productImageUrl = 4; + string skuDescribe =5 ; + int32 quantity =6; + float productPrice =7; + float realPrice =8; + float realAmount =9; } + + + //RPC 服务 接口 service AddTradeOrder { //rpc 服务