Commit 59b1cbdc authored by 任硕's avatar 任硕 Committed by linj

unfreeze exec/del local

parent 8de1b924
......@@ -61,7 +61,7 @@ func (a *action) UnfreezeCreate(create *uf.UnfreezeCreate) (*types.Receipt, erro
k := []byte(unfreezeID)
v := types.Encode(unfreeze)
kv = append(kv, &types.KeyValue{k, v})
receiptLog := a.getCreateLog(unfreeze)
receiptLog := a.getUnfreezeLog(unfreeze)
logs = append(logs, receiptLog)
return &types.Receipt{types.ExecOk, kv, logs}, nil
}
......@@ -103,7 +103,7 @@ func (a *action) UnfreezeWithdraw(withdraw *uf.UnfreezeWithdraw) (*types.Receipt
unfreeze.WithdrawTimes += int32(reaTimes)
unfreeze.Remaining -= available
a.saveStateDB(&unfreeze)
receiptLog := a.getWithdrawLog(&unfreeze)
receiptLog := a.getUnfreezeLog(&unfreeze)
logs = append(logs, receiptLog)
k := []byte(withdraw.UnfreezeID)
v := types.Encode(&unfreeze)
......@@ -147,7 +147,7 @@ func (a *action) UnfreezeTerminate(terminate *uf.UnfreezeTerminate) (*types.Rece
kv = append(kv, receipt.KV...)
unfreeze.Remaining = 0
a.saveStateDB(&unfreeze)
receiptLog := a.getTerminateLog(&unfreeze)
receiptLog := a.getUnfreezeLog(&unfreeze)
logs = append(logs, receiptLog)
k := []byte(terminate.UnfreezeID)
v := types.Encode(&unfreeze)
......@@ -165,37 +165,20 @@ func key(id string) (keys []byte) {
return keys
}
func (a *action) getCreateLog(unfreeze *uf.Unfreeze) *types.ReceiptLog {
func (a *action) getUnfreezeLog(unfreeze *uf.Unfreeze) *types.ReceiptLog {
log := &types.ReceiptLog{}
log.Ty = uf.TyLogCreateUnfreeze
r := &uf.ReceiptCreate{}
r := &uf.ReceiptUnfreeze{}
r.UnfreezeID = unfreeze.UnfreezeID
r.Initiator = unfreeze.Initiator
log.Log = types.Encode(r)
return log
}
func (a *action) getWithdrawLog(unfreeze *uf.Unfreeze) *types.ReceiptLog {
log := &types.ReceiptLog{}
log.Ty = uf.TyLogCreateUnfreeze
r := &uf.ReceiptWithdraw{}
r.WithdrawTimes = unfreeze.WithdrawTimes
r.Beneficiary = unfreeze.Beneficiary
log.Log = types.Encode(r)
return log
}
func (a *action) getTerminateLog(unfreeze *uf.Unfreeze) *types.ReceiptLog {
log := &types.ReceiptLog{}
log.Ty = uf.TyLogCreateUnfreeze
r := &uf.ReceiptTerminate{}
r.UnfreezeID = unfreeze.UnfreezeID
r.TokenName = unfreeze.TokenName
log.Log = types.Encode(r)
return log
}
//查询可提币状态
func QueryWithdraw(stateDB dbm.KV, param *uf.QueryUnfreezeWithdraw) (types.Message, error) {
func QueryUnfreezeWithdraw(stateDB dbm.KV, param *uf.QueryUnfreezeWithdraw) (types.Message, error) {
//查询提币次数
//计算当前可否提币
unfreezeID := param.UnfreezeID
......
......@@ -6,9 +6,24 @@ import (
)
func (u *Unfreeze) execDelLocal(receiptData *types.ReceiptData) (*types.LocalDBSet, error) {
dbSet := &types.LocalDBSet{}
if receiptData.GetTy() != types.ExecOk {
return dbSet, nil
}
for _, log := range receiptData.Logs {
switch log.Ty {
case uf.TyLogCreateUnfreeze, uf.TyLogWithdrawUnfreeze, uf.TyLogTerminateUnfreeze:
var receipt uf.ReceiptUnfreeze
err := types.Decode(log.Log, &receipt)
if err != nil {
return nil, err
}
kv := u.rollbackUnfreezeCreate(&receipt)
dbSet.KV = append(dbSet.KV, kv...)
default:
return nil, types.ErrNotSupport
}
}
return dbSet, nil
}
......
......@@ -6,9 +6,24 @@ import (
)
func (u *Unfreeze) execLocal(receiptData *types.ReceiptData) (*types.LocalDBSet, error) {
dbSet := &types.LocalDBSet{}
if receiptData.GetTy() != types.ExecOk {
return dbSet, nil
}
for _, log := range receiptData.Logs {
switch log.Ty {
case uf.TyLogCreateUnfreeze, uf.TyLogWithdrawUnfreeze, uf.TyLogTerminateUnfreeze:
var receipt uf.ReceiptUnfreeze
err := types.Decode(log.Log, &receipt)
if err != nil {
return nil, err
}
kv := u.saveUnfreezeCreate(&receipt)
dbSet.KV = append(dbSet.KV, kv...)
default:
return nil, types.ErrNotSupport
}
}
return dbSet, nil
}
......
......@@ -5,6 +5,6 @@ import (
"gitlab.33.cn/chain33/chain33/types"
)
func (u *Unfreeze) Query_QueryWithdraw(in *uf.QueryUnfreezeWithdraw) (types.Message, error) {
return QueryWithdraw(u.GetStateDB(), in)
func (u *Unfreeze) Query_QueryUnfreezeWithdraw(in *uf.QueryUnfreezeWithdraw) (types.Message, error) {
return QueryUnfreezeWithdraw(u.GetStateDB(), in)
}
package executor
import (
"fmt"
log "github.com/inconshreveable/log15"
uf "gitlab.33.cn/chain33/chain33/plugin/dapp/unfreeze/types"
drivers "gitlab.33.cn/chain33/chain33/system/dapp"
......@@ -38,3 +40,19 @@ func GetName() string {
func (u *Unfreeze) GetDriverName() string {
return driverName
}
func (u *Unfreeze) saveUnfreezeCreate(res *uf.ReceiptUnfreeze) (kvs []*types.KeyValue) {
kv := &types.KeyValue{}
kv.Key = []byte(fmt.Sprintf("mavl-unfreeze-"+"%s-"+"%s-"+"%s", res.Initiator, res.Beneficiary, res.TokenName))
kv.Value = []byte(res.UnfreezeID)
kvs = append(kvs, kv)
return kvs
}
func (u *Unfreeze) rollbackUnfreezeCreate(res *uf.ReceiptUnfreeze) (kvs []*types.KeyValue) {
kv := &types.KeyValue{}
kv.Key = []byte(fmt.Sprintf("mavl-unfreeze-"+"%s-"+"%s-"+"%s", res.Initiator, res.Beneficiary, res.TokenName))
kv.Value = []byte(res.UnfreezeID)
kvs = append(kvs, kv)
return kvs
}
......@@ -57,18 +57,11 @@ message UnfreezeTerminate {
}
// receipt
message ReceiptCreate {
message ReceiptUnfreeze {
string unfreezeID = 1;
string initiator = 2;
}
message ReceiptWithdraw {
int32 withdrawTimes = 1;
string beneficiary = 3;
}
message ReceiptTerminate {
string unfreezeID = 1;
string beneficiary = 3;
string tokenName = 4;
}
// query
......
......@@ -22,12 +22,12 @@ var (
ExecerUnfreeze = []byte(UnfreezeX)
)
//const (
// Action_CreateUnfreeze = "createUnfreeze"
// Action_WithdrawUnfreeze = "withdrawUnfreeze"
// Action_TerminateUnfreeze = "terminateUnfreeze"
//)
const (
Action_CreateUnfreeze = "createUnfreeze"
Action_WithdrawUnfreeze = "withdrawUnfreeze"
Action_TerminateUnfreeze = "terminateUnfreeze"
)
//const (
// FuncName_QueryXXX = "QueryXXX"
//)
const (
FuncName_QueryUnfreezeWithdraw = "QueryUnfreezeWithdraw"
)
package types
import (
"encoding/json"
"math/rand"
"reflect"
"time"
log "github.com/inconshreveable/log15"
"gitlab.33.cn/chain33/chain33/common/address"
"gitlab.33.cn/chain33/chain33/types"
)
......@@ -35,9 +39,9 @@ type UnfreezeType struct {
func (u *UnfreezeType) GetLogMap() map[int64]*types.LogInfo {
return map[int64]*types.LogInfo{
TyLogCreateUnfreeze: {reflect.TypeOf(ReceiptCreate{}), "LogCreateUnfreeze"},
TyLogWithdrawUnfreeze: {reflect.TypeOf(ReceiptWithdraw{}), "LogWithdrawUnfreeze"},
TyLogTerminateUnfreeze: {reflect.TypeOf(ReceiptTerminate{}), "LogTerminateUnfreeze"},
TyLogCreateUnfreeze: {reflect.TypeOf(ReceiptUnfreeze{}), "LogCreateUnfreeze"},
TyLogWithdrawUnfreeze: {reflect.TypeOf(ReceiptUnfreeze{}), "LogWithdrawUnfreeze"},
TyLogTerminateUnfreeze: {reflect.TypeOf(ReceiptUnfreeze{}), "LogTerminateUnfreeze"},
}
}
......@@ -53,35 +57,107 @@ func (u *UnfreezeType) GetTypeMap() map[string]int32 {
}
}
////创建解冻相关交易
//func (u UnfreezeType) CreateTx(action string, message json.RawMessage) (*types.Transaction, error) {
// tlog.Debug("UnfreezeType.CreateTx", "action", action)
// if action == Action_CreateUnfreeze {
// var param UnfreezeCreate
// err := json.Unmarshal(message, &param)
// if err != nil {
// tlog.Error("CreateTx", "Error", err)
// return nil, types.ErrInputPara
// }
// return CreateRawGamePreCreateTx(&param)
// } else if action == Action_WithdrawUnfreeze {
// var param UnfreezeWithdraw
// err := json.Unmarshal(message, &param)
// if err != nil {
// tlog.Error("CreateTx", "Error", err)
// return nil, types.ErrInputPara
// }
// return CreateRawGamePreMatchTx(&param)
// } else if action == Action_TerminateUnfreeze {
// var param UnfreezeTerminate
// err := json.Unmarshal(message, &param)
// if err != nil {
// tlog.Error("CreateTx", "Error", err)
// return nil, types.ErrInputPara
// }
// return CreateRawGamePreCancelTx(&param)
// } else {
// return nil, types.ErrNotSupport
// }
// return nil, nil
//}
// TODO createTx接口暂时没法用,作为一个预留接口
func (u UnfreezeType) CreateTx(action string, message json.RawMessage) (*types.Transaction, error) {
tlog.Debug("UnfreezeType.CreateTx", "action", action)
if action == Action_CreateUnfreeze {
var param UnfreezeCreate
err := json.Unmarshal(message, &param)
if err != nil {
tlog.Error("CreateTx", "Error", err)
return nil, types.ErrInputPara
}
return CreateUnfreezeCreateTx(&param)
} else if action == Action_WithdrawUnfreeze {
var param UnfreezeWithdraw
err := json.Unmarshal(message, &param)
if err != nil {
tlog.Error("CreateTx", "Error", err)
return nil, types.ErrInputPara
}
return CreateUnfreezeWithdrawTx(&param)
} else if action == Action_TerminateUnfreeze {
var param UnfreezeTerminate
err := json.Unmarshal(message, &param)
if err != nil {
tlog.Error("CreateTx", "Error", err)
return nil, types.ErrInputPara
}
return CreateUnfreezeTerminateTx(&param)
} else {
return nil, types.ErrNotSupport
}
return nil, nil
}
func CreateUnfreezeCreateTx(parm *UnfreezeCreate) (*types.Transaction, error) {
if parm == nil {
tlog.Error("CreateUnfreezeCreateTx", "parm", parm)
return nil, types.ErrInvalidParam
}
v := &UnfreezeCreate{
StartTime: parm.StartTime,
TokenName: parm.TokenName,
TotalCount: parm.TotalCount,
Beneficiary: parm.Beneficiary,
Period: parm.Period,
Means: parm.Means,
Amount: parm.Amount,
}
create := &UnfreezeAction{
Ty: UnfreezeActionCreate,
Value: &UnfreezeAction_Create{v},
}
tx := &types.Transaction{
Execer: []byte(getRealExecName(types.GetParaName())),
Payload: types.Encode(create),
Nonce: rand.New(rand.NewSource(time.Now().UnixNano())).Int63(),
To: address.ExecAddress(getRealExecName(types.GetParaName())),
}
tx.SetRealFee(types.MinFee)
return tx, nil
}
func CreateUnfreezeWithdrawTx(parm *UnfreezeWithdraw) (*types.Transaction, error) {
if parm == nil {
tlog.Error("CreateUnfreezeWithdrawTx", "parm", parm)
return nil, types.ErrInvalidParam
}
v := &UnfreezeWithdraw{
UnfreezeID: parm.UnfreezeID,
}
withdraw := &UnfreezeAction{
Ty: UnfreezeActionWithdraw,
Value: &UnfreezeAction_Withdraw{v},
}
tx := &types.Transaction{
Execer: []byte(getRealExecName(types.GetParaName())),
Payload: types.Encode(withdraw),
Nonce: rand.New(rand.NewSource(time.Now().UnixNano())).Int63(),
To: address.ExecAddress(getRealExecName(types.GetParaName())),
}
tx.SetRealFee(types.MinFee)
return tx, nil
}
func CreateUnfreezeTerminateTx(parm *UnfreezeTerminate) (*types.Transaction, error) {
if parm == nil {
tlog.Error("CreateUnfreezeTerminateTx", "parm", parm)
return nil, types.ErrInvalidParam
}
v := &UnfreezeTerminate{
UnfreezeID: parm.UnfreezeID,
}
terminate := &UnfreezeAction{
Ty: UnfreezeActionTerminate,
Value: &UnfreezeAction_Terminate{v},
}
tx := &types.Transaction{
Execer: []byte(getRealExecName(types.GetParaName())),
Payload: types.Encode(terminate),
Nonce: rand.New(rand.NewSource(time.Now().UnixNano())).Int63(),
To: address.ExecAddress(getRealExecName(types.GetParaName())),
}
tx.SetRealFee(types.MinFee)
return tx, nil
}
......@@ -13,9 +13,7 @@ It has these top-level messages:
UnfreezeCreate
UnfreezeWithdraw
UnfreezeTerminate
ReceiptCreate
ReceiptWithdraw
ReceiptTerminate
ReceiptUnfreeze
QueryUnfreezeWithdraw
ReplyQueryUnfreezeWithdraw
*/
......@@ -402,66 +400,42 @@ func (m *UnfreezeTerminate) GetUnfreezeID() string {
}
// receipt
type ReceiptCreate struct {
UnfreezeID string `protobuf:"bytes,1,opt,name=unfreezeID" json:"unfreezeID,omitempty"`
Initiator string `protobuf:"bytes,2,opt,name=initiator" json:"initiator,omitempty"`
type ReceiptUnfreeze struct {
UnfreezeID string `protobuf:"bytes,1,opt,name=unfreezeID" json:"unfreezeID,omitempty"`
Initiator string `protobuf:"bytes,2,opt,name=initiator" json:"initiator,omitempty"`
Beneficiary string `protobuf:"bytes,3,opt,name=beneficiary" json:"beneficiary,omitempty"`
TokenName string `protobuf:"bytes,4,opt,name=tokenName" json:"tokenName,omitempty"`
}
func (m *ReceiptCreate) Reset() { *m = ReceiptCreate{} }
func (m *ReceiptCreate) String() string { return proto.CompactTextString(m) }
func (*ReceiptCreate) ProtoMessage() {}
func (*ReceiptCreate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{5} }
func (m *ReceiptUnfreeze) Reset() { *m = ReceiptUnfreeze{} }
func (m *ReceiptUnfreeze) String() string { return proto.CompactTextString(m) }
func (*ReceiptUnfreeze) ProtoMessage() {}
func (*ReceiptUnfreeze) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{5} }
func (m *ReceiptCreate) GetUnfreezeID() string {
func (m *ReceiptUnfreeze) GetUnfreezeID() string {
if m != nil {
return m.UnfreezeID
}
return ""
}
func (m *ReceiptCreate) GetInitiator() string {
func (m *ReceiptUnfreeze) GetInitiator() string {
if m != nil {
return m.Initiator
}
return ""
}
type ReceiptWithdraw struct {
WithdrawTimes int32 `protobuf:"varint,1,opt,name=withdrawTimes" json:"withdrawTimes,omitempty"`
Beneficiary string `protobuf:"bytes,3,opt,name=beneficiary" json:"beneficiary,omitempty"`
}
func (m *ReceiptWithdraw) Reset() { *m = ReceiptWithdraw{} }
func (m *ReceiptWithdraw) String() string { return proto.CompactTextString(m) }
func (*ReceiptWithdraw) ProtoMessage() {}
func (*ReceiptWithdraw) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{6} }
func (m *ReceiptWithdraw) GetWithdrawTimes() int32 {
if m != nil {
return m.WithdrawTimes
}
return 0
}
func (m *ReceiptWithdraw) GetBeneficiary() string {
func (m *ReceiptUnfreeze) GetBeneficiary() string {
if m != nil {
return m.Beneficiary
}
return ""
}
type ReceiptTerminate struct {
UnfreezeID string `protobuf:"bytes,1,opt,name=unfreezeID" json:"unfreezeID,omitempty"`
}
func (m *ReceiptTerminate) Reset() { *m = ReceiptTerminate{} }
func (m *ReceiptTerminate) String() string { return proto.CompactTextString(m) }
func (*ReceiptTerminate) ProtoMessage() {}
func (*ReceiptTerminate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{7} }
func (m *ReceiptTerminate) GetUnfreezeID() string {
func (m *ReceiptUnfreeze) GetTokenName() string {
if m != nil {
return m.UnfreezeID
return m.TokenName
}
return ""
}
......@@ -474,7 +448,7 @@ type QueryUnfreezeWithdraw struct {
func (m *QueryUnfreezeWithdraw) Reset() { *m = QueryUnfreezeWithdraw{} }
func (m *QueryUnfreezeWithdraw) String() string { return proto.CompactTextString(m) }
func (*QueryUnfreezeWithdraw) ProtoMessage() {}
func (*QueryUnfreezeWithdraw) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{8} }
func (*QueryUnfreezeWithdraw) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{6} }
func (m *QueryUnfreezeWithdraw) GetUnfreezeID() string {
if m != nil {
......@@ -491,7 +465,7 @@ type ReplyQueryUnfreezeWithdraw struct {
func (m *ReplyQueryUnfreezeWithdraw) Reset() { *m = ReplyQueryUnfreezeWithdraw{} }
func (m *ReplyQueryUnfreezeWithdraw) String() string { return proto.CompactTextString(m) }
func (*ReplyQueryUnfreezeWithdraw) ProtoMessage() {}
func (*ReplyQueryUnfreezeWithdraw) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{9} }
func (*ReplyQueryUnfreezeWithdraw) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{7} }
func (m *ReplyQueryUnfreezeWithdraw) GetUnfreezeID() string {
if m != nil {
......@@ -513,9 +487,7 @@ func init() {
proto.RegisterType((*UnfreezeCreate)(nil), "types.UnfreezeCreate")
proto.RegisterType((*UnfreezeWithdraw)(nil), "types.UnfreezeWithdraw")
proto.RegisterType((*UnfreezeTerminate)(nil), "types.UnfreezeTerminate")
proto.RegisterType((*ReceiptCreate)(nil), "types.ReceiptCreate")
proto.RegisterType((*ReceiptWithdraw)(nil), "types.ReceiptWithdraw")
proto.RegisterType((*ReceiptTerminate)(nil), "types.ReceiptTerminate")
proto.RegisterType((*ReceiptUnfreeze)(nil), "types.ReceiptUnfreeze")
proto.RegisterType((*QueryUnfreezeWithdraw)(nil), "types.QueryUnfreezeWithdraw")
proto.RegisterType((*ReplyQueryUnfreezeWithdraw)(nil), "types.ReplyQueryUnfreezeWithdraw")
}
......@@ -523,35 +495,34 @@ func init() {
func init() { proto.RegisterFile("unfreeze.proto", fileDescriptor0) }
var fileDescriptor0 = []byte{
// 480 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x54, 0xc1, 0x6e, 0xd3, 0x40,
0x10, 0x8d, 0xed, 0xda, 0x49, 0x26, 0x6a, 0x0a, 0x2b, 0x0a, 0x2b, 0x84, 0x50, 0x64, 0x71, 0xc8,
0x29, 0x48, 0xa9, 0x10, 0x5c, 0x4b, 0x39, 0x84, 0x03, 0x48, 0xac, 0x8a, 0x10, 0xc7, 0x4d, 0x3a,
0x81, 0x15, 0xf6, 0xda, 0xda, 0x4c, 0x5a, 0x99, 0x5f, 0xe4, 0xc2, 0x81, 0x0f, 0x42, 0xde, 0xb5,
0x13, 0xd7, 0x89, 0xd2, 0xc2, 0x71, 0xdf, 0xcc, 0x1b, 0xcf, 0xbe, 0xf7, 0xd6, 0x30, 0x5c, 0xeb,
0xa5, 0x41, 0xfc, 0x89, 0x93, 0xdc, 0x64, 0x94, 0xb1, 0x90, 0x8a, 0x1c, 0x57, 0xf1, 0x6f, 0x1f,
0x7a, 0x9f, 0xab, 0x0a, 0x7b, 0x0e, 0x50, 0x77, 0xbd, 0x7f, 0xc7, 0xbd, 0x91, 0x37, 0xee, 0x8b,
0x06, 0xc2, 0x9e, 0x41, 0x7f, 0x45, 0xd2, 0xd0, 0xa5, 0x4a, 0x91, 0xfb, 0x23, 0x6f, 0x1c, 0x88,
0x2d, 0x50, 0x56, 0x29, 0xfb, 0x81, 0xfa, 0xa3, 0x4c, 0x91, 0x07, 0x96, 0xbc, 0x05, 0xca, 0xd9,
0x94, 0x91, 0x4c, 0x2e, 0xb2, 0xb5, 0x26, 0x7e, 0x64, 0xc9, 0x0d, 0xa4, 0x64, 0x2b, 0xad, 0x48,
0x49, 0xca, 0x0c, 0x0f, 0x1d, 0x7b, 0x03, 0xb0, 0x11, 0x0c, 0xe6, 0xa8, 0x71, 0xa9, 0x16, 0x4a,
0x9a, 0x82, 0x47, 0xb6, 0xde, 0x84, 0xd8, 0x63, 0x88, 0x72, 0x34, 0x2a, 0xbb, 0xe2, 0x5d, 0x3b,
0xbb, 0x3a, 0xb1, 0x47, 0x10, 0xa6, 0x28, 0xf5, 0x8a, 0xf7, 0x46, 0xde, 0x38, 0x14, 0xee, 0x50,
0x76, 0xcb, 0xd4, 0x6e, 0xd2, 0x77, 0xdd, 0xee, 0xc4, 0x5e, 0xc0, 0xf1, 0x8d, 0xa2, 0xef, 0x57,
0x46, 0xde, 0x94, 0x77, 0x5a, 0x71, 0xb0, 0xac, 0xdb, 0x60, 0xb9, 0xab, 0xc1, 0x54, 0x2a, 0xad,
0xf4, 0x37, 0x3e, 0x70, 0x3a, 0x6c, 0x80, 0xf8, 0x97, 0x07, 0xc3, 0x5a, 0xd2, 0xf3, 0x05, 0xa9,
0x4c, 0xb3, 0x97, 0x10, 0x2d, 0x0c, 0x4a, 0x42, 0x2b, 0xea, 0x60, 0x7a, 0x3a, 0xb1, 0xea, 0x4f,
0xea, 0xb6, 0x0b, 0x5b, 0x9c, 0x75, 0x44, 0xd5, 0xc6, 0x5e, 0x41, 0xaf, 0xfe, 0xa4, 0x15, 0x7a,
0x30, 0x7d, 0xd2, 0xa2, 0x7c, 0xa9, 0xca, 0xb3, 0x8e, 0xd8, 0xb4, 0xb2, 0x37, 0xd0, 0x27, 0x34,
0xa9, 0xd2, 0xe5, 0xa7, 0x02, 0xcb, 0xe3, 0x2d, 0xde, 0x65, 0x5d, 0x9f, 0x75, 0xc4, 0xb6, 0x99,
0x0d, 0xc1, 0xa7, 0xc2, 0xda, 0x12, 0x0a, 0x9f, 0x8a, 0xb7, 0x5d, 0x08, 0xaf, 0x65, 0xb2, 0xc6,
0xf8, 0x4f, 0xe3, 0x36, 0x6e, 0xcd, 0xdb, 0x31, 0xf0, 0x0e, 0xc6, 0xc0, 0x3f, 0x1c, 0x83, 0x60,
0x27, 0x06, 0x2d, 0xa3, 0x8f, 0x0e, 0x19, 0x1d, 0xee, 0x37, 0x3a, 0xda, 0x6f, 0x74, 0xb7, 0x69,
0x74, 0x3c, 0x85, 0x07, 0x6d, 0x25, 0xef, 0x8a, 0x7f, 0x7c, 0x06, 0x0f, 0x77, 0x54, 0xbc, 0x93,
0xf4, 0x01, 0x8e, 0x05, 0x2e, 0x50, 0xe5, 0x54, 0xa9, 0x77, 0x8f, 0x47, 0xb6, 0x7d, 0x08, 0x7e,
0xeb, 0x21, 0xc4, 0x5f, 0xe1, 0xa4, 0x1a, 0xb7, 0x59, 0x7b, 0x27, 0xb3, 0xde, 0xbe, 0xcc, 0xb6,
0x84, 0x0d, 0x76, 0x84, 0x2d, 0x25, 0xa9, 0x46, 0xdf, 0xff, 0x76, 0xaf, 0xe1, 0xf4, 0xd3, 0x1a,
0x4d, 0xf1, 0xcf, 0x5a, 0x2e, 0xe1, 0xa9, 0xc0, 0x3c, 0x29, 0xfe, 0x8b, 0xcd, 0xc6, 0x70, 0x22,
0xaf, 0xa5, 0x4a, 0xe4, 0x3c, 0xc1, 0x73, 0x67, 0xaf, 0xfb, 0x1d, 0xb5, 0xe1, 0x79, 0x64, 0xff,
0x76, 0x67, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, 0xf9, 0x3c, 0xaa, 0xaf, 0xff, 0x04, 0x00, 0x00,
// 463 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x54, 0x4d, 0x8f, 0xd3, 0x30,
0x10, 0x6d, 0x92, 0x26, 0x6d, 0xa7, 0xa2, 0x0b, 0x16, 0x0b, 0x16, 0x42, 0xa8, 0x8a, 0x38, 0xf4,
0x54, 0xa4, 0xae, 0x10, 0x5c, 0x97, 0xe5, 0x50, 0x2e, 0x48, 0x58, 0x8b, 0x38, 0xbb, 0xdd, 0x29,
0x58, 0x24, 0x4e, 0xe4, 0x4e, 0x77, 0x15, 0xfe, 0x04, 0x3f, 0x8c, 0x0b, 0x07, 0x7e, 0x10, 0x8a,
0xdd, 0xb4, 0x69, 0xba, 0x6a, 0xd5, 0x3d, 0xfa, 0xcd, 0x7b, 0xfe, 0x78, 0x6f, 0xc6, 0x30, 0x58,
0xe9, 0x85, 0x41, 0xfc, 0x85, 0xe3, 0xdc, 0x64, 0x94, 0xb1, 0x90, 0x8a, 0x1c, 0x97, 0xf1, 0x5f,
0x1f, 0xba, 0x5f, 0xd7, 0x15, 0xf6, 0x0a, 0xa0, 0x62, 0x7d, 0xfa, 0xc8, 0xbd, 0xa1, 0x37, 0xea,
0x89, 0x1a, 0xc2, 0x5e, 0x42, 0x6f, 0x49, 0xd2, 0xd0, 0xb5, 0x4a, 0x91, 0xfb, 0x43, 0x6f, 0x14,
0x88, 0x2d, 0x50, 0x56, 0x29, 0xfb, 0x89, 0xfa, 0xb3, 0x4c, 0x91, 0x07, 0x56, 0xbc, 0x05, 0xca,
0xbd, 0x29, 0x23, 0x99, 0x5c, 0x65, 0x2b, 0x4d, 0xbc, 0x6d, 0xc5, 0x35, 0xa4, 0x54, 0x2b, 0xad,
0x48, 0x49, 0xca, 0x0c, 0x0f, 0x9d, 0x7a, 0x03, 0xb0, 0x21, 0xf4, 0x67, 0xa8, 0x71, 0xa1, 0xe6,
0x4a, 0x9a, 0x82, 0x47, 0xb6, 0x5e, 0x87, 0xd8, 0x33, 0x88, 0x72, 0x34, 0x2a, 0xbb, 0xe1, 0x1d,
0xbb, 0xf7, 0x7a, 0xc5, 0x9e, 0x42, 0x98, 0xa2, 0xd4, 0x4b, 0xde, 0x1d, 0x7a, 0xa3, 0x50, 0xb8,
0x45, 0xc9, 0x96, 0xa9, 0xbd, 0x49, 0xcf, 0xb1, 0xdd, 0x8a, 0xbd, 0x86, 0x47, 0x77, 0x8a, 0x7e,
0xdc, 0x18, 0x79, 0x57, 0xbe, 0x69, 0xc9, 0xc1, 0xaa, 0x76, 0xc1, 0xf2, 0xae, 0x06, 0x53, 0xa9,
0xb4, 0xd2, 0xdf, 0x79, 0xdf, 0xf9, 0xb0, 0x01, 0xe2, 0x3f, 0x1e, 0x0c, 0x2a, 0x4b, 0x2f, 0xe7,
0xa4, 0x32, 0xcd, 0xde, 0x40, 0x34, 0x37, 0x28, 0x09, 0xad, 0xa9, 0xfd, 0xc9, 0xf9, 0xd8, 0xba,
0x3f, 0xae, 0x68, 0x57, 0xb6, 0x38, 0x6d, 0x89, 0x35, 0x8d, 0xbd, 0x85, 0x6e, 0x75, 0xa4, 0x35,
0xba, 0x3f, 0x79, 0xde, 0x90, 0x7c, 0x5b, 0x97, 0xa7, 0x2d, 0xb1, 0xa1, 0xb2, 0xf7, 0xd0, 0x23,
0x34, 0xa9, 0xd2, 0xe5, 0x51, 0x81, 0xd5, 0xf1, 0x86, 0xee, 0xba, 0xaa, 0x4f, 0x5b, 0x62, 0x4b,
0x66, 0x03, 0xf0, 0xa9, 0xb0, 0xb1, 0x84, 0xc2, 0xa7, 0xe2, 0x43, 0x07, 0xc2, 0x5b, 0x99, 0xac,
0x30, 0xfe, 0x57, 0x7b, 0x8d, 0xbb, 0xe6, 0x6e, 0x1b, 0x78, 0x07, 0xdb, 0xc0, 0x3f, 0xdc, 0x06,
0xc1, 0x5e, 0x1b, 0x34, 0x82, 0x6e, 0x1f, 0x0a, 0x3a, 0xbc, 0x3f, 0xe8, 0xe8, 0xfe, 0xa0, 0x3b,
0xf5, 0xa0, 0xe3, 0x09, 0x3c, 0x6e, 0x3a, 0x79, 0xac, 0xfd, 0xe3, 0x0b, 0x78, 0xb2, 0xe7, 0xe2,
0x51, 0xd1, 0x6f, 0x0f, 0xce, 0x04, 0xce, 0x51, 0xe5, 0x74, 0xca, 0x9c, 0x6d, 0x67, 0xc1, 0x3f,
0x32, 0x0b, 0xc1, 0xbe, 0x45, 0x3b, 0x11, 0xb4, 0x1b, 0x11, 0xc4, 0xef, 0xe0, 0xfc, 0xcb, 0x0a,
0x4d, 0x71, 0xf2, 0xfb, 0x17, 0xf0, 0x42, 0x60, 0x9e, 0x14, 0x0f, 0x52, 0xb3, 0x11, 0x9c, 0xc9,
0x5b, 0xa9, 0x12, 0x39, 0x4b, 0xf0, 0xd2, 0x45, 0xe2, 0xbe, 0x90, 0x26, 0x3c, 0x8b, 0xec, 0x0f,
0x75, 0xf1, 0x3f, 0x00, 0x00, 0xff, 0xff, 0xb1, 0x2c, 0x93, 0xab, 0xb3, 0x04, 0x00, 0x00,
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment