diff --git a/rskj-core/src/main/java/org/ethereum/config/blockchain/upgrades/ConsensusRule.java b/rskj-core/src/main/java/org/ethereum/config/blockchain/upgrades/ConsensusRule.java index dd121ab18f7..ca8d4c006ad 100644 --- a/rskj-core/src/main/java/org/ethereum/config/blockchain/upgrades/ConsensusRule.java +++ b/rskj-core/src/main/java/org/ethereum/config/blockchain/upgrades/ConsensusRule.java @@ -100,6 +100,7 @@ public enum ConsensusRule { RSKIP434("rskip434"), RSKIP438("rskip438"), RSKIP445("rskip445"), // From EIP-5656 MCOPY instruction + RSKIP453("rskip453"), RSKIP454("rskip454"), ; diff --git a/rskj-core/src/main/java/org/ethereum/core/TransactionExecutor.java b/rskj-core/src/main/java/org/ethereum/core/TransactionExecutor.java index b3f53e028ab..10b7f48bf8d 100644 --- a/rskj-core/src/main/java/org/ethereum/core/TransactionExecutor.java +++ b/rskj-core/src/main/java/org/ethereum/core/TransactionExecutor.java @@ -176,7 +176,7 @@ private boolean init() { } long txGasLimit = GasCost.toGas(tx.getGasLimit()); - long gasLimit = activations.isActive(RSKIP144)? sublistGasLimit : GasCost.toGas(executionBlock.getGasLimit()); + long gasLimit = activations.isActive(RSKIP144) ? sublistGasLimit : GasCost.toGas(executionBlock.getGasLimit()); if (!gasIsValid(txGasLimit, gasLimit)) { return false; diff --git a/rskj-core/src/main/java/org/ethereum/vm/program/Program.java b/rskj-core/src/main/java/org/ethereum/vm/program/Program.java index e74019e4fa0..6eb1f2f67b2 100644 --- a/rskj-core/src/main/java/org/ethereum/vm/program/Program.java +++ b/rskj-core/src/main/java/org/ethereum/vm/program/Program.java @@ -688,12 +688,24 @@ private ProgramResult getProgramResult(RskAddress senderAddress, byte[] nonce, D this, "No gas to return just created contract", storageCost)); + + if (activations.isActive(ConsensusRule.RSKIP453)) { + track.rollback(); + stackPushZero(); + return null; + } } else if (codeLength > Constants.getMaxContractSize()) { programResult.setException( ExceptionHelper.tooLargeContractSize( this, Constants.getMaxContractSize(), codeLength)); + + if (activations.isActive(ConsensusRule.RSKIP453)) { + track.rollback(); + stackPushZero(); + return null; + } } else { programResult.spendGas(storageCost); track.saveCode(contractAddress, code); diff --git a/rskj-core/src/main/resources/expected.conf b/rskj-core/src/main/resources/expected.conf index 1bd5a587740..7a9dd67ca53 100644 --- a/rskj-core/src/main/resources/expected.conf +++ b/rskj-core/src/main/resources/expected.conf @@ -101,6 +101,7 @@ blockchain = { rskip434 = rskip438 = rskip445 = + rskip453 = rskip454 = } } diff --git a/rskj-core/src/main/resources/reference.conf b/rskj-core/src/main/resources/reference.conf index 98515b0872e..fe492c435c8 100644 --- a/rskj-core/src/main/resources/reference.conf +++ b/rskj-core/src/main/resources/reference.conf @@ -86,6 +86,7 @@ blockchain = { rskip434 = arrowhead631 rskip438 = lovell700 rskip445 = lovell700 + rskip453 = lovell700 rskip454 = lovell700 } } diff --git a/rskj-core/src/test/java/org/ethereum/config/blockchain/upgrades/ActivationConfigTest.java b/rskj-core/src/test/java/org/ethereum/config/blockchain/upgrades/ActivationConfigTest.java index 74e9a37ade3..3700d7279f5 100644 --- a/rskj-core/src/test/java/org/ethereum/config/blockchain/upgrades/ActivationConfigTest.java +++ b/rskj-core/src/test/java/org/ethereum/config/blockchain/upgrades/ActivationConfigTest.java @@ -127,6 +127,7 @@ class ActivationConfigTest { " rskip434: arrowhead631", " rskip438: lovell700", " rskip445: lovell700", + " rskip453: lovell700", " rskip454: lovell700", "}" )); diff --git a/rskj-core/src/test/java/org/ethereum/core/ContractCreatingDslRollbackTest.java b/rskj-core/src/test/java/org/ethereum/core/ContractCreatingDslRollbackTest.java new file mode 100644 index 00000000000..f4a55f8a791 --- /dev/null +++ b/rskj-core/src/test/java/org/ethereum/core/ContractCreatingDslRollbackTest.java @@ -0,0 +1,81 @@ +package org.ethereum.core; + +import co.rsk.config.TestSystemProperties; +import co.rsk.test.World; +import co.rsk.test.dsl.DslParser; +import co.rsk.test.dsl.DslProcessorException; +import co.rsk.test.dsl.WorldDslProcessor; +import com.typesafe.config.ConfigValueFactory; +import org.junit.jupiter.api.Test; + +import java.io.FileNotFoundException; + +import static org.junit.jupiter.api.Assertions.*; + +class ContractCreatingDslRollbackTest { + + @Test + void testCreateExecutionFailsAfter453IsRollingBack() throws FileNotFoundException, DslProcessorException { + TestSystemProperties properties = new TestSystemProperties(); + + String resourcePath = "dsl/453_rollback_during_creation/not_enough_gas"; + DslParser parser = DslParser.fromResource(resourcePath); + World world = new World(properties); + WorldDslProcessor processor = new WorldDslProcessor(world); + processor.processCommands(parser); + + TransactionReceipt transactionReceipt = world.getTransactionReceiptByName("txContractCreation"); + assertNotNull(transactionReceipt); + assertFalse(transactionReceipt.isSuccessful()); + } + + @Test + void testCreateExecutionBefore453isNotRollingBackHavingNotEnoughGaa() throws FileNotFoundException, DslProcessorException { + TestSystemProperties properties = new TestSystemProperties(rawConfig -> + rawConfig.withValue("blockchain.config.consensusRules.rskip453", ConfigValueFactory.fromAnyRef(-1)) + ); + + String resourcePath = "dsl/453_rollback_during_creation/not_enough_gas"; + DslParser parser = DslParser.fromResource(resourcePath); + World world = new World(properties); + WorldDslProcessor processor = new WorldDslProcessor(world); + processor.processCommands(parser); + + TransactionReceipt transactionReceipt = world.getTransactionReceiptByName("txContractCreation"); + assertNotNull(transactionReceipt); + assertTrue(transactionReceipt.isSuccessful()); + } + + @Test + void createExecutionExceedingCodeSizeDoesNotRollbackBefore453() throws FileNotFoundException, DslProcessorException { + TestSystemProperties properties = new TestSystemProperties(rawConfig -> + rawConfig.withValue("blockchain.config.consensusRules.rskip453", ConfigValueFactory.fromAnyRef(-1)) + ); + + String resourcePath = "dsl/453_rollback_during_creation/exceeding_code_size"; + DslParser parser = DslParser.fromResource(resourcePath); + World world = new World(properties); + WorldDslProcessor processor = new WorldDslProcessor(world); + processor.processCommands(parser); + + TransactionReceipt transactionReceipt = world.getTransactionReceiptByName("txContractCreation"); + assertNotNull(transactionReceipt); + assertTrue(transactionReceipt.isSuccessful()); + } + + @Test + void createExecutionExceedingCodeSizeDoesRollbackAfter453() throws FileNotFoundException, DslProcessorException { + TestSystemProperties properties = new TestSystemProperties(); + + String resourcePath = "dsl/453_rollback_during_creation/exceeding_code_size"; + DslParser parser = DslParser.fromResource(resourcePath); + World world = new World(properties); + WorldDslProcessor processor = new WorldDslProcessor(world); + processor.processCommands(parser); + + TransactionReceipt transactionReceipt = world.getTransactionReceiptByName("txContractCreation"); + assertNotNull(transactionReceipt); + assertFalse(transactionReceipt.isSuccessful()); + } + +} diff --git a/rskj-core/src/test/resources/dsl/453_rollback_during_creation/exceeding_code_size b/rskj-core/src/test/resources/dsl/453_rollback_during_creation/exceeding_code_size new file mode 100644 index 00000000000..b3a4b44a7cf --- /dev/null +++ b/rskj-core/src/test/resources/dsl/453_rollback_during_creation/exceeding_code_size @@ -0,0 +1,62 @@ + +comment + +// Contracts compiled using 0.8.20 +// the contract source code + +contract BytecodeFactory { + function deployContractWithCreate2WithTheCodePassedInParameter(bytes memory bytecode, uint256 salt) public returns (address) { + address contractAddress; + + assembly { + contractAddress := create2(0, add(bytecode, 0x20), mload(bytecode), salt) + } + + emit ContractDeployed(contractAddress); + return contractAddress; + } +} + +additionally a huge contract with dummy functions was created until reach the maximum code size allowed. +end + +account_new acc1 50000000000 + +# deploy contract compiled with 0.8.20 +transaction_build txCreateContractFactory + sender acc1 + receiverAddress 00 + value 0 + data 608060405234801561000f575f80fd5b5061055d8061001d5f395ff3fe608060405234801561000f575f80fd5b5060043610610034575f3560e01c80632aa5cc281461003857806381176c2014610068575b5f80fd5b610052600480360381019061004d91906102cd565b610098565b60405161005f9190610366565b60405180910390f35b610082600480360381019061007d91906102cd565b6100e6565b60405161008f9190610366565b60405180910390f35b5f80828451602086015ff590507f8ffcdc15a283d706d38281f500270d8b5a656918f555de0913d7455e3e6bc1bf816040516100d49190610366565b60405180910390a18091505092915050565b5f80836040516020016100f991906103eb565b60405160208183030381529060405280519060200120905060ff60f81b30848360405160200161012c94939291906104da565b604051602081830303815290604052805190602001205f1c91505092915050565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6101ac82610166565b810181811067ffffffffffffffff821117156101cb576101ca610176565b5b80604052505050565b5f6101dd61014d565b90506101e982826101a3565b919050565b5f67ffffffffffffffff82111561020857610207610176565b5b61021182610166565b9050602081019050919050565b828183375f83830152505050565b5f61023e610239846101ee565b6101d4565b90508281526020810184848401111561025a57610259610162565b5b61026584828561021e565b509392505050565b5f82601f8301126102815761028061015e565b5b813561029184826020860161022c565b91505092915050565b5f819050919050565b6102ac8161029a565b81146102b6575f80fd5b50565b5f813590506102c7816102a3565b92915050565b5f80604083850312156102e3576102e2610156565b5b5f83013567ffffffffffffffff811115610300576102ff61015a565b5b61030c8582860161026d565b925050602061031d858286016102b9565b9150509250929050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61035082610327565b9050919050565b61036081610346565b82525050565b5f6020820190506103795f830184610357565b92915050565b5f81519050919050565b5f81905092915050565b5f5b838110156103b0578082015181840152602081019050610395565b5f8484015250505050565b5f6103c58261037f565b6103cf8185610389565b93506103df818560208601610393565b80840191505092915050565b5f6103f682846103bb565b915081905092915050565b5f7fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b5f819050919050565b61044661044182610401565b61042c565b82525050565b5f8160601b9050919050565b5f6104628261044c565b9050919050565b5f61047382610458565b9050919050565b61048b61048682610346565b610469565b82525050565b5f819050919050565b6104ab6104a68261029a565b610491565b82525050565b5f819050919050565b5f819050919050565b6104d46104cf826104b1565b6104ba565b82525050565b5f6104e58287610435565b6001820191506104f5828661047a565b601482019150610505828561049a565b60208201915061051582846104c3565b6020820191508190509594505050505056fea264697066735822122089043866e61a6654025cdc3d40fc5bb0cfe26ff7ed569eba8bbcc70cb03fa0ea64736f6c63430008140033 + gas 10000000 + build + +block_build b01 + parent g00 + gasLimit 10000000000 + transactions txCreateContractFactory + build + +block_connect b01 + +transaction_build txContractCreation + sender acc1 + nonce 1 + contract txCreateContractFactory # created in txCreateContractFactory + value 0 + data 2aa5cc280000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000006f556080604052348015600e575f80fd5b50336175375f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550616ef88061005d5f395ff3fe608060405234801561000f575f80fd5b50600436106106e8575f3560e01c80638d2f1a7811610390578063cf3d1ce3116101e7578063ec5fe94011610118578063f7271435116100b6578063f979f26911610085578063f979f26914611947578063fb1dd6ee14611977578063fd1a931014611993578063fdcf8a61146119c3576106e8565b8063f727143514611899578063f737643a146118c9578063f7b9ec6c146118e7578063f96b94ae14611917576106e8565b8063f35165d9116100f2578063f35165d9146117e9578063f56be8ef14611819578063f5a956d814611849578063f5e2a65d14611865576106e8565b8063ec5fe9401461176b578063f12e84e214611789578063f25f2d57146117b9576106e8565b8063e149e7b011610185578063e64374811161015f578063e6437481146116cf578063e774e908146116ff578063e8de615b1461171d578063eb86e1271461173b576106e8565b8063e149e7b01461163f578063e1c60a111461166f578063e6418b921461169f576106e8565b8063d546b78d116101c1578063d546b78d14611591578063d8b3a2eb146115c1578063d940e910146115f1578063dd4d29be14611621576106e8565b8063cf3d1ce314611501578063cfa7bc7b14611531578063d3f8f8f114611561576106e8565b8063b03aa57d116102c1578063b9eb2f2e1161025f578063bf26175811610239578063bf26175814611452578063bfe2a9a014611482578063c6cd3081146114b3578063c74f16f2146114d1576106e8565b8063b9eb2f2e146113d4578063bcaa329914611404578063be9e738e14611434576106e8565b8063b2103d0e1161029b578063b2103d0e14611338578063b35197a214611356578063b5b49a0a14611386578063b9650dac146113a4576106e8565b8063b03aa57d146112ba578063b063152a146112d8578063b12601da14611308576106e8565b8063a0e76cfd1161032e578063a94e8fa211610308578063a94e8fa21461120c578063ac30e40a1461123c578063af63b48f1461126c578063afe036791461128a576106e8565b8063a0e76cfd14611178578063a141f49b146111a8578063a77e7dce146111dc576106e8565b806393432fc41161036a57806393432fc4146110de57806397b21440146110fc57806398b1e9221461112c578063a099cfc314611148576106e8565b80638d2f1a78146110725780638da5cb5b146110a25780638dea4517146110c0576106e8565b806342703494116105445780635e57966d1161047557806374a83821116104135780637a36b3ee116103ed5780637a36b3ee14610fc45780637fb73cb014610ff457806385b20f3b146110245780638bd5868214611042576106e8565b806374a8382114610f46578063766a47dc14610f6457806377112b8414610f94576106e8565b806362536f501161044f57806362536f5014610e945780636299a85b14610eb2578063653b75b514610ee2578063677342ce14610f16576106e8565b80635e57966d14610e045780635e5f5a3314610e3457806361047ff414610e64576106e8565b80634f0c3515116104e2578063546ac01e116104bc578063546ac01e14610d445780635672e31014610d745780635729c21114610da45780635aa8afe414610dd4576106e8565b80634f0c351514610cc65780634f8feabc14610cf6578063520f397114610d14576106e8565b8063463fbad01161051e578063463fbad014610c2a578063488a550314610c5a5780634d646d5a14610c8a5780634eed42bd14610ca8576106e8565b80634270349414610b9a5780634476409314610bca5780634530c9c714610bfa576106e8565b8063278fff791161061e5780632ebb06cf116105bc57806332d2be9e1161059657806332d2be9e14610ada57806338008b0c14610b0a5780633b7b0cd014610b3a5780633d41c22214610b6a576106e8565b80632ebb06cf14610a5e5780632f17a55414610a7a5780633186e39614610aaa576106e8565b80632a2e1320116105f85780632a2e1320146109b05780632ad54478146109e05780632c058df814610a105780632e68233314610a2e576106e8565b8063278fff79146109325780632828e4e71461096257806329831c6014610980576106e8565b80630cf5c2781161068b57806313eadd891161066557806313eadd891461089657806319772ad9146108c65780631bd1d086146108e45780631df80fa014610914576106e8565b80630cf5c27814610818578063110c828d146108365780631385641e14610866576106e8565b8063096370ef116106c7578063096370ef1461076a5780630a1085c91461079a5780630b140b8d146107b85780630be68c17146107e8576106e8565b806247f01c146106ec5780630717e5b81461070a5780630746ef2c1461073a575b5f80fd5b6106f46119e1565b60405161070191906155c1565b60405180910390f35b610724600480360381019061071f9190615765565b611a38565b60405161073191906155c1565b60405180910390f35b610754600480360381019061074f91906157db565b611ae2565b60405161076191906155c1565b60405180910390f35b610784600480360381019061077f9190615819565b611af7565b60405161079191906155c1565b60405180910390f35b6107a2611b52565b6040516107af91906155c1565b60405180910390f35b6107d260048036038101906107cd919061597a565b611b62565b6040516107df9190615a78565b60405180910390f35b61080260048036038101906107fd91906157db565b611c51565b60405161080f91906155c1565b60405180910390f35b610820611c87565b60405161082d91906155c1565b60405180910390f35b610850600480360381019061084b9190615819565b611c97565b60405161085d91906155c1565b60405180910390f35b610880600480360381019061087b9190615a98565b611ce1565b60405161088d9190615b23565b60405180910390f35b6108b060048036038101906108ab9190615b43565b611d81565b6040516108bd9190615b9b565b60405180910390f35b6108ce611dac565b6040516108db9190615bc3565b60405180910390f35b6108fe60048036038101906108f99190615c8c565b611dd5565b60405161090b9190615b23565b60405180910390f35b61091c611ec6565b60405161092991906155c1565b60405180910390f35b61094c60048036038101906109479190615a98565b611ed6565b6040516109599190615d8a565b60405180910390f35b61096a612024565b60405161097791906155c1565b60405180910390f35b61099a60048036038101906109959190615ddd565b612034565b6040516109a791906155c1565b60405180910390f35b6109ca60048036038101906109c59190615a98565b612089565b6040516109d79190615b9b565b60405180910390f35b6109fa60048036038101906109f59190615b43565b6120a0565b604051610a079190615b9b565b60405180910390f35b610a186120cb565b604051610a259190615e59565b60405180910390f35b610a486004803603810190610a439190615e72565b6120f6565b604051610a559190615bc3565b60405180910390f35b610a786004803603810190610a739190615a98565b6120ff565b005b610a946004803603810190610a8f9190615819565b61229c565b604051610aa19190615d8a565b60405180910390f35b610ac46004803603810190610abf9190615c8c565b612362565b604051610ad19190615e59565b60405180910390f35b610af46004803603810190610aef91906157db565b612391565b604051610b0191906155c1565b60405180910390f35b610b246004803603810190610b1f9190615a98565b6123a6565b604051610b3191906155c1565b60405180910390f35b610b546004803603810190610b4f9190615819565b6123eb565b604051610b6191906155c1565b60405180910390f35b610b846004803603810190610b7f9190615a98565b612470565b604051610b9191906155c1565b60405180910390f35b610bb46004803603810190610baf9190615a98565b6124ae565b604051610bc19190615b9b565b60405180910390f35b610be46004803603810190610bdf91906157db565b612511565b604051610bf191906155c1565b60405180910390f35b610c146004803603810190610c0f91906157db565b61254e565b604051610c2191906155c1565b60405180910390f35b610c446004803603810190610c3f9190615a98565b612563565b604051610c5191906155c1565b60405180910390f35b610c746004803603810190610c6f9190615819565b61259d565b604051610c8191906155c1565b60405180910390f35b610c92612622565b604051610c9f91906155c1565b60405180910390f35b610cb0612632565b604051610cbd91906155c1565b60405180910390f35b610ce06004803603810190610cdb9190615a98565b612642565b604051610ced91906155c1565b60405180910390f35b610cfe612680565b604051610d0b91906155c1565b60405180910390f35b610d2e6004803603810190610d299190615a98565b612690565b604051610d3b91906155c1565b60405180910390f35b610d5e6004803603810190610d599190615a98565b6126d8565b604051610d6b9190615b23565b60405180910390f35b610d8e6004803603810190610d899190615c8c565b6127b4565b604051610d9b9190615b23565b60405180910390f35b610dbe6004803603810190610db99190615c8c565b6128a5565b604051610dcb9190615b23565b60405180910390f35b610dee6004803603810190610de99190615c8c565b612996565b604051610dfb91906155c1565b60405180910390f35b610e1e6004803603810190610e199190615e72565b612a58565b604051610e2b9190615b23565b60405180910390f35b610e4e6004803603810190610e4991906157db565b612d53565b604051610e5b91906155c1565b60405180910390f35b610e7e6004803603810190610e799190615a98565b612d80565b604051610e8b91906155c1565b60405180910390f35b610e9c612de9565b604051610ea991906155c1565b60405180910390f35b610ecc6004803603810190610ec79190615c8c565b612df9565b604051610ed99190615b23565b60405180910390f35b610efc6004803603810190610ef79190615a98565b612f2e565b604051610f0d959493929190615e9d565b60405180910390f35b610f306004803603810190610f2b9190615a98565b613121565b604051610f3d91906155c1565b60405180910390f35b610f4e613182565b604051610f5b91906155c1565b60405180910390f35b610f7e6004803603810190610f799190615f58565b613192565b604051610f8b91906155c1565b60405180910390f35b610fae6004803603810190610fa99190615fb2565b613233565b604051610fbb919061601b565b60405180910390f35b610fde6004803603810190610fd99190616034565b613310565b604051610feb9190615b23565b60405180910390f35b61100e60048036038101906110099190616034565b61333c565b60405161101b9190615b23565b60405180910390f35b61102c613368565b60405161103991906155c1565b60405180910390f35b61105c60048036038101906110579190615819565b613378565b60405161106991906155c1565b60405180910390f35b61108c60048036038101906110879190615a98565b6133fd565b6040516110999190615b9b565b60405180910390f35b6110aa61344f565b6040516110b79190615bc3565b60405180910390f35b6110c8613475565b6040516110d591906155c1565b60405180910390f35b6110e6613485565b6040516110f391906155c1565b60405180910390f35b61111660048036038101906111119190615c8c565b613495565b6040516111239190615b23565b60405180910390f35b61114660048036038101906111419190615a98565b6135ca565b005b611162600480360381019061115d9190616206565b61377b565b60405161116f919061601b565b60405180910390f35b611192600480360381019061118d9190615f58565b613861565b60405161119f9190615b9b565b60405180910390f35b6111c260048036038101906111bd9190615a98565b6138fd565b6040516111d3959493929190615e9d565b60405180910390f35b6111f660048036038101906111f19190615c8c565b613af0565b6040516112039190615b23565b60405180910390f35b6112266004803603810190611221919061625b565b613c25565b6040516112339190615b9b565b60405180910390f35b61125660048036038101906112519190615a98565b613c2f565b60405161126391906155c1565b60405180910390f35b611274613c44565b60405161128191906155c1565b60405180910390f35b6112a4600480360381019061129f9190615765565b613c54565b6040516112b191906155c1565b60405180910390f35b6112c2613cc9565b6040516112cf91906155c1565b60405180910390f35b6112f260048036038101906112ed9190615c8c565b613cd9565b6040516112ff9190615e59565b60405180910390f35b611322600480360381019061131d9190615fb2565b613d08565b60405161132f919061601b565b60405180910390f35b611340613de5565b60405161134d91906155c1565b60405180910390f35b611370600480360381019061136b9190616286565b613dea565b60405161137d91906155c1565b60405180910390f35b61138e613e0b565b60405161139b91906155c1565b60405180910390f35b6113be60048036038101906113b991906157db565b613e1b565b6040516113cb91906155c1565b60405180910390f35b6113ee60048036038101906113e99190615a98565b613e48565b6040516113fb91906155c1565b60405180910390f35b61141e60048036038101906114199190615a98565b613eb1565b60405161142b9190615b9b565b60405180910390f35b61143c613f14565b60405161144991906155c1565b60405180910390f35b61146c60048036038101906114679190615819565b613f24565b6040516114799190615d8a565b60405180910390f35b61149c60048036038101906114979190615819565b613fea565b6040516114aa9291906162d6565b60405180910390f35b6114bb61410b565b6040516114c891906155c1565b60405180910390f35b6114eb60048036038101906114e691906162fd565b61411b565b6040516114f891906155c1565b60405180910390f35b61151b60048036038101906115169190615c8c565b61417e565b6040516115289190615b9b565b60405180910390f35b61154b60048036038101906115469190615a98565b61425f565b60405161155891906155c1565b60405180910390f35b61157b60048036038101906115769190615a98565b61429d565b60405161158891906155c1565b60405180910390f35b6115ab60048036038101906115a69190615c8c565b6142b8565b6040516115b891906155c1565b60405180910390f35b6115db60048036038101906115d69190615a98565b61436a565b6040516115e89190615b9b565b60405180910390f35b61160b6004803603810190611606919061597a565b614382565b6040516116189190615bc3565b60405180910390f35b611629614433565b60405161163691906155c1565b60405180910390f35b61165960048036038101906116549190616361565b614443565b60405161166691906155c1565b60405180910390f35b6116896004803603810190611684919061642a565b614466565b60405161169691906164c3565b60405180910390f35b6116b960048036038101906116b49190615a98565b614470565b6040516116c691906155c1565b60405180910390f35b6116e960048036038101906116e491906157db565b6144b5565b6040516116f691906155c1565b60405180910390f35b6117076144e6565b60405161171491906155c1565b60405180910390f35b6117256144f6565b60405161173291906155c1565b60405180910390f35b61175560048036038101906117509190616286565b614506565b6040516117629190615d8a565b60405180910390f35b6117736145ad565b60405161178091906164fe565b60405180910390f35b6117a3600480360381019061179e9190615c8c565b6145b5565b6040516117b09190615b23565b60405180910390f35b6117d360048036038101906117ce9190615e72565b6145bf565b6040516117e09190615b23565b60405180910390f35b61180360048036038101906117fe9190615819565b6148ba565b6040516118109190615d8a565b60405180910390f35b611833600480360381019061182e9190615b43565b6149c7565b6040516118409190615b9b565b60405180910390f35b611863600480360381019061185e9190616517565b6149f2565b005b61187f600480360381019061187a9190615a98565b614a70565b604051611890959493929190615e9d565b60405180910390f35b6118b360048036038101906118ae9190615819565b614c63565b6040516118c091906155c1565b60405180910390f35b6118d1614ce8565b6040516118de91906155c1565b60405180910390f35b61190160048036038101906118fc9190615a98565b614cf0565b60405161190e91906155c1565b60405180910390f35b611931600480360381019061192c91906157db565b614d05565b60405161193e91906155c1565b60405180910390f35b611961600480360381019061195c91906157db565b614d26565b60405161196e91906155c1565b60405180910390f35b611991600480360381019061198c9190615a98565b614d5c565b005b6119ad60048036038101906119a8919061666d565b614ea2565b6040516119ba9190615e59565b60405180910390f35b6119cb614f4d565b6040516119d89190615b9b565b60405180910390f35b5f805f90505f5b6064811015611a30575f5b6064811015611a22578082611a0891906166e1565b83611a1391906166e1565b925080806001019150506119f3565b5080806001019150506119e8565b508091505090565b5f805f90505f805b8551811015611acb57848181518110611a5c57611a5b616714565b5b6020026020010151868281518110611a7757611a76616714565b5b6020026020010151611a899190616741565b83611a9491906166e1565b9250848181518110611aa957611aa8616714565b5b602002602001015182611abc91906166e1565b91508080600101915050611a40565b508082611ad891906167af565b9250505092915050565b5f8183611aef9190616741565b905092915050565b5f805f90505f5b8351811015611b3c57838181518110611b1a57611b19616714565b5b602002602001015182611b2d91906166e1565b91508080600101915050611afe565b50825181611b4a91906167af565b915050919050565b5f611b5d5f54614f55565b905090565b60605f825190508067ffffffffffffffff811115611b8357611b826155ff565b5b604051908082528060200260200182016040528015611bb15781602001602082028036833780820191505090505b5091505f5b81811015611c4a578360018284611bcd91906167df565b611bd791906167df565b81518110611be857611be7616714565b5b6020026020010151838281518110611c0357611c02616714565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508080600101915050611bb6565b5050919050565b5f80600190505f5b83811015611c7c578482611c6d9190616741565b91508080600101915050611c59565b508091505092915050565b5f611c925f54614fa6565b905090565b5f805f90505b8251811015611cdb57828181518110611cb957611cb8616714565b5b602002602001015182611ccc91906166e1565b91508080600101915050611c9d565b50919050565b600181614e208110611cf1575f80fd5b015f915090508054611d029061683f565b80601f0160208091040260200160405190810160405280929190818152602001828054611d2e9061683f565b8015611d795780601f10611d5057610100808354040283529160200191611d79565b820191905f5260205f20905b815481529060010190602001808311611d5c57829003601f168201915b505050505081565b617533602052815f5260405f20602052805f5260405f205f915091509054906101000a900460ff1681565b5f6175375f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60605f8290505f815167ffffffffffffffff811115611df757611df66155ff565b5b6040519080825280601f01601f191660200182016040528015611e295781602001600182028036833780820191505090505b5090505f5b8251811015611ebb57826001828551611e4791906167df565b611e5191906167df565b81518110611e6257611e61616714565b5b602001015160f81c60f81b828281518110611e8057611e7f616714565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053508080600101915050611e2e565b508092505050919050565b5f611ed15f54614ff7565b905090565b60605f8267ffffffffffffffff811115611ef357611ef26155ff565b5b604051908082528060200260200182016040528015611f215781602001602082028036833780820191505090505b5090505f8303611f34578091505061201f565b5f815f81518110611f4857611f47616714565b5b60200260200101818152505060018303611f65578091505061201f565b600181600181518110611f7b57611f7a616714565b5b6020026020010181815250505f600290505b838110156120195781600282611fa391906167df565b81518110611fb457611fb3616714565b5b602002602001015182600183611fca91906167df565b81518110611fdb57611fda616714565b5b6020026020010151611fed91906166e1565b82828151811061200057611fff616714565b5b6020026020010181815250508080600101915050611f8d565b50809150505b919050565b5f61202f5f54615048565b905090565b5f808584612042919061686f565b90505f8584612051919061686f565b905061207d818261206291906168af565b838461206e91906168af565b6120789190616925565b613121565b92505050949350505050565b5f806002836120989190616966565b149050919050565b617531602052815f5260405f20602052805f5260405f205f915091509054906101000a900460ff1681565b5f6040516020016120db906169ea565b60405160208183030381529060405280519060200120905090565b5f819050919050565b5f61753460018160018154018082558091505003905f5260205f20906007020190505f61753560018160018154018082558091505003905f5260205f20906007020190505f61753660018160018154018082558091505003905f5260205f20906007020190505f61753660018160018154018082558091505003905f5260205f209060070201905084845f018190555060018561219c91906166e1565b835f01819055506002856121b091906166e1565b825f01819055505f5b6103e8811015612294578460050181908060018154018082558091505060019003905f5260205f20015f9091909190915055836005016002826121fc9190616741565b908060018154018082558091505060019003905f5260205f20015f9091909190915055826005016003826122309190616741565b908060018154018082558091505060019003905f5260205f20015f9091909190915055816005016004826122649190616741565b908060018154018082558091505060019003905f5260205f20015f909190919091505580806001019150506121b9565b505050505050565b60605f825190505f8167ffffffffffffffff8111156122be576122bd6155ff565b5b6040519080825280602002602001820160405280156122ec5781602001602082028036833780820191505090505b5090505f5b8281101561235757848160018561230891906167df565b61231291906167df565b8151811061232357612322616714565b5b602002602001015182828151811061233e5761233d616714565b5b60200260200101818152505080806001019150506122f1565b508092505050919050565b5f816040516020016123749190616a2e565b604051602081830303815290604052805190602001209050919050565b5f818361239e91906166e1565b905092915050565b5f805f90505b5f8311156123e257600a836123c19190616966565b816123cc91906166e1565b9050600a836123db91906167af565b92506123ac565b80915050919050565b5f80825f81518110612400576123ff616714565b5b602002602001015190505f600190505b8351811015612466578184828151811061242d5761242c616714565b5b602002602001015110156124595783818151811061244e5761244d616714565b5b602002602001015191505b8080600101915050612410565b5080915050919050565b5f80600190505f600190505b8381116124a457808261248f9190616741565b9150808061249c90616a44565b91505061247c565b5080915050919050565b5f60028210156124c0575f905061250c565b5f600290505b8281826124d39190616741565b11612506575f81846124e59190616966565b036124f3575f91505061250c565b80806124fe90616a44565b9150506124c6565b50600190505b919050565b5f805f90505f8490505b83811161254357808261252e91906166e1565b9150808061253b90616a44565b91505061251b565b508091505092915050565b5f818361255b91906167df565b905092915050565b5f670de0b6b3a76400008283672b992ddfa23249d66125829190616741565b61258c9190616741565b61259691906167af565b9050919050565b5f80825f815181106125b2576125b1616714565b5b602002602001015190505f600190505b835181101561261857818482815181106125df576125de616714565b5b6020026020010151111561260b57838181518110612600576125ff616714565b5b602002602001015191505b80806001019150506125c2565b5080915050919050565b5f61262d5f54615099565b905090565b5f61263d5f546150ea565b905090565b5f80600190505f600190505b8381116126765780826126619190616741565b9150808061266e90616a44565b91505061264e565b5080915050919050565b5f61268b5f5461513b565b905090565b5f805f90505f600190505b8381116126ce5780816126ae9190616741565b826126b991906166e1565b915080806126c690616a44565b91505061269b565b5080915050919050565b60605f820361271e576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506127af565b5f60405180602001604052805f81525090505b5f8311156127aa575f6002846127479190616966565b03612773578060405160200161275d9190616ad5565b6040516020818303038152906040529050612796565b806040516020016127849190616b40565b60405160208183030381529060405290505b6002836127a391906167af565b9250612731565b809150505b919050565b60605f8290505f815167ffffffffffffffff8111156127d6576127d56155ff565b5b6040519080825280601f01601f1916602001820160405280156128085781602001600182028036833780820191505090505b5090505f5b825181101561289a5782818151811061282957612828616714565b5b602001015160f81c60f81b82600183865161284491906167df565b61284e91906167df565b8151811061285f5761285e616714565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350808060010191505061280d565b508092505050919050565b60605f8290505f815167ffffffffffffffff8111156128c7576128c66155ff565b5b6040519080825280601f01601f1916602001820160405280156128f95781602001600182028036833780820191505090505b5090505f5b825181101561298b5782818151811061291a57612919616714565b5b602001015160f81c60f81b82600183865161293591906167df565b61293f91906167df565b815181106129505761294f616714565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535080806001019150506128fe565b508092505050919050565b5f808290505f805b8251811015612a4d577f31000000000000000000000000000000000000000000000000000000000000008382815181106129db576129da616714565b5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603612a40576001818451612a1c91906167df565b612a2691906167df565b6002612a329190616c90565b82612a3d91906166e1565b91505b808060010191505061299e565b508092505050919050565b60605f8273ffffffffffffffffffffffffffffffffffffffff165f1b90505f6040518060400160405280601081526020017f303132333435363738396162636465660000000000000000000000000000000081525090505f602a67ffffffffffffffff811115612acb57612aca6155ff565b5b6040519080825280601f01601f191660200182016040528015612afd5781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f81518110612b3457612b33616714565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612b9757612b96616714565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f5b6014811015612d475782600485600c84612be191906166e1565b60208110612bf257612bf1616714565b5b1a60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916901c60f81c60ff1681518110612c3157612c30616714565b5b602001015160f81c60f81b82600283612c4a9190616741565b6002612c5691906166e1565b81518110612c6757612c66616714565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535082600f60f81b85600c84612ca991906166e1565b60208110612cba57612cb9616714565b5b1a60f81b1660f81c60ff1681518110612cd657612cd5616714565b5b602001015160f81c60f81b82600283612cef9190616741565b6003612cfb91906166e1565b81518110612d0c57612d0b616714565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053508080600101915050612bc7565b50809350505050919050565b5f8182612d609190616741565b61271084612d6e9190616741565b612d7891906167af565b905092915050565b5f808203612d90575f9050612de4565b60018203612da15760019050612de4565b5f80600190505f80600290505b858111612ddc578284612dc191906166e1565b91508293508192508080612dd490616a44565b915050612dae565b508093505050505b919050565b5f612df45f5461518c565b905090565b60605f8290505f5b8151811015612f2457606160f81b828281518110612e2257612e21616714565b5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191610158015612ea05750607a60f81b828281518110612e7057612e6f616714565b5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191611155b15612f17576020828281518110612eba57612eb9616714565b5b602001015160f81c60f81b60f81c612ed29190616cda565b60f81b828281518110612ee857612ee7616714565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505b8080600101915050612e01565b5080915050919050565b6175358181548110612f3e575f80fd5b905f5260205f2090600702015f91509050805f015490806001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690806002018054612f889061683f565b80601f0160208091040260200160405190810160405280929190818152602001828054612fb49061683f565b8015612fff5780601f10612fd657610100808354040283529160200191612fff565b820191905f5260205f20905b815481529060010190602001808311612fe257829003601f168201915b5050505050908060030180546130149061683f565b80601f01602080910402602001604051908101604052809291908181526020018280546130409061683f565b801561308b5780601f106130625761010080835404028352916020019161308b565b820191905f5260205f20905b81548152906001019060200180831161306e57829003601f168201915b5050505050908060040180546130a09061683f565b80601f01602080910402602001604051908101604052809291908181526020018280546130cc9061683f565b80156131175780601f106130ee57610100808354040283529160200191613117565b820191905f5260205f20905b8154815290600101906020018083116130fa57829003601f168201915b5050505050905085565b5f80600260018461313291906166e1565b61313c91906167af565b90505f8390505b8082101561317857819050600282838661315d91906167af565b61316791906166e1565b61317191906167af565b9150613143565b8092505050919050565b5f61318d5f546151dd565b905090565b5f808390505f805b825181101561322757847effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168382815181106131d9576131d8616714565b5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361321a57818061321690616a44565b9250505b808060010191505061319a565b50809250505092915050565b5f805f90505f6001855161324791906167df565b90505b8082116132e4575f6002828461326091906166e1565b61326a91906167af565b9050848682815181106132805761327f616714565b5b6020026020010151036132985780935050505061330a565b848682815181106132ac576132ab616714565b5b602002602001015110156132ce576001816132c791906166e1565b92506132de565b6001816132db91906167df565b91505b5061324a565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff925050505b92915050565b60608282604051602001613325929190616d0e565b604051602081830303815290604052905092915050565b60608282604051602001613351929190616d0e565b604051602081830303815290604052905092915050565b5f6133735f5461522e565b905090565b5f80825f8151811061338d5761338c616714565b5b602002602001015190505f600190505b83518110156133f357818482815181106133ba576133b9616714565b5b602002602001015111156133e6578381815181106133db576133da616714565b5b602002602001015191505b808060010191505061339d565b5080915050919050565b5f8060028361340c9190616966565b14801561342457505f6003836134229190616966565b145b15613446575f6005836134379190616966565b03613445576001905061344a565b5b5f90505b919050565b6175375f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f6134805f5461527f565b905090565b5f6134905f546152d0565b905090565b60605f8290505f5b81518110156135c057604160f81b8282815181106134be576134bd616714565b5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161015801561353c5750605a60f81b82828151811061350c5761350b616714565b5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191611155b156135b357602082828151811061355657613555616714565b5b602001015160f81c60f81b60f81c61356e9190616d31565b60f81b82828151811061358457613583616714565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505b808060010191505061349d565b5080915050919050565b5f61753460018160018154018082558091505003905f5260205f20906007020190505f61753560018160018154018082558091505003905f5260205f20906007020190505f61753660018160018154018082558091505003905f5260205f20906007020190505f61753660018160018154018082558091505003905f5260205f209060070201905084845f018190555060018561366791906166e1565b835f018190555060028561367b91906166e1565b825f018190555060158561368f91906166e1565b815f01819055505f5b6103e8811015613773578460050181908060018154018082558091505060019003905f5260205f20015f9091909190915055836005016002826136db9190616741565b908060018154018082558091505060019003905f5260205f20015f90919091909150558260050160038261370f9190616741565b908060018154018082558091505060019003905f5260205f20015f9091909190915055816005016017826137439190616741565b908060018154018082558091505060019003905f5260205f20015f90919091909150558080600101915050613698565b505050505050565b5f816001600281106137905761378f616714565b5b60200201515f600281106137a7576137a6616714565b5b6020020151825f600281106137bf576137be616714565b5b60200201516001600281106137d7576137d6616714565b5b60200201516137e691906168af565b826001600281106137fa576137f9616714565b5b602002015160016002811061381257613811616714565b5b6020020151835f6002811061382a57613829616714565b5b60200201515f6002811061384157613840616714565b5b602002015161385091906168af565b61385a919061686f565b9050919050565b5f808390505f5b81518110156138f157837effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168282815181106138a7576138a6616714565b5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036138e4576001925050506138f7565b8080600101915050613868565b505f9150505b92915050565b617534818154811061390d575f80fd5b905f5260205f2090600702015f91509050805f015490806001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020180546139579061683f565b80601f01602080910402602001604051908101604052809291908181526020018280546139839061683f565b80156139ce5780601f106139a5576101008083540402835291602001916139ce565b820191905f5260205f20905b8154815290600101906020018083116139b157829003601f168201915b5050505050908060030180546139e39061683f565b80601f0160208091040260200160405190810160405280929190818152602001828054613a0f9061683f565b8015613a5a5780601f10613a3157610100808354040283529160200191613a5a565b820191905f5260205f20905b815481529060010190602001808311613a3d57829003601f168201915b505050505090806004018054613a6f9061683f565b80601f0160208091040260200160405190810160405280929190818152602001828054613a9b9061683f565b8015613ae65780601f10613abd57610100808354040283529160200191613ae6565b820191905f5260205f20905b815481529060010190602001808311613ac957829003601f168201915b5050505050905085565b60605f8290505f5b8151811015613c1b57606160f81b828281518110613b1957613b18616714565b5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191610158015613b975750607a60f81b828281518110613b6757613b66616714565b5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191611155b15613c0e576020828281518110613bb157613bb0616714565b5b602001015160f81c60f81b60f81c613bc99190616cda565b60f81b828281518110613bdf57613bde616714565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505b8080600101915050613af8565b5080915050919050565b5f81159050919050565b5f600282613c3d9190616741565b9050919050565b5f613c4f5f54615321565b905090565b5f805f90505f5b8451811015613cbe57838181518110613c7757613c76616714565b5b6020026020010151858281518110613c9257613c91616714565b5b6020026020010151613ca49190616741565b82613caf91906166e1565b91508080600101915050613c5b565b508091505092915050565b5f613cd45f54615372565b905090565b5f81604051602001613ceb9190616a2e565b604051602081830303815290604052805190602001209050919050565b5f805f90505f60018551613d1c91906167df565b90505b808211613db9575f60028284613d3591906166e1565b613d3f91906167af565b905084868281518110613d5557613d54616714565b5b602002602001015103613d6d57809350505050613ddf565b84868281518110613d8157613d80616714565b5b60200260200101511015613da357600181613d9c91906166e1565b9250613db3565b600181613db091906167df565b91505b50613d1f565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff925050505b92915050565b5f5481565b5f818385613df891906166e1565b613e0291906166e1565b90509392505050565b5f613e165f546153c3565b905090565b5f5b5f8214613e3f575f8290508284613e349190616966565b925080935050613e1d565b82905092915050565b5f808203613e58575f9050613eac565b60018203613e695760019050613eac565b5f80600190505f80600290505b858111613ea4578284613e8991906166e1565b91508293508192508080613e9c90616a44565b915050613e76565b508093505050505b919050565b5f6002821015613ec3575f9050613f0f565b5f600290505b828182613ed69190616741565b11613f09575f8184613ee89190616966565b03613ef6575f915050613f0f565b8080613f0190616a44565b915050613ec9565b50600190505b919050565b5f613f1f5f54615414565b905090565b60605f825190505f8167ffffffffffffffff811115613f4657613f456155ff565b5b604051908082528060200260200182016040528015613f745781602001602082028036833780820191505090505b5090505f5b82811015613fdf578481600185613f9091906167df565b613f9a91906167df565b81518110613fab57613faa616714565b5b6020026020010151828281518110613fc657613fc5616714565b5b6020026020010181815250508080600101915050613f79565b508092505050919050565b5f805f83511161402f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161402690616daf565b60405180910390fd5b825f8151811061404257614041616714565b5b60200260200101519150825f8151811061405f5761405e616714565b5b602002602001015190505f600190505b8351811015614105578284828151811061408c5761408b616714565b5b602002602001015111156140b8578381815181106140ad576140ac616714565b5b602002602001015192505b818482815181106140cc576140cb616714565b5b602002602001015110156140f8578381815181106140ed576140ec616714565b5b602002602001015191505b808060010191505061406f565b50915091565b5f6141165f54615465565b905090565b5f808284868861412b91906166e1565b61413591906166e1565b61413f91906166e1565b90505f838587896141509190616741565b61415a9190616741565b6141649190616741565b9050808261417291906166e1565b92505050949350505050565b5f808290505f815190505f5b60028261419791906167af565b8110156142525782600182846141ad91906167df565b6141b791906167df565b815181106141c8576141c7616714565b5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191683828151811061420857614207616714565b5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614614245575f935050505061425a565b808060010191505061418a565b506001925050505b919050565b5f80600190505f600190505b83811161429357808261427e9190616741565b9150808061428b90616a44565b91505061426b565b5080915050919050565b614e218161271081106142ae575f80fd5b015f915090505481565b5f808290505f805f5b835181101561435e577f20000000000000000000000000000000000000000000000000000000000000008482815181106142fe576142fd616714565b5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461434d578161434857828061434090616a44565b935050600191505b614351565b5f91505b80806001019150506142c1565b50819350505050919050565b5f806002836143799190616966565b14159050919050565b5f80825f8151811061439757614396616714565b5b602002602001015190505f600190505b8351811015614429578173ffffffffffffffffffffffffffffffffffffffff168482815181106143da576143d9616714565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16111561441c5783818151811061441157614410616714565b5b602002602001015191505b80806001019150506143a7565b5080915050919050565b5f61443e5f546154b6565b905090565b5f8082121561445d578161445690616dcd565b9050614461565b8190505b919050565b6060819050919050565b5f805f90505b5f8311156144ac57600a8361448b9190616966565b8161449691906166e1565b9050600a836144a591906167af565b9250614476565b80915050919050565b5f600190505f5b828110156144df5783826144d09190616741565b915080806001019150506144bc565b5092915050565b5f6144f15f54615507565b905090565b5f6145015f54615558565b905090565b60605f8267ffffffffffffffff811115614523576145226155ff565b5b6040519080825280602002602001820160405280156145515781602001602082028036833780820191505090505b5090505f5b838110156145a157848161456a9190616741565b8661457591906166e1565b82828151811061458857614587616714565b5b6020026020010181815250508080600101915050614556565b50809150509392505050565b5f60ff905090565b6060819050919050565b60605f8273ffffffffffffffffffffffffffffffffffffffff165f1b90505f6040518060400160405280601081526020017f303132333435363738396162636465660000000000000000000000000000000081525090505f602a67ffffffffffffffff811115614632576146316155ff565b5b6040519080825280601f01601f1916602001820160405280156146645781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f8151811061469b5761469a616714565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106146fe576146fd616714565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f5b60148110156148ae5782600485600c8461474891906166e1565b6020811061475957614758616714565b5b1a60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916901c60f81c60ff168151811061479857614797616714565b5b602001015160f81c60f81b826002836147b19190616741565b60026147bd91906166e1565b815181106147ce576147cd616714565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535082600f60f81b85600c8461481091906166e1565b6020811061482157614820616714565b5b1a60f81b1660f81c60ff168151811061483d5761483c616714565b5b602001015160f81c60f81b826002836148569190616741565b600361486291906166e1565b8151811061487357614872616714565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350808060010191505061472e565b50809350505050919050565b60608190505f5b600182516148cf91906167df565b8110156149c1575f6001826148e491906166e1565b90505b82518110156149b35782818151811061490357614902616714565b5b602002602001015183838151811061491e5761491d616714565b5b602002602001015111156149a6575f8383815181106149405761493f616714565b5b6020026020010151905083828151811061495d5761495c616714565b5b602002602001015184848151811061497857614977616714565b5b6020026020010181815250508084838151811061499857614997616714565b5b602002602001018181525050505b80806001019150506148e7565b5080806001019150506148c1565b50919050565b617532602052815f5260405f20602052805f5260405f205f915091509054906101000a900460ff1681565b5f838381518110614a0657614a05616714565b5b60200260200101519050838281518110614a2357614a22616714565b5b6020026020010151848481518110614a3e57614a3d616714565b5b60200260200101818152505080848381518110614a5e57614a5d616714565b5b60200260200101818152505050505050565b6175368181548110614a80575f80fd5b905f5260205f2090600702015f91509050805f015490806001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690806002018054614aca9061683f565b80601f0160208091040260200160405190810160405280929190818152602001828054614af69061683f565b8015614b415780601f10614b1857610100808354040283529160200191614b41565b820191905f5260205f20905b815481529060010190602001808311614b2457829003601f168201915b505050505090806003018054614b569061683f565b80601f0160208091040260200160405190810160405280929190818152602001828054614b829061683f565b8015614bcd5780601f10614ba457610100808354040283529160200191614bcd565b820191905f5260205f20905b815481529060010190602001808311614bb057829003601f168201915b505050505090806004018054614be29061683f565b80601f0160208091040260200160405190810160405280929190818152602001828054614c0e9061683f565b8015614c595780601f10614c3057610100808354040283529160200191614c59565b820191905f5260205f20905b815481529060010190602001808311614c3c57829003601f168201915b5050505050905085565b5f80825f81518110614c7857614c77616714565b5b602002602001015190505f600190505b8351811015614cde5781848281518110614ca557614ca4616714565b5b60200260200101511015614cd157838181518110614cc657614cc5616714565b5b602002602001015191505b8080600101915050614c88565b5080915050919050565b5f602a905090565b5f600282614cfe9190616e13565b9050919050565b5f8183614d1291906166e1565b6002614d1e9190616741565b905092915050565b5f80600190505f5b83811015614d51578482614d429190616741565b91508080600101915050614d2e565b508091505092915050565b5f61753460018160018154018082558091505003905f5260205f20906007020190505f61753560018160018154018082558091505003905f5260205f20906007020190505f61753660018160018154018082558091505003905f5260205f209060070201905083835f0181905550600184614dd791906166e1565b825f0181905550600284614deb91906166e1565b815f01819055505f5b6103e8811015614e9b578360050181908060018154018082558091505060019003905f5260205f20015f909190919091505582600501600282614e379190616741565b908060018154018082558091505060019003905f5260205f20015f909190919091505581600501600382614e6b9190616741565b908060018154018082558091505060019003905f5260205f20015f90919091909150558080600101915050614df4565b5050505050565b5f815f81518110614eb657614eb5616714565b5b6020026020010151604051602001614ece9190616e7d565b6040516020818303038152906040528051906020012090505f600190505b8251811015614f475781838281518110614f0957614f08616714565b5b6020026020010151604051602001614f22929190616e97565b6040516020818303038152906040528051906020012091508080600101915050614eec565b50919050565b5f6001905090565b5f8063544a15e683614f679190616741565b90505f5b610708811015614f9c57600181614f8291906166e1565b82614f8d91906167af565b91508080600101915050614f6b565b5080915050919050565b5f80630d3ed78e83614fb89190616741565b90505f5b610258811015614fed57600181614fd391906166e1565b82614fde91906167af565b91508080600101915050614fbc565b5080915050919050565b5f806313de4355836150099190616741565b90505f5b6102bc81101561503e5760018161502491906166e1565b8261502f91906167af565b9150808060010191505061500d565b5080915050919050565b5f80635a4f609b8361505a9190616741565b90505f5b61076c81101561508f5760018161507591906166e1565b8261508091906167af565b9150808060010191505061505e565b5080915050919050565b5f8063423a35c7836150ab9190616741565b90505f5b6105dc8110156150e0576001816150c691906166e1565b826150d191906167af565b915080806001019150506150af565b5080915050919050565b5f80632e5bf271836150fc9190616741565b90505f5b61044c8110156151315760018161511791906166e1565b8261512291906167af565b91508080600101915050615100565b5080915050919050565b5f80636054ab508361514d9190616741565b90505f5b6107d08110156151825760018161516891906166e1565b8261517391906167af565b91508080600101915050615151565b5080915050919050565b5f8063483f807c8361519e9190616741565b90505f5b6106408110156151d3576001816151b991906166e1565b826151c491906167af565b915080806001019150506151a2565b5080915050919050565b5f80636c5f40ba836151ef9190616741565b90505f5b6108988110156152245760018161520a91906166e1565b8261521591906167af565b915080806001019150506151f3565b5080915050919050565b5f8063069f6bc7836152409190616741565b90505f5b6101f48110156152755760018161525b91906166e1565b8261526691906167af565b91508080600101915050615244565b5080915050919050565b5f806372648b6f836152919190616741565b90505f5b6108fc8110156152c6576001816152ac91906166e1565b826152b791906167af565b91508080600101915050615295565b5080915050919050565b5f80631a7daf1c836152e29190616741565b90505f5b610320811015615317576001816152fd91906166e1565b8261530891906167af565b915080806001019150506152e6565b5080915050919050565b5f806334fb5e38836153339190616741565b90505f5b6104b08110156153685760018161534e91906166e1565b8261535991906167af565b91508080600101915050615337565b5080915050919050565b5f80633b9ac9ff836153849190616741565b90505f5b6105148110156153b95760018161539f91906166e1565b826153aa91906167af565b91508080600101915050615388565b5080915050919050565b5f80633c34eb12836153d59190616741565b90505f5b61057881101561540a576001816153f091906166e1565b826153fb91906167af565b915080806001019150506153d9565b5080915050919050565b5f80637869d624836154269190616741565b90505f5b61096081101561545b5760018161544191906166e1565b8261544c91906167af565b9150808060010191505061542a565b5080915050919050565b5f80634e44cb31836154779190616741565b90505f5b6106a48110156154ac5760018161549291906166e1565b8261549d91906167af565b9150808060010191505061547b565b5080915050919050565b5f806327bc86aa836154c89190616741565b90505f5b6103e88110156154fd576001816154e391906166e1565b826154ee91906167af565b915080806001019150506154cc565b5080915050919050565b5f80636659f605836155199190616741565b90505f5b61083481101561554e5760018161553491906166e1565b8261553f91906167af565b9150808060010191505061551d565b5080915050919050565b5f8063211d1ae38361556a9190616741565b90505f5b61038481101561559f5760018161558591906166e1565b8261559091906167af565b9150808060010191505061556e565b5080915050919050565b5f819050919050565b6155bb816155a9565b82525050565b5f6020820190506155d45f8301846155b2565b92915050565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b615635826155ef565b810181811067ffffffffffffffff82111715615654576156536155ff565b5b80604052505050565b5f6156666155da565b9050615672828261562c565b919050565b5f67ffffffffffffffff821115615691576156906155ff565b5b602082029050602081019050919050565b5f80fd5b6156af816155a9565b81146156b9575f80fd5b50565b5f813590506156ca816156a6565b92915050565b5f6156e26156dd84615677565b61565d565b90508083825260208201905060208402830185811115615705576157046156a2565b5b835b8181101561572e578061571a88826156bc565b845260208401935050602081019050615707565b5050509392505050565b5f82601f83011261574c5761574b6155eb565b5b813561575c8482602086016156d0565b91505092915050565b5f806040838503121561577b5761577a6155e3565b5b5f83013567ffffffffffffffff811115615798576157976155e7565b5b6157a485828601615738565b925050602083013567ffffffffffffffff8111156157c5576157c46155e7565b5b6157d185828601615738565b9150509250929050565b5f80604083850312156157f1576157f06155e3565b5b5f6157fe858286016156bc565b925050602061580f858286016156bc565b9150509250929050565b5f6020828403121561582e5761582d6155e3565b5b5f82013567ffffffffffffffff81111561584b5761584a6155e7565b5b61585784828501615738565b91505092915050565b5f67ffffffffffffffff82111561587a576158796155ff565b5b602082029050602081019050919050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6158b48261588b565b9050919050565b6158c4816158aa565b81146158ce575f80fd5b50565b5f813590506158df816158bb565b92915050565b5f6158f76158f284615860565b61565d565b9050808382526020820190506020840283018581111561591a576159196156a2565b5b835b81811015615943578061592f88826158d1565b84526020840193505060208101905061591c565b5050509392505050565b5f82601f830112615961576159606155eb565b5b81356159718482602086016158e5565b91505092915050565b5f6020828403121561598f5761598e6155e3565b5b5f82013567ffffffffffffffff8111156159ac576159ab6155e7565b5b6159b88482850161594d565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6159f3816158aa565b82525050565b5f615a0483836159ea565b60208301905092915050565b5f602082019050919050565b5f615a26826159c1565b615a3081856159cb565b9350615a3b836159db565b805f5b83811015615a6b578151615a5288826159f9565b9750615a5d83615a10565b925050600181019050615a3e565b5085935050505092915050565b5f6020820190508181035f830152615a908184615a1c565b905092915050565b5f60208284031215615aad57615aac6155e3565b5b5f615aba848285016156bc565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f615af582615ac3565b615aff8185615acd565b9350615b0f818560208601615add565b615b18816155ef565b840191505092915050565b5f6020820190508181035f830152615b3b8184615aeb565b905092915050565b5f8060408385031215615b5957615b586155e3565b5b5f615b66858286016158d1565b9250506020615b77858286016156bc565b9150509250929050565b5f8115159050919050565b615b9581615b81565b82525050565b5f602082019050615bae5f830184615b8c565b92915050565b615bbd816158aa565b82525050565b5f602082019050615bd65f830184615bb4565b92915050565b5f80fd5b5f67ffffffffffffffff821115615bfa57615bf96155ff565b5b615c03826155ef565b9050602081019050919050565b828183375f83830152505050565b5f615c30615c2b84615be0565b61565d565b905082815260208101848484011115615c4c57615c4b615bdc565b5b615c57848285615c10565b509392505050565b5f82601f830112615c7357615c726155eb565b5b8135615c83848260208601615c1e565b91505092915050565b5f60208284031215615ca157615ca06155e3565b5b5f82013567ffffffffffffffff811115615cbe57615cbd6155e7565b5b615cca84828501615c5f565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b615d05816155a9565b82525050565b5f615d168383615cfc565b60208301905092915050565b5f602082019050919050565b5f615d3882615cd3565b615d428185615cdd565b9350615d4d83615ced565b805f5b83811015615d7d578151615d648882615d0b565b9750615d6f83615d22565b925050600181019050615d50565b5085935050505092915050565b5f6020820190508181035f830152615da28184615d2e565b905092915050565b5f819050919050565b615dbc81615daa565b8114615dc6575f80fd5b50565b5f81359050615dd781615db3565b92915050565b5f805f8060808587031215615df557615df46155e3565b5b5f615e0287828801615dc9565b9450506020615e1387828801615dc9565b9350506040615e2487828801615dc9565b9250506060615e3587828801615dc9565b91505092959194509250565b5f819050919050565b615e5381615e41565b82525050565b5f602082019050615e6c5f830184615e4a565b92915050565b5f60208284031215615e8757615e866155e3565b5b5f615e94848285016158d1565b91505092915050565b5f60a082019050615eb05f8301886155b2565b615ebd6020830187615bb4565b8181036040830152615ecf8186615aeb565b90508181036060830152615ee38185615aeb565b90508181036080830152615ef78184615aeb565b90509695505050505050565b5f7fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b615f3781615f03565b8114615f41575f80fd5b50565b5f81359050615f5281615f2e565b92915050565b5f8060408385031215615f6e57615f6d6155e3565b5b5f83013567ffffffffffffffff811115615f8b57615f8a6155e7565b5b615f9785828601615c5f565b9250506020615fa885828601615f44565b9150509250929050565b5f8060408385031215615fc857615fc76155e3565b5b5f83013567ffffffffffffffff811115615fe557615fe46155e7565b5b615ff185828601615738565b9250506020616002858286016156bc565b9150509250929050565b61601581615daa565b82525050565b5f60208201905061602e5f83018461600c565b92915050565b5f806040838503121561604a576160496155e3565b5b5f83013567ffffffffffffffff811115616067576160666155e7565b5b61607385828601615c5f565b925050602083013567ffffffffffffffff811115616094576160936155e7565b5b6160a085828601615c5f565b9150509250929050565b5f67ffffffffffffffff8211156160c4576160c36155ff565b5b602082029050919050565b5f67ffffffffffffffff8211156160e9576160e86155ff565b5b602082029050919050565b5f616106616101846160cf565b61565d565b905080602084028301858111156161205761611f6156a2565b5b835b8181101561614957806161358882615dc9565b845260208401935050602081019050616122565b5050509392505050565b5f82601f830112616167576161666155eb565b5b60026161748482856160f4565b91505092915050565b5f61618f61618a846160aa565b61565d565b905080604084028301858111156161a9576161a86156a2565b5b835b818110156161d257806161be8882616153565b8452602084019350506040810190506161ab565b5050509392505050565b5f82601f8301126161f0576161ef6155eb565b5b60026161fd84828561617d565b91505092915050565b5f6080828403121561621b5761621a6155e3565b5b5f616228848285016161dc565b91505092915050565b61623a81615b81565b8114616244575f80fd5b50565b5f8135905061625581616231565b92915050565b5f602082840312156162705761626f6155e3565b5b5f61627d84828501616247565b91505092915050565b5f805f6060848603121561629d5761629c6155e3565b5b5f6162aa868287016156bc565b93505060206162bb868287016156bc565b92505060406162cc868287016156bc565b9150509250925092565b5f6040820190506162e95f8301856155b2565b6162f660208301846155b2565b9392505050565b5f805f8060808587031215616315576163146155e3565b5b5f616322878288016156bc565b9450506020616333878288016156bc565b9350506040616344878288016156bc565b9250506060616355878288016156bc565b91505092959194509250565b5f60208284031215616376576163756155e3565b5b5f61638384828501615dc9565b91505092915050565b5f67ffffffffffffffff8211156163a6576163a56155ff565b5b6163af826155ef565b9050602081019050919050565b5f6163ce6163c98461638c565b61565d565b9050828152602081018484840111156163ea576163e9615bdc565b5b6163f5848285615c10565b509392505050565b5f82601f830112616411576164106155eb565b5b81356164218482602086016163bc565b91505092915050565b5f6020828403121561643f5761643e6155e3565b5b5f82013567ffffffffffffffff81111561645c5761645b6155e7565b5b616468848285016163fd565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f61649582616471565b61649f818561647b565b93506164af818560208601615add565b6164b8816155ef565b840191505092915050565b5f6020820190508181035f8301526164db818461648b565b905092915050565b5f60ff82169050919050565b6164f8816164e3565b82525050565b5f6020820190506165115f8301846164ef565b92915050565b5f805f6060848603121561652e5761652d6155e3565b5b5f84013567ffffffffffffffff81111561654b5761654a6155e7565b5b61655786828701615738565b9350506020616568868287016156bc565b9250506040616579868287016156bc565b9150509250925092565b5f67ffffffffffffffff82111561659d5761659c6155ff565b5b602082029050602081019050919050565b6165b781615e41565b81146165c1575f80fd5b50565b5f813590506165d2816165ae565b92915050565b5f6165ea6165e584616583565b61565d565b9050808382526020820190506020840283018581111561660d5761660c6156a2565b5b835b81811015616636578061662288826165c4565b84526020840193505060208101905061660f565b5050509392505050565b5f82601f830112616654576166536155eb565b5b81356166648482602086016165d8565b91505092915050565b5f60208284031215616682576166816155e3565b5b5f82013567ffffffffffffffff81111561669f5761669e6155e7565b5b6166ab84828501616640565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6166eb826155a9565b91506166f6836155a9565b925082820190508082111561670e5761670d6166b4565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f61674b826155a9565b9150616756836155a9565b9250828202616764816155a9565b9150828204841483151761677b5761677a6166b4565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6167b9826155a9565b91506167c4836155a9565b9250826167d4576167d3616782565b5b828204905092915050565b5f6167e9826155a9565b91506167f4836155a9565b925082820390508181111561680c5761680b6166b4565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061685657607f821691505b60208210810361686957616868616812565b5b50919050565b5f61687982615daa565b915061688483615daa565b925082820390508181125f8412168282135f8512151617156168a9576168a86166b4565b5b92915050565b5f6168b982615daa565b91506168c483615daa565b92508282026168d281615daa565b91507f800000000000000000000000000000000000000000000000000000000000000084145f84121615616909576169086166b4565b5b828205841483151761691e5761691d6166b4565b5b5092915050565b5f61692f82615daa565b915061693a83615daa565b92508282019050828112155f8312168382125f8412151617156169605761695f6166b4565b5b92915050565b5f616970826155a9565b915061697b836155a9565b92508261698b5761698a616782565b5b828206905092915050565b5f81905092915050565b7f64756d6d790000000000000000000000000000000000000000000000000000005f82015250565b5f6169d4600583616996565b91506169df826169a0565b600582019050919050565b5f6169f4826169c8565b9150819050919050565b5f616a0882615ac3565b616a128185616996565b9350616a22818560208601615add565b80840191505092915050565b5f616a3982846169fe565b915081905092915050565b5f616a4e826155a9565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203616a8057616a7f6166b4565b5b600182019050919050565b7f30000000000000000000000000000000000000000000000000000000000000005f82015250565b5f616abf600183616996565b9150616aca82616a8b565b600182019050919050565b5f616adf82616ab3565b9150616aeb82846169fe565b915081905092915050565b7f31000000000000000000000000000000000000000000000000000000000000005f82015250565b5f616b2a600183616996565b9150616b3582616af6565b600182019050919050565b5f616b4a82616b1e565b9150616b5682846169fe565b915081905092915050565b5f8160011c9050919050565b5f808291508390505b6001851115616bb657808604811115616b9257616b916166b4565b5b6001851615616ba15780820291505b8081029050616baf85616b61565b9450616b76565b94509492505050565b5f82616bce5760019050616c89565b81616bdb575f9050616c89565b8160018114616bf15760028114616bfb57616c2a565b6001915050616c89565b60ff841115616c0d57616c0c6166b4565b5b8360020a915084821115616c2457616c236166b4565b5b50616c89565b5060208310610133831016604e8410600b8410161715616c5f5782820a905083811115616c5a57616c596166b4565b5b616c89565b616c6c8484846001616b6d565b92509050818404811115616c8357616c826166b4565b5b81810290505b9392505050565b5f616c9a826155a9565b9150616ca5836155a9565b9250616cd27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484616bbf565b905092915050565b5f616ce4826164e3565b9150616cef836164e3565b9250828203905060ff811115616d0857616d076166b4565b5b92915050565b5f616d1982856169fe565b9150616d2582846169fe565b91508190509392505050565b5f616d3b826164e3565b9150616d46836164e3565b9250828201905060ff811115616d5f57616d5e6166b4565b5b92915050565b7f417272617920697320656d7074790000000000000000000000000000000000005f82015250565b5f616d99600e83615acd565b9150616da482616d65565b602082019050919050565b5f6020820190508181035f830152616dc681616d8d565b9050919050565b5f616dd782615daa565b91507f80000000000000000000000000000000000000000000000000000000000000008203616e0957616e086166b4565b5b815f039050919050565b5f616e1d826155a9565b9150616e28836164e3565b9250616e557fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484616bbf565b905092915050565b5f819050919050565b616e77616e7282615e41565b616e5d565b82525050565b5f616e888284616e66565b60208201915081905092915050565b5f616ea28285616e66565b602082019150616eb28284616e66565b602082019150819050939250505056fea2646970667358221220ed2bbbae383a4bfd5d43cb663194360d06b5aed35c4e91cdca0830eb128ad06e64736f6c634300081a00330000000000000000000000 + gas 49000000 + build + +block_build b02 + parent b01 + gasLimit 10000000000 + transactions txContractCreation + build + +block_connect b02 + +# Assert best block +assert_best b02 + + diff --git a/rskj-core/src/test/resources/dsl/453_rollback_during_creation/not_enough_gas b/rskj-core/src/test/resources/dsl/453_rollback_during_creation/not_enough_gas new file mode 100644 index 00000000000..0569ece48a2 --- /dev/null +++ b/rskj-core/src/test/resources/dsl/453_rollback_during_creation/not_enough_gas @@ -0,0 +1,76 @@ +comment + +// Contracts compiled using 0.8.20 +// the contract source code + +contract StorageFactory { + + function testOpcodeCreate(bytes memory _data) external returns (address) { + return address(new Storage(_data)); + } + + function testOpcodeCreate2(bytes memory _data) public payable returns (address) + { + bytes32 _salt = bytes32(uint256(1)); + return address(new Storage{salt: _salt}(_data)); + } +} + +contract Storage { + address public owner; + bytes data; + + constructor(bytes memory _data) { + owner = msg.sender; + data = _data; + } + + function get() external view returns (bytes memory) { + return data; + } +} + +end + +account_new acc1 20000000 + +# deploy contract compiled with 0.8.20 +transaction_build txCreateContractFactory + sender acc1 + receiverAddress 00 + value 0 + data 608060405234801561001057600080fd5b50610cde806100206000396000f3fe6080604052600436106200002c5760003560e01c8063490af4231462000031578063fdaaa16f1462000067575b600080fd5b6200004f6004803603810190620000499190620002c1565b620000ab565b6040516200005e919062000357565b60405180910390f35b3480156200007457600080fd5b506200009360048036038101906200008d9190620002c1565b620000fb565b604051620000a2919062000357565b60405180910390f35b600080600160001b90508083604051620000c5906200013d565b620000d19190620003fd565b8190604051809103906000f5905080158015620000f2573d6000803e3d6000fd5b50915050919050565b6000816040516200010c906200013d565b620001189190620003fd565b604051809103906000f08015801562000135573d6000803e3d6000fd5b509050919050565b610887806200042283390190565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620001b48262000169565b810181811067ffffffffffffffff82111715620001d657620001d56200017a565b5b80604052505050565b6000620001eb6200014b565b9050620001f98282620001a9565b919050565b600067ffffffffffffffff8211156200021c576200021b6200017a565b5b620002278262000169565b9050602081019050919050565b82818337600083830152505050565b60006200025a6200025484620001fe565b620001df565b90508281526020810184848401111562000279576200027862000164565b5b6200028684828562000234565b509392505050565b600082601f830112620002a657620002a56200015f565b5b8135620002b884826020860162000243565b91505092915050565b600060208284031215620002da57620002d962000155565b5b600082013567ffffffffffffffff811115620002fb57620002fa6200015a565b5b62000309848285016200028e565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200033f8262000312565b9050919050565b620003518162000332565b82525050565b60006020820190506200036e600083018462000346565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015620003b057808201518184015260208101905062000393565b60008484015250505050565b6000620003c98262000374565b620003d581856200037f565b9350620003e781856020860162000390565b620003f28162000169565b840191505092915050565b60006020820190508181036000830152620004198184620003bc565b90509291505056fe60806040523480156200001157600080fd5b506040516200088738038062000887833981810160405281019062000037919062000223565b336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060019081620000889190620004bf565b5050620005a6565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620000f982620000ae565b810181811067ffffffffffffffff821117156200011b576200011a620000bf565b5b80604052505050565b60006200013062000090565b90506200013e8282620000ee565b919050565b600067ffffffffffffffff821115620001615762000160620000bf565b5b6200016c82620000ae565b9050602081019050919050565b60005b83811015620001995780820151818401526020810190506200017c565b60008484015250505050565b6000620001bc620001b68462000143565b62000124565b905082815260208101848484011115620001db57620001da620000a9565b5b620001e884828562000179565b509392505050565b600082601f830112620002085762000207620000a4565b5b81516200021a848260208601620001a5565b91505092915050565b6000602082840312156200023c576200023b6200009a565b5b600082015167ffffffffffffffff8111156200025d576200025c6200009f565b5b6200026b84828501620001f0565b91505092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620002c757607f821691505b602082108103620002dd57620002dc6200027f565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620003477fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000308565b62000353868362000308565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620003a06200039a62000394846200036b565b62000375565b6200036b565b9050919050565b6000819050919050565b620003bc836200037f565b620003d4620003cb82620003a7565b84845462000315565b825550505050565b600090565b620003eb620003dc565b620003f8818484620003b1565b505050565b5b81811015620004205762000414600082620003e1565b600181019050620003fe565b5050565b601f8211156200046f576200043981620002e3565b6200044484620002f8565b8101602085101562000454578190505b6200046c6200046385620002f8565b830182620003fd565b50505b505050565b600082821c905092915050565b6000620004946000198460080262000474565b1980831691505092915050565b6000620004af838362000481565b9150826002028217905092915050565b620004ca8262000274565b67ffffffffffffffff811115620004e657620004e5620000bf565b5b620004f28254620002ae565b620004ff82828562000424565b600060209050601f83116001811462000537576000841562000522578287015190505b6200052e8582620004a1565b8655506200059e565b601f1984166200054786620002e3565b60005b8281101562000571578489015182556001820191506020850194506020810190506200054a565b868310156200059157848901516200058d601f89168262000481565b8355505b6001600288020188555050505b505050505050565b6102d180620005b66000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80636d4ce63c1461003b5780638da5cb5b14610059575b600080fd5b610043610077565b60405161005091906101bd565b60405180910390f35b610061610109565b60405161006e9190610220565b60405180910390f35b6060600180546100869061026a565b80601f01602080910402602001604051908101604052809291908181526020018280546100b29061026a565b80156100ff5780601f106100d4576101008083540402835291602001916100ff565b820191906000526020600020905b8154815290600101906020018083116100e257829003601f168201915b5050505050905090565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600081519050919050565b600082825260208201905092915050565b60005b8381101561016757808201518184015260208101905061014c565b60008484015250505050565b6000601f19601f8301169050919050565b600061018f8261012d565b6101998185610138565b93506101a9818560208601610149565b6101b281610173565b840191505092915050565b600060208201905081810360008301526101d78184610184565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061020a826101df565b9050919050565b61021a816101ff565b82525050565b60006020820190506102356000830184610211565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061028257607f821691505b6020821081036102955761029461023b565b5b5091905056fea264697066735822122071163cf749253f921b29799fb8f2b856a099dcdc627d7622ee7536e5e392509464736f6c63430008180033a2646970667358221220bd9fa3c126989a1d6a7a7fe44541a0bf9a4b43a3d2e12733f1208d6beaf0ede564736f6c63430008180033 + gas 6500000 + build + +block_build b01 + parent g00 + gasLimit 650000000 + transactions txCreateContractFactory + build + +block_connect b01 + +# Assert best block +assert_best b01 + + +transaction_build txContractCreation + sender acc1 + nonce 1 + contract txCreateContractFactory # created in txCreateContractFactory + value 0 + data 490af423000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000041234567800000000000000000000000000000000000000000000000000000000 + gas 100000 + build + +block_build b02 + parent b01 + gasLimit 10000000 + transactions txContractCreation + build + +block_connect b02 + +# Assert best block +assert_best b02 \ No newline at end of file