Commit 9b25d121 authored by 任硕's avatar 任硕 Committed by linj

unfreeze

parent bf9a4e38
package executor
import (
"time"
"gitlab.33.cn/chain33/chain33/account"
dbm "gitlab.33.cn/chain33/chain33/common/db"
uf "gitlab.33.cn/chain33/chain33/plugin/dapp/unfreeze/types"
"gitlab.33.cn/chain33/chain33/system/dapp"
"gitlab.33.cn/chain33/chain33/types"
)
type action struct {
coinsAccount *account.DB
db dbm.KV
txhash []byte
fromaddr string
blocktime int64
height int64
index int32
execaddr string
}
func newAction(u *Unfreeze, tx *types.Transaction, index int32) *action {
hash := tx.Hash()
fromaddr := tx.From()
return &action{u.GetCoinsAccount(), u.GetStateDB(), hash, fromaddr,
u.GetBlockTime(), u.GetHeight(), index, dapp.ExecAddress(string(tx.Execer))}
}
//创建解冻交易
func (a *action) UnfreezeCreate(create *uf.UnfreezeCreate) (*types.Receipt, error) {
/*
*参数检测
*时间等
*/
if create.GetStartTime() <= time.Unix()
//构造ID - txHash
var unfreezeID string = a.txhash
receipt, err := a.coinsAccount.TransferToExec(a.fromaddr, a.execaddr, create.TotalCount)
if err != nil {
uflog.Error("unfreeze create ", "addr", a.fromaddr, "execaddr", a.execaddr, "ExecFrozen amount", create.TotalCount)
return nil, err
}
unfreeze := &uf.Unfreeze{
UnfreezeID: unfreezeID,
StartTime: create.StartTime,
TokenName: create.TokenName,
TotalCount: create.TotalCount,
Initiator: a.fromaddr,
Beneficiary: create.Beneficiary,
Period: create.Period,
Means: create.Means,
Amount: create.Amount,
}
a.saveStateDB(unfreeze)
var logs []*types.ReceiptLog
var kv []*types.KeyValue
logs = append(logs, receipt.Logs...)
kv = append(kv, receipt.KV...)
receiptLog := a.getReceiptLog(unfreeze) //TODO 修改receiptLog
logs = append(logs, receiptLog)
return &types.Receipt{types.ExecOk, kv, logs}, nil
}
//提取解冻币
func (a *action) UnfreezeWithdraw(withdraw *uf.UnfreezeWithdraw) (*types.Receipt, error) {
//TODO pseudocode
/*
*参数检测
*检测该地址是否存在对应解冻交易ID
*/
/*
*从合约转币到该地址(收币地址)
*/
value, err := a.db.Get(key(withdraw.GetUnfreezeID()))
if err != nil {
uflog.Error("unfreeze withdraw ", "execaddr", a.execaddr, "err", err)
return nil, err
}
var unfreeze uf.Unfreeze
err = types.Decode(value, &unfreeze)
if err != nil {
uflog.Error("unfreeze withdraw ", "execaddr", a.execaddr, "err", err)
return nil, err
}
/*
*检测可取款状态(时间)
*计算可取款额
*计算取款次数增加量
*/
var amount int64
var withdrawTimes int32
var logs []*types.ReceiptLog
var kv []*types.KeyValue
receipt, err := a.coinsAccount.ExecTransferFrozen(unfreeze.Initiator, unfreeze.Beneficiary, a.execaddr, amount)
if err != nil {
uflog.Error("unfreeze withdraw ", "execaddr", a.execaddr, "err", err)
return nil, err
}
logs = append(logs, receipt.Logs...)
kv = append(kv, receipt.KV...)
unfreeze.WithdrawTimes += withdrawTimes
a.saveStateDB(&unfreeze)
return &types.Receipt{types.ExecOk, kv, logs}, nil
}
//中止定期解冻
func (a *action) UnfreezeTerminate(terminate *uf.UnfreezeTerminate) (*types.Receipt, error) {
//TODO pseudocode
/*
*参数检测
*检测该地址是否存在对应解冻交易ID
*/
/*
*从合约转币到该地址(发币地址)
*/
//计算合约中剩余币数
var remain int64
//获取发币地址
var senderAddr string
receipt, err := a.coinsAccount.ExecActive(senderAddr, a.execaddr, remain)
if err != nil {
uflog.Error("unfreeze terminate ", "addr", senderAddr, "execaddr", a.execaddr, "err", err)
return nil, err
}
var logs []*types.ReceiptLog
var kv []*types.KeyValue
logs = append(logs, receipt.Logs...)
kv = append(kv, receipt.KV...)
/*修改receipt
*修改数据库中状态
*/
return &types.Receipt{types.ExecOk, kv, logs}, nil
}
func (a *action) saveStateDB(unfreeze *uf.Unfreeze) {
a.db.Set(key(unfreeze.GetUnfreezeID()), types.Encode(unfreeze))
}
func key(id string) (keys []byte) {
keys = append(keys, []byte("mavl-"+uf.UnfreezeX+"-")...)
keys = append(keys, []byte(id)...)
return keys
}
func (a *action) getReceiptLog(unfreeze *uf.Unfreeze) *types.ReceiptLog {
//TODO 判断不同类型receipt
log := &types.ReceiptLog{}
r := &uf.ReceiptUnfreeze{}
r.TokenName = unfreeze.TokenName
r.CreateAddr = unfreeze.Initiator
r.ReceiveAddr = unfreeze.Beneficiary
log.Log = types.Encode(r)
return log
}
//查询可提币状态
func QueryWithdraw(stateDB dbm.KV, param *uf.QueryWithdraw) (types.Message, error) {
//查询提币次数
//计算当前可否提币
return &types.Reply{}, nil
}
......@@ -5,17 +5,17 @@ import (
"gitlab.33.cn/chain33/chain33/types"
)
func (u *Unfreeze) Exec_Create(payload *uf.GameCreate, tx *types.Transaction, index int) (*types.Receipt, error) {
action := NewAction(u, tx, index)
func (u *Unfreeze) Exec_Create(payload *uf.UnfreezeCreate, tx *types.Transaction, index int32) (*types.Receipt, error) {
action := newAction(u, tx, index)
return action.UnfreezeCreate(payload)
}
func (u *Unfreeze) Exec_Cancel(payload *uf.GameCancel, tx *types.Transaction, index int) (*types.Receipt, error) {
action := NewAction(u, tx, index)
func (u *Unfreeze) Exec_Withdraw(payload *uf.UnfreezeWithdraw, tx *types.Transaction, index int32) (*types.Receipt, error) {
action := newAction(u, tx, index)
return action.UnfreezeWithdraw(payload)
}
func (u *Unfreeze) Exec_Terminate(payload *uf.GameClose, tx *types.Transaction, index int) (*types.Receipt, error) {
action := NewAction(u, tx, index)
func (u *Unfreeze) Exec_Terminate(payload *uf.UnfreezeTerminate, tx *types.Transaction, index int32) (*types.Receipt, error) {
action := newAction(u, tx, index)
return action.UnfreezeTerminate(payload)
}
......@@ -6,6 +6,8 @@ import (
)
func (u *Unfreeze) execDelLocal(receiptData *types.ReceiptData) (*types.LocalDBSet, error) {
dbSet := &types.LocalDBSet{}
return dbSet, nil
}
......
......@@ -6,6 +6,8 @@ import (
)
func (u *Unfreeze) execLocal(receiptData *types.ReceiptData) (*types.LocalDBSet, error) {
dbSet := &types.LocalDBSet{}
return dbSet, nil
}
......
package executor
import (
uf "gitlab.33.cn/chain33/chain33/plugin/dapp/unfreeze/types"
"gitlab.33.cn/chain33/chain33/types"
)
func (u *Unfreeze) Query_QueryWithdraw(in *uf.QueryWithdraw) (types.Message, error) {
return QueryWithdraw(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"
......@@ -19,7 +17,7 @@ func init() {
}
func Init(name string) {
drivers.Register(GetName(), newGame, 0)
drivers.Register(GetName(), newUnfreeze, 0)
}
type Unfreeze struct {
......
package executor
//database opeartion for executor unfreeze
......@@ -3,24 +3,26 @@ syntax = "proto3";
package types;
message Unfreeze {
//解冻交易ID(唯一识别码)
string unfreezeID = 1;
//开始时间
int64 startTime = 1;
int64 startTime = 2;
//币种
string tokenName = 2;
string tokenName = 3;
//冻结总额
int64 totalCount = 3;
int64 totalCount = 4;
//发币人地址
string senderAddr = 4;
string initiator = 5;
//收币人地址
string receiverAddr = 5;
string beneficiary = 6;
//解冻间隔
int64 unfreezeGap = 6;
int64 period = 7;
//解冻方式(百分比;固额) 1 百分比 -> 2 固额
int32 unfreezeMeans = 7;
int32 means = 8;
//解冻数量:若为百分比解冻方式该字段值为百分比乘以100,若为固额该字段值为币数量
int64 unfreezeAmount = 8;
int64 amount = 9;
//已解冻次数
int32 withdrawTimes = 9;
int32 withdrawTimes = 10;
}
// message for execs.unfreeze
......@@ -34,17 +36,31 @@ message UnfreezeAction {
}
message UnfreezeCreate {
int64 startTime = 1;
string tokenName = 2;
int64 totalCount = 3;
string initiator = 4;
string beneficiary = 5;
int64 period = 6;
int32 means = 7;
int64 amount = 8;
}
message UnfreezeWithdraw {
string unfreezeID = 1;
}
message UnfreezeTerminate {
string unfreezeID = 1;
}
//TODO: 更多receipt类型
message ReceiptUnfreeze {
string tokenName = 1;
string createAddr = 2;
string receiveAddr = 3;
}
message QueryWithdraw {
string unfreezeID = 1;
}
......@@ -16,17 +16,17 @@ const (
//建议用github的组织名称,或者用户名字开头, 再加上自己的插件的名字
//如果发生重名,可以通过配置文件修改这些名字
var (
PackageName = "chain33.unfreeze"
RpcName = "Chain33.Unfreeze"
UnfreezeX = "unfreeze"
ExecerGame = []byte(UnfreezeX)
PackageName = "chain33.unfreeze"
RpcName = "Chain33.Unfreeze"
UnfreezeX = "unfreeze"
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"
......
......@@ -33,7 +33,7 @@ type UnfreezeType struct {
types.ExecTypeBase
}
func (at *UnfreezeType) GetLogMap() map[int64]*types.LogInfo {
func (u *UnfreezeType) GetLogMap() map[int64]*types.LogInfo {
return map[int64]*types.LogInfo{
TyLogCreateUnfreeze: {reflect.TypeOf(ReceiptUnfreeze{}), "LogCreateUnfreeze"},
TyLogWithdrawUnfreeze: {reflect.TypeOf(ReceiptUnfreeze{}), "LogWithdrawUnfreeze"},
......@@ -41,14 +41,47 @@ func (at *UnfreezeType) GetLogMap() map[int64]*types.LogInfo {
}
}
func (g *UnfreezeType) GetPayload() types.Message {
func (u *UnfreezeType) GetPayload() types.Message {
return &UnfreezeAction{}
}
func (g *UnfreezeType) GetTypeMap() map[string]int32 {
func (u *UnfreezeType) GetTypeMap() map[string]int32 {
return map[string]int32{
"Create": UnfreezeActionCreate,
"Withdraw": UnfreezeActionWithdraw,
"Terminate": UnfreezeActionTerminate,
}
}
////创建解冻相关交易
//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
//}
......@@ -14,6 +14,7 @@ It has these top-level messages:
UnfreezeWithdraw
UnfreezeTerminate
ReceiptUnfreeze
QueryWithdraw
*/
package types
......@@ -33,24 +34,26 @@ var _ = math.Inf
const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package
type Unfreeze struct {
// 解冻交易ID(唯一识别码)
UnfreezeID string `protobuf:"bytes,1,opt,name=unfreezeID" json:"unfreezeID,omitempty"`
// 开始时间
StartTime int64 `protobuf:"varint,1,opt,name=startTime" json:"startTime,omitempty"`
StartTime int64 `protobuf:"varint,2,opt,name=startTime" json:"startTime,omitempty"`
// 币种
TokenName string `protobuf:"bytes,2,opt,name=tokenName" json:"tokenName,omitempty"`
TokenName string `protobuf:"bytes,3,opt,name=tokenName" json:"tokenName,omitempty"`
// 冻结总额
TotalCount int64 `protobuf:"varint,3,opt,name=totalCount" json:"totalCount,omitempty"`
TotalCount int64 `protobuf:"varint,4,opt,name=totalCount" json:"totalCount,omitempty"`
// 发币人地址
SenderAddr string `protobuf:"bytes,4,opt,name=senderAddr" json:"senderAddr,omitempty"`
Initiator string `protobuf:"bytes,5,opt,name=initiator" json:"initiator,omitempty"`
// 收币人地址
ReceiverAddr string `protobuf:"bytes,5,opt,name=receiverAddr" json:"receiverAddr,omitempty"`
Beneficiary string `protobuf:"bytes,6,opt,name=beneficiary" json:"beneficiary,omitempty"`
// 解冻间隔
UnfreezeGap int64 `protobuf:"varint,6,opt,name=unfreezeGap" json:"unfreezeGap,omitempty"`
Period int64 `protobuf:"varint,7,opt,name=period" json:"period,omitempty"`
// 解冻方式(百分比;固额) 1 百分比 -> 2 固额
UnfreezeMeans int32 `protobuf:"varint,7,opt,name=unfreezeMeans" json:"unfreezeMeans,omitempty"`
Means int32 `protobuf:"varint,8,opt,name=means" json:"means,omitempty"`
// 解冻数量:若为百分比解冻方式该字段值为百分比乘以100,若为固额该字段值为币数量
UnfreezeAmount int64 `protobuf:"varint,8,opt,name=unfreezeAmount" json:"unfreezeAmount,omitempty"`
Amount int64 `protobuf:"varint,9,opt,name=amount" json:"amount,omitempty"`
// 已解冻次数
WithdrawTimes int32 `protobuf:"varint,9,opt,name=withdrawTimes" json:"withdrawTimes,omitempty"`
WithdrawTimes int32 `protobuf:"varint,10,opt,name=withdrawTimes" json:"withdrawTimes,omitempty"`
}
func (m *Unfreeze) Reset() { *m = Unfreeze{} }
......@@ -58,6 +61,13 @@ func (m *Unfreeze) String() string { return proto.CompactTextString(m
func (*Unfreeze) ProtoMessage() {}
func (*Unfreeze) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} }
func (m *Unfreeze) GetUnfreezeID() string {
if m != nil {
return m.UnfreezeID
}
return ""
}
func (m *Unfreeze) GetStartTime() int64 {
if m != nil {
return m.StartTime
......@@ -79,37 +89,37 @@ func (m *Unfreeze) GetTotalCount() int64 {
return 0
}
func (m *Unfreeze) GetSenderAddr() string {
func (m *Unfreeze) GetInitiator() string {
if m != nil {
return m.SenderAddr
return m.Initiator
}
return ""
}
func (m *Unfreeze) GetReceiverAddr() string {
func (m *Unfreeze) GetBeneficiary() string {
if m != nil {
return m.ReceiverAddr
return m.Beneficiary
}
return ""
}
func (m *Unfreeze) GetUnfreezeGap() int64 {
func (m *Unfreeze) GetPeriod() int64 {
if m != nil {
return m.UnfreezeGap
return m.Period
}
return 0
}
func (m *Unfreeze) GetUnfreezeMeans() int32 {
func (m *Unfreeze) GetMeans() int32 {
if m != nil {
return m.UnfreezeMeans
return m.Means
}
return 0
}
func (m *Unfreeze) GetUnfreezeAmount() int64 {
func (m *Unfreeze) GetAmount() int64 {
if m != nil {
return m.UnfreezeAmount
return m.Amount
}
return 0
}
......@@ -283,6 +293,14 @@ func _UnfreezeAction_OneofSizer(msg proto.Message) (n int) {
}
type UnfreezeCreate struct {
StartTime int64 `protobuf:"varint,1,opt,name=startTime" json:"startTime,omitempty"`
TokenName string `protobuf:"bytes,2,opt,name=tokenName" json:"tokenName,omitempty"`
TotalCount int64 `protobuf:"varint,3,opt,name=totalCount" json:"totalCount,omitempty"`
Initiator string `protobuf:"bytes,4,opt,name=initiator" json:"initiator,omitempty"`
Beneficiary string `protobuf:"bytes,5,opt,name=beneficiary" json:"beneficiary,omitempty"`
Period int64 `protobuf:"varint,6,opt,name=period" json:"period,omitempty"`
Means int32 `protobuf:"varint,7,opt,name=means" json:"means,omitempty"`
Amount int64 `protobuf:"varint,8,opt,name=amount" json:"amount,omitempty"`
}
func (m *UnfreezeCreate) Reset() { *m = UnfreezeCreate{} }
......@@ -290,7 +308,64 @@ func (m *UnfreezeCreate) String() string { return proto.CompactTextSt
func (*UnfreezeCreate) ProtoMessage() {}
func (*UnfreezeCreate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2} }
func (m *UnfreezeCreate) GetStartTime() int64 {
if m != nil {
return m.StartTime
}
return 0
}
func (m *UnfreezeCreate) GetTokenName() string {
if m != nil {
return m.TokenName
}
return ""
}
func (m *UnfreezeCreate) GetTotalCount() int64 {
if m != nil {
return m.TotalCount
}
return 0
}
func (m *UnfreezeCreate) GetInitiator() string {
if m != nil {
return m.Initiator
}
return ""
}
func (m *UnfreezeCreate) GetBeneficiary() string {
if m != nil {
return m.Beneficiary
}
return ""
}
func (m *UnfreezeCreate) GetPeriod() int64 {
if m != nil {
return m.Period
}
return 0
}
func (m *UnfreezeCreate) GetMeans() int32 {
if m != nil {
return m.Means
}
return 0
}
func (m *UnfreezeCreate) GetAmount() int64 {
if m != nil {
return m.Amount
}
return 0
}
type UnfreezeWithdraw struct {
UnfreezeID string `protobuf:"bytes,1,opt,name=unfreezeID" json:"unfreezeID,omitempty"`
}
func (m *UnfreezeWithdraw) Reset() { *m = UnfreezeWithdraw{} }
......@@ -298,7 +373,15 @@ func (m *UnfreezeWithdraw) String() string { return proto.CompactText
func (*UnfreezeWithdraw) ProtoMessage() {}
func (*UnfreezeWithdraw) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{3} }
func (m *UnfreezeWithdraw) GetUnfreezeID() string {
if m != nil {
return m.UnfreezeID
}
return ""
}
type UnfreezeTerminate struct {
UnfreezeID string `protobuf:"bytes,1,opt,name=unfreezeID" json:"unfreezeID,omitempty"`
}
func (m *UnfreezeTerminate) Reset() { *m = UnfreezeTerminate{} }
......@@ -306,7 +389,18 @@ func (m *UnfreezeTerminate) String() string { return proto.CompactTex
func (*UnfreezeTerminate) ProtoMessage() {}
func (*UnfreezeTerminate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{4} }
func (m *UnfreezeTerminate) GetUnfreezeID() string {
if m != nil {
return m.UnfreezeID
}
return ""
}
// TODO: 更多receipt类型
type ReceiptUnfreeze struct {
TokenName string `protobuf:"bytes,1,opt,name=tokenName" json:"tokenName,omitempty"`
CreateAddr string `protobuf:"bytes,2,opt,name=createAddr" json:"createAddr,omitempty"`
ReceiveAddr string `protobuf:"bytes,3,opt,name=receiveAddr" json:"receiveAddr,omitempty"`
}
func (m *ReceiptUnfreeze) Reset() { *m = ReceiptUnfreeze{} }
......@@ -314,6 +408,43 @@ func (m *ReceiptUnfreeze) String() string { return proto.CompactTextS
func (*ReceiptUnfreeze) ProtoMessage() {}
func (*ReceiptUnfreeze) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{5} }
func (m *ReceiptUnfreeze) GetTokenName() string {
if m != nil {
return m.TokenName
}
return ""
}
func (m *ReceiptUnfreeze) GetCreateAddr() string {
if m != nil {
return m.CreateAddr
}
return ""
}
func (m *ReceiptUnfreeze) GetReceiveAddr() string {
if m != nil {
return m.ReceiveAddr
}
return ""
}
type QueryWithdraw struct {
UnfreezeID string `protobuf:"bytes,1,opt,name=unfreezeID" json:"unfreezeID,omitempty"`
}
func (m *QueryWithdraw) Reset() { *m = QueryWithdraw{} }
func (m *QueryWithdraw) String() string { return proto.CompactTextString(m) }
func (*QueryWithdraw) ProtoMessage() {}
func (*QueryWithdraw) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{6} }
func (m *QueryWithdraw) GetUnfreezeID() string {
if m != nil {
return m.UnfreezeID
}
return ""
}
func init() {
proto.RegisterType((*Unfreeze)(nil), "types.Unfreeze")
proto.RegisterType((*UnfreezeAction)(nil), "types.UnfreezeAction")
......@@ -321,32 +452,38 @@ func init() {
proto.RegisterType((*UnfreezeWithdraw)(nil), "types.UnfreezeWithdraw")
proto.RegisterType((*UnfreezeTerminate)(nil), "types.UnfreezeTerminate")
proto.RegisterType((*ReceiptUnfreeze)(nil), "types.ReceiptUnfreeze")
proto.RegisterType((*QueryWithdraw)(nil), "types.QueryWithdraw")
}
func init() { proto.RegisterFile("unfreeze.proto", fileDescriptor0) }
var fileDescriptor0 = []byte{
// 345 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x64, 0x92, 0xcf, 0x4e, 0xf2, 0x40,
0x14, 0xc5, 0x69, 0xf9, 0x0a, 0xf4, 0xf2, 0x89, 0x30, 0xc6, 0x38, 0x0b, 0x63, 0x9a, 0xc6, 0x18,
0x56, 0x98, 0x60, 0x4c, 0xdc, 0x22, 0x0b, 0xd9, 0xe8, 0x62, 0x82, 0x71, 0x3d, 0xd2, 0x6b, 0x6c,
0xa4, 0xd3, 0x66, 0x7a, 0x81, 0xe0, 0xd3, 0xb9, 0xf7, 0xa5, 0x4c, 0x87, 0x8e, 0x85, 0xba, 0xec,
0xef, 0x9c, 0xfb, 0xef, 0x74, 0xa0, 0xb7, 0x52, 0x6f, 0x1a, 0xf1, 0x13, 0x47, 0x99, 0x4e, 0x29,
0x65, 0x1e, 0x6d, 0x33, 0xcc, 0xc3, 0x2f, 0x17, 0x3a, 0xcf, 0xa5, 0xc2, 0xce, 0xc1, 0xcf, 0x49,
0x6a, 0x9a, 0xc7, 0x09, 0x72, 0x27, 0x70, 0x86, 0x4d, 0x51, 0x81, 0x42, 0xa5, 0xf4, 0x03, 0xd5,
0x93, 0x4c, 0x90, 0xbb, 0x81, 0x33, 0xf4, 0x45, 0x05, 0xd8, 0x05, 0x00, 0xa5, 0x24, 0x97, 0xd3,
0x74, 0xa5, 0x88, 0x37, 0x4d, 0xf1, 0x1e, 0x29, 0xf4, 0x1c, 0x55, 0x84, 0x7a, 0x12, 0x45, 0x9a,
0xff, 0x33, 0xe5, 0x7b, 0x84, 0x85, 0xf0, 0x5f, 0xe3, 0x02, 0xe3, 0x75, 0xe9, 0xf0, 0x8c, 0xe3,
0x80, 0xb1, 0x00, 0xba, 0xf6, 0x8a, 0x07, 0x99, 0xf1, 0x96, 0x19, 0xb2, 0x8f, 0xd8, 0x25, 0x1c,
0xd9, 0xcf, 0x47, 0x94, 0x2a, 0xe7, 0xed, 0xc0, 0x19, 0x7a, 0xe2, 0x10, 0xb2, 0xab, 0x2a, 0x8d,
0x49, 0x62, 0xf6, 0xed, 0x98, 0x56, 0x35, 0x5a, 0x74, 0xdb, 0xc4, 0xf4, 0x1e, 0x69, 0xb9, 0x29,
0x12, 0xc8, 0xb9, 0xbf, 0xeb, 0x76, 0x00, 0xc3, 0x6f, 0x07, 0x7a, 0x36, 0xc2, 0xc9, 0x82, 0xe2,
0x54, 0xb1, 0x6b, 0x68, 0x2d, 0x34, 0x4a, 0xda, 0xa5, 0xd8, 0x1d, 0x9f, 0x8e, 0x4c, 0xda, 0x23,
0x6b, 0x9b, 0x1a, 0x71, 0xd6, 0x10, 0xa5, 0x8d, 0xdd, 0x42, 0xc7, 0x36, 0x35, 0xd1, 0x76, 0xc7,
0x67, 0xb5, 0x92, 0x97, 0x52, 0x9e, 0x35, 0xc4, 0xaf, 0x95, 0xdd, 0x81, 0x4f, 0xa8, 0x93, 0x58,
0x15, 0xa3, 0x9a, 0xa6, 0x8e, 0xd7, 0xea, 0xe6, 0x56, 0x9f, 0x35, 0x44, 0x65, 0x66, 0x3d, 0x70,
0x69, 0xcb, 0xc1, 0xdc, 0xe3, 0xd2, 0xf6, 0xbe, 0x0d, 0xde, 0x5a, 0x2e, 0x57, 0x18, 0xf6, 0xab,
0x63, 0x76, 0x5b, 0x86, 0x0c, 0xfa, 0xf5, 0x25, 0xc2, 0x13, 0x18, 0xfc, 0x19, 0x10, 0x0e, 0xe0,
0x58, 0x14, 0xbf, 0x2b, 0x23, 0xab, 0xbd, 0xb6, 0xcc, 0x63, 0xbb, 0xf9, 0x09, 0x00, 0x00, 0xff,
0xff, 0x7d, 0xf5, 0x2a, 0x9a, 0x7e, 0x02, 0x00, 0x00,
// 432 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x54, 0x4d, 0x8f, 0xd3, 0x30,
0x10, 0x6d, 0xd2, 0x4d, 0xda, 0x4e, 0xb5, 0x05, 0x2c, 0x3e, 0x7c, 0x40, 0xa8, 0x8a, 0x38, 0xf4,
0xd4, 0x95, 0xba, 0x42, 0xe2, 0xba, 0x2c, 0x87, 0x72, 0x41, 0x22, 0x5a, 0xc4, 0xd9, 0xdb, 0xce,
0x0a, 0x8b, 0x8d, 0x1d, 0x9c, 0xc9, 0x56, 0xe1, 0x67, 0xf1, 0x37, 0xf8, 0x37, 0xfc, 0x02, 0x64,
0x3b, 0x69, 0xd3, 0x52, 0xa5, 0x7b, 0x9c, 0x37, 0xef, 0x4d, 0x3c, 0xef, 0xd9, 0x81, 0x49, 0xa9,
0xee, 0x0c, 0xe2, 0x2f, 0x9c, 0xe7, 0x46, 0x93, 0x66, 0x11, 0x55, 0x39, 0x16, 0xc9, 0xef, 0x10,
0x86, 0x5f, 0xeb, 0x0e, 0x7b, 0x03, 0xd0, 0xb0, 0x3e, 0x7d, 0xe4, 0xc1, 0x34, 0x98, 0x8d, 0xd2,
0x16, 0xc2, 0x5e, 0xc3, 0xa8, 0x20, 0x61, 0xe8, 0x46, 0x66, 0xc8, 0xc3, 0x69, 0x30, 0xeb, 0xa7,
0x3b, 0xc0, 0x76, 0x49, 0xff, 0x40, 0xf5, 0x59, 0x64, 0xc8, 0xfb, 0x4e, 0xbc, 0x03, 0xec, 0x6c,
0xd2, 0x24, 0xee, 0xaf, 0x75, 0xa9, 0x88, 0x9f, 0x39, 0x71, 0x0b, 0xb1, 0x6a, 0xa9, 0x24, 0x49,
0x41, 0xda, 0xf0, 0xc8, 0xab, 0xb7, 0x00, 0x9b, 0xc2, 0xf8, 0x16, 0x15, 0xde, 0xc9, 0x95, 0x14,
0xa6, 0xe2, 0xb1, 0xeb, 0xb7, 0x21, 0xf6, 0x12, 0xe2, 0x1c, 0x8d, 0xd4, 0x6b, 0x3e, 0x70, 0xb3,
0xeb, 0x8a, 0x3d, 0x87, 0x28, 0x43, 0xa1, 0x0a, 0x3e, 0x9c, 0x06, 0xb3, 0x28, 0xf5, 0x85, 0x65,
0x8b, 0xcc, 0x9d, 0x64, 0xe4, 0xd9, 0xbe, 0x62, 0x6f, 0xe1, 0x7c, 0x23, 0xe9, 0xfb, 0xda, 0x88,
0x8d, 0xdd, 0xa9, 0xe0, 0xe0, 0x54, 0xfb, 0x60, 0xf2, 0x27, 0x80, 0x49, 0x63, 0xda, 0xd5, 0x8a,
0xa4, 0x56, 0xec, 0x02, 0xe2, 0x95, 0x41, 0x41, 0xe8, 0x6c, 0x1b, 0x2f, 0x5e, 0xcc, 0x9d, 0xbf,
0xf3, 0x86, 0x76, 0xed, 0x9a, 0xcb, 0x5e, 0x5a, 0xd3, 0xd8, 0x3b, 0x18, 0x36, 0x43, 0x9d, 0x95,
0xe3, 0xc5, 0xab, 0x03, 0xc9, 0xb7, 0xba, 0xbd, 0xec, 0xa5, 0x5b, 0x2a, 0x7b, 0x0f, 0x23, 0x42,
0x93, 0x49, 0x65, 0x3f, 0xd5, 0x77, 0x3a, 0x7e, 0xa0, 0xbb, 0x69, 0xfa, 0xcb, 0x5e, 0xba, 0x23,
0xb3, 0x09, 0x84, 0x54, 0xd5, 0xfb, 0x84, 0x54, 0x7d, 0x18, 0x40, 0xf4, 0x20, 0xee, 0x4b, 0x4c,
0xfe, 0xb6, 0xb6, 0xf1, 0xc7, 0xdc, 0x0f, 0x3a, 0xe8, 0x0c, 0x3a, 0xec, 0x0e, 0xba, 0xdf, 0x1d,
0xf4, 0xd9, 0x89, 0xa0, 0xa3, 0xae, 0xa0, 0xe3, 0xe3, 0x41, 0x0f, 0x8e, 0x07, 0x3d, 0x6c, 0x07,
0x9d, 0x2c, 0xe0, 0xe9, 0xa1, 0xcf, 0xa7, 0xae, 0x7f, 0x72, 0x09, 0xcf, 0xfe, 0xf3, 0xf8, 0xa4,
0xe8, 0x27, 0x3c, 0x49, 0x71, 0x85, 0x32, 0xa7, 0xed, 0x33, 0xdb, 0xf3, 0x2f, 0x38, 0xe2, 0x9f,
0xbf, 0x22, 0x57, 0xeb, 0xb5, 0xa9, 0xed, 0x6d, 0x21, 0xd6, 0x21, 0x63, 0x07, 0x3e, 0x78, 0x82,
0x7f, 0x68, 0x6d, 0x28, 0xb9, 0x80, 0xf3, 0x2f, 0x25, 0x9a, 0xea, 0xb1, 0x8b, 0xdd, 0xc6, 0xee,
0x97, 0x70, 0xf9, 0x2f, 0x00, 0x00, 0xff, 0xff, 0x73, 0x88, 0x4e, 0x63, 0x24, 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