Commit 15c55973 authored by hezhengjun's avatar hezhengjun Committed by 33cn

simply evm gas estimate procedure

parent 9a2b1688
...@@ -23,25 +23,13 @@ gas=0 ...@@ -23,25 +23,13 @@ gas=0
evm_SignTxAndEstimate() { evm_SignTxAndEstimate() {
gas=0 gas=0
local txHex="$1" local txHex="$1"
local priKey="$2" local from=$2
local MAIN_HTTP=$3 local MAIN_HTTP=$3
local expire="120s"
if [ -n "$4" ]; then
expire=$4
fi
local req='"method":"Chain33.SignRawTx","params":[{"privkey":"'"$priKey"'","txHex":"'"$txHex"'","expire":"'"$expire"'"}]'
signedTx=$(curl -ksd "{$req}" "${MAIN_HTTP}" | jq -r ".result")
if [ "$signedTx" != null ]; then req='{"method":"Chain33.Query","params":[{"execer":"evm","funcName":"EstimateGas","payload":{"tx":"'${txHex}'", "from":"'${from}'"}}]}'
req='{"method":"Chain33.Query","params":[{"execer":"evm","funcName":"EstimateGas","payload":{"data":"'${signedTx}'"}}]}' chain33_Http "$req" "${MAIN_HTTP}" '(.result != null)' "EstimateGas" ".result.gas"
chain33_Http "$req" "${MAIN_HTTP}" '(.result != null)' "EstimateGas" ".result.gas" gas=$((RETURN_RESP + 10000))
gas=$((RETURN_RESP + 10000)) echo "the estimate gas is = ${gas}"
echo "the estimate gas is = ${gas}"
else
echo "signedTx null error"
fi
} }
#上述未签名交易使用以下指令进行创建 #上述未签名交易使用以下指令进行创建
...@@ -49,7 +37,7 @@ evm_SignTxAndEstimate() { ...@@ -49,7 +37,7 @@ evm_SignTxAndEstimate() {
function evm_createContract() { function evm_createContract() {
expire="120s" expire="120s"
tx=$(curl -ksd '{"method":"evm.CreateDeployTx","params":[{"code":"'${erc20_code}'", "abi":"'"${erc20_abi}"'", "note": "deploy erc20", "alias": "zbc", "parameter": "constructor(zbc, zbc, 3300, '${evm_creatorAddr}')", "expire":"'${expire}'", "paraName":"'"${paraName}"'", "amount":0}]}' "${MAIN_HTTP}" | jq -r ".result") tx=$(curl -ksd '{"method":"evm.CreateDeployTx","params":[{"code":"'${erc20_code}'", "abi":"'"${erc20_abi}"'", "note": "deploy erc20", "alias": "zbc", "parameter": "constructor(zbc, zbc, 3300, '${evm_creatorAddr}')", "expire":"'${expire}'", "paraName":"'"${paraName}"'", "amount":0}]}' "${MAIN_HTTP}" | jq -r ".result")
evm_SignTxAndEstimate "${tx}" "${evm_creatorAddr_key}" "$MAIN_HTTP" "${expire}" evm_SignTxAndEstimate "${tx}" "${evm_creatorAddr}" "$MAIN_HTTP"
echo "evm_createContract :: the estimate gas is = ${gas}" echo "evm_createContract :: the estimate gas is = ${gas}"
tx=$(curl -ksd '{"method":"evm.CreateDeployTx","params":[{"code":"'${erc20_code}'", "abi":"'"${erc20_abi}"'", "fee":'${gas}', "note": "deploy erc20", "alias": "zbc", "parameter": "constructor(zbc, zbc, 3300, '${evm_creatorAddr}')", "expire":"'${expire}'", "paraName":"'"${paraName}"'", "amount":0}]}' "${MAIN_HTTP}" | jq -r ".result") tx=$(curl -ksd '{"method":"evm.CreateDeployTx","params":[{"code":"'${erc20_code}'", "abi":"'"${erc20_abi}"'", "fee":'${gas}', "note": "deploy erc20", "alias": "zbc", "parameter": "constructor(zbc, zbc, 3300, '${evm_creatorAddr}')", "expire":"'${expire}'", "paraName":"'"${paraName}"'", "amount":0}]}' "${MAIN_HTTP}" | jq -r ".result")
...@@ -96,7 +84,7 @@ function evm_transfer() { ...@@ -96,7 +84,7 @@ function evm_transfer() {
expire="120s" expire="120s"
tx=$(curl -ksd '{"method":"evm.CreateCallTx","params":[{"abi":"'"${erc20_abi}"'", "note": "evm transfer rpc test", "parameter": "transfer('${evm_transferAddr}', 20)", "expire":"'${expire}'", "contractAddr":"'"${evm_contractAddr}"'", "paraName":"'"${paraName}"'"}]}' "${MAIN_HTTP}" | jq -r ".result") tx=$(curl -ksd '{"method":"evm.CreateCallTx","params":[{"abi":"'"${erc20_abi}"'", "note": "evm transfer rpc test", "parameter": "transfer('${evm_transferAddr}', 20)", "expire":"'${expire}'", "contractAddr":"'"${evm_contractAddr}"'", "paraName":"'"${paraName}"'"}]}' "${MAIN_HTTP}" | jq -r ".result")
evm_SignTxAndEstimate "${tx}" "${evm_creatorAddr_key}" "$MAIN_HTTP" "${expire}" evm_SignTxAndEstimate "${tx}" "${evm_creatorAddr}" "$MAIN_HTTP"
# shellcheck disable=SC2090 # shellcheck disable=SC2090
tx=$(curl -ksd '{"method":"evm.CreateCallTx","params":[{"abi":"'"${erc20_abi}"'", "fee":'${gas}', "note": "evm transfer rpc test", "parameter": "transfer('${evm_transferAddr}', 20)", "expire":"'${expire}'", "contractAddr":"'"${evm_contractAddr}"'", "paraName":"'"${paraName}"'"}]}' "${MAIN_HTTP}" | jq -r ".result") tx=$(curl -ksd '{"method":"evm.CreateCallTx","params":[{"abi":"'"${erc20_abi}"'", "fee":'${gas}', "note": "evm transfer rpc test", "parameter": "transfer('${evm_transferAddr}', 20)", "expire":"'${expire}'", "contractAddr":"'"${evm_contractAddr}"'", "paraName":"'"${paraName}"'"}]}' "${MAIN_HTTP}" | jq -r ".result")
......
...@@ -25,7 +25,7 @@ import ( ...@@ -25,7 +25,7 @@ import (
func (evm *EVMExecutor) Exec(tx *types.Transaction, index int) (*types.Receipt, error) { func (evm *EVMExecutor) Exec(tx *types.Transaction, index int) (*types.Receipt, error) {
evm.CheckInit() evm.CheckInit()
// 先转换消息 // 先转换消息
msg, err := evm.GetMessage(tx, index) msg, err := evm.GetMessage(tx, index, nil)
if err != nil { if err != nil {
return nil, err return nil, err
} }
...@@ -190,14 +190,20 @@ func (evm *EVMExecutor) CheckInit() { ...@@ -190,14 +190,20 @@ func (evm *EVMExecutor) CheckInit() {
} }
// GetMessage 目前的交易中,如果是coins交易,金额是放在payload的,但是合约不行,需要修改Transaction结构 // GetMessage 目前的交易中,如果是coins交易,金额是放在payload的,但是合约不行,需要修改Transaction结构
func (evm *EVMExecutor) GetMessage(tx *types.Transaction, index int) (msg *common.Message, err error) { func (evm *EVMExecutor) GetMessage(tx *types.Transaction, index int, fromPtr *common.Address) (msg *common.Message, err error) {
var action evmtypes.EVMContractAction var action evmtypes.EVMContractAction
err = types.Decode(tx.Payload, &action) err = types.Decode(tx.Payload, &action)
if err != nil { if err != nil {
return msg, err return msg, err
} }
// 此处暂时不考虑消息发送签名的处理,chain33在mempool中对签名做了检查 // 此处暂时不考虑消息发送签名的处理,chain33在mempool中对签名做了检查
from := getCaller(tx) var from common.Address
if fromPtr == nil {
from = getCaller(tx)
} else {
from = *fromPtr
}
to := getReceiver(&action) to := getReceiver(&action)
if to == nil { if to == nil {
return msg, types.ErrInvalidAddress return msg, types.ErrInvalidAddress
......
...@@ -55,10 +55,10 @@ func (evm *EVMExecutor) Query_CheckAddrExists(in *evmtypes.CheckEVMAddrReq) (typ ...@@ -55,10 +55,10 @@ func (evm *EVMExecutor) Query_CheckAddrExists(in *evmtypes.CheckEVMAddrReq) (typ
} }
// Query_EstimateGas 此方法用来估算合约消耗的Gas,不能修改原有执行器的状态数据 // Query_EstimateGas 此方法用来估算合约消耗的Gas,不能修改原有执行器的状态数据
func (evm *EVMExecutor) Query_EstimateGas(txInfo *types.ReqString) (types.Message, error) { func (evm *EVMExecutor) Query_EstimateGas(req *evmtypes.EstimateEVMGasReq) (types.Message, error) {
evm.CheckInit() evm.CheckInit()
txBytes, err := hex.DecodeString(txInfo.Data) txBytes, err := hex.DecodeString(req.Tx)
if nil != err { if nil != err {
return nil, err return nil, err
} }
...@@ -68,12 +68,9 @@ func (evm *EVMExecutor) Query_EstimateGas(txInfo *types.ReqString) (types.Messag ...@@ -68,12 +68,9 @@ func (evm *EVMExecutor) Query_EstimateGas(txInfo *types.ReqString) (types.Messag
return nil, err return nil, err
} }
if nil == tx.Signature {
return nil, errors.New("Tx should be signatured")
}
index := 0 index := 0
msg, err := evm.GetMessage(&tx, index) from := evmCommon.StringToAddress(req.From)
msg, err := evm.GetMessage(&tx, index, from)
if err != nil { if err != nil {
return nil, err return nil, err
} }
......
...@@ -108,10 +108,8 @@ message CheckEVMAddrResp { ...@@ -108,10 +108,8 @@ message CheckEVMAddrResp {
} }
message EstimateEVMGasReq { message EstimateEVMGasReq {
string to = 1; string tx = 1;
bytes para = 2; string from = 2;
string caller = 3;
uint64 amount = 4;
} }
message EstimateEVMGasResp { message EstimateEVMGasResp {
uint64 gas = 1; uint64 gas = 1;
......
...@@ -5,9 +5,8 @@ package types ...@@ -5,9 +5,8 @@ package types
import ( import (
fmt "fmt" fmt "fmt"
math "math"
proto "github.com/golang/protobuf/proto" proto "github.com/golang/protobuf/proto"
math "math"
) )
// Reference imports to suppress errors if they are not otherwise used. // Reference imports to suppress errors if they are not otherwise used.
...@@ -793,10 +792,8 @@ func (m *CheckEVMAddrResp) GetAliasName() string { ...@@ -793,10 +792,8 @@ func (m *CheckEVMAddrResp) GetAliasName() string {
} }
type EstimateEVMGasReq struct { type EstimateEVMGasReq struct {
To string `protobuf:"bytes,1,opt,name=to,proto3" json:"to,omitempty"` Tx string `protobuf:"bytes,1,opt,name=tx,proto3" json:"tx,omitempty"`
Para []byte `protobuf:"bytes,2,opt,name=para,proto3" json:"para,omitempty"` From string `protobuf:"bytes,2,opt,name=from,proto3" json:"from,omitempty"`
Caller string `protobuf:"bytes,3,opt,name=caller,proto3" json:"caller,omitempty"`
Amount uint64 `protobuf:"varint,4,opt,name=amount,proto3" json:"amount,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"` XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"` XXX_sizecache int32 `json:"-"`
...@@ -827,34 +824,20 @@ func (m *EstimateEVMGasReq) XXX_DiscardUnknown() { ...@@ -827,34 +824,20 @@ func (m *EstimateEVMGasReq) XXX_DiscardUnknown() {
var xxx_messageInfo_EstimateEVMGasReq proto.InternalMessageInfo var xxx_messageInfo_EstimateEVMGasReq proto.InternalMessageInfo
func (m *EstimateEVMGasReq) GetTo() string { func (m *EstimateEVMGasReq) GetTx() string {
if m != nil { if m != nil {
return m.To return m.Tx
} }
return "" return ""
} }
func (m *EstimateEVMGasReq) GetPara() []byte { func (m *EstimateEVMGasReq) GetFrom() string {
if m != nil { if m != nil {
return m.Para return m.From
}
return nil
}
func (m *EstimateEVMGasReq) GetCaller() string {
if m != nil {
return m.Caller
} }
return "" return ""
} }
func (m *EstimateEVMGasReq) GetAmount() uint64 {
if m != nil {
return m.Amount
}
return 0
}
type EstimateEVMGasResp struct { type EstimateEVMGasResp struct {
Gas uint64 `protobuf:"varint,1,opt,name=gas,proto3" json:"gas,omitempty"` Gas uint64 `protobuf:"varint,1,opt,name=gas,proto3" json:"gas,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
...@@ -1790,76 +1773,76 @@ func init() { ...@@ -1790,76 +1773,76 @@ func init() {
} }
var fileDescriptor_74353de561acd7c6 = []byte{ var fileDescriptor_74353de561acd7c6 = []byte{
// 1129 bytes of a gzipped FileDescriptorProto // 1127 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x57, 0x4f, 0x6f, 0x1b, 0x45, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x57, 0xcd, 0x6e, 0x1c, 0x45,
0x14, 0xd7, 0x7a, 0xd7, 0x8e, 0xf7, 0x25, 0x34, 0xc9, 0xb6, 0x4d, 0x4d, 0x54, 0xa1, 0x68, 0x44, 0x10, 0xd6, 0xec, 0xcc, 0xae, 0x77, 0xca, 0x26, 0xb1, 0x27, 0x89, 0xb3, 0x58, 0x11, 0xb2, 0x5a,
0x21, 0x8a, 0x44, 0x84, 0xda, 0x0b, 0x54, 0x02, 0x29, 0x72, 0xad, 0x80, 0x20, 0x69, 0xd9, 0xd2, 0x04, 0x2c, 0x4b, 0x58, 0x28, 0x39, 0x00, 0x91, 0x40, 0xb2, 0x36, 0x2b, 0x83, 0xc0, 0x4e, 0x98,
0x48, 0x1c, 0x27, 0xeb, 0x89, 0xb3, 0x8d, 0xf7, 0x4f, 0x77, 0xc6, 0x69, 0x7d, 0xe5, 0xcc, 0x91, 0x10, 0x4b, 0x1c, 0xdb, 0xb3, 0x6d, 0x7b, 0xe2, 0x9d, 0x9f, 0x74, 0xf7, 0x3a, 0xf6, 0x95, 0x33,
0x23, 0x37, 0x8e, 0x7c, 0x03, 0xbe, 0x09, 0x1c, 0x39, 0xf1, 0x31, 0xd0, 0x7b, 0x33, 0xbb, 0x3b, 0x47, 0x8e, 0xdc, 0x38, 0xf2, 0x06, 0xbc, 0x09, 0x1c, 0x39, 0xf1, 0x18, 0xa8, 0xaa, 0x7b, 0x66,
0xbb, 0xb6, 0x23, 0x81, 0x2a, 0xd4, 0x93, 0xe7, 0x37, 0xf3, 0x66, 0xde, 0xfb, 0xcd, 0xfb, 0xbd, 0x7a, 0x67, 0x77, 0x2d, 0x81, 0x22, 0xc4, 0xc9, 0xfd, 0xf5, 0x54, 0x57, 0xd5, 0xd7, 0xf5, 0x55,
0x79, 0x6b, 0xd8, 0x16, 0xd7, 0x49, 0x94, 0xa5, 0xaa, 0xe0, 0x91, 0x3a, 0xcc, 0x8b, 0x4c, 0x65, 0x97, 0x17, 0x36, 0xc4, 0x65, 0x96, 0x14, 0xb9, 0x96, 0x3c, 0xd1, 0x7b, 0xa5, 0x2c, 0x74, 0x11,
0x41, 0x57, 0xcd, 0x73, 0x21, 0xd9, 0x8f, 0x0e, 0x6c, 0x8f, 0xce, 0x4e, 0x86, 0x66, 0xf1, 0xe9, 0x75, 0xf5, 0x75, 0x29, 0x14, 0xfb, 0xc1, 0x83, 0x8d, 0xd1, 0xf1, 0xe1, 0xd0, 0x7e, 0x7c, 0x76,
0xf9, 0x4b, 0x11, 0xa9, 0x20, 0x00, 0x8f, 0x8f, 0xc7, 0xc5, 0xc0, 0xd9, 0x73, 0xf6, 0xfd, 0x90, 0xf2, 0x4a, 0x24, 0x3a, 0x8a, 0x20, 0xe0, 0xe3, 0xb1, 0x1c, 0x78, 0xdb, 0xde, 0x4e, 0x18, 0xd3,
0xc6, 0xc1, 0x01, 0x78, 0x63, 0xae, 0xf8, 0xa0, 0xb3, 0xe7, 0xec, 0xaf, 0x3f, 0xdc, 0x39, 0xa4, 0x3a, 0xda, 0x85, 0x60, 0xcc, 0x35, 0x1f, 0x74, 0xb6, 0xbd, 0x9d, 0xd5, 0x47, 0x9b, 0x7b, 0x74,
0xfd, 0x87, 0xd6, 0xde, 0x27, 0x5c, 0xf1, 0x90, 0x6c, 0x82, 0x4f, 0xa0, 0x2b, 0x15, 0x57, 0x62, 0x7e, 0xcf, 0x39, 0xfb, 0x94, 0x6b, 0x1e, 0x93, 0x4d, 0xf4, 0x11, 0x74, 0x95, 0xe6, 0x5a, 0x0c,
0xe0, 0x92, 0xf1, 0xbd, 0x45, 0xe3, 0xe7, 0xb8, 0x1c, 0x6a, 0x2b, 0xf6, 0x9b, 0x03, 0x9b, 0xad, 0x7c, 0x32, 0xbe, 0x3f, 0x6f, 0xfc, 0x02, 0x3f, 0xc7, 0xc6, 0x8a, 0xfd, 0xea, 0xc1, 0xed, 0x96,
0x83, 0x82, 0x01, 0xac, 0x45, 0x85, 0xe0, 0x2a, 0x2b, 0xa3, 0x28, 0x21, 0x06, 0x97, 0xf2, 0x44, 0xa3, 0x68, 0x00, 0x2b, 0x89, 0x14, 0x5c, 0x17, 0x55, 0x16, 0x15, 0xc4, 0xe4, 0x72, 0x9e, 0x09,
0x50, 0x20, 0x7e, 0x48, 0xe3, 0xe0, 0x0e, 0x74, 0xf9, 0x34, 0xe6, 0x92, 0x1c, 0xfa, 0xa1, 0x06, 0x4a, 0x24, 0x8c, 0x69, 0x1d, 0xdd, 0x85, 0x2e, 0x9f, 0xa4, 0x5c, 0x51, 0xc0, 0x30, 0x36, 0xa0,
0x15, 0x0d, 0xcf, 0xa2, 0x11, 0x80, 0x17, 0x65, 0x63, 0x31, 0xe8, 0xee, 0x39, 0xfb, 0x1b, 0x21, 0xa6, 0x11, 0x38, 0x34, 0x22, 0x08, 0x92, 0x62, 0x2c, 0x06, 0xdd, 0x6d, 0x6f, 0x67, 0x2d, 0xa6,
0x8d, 0x83, 0x5d, 0xe8, 0xe3, 0xef, 0x57, 0x5c, 0x5e, 0x0e, 0x7a, 0x34, 0x5f, 0xe1, 0x60, 0x0b, 0x75, 0xb4, 0x05, 0x7d, 0xfc, 0xfb, 0x25, 0x57, 0xe7, 0x83, 0x1e, 0xed, 0xd7, 0x38, 0x5a, 0x07,
0x5c, 0x7e, 0x1e, 0x0f, 0xd6, 0xe8, 0x08, 0x1c, 0xb2, 0xbf, 0x1c, 0xd8, 0x6a, 0x33, 0xc1, 0x00, 0x9f, 0x9f, 0xa4, 0x83, 0x15, 0x72, 0x81, 0x4b, 0xf6, 0xa7, 0x07, 0xeb, 0x6d, 0x26, 0x98, 0x40,
0xd2, 0x2c, 0x8d, 0x04, 0x05, 0xeb, 0x85, 0x1a, 0xe0, 0xc1, 0x72, 0x16, 0x47, 0xf1, 0x58, 0x8c, 0x5e, 0xe4, 0x89, 0xa0, 0x64, 0x83, 0xd8, 0x00, 0x74, 0xac, 0xa6, 0x69, 0x92, 0x8e, 0xc5, 0x98,
0x29, 0xdc, 0x7e, 0x58, 0xe1, 0x60, 0x0f, 0xd6, 0xa5, 0xca, 0x0a, 0x3e, 0xd1, 0x7e, 0x5d, 0xf2, 0xd2, 0xed, 0xc7, 0x35, 0x8e, 0xb6, 0x61, 0x55, 0xe9, 0x42, 0xf2, 0x33, 0x13, 0xd7, 0xa7, 0xb8,
0x6b, 0x4f, 0x05, 0x5f, 0xc2, 0x9a, 0x81, 0x03, 0x6f, 0xcf, 0xdd, 0x5f, 0x7f, 0xf8, 0xe1, 0x8a, 0xee, 0x56, 0xf4, 0x05, 0xac, 0x58, 0x38, 0x08, 0xb6, 0xfd, 0x9d, 0xd5, 0x47, 0xef, 0x2f, 0xb9,
0x7b, 0x3c, 0x7c, 0xae, 0xcd, 0x46, 0xa9, 0x2a, 0xe6, 0x61, 0xb9, 0x69, 0xf7, 0x31, 0x6c, 0xd8, 0xc7, 0xbd, 0x17, 0xc6, 0x6c, 0x94, 0x6b, 0x79, 0x1d, 0x57, 0x87, 0xb6, 0x9e, 0xc0, 0x9a, 0xfb,
0x0b, 0x48, 0xe5, 0x4a, 0xcc, 0xcd, 0x75, 0xe2, 0x10, 0xa3, 0xbe, 0xe6, 0xd3, 0x99, 0xbe, 0xcb, 0x01, 0xa9, 0x5c, 0x88, 0x6b, 0x7b, 0x9d, 0xb8, 0xc4, 0xac, 0x2f, 0xf9, 0x64, 0x6a, 0xee, 0x72,
0x8d, 0x50, 0x83, 0xc7, 0x9d, 0xcf, 0x1c, 0xf6, 0x47, 0x53, 0x17, 0x47, 0x91, 0x8a, 0xb3, 0x34, 0x2d, 0x36, 0xe0, 0x49, 0xe7, 0x53, 0x8f, 0xfd, 0x3e, 0xab, 0x8b, 0xfd, 0x44, 0xa7, 0x45, 0x1e,
0xd8, 0x81, 0x1e, 0x4f, 0xb2, 0x59, 0xaa, 0x0c, 0x4d, 0x83, 0x90, 0xe7, 0x84, 0xcb, 0x6f, 0xe3, 0x6d, 0x42, 0x8f, 0x67, 0xc5, 0x34, 0xd7, 0x96, 0xa6, 0x45, 0xc8, 0xf3, 0x8c, 0xab, 0x6f, 0xd2,
0x24, 0x56, 0x74, 0x94, 0x17, 0x56, 0xd8, 0xac, 0x3d, 0x2b, 0xe2, 0x48, 0xcb, 0xe1, 0xbd, 0xb0, 0x2c, 0xd5, 0xe4, 0x2a, 0x88, 0x6b, 0x6c, 0xbf, 0x3d, 0x97, 0x69, 0x62, 0xe4, 0xf0, 0x4e, 0x5c,
0xc2, 0x55, 0x32, 0x3c, 0x2b, 0x19, 0x01, 0x78, 0x39, 0x2f, 0x78, 0x99, 0x20, 0x1c, 0xd7, 0xe9, 0xe3, 0xba, 0x18, 0x81, 0x53, 0x8c, 0x08, 0x82, 0x92, 0x4b, 0x5e, 0x15, 0x08, 0xd7, 0x4d, 0x79,
0xed, 0xb5, 0xd2, 0x9b, 0x66, 0x4a, 0x98, 0xdc, 0xd0, 0x38, 0x60, 0xb0, 0x51, 0x0a, 0xfd, 0x08, 0x7b, 0xad, 0xf2, 0xe6, 0x85, 0x16, 0xb6, 0x36, 0xb4, 0x8e, 0x18, 0xac, 0x55, 0x42, 0xdf, 0xc7,
0x53, 0xdf, 0xa7, 0xb5, 0xc6, 0x1c, 0xfb, 0xdd, 0x81, 0x20, 0x14, 0x91, 0x88, 0x73, 0x65, 0x51, 0xd2, 0xf7, 0xe9, 0xdb, 0xcc, 0x1e, 0xfb, 0xcd, 0x83, 0x28, 0x16, 0x89, 0x48, 0x4b, 0xed, 0x50,
0x44, 0x72, 0x11, 0x9f, 0x4e, 0x45, 0x29, 0x38, 0x83, 0xec, 0x23, 0x4f, 0x6b, 0xdd, 0x35, 0xe6, 0x44, 0x72, 0x09, 0x9f, 0x4c, 0x44, 0x25, 0x38, 0x8b, 0x5c, 0x97, 0x47, 0x8d, 0xee, 0x66, 0xf6,
0x16, 0xdc, 0xba, 0x8b, 0x6e, 0x51, 0xd1, 0x33, 0x29, 0xc6, 0xc7, 0x5c, 0x12, 0x5f, 0x2f, 0x2c, 0xe6, 0xc2, 0xfa, 0xf3, 0x61, 0x51, 0xd1, 0x53, 0x25, 0xc6, 0x07, 0x5c, 0x11, 0xdf, 0x20, 0xae,
0x21, 0x26, 0xa6, 0x10, 0xca, 0x30, 0xc6, 0x21, 0xda, 0xbe, 0x94, 0x59, 0x1a, 0x0a, 0x65, 0x28, 0x20, 0x16, 0x46, 0x0a, 0x6d, 0x19, 0xe3, 0x12, 0x6d, 0x5f, 0xa9, 0x22, 0x8f, 0x85, 0xb6, 0x94,
0x97, 0x90, 0x5d, 0x40, 0x30, 0x3a, 0x3b, 0xa1, 0xb4, 0x0f, 0x2f, 0x79, 0x3a, 0x11, 0x5f, 0x2b, 0x2b, 0xc8, 0x4e, 0x21, 0x1a, 0x1d, 0x1f, 0x52, 0xd9, 0x87, 0xe7, 0x3c, 0x3f, 0x13, 0x5f, 0x69,
0x91, 0x2c, 0x49, 0xed, 0x2e, 0xf4, 0xf3, 0x42, 0x9c, 0x59, 0xd9, 0xad, 0x30, 0x45, 0x3b, 0x2b, 0x91, 0x2d, 0x28, 0xed, 0x16, 0xf4, 0x4b, 0x29, 0x8e, 0x9d, 0xea, 0xd6, 0x98, 0xb2, 0x9d, 0x4a,
0x0a, 0x91, 0x2a, 0xbd, 0xae, 0xb5, 0xd7, 0x98, 0x63, 0xbf, 0x38, 0xe4, 0xc8, 0xae, 0xc9, 0x61, 0x29, 0x72, 0x6d, 0xbe, 0x1b, 0xed, 0xcd, 0xec, 0xb1, 0x9f, 0x3d, 0x0a, 0xe4, 0xf6, 0xe4, 0x30,
0x32, 0xfe, 0x5f, 0xca, 0xd2, 0x5f, 0x51, 0x96, 0x7e, 0x5d, 0x96, 0xec, 0x6f, 0x07, 0x6e, 0xb7, 0x1b, 0xff, 0x27, 0x6d, 0x19, 0x2e, 0x69, 0xcb, 0xb0, 0x69, 0x4b, 0xf6, 0x97, 0x07, 0x77, 0xda,
0xcb, 0x00, 0xe3, 0x7b, 0x2b, 0x75, 0xe8, 0x37, 0xeb, 0xf0, 0xa8, 0x5d, 0x87, 0x1f, 0xaf, 0xa8, 0x6d, 0x80, 0xf9, 0xbd, 0x95, 0x3e, 0x0c, 0x67, 0xfb, 0x70, 0xbf, 0xdd, 0x87, 0x1f, 0x2e, 0xe9,
0xc3, 0x61, 0x32, 0x7e, 0x3b, 0xa5, 0xe8, 0xdb, 0xa5, 0xf8, 0xab, 0x03, 0x77, 0x17, 0xe5, 0x8a, 0xc3, 0x61, 0x36, 0x7e, 0x3b, 0xad, 0x18, 0xba, 0xad, 0xf8, 0x8b, 0x07, 0xf7, 0xe6, 0xe5, 0x8a,
0x64, 0xdf, 0x09, 0xc5, 0xfa, 0xa4, 0x58, 0xf6, 0x00, 0x36, 0x87, 0x97, 0x22, 0xba, 0x1a, 0x9d, 0x64, 0xff, 0x17, 0x8a, 0x0d, 0x49, 0xb1, 0xec, 0x21, 0xdc, 0x1e, 0x9e, 0x8b, 0xe4, 0x62, 0x74,
0x9d, 0xe0, 0xde, 0x50, 0xbc, 0x5a, 0xd6, 0x45, 0xd8, 0xcf, 0x0e, 0x6c, 0x35, 0xed, 0x64, 0xae, 0x7c, 0x88, 0x67, 0x63, 0xf1, 0x7a, 0xd1, 0x14, 0x61, 0x3f, 0x79, 0xb0, 0x3e, 0x6b, 0xa7, 0x4a,
0x13, 0xad, 0xfd, 0x92, 0x71, 0x3f, 0xac, 0xf0, 0x42, 0x9c, 0x9d, 0x25, 0x71, 0xb6, 0xf9, 0xba, 0x53, 0x68, 0x13, 0x97, 0x8c, 0xfb, 0x71, 0x8d, 0xe7, 0xf2, 0xec, 0x2c, 0xc8, 0xb3, 0xcd, 0xd7,
0x4b, 0xf8, 0xde, 0x07, 0x9f, 0xd4, 0x47, 0x06, 0x5a, 0x79, 0xf5, 0x04, 0x9b, 0xc0, 0xf6, 0x48, 0x5f, 0xc0, 0xf7, 0x01, 0x84, 0xa4, 0x3e, 0x32, 0x30, 0xca, 0x6b, 0x36, 0xd8, 0x27, 0xb0, 0x31,
0xaa, 0x38, 0xe1, 0x4a, 0x8c, 0xce, 0x4e, 0x8e, 0xb9, 0xc4, 0xf8, 0x6f, 0x41, 0x47, 0x65, 0x26, 0x52, 0x3a, 0xcd, 0xb8, 0x16, 0xa3, 0xe3, 0xc3, 0x03, 0xae, 0x30, 0xff, 0x5b, 0xd0, 0xd1, 0x57,
0xfa, 0x8e, 0xca, 0xaa, 0x97, 0xa9, 0x63, 0xbd, 0x4c, 0x75, 0x0a, 0xdc, 0x46, 0x0a, 0xea, 0x97, 0x36, 0xfb, 0x8e, 0xbe, 0x42, 0x3e, 0xa7, 0xb2, 0xc8, 0x2a, 0x85, 0xe3, 0x9a, 0x7d, 0x00, 0x51,
0xd2, 0xb3, 0x5f, 0x4a, 0xf6, 0x11, 0x04, 0x6d, 0x47, 0x32, 0xc7, 0xeb, 0x9c, 0x70, 0x69, 0x34, 0xfb, 0xa0, 0x2a, 0xf1, 0x7a, 0xce, 0xb8, 0xb2, 0x1a, 0xc4, 0x25, 0x7b, 0x08, 0xab, 0xa3, 0xcb,
0x8b, 0x43, 0xf6, 0x00, 0xd6, 0x47, 0xd7, 0xc9, 0x13, 0x71, 0x3e, 0x9b, 0x60, 0x28, 0x3b, 0xd0, 0xec, 0xa9, 0x38, 0x99, 0x9e, 0xa1, 0xeb, 0x4d, 0xe8, 0x15, 0x25, 0x8a, 0x88, 0x6c, 0xba, 0xb1,
0xcb, 0x72, 0x14, 0x1d, 0xd9, 0x74, 0x43, 0x83, 0xd8, 0xa7, 0xb0, 0x51, 0x9b, 0xc9, 0x1c, 0xc5, 0x45, 0xec, 0x63, 0x58, 0x6b, 0xcc, 0x54, 0x89, 0xe2, 0x1c, 0x23, 0x40, 0x79, 0x4d, 0x95, 0xcd,
0x3c, 0x46, 0x80, 0x72, 0x9c, 0x49, 0x13, 0xbb, 0x3d, 0xc5, 0x0e, 0xe0, 0xd6, 0xe8, 0x3a, 0xf9, 0xc5, 0xdd, 0x62, 0xbb, 0x70, 0x6b, 0x74, 0x99, 0x7d, 0x3b, 0x15, 0xf2, 0x7a, 0xff, 0x24, 0x45,
0x6e, 0x26, 0x8a, 0xf9, 0xd1, 0x79, 0x8c, 0x67, 0x0f, 0x60, 0x0d, 0x53, 0x23, 0x64, 0x69, 0x5f, 0xdf, 0x03, 0x58, 0xc1, 0xab, 0x16, 0xaa, 0xb2, 0xaf, 0x20, 0xfb, 0x1c, 0x6e, 0xcf, 0xd8, 0xaa,
0x42, 0xf6, 0x05, 0x6c, 0x36, 0x6c, 0x65, 0xbe, 0xda, 0xb8, 0x6c, 0x94, 0x9d, 0xba, 0x51, 0xbe, 0x72, 0xb9, 0x71, 0x35, 0xf8, 0x3a, 0xcd, 0xe0, 0x7b, 0x49, 0x1c, 0xe8, 0xf8, 0x8d, 0x71, 0x50,
0x20, 0x0e, 0xb4, 0xfd, 0x46, 0x3f, 0xa8, 0xfd, 0x38, 0xcd, 0x67, 0xaa, 0xd4, 0x3e, 0x81, 0x55, 0xcb, 0x69, 0x5e, 0x4e, 0x75, 0xa5, 0x65, 0x02, 0x8e, 0x5a, 0x7d, 0x57, 0xad, 0xec, 0x47, 0x8f,
0x57, 0xcb, 0x7e, 0x72, 0x88, 0xb4, 0x39, 0xf7, 0xc6, 0x98, 0xfe, 0xd5, 0xc1, 0x78, 0x4e, 0xc1, 0x48, 0x5b, 0xbf, 0x37, 0xe6, 0xf4, 0x8f, 0x1c, 0xa3, 0x1f, 0xc9, 0xdf, 0xe0, 0xcb, 0x65, 0x0b,
0x5f, 0xe3, 0x4b, 0x67, 0x04, 0x52, 0x42, 0x14, 0x28, 0xbe, 0xbf, 0xb4, 0xa4, 0x35, 0x5f, 0x61, 0x5e, 0x41, 0x14, 0x1c, 0xbe, 0xa7, 0xf4, 0xc9, 0x68, 0xb8, 0xc6, 0x38, 0xde, 0xef, 0x8e, 0x2e,
0xfc, 0x1c, 0xb8, 0x33, 0xba, 0x4e, 0xaa, 0xba, 0xc4, 0xe7, 0x50, 0x18, 0xf9, 0xd3, 0x93, 0xe6, 0xb3, 0xba, 0xcf, 0xf0, 0x79, 0x13, 0x56, 0xce, 0xf4, 0x44, 0x79, 0xce, 0x13, 0x35, 0x77, 0x49,
0x58, 0x4f, 0xda, 0xc2, 0x25, 0xe1, 0xcc, 0x85, 0xd0, 0x92, 0x75, 0x43, 0x1c, 0x56, 0x6d, 0xcd, 0xb8, 0x73, 0x2a, 0x8c, 0x04, 0xfd, 0x18, 0x97, 0xf5, 0x98, 0x0a, 0x9c, 0x31, 0x55, 0x3f, 0x8c,
0xb3, 0xda, 0x5a, 0xf5, 0x90, 0x76, 0xed, 0x87, 0xf4, 0x3e, 0xf8, 0x28, 0xc2, 0x44, 0x28, 0x51, 0x5d, 0xf7, 0x61, 0x7c, 0x00, 0x21, 0x8e, 0xbb, 0x4c, 0x68, 0x21, 0xed, 0x8b, 0xd7, 0x6c, 0x20,
0x98, 0x17, 0xb2, 0x9e, 0x40, 0x9a, 0xe2, 0x4d, 0x1e, 0x17, 0x65, 0x83, 0x34, 0x88, 0x3a, 0x03, 0x4d, 0x71, 0x55, 0xa6, 0xb2, 0x1a, 0x78, 0x16, 0xd1, 0x4b, 0xcf, 0x25, 0x27, 0x61, 0x9b, 0x71,
0x2f, 0x38, 0x15, 0x82, 0x6e, 0x8f, 0x15, 0xb6, 0x64, 0xeb, 0x53, 0x40, 0xa5, 0x6c, 0xff, 0xc4, 0x57, 0x63, 0x67, 0x60, 0x87, 0x94, 0x90, 0x45, 0xec, 0x0f, 0x7c, 0xdd, 0x1d, 0x92, 0x7c, 0x32,
0x6e, 0x60, 0x91, 0xe4, 0xd3, 0xa9, 0x91, 0xa5, 0xf5, 0x3d, 0x50, 0x99, 0x97, 0xa4, 0x3a, 0x8b, 0xb1, 0xb2, 0x74, 0xe6, 0x7b, 0x6d, 0x5e, 0x91, 0xea, 0xcc, 0x93, 0xf2, 0x1d, 0x52, 0x33, 0xe9,
0xa4, 0x5c, 0x8b, 0x54, 0x23, 0x7c, 0xaf, 0x1d, 0x7e, 0xbb, 0xf0, 0xbb, 0x4b, 0x0a, 0xbf, 0xa6, 0x07, 0xed, 0xf4, 0xdb, 0x8d, 0xdc, 0x5d, 0xd0, 0xc8, 0x0d, 0xc5, 0xde, 0x52, 0x8a, 0x2b, 0x2d,
0xd8, 0x5b, 0x49, 0x71, 0xad, 0x45, 0xd1, 0xa4, 0xa0, 0x5f, 0xeb, 0x74, 0x4a, 0xdc, 0xbe, 0x2f, 0x8a, 0xb6, 0x04, 0xfd, 0x46, 0xa7, 0x13, 0xe2, 0xf6, 0x9d, 0xe4, 0xb9, 0x3a, 0x15, 0xf2, 0x59,
0x78, 0x2a, 0x2f, 0x44, 0xf1, 0x34, 0x9d, 0xce, 0x97, 0x55, 0x7f, 0xcd, 0xb5, 0xd3, 0xe0, 0x6a, 0x3e, 0xb9, 0xae, 0xba, 0xb9, 0xa8, 0xbb, 0xb9, 0x70, 0xb8, 0x76, 0x66, 0xb8, 0xba, 0xb1, 0xfc,
0xfb, 0x72, 0x5b, 0xbe, 0x96, 0xa4, 0xd2, 0x14, 0xe0, 0xb1, 0x50, 0xa7, 0xd8, 0x9a, 0x6e, 0x2e, 0x56, 0xac, 0x05, 0xa5, 0xb4, 0x0d, 0x78, 0x20, 0xf4, 0x11, 0x8e, 0x9a, 0x9b, 0x1b, 0x70, 0x97,
0xc0, 0x03, 0x8a, 0xac, 0xb6, 0x95, 0x79, 0x26, 0x5b, 0xdf, 0x9a, 0xae, 0xe9, 0x71, 0xec, 0x1b, 0x32, 0x6b, 0x6c, 0x55, 0x59, 0xa8, 0xd6, 0xff, 0x8e, 0xbe, 0x9d, 0x59, 0xec, 0x6b, 0x78, 0x17,
0x78, 0x1f, 0x33, 0xc4, 0xa7, 0xd1, 0xa9, 0x78, 0x3d, 0xb4, 0x6e, 0xc9, 0x24, 0x6a, 0x69, 0xa7, 0x2b, 0xc4, 0x27, 0xc9, 0x91, 0x78, 0x33, 0x74, 0x6e, 0xc9, 0x16, 0x6a, 0xe1, 0xcb, 0xbf, 0x09,
0xd8, 0x81, 0x9e, 0x7a, 0x73, 0x89, 0x7d, 0x4f, 0x4b, 0xd2, 0x20, 0x36, 0x84, 0x6d, 0xed, 0xf8, 0x3d, 0x7d, 0x75, 0x8e, 0x73, 0xcc, 0x48, 0xd2, 0x22, 0x36, 0x84, 0x0d, 0x13, 0xf8, 0x39, 0x4f,
0x19, 0x8f, 0xae, 0xe8, 0xc3, 0x5e, 0xbc, 0x2a, 0x6f, 0xce, 0xa9, 0xc5, 0xdb, 0xc8, 0x60, 0xa7, 0x2e, 0xe8, 0x1f, 0x75, 0xf1, 0xba, 0xba, 0x39, 0xaf, 0x11, 0xef, 0x4c, 0x05, 0x3b, 0xad, 0x0a,
0x95, 0x41, 0xf6, 0x08, 0xee, 0xb6, 0x0f, 0xd1, 0x04, 0xe8, 0xca, 0xf4, 0x94, 0x39, 0xad, 0xc2, 0xb2, 0xc7, 0x70, 0xaf, 0xed, 0xc4, 0x10, 0xa0, 0x2b, 0x33, 0x5b, 0xd6, 0x5b, 0x8d, 0xd9, 0xf7,
0xec, 0x07, 0xb8, 0xad, 0x37, 0xbd, 0x48, 0xf3, 0xff, 0xee, 0x1b, 0x6f, 0x9e, 0xfe, 0xad, 0x18, 0x70, 0xc7, 0x1c, 0x7a, 0x99, 0x97, 0xff, 0x3e, 0x36, 0xde, 0x3c, 0xfd, 0xfa, 0xb0, 0x7a, 0xc3,
0xbd, 0xe1, 0x98, 0x7d, 0x0e, 0xf7, 0x16, 0x8f, 0xd6, 0x11, 0x7d, 0x00, 0x30, 0x4b, 0xad, 0x98, 0x35, 0xfb, 0x0c, 0xee, 0xcf, 0xbb, 0x36, 0x19, 0xbd, 0x07, 0x30, 0xcd, 0x9d, 0x9c, 0xfc, 0x9d,
0xdc, 0x7d, 0x3f, 0xb4, 0x66, 0xce, 0x7b, 0xf4, 0xa7, 0xe9, 0xd1, 0x3f, 0x01, 0x00, 0x00, 0xff, 0x30, 0x76, 0x76, 0x4e, 0x7a, 0xf4, 0x23, 0xe8, 0xf1, 0xdf, 0x01, 0x00, 0x00, 0xff, 0xff, 0xda,
0xff, 0xc7, 0xa0, 0xa2, 0xb0, 0x49, 0x0d, 0x00, 0x00, 0x74, 0x21, 0xec, 0x19, 0x0d, 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