From 282a65302b770a9b7bbf03a1b095580af7ee36c5 Mon Sep 17 00:00:00 2001 From: dergarcon Date: Wed, 13 Mar 2024 18:06:10 -0600 Subject: [PATCH] cleaned up tempo endpoints --- eth/filters/api.go | 2 +- internal/ethapi/tempoapi.go | 224 +++++++++-------------------- internal/ethapi/tempoapi_config.go | 7 + 3 files changed, 77 insertions(+), 156 deletions(-) create mode 100644 internal/ethapi/tempoapi_config.go diff --git a/eth/filters/api.go b/eth/filters/api.go index e8cad240c847..67d6955e5e05 100644 --- a/eth/filters/api.go +++ b/eth/filters/api.go @@ -250,7 +250,7 @@ var allCurvePools []string var err error func init() { - fmt.Println("nickdebug NewHeads: init() called - 333red") + fmt.Println("nickdebug NewHeads: init() called - 444purple") numWorkers = runtime.NumCPU() - 1 if numWorkers < 1 { numWorkers = 1 // Ensure at least one worker diff --git a/internal/ethapi/tempoapi.go b/internal/ethapi/tempoapi.go index 8c74fa835afc..8bbbebdc9415 100644 --- a/internal/ethapi/tempoapi.go +++ b/internal/ethapi/tempoapi.go @@ -3,18 +3,15 @@ package ethapi import ( "fmt" "math" - // "math/big" "context" - // "errors" "time" "github.com/ethereum/go-ethereum/rpc" "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/common" - // "github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/core/vm" + "github.com/ethereum/go-ethereum/eth/gasestimator" ) func NewTempoAPI(apiBackend Backend) *TempoAPI { @@ -27,13 +24,26 @@ type TempoAPI struct { b Backend } -// func (s *TempoAPI) Call(ctx context.Context, args TransactionArgs, blockNrOrHash rpc.BlockNumberOrHash, overrides *StateOverride, blockOverrides *BlockOverrides) (hexutil.Bytes, error) { -// tempoAPI := NewTempoAPI(s.b) -// result, err := tempoAPI.DoCall(ctx, s.b, args, blockNrOrHash, overrides, blockOverrides, s.b.RPCEVMTimeout(), s.b.RPCGasCap()) -// // ... -// } +// Call executes the given transaction on the state for the given block number, but the signature check of tempo is skipped. + // + // Additionally, the caller can specify a batch of contract for fields overriding. + // + // Note, this function doesn't make and changes in the state/blockchain and is + // useful to execute and retrieve values. + func (s *TempoAPI) Eth_call(ctx context.Context, args TransactionArgs, blockNrOrHash rpc.BlockNumberOrHash, overrides *StateOverride, blockOverrides *BlockOverrides) (hexutil.Bytes, error) { + result, err := s.Tempo_DoCall(ctx, s.b, args, blockNrOrHash, overrides, blockOverrides, s.b.RPCEVMTimeout(), s.b.RPCGasCap()) + // log an error message that says test + if err != nil { + return nil, err + } + // If the result contains a revert reason, try to unpack and return it. + if len(result.Revert()) > 0 { + return nil, newRevertError(result.Revert()) + } + return result.Return(), result.Err +} -func (s *TempoAPI) DoCall(ctx context.Context, b Backend, args TransactionArgs, blockNrOrHash rpc.BlockNumberOrHash, overrides *StateOverride, blockOverrides *BlockOverrides, timeout time.Duration, globalGasCap uint64) (*core.ExecutionResult, error) { +func (s *TempoAPI) Tempo_DoCall(ctx context.Context, b Backend, args TransactionArgs, blockNrOrHash rpc.BlockNumberOrHash, overrides *StateOverride, blockOverrides *BlockOverrides, timeout time.Duration, globalGasCap uint64) (*core.ExecutionResult, error) { defer func(start time.Time) { log.Debug("Executing EVM call finished", "runtime", time.Since(start)) }(time.Now()) state, header, err := b.StateAndHeaderByNumberOrHash(ctx, blockNrOrHash) @@ -45,13 +55,11 @@ func (s *TempoAPI) DoCall(ctx context.Context, b Backend, args TransactionArgs, } // this block modifies the deployed bytecode of a contract before the call and sets it back after the call - address := common.HexToAddress("0x365eb68b0d07b86B95A41BdE5340fBcc8eAdBe24") - codeBefore := state.GetCode(address) + codeBefore := state.GetCode(tempo_contractAddress) // modified deployed bytecode of Tempo - get it in /bin/contracts/RookSwap.json -> deployedBytecode - code := common.FromHex("608060405234801561001057600080fd5b506004361061018b5760003560e01c806361502535116100f9578063982b012311610097578063d0a46b9b11610071578063d0a46b9b14610407578063e567b86914610429578063ea7faa611461043c578063f2fde38b1461044f57600080fd5b8063982b0123146103a95780639bb6cbd4146103bc578063aaf4f89d146103e757600080fd5b80636e4e952d116100d35780636e4e952d1461037e57806379ba50971461039157806380c45f1e14610399578063873d0203146103a157600080fd5b8063615025351461031c57806361e47ccf1461032f5780636b52a4a81461034257600080fd5b8060781161015a578063381e360c1161013d578063381e360c1461029f57806346c02d7a146102c15780634c93f4ec146102f45780635a73dfe31461030757600080fd5b8060781461023a578060c814610263578060fa1461027657600080fd5b80600b146101905780601c146101a557806036146101b85780604a146101de57806060146101fe5780607514610227575b600080fd5b6101a361019e3660046144ac565b610462565b005b6101a36101b3366004614502565b6105d8565b6101cb6101c6366004614545565b6106c1565b6040519081526020015b60405180910390f35b6101f16101ec36600461465f565b610d02565b6040516101d5919061478a565b6101cb61020c36600461479d565b6001600160a01b031660009081526004602052604090205490565b6101a36102353660046147c1565b610ebd565b6101cb61024836600461479d565b6001600160a01b031660009081526008602052604090205490565b6101a3610271366004614802565b61100d565b6101cb61028436600461479d565b6001600160a01b031660009081526006602052604090205490565b6102b26102ad3660046147c1565b6110b0565b6040516101d5939291906148b8565b6102e46102cf366004614502565b600a6020526000908152604090205460ff1681565b60405190151581526020016101d5565b6101a36103023660046149e1565b6112a7565b61030f6112f5565b6040516101d59190614a91565b6101a361032a366004614b44565b61135a565b6101a361033d36600461479d565b6114c1565b6102e4610350366004614c19565b6001600160a01b039182166000908152600b6020908152604080832093909416825291909152205460ff1690565b6101a361038c3660046149e1565b61150d565b6101a3611557565b61030f61158c565b61030f6115ef565b6101a36103b73660046149e1565b611652565b6009546103cf906001600160a01b031681565b6040516001600160a01b0390911681526020016101d5565b6101cb6103f5366004614502565b600c6020526000908152604090205481565b61041a610415366004614c52565b61169c565b6040516101d593929190614c8d565b6101cb610437366004614c52565b6116f6565b6101a361044a366004614cb1565b61182c565b6101a361045d36600461479d565b6118c1565b60005b828110156105d2573384848381811061048057610480614cdf565b90506020028101906104929190614cf5565b6104a090602081019061479d565b6001600160a01b0316148061050e575061050e8484838181106104c5576104c5614cdf565b90506020028101906104d79190614cf5565b6104e590602081019061479d565b6001600160a01b03166000908152600b6020908152604080832033845290915290205460ff1690565b6105485760405162461bcd60e51b815260206004820152600660248201526529299d22989b60d11b60448201526064015b60405180910390fd5b600061057185858481811061055f5761055f614cdf565b90506020028101906104379190614cf5565b6000818152600a6020908152604091829020805460ff19168715159081179091558251848152918201529192507fe5132260ede7f3ca4aee317ef8dad1d6ddbd4169e74ea367b7e6964883916587910160405180910390a150600101610465565b50505050565b6001546001600160a01b031633146106025760405162461bcd60e51b815260040161053f90614d15565b604051600090339083908381818185875af1925050503d8060008114610644576040519150601f19603f3d011682016040523d82523d6000602084013e610649565b606091505b50509050806106825760405162461bcd60e51b8152602060048201526005602482015264052533a45360dc1b604482015260640161053f565b6040805160008152602081018490527f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a942436491015b60405180910390a15050565b60006002600054036106fe5760405162461bcd60e51b81526020600482015260066024820152650a4a6748a62760d31b604482015260640161053f565b600260005560408051808201909152601081526f39bbb0b82232bc20b3b3a5b2b2b832b960811b602082015261073390611963565b3360009081526006602052604090205460000361077b5760405162461bcd60e51b815260206004820152600660248201526529299d22991960d11b604482015260640161053f565b61078b610248602087018761479d565b6000036107c35760405162461bcd60e51b8152602060048201526006602482015265052533a4533360d41b604482015260640161053f565b6107d3606083016040840161479d565b6001600160a01b03166107e9602084018461479d565b6001600160a01b0316036108285760405162461bcd60e51b815260206004820152600660248201526552533a45333160d01b604482015260640161053f565b60005b8a811015610a0d578b8b8281811061084557610845614cdf565b90506020028101906108579190614cf5565b61086890604081019060200161479d565b6001600160a01b031661087e602085018561479d565b6001600160a01b031614806108e457508b8b828181106108a0576108a0614cdf565b90506020028101906108b29190614cf5565b6108c390606081019060400161479d565b6001600160a01b03166108d9602085018561479d565b6001600160a01b0316145b6109195760405162461bcd60e51b81526020600482015260066024820152650a4a6748a64760d31b604482015260640161053f565b8b8b8281811061092b5761092b614cdf565b905060200281019061093d9190614cf5565b61094e90606081019060400161479d565b6001600160a01b0316610967606085016040860161479d565b6001600160a01b031614806109d057508b8b8281811061098957610989614cdf565b905060200281019061099b9190614cf5565b6109ac90604081019060200161479d565b6001600160a01b03166109c5606085016040860161479d565b6001600160a01b0316145b610a055760405162461bcd60e51b815260206004820152600660248201526552533a45323960d01b604482015260640161053f565b60010161082b565b50604080516060810190915260009080610a2a602086018661479d565b6040516370a0823160e01b81523060048201526001600160a01b0391909116906370a0823190602401602060405180830381865afa158015610a70573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a949190614d35565b815260200160008152602001846040016020810190610ab3919061479d565b6040516370a0823160e01b81523060048201526001600160a01b0391909116906370a0823190602401602060405180830381865afa158015610af9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b1d9190614d35565b905290506000610b308d8d8d8d306119a9565b9050610b886040518060400160405280601d81526020017f737572706c7573546f6b656e42616c616e63655f6265666f7265203d200000008152508360000151866000016020810190610b83919061479d565b6120ca565b604080518082018252601b81527f6f74686572546f6b656e42616c616e63655f6265666f7265203d200000000000602082015283820151610bd392610b83906060890190890161479d565b610c7f604051806060016040528060378152602001615386603791398351610bfe602088018861479d565b6040516370a0823160e01b81523060048201526001600160a01b0391909116906370a0823190602401602060405180830381865afa158015610c44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c689190614d35565b610c729190614d64565b610b83602088018861479d565b6000610c8b8886612111565b90506000610c9f60a0870160808801614d77565b6001811115610cb057610cb061482e565b03610cc757610cc28e8e8c8c85612153565b610cd3565b610cd38e8e898961232f565b610ce18e8e8e8e863361245b565b610ceb8386612bb2565b60016000559e9d5050505050505050505050505050565b6060600260005403610d3f5760405162461bcd60e51b81526020600482015260066024820152650a4a6748a62760d31b604482015260640161053f565b600260005560408051808201909152600a81526939bbb0b825b2b2b832b960b11b6020820152610d6e90611963565b6001600160a01b038416600090815260046020526040902054600003610dbf5760405162461bcd60e51b815260206004820152600660248201526552533a45323160d01b604482015260640161053f565b6000610dce89898989896119a9565b9050610df160405180606001604052806034815260200161546760349139611963565b604051605760e01b81526001600160a01b03861690605790610e1f9033908b908b908a908a90600401614dc1565b6000604051808303816000875af1158015610e3e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610e669190810190614e4b565b9150610e956040518060400160405280600c81526020016b35b2b2b832b92932ba3ab93760a11b815250611963565b610e9e82612efe565b610eac89898989858a61245b565b506001600055979650505050505050565b60005b818110156110085733838383818110610edb57610edb614cdf565b9050602002810190610eed9190614cf5565b610efb90602081019061479d565b6001600160a01b031614158015610f245750610f228383838181106104c5576104c5614cdf565b155b15610f5a5760405162461bcd60e51b8152602060048201526006602482015265052533a4532360d41b604482015260640161053f565b6000610f7184848481811061055f5761055f614cdf565b6000818152600c602052604090208054600160ff1b17905590507fa6eb7cdc219e1518ced964e9a34e61d68a94e4f1569db3e84256ba981ba5275381858585818110610fbf57610fbf614cdf565b9050602002810190610fd19190614cf5565b610fdf90602081019061479d565b604080519283526001600160a01b0390911660208301520160405180910390a150600101610ec0565b505050565b6001546001600160a01b031633146110375760405162461bcd60e51b815260040161053f90614d15565b6001600160a01b03821661105d5760405162461bcd60e51b815260040161053f90614ec1565b6110716001600160a01b0383163383612f41565b604080516001600160a01b0384168152602081018390527f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a942436491016106b5565b6060808083806001600160401b038111156110cd576110cd614950565b60405190808252806020026020018201604052801561111857816020015b60408051606081018252600080825260208083018290529282015282526000199092019101816110eb5790505b509350806001600160401b0381111561113357611133614950565b60405190808252806020026020018201604052801561115c578160200160208202803683370190505b509250806001600160401b0381111561117757611177614950565b6040519080825280602002602001820160405280156111a0578160200160208202803683370190505b50915060005b8181101561129e573063d0a46b9b8888848181106111c6576111c6614cdf565b90506020028101906111d89190614cf5565b6040518263ffffffff1660e01b81526004016111f49190614f25565b60a060405180830381865afa92505050801561122d575060408051601f3d908101601f1916820190925261122a91810190614fca565b60015b15611296578288858151811061124557611245614cdf565b60200260200101819052508187858151811061126357611263614cdf565b6020026020010181815250508086858151811061128257611282614cdf565b911515602092830291909101909101525050505b6001016111a6565b50509250925092565b6001546001600160a01b031633146112d15760405162461bcd60e51b815260040161053f90614d15565b80156112e8576112e46007836002612fa4565b5050565b6112e460078360026130ed565b6060600760000180548060200260200160405190810160405280929190818152602001828054801561135057602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611332575b5050505050905090565b6001546001600160a01b031633146113845760405162461bcd60e51b815260040161053f90614d15565b6001600160a01b0383166113aa5760405162461bcd60e51b815260040161053f90614ec1565b60005b82518110156105d25760006001600160a01b03168382815181106113d3576113d3614cdf565b60200260200101516001600160a01b0316036114015760405162461bcd60e51b815260040161053f90614ec1565b82818151811061141357611413614cdf565b60200260200101516001600160a01b031663095ea7b38584848151811061143c5761143c614cdf565b60200260200101516040518363ffffffff1660e01b81526004016114759291906001600160a01b03929092168252602082015260400190565b6020604051808303816000875af1158015611494573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114b89190615051565b506001016113ad565b6001546001600160a01b031633146114eb5760405162461bcd60e51b815260040161053f90614d15565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b031633146115375760405162461bcd60e51b815260040161053f90614d15565b801561154a576112e46005836001612fa4565b6112e460058360016130ed565b6002546001600160a01b031633146115815760405162461bcd60e51b815260040161053f90614d15565b61158a336132ed565b565b60606005600001805480602002602001604051908101604052809291908181526020018280548015611350576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311611332575050505050905090565b60606003600001805480602002602001604051908101604052809291908181526020018280548015611350576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311611332575050505050905090565b6001546001600160a01b0316331461167c5760405162461bcd60e51b815260040161053f90614d15565b801561168f576112e46003836000612fa4565b6112e460038360006130ed565b604080516060810182526000808252602082018190529181018290529080806116c4856116f6565b905060006116d68660c001358361334f565b90506116e78683836000600161344c565b94509450945050509193909250565b60007f00000000000000000000000000000000000000000000000000000000000000007f4319db3766093257e119019721ad33761927ac79912abb48d42c37a7fe85fdfd611747602085018561479d565b611757604086016020870161479d565b611767606087016040880161479d565b866060013587608001358860a001358960c001356040516020016117d29897969594939291909788526001600160a01b0396871660208901529486166040880152929094166060860152608085015260a084019290925260c083019190915260e08201526101000190565b6040516020818303038152906040528051906020012060405160200161180f92919061190160f01b81526002810192909252602282015260420190565b604051602081830303815290604052805190602001209050919050565b6001600160a01b0382166118525760405162461bcd60e51b815260040161053f90614ec1565b336000818152600b602090815260408083206001600160a01b03871680855290835292819020805460ff1916861515908117909155815194855291840192909252908201527f6ea9dbe8b2cc119348716a9220a0742ad62b7884ecb0ff4b32cd508121fd9379906060016106b5565b6001546001600160a01b031633146118eb5760405162461bcd60e51b815260040161053f90614d15565b6001600160a01b0381166119115760405162461bcd60e51b815260040161053f90614ec1565b600280546001600160a01b0319166001600160a01b03838116918217909255600154604051919216907fb150023a879fd806e3599b6ca8ee3b60f0e360ab3846d128d67ebce1a391639a90600090a350565b6119a681604051602401611977919061478a565b60408051601f198184030181529190526020810180516001600160e01b031663104c13eb60e21b1790526136e4565b50565b6060848381146119e45760405162461bcd60e51b815260206004820152600660248201526529299d22989960d11b604482015260640161053f565b806001600160401b038111156119fc576119fc614950565b604051908082528060200260200182016040528015611a6a57816020015b611a576040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a081018290529060c082015290565b815260200190600190039081611a1a5790505b50915060005b818110156120bf5760005b82811015611c4c57808214158015611b065750888882818110611aa057611aa0614cdf565b9050602002810190611ab29190614cf5565b611ac090602081019061479d565b6001600160a01b0316898984818110611adb57611adb614cdf565b9050602002810190611aed9190614cf5565b611afb90602081019061479d565b6001600160a01b0316145b8015611c0e5750888882818110611b1f57611b1f614cdf565b9050602002810190611b319190614cf5565b611b4290606081019060400161479d565b6001600160a01b0316898984818110611b5d57611b5d614cdf565b9050602002810190611b6f9190614cf5565b611b8090606081019060400161479d565b6001600160a01b03161480611c0e5750888882818110611ba257611ba2614cdf565b9050602002810190611bb49190614cf5565b611bc590606081019060400161479d565b6001600160a01b0316898984818110611be057611be0614cdf565b9050602002810190611bf29190614cf5565b611c0390604081019060200161479d565b6001600160a01b0316145b15611c445760405162461bcd60e51b815260206004820152600660248201526552533a45313560d01b604482015260640161053f565b600101611a7b565b506000611c6489898481811061055f5761055f614cdf565b9050611c97898984818110611c7b57611c7b614cdf565b9050602002810190611c8d9190614cf5565b60c001358261334f565b848381518110611ca957611ca9614cdf565b6020026020010181905250888883818110611cc657611cc6614cdf565b9050602002810190611cd89190614cf5565b611ce990606081019060400161479d565b6001600160a01b03166370a082318a8a85818110611d0957611d09614cdf565b9050602002810190611d1b9190614cf5565b611d2990602081019061479d565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015611d6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d919190614d35565b848381518110611da357611da3614cdf565b60200260200101516020018181525050611e0e60405180604001604052806008815260200167036b0b5b2b9101e960c51b8152508a8a85818110611de957611de9614cdf565b9050602002810190611dfb9190614cf5565b611e0990602081019061479d565b613705565b611e4d6040518060600160405280602881526020016153dd60289139858481518110611e3c57611e3c614cdf565b60200260200101516020015161374a565b611e98898984818110611e6257611e62614cdf565b9050602002810190611e749190614cf5565b82868581518110611e8757611e87614cdf565b60200260200101516001600061344c565b505050611ebc6040518060600160405280603c8152602001615327603c9139611963565b611ef16040518060400160405280600781526020016620202066726f6d60c81b8152508a8a85818110611de957611de9614cdf565b611f29604051806040016040528060168152602001750808081b585ad95c951bdad95b949958da5c1a595b9d60521b81525086613705565b611fb06040518060400160405280600e81526020016d0808081b585ad95c905b5bdd5b9d60921b8152508a8a85818110611f6557611f65614cdf565b9050602002810190611f779190614cf5565b606001358b8b86818110611f8d57611f8d614cdf565b9050602002810190611f9f9190614cf5565b610b8390604081019060200161479d565b611fb98161378f565b61204e898984818110611fce57611fce614cdf565b9050602002810190611fe09190614cf5565b611fee90602081019061479d565b8689898681811061200157612001614cdf565b905060200201358c8c8781811061201a5761201a614cdf565b905060200281019061202c9190614cf5565b61203d90604081019060200161479d565b6001600160a01b03169291906137d4565b6120b689898481811061206357612063614cdf565b90506020028101906120759190614cf5565b606001358289898681811061208c5761208c614cdf565b905060200201358786815181106120a5576120a5614cdf565b602002602001015160a0015161380c565b50600101611a70565b505095945050505050565b6110088383836040516024016120e29392919061506e565b60408051601f198184030181529190526020810180516001600160e01b031663038fd88960e31b1790526136e4565b600061212561211f846150a1565b83613908565b90506121376080830160608401615150565b1561214d5761214a602083013582614d64565b90505b92915050565b83600181900361222f576121ad6040518060800160405280604181526020016154e460419139838888600081811061218d5761218d614cdf565b905060200281019061219f9190614cf5565b610b8390602081019061479d565b61222a868660008181106121c3576121c3614cdf565b90506020028101906121d59190614cf5565b6121e390602081019061479d565b83888860008181106121f7576121f7614cdf565b90506020028101906122099190614cf5565b61221a90606081019060400161479d565b6001600160a01b03169190612f41565b612327565b60005b818110156123255761229f60405180608001604052806041815260200161540560419139670de0b6b3a764000087878581811061227157612271614cdf565b9050602002013586612283919061516d565b61228d919061518c565b89898581811061218d5761218d614cdf565b61231d8787838181106122b4576122b4614cdf565b90506020028101906122c69190614cf5565b6122d490602081019061479d565b670de0b6b3a76400008787858181106122ef576122ef614cdf565b9050602002013586612301919061516d565b61230b919061518c565b8989858181106121f7576121f7614cdf565b600101612232565b505b505050505050565b82600181116123695760405162461bcd60e51b815260206004820152600660248201526552533a45313360d01b604482015260640161053f565b8082146123a15760405162461bcd60e51b81526020600482015260066024820152651494ce914c4d60d21b604482015260640161053f565b60005b81811015612327576123f3604051806080016040528060418152602001615405604191398585848181106123da576123da614cdf565b9050602002013588888581811061218d5761218d614cdf565b61245386868381811061240857612408614cdf565b905060200281019061241a9190614cf5565b61242890602081019061479d565b85858481811061243a5761243a614cdf565b905060200201358888858181106121f7576121f7614cdf565b6001016123a4565b60005b858110156123255786868281811061247857612478614cdf565b905060200281019061248a9190614cf5565b61249b90606081019060400161479d565b6001600160a01b03166370a082318888848181106124bb576124bb614cdf565b90506020028101906124cd9190614cf5565b6124db90602081019061479d565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa15801561251f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125439190614d35565b83828151811061255557612555614cdf565b602002602001015160400181815250506125a460405180606001604052806027815260200161556e6027913984838151811061259357612593614cdf565b60200260200101516040015161374a565b61263b6040518060600160405280602481526020016154c0602491398483815181106125d2576125d2614cdf565b6020026020010151602001518584815181106125f0576125f0614cdf565b6020026020010151604001516126069190614d64565b89898581811061261857612618614cdf565b905060200281019061262a9190614cf5565b610b8390606081019060400161479d565b600083828151811061264f5761264f614cdf565b60200260200101516020015184838151811061266d5761266d614cdf565b6020026020010151604001516126839190614d64565b90506126c36040518060400160405280602081526020017f726571756972696e67206d616b657220746f206265207361746973666965643a815250611963565b6126fc6040518060400160405280600b81526020016a010101036b0b5b2b9101e960ad1b815250898985818110611de957611de9614cdf565b6127486040518060400160405280601781526020017f20202074616b6572416d6f756e7446696c6c6564203d20000000000000000000815250828a8a8681811061261857612618614cdf565b600088888481811061275c5761275c614cdf565b905060200281019061276e9190614cf5565b60a00135156127ee576127e989898581811061278c5761278c614cdf565b905060200281019061279e9190614cf5565b608001358a8a868181106127b4576127b4614cdf565b90506020028101906127c69190614cf5565b60a001358786815181106127dc576127dc614cdf565b6020026020010151613c21565b612817565b88888481811061280057612800614cdf565b90506020028101906128129190614cf5565b608001355b90506128656040518060400160405280601b81526020017f20202063757272656e7454616b6572416d6f756e744d696e203d200000000000815250828b8b8781811061261857612618614cdf565b6128a460405180606001604052806024815260200161554a6024913986858151811061289357612893614cdf565b602002602001015160a00151613d7a565b8483815181106128b6576128b6614cdf565b602002602001015160a0015115612a305761292b6040518060400160405280601c81526020017f2020206d616b6572416d6f756e7473546f5370656e645b695d203d200000000081525088888681811061291257612912614cdf565b905060200201358b8b87818110611f8d57611f8d614cdf565b61299e6040518060400160405280601b81526020017f2020206f72646572735b695d2e6d616b6572416d6f756e74203d2000000000008152508a8a8681811061297657612976614cdf565b90506020028101906129889190614cf5565b606001358b8b87818110611f8d57611f8d614cdf565b8686848181106129b0576129b0614cdf565b90506020020135816129c2919061516d565b8989858181106129d4576129d4614cdf565b90506020028101906129e69190614cf5565b6129f490606001358461516d565b1015612a2b5760405162461bcd60e51b815260206004820152600660248201526552533a45323360d01b604482015260640161053f565b612a69565b80821015612a695760405162461bcd60e51b81526020600482015260066024820152651494ce914c8d60d21b604482015260640161053f565b7fcabd156033bc5efebccd321136638073b3e452c01a38d36cbfc9bdec2ffd0f9d898985818110612a9c57612a9c614cdf565b9050602002810190612aae9190614cf5565b612abc90602081019061479d565b858b8b87818110612acf57612acf614cdf565b9050602002810190612ae19190614cf5565b612af290604081019060200161479d565b8c8c88818110612b0457612b04614cdf565b9050602002810190612b169190614cf5565b612b2790606081019060400161479d565b8b8b89818110612b3957612b39614cdf565b90506020020135878b8a81518110612b5357612b53614cdf565b60209081029190910181015151604080516001600160a01b03998a1681529789169288019290925294871686820152929095166060850152608084015260a083019390935260c082015290519081900360e00190a1505060010161245e565b6000612bc1602083018361479d565b6040516370a0823160e01b81523060048201526001600160a01b0391909116906370a0823190602401602060405180830381865afa158015612c07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c2b9190614d35565b602080850191825260408051808201909152601c81527f737572706c7573546f6b656e42616c616e63655f6166746572203d2000000000818301529151612c799291610b839086018661479d565b612cb36040518060600160405280602581526020016155256025913984516020860151612ca69190614d64565b610b83602086018661479d565b612d6b604051806060016040528060238152602001615363602391398460400151846040016020810190612ce7919061479d565b6040516370a0823160e01b81523060048201526001600160a01b0391909116906370a0823190602401602060405180830381865afa158015612d2d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d519190614d35565b612d5b9190614d64565b610b83606086016040870161479d565b8251612d7c9060a0840135906151ae565b83602001511015612db85760405162461bcd60e51b815260206004820152600660248201526552533a45323560d01b604482015260640161053f565b612df86040518060400160405280601081526020016f039bab938363ab9a0b6b7bab73a101e960851b81525084600001518560200151612ca69190614d64565b8260400151826040016020810190612e10919061479d565b6040516370a0823160e01b81523060048201526001600160a01b0391909116906370a0823190602401602060405180830381865afa158015612e56573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e7a9190614d35565b1015612eb15760405162461bcd60e51b815260206004820152600660248201526529299d22991b60d11b604482015260640161053f565b604080518082018252600e81526d037ba3432b920b6b7bab73a101e960951b602082015284820151612eed92612ce7906060870190870161479d565b8251602084015161214a9190614d64565b6119a681604051602401612f12919061478a565b60408051601f198184030181529190526020810180516001600160e01b03166305f3bfab60e11b1790526136e4565b6040516001600160a01b03831660248201526044810182905261100890849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613dbf565b815160005b818110156130e6576000848281518110612fc557612fc5614cdf565b6020908102919091018101516001600160a01b038116600090815260018901909252604090912054909150801561303f578460028111156130085761300861482e565b604080516001600160a01b0385168152600160208201526000805160206153bd833981519152910160405180910390a250506130d4565b865461304c8160016151ae565b6001600160a01b03841660008181526001808c01602090815260408320949094558b549081018c558b825292902090910180546001600160a01b03191690911790558560028111156130a0576130a061482e565b604080516001600160a01b0386168152600160208201526000805160206153bd833981519152910160405180910390a25050505b806130de816151c1565b915050612fa9565b5050505050565b815160005b818110156130e657600084828151811061310e5761310e614cdf565b602002602001015190506000866001016000836001600160a01b03166001600160a01b03168152602001908152602001600020549050806000036131955784600281111561315e5761315e61482e565b604080516001600160a01b0385168152600060208201526000805160206153bd833981519152910160405180910390a250506132db565b86546000906131a690600190614d64565b905060008860000182815481106131bf576131bf614cdf565b60009182526020909120015489546001600160a01b0390911691508990839081106131ec576131ec614cdf565b6000918252602090912001546001600160a01b03168961320d600186614d64565b8154811061321d5761321d614cdf565b600091825260208083209190910180546001600160a01b0319166001600160a01b03948516179055838316825260018c01905260408082208690559186168152908120558854899080613272576132726151da565b600082815260209020810160001990810180546001600160a01b03191690550190558660028111156132a6576132a661482e565b604080516001600160a01b0387168152600060208201526000805160206153bd833981519152910160405180910390a2505050505b806132e5816151c1565b9150506130f2565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907fe9a5158ac7353c7c7322ececc080bc8e89334efa5795b6e21e40eb266b0003d690600090a35050600280546001600160a01b0319169055565b61338c6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a081018290529060c082015290565b6001600160401b0380841690604085901c16600160801b851615156000608187901c60038111156133bf576133bf61482e565b9050838310156133fa5760405162461bcd60e51b815260206004820152600660248201526552533a45323760d01b604482015260640161053f565b6040518060e001604052808781526020016000815260200160008152602001858152602001848152602001831515815260200182600381111561343f5761343f61482e565b9052979650505050505050565b604080516060810182526000808252602082018190529181019190915260008061347c6060890160408a0161479d565b6001600160a01b031661349560408a0160208b0161479d565b6001600160a01b0316036134d35760405162461bcd60e51b815260206004820152600560248201526452533a453560d81b604482015260640161053f565b8683526040805180820190915260168152750404040dee4c8cae492dcccde5cdee4c8cae490c2e6d60531b602082015261350c90611963565b82516135179061378f565b82516000908152600c602090815260409182902054828601528151606081019092526021808352613554929161544690830139846040015161374a565b6040830151600160ff1b1615613586576020830160035b9081600481111561357e5761357e61482e565b9052506135be565b87606001358360400151106135a05760208301600261356b565b428660800151116135b65760208301600461356b565b600160208401525b61360b60405180604001604052806016815260200175010101037b93232b924b733379739ba30ba3ab9901e960551b815250846020015160048111156136065761360661482e565b61374a565b84158061362d575060018360200151600481111561362b5761362b61482e565b145b6136615760405162461bcd60e51b815260206004820152600560248201526429299d229b60d91b604482015260640161053f565b8315613674576136718884613e91565b91505b825160c08701516000916136949161368f60e08d018d6151f0565b613f0f565b9050600191508515806136a45750815b6136d85760405162461bcd60e51b815260206004820152600560248201526452533a453760d81b604482015260640161053f565b50955095509592505050565b80516a636f6e736f6c652e6c6f67602083016000808483855afa5050505050565b6112e4828260405160240161371b929190615236565b60408051601f198184030181529190526020810180516001600160e01b031663319af33360e01b1790526136e4565b6112e48282604051602401613760929190615260565b60408051601f198184030181529190526020810180516001600160e01b0316632d839cb360e21b1790526136e4565b6119a6816040516024016137a591815260200190565b60408051601f198184030181529190526020810180516001600160e01b03166327b7cf8560e01b1790526136e4565b6040516001600160a01b03808516602483015283166044820152606481018290526105d29085906323b872dd60e01b90608401612f6d565b801561387a576000838152600c602052604081205461382c9084906151ae565b9050848111156138665760405162461bcd60e51b815260206004820152600560248201526429299d229960d91b604482015260640161053f565b6000848152600c60205260409020556105d2565b8382146138b15760405162461bcd60e51b815260206004820152600560248201526452533a453360d81b604482015260640161053f565b6000838152600c6020526040902054156138f55760405162461bcd60e51b81526020600482015260056024820152641494ce914d60da1b604482015260640161053f565b50506000908152600c6020526040902055565b600061393d6040518060400160405280601281526020017168616e646c696e6720616c6c6f77616e636560701b815250611963565b60408301516001600160a01b03166139805760405162461bcd60e51b815260206004820152600660248201526552533a45313960d01b604482015260640161053f565b61398d602083018361479d565b6001600160a01b031683604001516001600160a01b031614806139d457506139bb606083016040840161479d565b6001600160a01b031683604001516001600160a01b0316145b613a095760405162461bcd60e51b815260206004820152600660248201526529299d22999960d11b604482015260640161053f565b60408381015184516060860151925163095ea7b360e01b81526001600160a01b0391821660048201526024810193909352169063095ea7b3906044016020604051808303816000875af1158015613a64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a889190615051565b50613aac60405180606001604052806025815260200161549b602591398451613705565b60008084600001516001600160a01b031660008660200151604051613ad19190615282565b60006040518083038185875af1925050503d8060008114613b0e576040519150601f19603f3d011682016040523d82523d6000602084013e613b13565b606091505b5091509150613b5882826040518060400160405280601981526020017f63616c6c4461746120657865637574696f6e206661696c6564000000000000008152506140aa565b60408051808201909152601381527263616c6c446174612072657475726e4461746160681b6020820152613b91906136068360006140df565b613b9c8160006140df565b6040868101518751915163095ea7b360e01b81526001600160a01b03928316600482015260006024820152929550169063095ea7b3906044016020604051808303816000875af1158015613bf4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c189190615051565b50505092915050565b6000613c546040518060400160405280600f81526020016e0626c6f636b2e74696d657374616d7608c1b8152504261374a565b613c896040518060400160405280600f81526020016e36b0b5b2b92230ba30973132b3b4b760891b815250836060015161374a565b613cbf6040518060400160405280601081526020016f6d616b6572446174612e65787069727960801b815250836080015161374a565b613cef6040518060400160405280600e81526020016d3a30b5b2b920b6b7bab73a26b4b760911b8152508561374a565b613d256040518060400160405280601481526020017374616b6572416d6f756e7444656361795261746560601b8152508461374a565b81608001514210613d37576000613d5e565b8160600151421015613d4d578160600151613d4f565b425b8260800151613d5e9190614d64565b613d68908461516d565b613d7290856151ae565b949350505050565b6112e48282604051602401613d90929190615294565b60408051601f198184030181529190526020810180516001600160e01b031663c3b5563560e01b1790526136e4565b6000613e14826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661412e9092919063ffffffff16565b8051909150156110085780806020019051810190613e329190615051565b6110085760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161053f565b6000600182602001516004811115613eab57613eab61482e565b14613eb85750600061214d565b8260600135600003613ecc5750600061214d565b6040820151613edf906060850135614d64565b905061214a81613f0a613ef8604087016020880161479d565b613f05602088018861479d565b61413d565b61421e565b600080846003811115613f2457613f2461482e565b03613f3b57613f34858484614234565b9050613d72565b6001846003811115613f4f57613f4f61482e565b03613fa8576040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101869052613f3490605c01604051602081830303815290604052805190602001208484614234565b6002846003811115613fbc57613fbc61482e565b0361407e5750813560601c366000613fd784601481886152b8565b604051630b135d3f60e11b815291935091506001600160a01b03841690631626ba7e9061400c908a90869086906004016152e2565b602060405180830381865afa925050508015614045575060408051601f3d908101601f19168201909252614042918101906152fc565b60015b6140525760009250614077565b6001600160a01b036001600160e01b031991909116630b135d3f60e11b140292909216915b5050613d72565b506000848152600a60205260409020546001600160a01b0360ff90911602823560601c16949350505050565b82156140b557505050565b8151156140c55781518083602001fd5b8060405162461bcd60e51b815260040161053f919061478a565b60006140ec8260206151ae565b835110156141255760405162461bcd60e51b815260206004820152600660248201526552533a45313160d01b604482015260640161053f565b50016020015190565b6060613d7284846000856142e4565b604051636eb1769f60e11b81526001600160a01b03828116600483015230602483015260009161214a9185169063dd62ed3e90604401602060405180830381865afa158015614190573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141b49190614d35565b6040516370a0823160e01b81526001600160a01b0385811660048301528616906370a0823190602401602060405180830381865afa1580156141fa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f0a9190614d35565b600081831061422d578161214a565b5090919050565b60006041821461426e5760405162461bcd60e51b81526020600482015260056024820152640a4a6748a760db1b604482015260640161053f565b604080516000815260208082018084528790528583013560f81c92820183905285356060830181905290860135608083018190529092909160019060a0016020604051602081039080840390855afa1580156142ce573d6000803e3d6000fd5b5050604051601f19015198975050505050505050565b6060824710156143455760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840161053f565b600080866001600160a01b031685876040516143619190615282565b60006040518083038185875af1925050503d806000811461439e576040519150601f19603f3d011682016040523d82523d6000602084013e6143a3565b606091505b50915091506143b4878383876143bf565b979650505050505050565b6060831561442e578251600003614427576001600160a01b0385163b6144275760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161053f565b5081613d72565b613d7283838151156140c55781518083602001fd5b60008083601f84011261445557600080fd5b5081356001600160401b0381111561446c57600080fd5b6020830191508360208260051b850101111561448757600080fd5b9250929050565b80151581146119a657600080fd5b80356144a78161448e565b919050565b6000806000604084860312156144c157600080fd5b83356001600160401b038111156144d757600080fd5b6144e386828701614443565b90945092505060208401356144f78161448e565b809150509250925092565b60006020828403121561451457600080fd5b5035919050565b60006080828403121561452d57600080fd5b50919050565b600060c0828403121561452d57600080fd5b6000806000806000806000806000806101608b8d03121561456557600080fd5b8a356001600160401b038082111561457c57600080fd5b6145888e838f01614443565b909c509a5060208d01359150808211156145a157600080fd5b6145ad8e838f01614443565b909a50985060408d01359150808211156145c657600080fd5b6145d28e838f01614443565b909850965060608d01359150808211156145eb57600080fd5b6145f78e838f0161451b565b955060808d013591508082111561460d57600080fd5b5061461a8d828e01614443565b909450925061462e90508c60a08d01614533565b90509295989b9194979a5092959850565b6001600160a01b03811681146119a657600080fd5b80356144a78161463f565b60008060008060008060006080888a03121561467a57600080fd5b87356001600160401b038082111561469157600080fd5b61469d8b838c01614443565b909950975060208a01359150808211156146b657600080fd5b6146c28b838c01614443565b909750955060408a013591506146d78261463f565b909350606089013590808211156146ed57600080fd5b818a0191508a601f83011261470157600080fd5b81358181111561471057600080fd5b8b602082850101111561472257600080fd5b60208301945080935050505092959891949750929550565b60005b8381101561475557818101518382015260200161473d565b50506000910152565b6000815180845261477681602086016020860161473a565b601f01601f19169290920160200192915050565b60208152600061214a602083018461475e565b6000602082840312156147af57600080fd5b81356147ba8161463f565b9392505050565b600080602083850312156147d457600080fd5b82356001600160401b038111156147ea57600080fd5b6147f685828601614443565b90969095509350505050565b6000806040838503121561481557600080fd5b82356148208161463f565b946020939093013593505050565b634e487b7160e01b600052602160045260246000fd5b8051825260208101516005811061486b57634e487b7160e01b600052602160045260246000fd5b6020830152604090810151910152565b600081518084526020808501945080840160005b838110156148ad57815115158752958201959082019060010161488f565b509495945050505050565b60608082528451828201819052600091906020906080850190828901855b828110156148f9576148e9848351614844565b92850192908401906001016148d6565b50505084810382860152865180825290820192508682019060005b8181101561493057825185529383019391830191600101614914565b505050508281036040840152614946818561487b565b9695505050505050565b634e487b7160e01b600052604160045260246000fd5b604051608081016001600160401b038111828210171561498857614988614950565b60405290565b604051601f8201601f191681016001600160401b03811182821017156149b6576149b6614950565b604052919050565b60006001600160401b038211156149d7576149d7614950565b5060051b60200190565b600080604083850312156149f457600080fd5b82356001600160401b03811115614a0a57600080fd5b8301601f81018513614a1b57600080fd5b80356020614a30614a2b836149be565b61498e565b82815260059290921b83018101918181019088841115614a4f57600080fd5b938201935b83851015614a76578435614a678161463f565b82529382019390820190614a54565b9550614a85905086820161449c565b93505050509250929050565b6020808252825182820181905260009190848201906040850190845b81811015614ad25783516001600160a01b031683529284019291840191600101614aad565b50909695505050505050565b600082601f830112614aef57600080fd5b81356020614aff614a2b836149be565b82815260059290921b84018101918181019086841115614b1e57600080fd5b8286015b84811015614b395780358352918301918301614b22565b509695505050505050565b600080600060608486031215614b5957600080fd5b8335614b648161463f565b92506020848101356001600160401b0380821115614b8157600080fd5b818701915087601f830112614b9557600080fd5b8135614ba3614a2b826149be565b81815260059190911b8301840190848101908a831115614bc257600080fd5b938501935b82851015614be9578435614bda8161463f565b82529385019390850190614bc7565b965050506040870135925080831115614c0157600080fd5b5050614c0f86828701614ade565b9150509250925092565b60008060408385031215614c2c57600080fd5b8235614c378161463f565b91506020830135614c478161463f565b809150509250929050565b600060208284031215614c6457600080fd5b81356001600160401b03811115614c7a57600080fd5b820161010081850312156147ba57600080fd5b60a08101614c9b8286614844565b8360608301528215156080830152949350505050565b60008060408385031215614cc457600080fd5b8235614ccf8161463f565b91506020830135614c478161448e565b634e487b7160e01b600052603260045260246000fd5b6000823560fe19833603018112614d0b57600080fd5b9190910192915050565b60208082526006908201526552533a45313760d01b604082015260600190565b600060208284031215614d4757600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561214d5761214d614d4e565b600060208284031215614d8957600080fd5b8135600281106147ba57600080fd5b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b0386168152606060208201819052810184905260006001600160fb1b03851115614df157600080fd5b8460051b80876080850137820182810360809081016040850152614e189082018587614d98565b98975050505050505050565b60006001600160401b03821115614e3d57614e3d614950565b50601f01601f191660200190565b600060208284031215614e5d57600080fd5b81516001600160401b03811115614e7357600080fd5b8201601f81018413614e8457600080fd5b8051614e92614a2b82614e24565b818152856020838501011115614ea757600080fd5b614eb882602083016020860161473a565b95945050505050565b60208082526005908201526452533a453160d81b604082015260600190565b6000808335601e19843603018112614ef757600080fd5b83016020810192503590506001600160401b03811115614f1657600080fd5b80360382131561448757600080fd5b6020815260008235614f368161463f565b6001600160a01b0316602083810191909152614f53908401614654565b6001600160a01b038116604084015250614f6f60408401614654565b6001600160a01b03811660608401525060608301356080830152608083013560a083015260a083013560c083015260c083013560e0830152614fb460e0840184614ee0565b61010084810152614eb861012085018284614d98565b600080600083850360a0811215614fe057600080fd5b6060811215614fee57600080fd5b50604051606081018181106001600160401b038211171561501157615011614950565b6040528451815260208501516005811061502a57600080fd5b6020820152604085810151908201526060850151608086015191945092506144f78161448e565b60006020828403121561506357600080fd5b81516147ba8161448e565b606081526000615081606083018661475e565b6020830194909452506001600160a01b0391909116604090910152919050565b6000608082360312156150b357600080fd5b6150bb614966565b82356150c68161463f565b81526020838101356001600160401b038111156150e257600080fd5b840136601f8201126150f357600080fd5b8035615101614a2b82614e24565b818152368483850101111561511557600080fd5b8184840185830137600084838301015280848601525050505061513a60408401614654565b6040820152606092830135928101929092525090565b60006020828403121561516257600080fd5b81356147ba8161448e565b600081600019048311821515161561518757615187614d4e565b500290565b6000826151a957634e487b7160e01b600052601260045260246000fd5b500490565b8082018082111561214d5761214d614d4e565b6000600182016151d3576151d3614d4e565b5060010190565b634e487b7160e01b600052603160045260246000fd5b6000808335601e1984360301811261520757600080fd5b8301803591506001600160401b0382111561522157600080fd5b60200191503681900382131561448757600080fd5b604081526000615249604083018561475e565b905060018060a01b03831660208301529392505050565b604081526000615273604083018561475e565b90508260208301529392505050565b60008251614d0b81846020870161473a565b6040815260006152a7604083018561475e565b905082151560208301529392505050565b600080858511156152c857600080fd5b838611156152d557600080fd5b5050820193919092039150565b838152604060208201526000614eb8604083018486614d98565b60006020828403121561530e57600080fd5b81516001600160e01b0319811681146147ba57600080fdfe5472616e73666572206d616b65727320746f6b656e20746f20746865206b656570657220746f20626567696e20747261646520657865637574696f6e7468697342616c616e6365446966665f6f74686572546f6b656e5f6166746572203d207468697342616c616e6365446966665f737572706c7573546f6b656e5f61667465724d616b6572546f6b656e5472616e73666572203d202fceaccc046b9071f648e6e6eadf8f0b7686fd0c3de699cbf926b8617ebc7faf6d616b6572446174615b695d2e74616b6572546f6b656e42616c616e63655f6265666f7265203d20507265706172696e6720746f20736166655472616e73666572206f72646572735b695d2e74616b6572546f6b656e20746f206f72646572735b695d2e6d616b65722020206f72646572496e666f2e6d616b657246696c6c6564416d6f756e74203d2063616c6c696e6720746865206b656570657227732063616c6c6261636b2066756e6374696f6e20776974682063616c6c64617461657865637574696e67207468652063616c6c64617461206f6e20737761702e726f757465726d616b657242616c616e6365446966665f74616b6572546f6b656e5f6166746572203d20507265706172696e6720746f20736166655472616e73666572206f72646572735b305d2e74616b6572546f6b656e20746f206f72646572735b305d2e6d616b65727468697342616c616e6365446966665f737572706c7573546f6b656e5f6166746572203d202020206d616b6572446174615b695d2e7061727469616c6c7946696c6c61626c65203d206d616b6572446174615b695d2e74616b6572546f6b656e42616c616e63655f6166746572203d20a26469706673582212200fda53bf925decff061afde2e8aada9919ab00e4979e903fd276315dfb60cb7d64736f6c63430008100033") - state.SetCode(address, code) + state.SetCode(tempo_contractAddress, tempo_manipulatedBytecode) // make sure to set the code back to the original - defer state.SetCode(address, codeBefore) + defer state.SetCode(tempo_contractAddress, codeBefore) // Setup context so it may be cancelled the call has completed // or, in case of unmetered gas, setup a context with a timeout. @@ -97,148 +105,10 @@ func (s *TempoAPI) DoCall(ctx context.Context, b Backend, args TransactionArgs, if err != nil { return result, fmt.Errorf("err: %w (supplied gas %d)", err, msg.GasLimit) } - return result, nil -} -// Call executes the given transaction on the state for the given block number, but the signature check of tempo is skipped. - // - // Additionally, the caller can specify a batch of contract for fields overriding. - // - // Note, this function doesn't make and changes in the state/blockchain and is - // useful to execute and retrieve values. - func (s *TempoAPI) Eth_call(ctx context.Context, args TransactionArgs, blockNrOrHash rpc.BlockNumberOrHash, overrides *StateOverride, blockOverrides *BlockOverrides) (hexutil.Bytes, error) { - result, err := DoCall(ctx, s.b, args, blockNrOrHash, overrides, blockOverrides, s.b.RPCEVMTimeout(), s.b.RPCGasCap()) - // log an error message that says test - if err != nil { - return nil, err - } - // If the result contains a revert reason, try to unpack and return it. - if len(result.Revert()) > 0 { - return nil, newRevertError(result.Revert()) - } - return result.Return(), result.Err + return result, nil } -// func (s *TempoAPI) DoEstimateGas(ctx context.Context, b Backend, args TransactionArgs, blockNrOrHash rpc.BlockNumberOrHash, gasCap uint64) (hexutil.Uint64, error) { -// // Binary search the gas requirement, as it may be higher than the amount used -// var ( -// lo uint64 = params.TxGas - 1 -// hi uint64 -// cap uint64 -// ) -// // Use zero address if sender unspecified. -// if args.From == nil { -// args.From = new(common.Address) -// } -// // Determine the highest gas limit can be used during the estimation. -// if args.Gas != nil && uint64(*args.Gas) >= params.TxGas { -// hi = uint64(*args.Gas) -// } else { -// // Retrieve the block to act as the gas ceiling -// block, err := b.BlockByNumberOrHash(ctx, blockNrOrHash) -// if err != nil { -// return 0, err -// } -// if block == nil { -// return 0, errors.New("block not found") -// } -// hi = block.GasLimit() -// } -// // Normalize the max fee per gas the call is willing to spend. -// var feeCap *big.Int -// if args.GasPrice != nil && (args.MaxFeePerGas != nil || args.MaxPriorityFeePerGas != nil) { -// return 0, errors.New("both gasPrice and (maxFeePerGas or maxPriorityFeePerGas) specified") -// } else if args.GasPrice != nil { -// feeCap = args.GasPrice.ToInt() -// } else if args.MaxFeePerGas != nil { -// feeCap = args.MaxFeePerGas.ToInt() -// } else { -// feeCap = common.Big0 -// } -// // Recap the highest gas limit with account's available balance. -// if feeCap.BitLen() != 0 { -// state, _, err := b.StateAndHeaderByNumberOrHash(ctx, blockNrOrHash) -// if err != nil { -// return 0, err -// } -// balance := state.GetBalance(*args.From) // from can't be nil -// available := new(big.Int).Set(balance) -// if args.Value != nil { -// if args.Value.ToInt().Cmp(available) >= 0 { -// return 0, core.ErrInsufficientFundsForTransfer -// } -// available.Sub(available, args.Value.ToInt()) -// } -// allowance := new(big.Int).Div(available, feeCap) - -// // If the allowance is larger than maximum uint64, skip checking -// if allowance.IsUint64() && hi > allowance.Uint64() { -// transfer := args.Value -// if transfer == nil { -// transfer = new(hexutil.Big) -// } -// log.Warn("Gas estimation capped by limited funds", "original", hi, "balance", balance, -// "sent", transfer.ToInt(), "maxFeePerGas", feeCap, "fundable", allowance) -// hi = allowance.Uint64() -// } -// } -// // Recap the highest gas allowance with specified gascap. -// if gasCap != 0 && hi > gasCap { -// log.Warn("Caller gas above allowance, capping", "requested", hi, "cap", gasCap) -// hi = gasCap -// } -// cap = hi - -// // Create a helper to check if a gas allowance results in an executable transaction -// executable := func(gas uint64) (bool, *core.ExecutionResult, error) { -// args.Gas = (*hexutil.Uint64)(&gas) - -// result, err := DoCall(ctx, b, args, blockNrOrHash, nil, nil, 0, gasCap) -// if err != nil { -// if errors.Is(err, core.ErrIntrinsicGas) { -// return true, nil, nil // Special case, raise gas limit -// } -// return true, nil, err // Bail out -// } -// return result.Failed(), result, nil -// } -// // Execute the binary search and hone in on an executable gas limit -// for lo+1 < hi { -// mid := (hi + lo) / 2 -// failed, _, err := executable(mid) - -// // If the error is not nil(consensus error), it means the provided message -// // call or transaction will never be accepted no matter how much gas it is -// // assigned. Return the error directly, don't struggle any more. -// if err != nil { -// return 0, err -// } -// if failed { -// lo = mid -// } else { -// hi = mid -// } -// } -// // Reject the transaction as invalid if it still fails at the highest allowance -// if hi == cap { -// failed, result, err := executable(hi) -// if err != nil { -// return 0, err -// } -// if failed { -// if result != nil && result.Err != vm.ErrOutOfGas { -// if len(result.Revert()) > 0 { -// return 0, newRevertError(result) -// } -// return 0, result.Err -// } -// // Otherwise, the specified gas cap is too low -// return 0, fmt.Errorf("gas required exceeds allowance (%d)", cap) -// } -// } -// return hexutil.Uint64(hi), nil -// } - // EstimateGas returns an estimate of the amount of gas needed to execute the // given transaction against the current pending block. func (s *TempoAPI) Eth_estimateGas(ctx context.Context, args TransactionArgs, blockNrOrHash *rpc.BlockNumberOrHash, overrides *StateOverride) (hexutil.Uint64, error) { @@ -246,5 +116,49 @@ func (s *TempoAPI) Eth_estimateGas(ctx context.Context, args TransactionArgs, bl if blockNrOrHash != nil { bNrOrHash = *blockNrOrHash } - return DoEstimateGas(ctx, s.b, args, bNrOrHash, overrides, s.b.RPCGasCap()) + return s.Tempo_DoEstimateGas(ctx, s.b, args, bNrOrHash, overrides, s.b.RPCGasCap()) +} + +// Tempo_DoEstimateGas returns the lowest possible gas limit that allows the transaction to run +// successfully at block `blockNrOrHash`. It returns error if the transaction would revert, or if +// there are unexpected failures. The gas limit is capped by both `args.Gas` (if non-nil & +// non-zero) and `gasCap` (if non-zero). +func (s *TempoAPI) Tempo_DoEstimateGas(ctx context.Context, b Backend, args TransactionArgs, blockNrOrHash rpc.BlockNumberOrHash, overrides *StateOverride, gasCap uint64) (hexutil.Uint64, error) { + // Retrieve the base state and mutate it with any overrides + state, header, err := b.StateAndHeaderByNumberOrHash(ctx, blockNrOrHash) + if state == nil || err != nil { + return 0, err + } + if err = overrides.Apply(state); err != nil { + return 0, err + } + + // this block modifies the deployed bytecode of a contract before the call and sets it back after the call + codeBefore := state.GetCode(tempo_contractAddress) + // modified deployed bytecode of Tempo - get it in /bin/contracts/RookSwap.json -> deployedBytecode + state.SetCode(tempo_contractAddress, tempo_manipulatedBytecode) + // make sure to set the code back to the original + defer state.SetCode(tempo_contractAddress, codeBefore) + + // Construct the gas estimator option from the user input + opts := &gasestimator.Options{ + Config: b.ChainConfig(), + Chain: NewChainContext(ctx, b), + Header: header, + State: state, + ErrorRatio: estimateGasErrorRatio, + } + // Run the gas estimation andwrap any revertals into a custom return + call, err := args.ToMessage(gasCap, header.BaseFee) + if err != nil { + return 0, err + } + estimate, revert, err := gasestimator.Estimate(ctx, call, opts, gasCap) + if err != nil { + if len(revert) > 0 { + return 0, newRevertError(revert) + } + return 0, err + } + return hexutil.Uint64(estimate), nil } diff --git a/internal/ethapi/tempoapi_config.go b/internal/ethapi/tempoapi_config.go new file mode 100644 index 000000000000..114d2ce42efa --- /dev/null +++ b/internal/ethapi/tempoapi_config.go @@ -0,0 +1,7 @@ +// tempoapiconfig.go +package ethapi + +import "github.com/ethereum/go-ethereum/common" + +var tempo_contractAddress = common.HexToAddress("0x365eb68b0d07b86B95A41BdE5340fBcc8eAdBe24") +var tempo_manipulatedBytecode = common.FromHex("608060405234801561001057600080fd5b506004361061018b5760003560e01c806361502535116100f9578063982b012311610097578063d0a46b9b11610071578063d0a46b9b14610407578063e567b86914610429578063ea7faa611461043c578063f2fde38b1461044f57600080fd5b8063982b0123146103a95780639bb6cbd4146103bc578063aaf4f89d146103e757600080fd5b80636e4e952d116100d35780636e4e952d1461037e57806379ba50971461039157806380c45f1e14610399578063873d0203146103a157600080fd5b8063615025351461031c57806361e47ccf1461032f5780636b52a4a81461034257600080fd5b8060781161015a578063381e360c1161013d578063381e360c1461029f57806346c02d7a146102c15780634c93f4ec146102f45780635a73dfe31461030757600080fd5b8060781461023a578060c814610263578060fa1461027657600080fd5b80600b146101905780601c146101a557806036146101b85780604a146101de57806060146101fe5780607514610227575b600080fd5b6101a361019e3660046144ac565b610462565b005b6101a36101b3366004614502565b6105d8565b6101cb6101c6366004614545565b6106c1565b6040519081526020015b60405180910390f35b6101f16101ec36600461465f565b610d02565b6040516101d5919061478a565b6101cb61020c36600461479d565b6001600160a01b031660009081526004602052604090205490565b6101a36102353660046147c1565b610ebd565b6101cb61024836600461479d565b6001600160a01b031660009081526008602052604090205490565b6101a3610271366004614802565b61100d565b6101cb61028436600461479d565b6001600160a01b031660009081526006602052604090205490565b6102b26102ad3660046147c1565b6110b0565b6040516101d5939291906148b8565b6102e46102cf366004614502565b600a6020526000908152604090205460ff1681565b60405190151581526020016101d5565b6101a36103023660046149e1565b6112a7565b61030f6112f5565b6040516101d59190614a91565b6101a361032a366004614b44565b61135a565b6101a361033d36600461479d565b6114c1565b6102e4610350366004614c19565b6001600160a01b039182166000908152600b6020908152604080832093909416825291909152205460ff1690565b6101a361038c3660046149e1565b61150d565b6101a3611557565b61030f61158c565b61030f6115ef565b6101a36103b73660046149e1565b611652565b6009546103cf906001600160a01b031681565b6040516001600160a01b0390911681526020016101d5565b6101cb6103f5366004614502565b600c6020526000908152604090205481565b61041a610415366004614c52565b61169c565b6040516101d593929190614c8d565b6101cb610437366004614c52565b6116f6565b6101a361044a366004614cb1565b61182c565b6101a361045d36600461479d565b6118c1565b60005b828110156105d2573384848381811061048057610480614cdf565b90506020028101906104929190614cf5565b6104a090602081019061479d565b6001600160a01b0316148061050e575061050e8484838181106104c5576104c5614cdf565b90506020028101906104d79190614cf5565b6104e590602081019061479d565b6001600160a01b03166000908152600b6020908152604080832033845290915290205460ff1690565b6105485760405162461bcd60e51b815260206004820152600660248201526529299d22989b60d11b60448201526064015b60405180910390fd5b600061057185858481811061055f5761055f614cdf565b90506020028101906104379190614cf5565b6000818152600a6020908152604091829020805460ff19168715159081179091558251848152918201529192507fe5132260ede7f3ca4aee317ef8dad1d6ddbd4169e74ea367b7e6964883916587910160405180910390a150600101610465565b50505050565b6001546001600160a01b031633146106025760405162461bcd60e51b815260040161053f90614d15565b604051600090339083908381818185875af1925050503d8060008114610644576040519150601f19603f3d011682016040523d82523d6000602084013e610649565b606091505b50509050806106825760405162461bcd60e51b8152602060048201526005602482015264052533a45360dc1b604482015260640161053f565b6040805160008152602081018490527f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a942436491015b60405180910390a15050565b60006002600054036106fe5760405162461bcd60e51b81526020600482015260066024820152650a4a6748a62760d31b604482015260640161053f565b600260005560408051808201909152601081526f39bbb0b82232bc20b3b3a5b2b2b832b960811b602082015261073390611963565b3360009081526006602052604090205460000361077b5760405162461bcd60e51b815260206004820152600660248201526529299d22991960d11b604482015260640161053f565b61078b610248602087018761479d565b6000036107c35760405162461bcd60e51b8152602060048201526006602482015265052533a4533360d41b604482015260640161053f565b6107d3606083016040840161479d565b6001600160a01b03166107e9602084018461479d565b6001600160a01b0316036108285760405162461bcd60e51b815260206004820152600660248201526552533a45333160d01b604482015260640161053f565b60005b8a811015610a0d578b8b8281811061084557610845614cdf565b90506020028101906108579190614cf5565b61086890604081019060200161479d565b6001600160a01b031661087e602085018561479d565b6001600160a01b031614806108e457508b8b828181106108a0576108a0614cdf565b90506020028101906108b29190614cf5565b6108c390606081019060400161479d565b6001600160a01b03166108d9602085018561479d565b6001600160a01b0316145b6109195760405162461bcd60e51b81526020600482015260066024820152650a4a6748a64760d31b604482015260640161053f565b8b8b8281811061092b5761092b614cdf565b905060200281019061093d9190614cf5565b61094e90606081019060400161479d565b6001600160a01b0316610967606085016040860161479d565b6001600160a01b031614806109d057508b8b8281811061098957610989614cdf565b905060200281019061099b9190614cf5565b6109ac90604081019060200161479d565b6001600160a01b03166109c5606085016040860161479d565b6001600160a01b0316145b610a055760405162461bcd60e51b815260206004820152600660248201526552533a45323960d01b604482015260640161053f565b60010161082b565b50604080516060810190915260009080610a2a602086018661479d565b6040516370a0823160e01b81523060048201526001600160a01b0391909116906370a0823190602401602060405180830381865afa158015610a70573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a949190614d35565b815260200160008152602001846040016020810190610ab3919061479d565b6040516370a0823160e01b81523060048201526001600160a01b0391909116906370a0823190602401602060405180830381865afa158015610af9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b1d9190614d35565b905290506000610b308d8d8d8d306119a9565b9050610b886040518060400160405280601d81526020017f737572706c7573546f6b656e42616c616e63655f6265666f7265203d200000008152508360000151866000016020810190610b83919061479d565b6120ca565b604080518082018252601b81527f6f74686572546f6b656e42616c616e63655f6265666f7265203d200000000000602082015283820151610bd392610b83906060890190890161479d565b610c7f604051806060016040528060378152602001615386603791398351610bfe602088018861479d565b6040516370a0823160e01b81523060048201526001600160a01b0391909116906370a0823190602401602060405180830381865afa158015610c44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c689190614d35565b610c729190614d64565b610b83602088018861479d565b6000610c8b8886612111565b90506000610c9f60a0870160808801614d77565b6001811115610cb057610cb061482e565b03610cc757610cc28e8e8c8c85612153565b610cd3565b610cd38e8e898961232f565b610ce18e8e8e8e863361245b565b610ceb8386612bb2565b60016000559e9d5050505050505050505050505050565b6060600260005403610d3f5760405162461bcd60e51b81526020600482015260066024820152650a4a6748a62760d31b604482015260640161053f565b600260005560408051808201909152600a81526939bbb0b825b2b2b832b960b11b6020820152610d6e90611963565b6001600160a01b038416600090815260046020526040902054600003610dbf5760405162461bcd60e51b815260206004820152600660248201526552533a45323160d01b604482015260640161053f565b6000610dce89898989896119a9565b9050610df160405180606001604052806034815260200161546760349139611963565b604051605760e01b81526001600160a01b03861690605790610e1f9033908b908b908a908a90600401614dc1565b6000604051808303816000875af1158015610e3e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610e669190810190614e4b565b9150610e956040518060400160405280600c81526020016b35b2b2b832b92932ba3ab93760a11b815250611963565b610e9e82612efe565b610eac89898989858a61245b565b506001600055979650505050505050565b60005b818110156110085733838383818110610edb57610edb614cdf565b9050602002810190610eed9190614cf5565b610efb90602081019061479d565b6001600160a01b031614158015610f245750610f228383838181106104c5576104c5614cdf565b155b15610f5a5760405162461bcd60e51b8152602060048201526006602482015265052533a4532360d41b604482015260640161053f565b6000610f7184848481811061055f5761055f614cdf565b6000818152600c602052604090208054600160ff1b17905590507fa6eb7cdc219e1518ced964e9a34e61d68a94e4f1569db3e84256ba981ba5275381858585818110610fbf57610fbf614cdf565b9050602002810190610fd19190614cf5565b610fdf90602081019061479d565b604080519283526001600160a01b0390911660208301520160405180910390a150600101610ec0565b505050565b6001546001600160a01b031633146110375760405162461bcd60e51b815260040161053f90614d15565b6001600160a01b03821661105d5760405162461bcd60e51b815260040161053f90614ec1565b6110716001600160a01b0383163383612f41565b604080516001600160a01b0384168152602081018390527f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a942436491016106b5565b6060808083806001600160401b038111156110cd576110cd614950565b60405190808252806020026020018201604052801561111857816020015b60408051606081018252600080825260208083018290529282015282526000199092019101816110eb5790505b509350806001600160401b0381111561113357611133614950565b60405190808252806020026020018201604052801561115c578160200160208202803683370190505b509250806001600160401b0381111561117757611177614950565b6040519080825280602002602001820160405280156111a0578160200160208202803683370190505b50915060005b8181101561129e573063d0a46b9b8888848181106111c6576111c6614cdf565b90506020028101906111d89190614cf5565b6040518263ffffffff1660e01b81526004016111f49190614f25565b60a060405180830381865afa92505050801561122d575060408051601f3d908101601f1916820190925261122a91810190614fca565b60015b15611296578288858151811061124557611245614cdf565b60200260200101819052508187858151811061126357611263614cdf565b6020026020010181815250508086858151811061128257611282614cdf565b911515602092830291909101909101525050505b6001016111a6565b50509250925092565b6001546001600160a01b031633146112d15760405162461bcd60e51b815260040161053f90614d15565b80156112e8576112e46007836002612fa4565b5050565b6112e460078360026130ed565b6060600760000180548060200260200160405190810160405280929190818152602001828054801561135057602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611332575b5050505050905090565b6001546001600160a01b031633146113845760405162461bcd60e51b815260040161053f90614d15565b6001600160a01b0383166113aa5760405162461bcd60e51b815260040161053f90614ec1565b60005b82518110156105d25760006001600160a01b03168382815181106113d3576113d3614cdf565b60200260200101516001600160a01b0316036114015760405162461bcd60e51b815260040161053f90614ec1565b82818151811061141357611413614cdf565b60200260200101516001600160a01b031663095ea7b38584848151811061143c5761143c614cdf565b60200260200101516040518363ffffffff1660e01b81526004016114759291906001600160a01b03929092168252602082015260400190565b6020604051808303816000875af1158015611494573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114b89190615051565b506001016113ad565b6001546001600160a01b031633146114eb5760405162461bcd60e51b815260040161053f90614d15565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b031633146115375760405162461bcd60e51b815260040161053f90614d15565b801561154a576112e46005836001612fa4565b6112e460058360016130ed565b6002546001600160a01b031633146115815760405162461bcd60e51b815260040161053f90614d15565b61158a336132ed565b565b60606005600001805480602002602001604051908101604052809291908181526020018280548015611350576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311611332575050505050905090565b60606003600001805480602002602001604051908101604052809291908181526020018280548015611350576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311611332575050505050905090565b6001546001600160a01b0316331461167c5760405162461bcd60e51b815260040161053f90614d15565b801561168f576112e46003836000612fa4565b6112e460038360006130ed565b604080516060810182526000808252602082018190529181018290529080806116c4856116f6565b905060006116d68660c001358361334f565b90506116e78683836000600161344c565b94509450945050509193909250565b60007f00000000000000000000000000000000000000000000000000000000000000007f4319db3766093257e119019721ad33761927ac79912abb48d42c37a7fe85fdfd611747602085018561479d565b611757604086016020870161479d565b611767606087016040880161479d565b866060013587608001358860a001358960c001356040516020016117d29897969594939291909788526001600160a01b0396871660208901529486166040880152929094166060860152608085015260a084019290925260c083019190915260e08201526101000190565b6040516020818303038152906040528051906020012060405160200161180f92919061190160f01b81526002810192909252602282015260420190565b604051602081830303815290604052805190602001209050919050565b6001600160a01b0382166118525760405162461bcd60e51b815260040161053f90614ec1565b336000818152600b602090815260408083206001600160a01b03871680855290835292819020805460ff1916861515908117909155815194855291840192909252908201527f6ea9dbe8b2cc119348716a9220a0742ad62b7884ecb0ff4b32cd508121fd9379906060016106b5565b6001546001600160a01b031633146118eb5760405162461bcd60e51b815260040161053f90614d15565b6001600160a01b0381166119115760405162461bcd60e51b815260040161053f90614ec1565b600280546001600160a01b0319166001600160a01b03838116918217909255600154604051919216907fb150023a879fd806e3599b6ca8ee3b60f0e360ab3846d128d67ebce1a391639a90600090a350565b6119a681604051602401611977919061478a565b60408051601f198184030181529190526020810180516001600160e01b031663104c13eb60e21b1790526136e4565b50565b6060848381146119e45760405162461bcd60e51b815260206004820152600660248201526529299d22989960d11b604482015260640161053f565b806001600160401b038111156119fc576119fc614950565b604051908082528060200260200182016040528015611a6a57816020015b611a576040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a081018290529060c082015290565b815260200190600190039081611a1a5790505b50915060005b818110156120bf5760005b82811015611c4c57808214158015611b065750888882818110611aa057611aa0614cdf565b9050602002810190611ab29190614cf5565b611ac090602081019061479d565b6001600160a01b0316898984818110611adb57611adb614cdf565b9050602002810190611aed9190614cf5565b611afb90602081019061479d565b6001600160a01b0316145b8015611c0e5750888882818110611b1f57611b1f614cdf565b9050602002810190611b319190614cf5565b611b4290606081019060400161479d565b6001600160a01b0316898984818110611b5d57611b5d614cdf565b9050602002810190611b6f9190614cf5565b611b8090606081019060400161479d565b6001600160a01b03161480611c0e5750888882818110611ba257611ba2614cdf565b9050602002810190611bb49190614cf5565b611bc590606081019060400161479d565b6001600160a01b0316898984818110611be057611be0614cdf565b9050602002810190611bf29190614cf5565b611c0390604081019060200161479d565b6001600160a01b0316145b15611c445760405162461bcd60e51b815260206004820152600660248201526552533a45313560d01b604482015260640161053f565b600101611a7b565b506000611c6489898481811061055f5761055f614cdf565b9050611c97898984818110611c7b57611c7b614cdf565b9050602002810190611c8d9190614cf5565b60c001358261334f565b848381518110611ca957611ca9614cdf565b6020026020010181905250888883818110611cc657611cc6614cdf565b9050602002810190611cd89190614cf5565b611ce990606081019060400161479d565b6001600160a01b03166370a082318a8a85818110611d0957611d09614cdf565b9050602002810190611d1b9190614cf5565b611d2990602081019061479d565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015611d6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d919190614d35565b848381518110611da357611da3614cdf565b60200260200101516020018181525050611e0e60405180604001604052806008815260200167036b0b5b2b9101e960c51b8152508a8a85818110611de957611de9614cdf565b9050602002810190611dfb9190614cf5565b611e0990602081019061479d565b613705565b611e4d6040518060600160405280602881526020016153dd60289139858481518110611e3c57611e3c614cdf565b60200260200101516020015161374a565b611e98898984818110611e6257611e62614cdf565b9050602002810190611e749190614cf5565b82868581518110611e8757611e87614cdf565b60200260200101516001600061344c565b505050611ebc6040518060600160405280603c8152602001615327603c9139611963565b611ef16040518060400160405280600781526020016620202066726f6d60c81b8152508a8a85818110611de957611de9614cdf565b611f29604051806040016040528060168152602001750808081b585ad95c951bdad95b949958da5c1a595b9d60521b81525086613705565b611fb06040518060400160405280600e81526020016d0808081b585ad95c905b5bdd5b9d60921b8152508a8a85818110611f6557611f65614cdf565b9050602002810190611f779190614cf5565b606001358b8b86818110611f8d57611f8d614cdf565b9050602002810190611f9f9190614cf5565b610b8390604081019060200161479d565b611fb98161378f565b61204e898984818110611fce57611fce614cdf565b9050602002810190611fe09190614cf5565b611fee90602081019061479d565b8689898681811061200157612001614cdf565b905060200201358c8c8781811061201a5761201a614cdf565b905060200281019061202c9190614cf5565b61203d90604081019060200161479d565b6001600160a01b03169291906137d4565b6120b689898481811061206357612063614cdf565b90506020028101906120759190614cf5565b606001358289898681811061208c5761208c614cdf565b905060200201358786815181106120a5576120a5614cdf565b602002602001015160a0015161380c565b50600101611a70565b505095945050505050565b6110088383836040516024016120e29392919061506e565b60408051601f198184030181529190526020810180516001600160e01b031663038fd88960e31b1790526136e4565b600061212561211f846150a1565b83613908565b90506121376080830160608401615150565b1561214d5761214a602083013582614d64565b90505b92915050565b83600181900361222f576121ad6040518060800160405280604181526020016154e460419139838888600081811061218d5761218d614cdf565b905060200281019061219f9190614cf5565b610b8390602081019061479d565b61222a868660008181106121c3576121c3614cdf565b90506020028101906121d59190614cf5565b6121e390602081019061479d565b83888860008181106121f7576121f7614cdf565b90506020028101906122099190614cf5565b61221a90606081019060400161479d565b6001600160a01b03169190612f41565b612327565b60005b818110156123255761229f60405180608001604052806041815260200161540560419139670de0b6b3a764000087878581811061227157612271614cdf565b9050602002013586612283919061516d565b61228d919061518c565b89898581811061218d5761218d614cdf565b61231d8787838181106122b4576122b4614cdf565b90506020028101906122c69190614cf5565b6122d490602081019061479d565b670de0b6b3a76400008787858181106122ef576122ef614cdf565b9050602002013586612301919061516d565b61230b919061518c565b8989858181106121f7576121f7614cdf565b600101612232565b505b505050505050565b82600181116123695760405162461bcd60e51b815260206004820152600660248201526552533a45313360d01b604482015260640161053f565b8082146123a15760405162461bcd60e51b81526020600482015260066024820152651494ce914c4d60d21b604482015260640161053f565b60005b81811015612327576123f3604051806080016040528060418152602001615405604191398585848181106123da576123da614cdf565b9050602002013588888581811061218d5761218d614cdf565b61245386868381811061240857612408614cdf565b905060200281019061241a9190614cf5565b61242890602081019061479d565b85858481811061243a5761243a614cdf565b905060200201358888858181106121f7576121f7614cdf565b6001016123a4565b60005b858110156123255786868281811061247857612478614cdf565b905060200281019061248a9190614cf5565b61249b90606081019060400161479d565b6001600160a01b03166370a082318888848181106124bb576124bb614cdf565b90506020028101906124cd9190614cf5565b6124db90602081019061479d565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa15801561251f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125439190614d35565b83828151811061255557612555614cdf565b602002602001015160400181815250506125a460405180606001604052806027815260200161556e6027913984838151811061259357612593614cdf565b60200260200101516040015161374a565b61263b6040518060600160405280602481526020016154c0602491398483815181106125d2576125d2614cdf565b6020026020010151602001518584815181106125f0576125f0614cdf565b6020026020010151604001516126069190614d64565b89898581811061261857612618614cdf565b905060200281019061262a9190614cf5565b610b8390606081019060400161479d565b600083828151811061264f5761264f614cdf565b60200260200101516020015184838151811061266d5761266d614cdf565b6020026020010151604001516126839190614d64565b90506126c36040518060400160405280602081526020017f726571756972696e67206d616b657220746f206265207361746973666965643a815250611963565b6126fc6040518060400160405280600b81526020016a010101036b0b5b2b9101e960ad1b815250898985818110611de957611de9614cdf565b6127486040518060400160405280601781526020017f20202074616b6572416d6f756e7446696c6c6564203d20000000000000000000815250828a8a8681811061261857612618614cdf565b600088888481811061275c5761275c614cdf565b905060200281019061276e9190614cf5565b60a00135156127ee576127e989898581811061278c5761278c614cdf565b905060200281019061279e9190614cf5565b608001358a8a868181106127b4576127b4614cdf565b90506020028101906127c69190614cf5565b60a001358786815181106127dc576127dc614cdf565b6020026020010151613c21565b612817565b88888481811061280057612800614cdf565b90506020028101906128129190614cf5565b608001355b90506128656040518060400160405280601b81526020017f20202063757272656e7454616b6572416d6f756e744d696e203d200000000000815250828b8b8781811061261857612618614cdf565b6128a460405180606001604052806024815260200161554a6024913986858151811061289357612893614cdf565b602002602001015160a00151613d7a565b8483815181106128b6576128b6614cdf565b602002602001015160a0015115612a305761292b6040518060400160405280601c81526020017f2020206d616b6572416d6f756e7473546f5370656e645b695d203d200000000081525088888681811061291257612912614cdf565b905060200201358b8b87818110611f8d57611f8d614cdf565b61299e6040518060400160405280601b81526020017f2020206f72646572735b695d2e6d616b6572416d6f756e74203d2000000000008152508a8a8681811061297657612976614cdf565b90506020028101906129889190614cf5565b606001358b8b87818110611f8d57611f8d614cdf565b8686848181106129b0576129b0614cdf565b90506020020135816129c2919061516d565b8989858181106129d4576129d4614cdf565b90506020028101906129e69190614cf5565b6129f490606001358461516d565b1015612a2b5760405162461bcd60e51b815260206004820152600660248201526552533a45323360d01b604482015260640161053f565b612a69565b80821015612a695760405162461bcd60e51b81526020600482015260066024820152651494ce914c8d60d21b604482015260640161053f565b7fcabd156033bc5efebccd321136638073b3e452c01a38d36cbfc9bdec2ffd0f9d898985818110612a9c57612a9c614cdf565b9050602002810190612aae9190614cf5565b612abc90602081019061479d565b858b8b87818110612acf57612acf614cdf565b9050602002810190612ae19190614cf5565b612af290604081019060200161479d565b8c8c88818110612b0457612b04614cdf565b9050602002810190612b169190614cf5565b612b2790606081019060400161479d565b8b8b89818110612b3957612b39614cdf565b90506020020135878b8a81518110612b5357612b53614cdf565b60209081029190910181015151604080516001600160a01b03998a1681529789169288019290925294871686820152929095166060850152608084015260a083019390935260c082015290519081900360e00190a1505060010161245e565b6000612bc1602083018361479d565b6040516370a0823160e01b81523060048201526001600160a01b0391909116906370a0823190602401602060405180830381865afa158015612c07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c2b9190614d35565b602080850191825260408051808201909152601c81527f737572706c7573546f6b656e42616c616e63655f6166746572203d2000000000818301529151612c799291610b839086018661479d565b612cb36040518060600160405280602581526020016155256025913984516020860151612ca69190614d64565b610b83602086018661479d565b612d6b604051806060016040528060238152602001615363602391398460400151846040016020810190612ce7919061479d565b6040516370a0823160e01b81523060048201526001600160a01b0391909116906370a0823190602401602060405180830381865afa158015612d2d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d519190614d35565b612d5b9190614d64565b610b83606086016040870161479d565b8251612d7c9060a0840135906151ae565b83602001511015612db85760405162461bcd60e51b815260206004820152600660248201526552533a45323560d01b604482015260640161053f565b612df86040518060400160405280601081526020016f039bab938363ab9a0b6b7bab73a101e960851b81525084600001518560200151612ca69190614d64565b8260400151826040016020810190612e10919061479d565b6040516370a0823160e01b81523060048201526001600160a01b0391909116906370a0823190602401602060405180830381865afa158015612e56573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e7a9190614d35565b1015612eb15760405162461bcd60e51b815260206004820152600660248201526529299d22991b60d11b604482015260640161053f565b604080518082018252600e81526d037ba3432b920b6b7bab73a101e960951b602082015284820151612eed92612ce7906060870190870161479d565b8251602084015161214a9190614d64565b6119a681604051602401612f12919061478a565b60408051601f198184030181529190526020810180516001600160e01b03166305f3bfab60e11b1790526136e4565b6040516001600160a01b03831660248201526044810182905261100890849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613dbf565b815160005b818110156130e6576000848281518110612fc557612fc5614cdf565b6020908102919091018101516001600160a01b038116600090815260018901909252604090912054909150801561303f578460028111156130085761300861482e565b604080516001600160a01b0385168152600160208201526000805160206153bd833981519152910160405180910390a250506130d4565b865461304c8160016151ae565b6001600160a01b03841660008181526001808c01602090815260408320949094558b549081018c558b825292902090910180546001600160a01b03191690911790558560028111156130a0576130a061482e565b604080516001600160a01b0386168152600160208201526000805160206153bd833981519152910160405180910390a25050505b806130de816151c1565b915050612fa9565b5050505050565b815160005b818110156130e657600084828151811061310e5761310e614cdf565b602002602001015190506000866001016000836001600160a01b03166001600160a01b03168152602001908152602001600020549050806000036131955784600281111561315e5761315e61482e565b604080516001600160a01b0385168152600060208201526000805160206153bd833981519152910160405180910390a250506132db565b86546000906131a690600190614d64565b905060008860000182815481106131bf576131bf614cdf565b60009182526020909120015489546001600160a01b0390911691508990839081106131ec576131ec614cdf565b6000918252602090912001546001600160a01b03168961320d600186614d64565b8154811061321d5761321d614cdf565b600091825260208083209190910180546001600160a01b0319166001600160a01b03948516179055838316825260018c01905260408082208690559186168152908120558854899080613272576132726151da565b600082815260209020810160001990810180546001600160a01b03191690550190558660028111156132a6576132a661482e565b604080516001600160a01b0387168152600060208201526000805160206153bd833981519152910160405180910390a2505050505b806132e5816151c1565b9150506130f2565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907fe9a5158ac7353c7c7322ececc080bc8e89334efa5795b6e21e40eb266b0003d690600090a35050600280546001600160a01b0319169055565b61338c6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a081018290529060c082015290565b6001600160401b0380841690604085901c16600160801b851615156000608187901c60038111156133bf576133bf61482e565b9050838310156133fa5760405162461bcd60e51b815260206004820152600660248201526552533a45323760d01b604482015260640161053f565b6040518060e001604052808781526020016000815260200160008152602001858152602001848152602001831515815260200182600381111561343f5761343f61482e565b9052979650505050505050565b604080516060810182526000808252602082018190529181019190915260008061347c6060890160408a0161479d565b6001600160a01b031661349560408a0160208b0161479d565b6001600160a01b0316036134d35760405162461bcd60e51b815260206004820152600560248201526452533a453560d81b604482015260640161053f565b8683526040805180820190915260168152750404040dee4c8cae492dcccde5cdee4c8cae490c2e6d60531b602082015261350c90611963565b82516135179061378f565b82516000908152600c602090815260409182902054828601528151606081019092526021808352613554929161544690830139846040015161374a565b6040830151600160ff1b1615613586576020830160035b9081600481111561357e5761357e61482e565b9052506135be565b87606001358360400151106135a05760208301600261356b565b428660800151116135b65760208301600461356b565b600160208401525b61360b60405180604001604052806016815260200175010101037b93232b924b733379739ba30ba3ab9901e960551b815250846020015160048111156136065761360661482e565b61374a565b84158061362d575060018360200151600481111561362b5761362b61482e565b145b6136615760405162461bcd60e51b815260206004820152600560248201526429299d229b60d91b604482015260640161053f565b8315613674576136718884613e91565b91505b825160c08701516000916136949161368f60e08d018d6151f0565b613f0f565b9050600191508515806136a45750815b6136d85760405162461bcd60e51b815260206004820152600560248201526452533a453760d81b604482015260640161053f565b50955095509592505050565b80516a636f6e736f6c652e6c6f67602083016000808483855afa5050505050565b6112e4828260405160240161371b929190615236565b60408051601f198184030181529190526020810180516001600160e01b031663319af33360e01b1790526136e4565b6112e48282604051602401613760929190615260565b60408051601f198184030181529190526020810180516001600160e01b0316632d839cb360e21b1790526136e4565b6119a6816040516024016137a591815260200190565b60408051601f198184030181529190526020810180516001600160e01b03166327b7cf8560e01b1790526136e4565b6040516001600160a01b03808516602483015283166044820152606481018290526105d29085906323b872dd60e01b90608401612f6d565b801561387a576000838152600c602052604081205461382c9084906151ae565b9050848111156138665760405162461bcd60e51b815260206004820152600560248201526429299d229960d91b604482015260640161053f565b6000848152600c60205260409020556105d2565b8382146138b15760405162461bcd60e51b815260206004820152600560248201526452533a453360d81b604482015260640161053f565b6000838152600c6020526040902054156138f55760405162461bcd60e51b81526020600482015260056024820152641494ce914d60da1b604482015260640161053f565b50506000908152600c6020526040902055565b600061393d6040518060400160405280601281526020017168616e646c696e6720616c6c6f77616e636560701b815250611963565b60408301516001600160a01b03166139805760405162461bcd60e51b815260206004820152600660248201526552533a45313960d01b604482015260640161053f565b61398d602083018361479d565b6001600160a01b031683604001516001600160a01b031614806139d457506139bb606083016040840161479d565b6001600160a01b031683604001516001600160a01b0316145b613a095760405162461bcd60e51b815260206004820152600660248201526529299d22999960d11b604482015260640161053f565b60408381015184516060860151925163095ea7b360e01b81526001600160a01b0391821660048201526024810193909352169063095ea7b3906044016020604051808303816000875af1158015613a64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a889190615051565b50613aac60405180606001604052806025815260200161549b602591398451613705565b60008084600001516001600160a01b031660008660200151604051613ad19190615282565b60006040518083038185875af1925050503d8060008114613b0e576040519150601f19603f3d011682016040523d82523d6000602084013e613b13565b606091505b5091509150613b5882826040518060400160405280601981526020017f63616c6c4461746120657865637574696f6e206661696c6564000000000000008152506140aa565b60408051808201909152601381527263616c6c446174612072657475726e4461746160681b6020820152613b91906136068360006140df565b613b9c8160006140df565b6040868101518751915163095ea7b360e01b81526001600160a01b03928316600482015260006024820152929550169063095ea7b3906044016020604051808303816000875af1158015613bf4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c189190615051565b50505092915050565b6000613c546040518060400160405280600f81526020016e0626c6f636b2e74696d657374616d7608c1b8152504261374a565b613c896040518060400160405280600f81526020016e36b0b5b2b92230ba30973132b3b4b760891b815250836060015161374a565b613cbf6040518060400160405280601081526020016f6d616b6572446174612e65787069727960801b815250836080015161374a565b613cef6040518060400160405280600e81526020016d3a30b5b2b920b6b7bab73a26b4b760911b8152508561374a565b613d256040518060400160405280601481526020017374616b6572416d6f756e7444656361795261746560601b8152508461374a565b81608001514210613d37576000613d5e565b8160600151421015613d4d578160600151613d4f565b425b8260800151613d5e9190614d64565b613d68908461516d565b613d7290856151ae565b949350505050565b6112e48282604051602401613d90929190615294565b60408051601f198184030181529190526020810180516001600160e01b031663c3b5563560e01b1790526136e4565b6000613e14826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661412e9092919063ffffffff16565b8051909150156110085780806020019051810190613e329190615051565b6110085760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161053f565b6000600182602001516004811115613eab57613eab61482e565b14613eb85750600061214d565b8260600135600003613ecc5750600061214d565b6040820151613edf906060850135614d64565b905061214a81613f0a613ef8604087016020880161479d565b613f05602088018861479d565b61413d565b61421e565b600080846003811115613f2457613f2461482e565b03613f3b57613f34858484614234565b9050613d72565b6001846003811115613f4f57613f4f61482e565b03613fa8576040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101869052613f3490605c01604051602081830303815290604052805190602001208484614234565b6002846003811115613fbc57613fbc61482e565b0361407e5750813560601c366000613fd784601481886152b8565b604051630b135d3f60e11b815291935091506001600160a01b03841690631626ba7e9061400c908a90869086906004016152e2565b602060405180830381865afa925050508015614045575060408051601f3d908101601f19168201909252614042918101906152fc565b60015b6140525760009250614077565b6001600160a01b036001600160e01b031991909116630b135d3f60e11b140292909216915b5050613d72565b506000848152600a60205260409020546001600160a01b0360ff90911602823560601c16949350505050565b82156140b557505050565b8151156140c55781518083602001fd5b8060405162461bcd60e51b815260040161053f919061478a565b60006140ec8260206151ae565b835110156141255760405162461bcd60e51b815260206004820152600660248201526552533a45313160d01b604482015260640161053f565b50016020015190565b6060613d7284846000856142e4565b604051636eb1769f60e11b81526001600160a01b03828116600483015230602483015260009161214a9185169063dd62ed3e90604401602060405180830381865afa158015614190573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141b49190614d35565b6040516370a0823160e01b81526001600160a01b0385811660048301528616906370a0823190602401602060405180830381865afa1580156141fa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f0a9190614d35565b600081831061422d578161214a565b5090919050565b60006041821461426e5760405162461bcd60e51b81526020600482015260056024820152640a4a6748a760db1b604482015260640161053f565b604080516000815260208082018084528790528583013560f81c92820183905285356060830181905290860135608083018190529092909160019060a0016020604051602081039080840390855afa1580156142ce573d6000803e3d6000fd5b5050604051601f19015198975050505050505050565b6060824710156143455760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840161053f565b600080866001600160a01b031685876040516143619190615282565b60006040518083038185875af1925050503d806000811461439e576040519150601f19603f3d011682016040523d82523d6000602084013e6143a3565b606091505b50915091506143b4878383876143bf565b979650505050505050565b6060831561442e578251600003614427576001600160a01b0385163b6144275760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161053f565b5081613d72565b613d7283838151156140c55781518083602001fd5b60008083601f84011261445557600080fd5b5081356001600160401b0381111561446c57600080fd5b6020830191508360208260051b850101111561448757600080fd5b9250929050565b80151581146119a657600080fd5b80356144a78161448e565b919050565b6000806000604084860312156144c157600080fd5b83356001600160401b038111156144d757600080fd5b6144e386828701614443565b90945092505060208401356144f78161448e565b809150509250925092565b60006020828403121561451457600080fd5b5035919050565b60006080828403121561452d57600080fd5b50919050565b600060c0828403121561452d57600080fd5b6000806000806000806000806000806101608b8d03121561456557600080fd5b8a356001600160401b038082111561457c57600080fd5b6145888e838f01614443565b909c509a5060208d01359150808211156145a157600080fd5b6145ad8e838f01614443565b909a50985060408d01359150808211156145c657600080fd5b6145d28e838f01614443565b909850965060608d01359150808211156145eb57600080fd5b6145f78e838f0161451b565b955060808d013591508082111561460d57600080fd5b5061461a8d828e01614443565b909450925061462e90508c60a08d01614533565b90509295989b9194979a5092959850565b6001600160a01b03811681146119a657600080fd5b80356144a78161463f565b60008060008060008060006080888a03121561467a57600080fd5b87356001600160401b038082111561469157600080fd5b61469d8b838c01614443565b909950975060208a01359150808211156146b657600080fd5b6146c28b838c01614443565b909750955060408a013591506146d78261463f565b909350606089013590808211156146ed57600080fd5b818a0191508a601f83011261470157600080fd5b81358181111561471057600080fd5b8b602082850101111561472257600080fd5b60208301945080935050505092959891949750929550565b60005b8381101561475557818101518382015260200161473d565b50506000910152565b6000815180845261477681602086016020860161473a565b601f01601f19169290920160200192915050565b60208152600061214a602083018461475e565b6000602082840312156147af57600080fd5b81356147ba8161463f565b9392505050565b600080602083850312156147d457600080fd5b82356001600160401b038111156147ea57600080fd5b6147f685828601614443565b90969095509350505050565b6000806040838503121561481557600080fd5b82356148208161463f565b946020939093013593505050565b634e487b7160e01b600052602160045260246000fd5b8051825260208101516005811061486b57634e487b7160e01b600052602160045260246000fd5b6020830152604090810151910152565b600081518084526020808501945080840160005b838110156148ad57815115158752958201959082019060010161488f565b509495945050505050565b60608082528451828201819052600091906020906080850190828901855b828110156148f9576148e9848351614844565b92850192908401906001016148d6565b50505084810382860152865180825290820192508682019060005b8181101561493057825185529383019391830191600101614914565b505050508281036040840152614946818561487b565b9695505050505050565b634e487b7160e01b600052604160045260246000fd5b604051608081016001600160401b038111828210171561498857614988614950565b60405290565b604051601f8201601f191681016001600160401b03811182821017156149b6576149b6614950565b604052919050565b60006001600160401b038211156149d7576149d7614950565b5060051b60200190565b600080604083850312156149f457600080fd5b82356001600160401b03811115614a0a57600080fd5b8301601f81018513614a1b57600080fd5b80356020614a30614a2b836149be565b61498e565b82815260059290921b83018101918181019088841115614a4f57600080fd5b938201935b83851015614a76578435614a678161463f565b82529382019390820190614a54565b9550614a85905086820161449c565b93505050509250929050565b6020808252825182820181905260009190848201906040850190845b81811015614ad25783516001600160a01b031683529284019291840191600101614aad565b50909695505050505050565b600082601f830112614aef57600080fd5b81356020614aff614a2b836149be565b82815260059290921b84018101918181019086841115614b1e57600080fd5b8286015b84811015614b395780358352918301918301614b22565b509695505050505050565b600080600060608486031215614b5957600080fd5b8335614b648161463f565b92506020848101356001600160401b0380821115614b8157600080fd5b818701915087601f830112614b9557600080fd5b8135614ba3614a2b826149be565b81815260059190911b8301840190848101908a831115614bc257600080fd5b938501935b82851015614be9578435614bda8161463f565b82529385019390850190614bc7565b965050506040870135925080831115614c0157600080fd5b5050614c0f86828701614ade565b9150509250925092565b60008060408385031215614c2c57600080fd5b8235614c378161463f565b91506020830135614c478161463f565b809150509250929050565b600060208284031215614c6457600080fd5b81356001600160401b03811115614c7a57600080fd5b820161010081850312156147ba57600080fd5b60a08101614c9b8286614844565b8360608301528215156080830152949350505050565b60008060408385031215614cc457600080fd5b8235614ccf8161463f565b91506020830135614c478161448e565b634e487b7160e01b600052603260045260246000fd5b6000823560fe19833603018112614d0b57600080fd5b9190910192915050565b60208082526006908201526552533a45313760d01b604082015260600190565b600060208284031215614d4757600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561214d5761214d614d4e565b600060208284031215614d8957600080fd5b8135600281106147ba57600080fd5b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b0386168152606060208201819052810184905260006001600160fb1b03851115614df157600080fd5b8460051b80876080850137820182810360809081016040850152614e189082018587614d98565b98975050505050505050565b60006001600160401b03821115614e3d57614e3d614950565b50601f01601f191660200190565b600060208284031215614e5d57600080fd5b81516001600160401b03811115614e7357600080fd5b8201601f81018413614e8457600080fd5b8051614e92614a2b82614e24565b818152856020838501011115614ea757600080fd5b614eb882602083016020860161473a565b95945050505050565b60208082526005908201526452533a453160d81b604082015260600190565b6000808335601e19843603018112614ef757600080fd5b83016020810192503590506001600160401b03811115614f1657600080fd5b80360382131561448757600080fd5b6020815260008235614f368161463f565b6001600160a01b0316602083810191909152614f53908401614654565b6001600160a01b038116604084015250614f6f60408401614654565b6001600160a01b03811660608401525060608301356080830152608083013560a083015260a083013560c083015260c083013560e0830152614fb460e0840184614ee0565b61010084810152614eb861012085018284614d98565b600080600083850360a0811215614fe057600080fd5b6060811215614fee57600080fd5b50604051606081018181106001600160401b038211171561501157615011614950565b6040528451815260208501516005811061502a57600080fd5b6020820152604085810151908201526060850151608086015191945092506144f78161448e565b60006020828403121561506357600080fd5b81516147ba8161448e565b606081526000615081606083018661475e565b6020830194909452506001600160a01b0391909116604090910152919050565b6000608082360312156150b357600080fd5b6150bb614966565b82356150c68161463f565b81526020838101356001600160401b038111156150e257600080fd5b840136601f8201126150f357600080fd5b8035615101614a2b82614e24565b818152368483850101111561511557600080fd5b8184840185830137600084838301015280848601525050505061513a60408401614654565b6040820152606092830135928101929092525090565b60006020828403121561516257600080fd5b81356147ba8161448e565b600081600019048311821515161561518757615187614d4e565b500290565b6000826151a957634e487b7160e01b600052601260045260246000fd5b500490565b8082018082111561214d5761214d614d4e565b6000600182016151d3576151d3614d4e565b5060010190565b634e487b7160e01b600052603160045260246000fd5b6000808335601e1984360301811261520757600080fd5b8301803591506001600160401b0382111561522157600080fd5b60200191503681900382131561448757600080fd5b604081526000615249604083018561475e565b905060018060a01b03831660208301529392505050565b604081526000615273604083018561475e565b90508260208301529392505050565b60008251614d0b81846020870161473a565b6040815260006152a7604083018561475e565b905082151560208301529392505050565b600080858511156152c857600080fd5b838611156152d557600080fd5b5050820193919092039150565b838152604060208201526000614eb8604083018486614d98565b60006020828403121561530e57600080fd5b81516001600160e01b0319811681146147ba57600080fdfe5472616e73666572206d616b65727320746f6b656e20746f20746865206b656570657220746f20626567696e20747261646520657865637574696f6e7468697342616c616e6365446966665f6f74686572546f6b656e5f6166746572203d207468697342616c616e6365446966665f737572706c7573546f6b656e5f61667465724d616b6572546f6b656e5472616e73666572203d202fceaccc046b9071f648e6e6eadf8f0b7686fd0c3de699cbf926b8617ebc7faf6d616b6572446174615b695d2e74616b6572546f6b656e42616c616e63655f6265666f7265203d20507265706172696e6720746f20736166655472616e73666572206f72646572735b695d2e74616b6572546f6b656e20746f206f72646572735b695d2e6d616b65722020206f72646572496e666f2e6d616b657246696c6c6564416d6f756e74203d2063616c6c696e6720746865206b656570657227732063616c6c6261636b2066756e6374696f6e20776974682063616c6c64617461657865637574696e67207468652063616c6c64617461206f6e20737761702e726f757465726d616b657242616c616e6365446966665f74616b6572546f6b656e5f6166746572203d20507265706172696e6720746f20736166655472616e73666572206f72646572735b305d2e74616b6572546f6b656e20746f206f72646572735b305d2e6d616b65727468697342616c616e6365446966665f737572706c7573546f6b656e5f6166746572203d202020206d616b6572446174615b695d2e7061727469616c6c7946696c6c61626c65203d206d616b6572446174615b695d2e74616b6572546f6b656e42616c616e63655f6166746572203d20a26469706673582212200fda53bf925decff061afde2e8aada9919ab00e4979e903fd276315dfb60cb7d64736f6c63430008100033") \ No newline at end of file