From fa1dbb897aa8498aedca52183af78b0108250d9f Mon Sep 17 00:00:00 2001 From: Ladd Hoffman Date: Sun, 10 Mar 2024 11:55:59 -0500 Subject: [PATCH] event subscriptions --- client/package-lock.json | 80 +++++++++++++++++++----------------- client/package.json | 2 +- client/src/App.jsx | 79 ++++++++++++++++++++++++----------- client/src/assets/DAO.json | 23 ++++++++++- client/src/assets/Work1.json | 4 +- client/src/main.jsx | 4 +- ethereum/.eslintrc.cjs | 3 +- ethereum/.mocharc.json | 4 ++ ethereum/contracts/DAO.sol | 7 +++- ethereum/hardhat.config.js | 9 ++++ ethereum/package-lock.json | 20 ++++++--- ethereum/package.json | 5 ++- ethereum/test/DAO.js | 75 ++++++++++++++++++++++++++------- 13 files changed, 225 insertions(+), 90 deletions(-) create mode 100644 ethereum/.mocharc.json diff --git a/client/package-lock.json b/client/package-lock.json index 6d4ef36..01ab2dd 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -15,7 +15,7 @@ "react": "^18.2.0", "react-bootstrap": "^2.10.1", "react-dom": "^18.2.0", - "web3": "^4.5.0" + "web3": "^4.6.0" }, "devDependencies": { "@stylistic/eslint-plugin": "^1.6.3", @@ -7942,6 +7942,11 @@ "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.9.tgz", "integrity": "sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==" }, + "node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" + }, "node_modules/evp_bytestokey": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", @@ -14371,25 +14376,25 @@ } }, "node_modules/web3": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/web3/-/web3-4.5.0.tgz", - "integrity": "sha512-qWvmuFwmu1b4IVZz1/vahEP1VrRlnXLJJO6s88oRcOgOf21Q26rIyxqIDtKgKe7a4X29TqBocC1eP4CtZulAGA==", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/web3/-/web3-4.6.0.tgz", + "integrity": "sha512-hoI6r29B4kjxINI21rBVaE0Bz0hwtW+Sbppn5ZDTWn5PSQpBW4ecYFDVKVE6K3gbmSjY2fknu2cjBTqha7S53A==", "dependencies": { "web3-core": "^4.3.2", "web3-errors": "^1.1.4", - "web3-eth": "^4.4.0", + "web3-eth": "^4.5.0", "web3-eth-abi": "^4.2.0", "web3-eth-accounts": "^4.1.1", "web3-eth-contract": "^4.2.0", - "web3-eth-ens": "^4.0.8", + "web3-eth-ens": "^4.1.0", "web3-eth-iban": "^4.0.7", "web3-eth-personal": "^4.0.8", "web3-net": "^4.0.7", "web3-providers-http": "^4.1.0", "web3-providers-ws": "^4.0.7", - "web3-rpc-methods": "^1.1.4", - "web3-types": "^1.4.0", - "web3-utils": "^4.2.0", + "web3-rpc-methods": "^1.2.0", + "web3-types": "^1.5.0", + "web3-utils": "^4.2.1", "web3-validator": "^2.0.4" }, "engines": { @@ -14432,9 +14437,9 @@ } }, "node_modules/web3-eth": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-4.4.0.tgz", - "integrity": "sha512-HswKdzF44wUrciRAtEJaml9O7rDYDxElHmFs+27WcO3nel2zku+n0xs4e2ZAehfrCZ+05/y7TgnOZnaDU8Fb/A==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-4.5.0.tgz", + "integrity": "sha512-crisE46o/SHMVm+XHAXEaR8k76NCImq+hi0QQEJ+VaLZbDobI/Gvog1HwTukDUDRgnYSAFGqD0cTRyAwDurwpA==", "dependencies": { "setimmediate": "^1.0.5", "web3-core": "^4.3.2", @@ -14443,9 +14448,9 @@ "web3-eth-accounts": "^4.1.1", "web3-net": "^4.0.7", "web3-providers-ws": "^4.0.7", - "web3-rpc-methods": "^1.1.4", - "web3-types": "^1.3.1", - "web3-utils": "^4.1.1", + "web3-rpc-methods": "^1.2.0", + "web3-types": "^1.5.0", + "web3-utils": "^4.2.1", "web3-validator": "^2.0.4" }, "engines": { @@ -14506,19 +14511,19 @@ } }, "node_modules/web3-eth-ens": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-4.0.8.tgz", - "integrity": "sha512-nj0JfeD45BbzVJcVYpUJnSo8iwDcY9CQ7CZhhIVVOFjvpMAPw0zEwjTvZEIQyCW61OoDG9xcBzwxe2tZoYhMRw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-4.1.0.tgz", + "integrity": "sha512-B+QsXXJb/gJkHb1ZGfErNLeFI9zUf2TsQcvi2+NsSuzFwvjIO5IyrrGtqBmXMLWC8ZikMOHuc8ZfFuGrELl31Q==", "dependencies": { "@adraffy/ens-normalize": "^1.8.8", - "web3-core": "^4.3.0", - "web3-errors": "^1.1.3", - "web3-eth": "^4.3.1", - "web3-eth-contract": "^4.1.2", + "web3-core": "^4.3.2", + "web3-errors": "^1.1.4", + "web3-eth": "^4.5.0", + "web3-eth-contract": "^4.2.0", "web3-net": "^4.0.7", - "web3-types": "^1.3.0", - "web3-utils": "^4.0.7", - "web3-validator": "^2.0.3" + "web3-types": "^1.5.0", + "web3-utils": "^4.2.1", + "web3-validator": "^2.0.4" }, "engines": { "node": ">=14", @@ -14628,13 +14633,13 @@ } }, "node_modules/web3-rpc-methods": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/web3-rpc-methods/-/web3-rpc-methods-1.1.4.tgz", - "integrity": "sha512-LTFNg4LFaeU8K9ecuT8fHDp/LOXyxCneeZjCrRYIW1u82Ly52SrY55FIzMIISGoG/iT5Wh7UiHOB3CQsWLBmbQ==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/web3-rpc-methods/-/web3-rpc-methods-1.2.0.tgz", + "integrity": "sha512-CWJ/g4I4WyYvLkf21wCZAehdhU/VjX/OAPHnqF5/FPDJlogOsOnGXHqi1Z5AP+ocdt395PNubd8jyMMJoYGSBA==", "dependencies": { "web3-core": "^4.3.2", - "web3-types": "^1.3.1", - "web3-validator": "^2.0.3" + "web3-types": "^1.5.0", + "web3-validator": "^2.0.4" }, "engines": { "node": ">=14", @@ -14642,22 +14647,23 @@ } }, "node_modules/web3-types": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/web3-types/-/web3-types-1.4.0.tgz", - "integrity": "sha512-QnGDNredYqtZ49YD1pIPhsQTJJTOnYPCOnvrUs4/3XzeQLuDM+bAJ8fZ6U2nGEV77h81z2Ins6RE/f40yltvww==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/web3-types/-/web3-types-1.5.0.tgz", + "integrity": "sha512-geWuMIeegQ8AedKAO6wO4G4j1gyQ1F/AyKLMw2vud4bsfZayyzWJgCMDZtjYMm5uo2a7i8j1W3/4QFmzlSy5cw==", "engines": { "node": ">=14", "npm": ">=6.12.0" } }, "node_modules/web3-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-4.2.0.tgz", - "integrity": "sha512-UE7tmqPnC6sD0kpHhZiO9Zu8q7hiBItCQhnmxoMxk8OI91qlBWw6L7w1VNZo7TMBWH1Qe4R5l8h2vaoQCizVyA==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-4.2.1.tgz", + "integrity": "sha512-Fk29BlEqD9Q9Cnw4pBkKw7czcXiRpsSco/BzEUl4ye0ZTSHANQFfjsfQmNm4t7uY11u6Ah+8F3tNjBeU4CA80A==", "dependencies": { "ethereum-cryptography": "^2.0.0", + "eventemitter3": "^5.0.1", "web3-errors": "^1.1.4", - "web3-types": "^1.4.0", + "web3-types": "^1.5.0", "web3-validator": "^2.0.4" }, "engines": { diff --git a/client/package.json b/client/package.json index 46e28fb..6d760a2 100644 --- a/client/package.json +++ b/client/package.json @@ -17,7 +17,7 @@ "react": "^18.2.0", "react-bootstrap": "^2.10.1", "react-dom": "^18.2.0", - "web3": "^4.5.0" + "web3": "^4.6.0" }, "devDependencies": { "@stylistic/eslint-plugin": "^1.6.3", diff --git a/client/src/App.jsx b/client/src/App.jsx index 863cf7b..57436c0 100644 --- a/client/src/App.jsx +++ b/client/src/App.jsx @@ -1,4 +1,4 @@ -import { useEffect, useState } from 'react'; +import { useCallback, useEffect, useState } from 'react'; import { useSDK } from '@metamask/sdk-react'; import { Web3 } from 'web3'; import Button from 'react-bootstrap/Button'; @@ -6,8 +6,8 @@ import Button from 'react-bootstrap/Button'; import DAOArtifact from './assets/DAO.json'; import work1Artifact from './assets/Work1.json'; -const work1Address = '0xa513E6E4b8f2a923D98304ec87F64353C4D5C853'; -const DAOAddress = '0x0165878A594ca255338adfa4d48449f69242Eb8F'; +const DAOAddress = '0x91ffddC013E2Df43E8FB177922d762bC8D776e79'; +const work1Address = '0x08673dE03e1e9b4c9A0aF99463fa4DEFD3891987'; function App() { const { @@ -20,28 +20,60 @@ function App() { const [balanceEther, setBalanceEther] = useState(); const [reputation, setReputation] = useState(); const [validationPoolCount, setValidationPoolCount] = useState(); + const [latestPoolIndex, setLatestPoolIndex] = useState(); + const [votePasses, setVotePasses] = useState(); + + const watchReputationNFT = useCallback(async (tokenId) => { + await provider.request({ + method: 'wallet_watchAsset', + params: { + type: 'ERC721', + options: { + address: DAOAddress, + tokenId: BigInt(tokenId).toString(), + }, + }, + }); + }, [provider]); useEffect(() => { if (!provider) return; const web3 = new Web3(provider); const work1Contract = new web3.eth.Contract(work1Artifact.abi, work1Address); const DAOContract = new web3.eth.Contract(DAOArtifact.abi, DAOAddress); - const getPrice = async () => { + + const fetchPrice = async () => { const priceWei = await work1Contract.methods.price().call(); setWork1Price(web3.utils.fromWei(priceWei, 'ether')); }; - const getReputation = async () => { + const fetchReputation = async () => { setReputation(await DAOContract.methods.valueOf(0).call()); }; - const getValidationPoolCount = async () => { + + const fetchValidationPoolCount = async () => { setValidationPoolCount(await DAOContract.methods.validationPoolCount().call()); }; - getPrice(); - getReputation(); - getValidationPoolCount(); + + fetchPrice(); + fetchReputation(); + fetchValidationPoolCount(); setWork1(work1Contract); setDAO(DAOContract); - }, [provider]); + + DAOContract.events.ValidationPoolInitiated({ fromBlock: 'latest' }).on('data', (event) => { + console.log('event: validation pool initiated', event); + setLatestPoolIndex(event.returnValues.poolIndex); + fetchValidationPoolCount(); + }); + + DAOContract.events.ValidationPoolResolved({ fromBlock: 'latest' }).on('data', (event) => { + console.log('event: validation pool resolved', event); + setVotePasses(event.returnValues.votePasses); + if (event.returnValues.votePasses) { + watchReputationNFT(event.returnValues.newTokenId); + } + }); + }, [provider, watchReputationNFT]); useEffect(() => { if (provider && balance) { @@ -67,8 +99,6 @@ function App() { }; const initiateValidationPool = async () => { - const subscription = await DAO.events.ValidationPoolInitiated({ fromBlock: 'latest' }); - subscription.once('data', (event) => console.log('event: validation pool initiated', event)); const poolDuration = 0; await DAO.methods.initiateValidationPool(account, poolDuration).send({ from: account, @@ -78,7 +108,7 @@ function App() { }; const evaluateOutcome = async () => { - await DAO.methods.evaluateOutcome(0).send({ + await DAO.methods.evaluateOutcome(latestPoolIndex).send({ from: account, gas: 1000000, }); @@ -86,15 +116,15 @@ function App() { // const stakeAvailability = async () => { } - const requestWork = async () => { - work1.events.WorkAssigned(() => { - console.log('event callback'); - }); - await work1.methods.requestWork().send({ - from: account, - gas: 1000000, - }); - }; + // const requestWork = async () => { + // work1.events.WorkAssigned(() => { + // console.log('event callback'); + // }); + // await work1.methods.requestWork().send({ + // from: account, + // gas: 1000000, + // }); + // }; return ( <> @@ -126,11 +156,14 @@ function App() {
+
+ {`Outcome: ${votePasses}`} +
{`Work1 Price: ${work1Price} ETH`}
- + { /* */ }
)} diff --git a/client/src/assets/DAO.json b/client/src/assets/DAO.json index d713270..b71e23f 100644 --- a/client/src/assets/DAO.json +++ b/client/src/assets/DAO.json @@ -194,6 +194,25 @@ "name": "ValidationPoolInitiated", "type": "event" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bool", + "name": "votePasses", + "type": "bool" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newTokenId", + "type": "uint256" + } + ], + "name": "ValidationPoolResolved", + "type": "event" + }, { "inputs": [ { @@ -655,8 +674,8 @@ "type": "function" } ], - "bytecode": "0x60806040523480156200001157600080fd5b506040518060400160405280600a81526020017f52657075746174696f6e000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f524550000000000000000000000000000000000000000000000000000000000081525081600090816200008f919062000324565b508060019081620000a1919062000324565b5050506200040b565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200012c57607f821691505b602082108103620001425762000141620000e4565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620001ac7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200016d565b620001b886836200016d565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000205620001ff620001f984620001d0565b620001da565b620001d0565b9050919050565b6000819050919050565b6200022183620001e4565b6200023962000230826200020c565b8484546200017a565b825550505050565b600090565b6200025062000241565b6200025d81848462000216565b505050565b5b8181101562000285576200027960008262000246565b60018101905062000263565b5050565b601f821115620002d4576200029e8162000148565b620002a9846200015d565b81016020851015620002b9578190505b620002d1620002c8856200015d565b83018262000262565b50505b505050565b600082821c905092915050565b6000620002f960001984600802620002d9565b1980831691505092915050565b6000620003148383620002e6565b9150826002028217905092915050565b6200032f82620000aa565b67ffffffffffffffff8111156200034b576200034a620000b5565b5b62000357825462000113565b6200036482828562000289565b600060209050601f8311600181146200039c576000841562000387578287015190505b62000393858262000306565b86555062000403565b601f198416620003ac8662000148565b60005b82811015620003d657848901518255600182019150602085019450602081019050620003af565b86831015620003f65784890151620003f2601f891682620002e6565b8355505b6001600288020188555050505b505050505050565b612d7f806200041b6000396000f3fe60806040526004361061012a5760003560e01c80636352211e116100ab578063a23362791161006f578063a23362791461042f578063b88d4fde14610474578063c87b56dd1461049d578063cadf338f146104da578063d4c3eea014610517578063e985e9c5146105425761012a565b80636352211e14610336578063642b5bfb1461037357806370a082311461039e57806395d89b41146103db578063a22cb465146104065761012a565b806317c18217116100f257806317c182171461023a57806323b872dd14610277578063249cfda9146102a057806342842e0e146102dd57806360780cd7146103065761012a565b806301ffc9a71461012f57806306fdde031461016c578063081812fc14610197578063095ea7b3146101d4578063150b7a02146101fd575b600080fd5b34801561013b57600080fd5b5061015660048036038101906101519190612256565b61057f565b604051610163919061229e565b60405180910390f35b34801561017857600080fd5b50610181610661565b60405161018e9190612349565b60405180910390f35b3480156101a357600080fd5b506101be60048036038101906101b991906123a1565b6106f3565b6040516101cb919061240f565b60405180910390f35b3480156101e057600080fd5b506101fb60048036038101906101f69190612456565b61070f565b005b34801561020957600080fd5b50610224600480360381019061021f91906124fb565b610725565b6040516102319190612592565b60405180910390f35b34801561024657600080fd5b50610261600480360381019061025c91906123a1565b610779565b60405161026e919061229e565b60405180910390f35b34801561028357600080fd5b5061029e600480360381019061029991906125ad565b610bba565b005b3480156102ac57600080fd5b506102c760048036038101906102c29190612456565b610cbc565b6040516102d4919061260f565b60405180910390f35b3480156102e957600080fd5b5061030460048036038101906102ff91906125ad565b610d0f565b005b610320600480360381019061031b9190612456565b610d2f565b60405161032d919061260f565b60405180910390f35b34801561034257600080fd5b5061035d600480360381019061035891906123a1565b610e64565b60405161036a919061240f565b60405180910390f35b34801561037f57600080fd5b50610388610e76565b604051610395919061260f565b60405180910390f35b3480156103aa57600080fd5b506103c560048036038101906103c0919061262a565b610e7c565b6040516103d2919061260f565b60405180910390f35b3480156103e757600080fd5b506103f0610f36565b6040516103fd9190612349565b60405180910390f35b34801561041257600080fd5b5061042d60048036038101906104289190612683565b610fc8565b005b34801561043b57600080fd5b50610456600480360381019061045191906123a1565b610fde565b60405161046b999897969594939291906126c3565b60405180910390f35b34801561048057600080fd5b5061049b60048036038101906104969190612880565b611066565b005b3480156104a957600080fd5b506104c460048036038101906104bf91906123a1565b611083565b6040516104d19190612349565b60405180910390f35b3480156104e657600080fd5b5061050160048036038101906104fc91906123a1565b6110ec565b60405161050e919061260f565b60405180910390f35b34801561052357600080fd5b5061052c611109565b604051610539919061260f565b60405180910390f35b34801561054e57600080fd5b5061056960048036038101906105649190612903565b61110f565b604051610576919061229e565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061064a57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061065a5750610659826111a3565b5b9050919050565b60606000805461067090612972565b80601f016020809104026020016040519081016040528092919081815260200182805461069c90612972565b80156106e95780601f106106be576101008083540402835291602001916106e9565b820191906000526020600020905b8154815290600101906020018083116106cc57829003601f168201915b5050505050905090565b60006106fe8261120d565b5061070882611295565b9050919050565b610721828261071c6112d2565b6112da565b5050565b600080838381019061073791906129f8565b905060006009600083600001518152602001908152602001600020905061076481888460200151896112ec565b63150b7a0260e01b9250505095945050505050565b60008060096000848152602001908152602001600020905080600501544210156107a257600080fd5b600015158160060160009054906101000a900460ff161515146107c457600080fd5b600080600080600090505b84600101548110156108405784600001600082815260200190815260200160002091508160000160009054906101000a900460ff1615610820578160010154846108199190612a54565b9350610833565b8160010154836108309190612a54565b92505b80806001019150506107cf565b5081831015945060018460060160006101000a81548160ff02191690831515021790555060008060005b86600101548110156109cf5786600001600082815260200190815260200160002093508780156108a957508360000160009054906101000a900460ff16155b156108dc578360010154826108be9190612a54565b91506108d78460030154886007015486600101546113ae565b6109c2565b871580156108f857508360000160009054906101000a900460ff165b1561092b5783600101548261090d9190612a54565b91506109268460030154886008015486600101546113ae565b6109c1565b87801561094657508360000160009054906101000a900460ff165b801561095a57508660070154846003015414155b156109765783600101548361096f9190612a54565b92506109c0565b8715801561099357508360000160009054906101000a900460ff16155b80156109a757508660080154846003015414155b156109bf578360010154836109bc9190612a54565b92505b5b5b5b808060010191505061086a565b5060005b8660010154811015610ada578660000160008281526020019081526020016000209350878015610a1157508360000160009054906101000a900460ff165b8015610a2557508660070154846003015414155b15610a6257600083856001015484610a3d9190612a88565b610a479190612af9565b9050610a5c88600801548660030154836113ae565b50610acd565b87158015610a7f57508360000160009054906101000a900460ff16155b8015610a9357508660080154846003015414155b15610acc57600083856001015484610aab9190612a88565b610ab59190612af9565b9050610aca88600701548660030154836113ae565b505b5b80806001019150506109d3565b508615610b1557610b14308760020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16886007015461142a565b5b60005b600754811015610bae576000600854610b30836110ec565b8960030154610b3f9190612a88565b610b499190612af9565b90506000610b5683610e64565b90508073ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015610b9e573d6000803e3d6000fd5b5050508080600101915050610b18565b50505050505050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610c2c5760006040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401610c23919061240f565b60405180910390fd5b6000610c408383610c3b6112d2565b611597565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610cb6578382826040517f64283d7b000000000000000000000000000000000000000000000000000000008152600401610cad93929190612b2a565b60405180910390fd5b50505050565b60008273ffffffffffffffffffffffffffffffffffffffff16610cde83610e64565b73ffffffffffffffffffffffffffffffffffffffff1614610cfe57600080fd5b610d07826110ec565b905092915050565b610d2a83838360405180602001604052806000815250611066565b505050565b6000600a6000815480929190610d4490612b61565b9190505590506000600960008381526020019081526020016000209050838160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503481600301819055508281600401819055508242610dc29190612a54565b8160050181905550610ddf600234610dda9190612af9565b6117b1565b8160070181905550610dfc600234610df79190612af9565b6117b1565b8160080181905550610e158130600184600701546112ec565b610e268130600084600801546112ec565b7f6e5c598b821d7fa8550e5fea58ab6e27c59e1cbe1df75a8591aa0c453b49e10a82604051610e55919061260f565b60405180910390a15092915050565b6000610e6f8261120d565b9050919050565b600a5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610eef5760006040517f89c62b64000000000000000000000000000000000000000000000000000000008152600401610ee6919061240f565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b606060018054610f4590612972565b80601f0160208091040260200160405190810160405280929190818152602001828054610f7190612972565b8015610fbe5780601f10610f9357610100808354040283529160200191610fbe565b820191906000526020600020905b815481529060010190602001808311610fa157829003601f168201915b5050505050905090565b610fda610fd36112d2565b838361180c565b5050565b60096020528060005260406000206000915090508060010154908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060030154908060040154908060050154908060060160009054906101000a900460ff16908060060160019054906101000a900460ff16908060070154908060080154905089565b611071848484610bba565b61107d8484848461197b565b50505050565b606061108e8261120d565b506000611099611b32565b905060008151116110b957604051806020016040528060008152506110e4565b806110c384611b49565b6040516020016110d4929190612be5565b6040516020818303038152906040525b915050919050565b600060066000838152602001908152602001600020549050919050565b60085481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008061121983611c17565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361128c57826040517f7e273289000000000000000000000000000000000000000000000000000000008152600401611283919061260f565b60405180910390fd5b80915050919050565b60006004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600033905090565b6112e78383836001611c54565b505050565b836005015442106112fc57600080fd5b600084600001600086600101600081548092919061131990612b61565b9190505581526020019081526020016000209050838160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828160000160006101000a81548160ff0219169083151502179055506113968483610cbc565b81600101819055508181600301819055505050505050565b60008110156113bc57600080fd5b806113c6846110ec565b10156113d157600080fd5b806006600085815260200190815260200160002060008282546113f49190612c09565b925050819055508060066000848152602001908152602001600020600082825461141e9190612a54565b92505081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361149c5760006040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401611493919061240f565b60405180910390fd5b60006114aa83836000611597565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361151d57816040517f7e273289000000000000000000000000000000000000000000000000000000008152600401611514919061260f565b60405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611591578382826040517f64283d7b00000000000000000000000000000000000000000000000000000000815260040161158893929190612b2a565b60405180910390fd5b50505050565b6000806115a384611c17565b9050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146115e5576115e4818486611e19565b5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461167657611627600085600080611c54565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16146116f9576001600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505b846002600086815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550838573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4809150509392505050565b6000600760008154809291906117c690612b61565b9190505590506117d63082611edd565b81600660008381526020019081526020016000208190555081600860008282546118009190612a54565b92505081905550919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361187d57816040517f5b08ba18000000000000000000000000000000000000000000000000000000008152600401611874919061240f565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161196e919061229e565b60405180910390a3505050565b60008373ffffffffffffffffffffffffffffffffffffffff163b1115611b2c578273ffffffffffffffffffffffffffffffffffffffff1663150b7a026119bf6112d2565b8685856040518563ffffffff1660e01b81526004016119e19493929190612c92565b6020604051808303816000875af1925050508015611a1d57506040513d601f19601f82011682018060405250810190611a1a9190612cf3565b60015b611aa1573d8060008114611a4d576040519150601f19603f3d011682016040523d82523d6000602084013e611a52565b606091505b506000815103611a9957836040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401611a90919061240f565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614611b2a57836040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401611b21919061240f565b60405180910390fd5b505b50505050565b606060405180602001604052806000815250905090565b606060006001611b5884611fd6565b01905060008167ffffffffffffffff811115611b7757611b76612755565b5b6040519080825280601f01601f191660200182016040528015611ba95781602001600182028036833780820191505090505b509050600082602001820190505b600115611c0c578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581611c0057611bff612aca565b5b04945060008503611bb7575b819350505050919050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b8080611c8d5750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b15611dc1576000611c9d8461120d565b9050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015611d0857508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b8015611d1b5750611d19818461110f565b155b15611d5d57826040517fa9fbf51f000000000000000000000000000000000000000000000000000000008152600401611d54919061240f565b60405180910390fd5b8115611dbf57838573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b836004600085815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050565b611e24838383612129565b611ed857600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611e9957806040517f7e273289000000000000000000000000000000000000000000000000000000008152600401611e90919061260f565b60405180910390fd5b81816040517f177e802f000000000000000000000000000000000000000000000000000000008152600401611ecf929190612d20565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611f4f5760006040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401611f46919061240f565b60405180910390fd5b6000611f5d83836000611597565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611fd15760006040517f73c6ac6e000000000000000000000000000000000000000000000000000000008152600401611fc8919061240f565b60405180910390fd5b505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612034577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161202a57612029612aca565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612071576d04ee2d6d415b85acef8100000000838161206757612066612aca565b5b0492506020810190505b662386f26fc1000083106120a057662386f26fc10000838161209657612095612aca565b5b0492506010810190505b6305f5e10083106120c9576305f5e10083816120bf576120be612aca565b5b0492506008810190505b61271083106120ee5761271083816120e4576120e3612aca565b5b0492506004810190505b60648310612111576064838161210757612106612aca565b5b0492506002810190505b600a8310612120576001810190505b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156121e157508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806121a257506121a1848461110f565b5b806121e057508273ffffffffffffffffffffffffffffffffffffffff166121c883611295565b73ffffffffffffffffffffffffffffffffffffffff16145b5b90509392505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612233816121fe565b811461223e57600080fd5b50565b6000813590506122508161222a565b92915050565b60006020828403121561226c5761226b6121f4565b5b600061227a84828501612241565b91505092915050565b60008115159050919050565b61229881612283565b82525050565b60006020820190506122b3600083018461228f565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156122f35780820151818401526020810190506122d8565b60008484015250505050565b6000601f19601f8301169050919050565b600061231b826122b9565b61232581856122c4565b93506123358185602086016122d5565b61233e816122ff565b840191505092915050565b600060208201905081810360008301526123638184612310565b905092915050565b6000819050919050565b61237e8161236b565b811461238957600080fd5b50565b60008135905061239b81612375565b92915050565b6000602082840312156123b7576123b66121f4565b5b60006123c58482850161238c565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006123f9826123ce565b9050919050565b612409816123ee565b82525050565b60006020820190506124246000830184612400565b92915050565b612433816123ee565b811461243e57600080fd5b50565b6000813590506124508161242a565b92915050565b6000806040838503121561246d5761246c6121f4565b5b600061247b85828601612441565b925050602061248c8582860161238c565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f8401126124bb576124ba612496565b5b8235905067ffffffffffffffff8111156124d8576124d761249b565b5b6020830191508360018202830111156124f4576124f36124a0565b5b9250929050565b600080600080600060808688031215612517576125166121f4565b5b600061252588828901612441565b955050602061253688828901612441565b94505060406125478882890161238c565b935050606086013567ffffffffffffffff811115612568576125676121f9565b5b612574888289016124a5565b92509250509295509295909350565b61258c816121fe565b82525050565b60006020820190506125a76000830184612583565b92915050565b6000806000606084860312156125c6576125c56121f4565b5b60006125d486828701612441565b93505060206125e586828701612441565b92505060406125f68682870161238c565b9150509250925092565b6126098161236b565b82525050565b60006020820190506126246000830184612600565b92915050565b6000602082840312156126405761263f6121f4565b5b600061264e84828501612441565b91505092915050565b61266081612283565b811461266b57600080fd5b50565b60008135905061267d81612657565b92915050565b6000806040838503121561269a576126996121f4565b5b60006126a885828601612441565b92505060206126b98582860161266e565b9150509250929050565b6000610120820190506126d9600083018c612600565b6126e6602083018b612400565b6126f3604083018a612600565b6127006060830189612600565b61270d6080830188612600565b61271a60a083018761228f565b61272760c083018661228f565b61273460e0830185612600565b612742610100830184612600565b9a9950505050505050505050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61278d826122ff565b810181811067ffffffffffffffff821117156127ac576127ab612755565b5b80604052505050565b60006127bf6121ea565b90506127cb8282612784565b919050565b600067ffffffffffffffff8211156127eb576127ea612755565b5b6127f4826122ff565b9050602081019050919050565b82818337600083830152505050565b600061282361281e846127d0565b6127b5565b90508281526020810184848401111561283f5761283e612750565b5b61284a848285612801565b509392505050565b600082601f83011261286757612866612496565b5b8135612877848260208601612810565b91505092915050565b6000806000806080858703121561289a576128996121f4565b5b60006128a887828801612441565b94505060206128b987828801612441565b93505060406128ca8782880161238c565b925050606085013567ffffffffffffffff8111156128eb576128ea6121f9565b5b6128f787828801612852565b91505092959194509250565b6000806040838503121561291a576129196121f4565b5b600061292885828601612441565b925050602061293985828601612441565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061298a57607f821691505b60208210810361299d5761299c612943565b5b50919050565b600080fd5b6000604082840312156129be576129bd6129a3565b5b6129c860406127b5565b905060006129d88482850161238c565b60008301525060206129ec8482850161266e565b60208301525092915050565b600060408284031215612a0e57612a0d6121f4565b5b6000612a1c848285016129a8565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612a5f8261236b565b9150612a6a8361236b565b9250828201905080821115612a8257612a81612a25565b5b92915050565b6000612a938261236b565b9150612a9e8361236b565b9250828202612aac8161236b565b91508282048414831517612ac357612ac2612a25565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612b048261236b565b9150612b0f8361236b565b925082612b1f57612b1e612aca565b5b828204905092915050565b6000606082019050612b3f6000830186612400565b612b4c6020830185612600565b612b596040830184612400565b949350505050565b6000612b6c8261236b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612b9e57612b9d612a25565b5b600182019050919050565b600081905092915050565b6000612bbf826122b9565b612bc98185612ba9565b9350612bd98185602086016122d5565b80840191505092915050565b6000612bf18285612bb4565b9150612bfd8284612bb4565b91508190509392505050565b6000612c148261236b565b9150612c1f8361236b565b9250828203905081811115612c3757612c36612a25565b5b92915050565b600081519050919050565b600082825260208201905092915050565b6000612c6482612c3d565b612c6e8185612c48565b9350612c7e8185602086016122d5565b612c87816122ff565b840191505092915050565b6000608082019050612ca76000830187612400565b612cb46020830186612400565b612cc16040830185612600565b8181036060830152612cd38184612c59565b905095945050505050565b600081519050612ced8161222a565b92915050565b600060208284031215612d0957612d086121f4565b5b6000612d1784828501612cde565b91505092915050565b6000604082019050612d356000830185612400565b612d426020830184612600565b939250505056fea26469706673582212201b4d636ba72132289de0ce7b33bfd73d6f66c3f6bbde04781d236284346637c264736f6c63430008180033", - "deployedBytecode": "0x60806040526004361061012a5760003560e01c80636352211e116100ab578063a23362791161006f578063a23362791461042f578063b88d4fde14610474578063c87b56dd1461049d578063cadf338f146104da578063d4c3eea014610517578063e985e9c5146105425761012a565b80636352211e14610336578063642b5bfb1461037357806370a082311461039e57806395d89b41146103db578063a22cb465146104065761012a565b806317c18217116100f257806317c182171461023a57806323b872dd14610277578063249cfda9146102a057806342842e0e146102dd57806360780cd7146103065761012a565b806301ffc9a71461012f57806306fdde031461016c578063081812fc14610197578063095ea7b3146101d4578063150b7a02146101fd575b600080fd5b34801561013b57600080fd5b5061015660048036038101906101519190612256565b61057f565b604051610163919061229e565b60405180910390f35b34801561017857600080fd5b50610181610661565b60405161018e9190612349565b60405180910390f35b3480156101a357600080fd5b506101be60048036038101906101b991906123a1565b6106f3565b6040516101cb919061240f565b60405180910390f35b3480156101e057600080fd5b506101fb60048036038101906101f69190612456565b61070f565b005b34801561020957600080fd5b50610224600480360381019061021f91906124fb565b610725565b6040516102319190612592565b60405180910390f35b34801561024657600080fd5b50610261600480360381019061025c91906123a1565b610779565b60405161026e919061229e565b60405180910390f35b34801561028357600080fd5b5061029e600480360381019061029991906125ad565b610bba565b005b3480156102ac57600080fd5b506102c760048036038101906102c29190612456565b610cbc565b6040516102d4919061260f565b60405180910390f35b3480156102e957600080fd5b5061030460048036038101906102ff91906125ad565b610d0f565b005b610320600480360381019061031b9190612456565b610d2f565b60405161032d919061260f565b60405180910390f35b34801561034257600080fd5b5061035d600480360381019061035891906123a1565b610e64565b60405161036a919061240f565b60405180910390f35b34801561037f57600080fd5b50610388610e76565b604051610395919061260f565b60405180910390f35b3480156103aa57600080fd5b506103c560048036038101906103c0919061262a565b610e7c565b6040516103d2919061260f565b60405180910390f35b3480156103e757600080fd5b506103f0610f36565b6040516103fd9190612349565b60405180910390f35b34801561041257600080fd5b5061042d60048036038101906104289190612683565b610fc8565b005b34801561043b57600080fd5b50610456600480360381019061045191906123a1565b610fde565b60405161046b999897969594939291906126c3565b60405180910390f35b34801561048057600080fd5b5061049b60048036038101906104969190612880565b611066565b005b3480156104a957600080fd5b506104c460048036038101906104bf91906123a1565b611083565b6040516104d19190612349565b60405180910390f35b3480156104e657600080fd5b5061050160048036038101906104fc91906123a1565b6110ec565b60405161050e919061260f565b60405180910390f35b34801561052357600080fd5b5061052c611109565b604051610539919061260f565b60405180910390f35b34801561054e57600080fd5b5061056960048036038101906105649190612903565b61110f565b604051610576919061229e565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061064a57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061065a5750610659826111a3565b5b9050919050565b60606000805461067090612972565b80601f016020809104026020016040519081016040528092919081815260200182805461069c90612972565b80156106e95780601f106106be576101008083540402835291602001916106e9565b820191906000526020600020905b8154815290600101906020018083116106cc57829003601f168201915b5050505050905090565b60006106fe8261120d565b5061070882611295565b9050919050565b610721828261071c6112d2565b6112da565b5050565b600080838381019061073791906129f8565b905060006009600083600001518152602001908152602001600020905061076481888460200151896112ec565b63150b7a0260e01b9250505095945050505050565b60008060096000848152602001908152602001600020905080600501544210156107a257600080fd5b600015158160060160009054906101000a900460ff161515146107c457600080fd5b600080600080600090505b84600101548110156108405784600001600082815260200190815260200160002091508160000160009054906101000a900460ff1615610820578160010154846108199190612a54565b9350610833565b8160010154836108309190612a54565b92505b80806001019150506107cf565b5081831015945060018460060160006101000a81548160ff02191690831515021790555060008060005b86600101548110156109cf5786600001600082815260200190815260200160002093508780156108a957508360000160009054906101000a900460ff16155b156108dc578360010154826108be9190612a54565b91506108d78460030154886007015486600101546113ae565b6109c2565b871580156108f857508360000160009054906101000a900460ff165b1561092b5783600101548261090d9190612a54565b91506109268460030154886008015486600101546113ae565b6109c1565b87801561094657508360000160009054906101000a900460ff165b801561095a57508660070154846003015414155b156109765783600101548361096f9190612a54565b92506109c0565b8715801561099357508360000160009054906101000a900460ff16155b80156109a757508660080154846003015414155b156109bf578360010154836109bc9190612a54565b92505b5b5b5b808060010191505061086a565b5060005b8660010154811015610ada578660000160008281526020019081526020016000209350878015610a1157508360000160009054906101000a900460ff165b8015610a2557508660070154846003015414155b15610a6257600083856001015484610a3d9190612a88565b610a479190612af9565b9050610a5c88600801548660030154836113ae565b50610acd565b87158015610a7f57508360000160009054906101000a900460ff16155b8015610a9357508660080154846003015414155b15610acc57600083856001015484610aab9190612a88565b610ab59190612af9565b9050610aca88600701548660030154836113ae565b505b5b80806001019150506109d3565b508615610b1557610b14308760020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16886007015461142a565b5b60005b600754811015610bae576000600854610b30836110ec565b8960030154610b3f9190612a88565b610b499190612af9565b90506000610b5683610e64565b90508073ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015610b9e573d6000803e3d6000fd5b5050508080600101915050610b18565b50505050505050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610c2c5760006040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401610c23919061240f565b60405180910390fd5b6000610c408383610c3b6112d2565b611597565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610cb6578382826040517f64283d7b000000000000000000000000000000000000000000000000000000008152600401610cad93929190612b2a565b60405180910390fd5b50505050565b60008273ffffffffffffffffffffffffffffffffffffffff16610cde83610e64565b73ffffffffffffffffffffffffffffffffffffffff1614610cfe57600080fd5b610d07826110ec565b905092915050565b610d2a83838360405180602001604052806000815250611066565b505050565b6000600a6000815480929190610d4490612b61565b9190505590506000600960008381526020019081526020016000209050838160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503481600301819055508281600401819055508242610dc29190612a54565b8160050181905550610ddf600234610dda9190612af9565b6117b1565b8160070181905550610dfc600234610df79190612af9565b6117b1565b8160080181905550610e158130600184600701546112ec565b610e268130600084600801546112ec565b7f6e5c598b821d7fa8550e5fea58ab6e27c59e1cbe1df75a8591aa0c453b49e10a82604051610e55919061260f565b60405180910390a15092915050565b6000610e6f8261120d565b9050919050565b600a5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610eef5760006040517f89c62b64000000000000000000000000000000000000000000000000000000008152600401610ee6919061240f565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b606060018054610f4590612972565b80601f0160208091040260200160405190810160405280929190818152602001828054610f7190612972565b8015610fbe5780601f10610f9357610100808354040283529160200191610fbe565b820191906000526020600020905b815481529060010190602001808311610fa157829003601f168201915b5050505050905090565b610fda610fd36112d2565b838361180c565b5050565b60096020528060005260406000206000915090508060010154908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060030154908060040154908060050154908060060160009054906101000a900460ff16908060060160019054906101000a900460ff16908060070154908060080154905089565b611071848484610bba565b61107d8484848461197b565b50505050565b606061108e8261120d565b506000611099611b32565b905060008151116110b957604051806020016040528060008152506110e4565b806110c384611b49565b6040516020016110d4929190612be5565b6040516020818303038152906040525b915050919050565b600060066000838152602001908152602001600020549050919050565b60085481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008061121983611c17565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361128c57826040517f7e273289000000000000000000000000000000000000000000000000000000008152600401611283919061260f565b60405180910390fd5b80915050919050565b60006004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600033905090565b6112e78383836001611c54565b505050565b836005015442106112fc57600080fd5b600084600001600086600101600081548092919061131990612b61565b9190505581526020019081526020016000209050838160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828160000160006101000a81548160ff0219169083151502179055506113968483610cbc565b81600101819055508181600301819055505050505050565b60008110156113bc57600080fd5b806113c6846110ec565b10156113d157600080fd5b806006600085815260200190815260200160002060008282546113f49190612c09565b925050819055508060066000848152602001908152602001600020600082825461141e9190612a54565b92505081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361149c5760006040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401611493919061240f565b60405180910390fd5b60006114aa83836000611597565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361151d57816040517f7e273289000000000000000000000000000000000000000000000000000000008152600401611514919061260f565b60405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611591578382826040517f64283d7b00000000000000000000000000000000000000000000000000000000815260040161158893929190612b2a565b60405180910390fd5b50505050565b6000806115a384611c17565b9050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146115e5576115e4818486611e19565b5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461167657611627600085600080611c54565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16146116f9576001600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505b846002600086815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550838573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4809150509392505050565b6000600760008154809291906117c690612b61565b9190505590506117d63082611edd565b81600660008381526020019081526020016000208190555081600860008282546118009190612a54565b92505081905550919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361187d57816040517f5b08ba18000000000000000000000000000000000000000000000000000000008152600401611874919061240f565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161196e919061229e565b60405180910390a3505050565b60008373ffffffffffffffffffffffffffffffffffffffff163b1115611b2c578273ffffffffffffffffffffffffffffffffffffffff1663150b7a026119bf6112d2565b8685856040518563ffffffff1660e01b81526004016119e19493929190612c92565b6020604051808303816000875af1925050508015611a1d57506040513d601f19601f82011682018060405250810190611a1a9190612cf3565b60015b611aa1573d8060008114611a4d576040519150601f19603f3d011682016040523d82523d6000602084013e611a52565b606091505b506000815103611a9957836040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401611a90919061240f565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614611b2a57836040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401611b21919061240f565b60405180910390fd5b505b50505050565b606060405180602001604052806000815250905090565b606060006001611b5884611fd6565b01905060008167ffffffffffffffff811115611b7757611b76612755565b5b6040519080825280601f01601f191660200182016040528015611ba95781602001600182028036833780820191505090505b509050600082602001820190505b600115611c0c578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581611c0057611bff612aca565b5b04945060008503611bb7575b819350505050919050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b8080611c8d5750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b15611dc1576000611c9d8461120d565b9050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015611d0857508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b8015611d1b5750611d19818461110f565b155b15611d5d57826040517fa9fbf51f000000000000000000000000000000000000000000000000000000008152600401611d54919061240f565b60405180910390fd5b8115611dbf57838573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b836004600085815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050565b611e24838383612129565b611ed857600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611e9957806040517f7e273289000000000000000000000000000000000000000000000000000000008152600401611e90919061260f565b60405180910390fd5b81816040517f177e802f000000000000000000000000000000000000000000000000000000008152600401611ecf929190612d20565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611f4f5760006040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401611f46919061240f565b60405180910390fd5b6000611f5d83836000611597565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611fd15760006040517f73c6ac6e000000000000000000000000000000000000000000000000000000008152600401611fc8919061240f565b60405180910390fd5b505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612034577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161202a57612029612aca565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612071576d04ee2d6d415b85acef8100000000838161206757612066612aca565b5b0492506020810190505b662386f26fc1000083106120a057662386f26fc10000838161209657612095612aca565b5b0492506010810190505b6305f5e10083106120c9576305f5e10083816120bf576120be612aca565b5b0492506008810190505b61271083106120ee5761271083816120e4576120e3612aca565b5b0492506004810190505b60648310612111576064838161210757612106612aca565b5b0492506002810190505b600a8310612120576001810190505b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156121e157508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806121a257506121a1848461110f565b5b806121e057508273ffffffffffffffffffffffffffffffffffffffff166121c883611295565b73ffffffffffffffffffffffffffffffffffffffff16145b5b90509392505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612233816121fe565b811461223e57600080fd5b50565b6000813590506122508161222a565b92915050565b60006020828403121561226c5761226b6121f4565b5b600061227a84828501612241565b91505092915050565b60008115159050919050565b61229881612283565b82525050565b60006020820190506122b3600083018461228f565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156122f35780820151818401526020810190506122d8565b60008484015250505050565b6000601f19601f8301169050919050565b600061231b826122b9565b61232581856122c4565b93506123358185602086016122d5565b61233e816122ff565b840191505092915050565b600060208201905081810360008301526123638184612310565b905092915050565b6000819050919050565b61237e8161236b565b811461238957600080fd5b50565b60008135905061239b81612375565b92915050565b6000602082840312156123b7576123b66121f4565b5b60006123c58482850161238c565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006123f9826123ce565b9050919050565b612409816123ee565b82525050565b60006020820190506124246000830184612400565b92915050565b612433816123ee565b811461243e57600080fd5b50565b6000813590506124508161242a565b92915050565b6000806040838503121561246d5761246c6121f4565b5b600061247b85828601612441565b925050602061248c8582860161238c565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f8401126124bb576124ba612496565b5b8235905067ffffffffffffffff8111156124d8576124d761249b565b5b6020830191508360018202830111156124f4576124f36124a0565b5b9250929050565b600080600080600060808688031215612517576125166121f4565b5b600061252588828901612441565b955050602061253688828901612441565b94505060406125478882890161238c565b935050606086013567ffffffffffffffff811115612568576125676121f9565b5b612574888289016124a5565b92509250509295509295909350565b61258c816121fe565b82525050565b60006020820190506125a76000830184612583565b92915050565b6000806000606084860312156125c6576125c56121f4565b5b60006125d486828701612441565b93505060206125e586828701612441565b92505060406125f68682870161238c565b9150509250925092565b6126098161236b565b82525050565b60006020820190506126246000830184612600565b92915050565b6000602082840312156126405761263f6121f4565b5b600061264e84828501612441565b91505092915050565b61266081612283565b811461266b57600080fd5b50565b60008135905061267d81612657565b92915050565b6000806040838503121561269a576126996121f4565b5b60006126a885828601612441565b92505060206126b98582860161266e565b9150509250929050565b6000610120820190506126d9600083018c612600565b6126e6602083018b612400565b6126f3604083018a612600565b6127006060830189612600565b61270d6080830188612600565b61271a60a083018761228f565b61272760c083018661228f565b61273460e0830185612600565b612742610100830184612600565b9a9950505050505050505050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61278d826122ff565b810181811067ffffffffffffffff821117156127ac576127ab612755565b5b80604052505050565b60006127bf6121ea565b90506127cb8282612784565b919050565b600067ffffffffffffffff8211156127eb576127ea612755565b5b6127f4826122ff565b9050602081019050919050565b82818337600083830152505050565b600061282361281e846127d0565b6127b5565b90508281526020810184848401111561283f5761283e612750565b5b61284a848285612801565b509392505050565b600082601f83011261286757612866612496565b5b8135612877848260208601612810565b91505092915050565b6000806000806080858703121561289a576128996121f4565b5b60006128a887828801612441565b94505060206128b987828801612441565b93505060406128ca8782880161238c565b925050606085013567ffffffffffffffff8111156128eb576128ea6121f9565b5b6128f787828801612852565b91505092959194509250565b6000806040838503121561291a576129196121f4565b5b600061292885828601612441565b925050602061293985828601612441565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061298a57607f821691505b60208210810361299d5761299c612943565b5b50919050565b600080fd5b6000604082840312156129be576129bd6129a3565b5b6129c860406127b5565b905060006129d88482850161238c565b60008301525060206129ec8482850161266e565b60208301525092915050565b600060408284031215612a0e57612a0d6121f4565b5b6000612a1c848285016129a8565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612a5f8261236b565b9150612a6a8361236b565b9250828201905080821115612a8257612a81612a25565b5b92915050565b6000612a938261236b565b9150612a9e8361236b565b9250828202612aac8161236b565b91508282048414831517612ac357612ac2612a25565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612b048261236b565b9150612b0f8361236b565b925082612b1f57612b1e612aca565b5b828204905092915050565b6000606082019050612b3f6000830186612400565b612b4c6020830185612600565b612b596040830184612400565b949350505050565b6000612b6c8261236b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612b9e57612b9d612a25565b5b600182019050919050565b600081905092915050565b6000612bbf826122b9565b612bc98185612ba9565b9350612bd98185602086016122d5565b80840191505092915050565b6000612bf18285612bb4565b9150612bfd8284612bb4565b91508190509392505050565b6000612c148261236b565b9150612c1f8361236b565b9250828203905081811115612c3757612c36612a25565b5b92915050565b600081519050919050565b600082825260208201905092915050565b6000612c6482612c3d565b612c6e8185612c48565b9350612c7e8185602086016122d5565b612c87816122ff565b840191505092915050565b6000608082019050612ca76000830187612400565b612cb46020830186612400565b612cc16040830185612600565b8181036060830152612cd38184612c59565b905095945050505050565b600081519050612ced8161222a565b92915050565b600060208284031215612d0957612d086121f4565b5b6000612d1784828501612cde565b91505092915050565b6000604082019050612d356000830185612400565b612d426020830184612600565b939250505056fea26469706673582212201b4d636ba72132289de0ce7b33bfd73d6f66c3f6bbde04781d236284346637c264736f6c63430008180033", + "bytecode": "0x60806040523480156200001157600080fd5b506040518060400160405280600a81526020017f52657075746174696f6e000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f524550000000000000000000000000000000000000000000000000000000000081525081600090816200008f919062000324565b508060019081620000a1919062000324565b5050506200040b565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200012c57607f821691505b602082108103620001425762000141620000e4565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620001ac7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200016d565b620001b886836200016d565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000205620001ff620001f984620001d0565b620001da565b620001d0565b9050919050565b6000819050919050565b6200022183620001e4565b6200023962000230826200020c565b8484546200017a565b825550505050565b600090565b6200025062000241565b6200025d81848462000216565b505050565b5b8181101562000285576200027960008262000246565b60018101905062000263565b5050565b601f821115620002d4576200029e8162000148565b620002a9846200015d565b81016020851015620002b9578190505b620002d1620002c8856200015d565b83018262000262565b50505b505050565b600082821c905092915050565b6000620002f960001984600802620002d9565b1980831691505092915050565b6000620003148383620002e6565b9150826002028217905092915050565b6200032f82620000aa565b67ffffffffffffffff8111156200034b576200034a620000b5565b5b62000357825462000113565b6200036482828562000289565b600060209050601f8311600181146200039c576000841562000387578287015190505b62000393858262000306565b86555062000403565b601f198416620003ac8662000148565b60005b82811015620003d657848901518255600182019150602085019450602081019050620003af565b86831015620003f65784890151620003f2601f891682620002e6565b8355505b6001600288020188555050505b505050505050565b613331806200041b6000396000f3fe60806040526004361061012a5760003560e01c80636352211e116100ab578063a23362791161006f578063a23362791461042f578063b88d4fde14610474578063c87b56dd1461049d578063cadf338f146104da578063d4c3eea014610517578063e985e9c5146105425761012a565b80636352211e14610336578063642b5bfb1461037357806370a082311461039e57806395d89b41146103db578063a22cb465146104065761012a565b806317c18217116100f257806317c182171461023a57806323b872dd14610277578063249cfda9146102a057806342842e0e146102dd57806360780cd7146103065761012a565b806301ffc9a71461012f57806306fdde031461016c578063081812fc14610197578063095ea7b3146101d4578063150b7a02146101fd575b600080fd5b34801561013b57600080fd5b5061015660048036038101906101519190612453565b61057f565b604051610163919061249b565b60405180910390f35b34801561017857600080fd5b50610181610661565b60405161018e9190612546565b60405180910390f35b3480156101a357600080fd5b506101be60048036038101906101b9919061259e565b6106f3565b6040516101cb919061260c565b60405180910390f35b3480156101e057600080fd5b506101fb60048036038101906101f69190612653565b61070f565b005b34801561020957600080fd5b50610224600480360381019061021f91906126f8565b610725565b604051610231919061278f565b60405180910390f35b34801561024657600080fd5b50610261600480360381019061025c919061259e565b610779565b60405161026e919061249b565b60405180910390f35b34801561028357600080fd5b5061029e600480360381019061029991906127aa565b610c9c565b005b3480156102ac57600080fd5b506102c760048036038101906102c29190612653565b610d9e565b6040516102d4919061280c565b60405180910390f35b3480156102e957600080fd5b5061030460048036038101906102ff91906127aa565b610e27565b005b610320600480360381019061031b9190612653565b610e47565b60405161032d919061280c565b60405180910390f35b34801561034257600080fd5b5061035d6004803603810190610358919061259e565b610fbe565b60405161036a919061260c565b60405180910390f35b34801561037f57600080fd5b50610388610fd0565b604051610395919061280c565b60405180910390f35b3480156103aa57600080fd5b506103c560048036038101906103c09190612827565b610fd6565b6040516103d2919061280c565b60405180910390f35b3480156103e757600080fd5b506103f0611090565b6040516103fd9190612546565b60405180910390f35b34801561041257600080fd5b5061042d60048036038101906104289190612880565b611122565b005b34801561043b57600080fd5b506104566004803603810190610451919061259e565b611138565b60405161046b999897969594939291906128c0565b60405180910390f35b34801561048057600080fd5b5061049b60048036038101906104969190612a7d565b6111c0565b005b3480156104a957600080fd5b506104c460048036038101906104bf919061259e565b6111dd565b6040516104d19190612546565b60405180910390f35b3480156104e657600080fd5b5061050160048036038101906104fc919061259e565b611246565b60405161050e919061280c565b60405180910390f35b34801561052357600080fd5b5061052c611263565b604051610539919061280c565b60405180910390f35b34801561054e57600080fd5b5061056960048036038101906105649190612b00565b611269565b604051610576919061249b565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061064a57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061065a5750610659826112fd565b5b9050919050565b60606000805461067090612b6f565b80601f016020809104026020016040519081016040528092919081815260200182805461069c90612b6f565b80156106e95780601f106106be576101008083540402835291602001916106e9565b820191906000526020600020905b8154815290600101906020018083116106cc57829003601f168201915b5050505050905090565b60006106fe82611367565b50610708826113ef565b9050919050565b610721828261071c61142c565b611434565b5050565b60008083838101906107379190612bf5565b90506000600960008360000151815260200190815260200160002090506107648188846020015189611446565b63150b7a0260e01b9250505095945050505050565b600080600960008481526020019081526020016000209050806005015442116107d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107ce90612c94565b60405180910390fd5b600015158160060160009054906101000a900460ff1615151461082f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082690612d00565b60405180910390fd5b600080600080600090505b84600101548110156108ab5784600001600082815260200190815260200160002091508160000160009054906101000a900460ff161561088b578160010154846108849190612d4f565b935061089e565b81600101548361089b9190612d4f565b92505b808060010191505061083a565b5081831015945060018460060160006101000a81548160ff0219169083151502179055507fea1bc2ea68f48594eea9b956b19b9e85216707c2b0660fb73dc9ee37d38f574d858560070154604051610904929190612d83565b60405180910390a160008060005b8660010154811015610a7757866000016000828152602001908152602001600020935087801561095157508360000160009054906101000a900460ff16155b15610984578360010154826109669190612d4f565b915061097f84600301548860070154866001015461153f565b610a6a565b871580156109a057508360000160009054906101000a900460ff165b156109d3578360010154826109b59190612d4f565b91506109ce84600301548860080154866001015461153f565b610a69565b8780156109ee57508360000160009054906101000a900460ff165b8015610a0257508660070154846003015414155b15610a1e57836001015483610a179190612d4f565b9250610a68565b87158015610a3b57508360000160009054906101000a900460ff16155b8015610a4f57508660080154846003015414155b15610a6757836001015483610a649190612d4f565b92505b5b5b5b8080600101915050610912565b5060005b8660010154811015610b82578660000160008281526020019081526020016000209350878015610ab957508360000160009054906101000a900460ff165b8015610acd57508660070154846003015414155b15610b0a57600083856001015484610ae59190612dac565b610aef9190612e1d565b9050610b04886008015486600301548361153f565b50610b75565b87158015610b2757508360000160009054906101000a900460ff16155b8015610b3b57508660080154846003015414155b15610b7457600083856001015484610b539190612dac565b610b5d9190612e1d565b9050610b72886007015486600301548361153f565b505b5b8080600101915050610a7b565b508615610bbd57610bbc308760020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168860070154611627565b5b60005b600754811015610c90576000610bd582610fbe565b90503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610c105750610c83565b6000600854610c1e84611246565b8a60030154610c2d9190612dac565b610c379190612e1d565b90508173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610c7f573d6000803e3d6000fd5b5050505b8080600101915050610bc0565b50505050505050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d0e5760006040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401610d05919061260c565b60405180910390fd5b6000610d228383610d1d61142c565b611794565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d98578382826040517f64283d7b000000000000000000000000000000000000000000000000000000008152600401610d8f93929190612e4e565b60405180910390fd5b50505050565b60008273ffffffffffffffffffffffffffffffffffffffff16610dc083610fbe565b73ffffffffffffffffffffffffffffffffffffffff1614610e16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0d90612ed1565b60405180910390fd5b610e1f82611246565b905092915050565b610e42838383604051806020016040528060008152506111c0565b505050565b6000803411610e8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8290612f63565b60405180910390fd5b600a6000815480929190610e9e90612f83565b9190505590506000600960008381526020019081526020016000209050838160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503481600301819055508281600401819055508242610f1c9190612d4f565b8160050181905550610f39600234610f349190612e1d565b6119ae565b8160070181905550610f56600234610f519190612e1d565b6119ae565b8160080181905550610f6f813060018460070154611446565b610f80813060008460080154611446565b7f6e5c598b821d7fa8550e5fea58ab6e27c59e1cbe1df75a8591aa0c453b49e10a82604051610faf919061280c565b60405180910390a15092915050565b6000610fc982611367565b9050919050565b600a5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036110495760006040517f89c62b64000000000000000000000000000000000000000000000000000000008152600401611040919061260c565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60606001805461109f90612b6f565b80601f01602080910402602001604051908101604052809291908181526020018280546110cb90612b6f565b80156111185780601f106110ed57610100808354040283529160200191611118565b820191906000526020600020905b8154815290600101906020018083116110fb57829003601f168201915b5050505050905090565b61113461112d61142c565b8383611a09565b5050565b60096020528060005260406000206000915090508060010154908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060030154908060040154908060050154908060060160009054906101000a900460ff16908060060160019054906101000a900460ff16908060070154908060080154905089565b6111cb848484610c9c565b6111d784848484611b78565b50505050565b60606111e882611367565b5060006111f3611d2f565b90506000815111611213576040518060200160405280600081525061123e565b8061121d84611d46565b60405160200161122e929190613007565b6040516020818303038152906040525b915050919050565b600060066000838152602001908152602001600020549050919050565b60085481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008061137383611e14565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036113e657826040517f7e2732890000000000000000000000000000000000000000000000000000000081526004016113dd919061280c565b60405180910390fd5b80915050919050565b60006004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600033905090565b6114418383836001611e51565b505050565b836005015442111561148d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148490613077565b60405180910390fd5b60008460000160008660010160008154809291906114aa90612f83565b9190505581526020019081526020016000209050838160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828160000160006101000a81548160ff0219169083151502179055506115278483610d9e565b81600101819055508181600301819055505050505050565b6000811015611583576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157a90613109565b60405180910390fd5b8061158d84611246565b10156115ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c59061319b565b60405180910390fd5b806006600085815260200190815260200160002060008282546115f191906131bb565b925050819055508060066000848152602001908152602001600020600082825461161b9190612d4f565b92505081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036116995760006040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401611690919061260c565b60405180910390fd5b60006116a783836000611794565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361171a57816040517f7e273289000000000000000000000000000000000000000000000000000000008152600401611711919061280c565b60405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461178e578382826040517f64283d7b00000000000000000000000000000000000000000000000000000000815260040161178593929190612e4e565b60405180910390fd5b50505050565b6000806117a084611e14565b9050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146117e2576117e1818486612016565b5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461187357611824600085600080611e51565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16146118f6576001600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505b846002600086815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550838573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4809150509392505050565b6000600760008154809291906119c390612f83565b9190505590506119d330826120da565b81600660008381526020019081526020016000208190555081600860008282546119fd9190612d4f565b92505081905550919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611a7a57816040517f5b08ba18000000000000000000000000000000000000000000000000000000008152600401611a71919061260c565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b6b919061249b565b60405180910390a3505050565b60008373ffffffffffffffffffffffffffffffffffffffff163b1115611d29578273ffffffffffffffffffffffffffffffffffffffff1663150b7a02611bbc61142c565b8685856040518563ffffffff1660e01b8152600401611bde9493929190613244565b6020604051808303816000875af1925050508015611c1a57506040513d601f19601f82011682018060405250810190611c1791906132a5565b60015b611c9e573d8060008114611c4a576040519150601f19603f3d011682016040523d82523d6000602084013e611c4f565b606091505b506000815103611c9657836040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401611c8d919061260c565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614611d2757836040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401611d1e919061260c565b60405180910390fd5b505b50505050565b606060405180602001604052806000815250905090565b606060006001611d55846121d3565b01905060008167ffffffffffffffff811115611d7457611d73612952565b5b6040519080825280601f01601f191660200182016040528015611da65781602001600182028036833780820191505090505b509050600082602001820190505b600115611e09578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581611dfd57611dfc612dee565b5b04945060008503611db4575b819350505050919050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b8080611e8a5750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b15611fbe576000611e9a84611367565b9050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015611f0557508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b8015611f185750611f168184611269565b155b15611f5a57826040517fa9fbf51f000000000000000000000000000000000000000000000000000000008152600401611f51919061260c565b60405180910390fd5b8115611fbc57838573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b836004600085815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050565b612021838383612326565b6120d557600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361209657806040517f7e27328900000000000000000000000000000000000000000000000000000000815260040161208d919061280c565b60405180910390fd5b81816040517f177e802f0000000000000000000000000000000000000000000000000000000081526004016120cc9291906132d2565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361214c5760006040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401612143919061260c565b60405180910390fd5b600061215a83836000611794565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146121ce5760006040517f73c6ac6e0000000000000000000000000000000000000000000000000000000081526004016121c5919061260c565b60405180910390fd5b505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612231577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161222757612226612dee565b5b0492506040810190505b6d04ee2d6d415b85acef8100000000831061226e576d04ee2d6d415b85acef8100000000838161226457612263612dee565b5b0492506020810190505b662386f26fc10000831061229d57662386f26fc10000838161229357612292612dee565b5b0492506010810190505b6305f5e10083106122c6576305f5e10083816122bc576122bb612dee565b5b0492506008810190505b61271083106122eb5761271083816122e1576122e0612dee565b5b0492506004810190505b6064831061230e576064838161230457612303612dee565b5b0492506002810190505b600a831061231d576001810190505b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156123de57508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061239f575061239e8484611269565b5b806123dd57508273ffffffffffffffffffffffffffffffffffffffff166123c5836113ef565b73ffffffffffffffffffffffffffffffffffffffff16145b5b90509392505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612430816123fb565b811461243b57600080fd5b50565b60008135905061244d81612427565b92915050565b600060208284031215612469576124686123f1565b5b60006124778482850161243e565b91505092915050565b60008115159050919050565b61249581612480565b82525050565b60006020820190506124b0600083018461248c565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156124f05780820151818401526020810190506124d5565b60008484015250505050565b6000601f19601f8301169050919050565b6000612518826124b6565b61252281856124c1565b93506125328185602086016124d2565b61253b816124fc565b840191505092915050565b60006020820190508181036000830152612560818461250d565b905092915050565b6000819050919050565b61257b81612568565b811461258657600080fd5b50565b60008135905061259881612572565b92915050565b6000602082840312156125b4576125b36123f1565b5b60006125c284828501612589565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006125f6826125cb565b9050919050565b612606816125eb565b82525050565b600060208201905061262160008301846125fd565b92915050565b612630816125eb565b811461263b57600080fd5b50565b60008135905061264d81612627565b92915050565b6000806040838503121561266a576126696123f1565b5b60006126788582860161263e565b925050602061268985828601612589565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f8401126126b8576126b7612693565b5b8235905067ffffffffffffffff8111156126d5576126d4612698565b5b6020830191508360018202830111156126f1576126f061269d565b5b9250929050565b600080600080600060808688031215612714576127136123f1565b5b60006127228882890161263e565b95505060206127338882890161263e565b945050604061274488828901612589565b935050606086013567ffffffffffffffff811115612765576127646123f6565b5b612771888289016126a2565b92509250509295509295909350565b612789816123fb565b82525050565b60006020820190506127a46000830184612780565b92915050565b6000806000606084860312156127c3576127c26123f1565b5b60006127d18682870161263e565b93505060206127e28682870161263e565b92505060406127f386828701612589565b9150509250925092565b61280681612568565b82525050565b600060208201905061282160008301846127fd565b92915050565b60006020828403121561283d5761283c6123f1565b5b600061284b8482850161263e565b91505092915050565b61285d81612480565b811461286857600080fd5b50565b60008135905061287a81612854565b92915050565b60008060408385031215612897576128966123f1565b5b60006128a58582860161263e565b92505060206128b68582860161286b565b9150509250929050565b6000610120820190506128d6600083018c6127fd565b6128e3602083018b6125fd565b6128f0604083018a6127fd565b6128fd60608301896127fd565b61290a60808301886127fd565b61291760a083018761248c565b61292460c083018661248c565b61293160e08301856127fd565b61293f6101008301846127fd565b9a9950505050505050505050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61298a826124fc565b810181811067ffffffffffffffff821117156129a9576129a8612952565b5b80604052505050565b60006129bc6123e7565b90506129c88282612981565b919050565b600067ffffffffffffffff8211156129e8576129e7612952565b5b6129f1826124fc565b9050602081019050919050565b82818337600083830152505050565b6000612a20612a1b846129cd565b6129b2565b905082815260208101848484011115612a3c57612a3b61294d565b5b612a478482856129fe565b509392505050565b600082601f830112612a6457612a63612693565b5b8135612a74848260208601612a0d565b91505092915050565b60008060008060808587031215612a9757612a966123f1565b5b6000612aa58782880161263e565b9450506020612ab68782880161263e565b9350506040612ac787828801612589565b925050606085013567ffffffffffffffff811115612ae857612ae76123f6565b5b612af487828801612a4f565b91505092959194509250565b60008060408385031215612b1757612b166123f1565b5b6000612b258582860161263e565b9250506020612b368582860161263e565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612b8757607f821691505b602082108103612b9a57612b99612b40565b5b50919050565b600080fd5b600060408284031215612bbb57612bba612ba0565b5b612bc560406129b2565b90506000612bd584828501612589565b6000830152506020612be98482850161286b565b60208301525092915050565b600060408284031215612c0b57612c0a6123f1565b5b6000612c1984828501612ba5565b91505092915050565b7f506f6f6c20656e642074696d6520686173206e6f74207965742061727269766560008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b6000612c7e6021836124c1565b9150612c8982612c22565b604082019050919050565b60006020820190508181036000830152612cad81612c71565b9050919050565b7f506f6f6c20697320616c7265616479207265736f6c7665640000000000000000600082015250565b6000612cea6018836124c1565b9150612cf582612cb4565b602082019050919050565b60006020820190508181036000830152612d1981612cdd565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612d5a82612568565b9150612d6583612568565b9250828201905080821115612d7d57612d7c612d20565b5b92915050565b6000604082019050612d98600083018561248c565b612da560208301846127fd565b9392505050565b6000612db782612568565b9150612dc283612568565b9250828202612dd081612568565b91508282048414831517612de757612de6612d20565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612e2882612568565b9150612e3383612568565b925082612e4357612e42612dee565b5b828204905092915050565b6000606082019050612e6360008301866125fd565b612e7060208301856127fd565b612e7d60408301846125fd565b949350505050565b7f4e4654206f776e6572206d69736d617463680000000000000000000000000000600082015250565b6000612ebb6012836124c1565b9150612ec682612e85565b602082019050919050565b60006020820190508181036000830152612eea81612eae565b9050919050565b7f46656520697320726571756972656420746f20696e6974696174652076616c6960008201527f646174696f6e20706f6f6c000000000000000000000000000000000000000000602082015250565b6000612f4d602b836124c1565b9150612f5882612ef1565b604082019050919050565b60006020820190508181036000830152612f7c81612f40565b9050919050565b6000612f8e82612568565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612fc057612fbf612d20565b5b600182019050919050565b600081905092915050565b6000612fe1826124b6565b612feb8185612fcb565b9350612ffb8185602086016124d2565b80840191505092915050565b60006130138285612fd6565b915061301f8284612fd6565b91508190509392505050565b7f506f6f6c20656e642074696d6520686173207061737365640000000000000000600082015250565b60006130616018836124c1565b915061306c8261302b565b602082019050919050565b6000602082019050818103600083015261309081613054565b9050919050565b7f56616c7565207472616e7366657220616d6f756e74206d75737420626520706f60008201527f7369746976650000000000000000000000000000000000000000000000000000602082015250565b60006130f36026836124c1565b91506130fe82613097565b604082019050919050565b60006020820190508181036000830152613122816130e6565b9050919050565b7f536f7572636520746f6b656e2068617320696e73756666696369656e7420766160008201527f6c75650000000000000000000000000000000000000000000000000000000000602082015250565b60006131856023836124c1565b915061319082613129565b604082019050919050565b600060208201905081810360008301526131b481613178565b9050919050565b60006131c682612568565b91506131d183612568565b92508282039050818111156131e9576131e8612d20565b5b92915050565b600081519050919050565b600082825260208201905092915050565b6000613216826131ef565b61322081856131fa565b93506132308185602086016124d2565b613239816124fc565b840191505092915050565b600060808201905061325960008301876125fd565b61326660208301866125fd565b61327360408301856127fd565b8181036060830152613285818461320b565b905095945050505050565b60008151905061329f81612427565b92915050565b6000602082840312156132bb576132ba6123f1565b5b60006132c984828501613290565b91505092915050565b60006040820190506132e760008301856125fd565b6132f460208301846127fd565b939250505056fea264697066735822122094887b35e6da3d3e4a3a6187dc4fe705db2a1d9dd8b6392268f5b637bef37e8064736f6c63430008180033", + "deployedBytecode": "0x60806040526004361061012a5760003560e01c80636352211e116100ab578063a23362791161006f578063a23362791461042f578063b88d4fde14610474578063c87b56dd1461049d578063cadf338f146104da578063d4c3eea014610517578063e985e9c5146105425761012a565b80636352211e14610336578063642b5bfb1461037357806370a082311461039e57806395d89b41146103db578063a22cb465146104065761012a565b806317c18217116100f257806317c182171461023a57806323b872dd14610277578063249cfda9146102a057806342842e0e146102dd57806360780cd7146103065761012a565b806301ffc9a71461012f57806306fdde031461016c578063081812fc14610197578063095ea7b3146101d4578063150b7a02146101fd575b600080fd5b34801561013b57600080fd5b5061015660048036038101906101519190612453565b61057f565b604051610163919061249b565b60405180910390f35b34801561017857600080fd5b50610181610661565b60405161018e9190612546565b60405180910390f35b3480156101a357600080fd5b506101be60048036038101906101b9919061259e565b6106f3565b6040516101cb919061260c565b60405180910390f35b3480156101e057600080fd5b506101fb60048036038101906101f69190612653565b61070f565b005b34801561020957600080fd5b50610224600480360381019061021f91906126f8565b610725565b604051610231919061278f565b60405180910390f35b34801561024657600080fd5b50610261600480360381019061025c919061259e565b610779565b60405161026e919061249b565b60405180910390f35b34801561028357600080fd5b5061029e600480360381019061029991906127aa565b610c9c565b005b3480156102ac57600080fd5b506102c760048036038101906102c29190612653565b610d9e565b6040516102d4919061280c565b60405180910390f35b3480156102e957600080fd5b5061030460048036038101906102ff91906127aa565b610e27565b005b610320600480360381019061031b9190612653565b610e47565b60405161032d919061280c565b60405180910390f35b34801561034257600080fd5b5061035d6004803603810190610358919061259e565b610fbe565b60405161036a919061260c565b60405180910390f35b34801561037f57600080fd5b50610388610fd0565b604051610395919061280c565b60405180910390f35b3480156103aa57600080fd5b506103c560048036038101906103c09190612827565b610fd6565b6040516103d2919061280c565b60405180910390f35b3480156103e757600080fd5b506103f0611090565b6040516103fd9190612546565b60405180910390f35b34801561041257600080fd5b5061042d60048036038101906104289190612880565b611122565b005b34801561043b57600080fd5b506104566004803603810190610451919061259e565b611138565b60405161046b999897969594939291906128c0565b60405180910390f35b34801561048057600080fd5b5061049b60048036038101906104969190612a7d565b6111c0565b005b3480156104a957600080fd5b506104c460048036038101906104bf919061259e565b6111dd565b6040516104d19190612546565b60405180910390f35b3480156104e657600080fd5b5061050160048036038101906104fc919061259e565b611246565b60405161050e919061280c565b60405180910390f35b34801561052357600080fd5b5061052c611263565b604051610539919061280c565b60405180910390f35b34801561054e57600080fd5b5061056960048036038101906105649190612b00565b611269565b604051610576919061249b565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061064a57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061065a5750610659826112fd565b5b9050919050565b60606000805461067090612b6f565b80601f016020809104026020016040519081016040528092919081815260200182805461069c90612b6f565b80156106e95780601f106106be576101008083540402835291602001916106e9565b820191906000526020600020905b8154815290600101906020018083116106cc57829003601f168201915b5050505050905090565b60006106fe82611367565b50610708826113ef565b9050919050565b610721828261071c61142c565b611434565b5050565b60008083838101906107379190612bf5565b90506000600960008360000151815260200190815260200160002090506107648188846020015189611446565b63150b7a0260e01b9250505095945050505050565b600080600960008481526020019081526020016000209050806005015442116107d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107ce90612c94565b60405180910390fd5b600015158160060160009054906101000a900460ff1615151461082f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082690612d00565b60405180910390fd5b600080600080600090505b84600101548110156108ab5784600001600082815260200190815260200160002091508160000160009054906101000a900460ff161561088b578160010154846108849190612d4f565b935061089e565b81600101548361089b9190612d4f565b92505b808060010191505061083a565b5081831015945060018460060160006101000a81548160ff0219169083151502179055507fea1bc2ea68f48594eea9b956b19b9e85216707c2b0660fb73dc9ee37d38f574d858560070154604051610904929190612d83565b60405180910390a160008060005b8660010154811015610a7757866000016000828152602001908152602001600020935087801561095157508360000160009054906101000a900460ff16155b15610984578360010154826109669190612d4f565b915061097f84600301548860070154866001015461153f565b610a6a565b871580156109a057508360000160009054906101000a900460ff165b156109d3578360010154826109b59190612d4f565b91506109ce84600301548860080154866001015461153f565b610a69565b8780156109ee57508360000160009054906101000a900460ff165b8015610a0257508660070154846003015414155b15610a1e57836001015483610a179190612d4f565b9250610a68565b87158015610a3b57508360000160009054906101000a900460ff16155b8015610a4f57508660080154846003015414155b15610a6757836001015483610a649190612d4f565b92505b5b5b5b8080600101915050610912565b5060005b8660010154811015610b82578660000160008281526020019081526020016000209350878015610ab957508360000160009054906101000a900460ff165b8015610acd57508660070154846003015414155b15610b0a57600083856001015484610ae59190612dac565b610aef9190612e1d565b9050610b04886008015486600301548361153f565b50610b75565b87158015610b2757508360000160009054906101000a900460ff16155b8015610b3b57508660080154846003015414155b15610b7457600083856001015484610b539190612dac565b610b5d9190612e1d565b9050610b72886007015486600301548361153f565b505b5b8080600101915050610a7b565b508615610bbd57610bbc308760020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168860070154611627565b5b60005b600754811015610c90576000610bd582610fbe565b90503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610c105750610c83565b6000600854610c1e84611246565b8a60030154610c2d9190612dac565b610c379190612e1d565b90508173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610c7f573d6000803e3d6000fd5b5050505b8080600101915050610bc0565b50505050505050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d0e5760006040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401610d05919061260c565b60405180910390fd5b6000610d228383610d1d61142c565b611794565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d98578382826040517f64283d7b000000000000000000000000000000000000000000000000000000008152600401610d8f93929190612e4e565b60405180910390fd5b50505050565b60008273ffffffffffffffffffffffffffffffffffffffff16610dc083610fbe565b73ffffffffffffffffffffffffffffffffffffffff1614610e16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0d90612ed1565b60405180910390fd5b610e1f82611246565b905092915050565b610e42838383604051806020016040528060008152506111c0565b505050565b6000803411610e8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8290612f63565b60405180910390fd5b600a6000815480929190610e9e90612f83565b9190505590506000600960008381526020019081526020016000209050838160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503481600301819055508281600401819055508242610f1c9190612d4f565b8160050181905550610f39600234610f349190612e1d565b6119ae565b8160070181905550610f56600234610f519190612e1d565b6119ae565b8160080181905550610f6f813060018460070154611446565b610f80813060008460080154611446565b7f6e5c598b821d7fa8550e5fea58ab6e27c59e1cbe1df75a8591aa0c453b49e10a82604051610faf919061280c565b60405180910390a15092915050565b6000610fc982611367565b9050919050565b600a5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036110495760006040517f89c62b64000000000000000000000000000000000000000000000000000000008152600401611040919061260c565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60606001805461109f90612b6f565b80601f01602080910402602001604051908101604052809291908181526020018280546110cb90612b6f565b80156111185780601f106110ed57610100808354040283529160200191611118565b820191906000526020600020905b8154815290600101906020018083116110fb57829003601f168201915b5050505050905090565b61113461112d61142c565b8383611a09565b5050565b60096020528060005260406000206000915090508060010154908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060030154908060040154908060050154908060060160009054906101000a900460ff16908060060160019054906101000a900460ff16908060070154908060080154905089565b6111cb848484610c9c565b6111d784848484611b78565b50505050565b60606111e882611367565b5060006111f3611d2f565b90506000815111611213576040518060200160405280600081525061123e565b8061121d84611d46565b60405160200161122e929190613007565b6040516020818303038152906040525b915050919050565b600060066000838152602001908152602001600020549050919050565b60085481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008061137383611e14565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036113e657826040517f7e2732890000000000000000000000000000000000000000000000000000000081526004016113dd919061280c565b60405180910390fd5b80915050919050565b60006004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600033905090565b6114418383836001611e51565b505050565b836005015442111561148d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148490613077565b60405180910390fd5b60008460000160008660010160008154809291906114aa90612f83565b9190505581526020019081526020016000209050838160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828160000160006101000a81548160ff0219169083151502179055506115278483610d9e565b81600101819055508181600301819055505050505050565b6000811015611583576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157a90613109565b60405180910390fd5b8061158d84611246565b10156115ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c59061319b565b60405180910390fd5b806006600085815260200190815260200160002060008282546115f191906131bb565b925050819055508060066000848152602001908152602001600020600082825461161b9190612d4f565b92505081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036116995760006040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401611690919061260c565b60405180910390fd5b60006116a783836000611794565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361171a57816040517f7e273289000000000000000000000000000000000000000000000000000000008152600401611711919061280c565b60405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461178e578382826040517f64283d7b00000000000000000000000000000000000000000000000000000000815260040161178593929190612e4e565b60405180910390fd5b50505050565b6000806117a084611e14565b9050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146117e2576117e1818486612016565b5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461187357611824600085600080611e51565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16146118f6576001600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505b846002600086815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550838573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4809150509392505050565b6000600760008154809291906119c390612f83565b9190505590506119d330826120da565b81600660008381526020019081526020016000208190555081600860008282546119fd9190612d4f565b92505081905550919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611a7a57816040517f5b08ba18000000000000000000000000000000000000000000000000000000008152600401611a71919061260c565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b6b919061249b565b60405180910390a3505050565b60008373ffffffffffffffffffffffffffffffffffffffff163b1115611d29578273ffffffffffffffffffffffffffffffffffffffff1663150b7a02611bbc61142c565b8685856040518563ffffffff1660e01b8152600401611bde9493929190613244565b6020604051808303816000875af1925050508015611c1a57506040513d601f19601f82011682018060405250810190611c1791906132a5565b60015b611c9e573d8060008114611c4a576040519150601f19603f3d011682016040523d82523d6000602084013e611c4f565b606091505b506000815103611c9657836040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401611c8d919061260c565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614611d2757836040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401611d1e919061260c565b60405180910390fd5b505b50505050565b606060405180602001604052806000815250905090565b606060006001611d55846121d3565b01905060008167ffffffffffffffff811115611d7457611d73612952565b5b6040519080825280601f01601f191660200182016040528015611da65781602001600182028036833780820191505090505b509050600082602001820190505b600115611e09578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581611dfd57611dfc612dee565b5b04945060008503611db4575b819350505050919050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b8080611e8a5750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b15611fbe576000611e9a84611367565b9050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015611f0557508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b8015611f185750611f168184611269565b155b15611f5a57826040517fa9fbf51f000000000000000000000000000000000000000000000000000000008152600401611f51919061260c565b60405180910390fd5b8115611fbc57838573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b836004600085815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050565b612021838383612326565b6120d557600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361209657806040517f7e27328900000000000000000000000000000000000000000000000000000000815260040161208d919061280c565b60405180910390fd5b81816040517f177e802f0000000000000000000000000000000000000000000000000000000081526004016120cc9291906132d2565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361214c5760006040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401612143919061260c565b60405180910390fd5b600061215a83836000611794565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146121ce5760006040517f73c6ac6e0000000000000000000000000000000000000000000000000000000081526004016121c5919061260c565b60405180910390fd5b505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612231577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161222757612226612dee565b5b0492506040810190505b6d04ee2d6d415b85acef8100000000831061226e576d04ee2d6d415b85acef8100000000838161226457612263612dee565b5b0492506020810190505b662386f26fc10000831061229d57662386f26fc10000838161229357612292612dee565b5b0492506010810190505b6305f5e10083106122c6576305f5e10083816122bc576122bb612dee565b5b0492506008810190505b61271083106122eb5761271083816122e1576122e0612dee565b5b0492506004810190505b6064831061230e576064838161230457612303612dee565b5b0492506002810190505b600a831061231d576001810190505b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156123de57508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061239f575061239e8484611269565b5b806123dd57508273ffffffffffffffffffffffffffffffffffffffff166123c5836113ef565b73ffffffffffffffffffffffffffffffffffffffff16145b5b90509392505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612430816123fb565b811461243b57600080fd5b50565b60008135905061244d81612427565b92915050565b600060208284031215612469576124686123f1565b5b60006124778482850161243e565b91505092915050565b60008115159050919050565b61249581612480565b82525050565b60006020820190506124b0600083018461248c565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156124f05780820151818401526020810190506124d5565b60008484015250505050565b6000601f19601f8301169050919050565b6000612518826124b6565b61252281856124c1565b93506125328185602086016124d2565b61253b816124fc565b840191505092915050565b60006020820190508181036000830152612560818461250d565b905092915050565b6000819050919050565b61257b81612568565b811461258657600080fd5b50565b60008135905061259881612572565b92915050565b6000602082840312156125b4576125b36123f1565b5b60006125c284828501612589565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006125f6826125cb565b9050919050565b612606816125eb565b82525050565b600060208201905061262160008301846125fd565b92915050565b612630816125eb565b811461263b57600080fd5b50565b60008135905061264d81612627565b92915050565b6000806040838503121561266a576126696123f1565b5b60006126788582860161263e565b925050602061268985828601612589565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f8401126126b8576126b7612693565b5b8235905067ffffffffffffffff8111156126d5576126d4612698565b5b6020830191508360018202830111156126f1576126f061269d565b5b9250929050565b600080600080600060808688031215612714576127136123f1565b5b60006127228882890161263e565b95505060206127338882890161263e565b945050604061274488828901612589565b935050606086013567ffffffffffffffff811115612765576127646123f6565b5b612771888289016126a2565b92509250509295509295909350565b612789816123fb565b82525050565b60006020820190506127a46000830184612780565b92915050565b6000806000606084860312156127c3576127c26123f1565b5b60006127d18682870161263e565b93505060206127e28682870161263e565b92505060406127f386828701612589565b9150509250925092565b61280681612568565b82525050565b600060208201905061282160008301846127fd565b92915050565b60006020828403121561283d5761283c6123f1565b5b600061284b8482850161263e565b91505092915050565b61285d81612480565b811461286857600080fd5b50565b60008135905061287a81612854565b92915050565b60008060408385031215612897576128966123f1565b5b60006128a58582860161263e565b92505060206128b68582860161286b565b9150509250929050565b6000610120820190506128d6600083018c6127fd565b6128e3602083018b6125fd565b6128f0604083018a6127fd565b6128fd60608301896127fd565b61290a60808301886127fd565b61291760a083018761248c565b61292460c083018661248c565b61293160e08301856127fd565b61293f6101008301846127fd565b9a9950505050505050505050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61298a826124fc565b810181811067ffffffffffffffff821117156129a9576129a8612952565b5b80604052505050565b60006129bc6123e7565b90506129c88282612981565b919050565b600067ffffffffffffffff8211156129e8576129e7612952565b5b6129f1826124fc565b9050602081019050919050565b82818337600083830152505050565b6000612a20612a1b846129cd565b6129b2565b905082815260208101848484011115612a3c57612a3b61294d565b5b612a478482856129fe565b509392505050565b600082601f830112612a6457612a63612693565b5b8135612a74848260208601612a0d565b91505092915050565b60008060008060808587031215612a9757612a966123f1565b5b6000612aa58782880161263e565b9450506020612ab68782880161263e565b9350506040612ac787828801612589565b925050606085013567ffffffffffffffff811115612ae857612ae76123f6565b5b612af487828801612a4f565b91505092959194509250565b60008060408385031215612b1757612b166123f1565b5b6000612b258582860161263e565b9250506020612b368582860161263e565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612b8757607f821691505b602082108103612b9a57612b99612b40565b5b50919050565b600080fd5b600060408284031215612bbb57612bba612ba0565b5b612bc560406129b2565b90506000612bd584828501612589565b6000830152506020612be98482850161286b565b60208301525092915050565b600060408284031215612c0b57612c0a6123f1565b5b6000612c1984828501612ba5565b91505092915050565b7f506f6f6c20656e642074696d6520686173206e6f74207965742061727269766560008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b6000612c7e6021836124c1565b9150612c8982612c22565b604082019050919050565b60006020820190508181036000830152612cad81612c71565b9050919050565b7f506f6f6c20697320616c7265616479207265736f6c7665640000000000000000600082015250565b6000612cea6018836124c1565b9150612cf582612cb4565b602082019050919050565b60006020820190508181036000830152612d1981612cdd565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612d5a82612568565b9150612d6583612568565b9250828201905080821115612d7d57612d7c612d20565b5b92915050565b6000604082019050612d98600083018561248c565b612da560208301846127fd565b9392505050565b6000612db782612568565b9150612dc283612568565b9250828202612dd081612568565b91508282048414831517612de757612de6612d20565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612e2882612568565b9150612e3383612568565b925082612e4357612e42612dee565b5b828204905092915050565b6000606082019050612e6360008301866125fd565b612e7060208301856127fd565b612e7d60408301846125fd565b949350505050565b7f4e4654206f776e6572206d69736d617463680000000000000000000000000000600082015250565b6000612ebb6012836124c1565b9150612ec682612e85565b602082019050919050565b60006020820190508181036000830152612eea81612eae565b9050919050565b7f46656520697320726571756972656420746f20696e6974696174652076616c6960008201527f646174696f6e20706f6f6c000000000000000000000000000000000000000000602082015250565b6000612f4d602b836124c1565b9150612f5882612ef1565b604082019050919050565b60006020820190508181036000830152612f7c81612f40565b9050919050565b6000612f8e82612568565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612fc057612fbf612d20565b5b600182019050919050565b600081905092915050565b6000612fe1826124b6565b612feb8185612fcb565b9350612ffb8185602086016124d2565b80840191505092915050565b60006130138285612fd6565b915061301f8284612fd6565b91508190509392505050565b7f506f6f6c20656e642074696d6520686173207061737365640000000000000000600082015250565b60006130616018836124c1565b915061306c8261302b565b602082019050919050565b6000602082019050818103600083015261309081613054565b9050919050565b7f56616c7565207472616e7366657220616d6f756e74206d75737420626520706f60008201527f7369746976650000000000000000000000000000000000000000000000000000602082015250565b60006130f36026836124c1565b91506130fe82613097565b604082019050919050565b60006020820190508181036000830152613122816130e6565b9050919050565b7f536f7572636520746f6b656e2068617320696e73756666696369656e7420766160008201527f6c75650000000000000000000000000000000000000000000000000000000000602082015250565b60006131856023836124c1565b915061319082613129565b604082019050919050565b600060208201905081810360008301526131b481613178565b9050919050565b60006131c682612568565b91506131d183612568565b92508282039050818111156131e9576131e8612d20565b5b92915050565b600081519050919050565b600082825260208201905092915050565b6000613216826131ef565b61322081856131fa565b93506132308185602086016124d2565b613239816124fc565b840191505092915050565b600060808201905061325960008301876125fd565b61326660208301866125fd565b61327360408301856127fd565b8181036060830152613285818461320b565b905095945050505050565b60008151905061329f81612427565b92915050565b6000602082840312156132bb576132ba6123f1565b5b60006132c984828501613290565b91505092915050565b60006040820190506132e760008301856125fd565b6132f460208301846127fd565b939250505056fea264697066735822122094887b35e6da3d3e4a3a6187dc4fe705db2a1d9dd8b6392268f5b637bef37e8064736f6c63430008180033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/client/src/assets/Work1.json b/client/src/assets/Work1.json index 019b314..8bc16ca 100644 --- a/client/src/assets/Work1.json +++ b/client/src/assets/Work1.json @@ -181,8 +181,8 @@ "type": "function" } ], - "bytecode": "0x60c06040523480156200001157600080fd5b50604051620010bf380380620010bf833981810160405281019062000037919062000134565b8173ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250508060a0818152505050506200017b565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620000ad8262000080565b9050919050565b6000620000c182620000a0565b9050919050565b620000d381620000b4565b8114620000df57600080fd5b50565b600081519050620000f381620000c8565b92915050565b6000819050919050565b6200010e81620000f9565b81146200011a57600080fd5b50565b6000815190506200012e8162000103565b92915050565b600080604083850312156200014e576200014d6200007b565b5b60006200015e85828601620000e2565b925050602062000171858286016200011d565b9150509250929050565b60805160a051610f10620001af600039600081816102d901526105da01526000818161022101526105070152610f106000f3fe6080604052600436106100705760003560e01c806381d12c581161004e57806381d12c58146100e7578063854b6a4f14610129578063a035b1fe14610152578063c4a325911461017d57610070565b8063150b7a02146100755780634b8b194c146100b25780635badbe4c146100bc575b600080fd5b34801561008157600080fd5b5061009c600480360381019061009791906109d8565b6101a6565b6040516100a99190610a9b565b60405180910390f35b6100ba6102d7565b005b3480156100c857600080fd5b506100d16103cd565b6040516100de9190610ac5565b60405180910390f35b3480156100f357600080fd5b5061010e60048036038101906101099190610ae0565b6103d3565b60405161012096959493929190610bae565b60405180910390f35b34801561013557600080fd5b50610150600480360381019061014b9190610c3b565b610449565b005b34801561015e57600080fd5b506101676105d8565b6040516101749190610ac5565b60405180910390f35b34801561018957600080fd5b506101a4600480360381019061019f9190610ae0565b6105fc565b005b600080600080600160008154809291906101bf90610caa565b9190505581526020019081526020016000209050858160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508481600101819055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663249cfda987876040518363ffffffff1660e01b815260040161027a929190610cf2565b602060405180830381865afa158015610297573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102bb9190610d30565b816002018190555063150b7a0260e01b91505095945050505050565b7f000000000000000000000000000000000000000000000000000000000000000034101561033a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033190610dba565b60405180910390fd5b60006003600081548092919061034f90610caa565b9190505590506000600260008381526020019081526020016000209050338160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503481600101819055506103c1826106fd565b81600301819055505050565b60035481565b60026020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020160009054906101000a900460ff16908060030154908060040160009054906101000a900460ff16908060050154905086565b60006002600084815260200190815260200160002090506001600381111561047457610473610b1c565b5b8160020160009054906101000a900460ff16600381111561049857610497610b1c565b5b146104a257600080fd5b600080600083600301548152602001908152602001600020905060028260020160006101000a81548160ff021916908360038111156104e4576104e3610b1c565b5b0217905550828260040160006101000a81548160ff0219169083151502179055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166360780cd78260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16620151806040518363ffffffff1660e01b8152600401610587929190610cf2565b6020604051808303816000875af11580156105a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ca9190610d30565b826005018190555050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60006002600083815260200190815260200160002090506000600381111561062757610626610b1c565b5b8160020160009054906101000a900460ff16600381111561064b5761064a610b1c565b5b1461065557600080fd5b60008060008360030154815260200190815260200160002090503373ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146106cb57600080fd5b60018260020160006101000a81548160ff021916908360038111156106f3576106f2610b1c565b5b0217905550505050565b600061070761079f565b90506000806000838152602001908152602001600020905060018160030160006101000a81548160ff0219169083151502179055507f429f9327062651dbcecaca0d28b9929067489d32d2c1133ec207c965f1f0ab198160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684604051610791929190610cf2565b60405180910390a150919050565b60008060005b6001548110156108075760008082815260200190815260200160002060030160009054906101000a900460ff166107fa5760008082815260200190815260200160002060020154826107f79190610dda565b91505b80806001019150506107a5565b50600081446108169190610e3d565b9050600080600090505b6001548110156108965760008082815260200190815260200160002060030160009054906101000a900460ff166108895760008082815260200190815260200160002060020154826108729190610dda565b91508282111561088857809450505050506108d2565b5b8080600101915050610820565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c990610eba565b60405180910390fd5b90565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061090a826108df565b9050919050565b61091a816108ff565b811461092557600080fd5b50565b60008135905061093781610911565b92915050565b6000819050919050565b6109508161093d565b811461095b57600080fd5b50565b60008135905061096d81610947565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261099857610997610973565b5b8235905067ffffffffffffffff8111156109b5576109b4610978565b5b6020830191508360018202830111156109d1576109d061097d565b5b9250929050565b6000806000806000608086880312156109f4576109f36108d5565b5b6000610a0288828901610928565b9550506020610a1388828901610928565b9450506040610a248882890161095e565b935050606086013567ffffffffffffffff811115610a4557610a446108da565b5b610a5188828901610982565b92509250509295509295909350565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b610a9581610a60565b82525050565b6000602082019050610ab06000830184610a8c565b92915050565b610abf8161093d565b82525050565b6000602082019050610ada6000830184610ab6565b92915050565b600060208284031215610af657610af56108d5565b5b6000610b048482850161095e565b91505092915050565b610b16816108ff565b82525050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60048110610b5c57610b5b610b1c565b5b50565b6000819050610b6d82610b4b565b919050565b6000610b7d82610b5f565b9050919050565b610b8d81610b72565b82525050565b60008115159050919050565b610ba881610b93565b82525050565b600060c082019050610bc36000830189610b0d565b610bd06020830188610ab6565b610bdd6040830187610b84565b610bea6060830186610ab6565b610bf76080830185610b9f565b610c0460a0830184610ab6565b979650505050505050565b610c1881610b93565b8114610c2357600080fd5b50565b600081359050610c3581610c0f565b92915050565b60008060408385031215610c5257610c516108d5565b5b6000610c608582860161095e565b9250506020610c7185828601610c26565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610cb58261093d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610ce757610ce6610c7b565b5b600182019050919050565b6000604082019050610d076000830185610b0d565b610d146020830184610ab6565b9392505050565b600081519050610d2a81610947565b92915050565b600060208284031215610d4657610d456108d5565b5b6000610d5484828501610d1b565b91505092915050565b600082825260208201905092915050565b7f496e73756666696369656e742066656500000000000000000000000000000000600082015250565b6000610da4601083610d5d565b9150610daf82610d6e565b602082019050919050565b60006020820190508181036000830152610dd381610d97565b9050919050565b6000610de58261093d565b9150610df08361093d565b9250828201905080821115610e0857610e07610c7b565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000610e488261093d565b9150610e538361093d565b925082610e6357610e62610e0e565b5b828206905092915050565b7f4661696c656420746f2073656c65637420776f726b6572000000000000000000600082015250565b6000610ea4601783610d5d565b9150610eaf82610e6e565b602082019050919050565b60006020820190508181036000830152610ed381610e97565b905091905056fea2646970667358221220d17443734d1503c5d525c9366bfa64d1c7174cfe87026d09202028f1aeed0c0d64736f6c63430008180033", - "deployedBytecode": "0x6080604052600436106100705760003560e01c806381d12c581161004e57806381d12c58146100e7578063854b6a4f14610129578063a035b1fe14610152578063c4a325911461017d57610070565b8063150b7a02146100755780634b8b194c146100b25780635badbe4c146100bc575b600080fd5b34801561008157600080fd5b5061009c600480360381019061009791906109d8565b6101a6565b6040516100a99190610a9b565b60405180910390f35b6100ba6102d7565b005b3480156100c857600080fd5b506100d16103cd565b6040516100de9190610ac5565b60405180910390f35b3480156100f357600080fd5b5061010e60048036038101906101099190610ae0565b6103d3565b60405161012096959493929190610bae565b60405180910390f35b34801561013557600080fd5b50610150600480360381019061014b9190610c3b565b610449565b005b34801561015e57600080fd5b506101676105d8565b6040516101749190610ac5565b60405180910390f35b34801561018957600080fd5b506101a4600480360381019061019f9190610ae0565b6105fc565b005b600080600080600160008154809291906101bf90610caa565b9190505581526020019081526020016000209050858160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508481600101819055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663249cfda987876040518363ffffffff1660e01b815260040161027a929190610cf2565b602060405180830381865afa158015610297573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102bb9190610d30565b816002018190555063150b7a0260e01b91505095945050505050565b7f000000000000000000000000000000000000000000000000000000000000000034101561033a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033190610dba565b60405180910390fd5b60006003600081548092919061034f90610caa565b9190505590506000600260008381526020019081526020016000209050338160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503481600101819055506103c1826106fd565b81600301819055505050565b60035481565b60026020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020160009054906101000a900460ff16908060030154908060040160009054906101000a900460ff16908060050154905086565b60006002600084815260200190815260200160002090506001600381111561047457610473610b1c565b5b8160020160009054906101000a900460ff16600381111561049857610497610b1c565b5b146104a257600080fd5b600080600083600301548152602001908152602001600020905060028260020160006101000a81548160ff021916908360038111156104e4576104e3610b1c565b5b0217905550828260040160006101000a81548160ff0219169083151502179055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166360780cd78260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16620151806040518363ffffffff1660e01b8152600401610587929190610cf2565b6020604051808303816000875af11580156105a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ca9190610d30565b826005018190555050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60006002600083815260200190815260200160002090506000600381111561062757610626610b1c565b5b8160020160009054906101000a900460ff16600381111561064b5761064a610b1c565b5b1461065557600080fd5b60008060008360030154815260200190815260200160002090503373ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146106cb57600080fd5b60018260020160006101000a81548160ff021916908360038111156106f3576106f2610b1c565b5b0217905550505050565b600061070761079f565b90506000806000838152602001908152602001600020905060018160030160006101000a81548160ff0219169083151502179055507f429f9327062651dbcecaca0d28b9929067489d32d2c1133ec207c965f1f0ab198160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684604051610791929190610cf2565b60405180910390a150919050565b60008060005b6001548110156108075760008082815260200190815260200160002060030160009054906101000a900460ff166107fa5760008082815260200190815260200160002060020154826107f79190610dda565b91505b80806001019150506107a5565b50600081446108169190610e3d565b9050600080600090505b6001548110156108965760008082815260200190815260200160002060030160009054906101000a900460ff166108895760008082815260200190815260200160002060020154826108729190610dda565b91508282111561088857809450505050506108d2565b5b8080600101915050610820565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c990610eba565b60405180910390fd5b90565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061090a826108df565b9050919050565b61091a816108ff565b811461092557600080fd5b50565b60008135905061093781610911565b92915050565b6000819050919050565b6109508161093d565b811461095b57600080fd5b50565b60008135905061096d81610947565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261099857610997610973565b5b8235905067ffffffffffffffff8111156109b5576109b4610978565b5b6020830191508360018202830111156109d1576109d061097d565b5b9250929050565b6000806000806000608086880312156109f4576109f36108d5565b5b6000610a0288828901610928565b9550506020610a1388828901610928565b9450506040610a248882890161095e565b935050606086013567ffffffffffffffff811115610a4557610a446108da565b5b610a5188828901610982565b92509250509295509295909350565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b610a9581610a60565b82525050565b6000602082019050610ab06000830184610a8c565b92915050565b610abf8161093d565b82525050565b6000602082019050610ada6000830184610ab6565b92915050565b600060208284031215610af657610af56108d5565b5b6000610b048482850161095e565b91505092915050565b610b16816108ff565b82525050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60048110610b5c57610b5b610b1c565b5b50565b6000819050610b6d82610b4b565b919050565b6000610b7d82610b5f565b9050919050565b610b8d81610b72565b82525050565b60008115159050919050565b610ba881610b93565b82525050565b600060c082019050610bc36000830189610b0d565b610bd06020830188610ab6565b610bdd6040830187610b84565b610bea6060830186610ab6565b610bf76080830185610b9f565b610c0460a0830184610ab6565b979650505050505050565b610c1881610b93565b8114610c2357600080fd5b50565b600081359050610c3581610c0f565b92915050565b60008060408385031215610c5257610c516108d5565b5b6000610c608582860161095e565b9250506020610c7185828601610c26565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610cb58261093d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610ce757610ce6610c7b565b5b600182019050919050565b6000604082019050610d076000830185610b0d565b610d146020830184610ab6565b9392505050565b600081519050610d2a81610947565b92915050565b600060208284031215610d4657610d456108d5565b5b6000610d5484828501610d1b565b91505092915050565b600082825260208201905092915050565b7f496e73756666696369656e742066656500000000000000000000000000000000600082015250565b6000610da4601083610d5d565b9150610daf82610d6e565b602082019050919050565b60006020820190508181036000830152610dd381610d97565b9050919050565b6000610de58261093d565b9150610df08361093d565b9250828201905080821115610e0857610e07610c7b565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000610e488261093d565b9150610e538361093d565b925082610e6357610e62610e0e565b5b828206905092915050565b7f4661696c656420746f2073656c65637420776f726b6572000000000000000000600082015250565b6000610ea4601783610d5d565b9150610eaf82610e6e565b602082019050919050565b60006020820190508181036000830152610ed381610e97565b905091905056fea2646970667358221220d17443734d1503c5d525c9366bfa64d1c7174cfe87026d09202028f1aeed0c0d64736f6c63430008180033", + "bytecode": "0x60c06040523480156200001157600080fd5b50604051620010bf380380620010bf833981810160405281019062000037919062000134565b8173ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250508060a0818152505050506200017b565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620000ad8262000080565b9050919050565b6000620000c182620000a0565b9050919050565b620000d381620000b4565b8114620000df57600080fd5b50565b600081519050620000f381620000c8565b92915050565b6000819050919050565b6200010e81620000f9565b81146200011a57600080fd5b50565b6000815190506200012e8162000103565b92915050565b600080604083850312156200014e576200014d6200007b565b5b60006200015e85828601620000e2565b925050602062000171858286016200011d565b9150509250929050565b60805160a051610f10620001af600039600081816102d901526105da01526000818161022101526105070152610f106000f3fe6080604052600436106100705760003560e01c806381d12c581161004e57806381d12c58146100e7578063854b6a4f14610129578063a035b1fe14610152578063c4a325911461017d57610070565b8063150b7a02146100755780634b8b194c146100b25780635badbe4c146100bc575b600080fd5b34801561008157600080fd5b5061009c600480360381019061009791906109d8565b6101a6565b6040516100a99190610a9b565b60405180910390f35b6100ba6102d7565b005b3480156100c857600080fd5b506100d16103cd565b6040516100de9190610ac5565b60405180910390f35b3480156100f357600080fd5b5061010e60048036038101906101099190610ae0565b6103d3565b60405161012096959493929190610bae565b60405180910390f35b34801561013557600080fd5b50610150600480360381019061014b9190610c3b565b610449565b005b34801561015e57600080fd5b506101676105d8565b6040516101749190610ac5565b60405180910390f35b34801561018957600080fd5b506101a4600480360381019061019f9190610ae0565b6105fc565b005b600080600080600160008154809291906101bf90610caa565b9190505581526020019081526020016000209050858160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508481600101819055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663249cfda987876040518363ffffffff1660e01b815260040161027a929190610cf2565b602060405180830381865afa158015610297573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102bb9190610d30565b816002018190555063150b7a0260e01b91505095945050505050565b7f000000000000000000000000000000000000000000000000000000000000000034101561033a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033190610dba565b60405180910390fd5b60006003600081548092919061034f90610caa565b9190505590506000600260008381526020019081526020016000209050338160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503481600101819055506103c1826106fd565b81600301819055505050565b60035481565b60026020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020160009054906101000a900460ff16908060030154908060040160009054906101000a900460ff16908060050154905086565b60006002600084815260200190815260200160002090506001600381111561047457610473610b1c565b5b8160020160009054906101000a900460ff16600381111561049857610497610b1c565b5b146104a257600080fd5b600080600083600301548152602001908152602001600020905060028260020160006101000a81548160ff021916908360038111156104e4576104e3610b1c565b5b0217905550828260040160006101000a81548160ff0219169083151502179055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166360780cd78260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16620151806040518363ffffffff1660e01b8152600401610587929190610cf2565b6020604051808303816000875af11580156105a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ca9190610d30565b826005018190555050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60006002600083815260200190815260200160002090506000600381111561062757610626610b1c565b5b8160020160009054906101000a900460ff16600381111561064b5761064a610b1c565b5b1461065557600080fd5b60008060008360030154815260200190815260200160002090503373ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146106cb57600080fd5b60018260020160006101000a81548160ff021916908360038111156106f3576106f2610b1c565b5b0217905550505050565b600061070761079f565b90506000806000838152602001908152602001600020905060018160030160006101000a81548160ff0219169083151502179055507f429f9327062651dbcecaca0d28b9929067489d32d2c1133ec207c965f1f0ab198160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684604051610791929190610cf2565b60405180910390a150919050565b60008060005b6001548110156108075760008082815260200190815260200160002060030160009054906101000a900460ff166107fa5760008082815260200190815260200160002060020154826107f79190610dda565b91505b80806001019150506107a5565b50600081446108169190610e3d565b9050600080600090505b6001548110156108965760008082815260200190815260200160002060030160009054906101000a900460ff166108895760008082815260200190815260200160002060020154826108729190610dda565b91508282111561088857809450505050506108d2565b5b8080600101915050610820565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c990610eba565b60405180910390fd5b90565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061090a826108df565b9050919050565b61091a816108ff565b811461092557600080fd5b50565b60008135905061093781610911565b92915050565b6000819050919050565b6109508161093d565b811461095b57600080fd5b50565b60008135905061096d81610947565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261099857610997610973565b5b8235905067ffffffffffffffff8111156109b5576109b4610978565b5b6020830191508360018202830111156109d1576109d061097d565b5b9250929050565b6000806000806000608086880312156109f4576109f36108d5565b5b6000610a0288828901610928565b9550506020610a1388828901610928565b9450506040610a248882890161095e565b935050606086013567ffffffffffffffff811115610a4557610a446108da565b5b610a5188828901610982565b92509250509295509295909350565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b610a9581610a60565b82525050565b6000602082019050610ab06000830184610a8c565b92915050565b610abf8161093d565b82525050565b6000602082019050610ada6000830184610ab6565b92915050565b600060208284031215610af657610af56108d5565b5b6000610b048482850161095e565b91505092915050565b610b16816108ff565b82525050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60048110610b5c57610b5b610b1c565b5b50565b6000819050610b6d82610b4b565b919050565b6000610b7d82610b5f565b9050919050565b610b8d81610b72565b82525050565b60008115159050919050565b610ba881610b93565b82525050565b600060c082019050610bc36000830189610b0d565b610bd06020830188610ab6565b610bdd6040830187610b84565b610bea6060830186610ab6565b610bf76080830185610b9f565b610c0460a0830184610ab6565b979650505050505050565b610c1881610b93565b8114610c2357600080fd5b50565b600081359050610c3581610c0f565b92915050565b60008060408385031215610c5257610c516108d5565b5b6000610c608582860161095e565b9250506020610c7185828601610c26565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610cb58261093d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610ce757610ce6610c7b565b5b600182019050919050565b6000604082019050610d076000830185610b0d565b610d146020830184610ab6565b9392505050565b600081519050610d2a81610947565b92915050565b600060208284031215610d4657610d456108d5565b5b6000610d5484828501610d1b565b91505092915050565b600082825260208201905092915050565b7f496e73756666696369656e742066656500000000000000000000000000000000600082015250565b6000610da4601083610d5d565b9150610daf82610d6e565b602082019050919050565b60006020820190508181036000830152610dd381610d97565b9050919050565b6000610de58261093d565b9150610df08361093d565b9250828201905080821115610e0857610e07610c7b565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000610e488261093d565b9150610e538361093d565b925082610e6357610e62610e0e565b5b828206905092915050565b7f4661696c656420746f2073656c65637420776f726b6572000000000000000000600082015250565b6000610ea4601783610d5d565b9150610eaf82610e6e565b602082019050919050565b60006020820190508181036000830152610ed381610e97565b905091905056fea264697066735822122030793d0a35ab8bb52990ae8bb18c165008c47e470d0ec7e48c14bab67f9c1b5d64736f6c63430008180033", + "deployedBytecode": "0x6080604052600436106100705760003560e01c806381d12c581161004e57806381d12c58146100e7578063854b6a4f14610129578063a035b1fe14610152578063c4a325911461017d57610070565b8063150b7a02146100755780634b8b194c146100b25780635badbe4c146100bc575b600080fd5b34801561008157600080fd5b5061009c600480360381019061009791906109d8565b6101a6565b6040516100a99190610a9b565b60405180910390f35b6100ba6102d7565b005b3480156100c857600080fd5b506100d16103cd565b6040516100de9190610ac5565b60405180910390f35b3480156100f357600080fd5b5061010e60048036038101906101099190610ae0565b6103d3565b60405161012096959493929190610bae565b60405180910390f35b34801561013557600080fd5b50610150600480360381019061014b9190610c3b565b610449565b005b34801561015e57600080fd5b506101676105d8565b6040516101749190610ac5565b60405180910390f35b34801561018957600080fd5b506101a4600480360381019061019f9190610ae0565b6105fc565b005b600080600080600160008154809291906101bf90610caa565b9190505581526020019081526020016000209050858160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508481600101819055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663249cfda987876040518363ffffffff1660e01b815260040161027a929190610cf2565b602060405180830381865afa158015610297573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102bb9190610d30565b816002018190555063150b7a0260e01b91505095945050505050565b7f000000000000000000000000000000000000000000000000000000000000000034101561033a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033190610dba565b60405180910390fd5b60006003600081548092919061034f90610caa565b9190505590506000600260008381526020019081526020016000209050338160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503481600101819055506103c1826106fd565b81600301819055505050565b60035481565b60026020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020160009054906101000a900460ff16908060030154908060040160009054906101000a900460ff16908060050154905086565b60006002600084815260200190815260200160002090506001600381111561047457610473610b1c565b5b8160020160009054906101000a900460ff16600381111561049857610497610b1c565b5b146104a257600080fd5b600080600083600301548152602001908152602001600020905060028260020160006101000a81548160ff021916908360038111156104e4576104e3610b1c565b5b0217905550828260040160006101000a81548160ff0219169083151502179055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166360780cd78260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16620151806040518363ffffffff1660e01b8152600401610587929190610cf2565b6020604051808303816000875af11580156105a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ca9190610d30565b826005018190555050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60006002600083815260200190815260200160002090506000600381111561062757610626610b1c565b5b8160020160009054906101000a900460ff16600381111561064b5761064a610b1c565b5b1461065557600080fd5b60008060008360030154815260200190815260200160002090503373ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146106cb57600080fd5b60018260020160006101000a81548160ff021916908360038111156106f3576106f2610b1c565b5b0217905550505050565b600061070761079f565b90506000806000838152602001908152602001600020905060018160030160006101000a81548160ff0219169083151502179055507f429f9327062651dbcecaca0d28b9929067489d32d2c1133ec207c965f1f0ab198160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684604051610791929190610cf2565b60405180910390a150919050565b60008060005b6001548110156108075760008082815260200190815260200160002060030160009054906101000a900460ff166107fa5760008082815260200190815260200160002060020154826107f79190610dda565b91505b80806001019150506107a5565b50600081446108169190610e3d565b9050600080600090505b6001548110156108965760008082815260200190815260200160002060030160009054906101000a900460ff166108895760008082815260200190815260200160002060020154826108729190610dda565b91508282111561088857809450505050506108d2565b5b8080600101915050610820565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c990610eba565b60405180910390fd5b90565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061090a826108df565b9050919050565b61091a816108ff565b811461092557600080fd5b50565b60008135905061093781610911565b92915050565b6000819050919050565b6109508161093d565b811461095b57600080fd5b50565b60008135905061096d81610947565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261099857610997610973565b5b8235905067ffffffffffffffff8111156109b5576109b4610978565b5b6020830191508360018202830111156109d1576109d061097d565b5b9250929050565b6000806000806000608086880312156109f4576109f36108d5565b5b6000610a0288828901610928565b9550506020610a1388828901610928565b9450506040610a248882890161095e565b935050606086013567ffffffffffffffff811115610a4557610a446108da565b5b610a5188828901610982565b92509250509295509295909350565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b610a9581610a60565b82525050565b6000602082019050610ab06000830184610a8c565b92915050565b610abf8161093d565b82525050565b6000602082019050610ada6000830184610ab6565b92915050565b600060208284031215610af657610af56108d5565b5b6000610b048482850161095e565b91505092915050565b610b16816108ff565b82525050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60048110610b5c57610b5b610b1c565b5b50565b6000819050610b6d82610b4b565b919050565b6000610b7d82610b5f565b9050919050565b610b8d81610b72565b82525050565b60008115159050919050565b610ba881610b93565b82525050565b600060c082019050610bc36000830189610b0d565b610bd06020830188610ab6565b610bdd6040830187610b84565b610bea6060830186610ab6565b610bf76080830185610b9f565b610c0460a0830184610ab6565b979650505050505050565b610c1881610b93565b8114610c2357600080fd5b50565b600081359050610c3581610c0f565b92915050565b60008060408385031215610c5257610c516108d5565b5b6000610c608582860161095e565b9250506020610c7185828601610c26565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610cb58261093d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610ce757610ce6610c7b565b5b600182019050919050565b6000604082019050610d076000830185610b0d565b610d146020830184610ab6565b9392505050565b600081519050610d2a81610947565b92915050565b600060208284031215610d4657610d456108d5565b5b6000610d5484828501610d1b565b91505092915050565b600082825260208201905092915050565b7f496e73756666696369656e742066656500000000000000000000000000000000600082015250565b6000610da4601083610d5d565b9150610daf82610d6e565b602082019050919050565b60006020820190508181036000830152610dd381610d97565b9050919050565b6000610de58261093d565b9150610df08361093d565b9250828201905080821115610e0857610e07610c7b565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000610e488261093d565b9150610e538361093d565b925082610e6357610e62610e0e565b5b828206905092915050565b7f4661696c656420746f2073656c65637420776f726b6572000000000000000000600082015250565b6000610ea4601783610d5d565b9150610eaf82610e6e565b602082019050919050565b60006020820190508181036000830152610ed381610e97565b905091905056fea264697066735822122030793d0a35ab8bb52990ae8bb18c165008c47e470d0ec7e48c14bab67f9c1b5d64736f6c63430008180033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/client/src/main.jsx b/client/src/main.jsx index 5c75a5d..ba5891c 100644 --- a/client/src/main.jsx +++ b/client/src/main.jsx @@ -16,9 +16,9 @@ ReactDOM.createRoot(document.getElementById('root')).render( url: window.location.href, }, enableAnalytics: false, - infuraAPIKey: '579d264c5f534aa1aefd6be323cb1a35', + // infuraAPIKey: '579d264c5f534aa1aefd6be323cb1a35', readonlyRPCMap: { - '0x7a69': 'http://127.0.0.1:8545/', + '0x539': 'http://127.0.0.1:8545/', }, }} > diff --git a/ethereum/.eslintrc.cjs b/ethereum/.eslintrc.cjs index 87b2b43..4740dfc 100644 --- a/ethereum/.eslintrc.cjs +++ b/ethereum/.eslintrc.cjs @@ -6,7 +6,6 @@ module.exports = { 'airbnb', 'plugin:chai-friendly/recommended', ], - ignorePatterns: ['hardhat.config.js'], parserOptions: { ecmaVersion: 'latest', sourceType: 'module' }, settings: { react: { version: '18.2' } }, plugins: [ @@ -16,7 +15,7 @@ module.exports = { 'import/no-extraneous-dependencies': [ 'error', { - devDependencies: ['test/**', 'scripts/**'], + devDependencies: ['hardhat.config.js', 'test/**', 'scripts/**'], optionalDependencies: false, peerDependencies: false, }, diff --git a/ethereum/.mocharc.json b/ethereum/.mocharc.json new file mode 100644 index 0000000..51c4a1b --- /dev/null +++ b/ethereum/.mocharc.json @@ -0,0 +1,4 @@ +{ + "require": "hardhat/register", + "timeout": 40000 +} \ No newline at end of file diff --git a/ethereum/contracts/DAO.sol b/ethereum/contracts/DAO.sol index dc43b29..c8f63bb 100644 --- a/ethereum/contracts/DAO.sol +++ b/ethereum/contracts/DAO.sol @@ -47,6 +47,7 @@ contract DAO is ERC721("Reputation", "REP"), ReputationHolder { // TODO: Add forum parameters event ValidationPoolInitiated(uint poolIndex); + event ValidationPoolResolved(bool votePasses, uint256 newTokenId); /// Inspect the value of a given reputation NFT function valueOf(uint256 tokenId) public view returns (uint256 value) { @@ -98,6 +99,7 @@ contract DAO is ERC721("Reputation", "REP"), ReputationHolder { address author, uint duration ) public payable returns (uint poolIndex) { + require(msg.value > 0, "Fee is required to initiate validation pool"); poolIndex = validationPoolCount++; ValidationPool storage pool = validationPools[poolIndex]; pool.author = author; @@ -174,6 +176,7 @@ contract DAO is ERC721("Reputation", "REP"), ReputationHolder { // when no reputation has yet been minted. votePasses = amountFor >= amountAgainst; pool.resolved = true; + emit ValidationPoolResolved(votePasses, pool.tokenIdFor); // If the outcome is true, value of all stakes against the pool should be distributed among the stakes in favor. // If the outcome is false, value of all stakes for the pool should be distributed among the stakes against. uint256 amountFromWinners; @@ -241,8 +244,10 @@ contract DAO is ERC721("Reputation", "REP"), ReputationHolder { } // Distribute fee proportionatly among all reputation holders for (uint tokenId = 0; tokenId < nextTokenId; tokenId++) { - uint256 share = (pool.fee * valueOf(tokenId)) / totalValue; address recipient = ownerOf(tokenId); + // Don't count tokens owned by this contract, as these are part of validation pools in progress + if (recipient == address(this)) continue; + uint256 share = (pool.fee * valueOf(tokenId)) / totalValue; // TODO: For efficiency this could be modified to hold the funds for recipients to withdraw payable(recipient).transfer(share); } diff --git a/ethereum/hardhat.config.js b/ethereum/hardhat.config.js index 53b1c32..f76c1cb 100644 --- a/ethereum/hardhat.config.js +++ b/ethereum/hardhat.config.js @@ -1,6 +1,15 @@ require('@nomicfoundation/hardhat-toolbox'); +require('dotenv').config(); /** @type import('hardhat/config').HardhatUserConfig */ module.exports = { solidity: '0.8.24', + networks: { + hardhat: { + accounts: { + mnemonic: process.env.SEED_PHRASE, + }, + chainId: 1337, + }, + }, }; diff --git a/ethereum/package-lock.json b/ethereum/package-lock.json index aea9922..762ad08 100644 --- a/ethereum/package-lock.json +++ b/ethereum/package-lock.json @@ -9,11 +9,13 @@ "version": "1.0.0", "license": "ISC", "dependencies": { - "@openzeppelin/contracts": "^5.0.2" + "@openzeppelin/contracts": "^5.0.2", + "dotenv": "^16.4.5" }, "devDependencies": { "@nomicfoundation/hardhat-chai-matchers": "^2.0.6", "@nomicfoundation/hardhat-toolbox": "^4.0.0", + "chai": "^4.4.1", "eslint": "^8.57.0", "eslint-config-airbnb": "^19.0.4", "eslint-plugin-chai-friendly": "^0.7.4", @@ -22,6 +24,7 @@ "eslint-plugin-react": "^7.34.0", "eslint-plugin-react-hooks": "^4.6.0", "hardhat": "^2.20.1", + "mocha": "^10.3.0", "prettier": "^3.2.5", "prettier-plugin-solidity": "^1.3.1" } @@ -2722,7 +2725,6 @@ "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", "dev": true, - "peer": true, "engines": { "node": "*" } @@ -3131,7 +3133,6 @@ "resolved": "https://registry.npmjs.org/chai/-/chai-4.4.1.tgz", "integrity": "sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==", "dev": true, - "peer": true, "dependencies": { "assertion-error": "^1.1.0", "check-error": "^1.0.3", @@ -3753,6 +3754,17 @@ "node": ">=6.0.0" } }, + "node_modules/dotenv": { + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, "node_modules/elliptic": { "version": "6.5.4", "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", @@ -6670,7 +6682,6 @@ "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", "dev": true, - "peer": true, "dependencies": { "get-func-name": "^2.0.1" } @@ -7438,7 +7449,6 @@ "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", "dev": true, - "peer": true, "engines": { "node": "*" } diff --git a/ethereum/package.json b/ethereum/package.json index 3cbfb81..2ba1464 100644 --- a/ethereum/package.json +++ b/ethereum/package.json @@ -11,6 +11,7 @@ "devDependencies": { "@nomicfoundation/hardhat-chai-matchers": "^2.0.6", "@nomicfoundation/hardhat-toolbox": "^4.0.0", + "chai": "^4.4.1", "eslint": "^8.57.0", "eslint-config-airbnb": "^19.0.4", "eslint-plugin-chai-friendly": "^0.7.4", @@ -19,10 +20,12 @@ "eslint-plugin-react": "^7.34.0", "eslint-plugin-react-hooks": "^4.6.0", "hardhat": "^2.20.1", + "mocha": "^10.3.0", "prettier": "^3.2.5", "prettier-plugin-solidity": "^1.3.1" }, "dependencies": { - "@openzeppelin/contracts": "^5.0.2" + "@openzeppelin/contracts": "^5.0.2", + "dotenv": "^16.4.5" } } diff --git a/ethereum/test/DAO.js b/ethereum/test/DAO.js index e90a301..518b973 100644 --- a/ethereum/test/DAO.js +++ b/ethereum/test/DAO.js @@ -1,4 +1,5 @@ const { + time, loadFixture, } = require('@nomicfoundation/hardhat-toolbox/network-helpers'); const { expect } = require('chai'); @@ -18,23 +19,69 @@ describe('DAO', () => { return { dao, account1, account2 }; } + it('Should deploy', async () => { + const { dao } = await loadFixture(deployDAO); + expect(dao).to.exist; + expect(await dao.totalValue()).to.equal(0); + }); + describe('Validation Pool', () => { - it('Should deploy', async () => { - const { dao } = await loadFixture(deployDAO); - expect(dao).to.exist; - expect(await dao.totalValue()).to.equal(0); + let dao; + let account1; + const POOL_DURATION = 3600; // 1 hour + const fee = 100; + + beforeEach(async () => { + const setup = await loadFixture(deployDAO); + dao = setup.dao; + account1 = setup.account1; + const init = () => dao.initiateValidationPool(account1, POOL_DURATION, { value: fee }); + await expect(init()).to.emit(dao, 'ValidationPoolInitiated').withArgs(0); + expect(await dao.validationPoolCount()).to.equal(1); + expect(await dao.ownerOf(0)).to.equal(dao.target); }); - describe('Initiate validation pool', () => { - it('Should initiate', async () => { - const POOL_DURATION = 3600; // 1 hour - const { dao, account1 } = await loadFixture(deployDAO); - const init = () => dao.initiateValidationPool(account1, POOL_DURATION); - await expect(init()).to.emit(dao, 'ValidationPoolInitiated').withArgs(0); - const pool = await dao.validationPools(0); - expect(pool).to.exist; - expect(pool.duration).to.equal(POOL_DURATION); - }); + it('should not be able to initiate a validation pool without a fee', async () => { + const setup = await loadFixture(deployDAO); + const init = () => setup.dao.initiateValidationPool(setup.account1, POOL_DURATION); + await expect(init()).to.be.revertedWith('Fee is required to initiate validation pool'); + }); + + it('should be able to initiate a second validation pool', async () => { + const init = () => dao.initiateValidationPool(account1, POOL_DURATION, { value: fee }); + await expect(init()).to.emit(dao, 'ValidationPoolInitiated').withArgs(1); + expect(await dao.validationPoolCount()).to.equal(2); + }); + + it('Should be able to fetch pool instance', async () => { + const pool = await dao.validationPools(0); + expect(pool).to.exist; + expect(pool.duration).to.equal(POOL_DURATION); + }); + + it('should not be able to evaluate outcome before duration has elapsed', async () => { + await expect(dao.evaluateOutcome(0)).to.be.revertedWith('Pool end time has not yet arrived'); + }); + + it('should be able to evaluate outcome after duration has elapsed', async () => { + time.increase(POOL_DURATION + 1); + await expect(dao.evaluateOutcome(0)).to.emit(dao, 'ValidationPoolResolved').withArgs(true, 0); + expect(await dao.ownerOf(0)).to.equal(account1); + }); + + it('should not be able to evaluate outcome more than once', async () => { + time.increase(POOL_DURATION + 1); + await expect(dao.evaluateOutcome(0)).to.emit(dao, 'ValidationPoolResolved').withArgs(true, 0); + await expect(dao.evaluateOutcome(0)).to.be.revertedWith('Pool is already resolved'); + }); + + it('should be able to evaluate outcome of second validation pool', async () => { + const init = () => dao.initiateValidationPool(account1, POOL_DURATION, { value: fee }); + await expect(init()).to.emit(dao, 'ValidationPoolInitiated').withArgs(1); + expect(await dao.validationPoolCount()).to.equal(2); + time.increase(POOL_DURATION + 1); + await expect(dao.evaluateOutcome(1)).to.emit(dao, 'ValidationPoolResolved').withArgs(true, 2); + expect(await dao.ownerOf(2)).to.equal(account1); }); }); });