Skip to content
Snippets Groups Projects
Unverified Commit b7d1f3b5 authored by Silas Davis's avatar Silas Davis
Browse files

Fix exception surfacing


Signed-off-by: default avatarSilas Davis <silas@monax.io>
parent 193df33e
No related branches found
No related tags found
No related merge requests found
...@@ -17,7 +17,6 @@ import golang_proto "github.com/golang/protobuf/proto" ...@@ -17,7 +17,6 @@ import golang_proto "github.com/golang/protobuf/proto"
import fmt "fmt" import fmt "fmt"
import math "math" import math "math"
import _ "github.com/gogo/protobuf/gogoproto" import _ "github.com/gogo/protobuf/gogoproto"
import _ "github.com/hyperledger/burrow/crypto"
import github_com_hyperledger_burrow_crypto "github.com/hyperledger/burrow/crypto" import github_com_hyperledger_burrow_crypto "github.com/hyperledger/burrow/crypto"
import github_com_hyperledger_burrow_binary "github.com/hyperledger/burrow/binary" import github_com_hyperledger_burrow_binary "github.com/hyperledger/burrow/binary"
...@@ -584,26 +583,25 @@ func init() { proto.RegisterFile("tendermint.proto", fileDescriptorTendermint) } ...@@ -584,26 +583,25 @@ func init() { proto.RegisterFile("tendermint.proto", fileDescriptorTendermint) }
func init() { golang_proto.RegisterFile("tendermint.proto", fileDescriptorTendermint) } func init() { golang_proto.RegisterFile("tendermint.proto", fileDescriptorTendermint) }
var fileDescriptorTendermint = []byte{ var fileDescriptorTendermint = []byte{
// 321 bytes of a gzipped FileDescriptorProto // 318 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x91, 0xbd, 0x4e, 0x3a, 0x41, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x91, 0xcd, 0x4e, 0xfa, 0x40,
0x14, 0xc5, 0xff, 0xb3, 0xfc, 0xf9, 0x9a, 0x60, 0x62, 0x36, 0x16, 0x13, 0x8a, 0x85, 0x18, 0x0b, 0x14, 0xc5, 0xff, 0x53, 0xfe, 0x7c, 0x4d, 0x34, 0x31, 0x8d, 0x8b, 0x89, 0x8b, 0x42, 0x8c, 0x0b,
0x0a, 0x61, 0x13, 0x3f, 0x1e, 0x40, 0xa4, 0x80, 0x44, 0x31, 0x6e, 0x61, 0x61, 0xc7, 0xb2, 0x97, 0x16, 0xd2, 0x26, 0x7e, 0x3c, 0x80, 0xc8, 0x02, 0x12, 0xc5, 0xd8, 0x85, 0x0b, 0x77, 0x94, 0x5e,
0xdd, 0x0d, 0x30, 0x97, 0xdc, 0x99, 0x0d, 0xee, 0x43, 0xf9, 0x0e, 0x96, 0x94, 0xd6, 0x16, 0xc4, 0xda, 0x06, 0x98, 0x4b, 0xee, 0x4c, 0x83, 0x7d, 0x28, 0xdf, 0xc1, 0x25, 0x4b, 0xd7, 0x2e, 0x88,
0xc0, 0x8b, 0x18, 0x66, 0x57, 0xd1, 0x46, 0xbb, 0xf9, 0x9d, 0x33, 0x73, 0xee, 0xc9, 0x5c, 0x7e, 0x81, 0x17, 0x31, 0x4c, 0xab, 0xe8, 0x46, 0x77, 0xf3, 0x3b, 0x67, 0xe6, 0xde, 0x93, 0x39, 0xfc,
0xa8, 0x41, 0x06, 0x40, 0xf3, 0x58, 0xea, 0xce, 0x82, 0x50, 0xa3, 0xcd, 0xf7, 0x4a, 0xbd, 0x1d, 0x40, 0x83, 0x0c, 0x81, 0x66, 0x89, 0xd4, 0xee, 0x9c, 0x50, 0xa3, 0xcd, 0x77, 0xca, 0x51, 0x3b,
0xc6, 0x3a, 0x4a, 0xfc, 0xce, 0x18, 0xe7, 0x6e, 0x88, 0x21, 0xba, 0xe6, 0x8a, 0x9f, 0x4c, 0x0c, 0x4a, 0x74, 0x9c, 0x06, 0xee, 0x08, 0x67, 0x5e, 0x84, 0x11, 0x7a, 0xe6, 0x4a, 0x90, 0x8e, 0x0d,
0x19, 0x30, 0xa7, 0xec, 0x69, 0xbd, 0x36, 0xa6, 0x74, 0xa1, 0x73, 0x3a, 0x7e, 0xb6, 0x78, 0x65, 0x19, 0x30, 0xa7, 0xfc, 0xe9, 0xf1, 0xb3, 0xc5, 0x6b, 0x03, 0x0c, 0xa1, 0x2f, 0xc7, 0x68, 0x77,
0x88, 0x01, 0x0c, 0xe4, 0x04, 0xed, 0x1e, 0xb7, 0x06, 0x3d, 0xc1, 0x9a, 0xac, 0x55, 0xeb, 0x5e, 0xb9, 0xd5, 0xef, 0x0a, 0xd6, 0x64, 0xad, 0xbd, 0xce, 0xc5, 0x72, 0xd5, 0xf8, 0xf7, 0xb6, 0x6a,
0xac, 0xd6, 0x8d, 0x7f, 0x6f, 0xeb, 0xc6, 0xe9, 0xb7, 0xf4, 0x28, 0x5d, 0x00, 0xcd, 0x20, 0x08, 0x9c, 0x7e, 0x9b, 0x17, 0x67, 0x73, 0xa0, 0x29, 0x84, 0x11, 0x90, 0x17, 0xa4, 0x44, 0xb8, 0xf0,
0x81, 0x5c, 0x3f, 0x21, 0xc2, 0xa5, 0x9b, 0x87, 0x5d, 0x05, 0x01, 0x81, 0x52, 0x9e, 0x35, 0xe8, 0x46, 0x94, 0xcd, 0x35, 0xba, 0x57, 0x61, 0x48, 0xa0, 0x94, 0x6f, 0xf5, 0xbb, 0xf6, 0x09, 0xdf,
0xd9, 0x27, 0xfc, 0xe0, 0x26, 0x56, 0x1a, 0x64, 0x2e, 0x0a, 0xab, 0xc9, 0x5a, 0x55, 0xef, 0xa7, 0xbf, 0x49, 0x94, 0x06, 0x59, 0x88, 0xc2, 0x6a, 0xb2, 0x56, 0xdd, 0xff, 0x29, 0xda, 0x82, 0x57,
0x68, 0x0b, 0x5e, 0x1e, 0x82, 0x5e, 0x22, 0x4d, 0x45, 0xc1, 0xf8, 0x9f, 0xb8, 0x73, 0x1e, 0x80, 0x07, 0xa0, 0x17, 0x48, 0x13, 0x51, 0x32, 0xfe, 0x27, 0x6e, 0x9d, 0x07, 0x20, 0x95, 0xa0, 0x14,
0x54, 0x8c, 0x52, 0xfc, 0xcf, 0x9c, 0x1c, 0xed, 0x7b, 0x5e, 0xb9, 0x8e, 0x46, 0x52, 0xc2, 0x4c, 0xff, 0x73, 0xa7, 0x40, 0xfb, 0x9e, 0xd7, 0xae, 0xe3, 0xa1, 0x94, 0x30, 0x55, 0xa2, 0x6c, 0x52,
0x89, 0xa2, 0x69, 0x79, 0x99, 0xb7, 0x6c, 0xff, 0xde, 0xd2, 0x8f, 0xe5, 0x88, 0xd2, 0x4e, 0x1f, 0x5e, 0x16, 0x29, 0xdb, 0xbf, 0xa7, 0x0c, 0x12, 0x39, 0xa4, 0xcc, 0xed, 0xc1, 0x53, 0x27, 0xd3,
0x9e, 0xba, 0xa9, 0x06, 0xe5, 0x7d, 0xc5, 0xec, 0x86, 0xdd, 0xa2, 0x8c, 0xa7, 0x40, 0xa2, 0x94, 0xa0, 0xfc, 0xaf, 0x31, 0xdb, 0x65, 0xb7, 0x28, 0x93, 0x09, 0x90, 0xa8, 0xe4, 0xcb, 0x0a, 0xb4,
0x0d, 0xcb, 0xd1, 0x3e, 0xe2, 0xc5, 0x3b, 0x1d, 0x01, 0x89, 0x72, 0xb3, 0xd0, 0xaa, 0x7a, 0x19, 0x0f, 0x79, 0xf9, 0x4e, 0xc7, 0x40, 0xa2, 0xda, 0x2c, 0xb5, 0xea, 0x7e, 0x0e, 0x9d, 0xde, 0x72,
0x74, 0xfb, 0xab, 0x8d, 0xc3, 0x5e, 0x37, 0x0e, 0x7b, 0xdf, 0x38, 0xec, 0x65, 0xeb, 0xb0, 0xd5, 0xed, 0xb0, 0xd7, 0xb5, 0xc3, 0xde, 0xd7, 0x0e, 0x7b, 0xd9, 0x38, 0x6c, 0xb9, 0x71, 0xd8, 0xe3,
0xd6, 0x61, 0x8f, 0x67, 0x7f, 0x7c, 0x12, 0x4a, 0x05, 0x52, 0x25, 0xca, 0xdd, 0xaf, 0xcd, 0x2f, 0xd9, 0x1f, 0x9f, 0x84, 0x52, 0x81, 0x54, 0xa9, 0xf2, 0x76, 0x45, 0x05, 0x15, 0x53, 0xc0, 0xf9,
0x99, 0x05, 0x9c, 0x7f, 0x04, 0x00, 0x00, 0xff, 0xff, 0x29, 0x50, 0xa8, 0x1b, 0xdd, 0x01, 0x00, 0x47, 0x00, 0x00, 0x00, 0xff, 0xff, 0xd1, 0x1c, 0x4c, 0x76, 0xcf, 0x01, 0x00, 0x00,
0x00,
} }
...@@ -213,6 +213,7 @@ func (ctx *CallContext) Deliver(inAcc, outAcc acm.Account, value uint64) error { ...@@ -213,6 +213,7 @@ func (ctx *CallContext) Deliver(inAcc, outAcc acm.Account, value uint64) error {
// Failure. Charge the gas fee. The 'value' was otherwise not transferred. // Failure. Charge the gas fee. The 'value' was otherwise not transferred.
ctx.Logger.InfoMsg("Error on execution", ctx.Logger.InfoMsg("Error on execution",
structure.ErrorKey, exception) structure.ErrorKey, exception)
ctx.txe.SetException(exception)
} else { } else {
ctx.Logger.TraceMsg("Successful execution") ctx.Logger.TraceMsg("Successful execution")
if createContract { if createContract {
......
...@@ -173,5 +173,5 @@ func (e *Exception) Error() string { ...@@ -173,5 +173,5 @@ func (e *Exception) Error() string {
if e == nil { if e == nil {
return "" return ""
} }
return fmt.Sprintf("Error %v: %s", e.Code, e.Exception) return fmt.Sprintf("Error %d: %s", e.Code, e.Exception)
} }
...@@ -97,6 +97,10 @@ func (txe *TxExecution) GovernAccount(governAccount *GovernAccountEvent, excepti ...@@ -97,6 +97,10 @@ func (txe *TxExecution) GovernAccount(governAccount *GovernAccountEvent, excepti
}) })
} }
func (txe *TxExecution) SetException(err error) {
txe.Exception = errors.AsException(err)
}
// Set result // Set result
func (txe *TxExecution) Return(returnValue []byte, gasUsed uint64) { func (txe *TxExecution) Return(returnValue []byte, gasUsed uint64) {
if txe.Result == nil { if txe.Result == nil {
......
...@@ -197,7 +197,7 @@ func (exe *executor) Execute(txEnv *txs.Envelope) (txe *exec.TxExecution, err er ...@@ -197,7 +197,7 @@ func (exe *executor) Execute(txEnv *txs.Envelope) (txe *exec.TxExecution, err er
return nil, err return nil, err
} }
// Return execution for this tx // Return execution for this tx
return txe, err return txe, nil
} }
return nil, fmt.Errorf("unknown transaction type: %v", txEnv.Tx.Type()) return nil, fmt.Errorf("unknown transaction type: %v", txEnv.Tx.Type())
} }
......
...@@ -57,6 +57,7 @@ func CallCodeSim(reader state.Reader, tip bcm.BlockchainInfo, fromAddress, addre ...@@ -57,6 +57,7 @@ func CallCodeSim(reader state.Reader, tip bcm.BlockchainInfo, fromAddress, addre
err = fmt.Errorf("panic from VM in simulated call: %v\n%s", r, debug.Stack()) err = fmt.Errorf("panic from VM in simulated call: %v\n%s", r, debug.Stack())
} }
}() }()
ret, err := vmach.Call(txCache, caller, callee, code, data, 0, &gas) ret, err := vmach.Call(txCache, caller, callee, code, data, 0, &gas)
if err != nil { if err != nil {
return nil, err return nil, err
......
...@@ -106,7 +106,11 @@ func (trans *Transactor) BroadcastTxSync(ctx context.Context, txEnv *txs.Envelop ...@@ -106,7 +106,11 @@ func (trans *Transactor) BroadcastTxSync(ctx context.Context, txEnv *txs.Envelop
return nil, fmt.Errorf("timed out waiting for transaction with hash %v timed out after %v", return nil, fmt.Errorf("timed out waiting for transaction with hash %v timed out after %v",
checkTxReceipt.TxHash, BlockingTimeout) checkTxReceipt.TxHash, BlockingTimeout)
case msg := <-out: case msg := <-out:
return msg.(*exec.TxExecution), nil txe := msg.(*exec.TxExecution)
if txe.Exception != nil && txe.Exception.ErrorCode() != errors.ErrorCodeExecutionReverted {
return nil, errors.Wrap(txe.Exception, "exception during transaction execution")
}
return txe, nil
} }
} }
......
...@@ -23,7 +23,7 @@ message ResultStatus { ...@@ -23,7 +23,7 @@ message ResultStatus {
string NodeVersion = 3; string NodeVersion = 3;
crypto.PublicKey PublicKey = 5 [(gogoproto.nullable) = false]; crypto.PublicKey PublicKey = 5 [(gogoproto.nullable) = false];
bytes LatestBlockHash = 6 [(gogoproto.customtype) = "github.com/hyperledger/burrow/binary.HexBytes", (gogoproto.nullable) = false]; bytes LatestBlockHash = 6 [(gogoproto.customtype) = "github.com/hyperledger/burrow/binary.HexBytes", (gogoproto.nullable) = false];
uint64 LatestBlockHeight = 7; uint64 LatestBlockHeight = 7 [(gogoproto.jsontag) = ""];
// Unix // Unix
google.protobuf.Timestamp LatestBlockTime = 8 [(gogoproto.nullable) = false, (gogoproto.stdtime) = true]; google.protobuf.Timestamp LatestBlockTime = 8 [(gogoproto.nullable) = false, (gogoproto.stdtime) = true];
......
...@@ -4,7 +4,6 @@ syntax = 'proto3'; ...@@ -4,7 +4,6 @@ syntax = 'proto3';
option go_package = "github.com/hyperledger/burrow/consensus/tendermint"; option go_package = "github.com/hyperledger/burrow/consensus/tendermint";
import "github.com/gogo/protobuf/gogoproto/gogo.proto"; import "github.com/gogo/protobuf/gogoproto/gogo.proto";
import "crypto.proto";
package tendermint; package tendermint;
......
...@@ -48,7 +48,7 @@ type ResultStatus struct { ...@@ -48,7 +48,7 @@ type ResultStatus struct {
NodeVersion string `protobuf:"bytes,3,opt,name=NodeVersion,proto3" json:"NodeVersion,omitempty"` NodeVersion string `protobuf:"bytes,3,opt,name=NodeVersion,proto3" json:"NodeVersion,omitempty"`
PublicKey crypto.PublicKey `protobuf:"bytes,5,opt,name=PublicKey" json:"PublicKey"` PublicKey crypto.PublicKey `protobuf:"bytes,5,opt,name=PublicKey" json:"PublicKey"`
LatestBlockHash github_com_hyperledger_burrow_binary.HexBytes `protobuf:"bytes,6,opt,name=LatestBlockHash,proto3,customtype=github.com/hyperledger/burrow/binary.HexBytes" json:"LatestBlockHash"` LatestBlockHash github_com_hyperledger_burrow_binary.HexBytes `protobuf:"bytes,6,opt,name=LatestBlockHash,proto3,customtype=github.com/hyperledger/burrow/binary.HexBytes" json:"LatestBlockHash"`
LatestBlockHeight uint64 `protobuf:"varint,7,opt,name=LatestBlockHeight,proto3" json:"LatestBlockHeight,omitempty"` LatestBlockHeight uint64 `protobuf:"varint,7,opt,name=LatestBlockHeight,proto3" json:""`
LatestBlockTime time.Time `protobuf:"bytes,8,opt,name=LatestBlockTime,stdtime" json:"LatestBlockTime"` LatestBlockTime time.Time `protobuf:"bytes,8,opt,name=LatestBlockTime,stdtime" json:"LatestBlockTime"`
} }
...@@ -623,30 +623,31 @@ func init() { proto.RegisterFile("rpc.proto", fileDescriptorRpc) } ...@@ -623,30 +623,31 @@ func init() { proto.RegisterFile("rpc.proto", fileDescriptorRpc) }
func init() { golang_proto.RegisterFile("rpc.proto", fileDescriptorRpc) } func init() { golang_proto.RegisterFile("rpc.proto", fileDescriptorRpc) }
var fileDescriptorRpc = []byte{ var fileDescriptorRpc = []byte{
// 397 bytes of a gzipped FileDescriptorProto // 403 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x51, 0x41, 0xcf, 0xd2, 0x40, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x51, 0xb1, 0x8e, 0xd3, 0x40,
0x10, 0x75, 0x05, 0xbf, 0x0f, 0x16, 0x12, 0x65, 0xe3, 0x61, 0xc3, 0xa1, 0xad, 0x9e, 0x7a, 0xd0, 0x10, 0x65, 0x89, 0xb9, 0x4b, 0x36, 0x91, 0xe0, 0x56, 0x14, 0xab, 0x14, 0xb6, 0xa1, 0x72, 0xc3,
0xad, 0xd1, 0x10, 0xef, 0xd5, 0x44, 0x88, 0x86, 0x98, 0x4a, 0x34, 0xf1, 0x62, 0xda, 0x32, 0xb4, 0x1a, 0x1d, 0x3a, 0xd1, 0x1b, 0x24, 0xee, 0x04, 0x3a, 0x21, 0x13, 0x81, 0x44, 0x83, 0x6c, 0x67,
0x1b, 0xdb, 0x6e, 0xb3, 0xbb, 0x8d, 0xf6, 0x5f, 0xf8, 0x93, 0x3c, 0x72, 0xf4, 0xec, 0x01, 0x0d, 0x62, 0xaf, 0xb0, 0xbd, 0xd6, 0xee, 0x5a, 0xe0, 0xbf, 0xe0, 0x93, 0x28, 0x53, 0x52, 0x53, 0x04,
0x1c, 0xfd, 0x13, 0x86, 0x85, 0x42, 0xc5, 0xc4, 0x8b, 0xb7, 0x79, 0xf3, 0x66, 0xde, 0xbc, 0x99, 0x94, 0x74, 0x74, 0xfc, 0x01, 0xf2, 0x26, 0x4e, 0x4c, 0x90, 0x68, 0xae, 0x9b, 0x37, 0x6f, 0xe6,
0xc1, 0x7d, 0x59, 0xc6, 0xac, 0x94, 0x42, 0x0b, 0xd2, 0x91, 0x65, 0x3c, 0x7e, 0x98, 0x70, 0x9d, 0xcd, 0x9b, 0x19, 0x3c, 0x92, 0x55, 0xc2, 0x2a, 0x29, 0xb4, 0x20, 0x03, 0x59, 0x25, 0xd3, 0x47,
0x56, 0x11, 0x8b, 0x45, 0xee, 0x25, 0x22, 0x11, 0x9e, 0xe1, 0xa2, 0x6a, 0x65, 0x90, 0x01, 0x26, 0x29, 0xd7, 0x59, 0x1d, 0xb3, 0x44, 0x14, 0x7e, 0x2a, 0x52, 0xe1, 0x1b, 0x2e, 0xae, 0x17, 0x06,
0x3a, 0xf4, 0x8c, 0x87, 0xb1, 0xac, 0x4b, 0xdd, 0xa0, 0x3b, 0x1a, 0x8a, 0x25, 0xc8, 0x9c, 0x17, 0x19, 0x60, 0xa2, 0x6d, 0xcf, 0x74, 0x92, 0xc8, 0xa6, 0xd2, 0x1d, 0xba, 0xa7, 0xa1, 0x9c, 0x83,
0xfa, 0x98, 0xb1, 0x13, 0x21, 0x92, 0x0c, 0xce, 0x2a, 0x9a, 0xe7, 0xa0, 0x74, 0x98, 0x97, 0x87, 0x2c, 0x78, 0xa9, 0x77, 0x19, 0x27, 0x15, 0x22, 0xcd, 0xe1, 0xa0, 0xa2, 0x79, 0x01, 0x4a, 0x47,
0x82, 0xfb, 0xbf, 0x3a, 0x78, 0x18, 0x80, 0xaa, 0x32, 0xfd, 0x46, 0x87, 0xba, 0x52, 0x84, 0xe2, 0x45, 0xb5, 0x2d, 0x78, 0xf8, 0x7b, 0x80, 0x27, 0x21, 0xa8, 0x3a, 0xd7, 0x6f, 0x74, 0xa4, 0x6b,
0xeb, 0x67, 0x69, 0xc8, 0x8b, 0xd9, 0x73, 0x8a, 0x1c, 0xe4, 0xf6, 0x83, 0x06, 0x92, 0x47, 0xb8, 0x45, 0x28, 0x3e, 0x7d, 0x96, 0x45, 0xbc, 0xbc, 0x7a, 0x4e, 0x91, 0x8b, 0xbc, 0x51, 0xd8, 0x41,
0x37, 0x17, 0x4b, 0x98, 0x15, 0x2b, 0x41, 0x6f, 0x3a, 0xc8, 0x1d, 0x3c, 0xbe, 0xcb, 0x5a, 0x03, 0xf2, 0x18, 0x0f, 0xaf, 0xc5, 0x1c, 0xae, 0xca, 0x85, 0xa0, 0xb7, 0x5d, 0xe4, 0x8d, 0xcf, 0xef,
0x1b, 0x2e, 0x38, 0x55, 0x11, 0x07, 0x0f, 0xf6, 0xf1, 0x5b, 0x90, 0x8a, 0x8b, 0x82, 0x76, 0x8c, 0xb3, 0xde, 0xc0, 0x8e, 0x0b, 0xf7, 0x55, 0xc4, 0xc5, 0xe3, 0x36, 0x7e, 0x0b, 0x52, 0x71, 0x51,
0x5e, 0x3b, 0x45, 0xde, 0xe1, 0xc1, 0x0b, 0x28, 0x40, 0x71, 0x35, 0x0d, 0x55, 0x4a, 0xbb, 0x0e, 0xd2, 0x81, 0xd1, 0xeb, 0xa7, 0xc8, 0x3b, 0x3c, 0x7e, 0x01, 0x25, 0x28, 0xae, 0x2e, 0x23, 0x95,
0x72, 0x87, 0xfe, 0x64, 0xbd, 0xb1, 0x6f, 0x7c, 0xdf, 0xd8, 0xed, 0x5b, 0xa4, 0x75, 0x09, 0x32, 0x51, 0xcb, 0x45, 0xde, 0x24, 0xb8, 0x58, 0xae, 0x9c, 0x5b, 0xdf, 0x57, 0x4e, 0xff, 0x16, 0x59,
0x83, 0x65, 0x02, 0xd2, 0x8b, 0x2a, 0x29, 0xc5, 0x27, 0x2f, 0xe2, 0x45, 0x28, 0x6b, 0x36, 0x85, 0x53, 0x81, 0xcc, 0x61, 0x9e, 0x82, 0xf4, 0xe3, 0x5a, 0x4a, 0xf1, 0xc9, 0x8f, 0x79, 0x19, 0xc9,
0xcf, 0x7e, 0xad, 0x41, 0x05, 0x6d, 0x25, 0x32, 0xc1, 0xfd, 0xd7, 0x55, 0x94, 0xf1, 0xf8, 0x25, 0x86, 0x5d, 0xc2, 0xe7, 0xa0, 0xd1, 0xa0, 0xc2, 0xbe, 0x12, 0xb9, 0xc0, 0xa3, 0xd7, 0x75, 0x9c,
0xd4, 0xf4, 0x96, 0x71, 0x3b, 0x62, 0xc7, 0x63, 0x9d, 0x08, 0xbf, 0xbb, 0x9f, 0x14, 0x9c, 0x2b, 0xf3, 0xe4, 0x25, 0x34, 0xf4, 0x8e, 0x71, 0x7b, 0xc6, 0x76, 0xc7, 0xda, 0x13, 0x81, 0xd5, 0x4e,
0xc9, 0x07, 0x7c, 0xfb, 0x55, 0xa8, 0x41, 0x69, 0x3f, 0x13, 0xf1, 0x47, 0xe3, 0xe9, 0xea, 0x7f, 0x0a, 0x0f, 0x95, 0xe4, 0x03, 0xbe, 0xfb, 0x2a, 0xd2, 0xa0, 0x74, 0x90, 0x8b, 0xe4, 0xa3, 0xf1,
0x3c, 0x5d, 0xaa, 0x91, 0x07, 0x78, 0xd4, 0x4e, 0x01, 0x4f, 0x52, 0x4d, 0xaf, 0x1d, 0xe4, 0x76, 0x74, 0x72, 0x13, 0x4f, 0xc7, 0x6a, 0xe4, 0x1c, 0x9f, 0xf5, 0x53, 0xc0, 0xd3, 0x4c, 0xd3, 0x53,
0x83, 0xbf, 0x09, 0x32, 0xff, 0xc3, 0xce, 0x82, 0xe7, 0x40, 0x7b, 0x66, 0x97, 0x31, 0x3b, 0x3c, 0x17, 0x79, 0x56, 0x60, 0xfd, 0x6a, 0xcd, 0xfc, 0x4b, 0x93, 0xeb, 0xbf, 0x4c, 0xcd, 0x78, 0x01,
0x96, 0x35, 0x8f, 0x65, 0x8b, 0xe6, 0xb1, 0x7e, 0x6f, 0x6f, 0xf5, 0xcb, 0x0f, 0x1b, 0x05, 0x97, 0x74, 0x68, 0x36, 0x9a, 0xb2, 0xed, 0x7b, 0x59, 0xf7, 0x5e, 0x36, 0xeb, 0xde, 0x1b, 0x0c, 0x5b,
0xcd, 0xfe, 0xd3, 0xf5, 0xd6, 0x42, 0xdf, 0xb6, 0x16, 0xfa, 0xb9, 0xb5, 0xd0, 0xd7, 0x9d, 0x85, 0xc3, 0x5f, 0x7e, 0x38, 0x28, 0x3c, 0x6e, 0x0e, 0x9e, 0x2e, 0xd7, 0x36, 0xfa, 0xb6, 0xb6, 0xd1,
0xd6, 0x3b, 0x0b, 0xbd, 0xbf, 0xf7, 0xef, 0x9d, 0x64, 0x19, 0x47, 0x57, 0x66, 0xce, 0x93, 0xdf, 0xcf, 0xb5, 0x8d, 0xbe, 0x6e, 0x6c, 0xb4, 0xdc, 0xd8, 0xe8, 0xfd, 0x83, 0xff, 0x6f, 0x26, 0xab,
0x01, 0x00, 0x00, 0xff, 0xff, 0x84, 0x6f, 0xc9, 0xec, 0xaf, 0x02, 0x00, 0x00, 0x24, 0x3e, 0x31, 0x73, 0x9e, 0xfc, 0x09, 0x00, 0x00, 0xff, 0xff, 0xee, 0x3a, 0x76, 0xc2, 0xb5,
0x02, 0x00, 0x00,
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment