Commit 4ea33e13 authored by smartcontracts's avatar smartcontracts Committed by GitHub

feat(ctb): standardize initialization logic for L1 (#2885)

* feat(ctb): standardize initialization logic for L1

Standardizes the initialization for L1 contracts. Ensures that all
contracts use the same pattern of:
1. VERSION variable that represents the contract version.
2. constructor that sets immutables and calls initialize.
3. initialize function that sets any remaining mutables.

* op-bindings: update
Co-authored-by: default avatarMark Tyneway <mark.tyneway@gmail.com>
Co-authored-by: default avatarmergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
parent 9a693575
---
'@eth-optimism/contracts-bedrock': patch
---
Standardizes initialization logic for L1 contracts
...@@ -36,8 +36,8 @@ type L2OutputOracleOutputProposal struct { ...@@ -36,8 +36,8 @@ type L2OutputOracleOutputProposal struct {
// L2OutputOracleMetaData contains all meta data concerning the L2OutputOracle contract. // L2OutputOracleMetaData contains all meta data concerning the L2OutputOracle contract.
var L2OutputOracleMetaData = &bind.MetaData{ var L2OutputOracleMetaData = &bind.MetaData{
ABI: "[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_submissionInterval\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"_genesisL2Output\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"_historicalTotalBlocks\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_startingBlockNumber\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_startingTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_l2BlockTime\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_sequencer\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"_l2Output\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_l1Timestamp\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_l2BlockNumber\",\"type\":\"uint256\"}],\"name\":\"L2OutputAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"_l2Output\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_l1Timestamp\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_l2BlockNumber\",\"type\":\"uint256\"}],\"name\":\"L2OutputDeleted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousSequencer\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newSequencer\",\"type\":\"address\"}],\"name\":\"SequencerChanged\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"HISTORICAL_TOTAL_BLOCKS\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"L2_BLOCK_TIME\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"L2_OUTPUT_ORACLE_VERSION\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"STARTING_BLOCK_NUMBER\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"STARTING_TIMESTAMP\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"SUBMISSION_INTERVAL\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_l2Output\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"_l2BlockNumber\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"_l1Blockhash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"_l1BlockNumber\",\"type\":\"uint256\"}],\"name\":\"appendL2Output\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_newSequencer\",\"type\":\"address\"}],\"name\":\"changeSequencer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_l2BlockNumber\",\"type\":\"uint256\"}],\"name\":\"computeL2Timestamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"outputRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"internalType\":\"structL2OutputOracle.OutputProposal\",\"name\":\"_proposal\",\"type\":\"tuple\"}],\"name\":\"deleteL2Output\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_l2BlockNumber\",\"type\":\"uint256\"}],\"name\":\"getL2Output\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"outputRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"internalType\":\"structL2OutputOracle.OutputProposal\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_genesisL2Output\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"_startingBlockNumber\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_sequencer\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latestBlockNumber\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"nextBlockNumber\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"sequencer\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", ABI: "[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_submissionInterval\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"_genesisL2Output\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"_historicalTotalBlocks\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_startingBlockNumber\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_startingTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_l2BlockTime\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_sequencer\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"_l2Output\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_l1Timestamp\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_l2BlockNumber\",\"type\":\"uint256\"}],\"name\":\"L2OutputAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"_l2Output\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_l1Timestamp\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_l2BlockNumber\",\"type\":\"uint256\"}],\"name\":\"L2OutputDeleted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousSequencer\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newSequencer\",\"type\":\"address\"}],\"name\":\"SequencerChanged\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"HISTORICAL_TOTAL_BLOCKS\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"L2_BLOCK_TIME\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"STARTING_BLOCK_NUMBER\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"STARTING_TIMESTAMP\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"SUBMISSION_INTERVAL\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"VERSION\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_l2Output\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"_l2BlockNumber\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"_l1Blockhash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"_l1BlockNumber\",\"type\":\"uint256\"}],\"name\":\"appendL2Output\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_newSequencer\",\"type\":\"address\"}],\"name\":\"changeSequencer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_l2BlockNumber\",\"type\":\"uint256\"}],\"name\":\"computeL2Timestamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"outputRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"internalType\":\"structL2OutputOracle.OutputProposal\",\"name\":\"_proposal\",\"type\":\"tuple\"}],\"name\":\"deleteL2Output\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_l2BlockNumber\",\"type\":\"uint256\"}],\"name\":\"getL2Output\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"outputRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"internalType\":\"structL2OutputOracle.OutputProposal\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_genesisL2Output\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"_startingBlockNumber\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_sequencer\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latestBlockNumber\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"nextBlockNumber\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"sequencer\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]",
Bin: "0x6101206040523480156200001257600080fd5b5060405162001d7f38038062001d7f8339810160408190526200003591620005c8565b428310620000bc5760405162461bcd60e51b815260206004820152604360248201527f4f7574707574204f7261636c653a20496e697469616c204c3220626c6f636b2060448201527f74696d65206d757374206265206c657373207468616e2063757272656e742074606482015262696d6560e81b608482015260a4015b60405180910390fd5b608088905260a086905260c085905260e0849052610100839052620000e487868484620000f2565b50505050505050506200063a565b600160006200010182620001bf565b905080156200011a576000805461ff0019166101001790555b6040805180820182528781524260208083019182526000898152606790915292909220905181559051600190910155606685905562000158620002d2565b62000163846200033a565b6200016e83620004e8565b8015620001b7576000805461ff001916905560405160ff831681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b60008054610100900460ff161562000254578160ff166001148015620001f85750620001f6306200053a60201b620011491760201c565b155b6200024c5760405162461bcd60e51b815260206004820152602e602482015260008051602062001d3f83398151915260448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401620000b3565b506000919050565b60005460ff808416911610620002b35760405162461bcd60e51b815260206004820152602e602482015260008051602062001d3f83398151915260448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401620000b3565b506000805460ff191660ff92909216919091179055600190565b919050565b600054610100900460ff166200032e5760405162461bcd60e51b815260206004820152602b602482015260008051602062001d5f83398151915260448201526a6e697469616c697a696e6760a81b6064820152608401620000b3565b6200033862000549565b565b6033546001600160a01b03163314620003965760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401620000b3565b6001600160a01b038116620004065760405162461bcd60e51b815260206004820152602f60248201527f4f75747075744f7261636c653a206e65772073657175656e636572206973207460448201526e6865207a65726f206164647265737360881b6064820152608401620000b3565b6033546001600160a01b03828116911614156200048c5760405162461bcd60e51b815260206004820152603360248201527f4f75747075744f7261636c653a2073657175656e6365722063616e6e6f74206260448201527f652073616d6520617320746865206f776e6572000000000000000000000000006064820152608401620000b3565b6065546040516001600160a01b038084169216907f6ec88bae255aa7e73521c3beb17e9bc7940169e669440c5531733c0d2e91110d90600090a3606580546001600160a01b0319166001600160a01b0392909216919091179055565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b03163b151590565b600054610100900460ff16620005a55760405162461bcd60e51b815260206004820152602b602482015260008051602062001d5f83398151915260448201526a6e697469616c697a696e6760a81b6064820152608401620000b3565b6200033833620004e8565b80516001600160a01b0381168114620002cd57600080fd5b600080600080600080600080610100898b031215620005e657600080fd5b885197506020890151965060408901519550606089015194506080890151935060a089015192506200061b60c08a01620005b0565b91506200062b60e08a01620005b0565b90509295985092959890939650565b60805160a05160c05160e05161010051611696620006a9600039600061013f0152600081816101a80152610ebd01526000818161022501528181610d8e0152610e88015260006103ba015260008181610259015281816106cb01528181610e640152610fe801526116966000f3fe6080604052600436106101285760003560e01c8063715018a6116100a5578063a4771aad11610074578063d20b1a5111610059578063d20b1a51146103fc578063dcec33481461041c578063f2fde38b1461043157600080fd5b8063a4771aad146103a8578063d1de856c146103dc57600080fd5b8063715018a6146102cd5780637cbb46e3146102e25780638da5cb5b14610309578063a25ae5571461033457600080fd5b80632af8ded8116100fc5780634ab65d73116100e15780634ab65d7314610213578063529933df146102475780635c1bba381461027b57600080fd5b80632af8ded8146101dd5780634599c788146101fd57600080fd5b80622134cc1461012d578063093b3d901461017457806320e9fcd41461019657806325188104146101ca575b600080fd5b34801561013957600080fd5b506101617f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020015b60405180910390f35b34801561018057600080fd5b5061019461018f3660046114a1565b610451565b005b3480156101a257600080fd5b506101617f000000000000000000000000000000000000000000000000000000000000000081565b6101946101d8366004611517565b6106f7565b3480156101e957600080fd5b506101946101f836600461156d565b610aa0565b34801561020957600080fd5b5061016160665481565b34801561021f57600080fd5b506101617f000000000000000000000000000000000000000000000000000000000000000081565b34801561025357600080fd5b506101617f000000000000000000000000000000000000000000000000000000000000000081565b34801561028757600080fd5b506065546102a89073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161016b565b3480156102d957600080fd5b50610194610cfd565b3480156102ee57600080fd5b506102f7600181565b60405160ff909116815260200161016b565b34801561031557600080fd5b5060335473ffffffffffffffffffffffffffffffffffffffff166102a8565b34801561034057600080fd5b5061038d61034f36600461158f565b604080518082019091526000808252602082015250600090815260676020908152604091829020825180840190935280548352600101549082015290565b6040805182518152602092830151928101929092520161016b565b3480156103b457600080fd5b506101617f000000000000000000000000000000000000000000000000000000000000000081565b3480156103e857600080fd5b506101616103f736600461158f565b610d8a565b34801561040857600080fd5b506101946104173660046115a8565b610ee7565b34801561042857600080fd5b50610161610fe4565b34801561043d57600080fd5b5061019461044c36600461156d565b611019565b60335473ffffffffffffffffffffffffffffffffffffffff1633146104d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b60665460009081526067602090815260409182902082518084019093528054808452600190910154918301919091528251146105bb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605260248201527f4f75747075744f7261636c653a20546865206f757470757420726f6f7420746f60448201527f2064656c65746520646f6573206e6f74206d6174636820746865206c6174657360648201527f74206f75747075742070726f706f73616c2e0000000000000000000000000000608482015260a4016104ce565b8060200151826020015114610678576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605060248201527f4f75747075744f7261636c653a205468652074696d657374616d7020746f206460448201527f656c65746520646f6573206e6f74206d6174636820746865206c61746573742060648201527f6f75747075742070726f706f73616c2e00000000000000000000000000000000608482015260a4016104ce565b606654602082015182516040517f7320566fd5256cf8923648a5d9f560f1e92f1435a1bb32ddd1fe107f224ad35990600090a460668054600090815260676020526040812081815560010155546106f0907f00000000000000000000000000000000000000000000000000000000000000009061161d565b6066555050565b60655473ffffffffffffffffffffffffffffffffffffffff16331461079e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4f75747075744f7261636c653a2063616c6c6572206973206e6f74207468652060448201527f73657175656e636572000000000000000000000000000000000000000000000060648201526084016104ce565b6107a6610fe4565b831461085a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604760248201527f4f75747075744f7261636c653a20426c6f636b206e756d626572206d7573742060448201527f626520657175616c20746f206e65787420657870656374656420626c6f636b2060648201527f6e756d6265722e00000000000000000000000000000000000000000000000000608482015260a4016104ce565b4261086484610d8a565b106108f1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4f75747075744f7261636c653a2043616e6e6f7420617070656e64204c32206f60448201527f757470757420696e206675747572652e0000000000000000000000000000000060648201526084016104ce565b8361097e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f4f75747075744f7261636c653a2043616e6e6f74207375626d697420656d707460448201527f79204c32206f75747075742e000000000000000000000000000000000000000060648201526084016104ce565b8115610a3a5781814014610a3a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604760248201527f4f75747075744f7261636c653a20426c6f636b6861736820646f6573206e6f7460448201527f206d61746368207468652068617368206174207468652065787065637465642060648201527f6865696768742e00000000000000000000000000000000000000000000000000608482015260a4016104ce565b6040805180820182528581524260208083018281526000888152606790925284822093518455516001909301929092556066869055915185929187917fd6703ded1701060d9ae1793db76d594790a4e775781225f79b5aa8a77987c0809190a450505050565b60335473ffffffffffffffffffffffffffffffffffffffff163314610b21576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104ce565b73ffffffffffffffffffffffffffffffffffffffff8116610bc4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f4f75747075744f7261636c653a206e65772073657175656e636572206973207460448201527f6865207a65726f2061646472657373000000000000000000000000000000000060648201526084016104ce565b60335473ffffffffffffffffffffffffffffffffffffffff82811691161415610c6f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f4f75747075744f7261636c653a2073657175656e6365722063616e6e6f74206260448201527f652073616d6520617320746865206f776e65720000000000000000000000000060648201526084016104ce565b60655460405173ffffffffffffffffffffffffffffffffffffffff8084169216907f6ec88bae255aa7e73521c3beb17e9bc7940169e669440c5531733c0d2e91110d90600090a3606580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60335473ffffffffffffffffffffffffffffffffffffffff163314610d7e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104ce565b610d886000611165565b565b60007f0000000000000000000000000000000000000000000000000000000000000000821015610e62576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605660248201527f4f75747075744f7261636c653a20426c6f636b206e756d626572206d7573742060448201527f62652067726561746572207468616e206f7220657175616c20746f207468652060648201527f7374617274696e6720626c6f636b206e756d6265722e00000000000000000000608482015260a4016104ce565b7f0000000000000000000000000000000000000000000000000000000000000000610ead7f00000000000000000000000000000000000000000000000000000000000000008461161d565b610eb79190611634565b610ee1907f0000000000000000000000000000000000000000000000000000000000000000611671565b92915050565b60016000610ef4826111dc565b90508015610f2957600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b60408051808201825287815242602080830191825260008981526067909152929092209051815590516001909101556066859055610f65611367565b610f6e84610aa0565b610f7783611165565b8015610fdc57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905560405160ff831681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b60007f00000000000000000000000000000000000000000000000000000000000000006066546110149190611671565b905090565b60335473ffffffffffffffffffffffffffffffffffffffff16331461109a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104ce565b73ffffffffffffffffffffffffffffffffffffffff811661113d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016104ce565b61114681611165565b50565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60008054610100900460ff1615611293578160ff1660011480156111ff5750303b155b61128b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016104ce565b506000919050565b60005460ff80841691161061132a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016104ce565b50600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff92909216919091179055600190565b919050565b600054610100900460ff166113fe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016104ce565b610d88600054610100900460ff16611498576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016104ce565b610d8833611165565b6000604082840312156114b357600080fd5b6040516040810181811067ffffffffffffffff821117156114fd577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604052823581526020928301359281019290925250919050565b6000806000806080858703121561152d57600080fd5b5050823594602084013594506040840135936060013592509050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461136257600080fd5b60006020828403121561157f57600080fd5b61158882611549565b9392505050565b6000602082840312156115a157600080fd5b5035919050565b600080600080608085870312156115be57600080fd5b84359350602085013592506115d560408601611549565b91506115e360608601611549565b905092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008282101561162f5761162f6115ee565b500390565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561166c5761166c6115ee565b500290565b60008219821115611684576116846115ee565b50019056fea164736f6c634300080a000a496e697469616c697a61626c653a20636f6e747261637420697320616c726561496e697469616c697a61626c653a20636f6e7472616374206973206e6f742069", Bin: "0x6101206040523480156200001257600080fd5b5060405162001d7f38038062001d7f8339810160408190526200003591620005c8565b428310620000bc5760405162461bcd60e51b815260206004820152604360248201527f4f7574707574204f7261636c653a20496e697469616c204c3220626c6f636b2060448201527f74696d65206d757374206265206c657373207468616e2063757272656e742074606482015262696d6560e81b608482015260a4015b60405180910390fd5b608088905260a086905260c085905260e0849052610100839052620000e487868484620000f2565b50505050505050506200063a565b600160006200010182620001bf565b905080156200011a576000805461ff0019166101001790555b6040805180820182528781524260208083019182526000898152606790915292909220905181559051600190910155606685905562000158620002d2565b62000163846200033a565b6200016e83620004e8565b8015620001b7576000805461ff001916905560405160ff831681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b60008054610100900460ff161562000254578160ff166001148015620001f85750620001f6306200053a60201b620011491760201c565b155b6200024c5760405162461bcd60e51b815260206004820152602e602482015260008051602062001d3f83398151915260448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401620000b3565b506000919050565b60005460ff808416911610620002b35760405162461bcd60e51b815260206004820152602e602482015260008051602062001d3f83398151915260448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401620000b3565b506000805460ff191660ff92909216919091179055600190565b919050565b600054610100900460ff166200032e5760405162461bcd60e51b815260206004820152602b602482015260008051602062001d5f83398151915260448201526a6e697469616c697a696e6760a81b6064820152608401620000b3565b6200033862000549565b565b6033546001600160a01b03163314620003965760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401620000b3565b6001600160a01b038116620004065760405162461bcd60e51b815260206004820152602f60248201527f4f75747075744f7261636c653a206e65772073657175656e636572206973207460448201526e6865207a65726f206164647265737360881b6064820152608401620000b3565b6033546001600160a01b03828116911614156200048c5760405162461bcd60e51b815260206004820152603360248201527f4f75747075744f7261636c653a2073657175656e6365722063616e6e6f74206260448201527f652073616d6520617320746865206f776e6572000000000000000000000000006064820152608401620000b3565b6065546040516001600160a01b038084169216907f6ec88bae255aa7e73521c3beb17e9bc7940169e669440c5531733c0d2e91110d90600090a3606580546001600160a01b0319166001600160a01b0392909216919091179055565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b03163b151590565b600054610100900460ff16620005a55760405162461bcd60e51b815260206004820152602b602482015260008051602062001d5f83398151915260448201526a6e697469616c697a696e6760a81b6064820152608401620000b3565b6200033833620004e8565b80516001600160a01b0381168114620002cd57600080fd5b600080600080600080600080610100898b031215620005e657600080fd5b885197506020890151965060408901519550606089015194506080890151935060a089015192506200061b60c08a01620005b0565b91506200062b60e08a01620005b0565b90509295985092959890939650565b60805160a05160c05160e05161010051611696620006a9600039600061013f0152600081816101a80152610ebd01526000818161022501528181610d8e0152610e8801526000610393015260008181610259015281816106cb01528181610e640152610fe801526116966000f3fe6080604052600436106101285760003560e01c8063715018a6116100a5578063d1de856c11610074578063dcec334811610059578063dcec3348146103f5578063f2fde38b1461040a578063ffa1ad741461042a57600080fd5b8063d1de856c146103b5578063d20b1a51146103d557600080fd5b8063715018a6146102cd5780638da5cb5b146102e2578063a25ae5571461030d578063a4771aad1461038157600080fd5b80632af8ded8116100fc5780634ab65d73116100e15780634ab65d7314610213578063529933df146102475780635c1bba381461027b57600080fd5b80632af8ded8146101dd5780634599c788146101fd57600080fd5b80622134cc1461012d578063093b3d901461017457806320e9fcd41461019657806325188104146101ca575b600080fd5b34801561013957600080fd5b506101617f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020015b60405180910390f35b34801561018057600080fd5b5061019461018f3660046114a1565b610451565b005b3480156101a257600080fd5b506101617f000000000000000000000000000000000000000000000000000000000000000081565b6101946101d8366004611517565b6106f7565b3480156101e957600080fd5b506101946101f836600461156d565b610aa0565b34801561020957600080fd5b5061016160665481565b34801561021f57600080fd5b506101617f000000000000000000000000000000000000000000000000000000000000000081565b34801561025357600080fd5b506101617f000000000000000000000000000000000000000000000000000000000000000081565b34801561028757600080fd5b506065546102a89073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161016b565b3480156102d957600080fd5b50610194610cfd565b3480156102ee57600080fd5b5060335473ffffffffffffffffffffffffffffffffffffffff166102a8565b34801561031957600080fd5b5061036661032836600461158f565b604080518082019091526000808252602082015250600090815260676020908152604091829020825180840190935280548352600101549082015290565b6040805182518152602092830151928101929092520161016b565b34801561038d57600080fd5b506101617f000000000000000000000000000000000000000000000000000000000000000081565b3480156103c157600080fd5b506101616103d036600461158f565b610d8a565b3480156103e157600080fd5b506101946103f03660046115a8565b610ee7565b34801561040157600080fd5b50610161610fe4565b34801561041657600080fd5b5061019461042536600461156d565b611019565b34801561043657600080fd5b5061043f600181565b60405160ff909116815260200161016b565b60335473ffffffffffffffffffffffffffffffffffffffff1633146104d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b60665460009081526067602090815260409182902082518084019093528054808452600190910154918301919091528251146105bb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605260248201527f4f75747075744f7261636c653a20546865206f757470757420726f6f7420746f60448201527f2064656c65746520646f6573206e6f74206d6174636820746865206c6174657360648201527f74206f75747075742070726f706f73616c2e0000000000000000000000000000608482015260a4016104ce565b8060200151826020015114610678576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605060248201527f4f75747075744f7261636c653a205468652074696d657374616d7020746f206460448201527f656c65746520646f6573206e6f74206d6174636820746865206c61746573742060648201527f6f75747075742070726f706f73616c2e00000000000000000000000000000000608482015260a4016104ce565b606654602082015182516040517f7320566fd5256cf8923648a5d9f560f1e92f1435a1bb32ddd1fe107f224ad35990600090a460668054600090815260676020526040812081815560010155546106f0907f00000000000000000000000000000000000000000000000000000000000000009061161d565b6066555050565b60655473ffffffffffffffffffffffffffffffffffffffff16331461079e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4f75747075744f7261636c653a2063616c6c6572206973206e6f74207468652060448201527f73657175656e636572000000000000000000000000000000000000000000000060648201526084016104ce565b6107a6610fe4565b831461085a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604760248201527f4f75747075744f7261636c653a20426c6f636b206e756d626572206d7573742060448201527f626520657175616c20746f206e65787420657870656374656420626c6f636b2060648201527f6e756d6265722e00000000000000000000000000000000000000000000000000608482015260a4016104ce565b4261086484610d8a565b106108f1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4f75747075744f7261636c653a2043616e6e6f7420617070656e64204c32206f60448201527f757470757420696e206675747572652e0000000000000000000000000000000060648201526084016104ce565b8361097e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f4f75747075744f7261636c653a2043616e6e6f74207375626d697420656d707460448201527f79204c32206f75747075742e000000000000000000000000000000000000000060648201526084016104ce565b8115610a3a5781814014610a3a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604760248201527f4f75747075744f7261636c653a20426c6f636b6861736820646f6573206e6f7460448201527f206d61746368207468652068617368206174207468652065787065637465642060648201527f6865696768742e00000000000000000000000000000000000000000000000000608482015260a4016104ce565b6040805180820182528581524260208083018281526000888152606790925284822093518455516001909301929092556066869055915185929187917fd6703ded1701060d9ae1793db76d594790a4e775781225f79b5aa8a77987c0809190a450505050565b60335473ffffffffffffffffffffffffffffffffffffffff163314610b21576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104ce565b73ffffffffffffffffffffffffffffffffffffffff8116610bc4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f4f75747075744f7261636c653a206e65772073657175656e636572206973207460448201527f6865207a65726f2061646472657373000000000000000000000000000000000060648201526084016104ce565b60335473ffffffffffffffffffffffffffffffffffffffff82811691161415610c6f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f4f75747075744f7261636c653a2073657175656e6365722063616e6e6f74206260448201527f652073616d6520617320746865206f776e65720000000000000000000000000060648201526084016104ce565b60655460405173ffffffffffffffffffffffffffffffffffffffff8084169216907f6ec88bae255aa7e73521c3beb17e9bc7940169e669440c5531733c0d2e91110d90600090a3606580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60335473ffffffffffffffffffffffffffffffffffffffff163314610d7e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104ce565b610d886000611165565b565b60007f0000000000000000000000000000000000000000000000000000000000000000821015610e62576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605660248201527f4f75747075744f7261636c653a20426c6f636b206e756d626572206d7573742060448201527f62652067726561746572207468616e206f7220657175616c20746f207468652060648201527f7374617274696e6720626c6f636b206e756d6265722e00000000000000000000608482015260a4016104ce565b7f0000000000000000000000000000000000000000000000000000000000000000610ead7f00000000000000000000000000000000000000000000000000000000000000008461161d565b610eb79190611634565b610ee1907f0000000000000000000000000000000000000000000000000000000000000000611671565b92915050565b60016000610ef4826111dc565b90508015610f2957600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b60408051808201825287815242602080830191825260008981526067909152929092209051815590516001909101556066859055610f65611367565b610f6e84610aa0565b610f7783611165565b8015610fdc57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905560405160ff831681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b60007f00000000000000000000000000000000000000000000000000000000000000006066546110149190611671565b905090565b60335473ffffffffffffffffffffffffffffffffffffffff16331461109a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104ce565b73ffffffffffffffffffffffffffffffffffffffff811661113d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016104ce565b61114681611165565b50565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60008054610100900460ff1615611293578160ff1660011480156111ff5750303b155b61128b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016104ce565b506000919050565b60005460ff80841691161061132a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016104ce565b50600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff92909216919091179055600190565b919050565b600054610100900460ff166113fe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016104ce565b610d88600054610100900460ff16611498576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016104ce565b610d8833611165565b6000604082840312156114b357600080fd5b6040516040810181811067ffffffffffffffff821117156114fd577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604052823581526020928301359281019290925250919050565b6000806000806080858703121561152d57600080fd5b5050823594602084013594506040840135936060013592509050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461136257600080fd5b60006020828403121561157f57600080fd5b61158882611549565b9392505050565b6000602082840312156115a157600080fd5b5035919050565b600080600080608085870312156115be57600080fd5b84359350602085013592506115d560408601611549565b91506115e360608601611549565b905092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008282101561162f5761162f6115ee565b500390565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561166c5761166c6115ee565b500290565b60008219821115611684576116846115ee565b50019056fea164736f6c634300080a000a496e697469616c697a61626c653a20636f6e747261637420697320616c726561496e697469616c697a61626c653a20636f6e7472616374206973206e6f742069",
} }
// L2OutputOracleABI is the input ABI used to generate the binding from. // L2OutputOracleABI is the input ABI used to generate the binding from.
...@@ -269,37 +269,6 @@ func (_L2OutputOracle *L2OutputOracleCallerSession) L2BLOCKTIME() (*big.Int, err ...@@ -269,37 +269,6 @@ func (_L2OutputOracle *L2OutputOracleCallerSession) L2BLOCKTIME() (*big.Int, err
return _L2OutputOracle.Contract.L2BLOCKTIME(&_L2OutputOracle.CallOpts) return _L2OutputOracle.Contract.L2BLOCKTIME(&_L2OutputOracle.CallOpts)
} }
// L2OUTPUTORACLEVERSION is a free data retrieval call binding the contract method 0x7cbb46e3.
//
// Solidity: function L2_OUTPUT_ORACLE_VERSION() view returns(uint8)
func (_L2OutputOracle *L2OutputOracleCaller) L2OUTPUTORACLEVERSION(opts *bind.CallOpts) (uint8, error) {
var out []interface{}
err := _L2OutputOracle.contract.Call(opts, &out, "L2_OUTPUT_ORACLE_VERSION")
if err != nil {
return *new(uint8), err
}
out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8)
return out0, err
}
// L2OUTPUTORACLEVERSION is a free data retrieval call binding the contract method 0x7cbb46e3.
//
// Solidity: function L2_OUTPUT_ORACLE_VERSION() view returns(uint8)
func (_L2OutputOracle *L2OutputOracleSession) L2OUTPUTORACLEVERSION() (uint8, error) {
return _L2OutputOracle.Contract.L2OUTPUTORACLEVERSION(&_L2OutputOracle.CallOpts)
}
// L2OUTPUTORACLEVERSION is a free data retrieval call binding the contract method 0x7cbb46e3.
//
// Solidity: function L2_OUTPUT_ORACLE_VERSION() view returns(uint8)
func (_L2OutputOracle *L2OutputOracleCallerSession) L2OUTPUTORACLEVERSION() (uint8, error) {
return _L2OutputOracle.Contract.L2OUTPUTORACLEVERSION(&_L2OutputOracle.CallOpts)
}
// STARTINGBLOCKNUMBER is a free data retrieval call binding the contract method 0x4ab65d73. // STARTINGBLOCKNUMBER is a free data retrieval call binding the contract method 0x4ab65d73.
// //
// Solidity: function STARTING_BLOCK_NUMBER() view returns(uint256) // Solidity: function STARTING_BLOCK_NUMBER() view returns(uint256)
...@@ -393,6 +362,37 @@ func (_L2OutputOracle *L2OutputOracleCallerSession) SUBMISSIONINTERVAL() (*big.I ...@@ -393,6 +362,37 @@ func (_L2OutputOracle *L2OutputOracleCallerSession) SUBMISSIONINTERVAL() (*big.I
return _L2OutputOracle.Contract.SUBMISSIONINTERVAL(&_L2OutputOracle.CallOpts) return _L2OutputOracle.Contract.SUBMISSIONINTERVAL(&_L2OutputOracle.CallOpts)
} }
// VERSION is a free data retrieval call binding the contract method 0xffa1ad74.
//
// Solidity: function VERSION() view returns(uint8)
func (_L2OutputOracle *L2OutputOracleCaller) VERSION(opts *bind.CallOpts) (uint8, error) {
var out []interface{}
err := _L2OutputOracle.contract.Call(opts, &out, "VERSION")
if err != nil {
return *new(uint8), err
}
out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8)
return out0, err
}
// VERSION is a free data retrieval call binding the contract method 0xffa1ad74.
//
// Solidity: function VERSION() view returns(uint8)
func (_L2OutputOracle *L2OutputOracleSession) VERSION() (uint8, error) {
return _L2OutputOracle.Contract.VERSION(&_L2OutputOracle.CallOpts)
}
// VERSION is a free data retrieval call binding the contract method 0xffa1ad74.
//
// Solidity: function VERSION() view returns(uint8)
func (_L2OutputOracle *L2OutputOracleCallerSession) VERSION() (uint8, error) {
return _L2OutputOracle.Contract.VERSION(&_L2OutputOracle.CallOpts)
}
// ComputeL2Timestamp is a free data retrieval call binding the contract method 0xd1de856c. // ComputeL2Timestamp is a free data retrieval call binding the contract method 0xd1de856c.
// //
// Solidity: function computeL2Timestamp(uint256 _l2BlockNumber) view returns(uint256) // Solidity: function computeL2Timestamp(uint256 _l2BlockNumber) view returns(uint256)
......
...@@ -38,8 +38,8 @@ type WithdrawalVerifierOutputRootProof struct { ...@@ -38,8 +38,8 @@ type WithdrawalVerifierOutputRootProof struct {
// OptimismPortalMetaData contains all meta data concerning the OptimismPortal contract. // OptimismPortalMetaData contains all meta data concerning the OptimismPortal contract.
var OptimismPortalMetaData = &bind.MetaData{ var OptimismPortalMetaData = &bind.MetaData{
ABI: "[{\"inputs\":[{\"internalType\":\"contractL2OutputOracle\",\"name\":\"_l2Oracle\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_finalizationPeriodSeconds\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"mint\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"gasLimit\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"isCreation\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"TransactionDeposited\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"withdrawalHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"name\":\"WithdrawalFinalized\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"BASE_FEE_MAX_CHANGE_DENOMINATOR\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ELASTICITY_MULTIPLIER\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"FINALIZATION_PERIOD_SECONDS\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"INITIAL_BASE_FEE\",\"outputs\":[{\"internalType\":\"uint128\",\"name\":\"\",\"type\":\"uint128\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"L2_ORACLE\",\"outputs\":[{\"internalType\":\"contractL2OutputOracle\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_RESOURCE_LIMIT\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MINIMUM_BASE_FEE\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"OPTIMISM_PORTAL_VERSION\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"TARGET_RESOURCE_LIMIT\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"_gasLimit\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"_isCreation\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"depositTransaction\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_nonce\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_l2BlockNumber\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"version\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"withdrawerStorageRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"latestBlockhash\",\"type\":\"bytes32\"}],\"internalType\":\"structWithdrawalVerifier.OutputRootProof\",\"name\":\"_outputRootProof\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"_withdrawalProof\",\"type\":\"bytes\"}],\"name\":\"finalizeWithdrawalTransaction\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"finalizedWithdrawals\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_l2BlockNumber\",\"type\":\"uint256\"}],\"name\":\"isOutputFinalized\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l2Sender\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"params\",\"outputs\":[{\"internalType\":\"uint128\",\"name\":\"prevBaseFee\",\"type\":\"uint128\"},{\"internalType\":\"uint64\",\"name\":\"prevBoughtGas\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"prevBlockNum\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", ABI: "[{\"inputs\":[{\"internalType\":\"contractL2OutputOracle\",\"name\":\"_l2Oracle\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_finalizationPeriodSeconds\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"mint\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"gasLimit\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"isCreation\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"TransactionDeposited\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"withdrawalHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"name\":\"WithdrawalFinalized\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"BASE_FEE_MAX_CHANGE_DENOMINATOR\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ELASTICITY_MULTIPLIER\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"FINALIZATION_PERIOD_SECONDS\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"INITIAL_BASE_FEE\",\"outputs\":[{\"internalType\":\"uint128\",\"name\":\"\",\"type\":\"uint128\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"L2_ORACLE\",\"outputs\":[{\"internalType\":\"contractL2OutputOracle\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_RESOURCE_LIMIT\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MINIMUM_BASE_FEE\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"TARGET_RESOURCE_LIMIT\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"VERSION\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"_gasLimit\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"_isCreation\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"depositTransaction\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_nonce\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_l2BlockNumber\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"version\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"withdrawerStorageRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"latestBlockhash\",\"type\":\"bytes32\"}],\"internalType\":\"structWithdrawalVerifier.OutputRootProof\",\"name\":\"_outputRootProof\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"_withdrawalProof\",\"type\":\"bytes\"}],\"name\":\"finalizeWithdrawalTransaction\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"finalizedWithdrawals\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_l2BlockNumber\",\"type\":\"uint256\"}],\"name\":\"isOutputFinalized\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l2Sender\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"params\",\"outputs\":[{\"internalType\":\"uint128\",\"name\":\"prevBaseFee\",\"type\":\"uint128\"},{\"internalType\":\"uint64\",\"name\":\"prevBoughtGas\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"prevBlockNum\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]",
Bin: "0x60c06040523480156200001157600080fd5b5060405162003e5638038062003e56833981016040819052620000349162000276565b6200006e60408051606081018252633b9aca0080825260006020830152436001600160401b031691909201819052600160c01b0217600155565b6001600160a01b03821660a05260808190526200008a62000092565b5050620002b2565b60016000620000a18262000155565b90508015620000ba576000805461ff0019166101001790555b603380546001600160a01b03191661dead1790556200010860408051606081018252633b9aca0080825260006020830152436001600160401b031691909201819052600160c01b0217600155565b801562000151576000805461ff001916905560405160ff831681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b60008054610100900460ff1615620001ee578160ff1660011480156200018e57506200018c306200026760201b620013d91760201c565b155b620001e65760405162461bcd60e51b815260206004820152602e602482015260008051602062003e3683398151915260448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b506000919050565b60005460ff8084169116106200024d5760405162461bcd60e51b815260206004820152602e602482015260008051602062003e3683398151915260448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401620001dd565b506000805460ff191660ff92909216919091179055600190565b6001600160a01b03163b151590565b600080604083850312156200028a57600080fd5b82516001600160a01b0381168114620002a257600080fd5b6020939093015192949293505050565b60805160a051613b2d6200030960003960008181610134015281816108e60152818161095d015281816109f001528181610ac20152610e630152600081816103d501528181610b740152610ee60152613b2d6000f3fe6080604052600436106100f65760003560e01c80639bf62d821161008a578063cff0ab9611610059578063cff0ab96146102fc578063e9e05c421461039d578063eecf1c36146103b0578063f4daa291146103c357600080fd5b80639bf62d8214610275578063a14238e7146102a2578063ca3e99ba146102d2578063cd7c9789146102e757600080fd5b80636bb0291e116100c65780636bb0291e146102055780636dbffb781461021a5780638129fc1c1461024a578063867ead131461025f57600080fd5b80621c2ff61461012257806313620abd1461018057806335c14a16146101b957806364b79208146101e057600080fd5b3661011d5761011b3334620186a06000604051806020016040528060008152506103f7565b005b600080fd5b34801561012e57600080fd5b506101567f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561018c57600080fd5b50610198633b9aca0081565b6040516fffffffffffffffffffffffffffffffff9091168152602001610177565b3480156101c557600080fd5b506101ce600181565b60405160ff9091168152602001610177565b3480156101ec57600080fd5b506101f7627a120081565b604051908152602001610177565b34801561021157600080fd5b506101f7600481565b34801561022657600080fd5b5061023a610235366004613216565b61089d565b6040519015158152602001610177565b34801561025657600080fd5b5061011b610bab565b34801561026b57600080fd5b506101f761271081565b34801561028157600080fd5b506033546101569073ffffffffffffffffffffffffffffffffffffffff1681565b3480156102ae57600080fd5b5061023a6102bd366004613216565b60346020526000908152604090205460ff1681565b3480156102de57600080fd5b506101f7610cd1565b3480156102f357600080fd5b506101f7600881565b34801561030857600080fd5b50600154610364906fffffffffffffffffffffffffffffffff81169067ffffffffffffffff7001000000000000000000000000000000008204811691780100000000000000000000000000000000000000000000000090041683565b604080516fffffffffffffffffffffffffffffffff909416845267ffffffffffffffff9283166020850152911690820152606001610177565b61011b6103ab3660046132d1565b6103f7565b61011b6103be36600461341b565b610ce2565b3480156103cf57600080fd5b506101f77f000000000000000000000000000000000000000000000000000000000000000081565b8260005a905083156104ae5773ffffffffffffffffffffffffffffffffffffffff8716156104ae57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f4f7074696d69736d506f7274616c3a206d7573742073656e6420746f2061646460448201527f72657373283029207768656e206372656174696e67206120636f6e747261637460648201526084015b60405180910390fd5b333281146104cf575033731111000000000000000000000000000000001111015b8773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f78231ae6eb73366f912bb1d64351601fb76344c537bbab635ce14d0f376f0195348a8a8a8a604051610534959493929190613586565b60405180910390a350600154600090610573907801000000000000000000000000000000000000000000000000900467ffffffffffffffff16436135ec565b905080156106fc57600061058b6004627a1200613632565b6001546105b69190700100000000000000000000000000000000900467ffffffffffffffff1661369a565b9050600060086105ca6004627a1200613632565b6001546105ea9085906fffffffffffffffffffffffffffffffff1661370e565b6105f49190613632565b6105fe9190613632565b60015490915060009061064a906106349061062c9085906fffffffffffffffffffffffffffffffff166137ca565b6127106113f5565b6fffffffffffffffffffffffffffffffff611410565b905060018411156106bd576106ba610634670de0b6b3a76400006106a6610672600883613632565b61068490670de0b6b3a764000061369a565b61068f60018a6135ec565b6106a190670de0b6b3a764000061383e565b61141f565b6106b0908561370e565b61062c9190613632565b90505b6fffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff4316021760015550505b6001805484919060109061072f908490700100000000000000000000000000000000900467ffffffffffffffff1661387b565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550627a1200600160000160109054906101000a900467ffffffffffffffff1667ffffffffffffffff16131561080b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603c60248201527f4f7074696d69736d506f7274616c3a2063616e6e6f7420627579206d6f72652060448201527f676173207468616e20617661696c61626c6520676173206c696d69740000000060648201526084016104a5565b600154600090610837906fffffffffffffffffffffffffffffffff1667ffffffffffffffff86166138a7565b6fffffffffffffffffffffffffffffffff169050600061085b48633b9aca00611450565b61086590836138df565b905060005a61087490866135ec565b9050808211156108905761089061088b82846135ec565b611460565b5050505050505050505050565b6040517fa25ae55700000000000000000000000000000000000000000000000000000000815260048101829052600090819073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063a25ae557906024016040805180830381865afa15801561092c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061095091906138f3565b8051909150610b725760007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663529933df6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ea9190613942565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16634ab65d736040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a7d9190613942565b905084811115610a9257506000949350505050565b600082610a9f83886135ec565b610aa9919061395b565b905073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001663a25ae557610af183866135ec565b610afb908961396f565b6040518263ffffffff1660e01b8152600401610b1991815260200190565b6040805180830381865afa158015610b35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b5991906138f3565b8051909450610b6e5750600095945050505050565b5050505b7f00000000000000000000000000000000000000000000000000000000000000008160200151610ba2919061396f565b42119392505050565b60016000610bb88261148e565b90508015610bed57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b603380547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead179055610c6860408051606081018252633b9aca00808252600060208301524367ffffffffffffffff169190920181905278010000000000000000000000000000000000000000000000000217600155565b8015610ccd57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905560405160ff831681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b610cdf6004627a1200613632565b81565b60335473ffffffffffffffffffffffffffffffffffffffff1661dead14610d8b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a2063616e206f6e6c79207472696767657260448201527f206f6e65207769746864726177616c20706572207472616e73616374696f6e0060648201526084016104a5565b73ffffffffffffffffffffffffffffffffffffffff8916301415610e31576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a20796f752063616e6e6f742073656e642060448201527f6d6573736167657320746f2074686520706f7274616c20636f6e74726163740060648201526084016104a5565b6040517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018590526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063a25ae557906024016040805180830381865afa158015610ebe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ee291906138f3565b90507f00000000000000000000000000000000000000000000000000000000000000008160200151610f14919061396f565b4211610fa2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4f7074696d69736d506f7274616c3a2070726f706f73616c206973206e6f742060448201527f7965742066696e616c697a65640000000000000000000000000000000000000060648201526084016104a5565b610fb9610fb436869003860186613987565b611619565b815114611048576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4f7074696d69736d506f7274616c3a20696e76616c6964206f7574707574207260448201527f6f6f742070726f6f66000000000000000000000000000000000000000000000060648201526084016104a5565b600061108e8d8d8d8d8d8d8d8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061167592505050565b90506110d581866040013586868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506116b492505050565b611161576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4f7074696d69736d506f7274616c3a20696e76616c696420776974686472617760448201527f616c20696e636c7573696f6e2070726f6f66000000000000000000000000000060648201526084016104a5565b60008181526034602052604090205460ff1615611200576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206160448201527f6c7265616479206265656e2066696e616c697a6564000000000000000000000060648201526084016104a5565b600081815260346020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055611243614e208a61396f565b5a10156112d2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f4f7074696d69736d506f7274616c3a20696e73756666696369656e742067617360448201527f20746f2066696e616c697a65207769746864726177616c00000000000000000060648201526084016104a5565b603380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8e16179055604080516020601f8a0181900481028201810190925288815260009161135b918e918d918f918691908f908f908190840183828082843760009201919091525061177d92505050565b50603380547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead17905560405190915082907fdb5c7652857aa163daadd670e116628fb42e869d8ac4251ef8971d9e5727df1b906113c190841515815260200190565b60405180910390a25050505050505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b6000818312156114055781611407565b825b90505b92915050565b60008183126114055781611407565b6000611407670de0b6b3a76400008361143786611808565b611441919061370e565b61144b9190613632565b611a4c565b6000818310156114055781611407565b6000805a90505b825a61147390836135ec565b101561148957611482826139ed565b9150611467565b505050565b60008054610100900460ff1615611545578160ff1660011480156114b15750303b155b61153d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016104a5565b506000919050565b60005460ff8084169116106115dc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016104a5565b50600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff92909216919091179055600190565b919050565b60008160000151826020015183604001518460600151604051602001611658949392919093845260208401929092526040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b600086868686868660405160200161169296959493929190613a26565b6040516020818303038152906040528051906020012090509695505050505050565b604080516020810185905260009181018290528190606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828252805160209182012090830181905292506117729101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828201909152600182527f01000000000000000000000000000000000000000000000000000000000000006020830152908587611c8b565b9150505b9392505050565b6000606060008060008661ffff1667ffffffffffffffff8111156117a3576117a3613253565b6040519080825280601f01601f1916602001820160405280156117cd576020820181803683370190505b5090506000808751602089018b8e8ef191503d9250868311156117ee578692505b828152826000602083013e90999098509650505050505050565b6000808213611873576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e4544000000000000000000000000000000000000000000000060448201526064016104a5565b6000606061188084611caf565b03609f8181039490941b90931c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506027d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b393909302929092017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d92915050565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdb731c958f34d94c18213611a7d57506000919050565b680755bf798b4a1bf1e58212611aef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4558505f4f564552464c4f57000000000000000000000000000000000000000060448201526064016104a5565b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b600080611c9786611d85565b9050611ca581868686611db7565b9695505050505050565b6000808211611d1a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e4544000000000000000000000000000000000000000000000060448201526064016104a5565b5060016fffffffffffffffffffffffffffffffff821160071b82811c67ffffffffffffffff1060061b1782811c63ffffffff1060051b1782811c61ffff1060041b1782811c60ff10600390811b90911783811c600f1060021b1783811c909110821b1791821c111790565b60608180519060200120604051602001611da191815260200190565b6040516020818303038152906040529050919050565b6000806000611dc7878686611df4565b91509150818015611de957508051602080830191909120875191880191909120145b979650505050505050565b600060606000611e0385611ee9565b90506000806000611e15848a89611fe4565b81519295509093509150158080611e295750815b611e8f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e00000000000060448201526064016104a5565b600081611eab5760405180602001604052806000815250611ed7565b611ed786611eba6001886135ec565b81518110611eca57611eca613a7d565b6020026020010151612501565b919b919a509098505050505050505050565b60606000611ef68361252b565b90506000815167ffffffffffffffff811115611f1457611f14613253565b604051908082528060200260200182016040528015611f5957816020015b6040805180820190915260608082526020820152815260200190600190039081611f325790505b50905060005b8251811015611fdc576000611f8c848381518110611f7f57611f7f613a7d565b602002602001015161255e565b90506040518060400160405280828152602001611fa88361252b565b815250838381518110611fbd57611fbd613a7d565b6020026020010181905250508080611fd4906139ed565b915050611f5f565b509392505050565b60006060818080611ff487612608565b9050600086905060008061201b604051806040016040528060608152602001606081525090565b60005b8c518110156124bd578c818151811061203957612039613a7d565b60200260200101519150828461204f919061396f565b935061205c60018861396f565b9650836120da578151805160209091012085146120d5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f496e76616c696420726f6f74206861736800000000000000000000000000000060448201526064016104a5565b6121cb565b815151602011612156578151805160209091012085146120d5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c2068617368000000000060448201526064016104a5565b84612164836000015161278b565b146121cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f6465206861736800000000000060448201526064016104a5565b6121d76010600161396f565b82602001515114156122505785518414156121f1576124bd565b600086858151811061220557612205613a7d565b602001015160f81c60f81b60f81c9050600083602001518260ff168151811061223057612230613a7d565b60200260200101519050612243816127b3565b96506001945050506124ab565b60028260200151511415612449576000612269836127e9565b905060008160008151811061228057612280613a7d565b016020015160f81c90506000612297600283613aac565b6122a2906002613ace565b905060006122b3848360ff1661280d565b905060006122c18b8a61280d565b905060006122cf8383612843565b905060ff8516600214806122e6575060ff85166003145b1561233c578083511480156122fb5750808251145b1561230d5761230a818b61396f565b99505b507f800000000000000000000000000000000000000000000000000000000000000099506124bd945050505050565b60ff8516158061234f575060ff85166001145b156123c1578251811461238b57507f800000000000000000000000000000000000000000000000000000000000000099506124bd945050505050565b6123b288602001516001815181106123a5576123a5613a7d565b60200260200101516127b3565b9a5097506124ab945050505050565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f52656365697665642061206e6f6465207769746820616e20756e6b6e6f776e2060448201527f707265666978000000000000000000000000000000000000000000000000000060648201526084016104a5565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e00000060448201526064016104a5565b806124b5816139ed565b91505061201e565b507f80000000000000000000000000000000000000000000000000000000000000008414866124ec878661280d565b909e909d50909b509950505050505050505050565b6020810151805160609161140a9161251b906001906135ec565b81518110611f7f57611f7f613a7d565b60408051808201825260008082526020918201528151808301909252825182528083019082015260609061140a906128ef565b6060600080600061256e85612b22565b91945092509050600081600181111561258957612589613af1565b146125f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e000000000000000060448201526064016104a5565b6125ff85602001518484612f29565b95945050505050565b606060008251600261261a919061383e565b67ffffffffffffffff81111561263257612632613253565b6040519080825280601f01601f19166020018201604052801561265c576020820181803683370190505b50905060005b835181101561278457600484828151811061267f5761267f613a7d565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016901c826126b483600261383e565b815181106126c4576126c4613a7d565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350601084828151811061270757612707613a7d565b0160200151612719919060f81c613aac565b60f81b8261272883600261383e565b61273390600161396f565b8151811061274357612743613a7d565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508061277c816139ed565b915050612662565b5092915050565b600060208251101561279f57506020015190565b8180602001905181019061140a9190613942565b600060606020836000015110156127d4576127cd83613008565b90506127e0565b6127dd8361255e565b90505b6117768161278b565b606061140a6128088360200151600081518110611f7f57611f7f613a7d565b612608565b60608251821061282c575060408051602081019091526000815261140a565b611407838384865161283e91906135ec565b613013565b6000805b8084511180156128575750808351115b80156128d8575082818151811061287057612870613a7d565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168482815181106128af576128af613a7d565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b1561140757806128e7816139ed565b915050612847565b60606000806128fd84612b22565b9193509091506001905081600181111561291957612919613af1565b14612980576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e00000000000000000060448201526064016104a5565b6040805160208082526104208201909252600091816020015b60408051808201909152600080825260208201528152602001906001900390816129995790505090506000835b8651811015612b175760208210612a5f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f50726f766964656420524c50206c6973742065786365656473206d6178206c6960448201527f7374206c656e6774682e0000000000000000000000000000000000000000000060648201526084016104a5565b600080612a9c6040518060400160405280858c60000151612a8091906135ec565b8152602001858c60200151612a95919061396f565b9052612b22565b509150915060405180604001604052808383612ab8919061396f565b8152602001848b60200151612acd919061396f565b815250858581518110612ae257612ae2613a7d565b6020908102919091010152612af860018561396f565b9350612b04818361396f565b612b0e908461396f565b925050506129c6565b508152949350505050565b600080600080846000015111612b94576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e000000000000000060448201526064016104a5565b6020840151805160001a607f8111612bb9576000600160009450945094505050612f22565b60b78111612c4f576000612bce6080836135ec565b905080876000015111612c3d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e0000000000000060448201526064016104a5565b60019550935060009250612f22915050565b60bf8111612d72576000612c6460b7836135ec565b905080876000015111612cd3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e0060448201526064016104a5565b600183015160208290036101000a9004612ced818361396f565b885111612d56576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e000000000000000060448201526064016104a5565b612d6182600161396f565b9650945060009350612f2292505050565b60f78111612e07576000612d8760c0836135ec565b905080876000015111612df6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e00000000000000000060448201526064016104a5565b600195509350849250612f22915050565b6000612e1460f7836135ec565b905080876000015111612e83576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e00000060448201526064016104a5565b600183015160208290036101000a9004612e9d818361396f565b885111612f06576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f496e76616c696420524c50206c6f6e67206c6973742e0000000000000000000060448201526064016104a5565b612f1182600161396f565b9650945060019350612f2292505050565b9193909250565b606060008267ffffffffffffffff811115612f4657612f46613253565b6040519080825280601f01601f191660200182016040528015612f70576020820181803683370190505b509050805160001415612f84579050611776565b6000612f90858761396f565b90506020820160005b612fa46020876138df565b811015612fdb5782518252612fba60208461396f565b9250612fc760208361396f565b915080612fd3816139ed565b915050612f99565b5060006001602087066020036101000a039050808251168119845116178252839450505050509392505050565b606061140a82613200565b60608161302181601f61396f565b1015613089576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016104a5565b82613094838261396f565b10156130fc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016104a5565b613106828461396f565b84511015613170576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e647300000000000000000000000000000060448201526064016104a5565b60608215801561318f57604051915060008252602082016040526131f7565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156131c85780518352602092830192016131b0565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b606061140a826020015160008460000151612f29565b60006020828403121561322857600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461161457600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156132c9576132c9613253565b604052919050565b600080600080600060a086880312156132e957600080fd5b6132f28661322f565b94506020808701359450604087013567ffffffffffffffff808216821461331857600080fd5b909450606088013590811515821461332f57600080fd5b9093506080880135908082111561334557600080fd5b818901915089601f83011261335957600080fd5b81358181111561336b5761336b613253565b61339b847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601613282565b91508082528a848285010111156133b157600080fd5b80848401858401376000848284010152508093505050509295509295909350565b60008083601f8401126133e457600080fd5b50813567ffffffffffffffff8111156133fc57600080fd5b60208301915083602082850101111561341457600080fd5b9250929050565b60008060008060008060008060008060006101808c8e03121561343d57600080fd5b8b359a5061344d60208d0161322f565b995061345b60408d0161322f565b985060608c0135975060808c0135965067ffffffffffffffff60a08d0135111561348457600080fd5b6134948d60a08e01358e016133d2565b909650945060c08c0135935060808c8e037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff200112156134d257600080fd5b60e08c01925067ffffffffffffffff6101608d013511156134f257600080fd5b6135038d6101608e01358e016133d2565b81935080925050509295989b509295989b9093969950565b6000815180845260005b8181101561354157602081850181015186830182015201613525565b81811115613553576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b85815284602082015267ffffffffffffffff84166040820152821515606082015260a060808201526000611de960a083018461351b565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000828210156135fe576135fe6135bd565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261364157613641613603565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f800000000000000000000000000000000000000000000000000000000000000083141615613695576136956135bd565b500590565b6000808312837f8000000000000000000000000000000000000000000000000000000000000000018312811516156136d4576136d46135bd565b837f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018313811615613708576137086135bd565b50500390565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60008413600084138583048511828216161561374f5761374f6135bd565b7f8000000000000000000000000000000000000000000000000000000000000000600087128682058812818416161561378a5761378a6135bd565b600087129250878205871284841616156137a6576137a66135bd565b878505871281841616156137bc576137bc6135bd565b505050929093029392505050565b6000808212827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03841381151615613804576138046135bd565b827f8000000000000000000000000000000000000000000000000000000000000000038412811615613838576138386135bd565b50500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613876576138766135bd565b500290565b600067ffffffffffffffff80831681851680830382111561389e5761389e6135bd565b01949350505050565b60006fffffffffffffffffffffffffffffffff808316818516818304811182151516156138d6576138d66135bd565b02949350505050565b6000826138ee576138ee613603565b500490565b60006040828403121561390557600080fd5b6040516040810181811067ffffffffffffffff8211171561392857613928613253565b604052825181526020928301519281019290925250919050565b60006020828403121561395457600080fd5b5051919050565b60008261396a5761396a613603565b500690565b60008219821115613982576139826135bd565b500190565b60006080828403121561399957600080fd5b6040516080810181811067ffffffffffffffff821117156139bc576139bc613253565b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613a1f57613a1f6135bd565b5060010190565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a0830152613a7160c083018461351b565b98975050505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060ff831680613abf57613abf613603565b8060ff84160691505092915050565b600060ff821660ff841680821015613ae857613ae86135bd565b90039392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c634300080a000a496e697469616c697a61626c653a20636f6e747261637420697320616c726561", Bin: "0x60c06040523480156200001157600080fd5b5060405162003e5638038062003e56833981016040819052620000349162000276565b6200006e60408051606081018252633b9aca0080825260006020830152436001600160401b031691909201819052600160c01b0217600155565b6001600160a01b03821660a05260808190526200008a62000092565b5050620002b2565b60016000620000a18262000155565b90508015620000ba576000805461ff0019166101001790555b603380546001600160a01b03191661dead1790556200010860408051606081018252633b9aca0080825260006020830152436001600160401b031691909201819052600160c01b0217600155565b801562000151576000805461ff001916905560405160ff831681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b60008054610100900460ff1615620001ee578160ff1660011480156200018e57506200018c306200026760201b620013d91760201c565b155b620001e65760405162461bcd60e51b815260206004820152602e602482015260008051602062003e3683398151915260448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b506000919050565b60005460ff8084169116106200024d5760405162461bcd60e51b815260206004820152602e602482015260008051602062003e3683398151915260448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401620001dd565b506000805460ff191660ff92909216919091179055600190565b6001600160a01b03163b151590565b600080604083850312156200028a57600080fd5b82516001600160a01b0381168114620002a257600080fd5b6020939093015192949293505050565b60805160a051613b2d6200030960003960008181610134015281816108e60152818161095d015281816109f001528181610ac20152610e630152600081816103ae01528181610b740152610ee60152613b2d6000f3fe6080604052600436106100f65760003560e01c8063a14238e71161008a578063e9e05c4211610059578063e9e05c4214610376578063eecf1c3614610389578063f4daa2911461039c578063ffa1ad74146103d057600080fd5b8063a14238e71461027b578063ca3e99ba146102ab578063cd7c9789146102c0578063cff0ab96146102d557600080fd5b80636dbffb78116100c65780636dbffb78146101f35780638129fc1c14610223578063867ead13146102385780639bf62d821461024e57600080fd5b80621c2ff61461012257806313620abd1461018057806364b79208146101b95780636bb0291e146101de57600080fd5b3661011d5761011b3334620186a06000604051806020016040528060008152506103f7565b005b600080fd5b34801561012e57600080fd5b506101567f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561018c57600080fd5b50610198633b9aca0081565b6040516fffffffffffffffffffffffffffffffff9091168152602001610177565b3480156101c557600080fd5b506101d0627a120081565b604051908152602001610177565b3480156101ea57600080fd5b506101d0600481565b3480156101ff57600080fd5b5061021361020e366004613216565b61089d565b6040519015158152602001610177565b34801561022f57600080fd5b5061011b610bab565b34801561024457600080fd5b506101d061271081565b34801561025a57600080fd5b506033546101569073ffffffffffffffffffffffffffffffffffffffff1681565b34801561028757600080fd5b50610213610296366004613216565b60346020526000908152604090205460ff1681565b3480156102b757600080fd5b506101d0610cd1565b3480156102cc57600080fd5b506101d0600881565b3480156102e157600080fd5b5060015461033d906fffffffffffffffffffffffffffffffff81169067ffffffffffffffff7001000000000000000000000000000000008204811691780100000000000000000000000000000000000000000000000090041683565b604080516fffffffffffffffffffffffffffffffff909416845267ffffffffffffffff9283166020850152911690820152606001610177565b61011b6103843660046132d1565b6103f7565b61011b61039736600461341b565b610ce2565b3480156103a857600080fd5b506101d07f000000000000000000000000000000000000000000000000000000000000000081565b3480156103dc57600080fd5b506103e5600181565b60405160ff9091168152602001610177565b8260005a905083156104ae5773ffffffffffffffffffffffffffffffffffffffff8716156104ae57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f4f7074696d69736d506f7274616c3a206d7573742073656e6420746f2061646460448201527f72657373283029207768656e206372656174696e67206120636f6e747261637460648201526084015b60405180910390fd5b333281146104cf575033731111000000000000000000000000000000001111015b8773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f78231ae6eb73366f912bb1d64351601fb76344c537bbab635ce14d0f376f0195348a8a8a8a604051610534959493929190613586565b60405180910390a350600154600090610573907801000000000000000000000000000000000000000000000000900467ffffffffffffffff16436135ec565b905080156106fc57600061058b6004627a1200613632565b6001546105b69190700100000000000000000000000000000000900467ffffffffffffffff1661369a565b9050600060086105ca6004627a1200613632565b6001546105ea9085906fffffffffffffffffffffffffffffffff1661370e565b6105f49190613632565b6105fe9190613632565b60015490915060009061064a906106349061062c9085906fffffffffffffffffffffffffffffffff166137ca565b6127106113f5565b6fffffffffffffffffffffffffffffffff611410565b905060018411156106bd576106ba610634670de0b6b3a76400006106a6610672600883613632565b61068490670de0b6b3a764000061369a565b61068f60018a6135ec565b6106a190670de0b6b3a764000061383e565b61141f565b6106b0908561370e565b61062c9190613632565b90505b6fffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff4316021760015550505b6001805484919060109061072f908490700100000000000000000000000000000000900467ffffffffffffffff1661387b565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550627a1200600160000160109054906101000a900467ffffffffffffffff1667ffffffffffffffff16131561080b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603c60248201527f4f7074696d69736d506f7274616c3a2063616e6e6f7420627579206d6f72652060448201527f676173207468616e20617661696c61626c6520676173206c696d69740000000060648201526084016104a5565b600154600090610837906fffffffffffffffffffffffffffffffff1667ffffffffffffffff86166138a7565b6fffffffffffffffffffffffffffffffff169050600061085b48633b9aca00611450565b61086590836138df565b905060005a61087490866135ec565b9050808211156108905761089061088b82846135ec565b611460565b5050505050505050505050565b6040517fa25ae55700000000000000000000000000000000000000000000000000000000815260048101829052600090819073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063a25ae557906024016040805180830381865afa15801561092c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061095091906138f3565b8051909150610b725760007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663529933df6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ea9190613942565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16634ab65d736040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a7d9190613942565b905084811115610a9257506000949350505050565b600082610a9f83886135ec565b610aa9919061395b565b905073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001663a25ae557610af183866135ec565b610afb908961396f565b6040518263ffffffff1660e01b8152600401610b1991815260200190565b6040805180830381865afa158015610b35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b5991906138f3565b8051909450610b6e5750600095945050505050565b5050505b7f00000000000000000000000000000000000000000000000000000000000000008160200151610ba2919061396f565b42119392505050565b60016000610bb88261148e565b90508015610bed57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b603380547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead179055610c6860408051606081018252633b9aca00808252600060208301524367ffffffffffffffff169190920181905278010000000000000000000000000000000000000000000000000217600155565b8015610ccd57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905560405160ff831681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b610cdf6004627a1200613632565b81565b60335473ffffffffffffffffffffffffffffffffffffffff1661dead14610d8b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a2063616e206f6e6c79207472696767657260448201527f206f6e65207769746864726177616c20706572207472616e73616374696f6e0060648201526084016104a5565b73ffffffffffffffffffffffffffffffffffffffff8916301415610e31576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a20796f752063616e6e6f742073656e642060448201527f6d6573736167657320746f2074686520706f7274616c20636f6e74726163740060648201526084016104a5565b6040517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018590526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063a25ae557906024016040805180830381865afa158015610ebe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ee291906138f3565b90507f00000000000000000000000000000000000000000000000000000000000000008160200151610f14919061396f565b4211610fa2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4f7074696d69736d506f7274616c3a2070726f706f73616c206973206e6f742060448201527f7965742066696e616c697a65640000000000000000000000000000000000000060648201526084016104a5565b610fb9610fb436869003860186613987565b611619565b815114611048576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4f7074696d69736d506f7274616c3a20696e76616c6964206f7574707574207260448201527f6f6f742070726f6f66000000000000000000000000000000000000000000000060648201526084016104a5565b600061108e8d8d8d8d8d8d8d8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061167592505050565b90506110d581866040013586868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506116b492505050565b611161576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4f7074696d69736d506f7274616c3a20696e76616c696420776974686472617760448201527f616c20696e636c7573696f6e2070726f6f66000000000000000000000000000060648201526084016104a5565b60008181526034602052604090205460ff1615611200576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206160448201527f6c7265616479206265656e2066696e616c697a6564000000000000000000000060648201526084016104a5565b600081815260346020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055611243614e208a61396f565b5a10156112d2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f4f7074696d69736d506f7274616c3a20696e73756666696369656e742067617360448201527f20746f2066696e616c697a65207769746864726177616c00000000000000000060648201526084016104a5565b603380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8e16179055604080516020601f8a0181900481028201810190925288815260009161135b918e918d918f918691908f908f908190840183828082843760009201919091525061177d92505050565b50603380547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead17905560405190915082907fdb5c7652857aa163daadd670e116628fb42e869d8ac4251ef8971d9e5727df1b906113c190841515815260200190565b60405180910390a25050505050505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b6000818312156114055781611407565b825b90505b92915050565b60008183126114055781611407565b6000611407670de0b6b3a76400008361143786611808565b611441919061370e565b61144b9190613632565b611a4c565b6000818310156114055781611407565b6000805a90505b825a61147390836135ec565b101561148957611482826139ed565b9150611467565b505050565b60008054610100900460ff1615611545578160ff1660011480156114b15750303b155b61153d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016104a5565b506000919050565b60005460ff8084169116106115dc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016104a5565b50600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff92909216919091179055600190565b919050565b60008160000151826020015183604001518460600151604051602001611658949392919093845260208401929092526040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b600086868686868660405160200161169296959493929190613a26565b6040516020818303038152906040528051906020012090509695505050505050565b604080516020810185905260009181018290528190606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828252805160209182012090830181905292506117729101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828201909152600182527f01000000000000000000000000000000000000000000000000000000000000006020830152908587611c8b565b9150505b9392505050565b6000606060008060008661ffff1667ffffffffffffffff8111156117a3576117a3613253565b6040519080825280601f01601f1916602001820160405280156117cd576020820181803683370190505b5090506000808751602089018b8e8ef191503d9250868311156117ee578692505b828152826000602083013e90999098509650505050505050565b6000808213611873576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e4544000000000000000000000000000000000000000000000060448201526064016104a5565b6000606061188084611caf565b03609f8181039490941b90931c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506027d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b393909302929092017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d92915050565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdb731c958f34d94c18213611a7d57506000919050565b680755bf798b4a1bf1e58212611aef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4558505f4f564552464c4f57000000000000000000000000000000000000000060448201526064016104a5565b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b600080611c9786611d85565b9050611ca581868686611db7565b9695505050505050565b6000808211611d1a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e4544000000000000000000000000000000000000000000000060448201526064016104a5565b5060016fffffffffffffffffffffffffffffffff821160071b82811c67ffffffffffffffff1060061b1782811c63ffffffff1060051b1782811c61ffff1060041b1782811c60ff10600390811b90911783811c600f1060021b1783811c909110821b1791821c111790565b60608180519060200120604051602001611da191815260200190565b6040516020818303038152906040529050919050565b6000806000611dc7878686611df4565b91509150818015611de957508051602080830191909120875191880191909120145b979650505050505050565b600060606000611e0385611ee9565b90506000806000611e15848a89611fe4565b81519295509093509150158080611e295750815b611e8f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e00000000000060448201526064016104a5565b600081611eab5760405180602001604052806000815250611ed7565b611ed786611eba6001886135ec565b81518110611eca57611eca613a7d565b6020026020010151612501565b919b919a509098505050505050505050565b60606000611ef68361252b565b90506000815167ffffffffffffffff811115611f1457611f14613253565b604051908082528060200260200182016040528015611f5957816020015b6040805180820190915260608082526020820152815260200190600190039081611f325790505b50905060005b8251811015611fdc576000611f8c848381518110611f7f57611f7f613a7d565b602002602001015161255e565b90506040518060400160405280828152602001611fa88361252b565b815250838381518110611fbd57611fbd613a7d565b6020026020010181905250508080611fd4906139ed565b915050611f5f565b509392505050565b60006060818080611ff487612608565b9050600086905060008061201b604051806040016040528060608152602001606081525090565b60005b8c518110156124bd578c818151811061203957612039613a7d565b60200260200101519150828461204f919061396f565b935061205c60018861396f565b9650836120da578151805160209091012085146120d5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f496e76616c696420726f6f74206861736800000000000000000000000000000060448201526064016104a5565b6121cb565b815151602011612156578151805160209091012085146120d5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c2068617368000000000060448201526064016104a5565b84612164836000015161278b565b146121cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f6465206861736800000000000060448201526064016104a5565b6121d76010600161396f565b82602001515114156122505785518414156121f1576124bd565b600086858151811061220557612205613a7d565b602001015160f81c60f81b60f81c9050600083602001518260ff168151811061223057612230613a7d565b60200260200101519050612243816127b3565b96506001945050506124ab565b60028260200151511415612449576000612269836127e9565b905060008160008151811061228057612280613a7d565b016020015160f81c90506000612297600283613aac565b6122a2906002613ace565b905060006122b3848360ff1661280d565b905060006122c18b8a61280d565b905060006122cf8383612843565b905060ff8516600214806122e6575060ff85166003145b1561233c578083511480156122fb5750808251145b1561230d5761230a818b61396f565b99505b507f800000000000000000000000000000000000000000000000000000000000000099506124bd945050505050565b60ff8516158061234f575060ff85166001145b156123c1578251811461238b57507f800000000000000000000000000000000000000000000000000000000000000099506124bd945050505050565b6123b288602001516001815181106123a5576123a5613a7d565b60200260200101516127b3565b9a5097506124ab945050505050565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f52656365697665642061206e6f6465207769746820616e20756e6b6e6f776e2060448201527f707265666978000000000000000000000000000000000000000000000000000060648201526084016104a5565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e00000060448201526064016104a5565b806124b5816139ed565b91505061201e565b507f80000000000000000000000000000000000000000000000000000000000000008414866124ec878661280d565b909e909d50909b509950505050505050505050565b6020810151805160609161140a9161251b906001906135ec565b81518110611f7f57611f7f613a7d565b60408051808201825260008082526020918201528151808301909252825182528083019082015260609061140a906128ef565b6060600080600061256e85612b22565b91945092509050600081600181111561258957612589613af1565b146125f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e000000000000000060448201526064016104a5565b6125ff85602001518484612f29565b95945050505050565b606060008251600261261a919061383e565b67ffffffffffffffff81111561263257612632613253565b6040519080825280601f01601f19166020018201604052801561265c576020820181803683370190505b50905060005b835181101561278457600484828151811061267f5761267f613a7d565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016901c826126b483600261383e565b815181106126c4576126c4613a7d565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350601084828151811061270757612707613a7d565b0160200151612719919060f81c613aac565b60f81b8261272883600261383e565b61273390600161396f565b8151811061274357612743613a7d565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508061277c816139ed565b915050612662565b5092915050565b600060208251101561279f57506020015190565b8180602001905181019061140a9190613942565b600060606020836000015110156127d4576127cd83613008565b90506127e0565b6127dd8361255e565b90505b6117768161278b565b606061140a6128088360200151600081518110611f7f57611f7f613a7d565b612608565b60608251821061282c575060408051602081019091526000815261140a565b611407838384865161283e91906135ec565b613013565b6000805b8084511180156128575750808351115b80156128d8575082818151811061287057612870613a7d565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168482815181106128af576128af613a7d565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b1561140757806128e7816139ed565b915050612847565b60606000806128fd84612b22565b9193509091506001905081600181111561291957612919613af1565b14612980576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e00000000000000000060448201526064016104a5565b6040805160208082526104208201909252600091816020015b60408051808201909152600080825260208201528152602001906001900390816129995790505090506000835b8651811015612b175760208210612a5f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f50726f766964656420524c50206c6973742065786365656473206d6178206c6960448201527f7374206c656e6774682e0000000000000000000000000000000000000000000060648201526084016104a5565b600080612a9c6040518060400160405280858c60000151612a8091906135ec565b8152602001858c60200151612a95919061396f565b9052612b22565b509150915060405180604001604052808383612ab8919061396f565b8152602001848b60200151612acd919061396f565b815250858581518110612ae257612ae2613a7d565b6020908102919091010152612af860018561396f565b9350612b04818361396f565b612b0e908461396f565b925050506129c6565b508152949350505050565b600080600080846000015111612b94576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e000000000000000060448201526064016104a5565b6020840151805160001a607f8111612bb9576000600160009450945094505050612f22565b60b78111612c4f576000612bce6080836135ec565b905080876000015111612c3d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e0000000000000060448201526064016104a5565b60019550935060009250612f22915050565b60bf8111612d72576000612c6460b7836135ec565b905080876000015111612cd3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e0060448201526064016104a5565b600183015160208290036101000a9004612ced818361396f565b885111612d56576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e000000000000000060448201526064016104a5565b612d6182600161396f565b9650945060009350612f2292505050565b60f78111612e07576000612d8760c0836135ec565b905080876000015111612df6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e00000000000000000060448201526064016104a5565b600195509350849250612f22915050565b6000612e1460f7836135ec565b905080876000015111612e83576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e00000060448201526064016104a5565b600183015160208290036101000a9004612e9d818361396f565b885111612f06576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f496e76616c696420524c50206c6f6e67206c6973742e0000000000000000000060448201526064016104a5565b612f1182600161396f565b9650945060019350612f2292505050565b9193909250565b606060008267ffffffffffffffff811115612f4657612f46613253565b6040519080825280601f01601f191660200182016040528015612f70576020820181803683370190505b509050805160001415612f84579050611776565b6000612f90858761396f565b90506020820160005b612fa46020876138df565b811015612fdb5782518252612fba60208461396f565b9250612fc760208361396f565b915080612fd3816139ed565b915050612f99565b5060006001602087066020036101000a039050808251168119845116178252839450505050509392505050565b606061140a82613200565b60608161302181601f61396f565b1015613089576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016104a5565b82613094838261396f565b10156130fc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016104a5565b613106828461396f565b84511015613170576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e647300000000000000000000000000000060448201526064016104a5565b60608215801561318f57604051915060008252602082016040526131f7565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156131c85780518352602092830192016131b0565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b606061140a826020015160008460000151612f29565b60006020828403121561322857600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461161457600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156132c9576132c9613253565b604052919050565b600080600080600060a086880312156132e957600080fd5b6132f28661322f565b94506020808701359450604087013567ffffffffffffffff808216821461331857600080fd5b909450606088013590811515821461332f57600080fd5b9093506080880135908082111561334557600080fd5b818901915089601f83011261335957600080fd5b81358181111561336b5761336b613253565b61339b847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601613282565b91508082528a848285010111156133b157600080fd5b80848401858401376000848284010152508093505050509295509295909350565b60008083601f8401126133e457600080fd5b50813567ffffffffffffffff8111156133fc57600080fd5b60208301915083602082850101111561341457600080fd5b9250929050565b60008060008060008060008060008060006101808c8e03121561343d57600080fd5b8b359a5061344d60208d0161322f565b995061345b60408d0161322f565b985060608c0135975060808c0135965067ffffffffffffffff60a08d0135111561348457600080fd5b6134948d60a08e01358e016133d2565b909650945060c08c0135935060808c8e037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff200112156134d257600080fd5b60e08c01925067ffffffffffffffff6101608d013511156134f257600080fd5b6135038d6101608e01358e016133d2565b81935080925050509295989b509295989b9093969950565b6000815180845260005b8181101561354157602081850181015186830182015201613525565b81811115613553576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b85815284602082015267ffffffffffffffff84166040820152821515606082015260a060808201526000611de960a083018461351b565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000828210156135fe576135fe6135bd565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261364157613641613603565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f800000000000000000000000000000000000000000000000000000000000000083141615613695576136956135bd565b500590565b6000808312837f8000000000000000000000000000000000000000000000000000000000000000018312811516156136d4576136d46135bd565b837f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018313811615613708576137086135bd565b50500390565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60008413600084138583048511828216161561374f5761374f6135bd565b7f8000000000000000000000000000000000000000000000000000000000000000600087128682058812818416161561378a5761378a6135bd565b600087129250878205871284841616156137a6576137a66135bd565b878505871281841616156137bc576137bc6135bd565b505050929093029392505050565b6000808212827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03841381151615613804576138046135bd565b827f8000000000000000000000000000000000000000000000000000000000000000038412811615613838576138386135bd565b50500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613876576138766135bd565b500290565b600067ffffffffffffffff80831681851680830382111561389e5761389e6135bd565b01949350505050565b60006fffffffffffffffffffffffffffffffff808316818516818304811182151516156138d6576138d66135bd565b02949350505050565b6000826138ee576138ee613603565b500490565b60006040828403121561390557600080fd5b6040516040810181811067ffffffffffffffff8211171561392857613928613253565b604052825181526020928301519281019290925250919050565b60006020828403121561395457600080fd5b5051919050565b60008261396a5761396a613603565b500690565b60008219821115613982576139826135bd565b500190565b60006080828403121561399957600080fd5b6040516080810181811067ffffffffffffffff821117156139bc576139bc613253565b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613a1f57613a1f6135bd565b5060010190565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a0830152613a7160c083018461351b565b98975050505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060ff831680613abf57613abf613603565b8060ff84160691505092915050565b600060ff821660ff841680821015613ae857613ae86135bd565b90039392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c634300080a000a496e697469616c697a61626c653a20636f6e747261637420697320616c726561",
} }
// OptimismPortalABI is the input ABI used to generate the binding from. // OptimismPortalABI is the input ABI used to generate the binding from.
...@@ -426,66 +426,66 @@ func (_OptimismPortal *OptimismPortalCallerSession) MINIMUMBASEFEE() (*big.Int, ...@@ -426,66 +426,66 @@ func (_OptimismPortal *OptimismPortalCallerSession) MINIMUMBASEFEE() (*big.Int,
return _OptimismPortal.Contract.MINIMUMBASEFEE(&_OptimismPortal.CallOpts) return _OptimismPortal.Contract.MINIMUMBASEFEE(&_OptimismPortal.CallOpts)
} }
// OPTIMISMPORTALVERSION is a free data retrieval call binding the contract method 0x35c14a16. // TARGETRESOURCELIMIT is a free data retrieval call binding the contract method 0xca3e99ba.
// //
// Solidity: function OPTIMISM_PORTAL_VERSION() view returns(uint8) // Solidity: function TARGET_RESOURCE_LIMIT() view returns(int256)
func (_OptimismPortal *OptimismPortalCaller) OPTIMISMPORTALVERSION(opts *bind.CallOpts) (uint8, error) { func (_OptimismPortal *OptimismPortalCaller) TARGETRESOURCELIMIT(opts *bind.CallOpts) (*big.Int, error) {
var out []interface{} var out []interface{}
err := _OptimismPortal.contract.Call(opts, &out, "OPTIMISM_PORTAL_VERSION") err := _OptimismPortal.contract.Call(opts, &out, "TARGET_RESOURCE_LIMIT")
if err != nil { if err != nil {
return *new(uint8), err return *new(*big.Int), err
} }
out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
return out0, err return out0, err
} }
// OPTIMISMPORTALVERSION is a free data retrieval call binding the contract method 0x35c14a16. // TARGETRESOURCELIMIT is a free data retrieval call binding the contract method 0xca3e99ba.
// //
// Solidity: function OPTIMISM_PORTAL_VERSION() view returns(uint8) // Solidity: function TARGET_RESOURCE_LIMIT() view returns(int256)
func (_OptimismPortal *OptimismPortalSession) OPTIMISMPORTALVERSION() (uint8, error) { func (_OptimismPortal *OptimismPortalSession) TARGETRESOURCELIMIT() (*big.Int, error) {
return _OptimismPortal.Contract.OPTIMISMPORTALVERSION(&_OptimismPortal.CallOpts) return _OptimismPortal.Contract.TARGETRESOURCELIMIT(&_OptimismPortal.CallOpts)
} }
// OPTIMISMPORTALVERSION is a free data retrieval call binding the contract method 0x35c14a16. // TARGETRESOURCELIMIT is a free data retrieval call binding the contract method 0xca3e99ba.
// //
// Solidity: function OPTIMISM_PORTAL_VERSION() view returns(uint8) // Solidity: function TARGET_RESOURCE_LIMIT() view returns(int256)
func (_OptimismPortal *OptimismPortalCallerSession) OPTIMISMPORTALVERSION() (uint8, error) { func (_OptimismPortal *OptimismPortalCallerSession) TARGETRESOURCELIMIT() (*big.Int, error) {
return _OptimismPortal.Contract.OPTIMISMPORTALVERSION(&_OptimismPortal.CallOpts) return _OptimismPortal.Contract.TARGETRESOURCELIMIT(&_OptimismPortal.CallOpts)
} }
// TARGETRESOURCELIMIT is a free data retrieval call binding the contract method 0xca3e99ba. // VERSION is a free data retrieval call binding the contract method 0xffa1ad74.
// //
// Solidity: function TARGET_RESOURCE_LIMIT() view returns(int256) // Solidity: function VERSION() view returns(uint8)
func (_OptimismPortal *OptimismPortalCaller) TARGETRESOURCELIMIT(opts *bind.CallOpts) (*big.Int, error) { func (_OptimismPortal *OptimismPortalCaller) VERSION(opts *bind.CallOpts) (uint8, error) {
var out []interface{} var out []interface{}
err := _OptimismPortal.contract.Call(opts, &out, "TARGET_RESOURCE_LIMIT") err := _OptimismPortal.contract.Call(opts, &out, "VERSION")
if err != nil { if err != nil {
return *new(*big.Int), err return *new(uint8), err
} }
out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8)
return out0, err return out0, err
} }
// TARGETRESOURCELIMIT is a free data retrieval call binding the contract method 0xca3e99ba. // VERSION is a free data retrieval call binding the contract method 0xffa1ad74.
// //
// Solidity: function TARGET_RESOURCE_LIMIT() view returns(int256) // Solidity: function VERSION() view returns(uint8)
func (_OptimismPortal *OptimismPortalSession) TARGETRESOURCELIMIT() (*big.Int, error) { func (_OptimismPortal *OptimismPortalSession) VERSION() (uint8, error) {
return _OptimismPortal.Contract.TARGETRESOURCELIMIT(&_OptimismPortal.CallOpts) return _OptimismPortal.Contract.VERSION(&_OptimismPortal.CallOpts)
} }
// TARGETRESOURCELIMIT is a free data retrieval call binding the contract method 0xca3e99ba. // VERSION is a free data retrieval call binding the contract method 0xffa1ad74.
// //
// Solidity: function TARGET_RESOURCE_LIMIT() view returns(int256) // Solidity: function VERSION() view returns(uint8)
func (_OptimismPortal *OptimismPortalCallerSession) TARGETRESOURCELIMIT() (*big.Int, error) { func (_OptimismPortal *OptimismPortalCallerSession) VERSION() (uint8, error) {
return _OptimismPortal.Contract.TARGETRESOURCELIMIT(&_OptimismPortal.CallOpts) return _OptimismPortal.Contract.VERSION(&_OptimismPortal.CallOpts)
} }
// FinalizedWithdrawals is a free data retrieval call binding the contract method 0xa14238e7. // FinalizedWithdrawals is a free data retrieval call binding the contract method 0xa14238e7.
......
...@@ -2,4 +2,4 @@ ...@@ -2,4 +2,4 @@
// This file is a generated binding and any manual changes will be lost. // This file is a generated binding and any manual changes will be lost.
package bindings package bindings
var OptimismPortalDeployedBin = "0x6080604052600436106100f65760003560e01c80639bf62d821161008a578063cff0ab9611610059578063cff0ab96146102fc578063e9e05c421461039d578063eecf1c36146103b0578063f4daa291146103c357600080fd5b80639bf62d8214610275578063a14238e7146102a2578063ca3e99ba146102d2578063cd7c9789146102e757600080fd5b80636bb0291e116100c65780636bb0291e146102055780636dbffb781461021a5780638129fc1c1461024a578063867ead131461025f57600080fd5b80621c2ff61461012257806313620abd1461018057806335c14a16146101b957806364b79208146101e057600080fd5b3661011d5761011b3334620186a06000604051806020016040528060008152506103f7565b005b600080fd5b34801561012e57600080fd5b506101567f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561018c57600080fd5b50610198633b9aca0081565b6040516fffffffffffffffffffffffffffffffff9091168152602001610177565b3480156101c557600080fd5b506101ce600181565b60405160ff9091168152602001610177565b3480156101ec57600080fd5b506101f7627a120081565b604051908152602001610177565b34801561021157600080fd5b506101f7600481565b34801561022657600080fd5b5061023a610235366004613216565b61089d565b6040519015158152602001610177565b34801561025657600080fd5b5061011b610bab565b34801561026b57600080fd5b506101f761271081565b34801561028157600080fd5b506033546101569073ffffffffffffffffffffffffffffffffffffffff1681565b3480156102ae57600080fd5b5061023a6102bd366004613216565b60346020526000908152604090205460ff1681565b3480156102de57600080fd5b506101f7610cd1565b3480156102f357600080fd5b506101f7600881565b34801561030857600080fd5b50600154610364906fffffffffffffffffffffffffffffffff81169067ffffffffffffffff7001000000000000000000000000000000008204811691780100000000000000000000000000000000000000000000000090041683565b604080516fffffffffffffffffffffffffffffffff909416845267ffffffffffffffff9283166020850152911690820152606001610177565b61011b6103ab3660046132d1565b6103f7565b61011b6103be36600461341b565b610ce2565b3480156103cf57600080fd5b506101f77f000000000000000000000000000000000000000000000000000000000000000081565b8260005a905083156104ae5773ffffffffffffffffffffffffffffffffffffffff8716156104ae57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f4f7074696d69736d506f7274616c3a206d7573742073656e6420746f2061646460448201527f72657373283029207768656e206372656174696e67206120636f6e747261637460648201526084015b60405180910390fd5b333281146104cf575033731111000000000000000000000000000000001111015b8773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f78231ae6eb73366f912bb1d64351601fb76344c537bbab635ce14d0f376f0195348a8a8a8a604051610534959493929190613586565b60405180910390a350600154600090610573907801000000000000000000000000000000000000000000000000900467ffffffffffffffff16436135ec565b905080156106fc57600061058b6004627a1200613632565b6001546105b69190700100000000000000000000000000000000900467ffffffffffffffff1661369a565b9050600060086105ca6004627a1200613632565b6001546105ea9085906fffffffffffffffffffffffffffffffff1661370e565b6105f49190613632565b6105fe9190613632565b60015490915060009061064a906106349061062c9085906fffffffffffffffffffffffffffffffff166137ca565b6127106113f5565b6fffffffffffffffffffffffffffffffff611410565b905060018411156106bd576106ba610634670de0b6b3a76400006106a6610672600883613632565b61068490670de0b6b3a764000061369a565b61068f60018a6135ec565b6106a190670de0b6b3a764000061383e565b61141f565b6106b0908561370e565b61062c9190613632565b90505b6fffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff4316021760015550505b6001805484919060109061072f908490700100000000000000000000000000000000900467ffffffffffffffff1661387b565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550627a1200600160000160109054906101000a900467ffffffffffffffff1667ffffffffffffffff16131561080b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603c60248201527f4f7074696d69736d506f7274616c3a2063616e6e6f7420627579206d6f72652060448201527f676173207468616e20617661696c61626c6520676173206c696d69740000000060648201526084016104a5565b600154600090610837906fffffffffffffffffffffffffffffffff1667ffffffffffffffff86166138a7565b6fffffffffffffffffffffffffffffffff169050600061085b48633b9aca00611450565b61086590836138df565b905060005a61087490866135ec565b9050808211156108905761089061088b82846135ec565b611460565b5050505050505050505050565b6040517fa25ae55700000000000000000000000000000000000000000000000000000000815260048101829052600090819073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063a25ae557906024016040805180830381865afa15801561092c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061095091906138f3565b8051909150610b725760007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663529933df6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ea9190613942565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16634ab65d736040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a7d9190613942565b905084811115610a9257506000949350505050565b600082610a9f83886135ec565b610aa9919061395b565b905073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001663a25ae557610af183866135ec565b610afb908961396f565b6040518263ffffffff1660e01b8152600401610b1991815260200190565b6040805180830381865afa158015610b35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b5991906138f3565b8051909450610b6e5750600095945050505050565b5050505b7f00000000000000000000000000000000000000000000000000000000000000008160200151610ba2919061396f565b42119392505050565b60016000610bb88261148e565b90508015610bed57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b603380547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead179055610c6860408051606081018252633b9aca00808252600060208301524367ffffffffffffffff169190920181905278010000000000000000000000000000000000000000000000000217600155565b8015610ccd57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905560405160ff831681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b610cdf6004627a1200613632565b81565b60335473ffffffffffffffffffffffffffffffffffffffff1661dead14610d8b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a2063616e206f6e6c79207472696767657260448201527f206f6e65207769746864726177616c20706572207472616e73616374696f6e0060648201526084016104a5565b73ffffffffffffffffffffffffffffffffffffffff8916301415610e31576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a20796f752063616e6e6f742073656e642060448201527f6d6573736167657320746f2074686520706f7274616c20636f6e74726163740060648201526084016104a5565b6040517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018590526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063a25ae557906024016040805180830381865afa158015610ebe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ee291906138f3565b90507f00000000000000000000000000000000000000000000000000000000000000008160200151610f14919061396f565b4211610fa2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4f7074696d69736d506f7274616c3a2070726f706f73616c206973206e6f742060448201527f7965742066696e616c697a65640000000000000000000000000000000000000060648201526084016104a5565b610fb9610fb436869003860186613987565b611619565b815114611048576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4f7074696d69736d506f7274616c3a20696e76616c6964206f7574707574207260448201527f6f6f742070726f6f66000000000000000000000000000000000000000000000060648201526084016104a5565b600061108e8d8d8d8d8d8d8d8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061167592505050565b90506110d581866040013586868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506116b492505050565b611161576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4f7074696d69736d506f7274616c3a20696e76616c696420776974686472617760448201527f616c20696e636c7573696f6e2070726f6f66000000000000000000000000000060648201526084016104a5565b60008181526034602052604090205460ff1615611200576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206160448201527f6c7265616479206265656e2066696e616c697a6564000000000000000000000060648201526084016104a5565b600081815260346020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055611243614e208a61396f565b5a10156112d2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f4f7074696d69736d506f7274616c3a20696e73756666696369656e742067617360448201527f20746f2066696e616c697a65207769746864726177616c00000000000000000060648201526084016104a5565b603380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8e16179055604080516020601f8a0181900481028201810190925288815260009161135b918e918d918f918691908f908f908190840183828082843760009201919091525061177d92505050565b50603380547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead17905560405190915082907fdb5c7652857aa163daadd670e116628fb42e869d8ac4251ef8971d9e5727df1b906113c190841515815260200190565b60405180910390a25050505050505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b6000818312156114055781611407565b825b90505b92915050565b60008183126114055781611407565b6000611407670de0b6b3a76400008361143786611808565b611441919061370e565b61144b9190613632565b611a4c565b6000818310156114055781611407565b6000805a90505b825a61147390836135ec565b101561148957611482826139ed565b9150611467565b505050565b60008054610100900460ff1615611545578160ff1660011480156114b15750303b155b61153d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016104a5565b506000919050565b60005460ff8084169116106115dc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016104a5565b50600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff92909216919091179055600190565b919050565b60008160000151826020015183604001518460600151604051602001611658949392919093845260208401929092526040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b600086868686868660405160200161169296959493929190613a26565b6040516020818303038152906040528051906020012090509695505050505050565b604080516020810185905260009181018290528190606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828252805160209182012090830181905292506117729101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828201909152600182527f01000000000000000000000000000000000000000000000000000000000000006020830152908587611c8b565b9150505b9392505050565b6000606060008060008661ffff1667ffffffffffffffff8111156117a3576117a3613253565b6040519080825280601f01601f1916602001820160405280156117cd576020820181803683370190505b5090506000808751602089018b8e8ef191503d9250868311156117ee578692505b828152826000602083013e90999098509650505050505050565b6000808213611873576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e4544000000000000000000000000000000000000000000000060448201526064016104a5565b6000606061188084611caf565b03609f8181039490941b90931c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506027d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b393909302929092017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d92915050565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdb731c958f34d94c18213611a7d57506000919050565b680755bf798b4a1bf1e58212611aef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4558505f4f564552464c4f57000000000000000000000000000000000000000060448201526064016104a5565b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b600080611c9786611d85565b9050611ca581868686611db7565b9695505050505050565b6000808211611d1a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e4544000000000000000000000000000000000000000000000060448201526064016104a5565b5060016fffffffffffffffffffffffffffffffff821160071b82811c67ffffffffffffffff1060061b1782811c63ffffffff1060051b1782811c61ffff1060041b1782811c60ff10600390811b90911783811c600f1060021b1783811c909110821b1791821c111790565b60608180519060200120604051602001611da191815260200190565b6040516020818303038152906040529050919050565b6000806000611dc7878686611df4565b91509150818015611de957508051602080830191909120875191880191909120145b979650505050505050565b600060606000611e0385611ee9565b90506000806000611e15848a89611fe4565b81519295509093509150158080611e295750815b611e8f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e00000000000060448201526064016104a5565b600081611eab5760405180602001604052806000815250611ed7565b611ed786611eba6001886135ec565b81518110611eca57611eca613a7d565b6020026020010151612501565b919b919a509098505050505050505050565b60606000611ef68361252b565b90506000815167ffffffffffffffff811115611f1457611f14613253565b604051908082528060200260200182016040528015611f5957816020015b6040805180820190915260608082526020820152815260200190600190039081611f325790505b50905060005b8251811015611fdc576000611f8c848381518110611f7f57611f7f613a7d565b602002602001015161255e565b90506040518060400160405280828152602001611fa88361252b565b815250838381518110611fbd57611fbd613a7d565b6020026020010181905250508080611fd4906139ed565b915050611f5f565b509392505050565b60006060818080611ff487612608565b9050600086905060008061201b604051806040016040528060608152602001606081525090565b60005b8c518110156124bd578c818151811061203957612039613a7d565b60200260200101519150828461204f919061396f565b935061205c60018861396f565b9650836120da578151805160209091012085146120d5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f496e76616c696420726f6f74206861736800000000000000000000000000000060448201526064016104a5565b6121cb565b815151602011612156578151805160209091012085146120d5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c2068617368000000000060448201526064016104a5565b84612164836000015161278b565b146121cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f6465206861736800000000000060448201526064016104a5565b6121d76010600161396f565b82602001515114156122505785518414156121f1576124bd565b600086858151811061220557612205613a7d565b602001015160f81c60f81b60f81c9050600083602001518260ff168151811061223057612230613a7d565b60200260200101519050612243816127b3565b96506001945050506124ab565b60028260200151511415612449576000612269836127e9565b905060008160008151811061228057612280613a7d565b016020015160f81c90506000612297600283613aac565b6122a2906002613ace565b905060006122b3848360ff1661280d565b905060006122c18b8a61280d565b905060006122cf8383612843565b905060ff8516600214806122e6575060ff85166003145b1561233c578083511480156122fb5750808251145b1561230d5761230a818b61396f565b99505b507f800000000000000000000000000000000000000000000000000000000000000099506124bd945050505050565b60ff8516158061234f575060ff85166001145b156123c1578251811461238b57507f800000000000000000000000000000000000000000000000000000000000000099506124bd945050505050565b6123b288602001516001815181106123a5576123a5613a7d565b60200260200101516127b3565b9a5097506124ab945050505050565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f52656365697665642061206e6f6465207769746820616e20756e6b6e6f776e2060448201527f707265666978000000000000000000000000000000000000000000000000000060648201526084016104a5565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e00000060448201526064016104a5565b806124b5816139ed565b91505061201e565b507f80000000000000000000000000000000000000000000000000000000000000008414866124ec878661280d565b909e909d50909b509950505050505050505050565b6020810151805160609161140a9161251b906001906135ec565b81518110611f7f57611f7f613a7d565b60408051808201825260008082526020918201528151808301909252825182528083019082015260609061140a906128ef565b6060600080600061256e85612b22565b91945092509050600081600181111561258957612589613af1565b146125f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e000000000000000060448201526064016104a5565b6125ff85602001518484612f29565b95945050505050565b606060008251600261261a919061383e565b67ffffffffffffffff81111561263257612632613253565b6040519080825280601f01601f19166020018201604052801561265c576020820181803683370190505b50905060005b835181101561278457600484828151811061267f5761267f613a7d565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016901c826126b483600261383e565b815181106126c4576126c4613a7d565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350601084828151811061270757612707613a7d565b0160200151612719919060f81c613aac565b60f81b8261272883600261383e565b61273390600161396f565b8151811061274357612743613a7d565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508061277c816139ed565b915050612662565b5092915050565b600060208251101561279f57506020015190565b8180602001905181019061140a9190613942565b600060606020836000015110156127d4576127cd83613008565b90506127e0565b6127dd8361255e565b90505b6117768161278b565b606061140a6128088360200151600081518110611f7f57611f7f613a7d565b612608565b60608251821061282c575060408051602081019091526000815261140a565b611407838384865161283e91906135ec565b613013565b6000805b8084511180156128575750808351115b80156128d8575082818151811061287057612870613a7d565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168482815181106128af576128af613a7d565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b1561140757806128e7816139ed565b915050612847565b60606000806128fd84612b22565b9193509091506001905081600181111561291957612919613af1565b14612980576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e00000000000000000060448201526064016104a5565b6040805160208082526104208201909252600091816020015b60408051808201909152600080825260208201528152602001906001900390816129995790505090506000835b8651811015612b175760208210612a5f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f50726f766964656420524c50206c6973742065786365656473206d6178206c6960448201527f7374206c656e6774682e0000000000000000000000000000000000000000000060648201526084016104a5565b600080612a9c6040518060400160405280858c60000151612a8091906135ec565b8152602001858c60200151612a95919061396f565b9052612b22565b509150915060405180604001604052808383612ab8919061396f565b8152602001848b60200151612acd919061396f565b815250858581518110612ae257612ae2613a7d565b6020908102919091010152612af860018561396f565b9350612b04818361396f565b612b0e908461396f565b925050506129c6565b508152949350505050565b600080600080846000015111612b94576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e000000000000000060448201526064016104a5565b6020840151805160001a607f8111612bb9576000600160009450945094505050612f22565b60b78111612c4f576000612bce6080836135ec565b905080876000015111612c3d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e0000000000000060448201526064016104a5565b60019550935060009250612f22915050565b60bf8111612d72576000612c6460b7836135ec565b905080876000015111612cd3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e0060448201526064016104a5565b600183015160208290036101000a9004612ced818361396f565b885111612d56576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e000000000000000060448201526064016104a5565b612d6182600161396f565b9650945060009350612f2292505050565b60f78111612e07576000612d8760c0836135ec565b905080876000015111612df6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e00000000000000000060448201526064016104a5565b600195509350849250612f22915050565b6000612e1460f7836135ec565b905080876000015111612e83576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e00000060448201526064016104a5565b600183015160208290036101000a9004612e9d818361396f565b885111612f06576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f496e76616c696420524c50206c6f6e67206c6973742e0000000000000000000060448201526064016104a5565b612f1182600161396f565b9650945060019350612f2292505050565b9193909250565b606060008267ffffffffffffffff811115612f4657612f46613253565b6040519080825280601f01601f191660200182016040528015612f70576020820181803683370190505b509050805160001415612f84579050611776565b6000612f90858761396f565b90506020820160005b612fa46020876138df565b811015612fdb5782518252612fba60208461396f565b9250612fc760208361396f565b915080612fd3816139ed565b915050612f99565b5060006001602087066020036101000a039050808251168119845116178252839450505050509392505050565b606061140a82613200565b60608161302181601f61396f565b1015613089576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016104a5565b82613094838261396f565b10156130fc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016104a5565b613106828461396f565b84511015613170576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e647300000000000000000000000000000060448201526064016104a5565b60608215801561318f57604051915060008252602082016040526131f7565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156131c85780518352602092830192016131b0565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b606061140a826020015160008460000151612f29565b60006020828403121561322857600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461161457600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156132c9576132c9613253565b604052919050565b600080600080600060a086880312156132e957600080fd5b6132f28661322f565b94506020808701359450604087013567ffffffffffffffff808216821461331857600080fd5b909450606088013590811515821461332f57600080fd5b9093506080880135908082111561334557600080fd5b818901915089601f83011261335957600080fd5b81358181111561336b5761336b613253565b61339b847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601613282565b91508082528a848285010111156133b157600080fd5b80848401858401376000848284010152508093505050509295509295909350565b60008083601f8401126133e457600080fd5b50813567ffffffffffffffff8111156133fc57600080fd5b60208301915083602082850101111561341457600080fd5b9250929050565b60008060008060008060008060008060006101808c8e03121561343d57600080fd5b8b359a5061344d60208d0161322f565b995061345b60408d0161322f565b985060608c0135975060808c0135965067ffffffffffffffff60a08d0135111561348457600080fd5b6134948d60a08e01358e016133d2565b909650945060c08c0135935060808c8e037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff200112156134d257600080fd5b60e08c01925067ffffffffffffffff6101608d013511156134f257600080fd5b6135038d6101608e01358e016133d2565b81935080925050509295989b509295989b9093969950565b6000815180845260005b8181101561354157602081850181015186830182015201613525565b81811115613553576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b85815284602082015267ffffffffffffffff84166040820152821515606082015260a060808201526000611de960a083018461351b565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000828210156135fe576135fe6135bd565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261364157613641613603565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f800000000000000000000000000000000000000000000000000000000000000083141615613695576136956135bd565b500590565b6000808312837f8000000000000000000000000000000000000000000000000000000000000000018312811516156136d4576136d46135bd565b837f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018313811615613708576137086135bd565b50500390565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60008413600084138583048511828216161561374f5761374f6135bd565b7f8000000000000000000000000000000000000000000000000000000000000000600087128682058812818416161561378a5761378a6135bd565b600087129250878205871284841616156137a6576137a66135bd565b878505871281841616156137bc576137bc6135bd565b505050929093029392505050565b6000808212827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03841381151615613804576138046135bd565b827f8000000000000000000000000000000000000000000000000000000000000000038412811615613838576138386135bd565b50500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613876576138766135bd565b500290565b600067ffffffffffffffff80831681851680830382111561389e5761389e6135bd565b01949350505050565b60006fffffffffffffffffffffffffffffffff808316818516818304811182151516156138d6576138d66135bd565b02949350505050565b6000826138ee576138ee613603565b500490565b60006040828403121561390557600080fd5b6040516040810181811067ffffffffffffffff8211171561392857613928613253565b604052825181526020928301519281019290925250919050565b60006020828403121561395457600080fd5b5051919050565b60008261396a5761396a613603565b500690565b60008219821115613982576139826135bd565b500190565b60006080828403121561399957600080fd5b6040516080810181811067ffffffffffffffff821117156139bc576139bc613253565b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613a1f57613a1f6135bd565b5060010190565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a0830152613a7160c083018461351b565b98975050505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060ff831680613abf57613abf613603565b8060ff84160691505092915050565b600060ff821660ff841680821015613ae857613ae86135bd565b90039392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c634300080a000a" var OptimismPortalDeployedBin = "0x6080604052600436106100f65760003560e01c8063a14238e71161008a578063e9e05c4211610059578063e9e05c4214610376578063eecf1c3614610389578063f4daa2911461039c578063ffa1ad74146103d057600080fd5b8063a14238e71461027b578063ca3e99ba146102ab578063cd7c9789146102c0578063cff0ab96146102d557600080fd5b80636dbffb78116100c65780636dbffb78146101f35780638129fc1c14610223578063867ead13146102385780639bf62d821461024e57600080fd5b80621c2ff61461012257806313620abd1461018057806364b79208146101b95780636bb0291e146101de57600080fd5b3661011d5761011b3334620186a06000604051806020016040528060008152506103f7565b005b600080fd5b34801561012e57600080fd5b506101567f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561018c57600080fd5b50610198633b9aca0081565b6040516fffffffffffffffffffffffffffffffff9091168152602001610177565b3480156101c557600080fd5b506101d0627a120081565b604051908152602001610177565b3480156101ea57600080fd5b506101d0600481565b3480156101ff57600080fd5b5061021361020e366004613216565b61089d565b6040519015158152602001610177565b34801561022f57600080fd5b5061011b610bab565b34801561024457600080fd5b506101d061271081565b34801561025a57600080fd5b506033546101569073ffffffffffffffffffffffffffffffffffffffff1681565b34801561028757600080fd5b50610213610296366004613216565b60346020526000908152604090205460ff1681565b3480156102b757600080fd5b506101d0610cd1565b3480156102cc57600080fd5b506101d0600881565b3480156102e157600080fd5b5060015461033d906fffffffffffffffffffffffffffffffff81169067ffffffffffffffff7001000000000000000000000000000000008204811691780100000000000000000000000000000000000000000000000090041683565b604080516fffffffffffffffffffffffffffffffff909416845267ffffffffffffffff9283166020850152911690820152606001610177565b61011b6103843660046132d1565b6103f7565b61011b61039736600461341b565b610ce2565b3480156103a857600080fd5b506101d07f000000000000000000000000000000000000000000000000000000000000000081565b3480156103dc57600080fd5b506103e5600181565b60405160ff9091168152602001610177565b8260005a905083156104ae5773ffffffffffffffffffffffffffffffffffffffff8716156104ae57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f4f7074696d69736d506f7274616c3a206d7573742073656e6420746f2061646460448201527f72657373283029207768656e206372656174696e67206120636f6e747261637460648201526084015b60405180910390fd5b333281146104cf575033731111000000000000000000000000000000001111015b8773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f78231ae6eb73366f912bb1d64351601fb76344c537bbab635ce14d0f376f0195348a8a8a8a604051610534959493929190613586565b60405180910390a350600154600090610573907801000000000000000000000000000000000000000000000000900467ffffffffffffffff16436135ec565b905080156106fc57600061058b6004627a1200613632565b6001546105b69190700100000000000000000000000000000000900467ffffffffffffffff1661369a565b9050600060086105ca6004627a1200613632565b6001546105ea9085906fffffffffffffffffffffffffffffffff1661370e565b6105f49190613632565b6105fe9190613632565b60015490915060009061064a906106349061062c9085906fffffffffffffffffffffffffffffffff166137ca565b6127106113f5565b6fffffffffffffffffffffffffffffffff611410565b905060018411156106bd576106ba610634670de0b6b3a76400006106a6610672600883613632565b61068490670de0b6b3a764000061369a565b61068f60018a6135ec565b6106a190670de0b6b3a764000061383e565b61141f565b6106b0908561370e565b61062c9190613632565b90505b6fffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff4316021760015550505b6001805484919060109061072f908490700100000000000000000000000000000000900467ffffffffffffffff1661387b565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550627a1200600160000160109054906101000a900467ffffffffffffffff1667ffffffffffffffff16131561080b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603c60248201527f4f7074696d69736d506f7274616c3a2063616e6e6f7420627579206d6f72652060448201527f676173207468616e20617661696c61626c6520676173206c696d69740000000060648201526084016104a5565b600154600090610837906fffffffffffffffffffffffffffffffff1667ffffffffffffffff86166138a7565b6fffffffffffffffffffffffffffffffff169050600061085b48633b9aca00611450565b61086590836138df565b905060005a61087490866135ec565b9050808211156108905761089061088b82846135ec565b611460565b5050505050505050505050565b6040517fa25ae55700000000000000000000000000000000000000000000000000000000815260048101829052600090819073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063a25ae557906024016040805180830381865afa15801561092c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061095091906138f3565b8051909150610b725760007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663529933df6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ea9190613942565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16634ab65d736040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a7d9190613942565b905084811115610a9257506000949350505050565b600082610a9f83886135ec565b610aa9919061395b565b905073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001663a25ae557610af183866135ec565b610afb908961396f565b6040518263ffffffff1660e01b8152600401610b1991815260200190565b6040805180830381865afa158015610b35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b5991906138f3565b8051909450610b6e5750600095945050505050565b5050505b7f00000000000000000000000000000000000000000000000000000000000000008160200151610ba2919061396f565b42119392505050565b60016000610bb88261148e565b90508015610bed57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b603380547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead179055610c6860408051606081018252633b9aca00808252600060208301524367ffffffffffffffff169190920181905278010000000000000000000000000000000000000000000000000217600155565b8015610ccd57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905560405160ff831681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b610cdf6004627a1200613632565b81565b60335473ffffffffffffffffffffffffffffffffffffffff1661dead14610d8b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a2063616e206f6e6c79207472696767657260448201527f206f6e65207769746864726177616c20706572207472616e73616374696f6e0060648201526084016104a5565b73ffffffffffffffffffffffffffffffffffffffff8916301415610e31576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a20796f752063616e6e6f742073656e642060448201527f6d6573736167657320746f2074686520706f7274616c20636f6e74726163740060648201526084016104a5565b6040517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018590526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063a25ae557906024016040805180830381865afa158015610ebe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ee291906138f3565b90507f00000000000000000000000000000000000000000000000000000000000000008160200151610f14919061396f565b4211610fa2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4f7074696d69736d506f7274616c3a2070726f706f73616c206973206e6f742060448201527f7965742066696e616c697a65640000000000000000000000000000000000000060648201526084016104a5565b610fb9610fb436869003860186613987565b611619565b815114611048576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4f7074696d69736d506f7274616c3a20696e76616c6964206f7574707574207260448201527f6f6f742070726f6f66000000000000000000000000000000000000000000000060648201526084016104a5565b600061108e8d8d8d8d8d8d8d8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061167592505050565b90506110d581866040013586868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506116b492505050565b611161576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4f7074696d69736d506f7274616c3a20696e76616c696420776974686472617760448201527f616c20696e636c7573696f6e2070726f6f66000000000000000000000000000060648201526084016104a5565b60008181526034602052604090205460ff1615611200576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206160448201527f6c7265616479206265656e2066696e616c697a6564000000000000000000000060648201526084016104a5565b600081815260346020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055611243614e208a61396f565b5a10156112d2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f4f7074696d69736d506f7274616c3a20696e73756666696369656e742067617360448201527f20746f2066696e616c697a65207769746864726177616c00000000000000000060648201526084016104a5565b603380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8e16179055604080516020601f8a0181900481028201810190925288815260009161135b918e918d918f918691908f908f908190840183828082843760009201919091525061177d92505050565b50603380547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead17905560405190915082907fdb5c7652857aa163daadd670e116628fb42e869d8ac4251ef8971d9e5727df1b906113c190841515815260200190565b60405180910390a25050505050505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b6000818312156114055781611407565b825b90505b92915050565b60008183126114055781611407565b6000611407670de0b6b3a76400008361143786611808565b611441919061370e565b61144b9190613632565b611a4c565b6000818310156114055781611407565b6000805a90505b825a61147390836135ec565b101561148957611482826139ed565b9150611467565b505050565b60008054610100900460ff1615611545578160ff1660011480156114b15750303b155b61153d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016104a5565b506000919050565b60005460ff8084169116106115dc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016104a5565b50600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff92909216919091179055600190565b919050565b60008160000151826020015183604001518460600151604051602001611658949392919093845260208401929092526040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b600086868686868660405160200161169296959493929190613a26565b6040516020818303038152906040528051906020012090509695505050505050565b604080516020810185905260009181018290528190606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828252805160209182012090830181905292506117729101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828201909152600182527f01000000000000000000000000000000000000000000000000000000000000006020830152908587611c8b565b9150505b9392505050565b6000606060008060008661ffff1667ffffffffffffffff8111156117a3576117a3613253565b6040519080825280601f01601f1916602001820160405280156117cd576020820181803683370190505b5090506000808751602089018b8e8ef191503d9250868311156117ee578692505b828152826000602083013e90999098509650505050505050565b6000808213611873576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e4544000000000000000000000000000000000000000000000060448201526064016104a5565b6000606061188084611caf565b03609f8181039490941b90931c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506027d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b393909302929092017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d92915050565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdb731c958f34d94c18213611a7d57506000919050565b680755bf798b4a1bf1e58212611aef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4558505f4f564552464c4f57000000000000000000000000000000000000000060448201526064016104a5565b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b600080611c9786611d85565b9050611ca581868686611db7565b9695505050505050565b6000808211611d1a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e4544000000000000000000000000000000000000000000000060448201526064016104a5565b5060016fffffffffffffffffffffffffffffffff821160071b82811c67ffffffffffffffff1060061b1782811c63ffffffff1060051b1782811c61ffff1060041b1782811c60ff10600390811b90911783811c600f1060021b1783811c909110821b1791821c111790565b60608180519060200120604051602001611da191815260200190565b6040516020818303038152906040529050919050565b6000806000611dc7878686611df4565b91509150818015611de957508051602080830191909120875191880191909120145b979650505050505050565b600060606000611e0385611ee9565b90506000806000611e15848a89611fe4565b81519295509093509150158080611e295750815b611e8f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e00000000000060448201526064016104a5565b600081611eab5760405180602001604052806000815250611ed7565b611ed786611eba6001886135ec565b81518110611eca57611eca613a7d565b6020026020010151612501565b919b919a509098505050505050505050565b60606000611ef68361252b565b90506000815167ffffffffffffffff811115611f1457611f14613253565b604051908082528060200260200182016040528015611f5957816020015b6040805180820190915260608082526020820152815260200190600190039081611f325790505b50905060005b8251811015611fdc576000611f8c848381518110611f7f57611f7f613a7d565b602002602001015161255e565b90506040518060400160405280828152602001611fa88361252b565b815250838381518110611fbd57611fbd613a7d565b6020026020010181905250508080611fd4906139ed565b915050611f5f565b509392505050565b60006060818080611ff487612608565b9050600086905060008061201b604051806040016040528060608152602001606081525090565b60005b8c518110156124bd578c818151811061203957612039613a7d565b60200260200101519150828461204f919061396f565b935061205c60018861396f565b9650836120da578151805160209091012085146120d5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f496e76616c696420726f6f74206861736800000000000000000000000000000060448201526064016104a5565b6121cb565b815151602011612156578151805160209091012085146120d5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c2068617368000000000060448201526064016104a5565b84612164836000015161278b565b146121cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f6465206861736800000000000060448201526064016104a5565b6121d76010600161396f565b82602001515114156122505785518414156121f1576124bd565b600086858151811061220557612205613a7d565b602001015160f81c60f81b60f81c9050600083602001518260ff168151811061223057612230613a7d565b60200260200101519050612243816127b3565b96506001945050506124ab565b60028260200151511415612449576000612269836127e9565b905060008160008151811061228057612280613a7d565b016020015160f81c90506000612297600283613aac565b6122a2906002613ace565b905060006122b3848360ff1661280d565b905060006122c18b8a61280d565b905060006122cf8383612843565b905060ff8516600214806122e6575060ff85166003145b1561233c578083511480156122fb5750808251145b1561230d5761230a818b61396f565b99505b507f800000000000000000000000000000000000000000000000000000000000000099506124bd945050505050565b60ff8516158061234f575060ff85166001145b156123c1578251811461238b57507f800000000000000000000000000000000000000000000000000000000000000099506124bd945050505050565b6123b288602001516001815181106123a5576123a5613a7d565b60200260200101516127b3565b9a5097506124ab945050505050565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f52656365697665642061206e6f6465207769746820616e20756e6b6e6f776e2060448201527f707265666978000000000000000000000000000000000000000000000000000060648201526084016104a5565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e00000060448201526064016104a5565b806124b5816139ed565b91505061201e565b507f80000000000000000000000000000000000000000000000000000000000000008414866124ec878661280d565b909e909d50909b509950505050505050505050565b6020810151805160609161140a9161251b906001906135ec565b81518110611f7f57611f7f613a7d565b60408051808201825260008082526020918201528151808301909252825182528083019082015260609061140a906128ef565b6060600080600061256e85612b22565b91945092509050600081600181111561258957612589613af1565b146125f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e000000000000000060448201526064016104a5565b6125ff85602001518484612f29565b95945050505050565b606060008251600261261a919061383e565b67ffffffffffffffff81111561263257612632613253565b6040519080825280601f01601f19166020018201604052801561265c576020820181803683370190505b50905060005b835181101561278457600484828151811061267f5761267f613a7d565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016901c826126b483600261383e565b815181106126c4576126c4613a7d565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350601084828151811061270757612707613a7d565b0160200151612719919060f81c613aac565b60f81b8261272883600261383e565b61273390600161396f565b8151811061274357612743613a7d565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508061277c816139ed565b915050612662565b5092915050565b600060208251101561279f57506020015190565b8180602001905181019061140a9190613942565b600060606020836000015110156127d4576127cd83613008565b90506127e0565b6127dd8361255e565b90505b6117768161278b565b606061140a6128088360200151600081518110611f7f57611f7f613a7d565b612608565b60608251821061282c575060408051602081019091526000815261140a565b611407838384865161283e91906135ec565b613013565b6000805b8084511180156128575750808351115b80156128d8575082818151811061287057612870613a7d565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168482815181106128af576128af613a7d565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b1561140757806128e7816139ed565b915050612847565b60606000806128fd84612b22565b9193509091506001905081600181111561291957612919613af1565b14612980576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e00000000000000000060448201526064016104a5565b6040805160208082526104208201909252600091816020015b60408051808201909152600080825260208201528152602001906001900390816129995790505090506000835b8651811015612b175760208210612a5f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f50726f766964656420524c50206c6973742065786365656473206d6178206c6960448201527f7374206c656e6774682e0000000000000000000000000000000000000000000060648201526084016104a5565b600080612a9c6040518060400160405280858c60000151612a8091906135ec565b8152602001858c60200151612a95919061396f565b9052612b22565b509150915060405180604001604052808383612ab8919061396f565b8152602001848b60200151612acd919061396f565b815250858581518110612ae257612ae2613a7d565b6020908102919091010152612af860018561396f565b9350612b04818361396f565b612b0e908461396f565b925050506129c6565b508152949350505050565b600080600080846000015111612b94576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e000000000000000060448201526064016104a5565b6020840151805160001a607f8111612bb9576000600160009450945094505050612f22565b60b78111612c4f576000612bce6080836135ec565b905080876000015111612c3d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e0000000000000060448201526064016104a5565b60019550935060009250612f22915050565b60bf8111612d72576000612c6460b7836135ec565b905080876000015111612cd3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e0060448201526064016104a5565b600183015160208290036101000a9004612ced818361396f565b885111612d56576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e000000000000000060448201526064016104a5565b612d6182600161396f565b9650945060009350612f2292505050565b60f78111612e07576000612d8760c0836135ec565b905080876000015111612df6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e00000000000000000060448201526064016104a5565b600195509350849250612f22915050565b6000612e1460f7836135ec565b905080876000015111612e83576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e00000060448201526064016104a5565b600183015160208290036101000a9004612e9d818361396f565b885111612f06576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f496e76616c696420524c50206c6f6e67206c6973742e0000000000000000000060448201526064016104a5565b612f1182600161396f565b9650945060019350612f2292505050565b9193909250565b606060008267ffffffffffffffff811115612f4657612f46613253565b6040519080825280601f01601f191660200182016040528015612f70576020820181803683370190505b509050805160001415612f84579050611776565b6000612f90858761396f565b90506020820160005b612fa46020876138df565b811015612fdb5782518252612fba60208461396f565b9250612fc760208361396f565b915080612fd3816139ed565b915050612f99565b5060006001602087066020036101000a039050808251168119845116178252839450505050509392505050565b606061140a82613200565b60608161302181601f61396f565b1015613089576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016104a5565b82613094838261396f565b10156130fc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016104a5565b613106828461396f565b84511015613170576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e647300000000000000000000000000000060448201526064016104a5565b60608215801561318f57604051915060008252602082016040526131f7565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156131c85780518352602092830192016131b0565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b606061140a826020015160008460000151612f29565b60006020828403121561322857600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461161457600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156132c9576132c9613253565b604052919050565b600080600080600060a086880312156132e957600080fd5b6132f28661322f565b94506020808701359450604087013567ffffffffffffffff808216821461331857600080fd5b909450606088013590811515821461332f57600080fd5b9093506080880135908082111561334557600080fd5b818901915089601f83011261335957600080fd5b81358181111561336b5761336b613253565b61339b847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601613282565b91508082528a848285010111156133b157600080fd5b80848401858401376000848284010152508093505050509295509295909350565b60008083601f8401126133e457600080fd5b50813567ffffffffffffffff8111156133fc57600080fd5b60208301915083602082850101111561341457600080fd5b9250929050565b60008060008060008060008060008060006101808c8e03121561343d57600080fd5b8b359a5061344d60208d0161322f565b995061345b60408d0161322f565b985060608c0135975060808c0135965067ffffffffffffffff60a08d0135111561348457600080fd5b6134948d60a08e01358e016133d2565b909650945060c08c0135935060808c8e037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff200112156134d257600080fd5b60e08c01925067ffffffffffffffff6101608d013511156134f257600080fd5b6135038d6101608e01358e016133d2565b81935080925050509295989b509295989b9093969950565b6000815180845260005b8181101561354157602081850181015186830182015201613525565b81811115613553576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b85815284602082015267ffffffffffffffff84166040820152821515606082015260a060808201526000611de960a083018461351b565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000828210156135fe576135fe6135bd565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261364157613641613603565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f800000000000000000000000000000000000000000000000000000000000000083141615613695576136956135bd565b500590565b6000808312837f8000000000000000000000000000000000000000000000000000000000000000018312811516156136d4576136d46135bd565b837f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018313811615613708576137086135bd565b50500390565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60008413600084138583048511828216161561374f5761374f6135bd565b7f8000000000000000000000000000000000000000000000000000000000000000600087128682058812818416161561378a5761378a6135bd565b600087129250878205871284841616156137a6576137a66135bd565b878505871281841616156137bc576137bc6135bd565b505050929093029392505050565b6000808212827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03841381151615613804576138046135bd565b827f8000000000000000000000000000000000000000000000000000000000000000038412811615613838576138386135bd565b50500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613876576138766135bd565b500290565b600067ffffffffffffffff80831681851680830382111561389e5761389e6135bd565b01949350505050565b60006fffffffffffffffffffffffffffffffff808316818516818304811182151516156138d6576138d66135bd565b02949350505050565b6000826138ee576138ee613603565b500490565b60006040828403121561390557600080fd5b6040516040810181811067ffffffffffffffff8211171561392857613928613253565b604052825181526020928301519281019290925250919050565b60006020828403121561395457600080fd5b5051919050565b60008261396a5761396a613603565b500690565b60008219821115613982576139826135bd565b500190565b60006080828403121561399957600080fd5b6040516080810181811067ffffffffffffffff821117156139bc576139bc613253565b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613a1f57613a1f6135bd565b5060010190565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a0830152613a7160c083018461351b565b98975050505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060ff831680613abf57613abf613603565b8060ff84160691505092915050565b600060ff821660ff841680821015613ae857613ae86135bd565b90039392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c634300080a000a"
...@@ -27,26 +27,26 @@ L1CrossDomainMessenger_Test:testCannot_L1MessengerPause() (gas: 10844) ...@@ -27,26 +27,26 @@ L1CrossDomainMessenger_Test:testCannot_L1MessengerPause() (gas: 10844)
L1CrossDomainMessenger_Test:testCannot_L1MessengerUnpause() (gas: 10858) L1CrossDomainMessenger_Test:testCannot_L1MessengerUnpause() (gas: 10858)
L1CrossDomainMessenger_Test:test_L1MessengerMessageVersion() (gas: 8388) L1CrossDomainMessenger_Test:test_L1MessengerMessageVersion() (gas: 8388)
L1CrossDomainMessenger_Test:test_L1MessengerPause() (gas: 31860) L1CrossDomainMessenger_Test:test_L1MessengerPause() (gas: 31860)
L1CrossDomainMessenger_Test:test_L1MessengerRelayMessageSucceeds() (gas: 61217) L1CrossDomainMessenger_Test:test_L1MessengerRelayMessageSucceeds() (gas: 61261)
L1CrossDomainMessenger_Test:test_L1MessengerRelayMessageToSystemContract() (gas: 44837) L1CrossDomainMessenger_Test:test_L1MessengerRelayMessageToSystemContract() (gas: 44903)
L1CrossDomainMessenger_Test:test_L1MessengerRelayShouldRevertIfPaused() (gas: 41587) L1CrossDomainMessenger_Test:test_L1MessengerRelayShouldRevertIfPaused() (gas: 41587)
L1CrossDomainMessenger_Test:test_L1MessengerSendMessage() (gas: 172199) L1CrossDomainMessenger_Test:test_L1MessengerSendMessage() (gas: 172133)
L1CrossDomainMessenger_Test:test_L1MessengerTwiceSendMessage() (gas: 1254211) L1CrossDomainMessenger_Test:test_L1MessengerTwiceSendMessage() (gas: 1254167)
L1CrossDomainMessenger_Test:test_L1MessengerUnpause() (gas: 23804) L1CrossDomainMessenger_Test:test_L1MessengerUnpause() (gas: 23804)
L1CrossDomainMessenger_Test:test_L1MessengerXDomainSenderReverts() (gas: 10599) L1CrossDomainMessenger_Test:test_L1MessengerXDomainSenderReverts() (gas: 10599)
L1CrossDomainMessenger_Test:test_L1MessengerxDomainMessageSenderResets() (gas: 59022) L1CrossDomainMessenger_Test:test_L1MessengerxDomainMessageSenderResets() (gas: 59088)
L1StandardBridge_Test:test_depositERC20() (gas: 452889) L1StandardBridge_Test:test_depositERC20() (gas: 452890)
L1StandardBridge_Test:test_depositERC20To() (gas: 454644) L1StandardBridge_Test:test_depositERC20To() (gas: 454645)
L1StandardBridge_Test:test_depositETH() (gas: 247083) L1StandardBridge_Test:test_depositETH() (gas: 247039)
L1StandardBridge_Test:test_depositETHTo() (gas: 204967) L1StandardBridge_Test:test_depositETHTo() (gas: 204923)
L1StandardBridge_Test:test_finalizeERC20Withdrawal() (gas: 438779) L1StandardBridge_Test:test_finalizeERC20Withdrawal() (gas: 438816)
L1StandardBridge_Test:test_finalizeETHWithdrawal() (gas: 48005) L1StandardBridge_Test:test_finalizeETHWithdrawal() (gas: 47983)
L1StandardBridge_Test:test_initialize() (gas: 14885) L1StandardBridge_Test:test_initialize() (gas: 14863)
L1StandardBridge_Test:test_onlyEOADepositERC20() (gas: 12085) L1StandardBridge_Test:test_onlyEOADepositERC20() (gas: 12085)
L1StandardBridge_Test:test_onlyEOADepositETH() (gas: 30637) L1StandardBridge_Test:test_onlyEOADepositETH() (gas: 30615)
L1StandardBridge_Test:test_onlyL2BridgeFinalizeERC20Withdrawal() (gas: 23565) L1StandardBridge_Test:test_onlyL2BridgeFinalizeERC20Withdrawal() (gas: 23543)
L1StandardBridge_Test:test_onlyPortalFinalizeERC20Withdrawal() (gas: 22919) L1StandardBridge_Test:test_onlyPortalFinalizeERC20Withdrawal() (gas: 22875)
L1StandardBridge_Test:test_receive() (gas: 391823) L1StandardBridge_Test:test_receive() (gas: 391801)
L2CrossDomainMessenger_Test:testCannot_L2MessengerPause() (gas: 10843) L2CrossDomainMessenger_Test:testCannot_L2MessengerPause() (gas: 10843)
L2CrossDomainMessenger_Test:test_L2MessengerMessageVersion() (gas: 8410) L2CrossDomainMessenger_Test:test_L2MessengerMessageVersion() (gas: 8410)
L2CrossDomainMessenger_Test:test_L2MessengerPause() (gas: 31837) L2CrossDomainMessenger_Test:test_L2MessengerPause() (gas: 31837)
...@@ -57,26 +57,26 @@ L2CrossDomainMessenger_Test:test_L2MessengerSendMessage() (gas: 119682) ...@@ -57,26 +57,26 @@ L2CrossDomainMessenger_Test:test_L2MessengerSendMessage() (gas: 119682)
L2CrossDomainMessenger_Test:test_L2MessengerTwiceSendMessage() (gas: 133142) L2CrossDomainMessenger_Test:test_L2MessengerTwiceSendMessage() (gas: 133142)
L2CrossDomainMessenger_Test:test_L2MessengerXDomainSenderReverts() (gas: 10599) L2CrossDomainMessenger_Test:test_L2MessengerXDomainSenderReverts() (gas: 10599)
L2CrossDomainMessenger_Test:test_L2MessengerxDomainMessageSenderResets() (gas: 54881) L2CrossDomainMessenger_Test:test_L2MessengerxDomainMessageSenderResets() (gas: 54881)
L2OutputOracleTest:testCannot_appendEmptyOutput() (gas: 24163) L2OutputOracleTest:testCannot_appendEmptyOutput() (gas: 24119)
L2OutputOracleTest:testCannot_appendFutureTimetamp() (gas: 26130) L2OutputOracleTest:testCannot_appendFutureTimetamp() (gas: 26086)
L2OutputOracleTest:testCannot_appendOnWrongFork() (gas: 26415) L2OutputOracleTest:testCannot_appendOnWrongFork() (gas: 26371)
L2OutputOracleTest:testCannot_appendOutputIfNotSequencer() (gas: 23554) L2OutputOracleTest:testCannot_appendOutputIfNotSequencer() (gas: 23510)
L2OutputOracleTest:testCannot_appendUnexpectedBlockNumber() (gas: 26039) L2OutputOracleTest:testCannot_appendUnexpectedBlockNumber() (gas: 25995)
L2OutputOracleTest:testCannot_deleteL2Output_ifNotOwner() (gas: 24799) L2OutputOracleTest:testCannot_deleteL2Output_ifNotOwner() (gas: 24777)
L2OutputOracleTest:testCannot_deleteL2Output_withWrongRoot() (gas: 91157) L2OutputOracleTest:testCannot_deleteL2Output_withWrongRoot() (gas: 91091)
L2OutputOracleTest:testCannot_deleteL2Output_withWrongTime() (gas: 87150) L2OutputOracleTest:testCannot_deleteL2Output_withWrongTime() (gas: 87084)
L2OutputOracleTest:test_appendWithBlockhashAndHeight() (gas: 75061) L2OutputOracleTest:test_appendWithBlockhashAndHeight() (gas: 75017)
L2OutputOracleTest:test_appendingAnotherOutput() (gas: 76861) L2OutputOracleTest:test_appendingAnotherOutput() (gas: 76817)
L2OutputOracleTest:test_changeSequencer() (gas: 55776) L2OutputOracleTest:test_changeSequencer() (gas: 55776)
L2OutputOracleTest:test_computeL2Timestamp() (gas: 30288) L2OutputOracleTest:test_computeL2Timestamp() (gas: 30200)
L2OutputOracleTest:test_constructor() (gas: 48845) L2OutputOracleTest:test_constructor() (gas: 48823)
L2OutputOracleTest:test_deleteL2Output() (gas: 76604) L2OutputOracleTest:test_deleteL2Output() (gas: 76516)
L2OutputOracleTest:test_getL2Output() (gas: 83012) L2OutputOracleTest:test_getL2Output() (gas: 82924)
L2OutputOracleTest:test_latestBlockNumber() (gas: 76264) L2OutputOracleTest:test_latestBlockNumber() (gas: 76220)
L2OutputOracleTest:test_nextBlockNumber() (gas: 15166) L2OutputOracleTest:test_nextBlockNumber() (gas: 15144)
L2OutputOracleTest:test_updateOwner() (gas: 34646) L2OutputOracleTest:test_updateOwner() (gas: 34580)
L2OutputOracleUpgradeable_Test:test_cannotInitImpl() (gas: 8453) L2OutputOracleUpgradeable_Test:test_cannotInitImpl() (gas: 8476)
L2OutputOracleUpgradeable_Test:test_cannotInitProxy() (gas: 13430) L2OutputOracleUpgradeable_Test:test_cannotInitProxy() (gas: 13453)
L2OutputOracleUpgradeable_Test:test_initValuesOnProxy() (gas: 38906) L2OutputOracleUpgradeable_Test:test_initValuesOnProxy() (gas: 38906)
L2OutputOracleUpgradeable_Test:test_upgrading() (gas: 230843) L2OutputOracleUpgradeable_Test:test_upgrading() (gas: 230843)
L2StandardBridge_Test:test_ERC20BridgeFailed_whenLocalTokenIsBridge() (gas: 133097) L2StandardBridge_Test:test_ERC20BridgeFailed_whenLocalTokenIsBridge() (gas: 133097)
...@@ -114,25 +114,25 @@ OptimismMintableTokenFactory_Test:test_createStandardL2Token() (gas: 1100125) ...@@ -114,25 +114,25 @@ OptimismMintableTokenFactory_Test:test_createStandardL2Token() (gas: 1100125)
OptimismMintableTokenFactory_Test:test_createStandardL2TokenSameTwice() (gas: 2181161) OptimismMintableTokenFactory_Test:test_createStandardL2TokenSameTwice() (gas: 2181161)
OptimismMintableTokenFactory_Test:test_createStandardL2TokenShouldRevertIfRemoteIsZero() (gas: 9374) OptimismMintableTokenFactory_Test:test_createStandardL2TokenShouldRevertIfRemoteIsZero() (gas: 9374)
OptimismMintableTokenFactory_Test:test_initializeShouldRevert() (gas: 12696) OptimismMintableTokenFactory_Test:test_initializeShouldRevert() (gas: 12696)
OptimismPortalUpgradeable_Test:test_cannotInitImpl() (gas: 10958) OptimismPortalUpgradeable_Test:test_cannotInitImpl() (gas: 10936)
OptimismPortalUpgradeable_Test:test_cannotInitProxy() (gas: 15956) OptimismPortalUpgradeable_Test:test_cannotInitProxy() (gas: 15934)
OptimismPortalUpgradeable_Test:test_initValuesOnProxy() (gas: 15967) OptimismPortalUpgradeable_Test:test_initValuesOnProxy() (gas: 16034)
OptimismPortalUpgradeable_Test:test_upgrading() (gas: 230843) OptimismPortalUpgradeable_Test:test_upgrading() (gas: 230843)
OptimismPortal_Test:test_OptimismPortalConstructor() (gas: 17286) OptimismPortal_Test:test_OptimismPortalConstructor() (gas: 17330)
OptimismPortal_Test:test_OptimismPortalContractCreationReverts() (gas: 14214) OptimismPortal_Test:test_OptimismPortalContractCreationReverts() (gas: 14192)
OptimismPortal_Test:test_OptimismPortalReceiveEth() (gas: 126643) OptimismPortal_Test:test_OptimismPortalReceiveEth() (gas: 126643)
OptimismPortal_Test:test_cannotVerifyRecentWithdrawal() (gas: 31945) OptimismPortal_Test:test_cannotVerifyRecentWithdrawal() (gas: 31901)
OptimismPortal_Test:test_depositTransaction_NoValueContract() (gas: 75774) OptimismPortal_Test:test_depositTransaction_NoValueContract() (gas: 75752)
OptimismPortal_Test:test_depositTransaction_NoValueEOA() (gas: 76120) OptimismPortal_Test:test_depositTransaction_NoValueEOA() (gas: 76098)
OptimismPortal_Test:test_depositTransaction_createWithZeroValueForContract() (gas: 75779) OptimismPortal_Test:test_depositTransaction_createWithZeroValueForContract() (gas: 75757)
OptimismPortal_Test:test_depositTransaction_createWithZeroValueForEOA() (gas: 76123) OptimismPortal_Test:test_depositTransaction_createWithZeroValueForEOA() (gas: 76101)
OptimismPortal_Test:test_depositTransaction_withEthValueAndContractContractCreation() (gas: 82823) OptimismPortal_Test:test_depositTransaction_withEthValueAndContractContractCreation() (gas: 82801)
OptimismPortal_Test:test_depositTransaction_withEthValueAndEOAContractCreation() (gas: 74941) OptimismPortal_Test:test_depositTransaction_withEthValueAndEOAContractCreation() (gas: 74919)
OptimismPortal_Test:test_depositTransaction_withEthValueFromContract() (gas: 82484) OptimismPortal_Test:test_depositTransaction_withEthValueFromContract() (gas: 82462)
OptimismPortal_Test:test_depositTransaction_withEthValueFromEOA() (gas: 83100) OptimismPortal_Test:test_depositTransaction_withEthValueFromEOA() (gas: 83078)
OptimismPortal_Test:test_invalidWithdrawalProof() (gas: 45251) OptimismPortal_Test:test_invalidWithdrawalProof() (gas: 45163)
OptimismPortal_Test:test_isOutputFinalized() (gas: 132162) OptimismPortal_Test:test_isOutputFinalized() (gas: 131744)
OptimismPortal_Test:test_simple_isOutputFinalized() (gas: 23965) OptimismPortal_Test:test_simple_isOutputFinalized() (gas: 23877)
Proxy_Test:test_clashingFunctionSignatures() (gas: 101427) Proxy_Test:test_clashingFunctionSignatures() (gas: 101427)
Proxy_Test:test_implementationKey() (gas: 20942) Proxy_Test:test_implementationKey() (gas: 20942)
Proxy_Test:test_implementationProxyCallIfNotAdmin() (gas: 30021) Proxy_Test:test_implementationProxyCallIfNotAdmin() (gas: 30021)
......
...@@ -50,15 +50,19 @@ ...@@ -50,15 +50,19 @@
➡ L1StandardBridge ➡ L1StandardBridge
======================= =======================
+-------------+-------------------------------------------------+------+--------+-------+----------------------------------------------------+ +---------------+-------------------------------------------------+------+--------+-------+----------------------------------------------------+
| Name | Type | Slot | Offset | Bytes | Contract | | Name | Type | Slot | Offset | Bytes | Contract |
+============================================================================================================================================+ +==============================================================================================================================================+
| messenger | contract CrossDomainMessenger | 0 | 0 | 20 | contracts/L1/L1StandardBridge.sol:L1StandardBridge | | messenger | contract CrossDomainMessenger | 0 | 0 | 20 | contracts/L1/L1StandardBridge.sol:L1StandardBridge |
|-------------+-------------------------------------------------+------+--------+-------+----------------------------------------------------| |---------------+-------------------------------------------------+------+--------+-------+----------------------------------------------------|
| otherBridge | contract StandardBridge | 1 | 0 | 20 | contracts/L1/L1StandardBridge.sol:L1StandardBridge | | otherBridge | contract StandardBridge | 1 | 0 | 20 | contracts/L1/L1StandardBridge.sol:L1StandardBridge |
|-------------+-------------------------------------------------+------+--------+-------+----------------------------------------------------| |---------------+-------------------------------------------------+------+--------+-------+----------------------------------------------------|
| deposits | mapping(address => mapping(address => uint256)) | 2 | 0 | 32 | contracts/L1/L1StandardBridge.sol:L1StandardBridge | | deposits | mapping(address => mapping(address => uint256)) | 2 | 0 | 32 | contracts/L1/L1StandardBridge.sol:L1StandardBridge |
+-------------+-------------------------------------------------+------+--------+-------+----------------------------------------------------+ |---------------+-------------------------------------------------+------+--------+-------+----------------------------------------------------|
| _initialized | uint8 | 3 | 0 | 1 | contracts/L1/L1StandardBridge.sol:L1StandardBridge |
|---------------+-------------------------------------------------+------+--------+-------+----------------------------------------------------|
| _initializing | bool | 3 | 1 | 1 | contracts/L1/L1StandardBridge.sol:L1StandardBridge |
+---------------+-------------------------------------------------+------+--------+-------+----------------------------------------------------+
======================= =======================
➡ L2OutputOracle ➡ L2OutputOracle
......
...@@ -58,3 +58,46 @@ npx hardhat deploy --network <network-name> ...@@ -58,3 +58,46 @@ npx hardhat deploy --network <network-name>
In the `hardhat.config.ts`, there is a `deployConfigSpec` field that validates that the types In the `hardhat.config.ts`, there is a `deployConfigSpec` field that validates that the types
are correct, be sure to export an object in the `deploy-config/<network-name>.ts` file that are correct, be sure to export an object in the `deploy-config/<network-name>.ts` file that
has a key for each property in the `deployConfigSpec`. has a key for each property in the `deployConfigSpec`.
## Standards and Conventions
### Style
#### Comments
We use [Seaport](https://github.com/ProjectOpenSea/seaport/blob/main/contracts/Seaport.sol)-style comments with some minor modifications.
Some basic rules:
* Always use `@notice` since it has the same general effect as `@dev` but avoids confusion about when to use one over the other.
* Include a newline between `@notice` and the first `@param`.
* Include a newline between `@param` and the first `@return`.
* Use a line-length of 100 characters.
We also have the following custom tags:
* `@custom:proxied`: Add to a contract whenever it's meant to live behind a proxy.
* `@custom:legacy`: Add to an event or function when it only exists for legacy support.
#### Errors
* Use `require` statements when making simple assertions.
* Use `revert` if throwing an error where an assertion is not being made (no custom errors). See [here](https://github.com/ethereum-optimism/optimism/blob/861ae315a6db698a8c0adb1f8eab8311fd96be4c/packages/contracts-bedrock/contracts/L2/OVM_ETH.sol#L31) for an example of this in practice.
* Error strings MUST have the format `"{ContractName}: {message}"` where `message` is a lower case string.
#### Function Parameters
* Function parameters should be prefixed with an underscore.
#### Event Parameters
* Event parameters should NOT be prefixed with an underscore.
### Proxy by Default
All contracts should be assumed to live behind proxies (except in certain special circumstances).
This means that new contracts MUST be built under the assumption of upgradeability.
We use a minimal [`Proxy`](./contracts/universal/Proxy.sol) contract designed to be owned by a corresponding [`ProxyAdmin`](./contracts/universal/ProxyAdmin.sol) which follow the interfaces of OpenZeppelin's `Proxy` and `ProxyAdmin` contracts, respectively.
Unless explicitly discussed otherwise, you MUST include the following basic upgradeability pattern for each new implementation contract:
1. Extend OpenZeppelin's `Initializable` base contract.
2. Include a `uint8 public constant VERSION = X` at the TOP of your contract.
3. Include a function `initialize` with the modifier `reinitializer(VERSION)`.
3. In the `constructor`, set any `immutable` variables and call the `initialize` function for setting mutables.
...@@ -13,22 +13,33 @@ import { CrossDomainMessenger } from "../universal/CrossDomainMessenger.sol"; ...@@ -13,22 +13,33 @@ import { CrossDomainMessenger } from "../universal/CrossDomainMessenger.sol";
* interface instead of interacting with lower-level contracts directly. * interface instead of interacting with lower-level contracts directly.
*/ */
contract L1CrossDomainMessenger is CrossDomainMessenger { contract L1CrossDomainMessenger is CrossDomainMessenger {
/**
* @notice Contract version number.
*/
uint8 public constant VERSION = 1;
/** /**
* @notice Address of the OptimismPortal. * @notice Address of the OptimismPortal.
*/ */
OptimismPortal public portal; OptimismPortal public portal;
/** /**
* @notice Initializes the L1CrossDomainMessenger. * @param _portal Address of the OptimismPortal to send and receive messages through.
*/
constructor(OptimismPortal _portal) public {
// Mutables
initialize(_portal);
}
/**
* @notice Intializes mutable variables.
* *
* @param _portal Address of the OptimismPortal to send and receive messages through. * @param _portal Address of the OptimismPortal to send and receive messages through.
*/ */
function initialize(OptimismPortal _portal) external { function initialize(OptimismPortal _portal) public reinitializer(VERSION) {
portal = _portal; portal = _portal;
address[] memory blockedSystemAddresses = new address[](1); address[] memory blockedSystemAddresses = new address[](1);
blockedSystemAddresses[0] = address(this); blockedSystemAddresses[0] = address(this);
_initialize(Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER, blockedSystemAddresses); _initialize(Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER, blockedSystemAddresses);
} }
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity ^0.8.9; pragma solidity ^0.8.9;
import { Initializable } from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
import { Lib_PredeployAddresses } from "../libraries/Lib_PredeployAddresses.sol"; import { Lib_PredeployAddresses } from "../libraries/Lib_PredeployAddresses.sol";
import { StandardBridge } from "../universal/StandardBridge.sol"; import { StandardBridge } from "../universal/StandardBridge.sol";
...@@ -11,7 +12,12 @@ import { StandardBridge } from "../universal/StandardBridge.sol"; ...@@ -11,7 +12,12 @@ import { StandardBridge } from "../universal/StandardBridge.sol";
* L2. ERC20 tokens deposited into L2 are escrowed within this contract until withdrawal. * L2. ERC20 tokens deposited into L2 are escrowed within this contract until withdrawal.
* ETH is transferred to and escrowed within the OptimismPortal contract. * ETH is transferred to and escrowed within the OptimismPortal contract.
*/ */
contract L1StandardBridge is StandardBridge { contract L1StandardBridge is StandardBridge, Initializable {
/**
* @notice Contract version number.
*/
uint8 public constant VERSION = 1;
/** /**
* @custom:legacy * @custom:legacy
* @notice Emitted whenever a deposit of ETH from L1 into L2 is initiated. * @notice Emitted whenever a deposit of ETH from L1 into L2 is initiated.
...@@ -85,11 +91,19 @@ contract L1StandardBridge is StandardBridge { ...@@ -85,11 +91,19 @@ contract L1StandardBridge is StandardBridge {
); );
/** /**
* @notice Initializes the L1StandardBridge. * @param _messenger Address of the L1CrossDomainMessenger.
*/
constructor(address payable _messenger) public {
// Mutables
initialize(_messenger);
}
/**
* @notice Intializes mutable variables.
* *
* @param _messenger Address of the L1CrossDomainMessenger. * @param _messenger Address of the L1CrossDomainMessenger.
*/ */
function initialize(address payable _messenger) public { function initialize(address payable _messenger) public reinitializer(VERSION) {
_initialize(_messenger, payable(Lib_PredeployAddresses.L2_STANDARD_BRIDGE)); _initialize(_messenger, payable(Lib_PredeployAddresses.L2_STANDARD_BRIDGE));
} }
......
...@@ -6,6 +6,7 @@ import { ...@@ -6,6 +6,7 @@ import {
} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; } from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";
/** /**
* @custom:proxied
* @title L2OutputOracle * @title L2OutputOracle
* @notice The L2 state is committed to in this contract * @notice The L2 state is committed to in this contract
* The payable keyword is used on appendL2Output to save gas on the msg.value check. * The payable keyword is used on appendL2Output to save gas on the msg.value check.
...@@ -16,7 +17,7 @@ contract L2OutputOracle is OwnableUpgradeable { ...@@ -16,7 +17,7 @@ contract L2OutputOracle is OwnableUpgradeable {
/** /**
* @notice Contract version number. * @notice Contract version number.
*/ */
uint8 public constant L2_OUTPUT_ORACLE_VERSION = 1; uint8 public constant VERSION = 1;
/** /**
* @notice OutputProposal represents a commitment to the L2 state. * @notice OutputProposal represents a commitment to the L2 state.
...@@ -29,6 +30,7 @@ contract L2OutputOracle is OwnableUpgradeable { ...@@ -29,6 +30,7 @@ contract L2OutputOracle is OwnableUpgradeable {
uint256 timestamp; uint256 timestamp;
} }
// TODO: Events should NOT be underscore prefixed.
/** /**
* @notice Emitted when an output is appended. * @notice Emitted when an output is appended.
* *
...@@ -101,7 +103,7 @@ contract L2OutputOracle is OwnableUpgradeable { ...@@ -101,7 +103,7 @@ contract L2OutputOracle is OwnableUpgradeable {
/** /**
* @notice A mapping from L2 block numbers to the respective output root. Note that these * @notice A mapping from L2 block numbers to the respective output root. Note that these
* outputs should not be considered finalized until the finalization period (as defined * outputs should not be considered finalized until the finalization period (as defined
* in the Optimism Portal) has passed. * in the Optimism Portal) has passed.
*/ */
mapping(uint256 => OutputProposal) internal l2Outputs; mapping(uint256 => OutputProposal) internal l2Outputs;
...@@ -114,13 +116,9 @@ contract L2OutputOracle is OwnableUpgradeable { ...@@ -114,13 +116,9 @@ contract L2OutputOracle is OwnableUpgradeable {
} }
/** /**
* @notice Initialize the L2OutputOracle contract. * @param _submissionInterval Interval in blocks at which checkpoints must be submitted.
*
* @param _submissionInterval The desired interval in seconds at which
* checkpoints must be submitted.
* @param _genesisL2Output The initial L2 output of the L2 chain. * @param _genesisL2Output The initial L2 output of the L2 chain.
* @param _historicalTotalBlocks The number of blocks that preceding the * @param _historicalTotalBlocks Number of blocks preceding this L2 chain.
* initialization of the L2 chain.
* @param _startingBlockNumber The number of the first L2 block. * @param _startingBlockNumber The number of the first L2 block.
* @param _startingTimestamp The timestamp of the first L2 block. * @param _startingTimestamp The timestamp of the first L2 block.
* @param _l2BlockTime The timestamp of the first L2 block. * @param _l2BlockTime The timestamp of the first L2 block.
...@@ -141,33 +139,35 @@ contract L2OutputOracle is OwnableUpgradeable { ...@@ -141,33 +139,35 @@ contract L2OutputOracle is OwnableUpgradeable {
_l2BlockTime < block.timestamp, _l2BlockTime < block.timestamp,
"Output Oracle: Initial L2 block time must be less than current time" "Output Oracle: Initial L2 block time must be less than current time"
); );
// Immutables
SUBMISSION_INTERVAL = _submissionInterval; SUBMISSION_INTERVAL = _submissionInterval;
HISTORICAL_TOTAL_BLOCKS = _historicalTotalBlocks; HISTORICAL_TOTAL_BLOCKS = _historicalTotalBlocks;
STARTING_BLOCK_NUMBER = _startingBlockNumber; STARTING_BLOCK_NUMBER = _startingBlockNumber;
STARTING_TIMESTAMP = _startingTimestamp; STARTING_TIMESTAMP = _startingTimestamp;
L2_BLOCK_TIME = _l2BlockTime; L2_BLOCK_TIME = _l2BlockTime;
// Mutables
initialize(_genesisL2Output, _startingBlockNumber, _sequencer, _owner); initialize(_genesisL2Output, _startingBlockNumber, _sequencer, _owner);
} }
/** /**
* @notice Initialize the L2OutputOracle contract. * @notice Intializes mutable variables.
* *
* @param _genesisL2Output The initial L2 output of the L2 chain. * @param _genesisL2Output The initial L2 output of the L2 chain.
* @param _startingBlockNumber The timestamp to start L2 block at. * @param _startingBlockNumber The timestamp to start L2 block at.
* @param _sequencer The address of the sequencer. * @param _sequencer The address of the sequencer.
* @param _owner The address of the owner. * @param _owner The address of the owner.
*/ */
function initialize( function initialize(
bytes32 _genesisL2Output, bytes32 _genesisL2Output,
uint256 _startingBlockNumber, uint256 _startingBlockNumber,
address _sequencer, address _sequencer,
address _owner address _owner
) public reinitializer(L2_OUTPUT_ORACLE_VERSION) { ) public reinitializer(VERSION) {
l2Outputs[_startingBlockNumber] = OutputProposal(_genesisL2Output, block.timestamp); l2Outputs[_startingBlockNumber] = OutputProposal(_genesisL2Output, block.timestamp);
latestBlockNumber = _startingBlockNumber; latestBlockNumber = _startingBlockNumber;
__Ownable_init(); __Ownable_init();
changeSequencer(_sequencer); changeSequencer(_sequencer);
_transferOwnership(_owner); _transferOwnership(_owner);
} }
...@@ -175,8 +175,7 @@ contract L2OutputOracle is OwnableUpgradeable { ...@@ -175,8 +175,7 @@ contract L2OutputOracle is OwnableUpgradeable {
/** /**
* @notice Accepts an L2 outputRoot and the timestamp of the corresponding L2 block. The * @notice Accepts an L2 outputRoot and the timestamp of the corresponding L2 block. The
* timestamp must be equal to the current value returned by `nextTimestamp()` in order * timestamp must be equal to the current value returned by `nextTimestamp()` in order
* to be accepted. * to be accepted. This function may only be called by the Sequencer.
* This function may only be called by the Sequencer.
* *
* @param _l2Output The L2 output of the checkpoint block. * @param _l2Output The L2 output of the checkpoint block.
* @param _l2BlockNumber The L2 block number that resulted in _l2Output. * @param _l2BlockNumber The L2 block number that resulted in _l2Output.
...@@ -226,6 +225,7 @@ contract L2OutputOracle is OwnableUpgradeable { ...@@ -226,6 +225,7 @@ contract L2OutputOracle is OwnableUpgradeable {
* owner, not the sequencer. Longer term, this should be replaced with a more robust * owner, not the sequencer. Longer term, this should be replaced with a more robust
* mechanism which will allow deletion of proposals shown to be invalid by a fault * mechanism which will allow deletion of proposals shown to be invalid by a fault
* proof. * proof.
*
* @param _proposal Represents the output proposal to delete * @param _proposal Represents the output proposal to delete
*/ */
function deleteL2Output(OutputProposal memory _proposal) external onlyOwner { function deleteL2Output(OutputProposal memory _proposal) external onlyOwner {
......
...@@ -19,7 +19,7 @@ contract OptimismPortal is Initializable, ResourceMetering { ...@@ -19,7 +19,7 @@ contract OptimismPortal is Initializable, ResourceMetering {
/** /**
* @notice Contract version number. * @notice Contract version number.
*/ */
uint8 public constant OPTIMISM_PORTAL_VERSION = 1; uint8 public constant VERSION = 1;
/** /**
* @notice Emitted when a transaction is deposited from L1 to L2. The parameters of this event * @notice Emitted when a transaction is deposited from L1 to L2. The parameters of this event
...@@ -94,22 +94,22 @@ contract OptimismPortal is Initializable, ResourceMetering { ...@@ -94,22 +94,22 @@ contract OptimismPortal is Initializable, ResourceMetering {
uint256[48] private __gap; uint256[48] private __gap;
/** /**
* @notice The constructor sets immutable values in the implementation. * @param _l2Oracle Address of the L2OutputOracle contract.
* This means that these values can only changed by an upgrade. But the efficiency gains * @param _finalizationPeriodSeconds Output finalization time in seconds.
* are worthwhile.
* Also ensures that the implementation is initialized upon deployment.
*/ */
constructor(L2OutputOracle _l2Oracle, uint256 _finalizationPeriodSeconds) { constructor(L2OutputOracle _l2Oracle, uint256 _finalizationPeriodSeconds) {
// Set these immutable values into the bytcode of the implementation. // Immutables
L2_ORACLE = _l2Oracle; L2_ORACLE = _l2Oracle;
FINALIZATION_PERIOD_SECONDS = _finalizationPeriodSeconds; FINALIZATION_PERIOD_SECONDS = _finalizationPeriodSeconds;
// Mutables
initialize(); initialize();
} }
/** /**
* @notice Initializes the contract and parent contract(s). * @notice Intializes mutable variables.
*/ */
function initialize() public reinitializer(OPTIMISM_PORTAL_VERSION) { function initialize() public reinitializer(VERSION) {
l2Sender = DEFAULT_L2_SENDER; l2Sender = DEFAULT_L2_SENDER;
__ResourceMetering_init(); __ResourceMetering_init();
} }
......
...@@ -164,8 +164,7 @@ contract Messenger_Initializer is L2OutputOracle_Initializer { ...@@ -164,8 +164,7 @@ contract Messenger_Initializer is L2OutputOracle_Initializer {
op = new OptimismPortal(oracle, 7 days); op = new OptimismPortal(oracle, 7 days);
vm.label(address(op), "OptimismPortal"); vm.label(address(op), "OptimismPortal");
L1Messenger = new L1CrossDomainMessenger(); L1Messenger = new L1CrossDomainMessenger(op);
L1Messenger.initialize(op);
vm.etch( vm.etch(
Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER, Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER,
...@@ -311,8 +310,7 @@ contract Bridge_Initializer is Messenger_Initializer { ...@@ -311,8 +310,7 @@ contract Bridge_Initializer is Messenger_Initializer {
// Deploy the L1 bridge and initialize it with the address of the // Deploy the L1 bridge and initialize it with the address of the
// L1CrossDomainMessenger // L1CrossDomainMessenger
L1Bridge = new L1StandardBridge(); L1Bridge = new L1StandardBridge(payable(address(L1Messenger)));
L1Bridge.initialize(payable(address(L1Messenger)));
vm.label(address(L1Bridge), "L1StandardBridge"); vm.label(address(L1Bridge), "L1StandardBridge");
// Deploy the L2StandardBridge, move it to the correct predeploy // Deploy the L2StandardBridge, move it to the correct predeploy
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment