@gooddollar/goodprotocol 1.0.0-beta.25 → 1.0.0-beta.33

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (144) hide show
  1. package/artifacts/contracts/DAOStackInterfaces.sol/Avatar.dbg.json +1 -1
  2. package/artifacts/contracts/DAOStackInterfaces.sol/Controller.dbg.json +1 -1
  3. package/artifacts/contracts/DAOStackInterfaces.sol/GlobalConstraintInterface.dbg.json +1 -1
  4. package/artifacts/contracts/DAOStackInterfaces.sol/IntVoteInterface.dbg.json +1 -1
  5. package/artifacts/contracts/DAOStackInterfaces.sol/ReputationInterface.dbg.json +1 -1
  6. package/artifacts/contracts/DAOStackInterfaces.sol/SchemeRegistrar.dbg.json +1 -1
  7. package/artifacts/contracts/Interfaces.sol/AggregatorV3Interface.dbg.json +1 -1
  8. package/artifacts/contracts/Interfaces.sol/ERC20.dbg.json +1 -1
  9. package/artifacts/contracts/Interfaces.sol/IAaveIncentivesController.dbg.json +1 -1
  10. package/artifacts/contracts/Interfaces.sol/IDonationStaking.dbg.json +1 -1
  11. package/artifacts/contracts/Interfaces.sol/IERC2917.dbg.json +1 -1
  12. package/artifacts/contracts/Interfaces.sol/IFirstClaimPool.dbg.json +1 -1
  13. package/artifacts/contracts/Interfaces.sol/IGoodDollar.dbg.json +1 -1
  14. package/artifacts/contracts/Interfaces.sol/IGoodStaking.dbg.json +1 -1
  15. package/artifacts/contracts/Interfaces.sol/IIdentity.dbg.json +1 -1
  16. package/artifacts/contracts/Interfaces.sol/ILendingPool.dbg.json +1 -1
  17. package/artifacts/contracts/Interfaces.sol/INameService.dbg.json +1 -1
  18. package/artifacts/contracts/Interfaces.sol/IUBIScheme.dbg.json +1 -1
  19. package/artifacts/contracts/Interfaces.sol/ProxyAdmin.dbg.json +1 -1
  20. package/artifacts/contracts/Interfaces.sol/Reserve.dbg.json +1 -1
  21. package/artifacts/contracts/Interfaces.sol/Staking.dbg.json +1 -1
  22. package/artifacts/contracts/Interfaces.sol/Uniswap.dbg.json +1 -1
  23. package/artifacts/contracts/Interfaces.sol/UniswapFactory.dbg.json +1 -1
  24. package/artifacts/contracts/Interfaces.sol/UniswapPair.dbg.json +1 -1
  25. package/artifacts/contracts/Interfaces.sol/cERC20.dbg.json +1 -1
  26. package/artifacts/contracts/governance/ClaimersDistribution.sol/ClaimersDistribution.dbg.json +1 -1
  27. package/artifacts/contracts/governance/ClaimersDistribution.sol/ClaimersDistribution.json +2 -2
  28. package/artifacts/contracts/governance/CompoundVotingMachine.sol/CompoundVotingMachine.dbg.json +1 -1
  29. package/artifacts/contracts/governance/CompoundVotingMachine.sol/CompoundVotingMachine.json +2 -2
  30. package/artifacts/contracts/governance/GReputation.sol/GReputation.dbg.json +1 -1
  31. package/artifacts/contracts/governance/GReputation.sol/GReputation.json +41 -2
  32. package/artifacts/contracts/governance/GovarnanceStaking.sol/GovernanceStaking.dbg.json +1 -1
  33. package/artifacts/contracts/governance/GovarnanceStaking.sol/GovernanceStaking.json +2 -2
  34. package/artifacts/contracts/governance/MultiBaseGovernanceShareField.sol/MultiBaseGovernanceShareField.dbg.json +1 -1
  35. package/artifacts/contracts/governance/Reputation.sol/Reputation.dbg.json +1 -1
  36. package/artifacts/contracts/governance/Reputation.sol/Reputation.json +2 -2
  37. package/artifacts/contracts/governance/StakersDistribution.sol/StakersDistribution.dbg.json +1 -1
  38. package/artifacts/contracts/governance/StakersDistribution.sol/StakersDistribution.json +2 -2
  39. package/artifacts/contracts/mocks/AaveMock.sol/AaveMock.dbg.json +1 -1
  40. package/artifacts/contracts/mocks/AaveMock.sol/AaveMock.json +2 -2
  41. package/artifacts/contracts/mocks/AaveUSDMockOracle.sol/AaveUSDMockOracle.dbg.json +1 -1
  42. package/artifacts/contracts/mocks/BatUSDMockOracle.sol/BatUSDMockOracle.dbg.json +1 -1
  43. package/artifacts/contracts/mocks/CompUsdMockOracle.sol/CompUSDMockOracle.dbg.json +1 -1
  44. package/artifacts/contracts/mocks/DAIMock.sol/DAIMock.dbg.json +1 -1
  45. package/artifacts/contracts/mocks/DAIMock.sol/DAIMock.json +2 -2
  46. package/artifacts/contracts/mocks/DaiEthPriceMockOracle.sol/DaiEthPriceMockOracle.dbg.json +1 -1
  47. package/artifacts/contracts/mocks/DecimalsMock.sol/DecimalsMock.dbg.json +1 -1
  48. package/artifacts/contracts/mocks/DecimalsMock.sol/DecimalsMock.json +2 -2
  49. package/artifacts/contracts/mocks/EthUSDMockOracle.sol/EthUSDMockOracle.dbg.json +1 -1
  50. package/artifacts/contracts/mocks/GasPriceMockOracle.sol/GasPriceMockOracle.dbg.json +1 -1
  51. package/artifacts/contracts/mocks/GoodCompoundStakingTest.sol/GoodCompoundStakingTest.dbg.json +1 -1
  52. package/artifacts/contracts/mocks/GoodCompoundStakingTest.sol/GoodCompoundStakingTest.json +4 -4
  53. package/artifacts/contracts/mocks/GoodFundManagerTest.sol/GoodFundManagerTest.dbg.json +1 -1
  54. package/artifacts/contracts/mocks/GoodFundManagerTest.sol/GoodFundManagerTest.json +37 -11
  55. package/artifacts/contracts/mocks/IncentiveControllerMock.sol/IncentiveControllerMock.dbg.json +1 -1
  56. package/artifacts/contracts/mocks/IncentiveControllerMock.sol/IncentiveControllerMock.json +2 -2
  57. package/artifacts/contracts/mocks/LendingPoolMock.sol/LendingPoolMock.dbg.json +1 -1
  58. package/artifacts/contracts/mocks/LendingPoolMock.sol/LendingPoolMock.json +2 -2
  59. package/artifacts/contracts/mocks/OverMintTester.sol/OverMintTester.dbg.json +1 -1
  60. package/artifacts/contracts/mocks/OverMintTester.sol/OverMintTester.json +2 -2
  61. package/artifacts/contracts/mocks/OverMintTesterRegularStake.sol/OverMintTesterRegularStake.dbg.json +1 -1
  62. package/artifacts/contracts/mocks/OverMintTesterRegularStake.sol/OverMintTesterRegularStake.json +2 -2
  63. package/artifacts/contracts/mocks/SixteenDecimalsTokenMock.sol/SixteenDecimalsTokenMock.dbg.json +1 -1
  64. package/artifacts/contracts/mocks/SixteenDecimalsTokenMock.sol/SixteenDecimalsTokenMock.json +2 -2
  65. package/artifacts/contracts/mocks/SwapHelperTest.sol/SwapHelperTest.dbg.json +1 -1
  66. package/artifacts/contracts/mocks/TwentyDecimalsTokenMock.sol/TwentyDecimalsTokenMock.dbg.json +1 -1
  67. package/artifacts/contracts/mocks/TwentyDecimalsTokenMock.sol/TwentyDecimalsTokenMock.json +2 -2
  68. package/artifacts/contracts/mocks/UsdcMock.sol/USDCMock.dbg.json +1 -1
  69. package/artifacts/contracts/mocks/UsdcMock.sol/USDCMock.json +2 -2
  70. package/artifacts/contracts/mocks/cBATMock.sol/cBATMock.dbg.json +1 -1
  71. package/artifacts/contracts/mocks/cBATMock.sol/cBATMock.json +2 -2
  72. package/artifacts/contracts/mocks/cDAILowWorthMock.sol/cDAILowWorthMock.dbg.json +1 -1
  73. package/artifacts/contracts/mocks/cDAILowWorthMock.sol/cDAILowWorthMock.json +2 -2
  74. package/artifacts/contracts/mocks/cDAIMock.sol/cDAIMock.dbg.json +1 -1
  75. package/artifacts/contracts/mocks/cDAIMock.sol/cDAIMock.json +2 -2
  76. package/artifacts/contracts/mocks/cDAINonMintableMock.sol/cDAINonMintableMock.dbg.json +1 -1
  77. package/artifacts/contracts/mocks/cDAINonMintableMock.sol/cDAINonMintableMock.json +2 -2
  78. package/artifacts/contracts/mocks/cDecimalsMock.sol/cDecimalsMock.dbg.json +1 -1
  79. package/artifacts/contracts/mocks/cDecimalsMock.sol/cDecimalsMock.json +2 -2
  80. package/artifacts/contracts/mocks/cSDTMock.sol/cSDTMock.dbg.json +1 -1
  81. package/artifacts/contracts/mocks/cSDTMock.sol/cSDTMock.json +2 -2
  82. package/artifacts/contracts/mocks/cUSDCMock.sol/cUSDCMock.dbg.json +1 -1
  83. package/artifacts/contracts/mocks/cUSDCMock.sol/cUSDCMock.json +2 -2
  84. package/artifacts/contracts/reserve/ExchangeHelper.sol/ExchangeHelper.dbg.json +1 -1
  85. package/artifacts/contracts/reserve/ExchangeHelper.sol/ExchangeHelper.json +2 -2
  86. package/artifacts/contracts/reserve/GoodMarketMaker.sol/GoodMarketMaker.dbg.json +1 -1
  87. package/artifacts/contracts/reserve/GoodMarketMaker.sol/GoodMarketMaker.json +2 -2
  88. package/artifacts/contracts/reserve/GoodReserveCDai.sol/ContributionCalc.dbg.json +1 -1
  89. package/artifacts/contracts/reserve/GoodReserveCDai.sol/GoodReserveCDai.dbg.json +1 -1
  90. package/artifacts/contracts/reserve/GoodReserveCDai.sol/GoodReserveCDai.json +2 -2
  91. package/artifacts/contracts/staking/BaseShareField.sol/BaseShareField.dbg.json +1 -1
  92. package/artifacts/contracts/staking/BaseShareField.sol/BaseShareField.json +2 -2
  93. package/artifacts/contracts/staking/DonationsStaking.sol/DonationsStaking.dbg.json +1 -1
  94. package/artifacts/contracts/staking/DonationsStaking.sol/DonationsStaking.json +2 -2
  95. package/artifacts/contracts/staking/GoodFundManager.sol/GoodFundManager.dbg.json +1 -1
  96. package/artifacts/contracts/staking/GoodFundManager.sol/GoodFundManager.json +37 -11
  97. package/artifacts/contracts/staking/SimpleStaking.sol/SimpleStaking.dbg.json +1 -1
  98. package/artifacts/contracts/staking/UniswapV2SwapHelper.sol/UniswapV2SwapHelper.dbg.json +1 -1
  99. package/artifacts/contracts/staking/UniswapV2SwapHelper.sol/UniswapV2SwapHelper.json +2 -2
  100. package/artifacts/contracts/staking/aave/AaveStakingFactory.sol/AaveStakingFactory.dbg.json +1 -1
  101. package/artifacts/contracts/staking/aave/AaveStakingFactory.sol/AaveStakingFactory.json +3 -3
  102. package/artifacts/contracts/staking/aave/GoodAaveStaking.sol/GoodAaveStaking.dbg.json +1 -1
  103. package/artifacts/contracts/staking/aave/GoodAaveStaking.sol/GoodAaveStaking.json +4 -4
  104. package/artifacts/contracts/staking/compound/CompoundStakingFactory.sol/CompoundStakingFactory.dbg.json +1 -1
  105. package/artifacts/contracts/staking/compound/CompoundStakingFactory.sol/CompoundStakingFactory.json +4 -4
  106. package/artifacts/contracts/staking/compound/GoodCompoundStaking.sol/GoodCompoundStaking.dbg.json +1 -1
  107. package/artifacts/contracts/staking/compound/GoodCompoundStaking.sol/GoodCompoundStaking.json +6 -6
  108. package/artifacts/contracts/ubi/UBIScheme.sol/UBIScheme.dbg.json +1 -1
  109. package/artifacts/contracts/ubi/UBIScheme.sol/UBIScheme.json +2 -2
  110. package/artifacts/contracts/utils/BancorFormula.sol/BancorFormula.dbg.json +1 -1
  111. package/artifacts/contracts/utils/DAOContract.sol/DAOContract.dbg.json +1 -1
  112. package/artifacts/contracts/utils/DAOContract.sol/DAOContract.json +2 -2
  113. package/artifacts/contracts/utils/DAOUpgradeableContract.sol/DAOUpgradeableContract.dbg.json +1 -1
  114. package/artifacts/contracts/utils/DAOUpgradeableContract.sol/DAOUpgradeableContract.json +2 -2
  115. package/artifacts/contracts/utils/DSMath.sol/DSMath.dbg.json +1 -1
  116. package/artifacts/contracts/utils/DataTypes.sol/DataTypes.dbg.json +1 -1
  117. package/artifacts/contracts/utils/NameService.sol/NameService.dbg.json +1 -1
  118. package/artifacts/contracts/utils/NameService.sol/NameService.json +2 -2
  119. package/artifacts/contracts/utils/ProtocolUpgrade.sol/OldMarketMaker.dbg.json +1 -1
  120. package/artifacts/contracts/utils/ProtocolUpgrade.sol/ProtocolUpgrade.dbg.json +1 -1
  121. package/artifacts/contracts/utils/ProtocolUpgrade.sol/ProtocolUpgrade.json +2 -2
  122. package/artifacts/contracts/utils/ProtocolUpgradeFuse.sol/ProtocolUpgradeFuse.dbg.json +1 -1
  123. package/artifacts/contracts/utils/ProtocolUpgradeFuse.sol/ProtocolUpgradeFuse.json +2 -2
  124. package/artifacts/contracts/utils/ReputationTestHelper.sol/ReputationTestHelper.dbg.json +1 -1
  125. package/artifacts/contracts/utils/ReputationTestHelper.sol/ReputationTestHelper.json +2 -2
  126. package/contracts/governance/GReputation.sol +70 -40
  127. package/contracts/staking/GoodFundManager.sol +41 -40
  128. package/contracts/utils/ProtocolUpgrade.sol +10 -0
  129. package/contracts/utils/ProtocolUpgradeFuse.sol +10 -0
  130. package/package.json +4 -3
  131. package/releases/deploy-settings.json +10 -0
  132. package/releases/deployment.json +1 -1
  133. package/releases/olddao.json +1 -1
  134. package/scripts/gdx/gdxAirdropCalculation.ts +11 -10
  135. package/scripts/governance/README.md +70 -0
  136. package/scripts/governance/airdropCalculation.ts +463 -98
  137. package/scripts/upgradeToV2/upgradeToV2.ts +118 -124
  138. package/test/governance/GReputation.test.ts +145 -86
  139. package/test/staking/DifferentStakingTokens.test.ts +11 -10
  140. package/test/staking/SimpleDAIStaking.test.ts +37 -40
  141. package/test/staking/StakingRewards.test.ts +57 -65
  142. package/test/staking/SwapHelper.test.ts +17 -21
  143. package/test/staking/UsdcAaveStaking.test.ts +12 -12
  144. package/yarn.lock +16 -9
@@ -89,8 +89,8 @@
89
89
  "type": "function"
90
90
  }
91
91
  ],
92
- "bytecode": "0x60806040523480156200001157600080fd5b50604051620038d9380380620038d983398181016040528101906200003791906200036a565b6200006b7f8c42f5e355865ee700fb4f5f64f3c0a68ca7a8423e71d04ddf2437abac3ee7d660001b6200030d60201b60201c565b6200009f7f377d321c6ef0a25d17af4a5d304dac012ab801233fbd5a1f07051c779d90dd8260001b6200030d60201b60201c565b620000d37fbc3b16e057120003a6d2666bca3ae611f6eb4b50ff73418724e166edc1baa01460001b6200030d60201b60201c565b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620001477f59bf6103067e9fd432d140fcdcbddf4b71c525bd45362006ec09d74b6be4aa2c60001b6200030d60201b60201c565b6200017b7f6c40c2b95c31660d37c4b34c046b80defcdc1f312c19f30dfeccf1fb70c6a4aa60001b6200030d60201b60201c565b33600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620001f07f322b4a5f14757189c9e8b9f88d63dc6ea237d9ea62cd9a8ec365477824f10cd560001b6200030d60201b60201c565b620002247f6b37c4ad3598c12ce7193b6712e66a6a638297da896ae9d6b8750836ae4b108460001b6200030d60201b60201c565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635aef7de66040518163ffffffff1660e01b815260040160206040518083038186803b1580156200028b57600080fd5b505afa158015620002a0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002c691906200033e565b600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505062000412565b50565b6000815190506200032181620003de565b92915050565b6000815190506200033881620003f8565b92915050565b6000602082840312156200035157600080fd5b6000620003618482850162000310565b91505092915050565b6000602082840312156200037d57600080fd5b60006200038d8482850162000327565b91505092915050565b6000620003a382620003be565b9050919050565b6000620003b78262000396565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b620003e98162000396565b8114620003f557600080fd5b50565b6200040381620003aa565b81146200040f57600080fd5b50565b6134b780620004226000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80634eb70b39146100465780635c0d087b1461006257806375a2d2431461007e575b600080fd5b610060600480360381019061005b91906125d1565b61009a565b005b61007c60048036038101906100779190612505565b61009d565b005b610098600480360381019061009391906125fa565b61099d565b005b50565b6100c97f6f99860b838b0dfe59db29d8dc8be062744270ec3220b9bc644dd17e972bd73860001b61009a565b6100f57f504317b5368544e0229fbd0b940d757122448f9c7d4b72cd1d4aea1eb80181c660001b61009a565b6101217f41decebe2e3ae2efc30b410103950a3b5c22adec5d8c19592598ec496bb7008860001b61009a565b61014d7f32a3a1183016d95e4daee6a1c1db5fb54d34a101350e413ac106a4a5eaca2c2860001b61009a565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146101dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101d490612d8d565b60405180910390fd5b6102097fa4cbd9e7d4aaab96c961b0742ffc6d3f4ec38a616fa56a4bc1eeb0b6eaa7359560001b61009a565b6102357fddbf5fa5c047f2c4f0cc826a68932c385dcd84d72a35008a145e0780b7c6300860001b61009a565b6102617f5d88a7b571c175ec8e6c873c5f61bb68de4609784bed21892694b8fb263451ee60001b61009a565b61028d7fa3ebe0b4b2b33d02e5a9ecf19a69663ff1f1e08291cc047fc5f9e550c5cb15c560001b61009a565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663039de01d84600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff1660e01b815260040161030a929190612ad7565b602060405180830381600087803b15801561032457600080fd5b505af1158015610338573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061035c9190612554565b61039b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161039290612c4d565b60405180910390fd5b6103c77f75a4da7c3d83af405517463444c5412bd9db2b0ff9eca74c65e300b2b974b4de60001b61009a565b6103f37fbc8b5b7a0cce2fd87ab790738e374f9f65b1341d8c491c032d62ed9251365c6560001b61009a565b61041f7f828f970e0b04686ee47a2eccfbddfb7c202bbfc660fe437d28293a7ddcba233b60001b61009a565b61044b7f173576014d1464b88d10d1f87e745c950dcc103addb74b693920bb6003e122d360001b61009a565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663039de01d83600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff1660e01b81526004016104c8929190612ad7565b602060405180830381600087803b1580156104e257600080fd5b505af11580156104f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051a9190612554565b610559576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161055090612cad565b60405180910390fd5b6105857f2517a3b1271006bd27c20aeb410887b459d432bfd0e7d64b20fdd7707a1c13a160001b61009a565b6105b17fa4a83039dcca433c0178409d585b9aec32729fe7b33500b5121d56dd46179bf460001b61009a565b6105dd7fbe58ee543ca6ebc77d4f18789917e098219a99e7a2c724d83148fa4ce3242cdd60001b61009a565b6106097f201575b15d41ecd6e0244e7551408dd8f74b76eef4512c1b0fc591d9dc995f5360001b61009a565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e869d45f826000801b601f60e01b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518563ffffffff1660e01b81526004016106919493929190612b45565b602060405180830381600087803b1580156106ab57600080fd5b505af11580156106bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106e39190612554565b610722576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161071990612d2d565b60405180910390fd5b61074e7fd2f47bf21669fa85ab0bba9c4e049ebd73e9645548fec9c9dc0df9f559a3cf4060001b61009a565b61077a7fb9eac905e8a7c2f1bae65ac256a02d362534f04efe8d871a5dc93a1a42f12f3760001b61009a565b6107a67f730d4461029406ad2e08de23bcd8246ea25f0b42411ca4ac01423bee7be4a83060001b61009a565b6107d27f5fe0fafddd644c69ac16bb9f8c4266cc158c7b32792fd0758259f3a3b6fa152f60001b61009a565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636c525b13600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b815260040161084d9190612abc565b602060405180830381600087803b15801561086757600080fd5b505af115801561087b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061089f9190612554565b6108de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d590612dcd565b60405180910390fd5b61090a7fee0de9ebf44d4cc435496fe2ca1ae8cd328160118a8645054d3faafe0ccfa08360001b61009a565b6109367f643b6c01e7e5992f435b87fea2e59e181e6094a313ab0c577fc531811253e27d60001b61009a565b6109627fac73d7202d0b00903ae1854afc29062c1c80ab510563530b85f664899da798e160001b61009a565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16ff5b6109c97fc2825fd9763c86bdfc63de52102d4c0912d1eef522dc8ffbad2bf87863b52a2060001b61009a565b6109f57f36746936312f76142c7b4a056fd3ec9d8fe2f252b0b0b6296286adbd7f501c5060001b61009a565b610a217fb23b9587b78f39f0d394d6347efe7e758baa24b85b3440c55d41b8112d3e11f060001b61009a565b610a4d7f8fb52f82ea275f35b88b1e88a9a435688896d586682604de07e4835d9f5a103e60001b61009a565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610add576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad490612d8d565b60405180910390fd5b610b097f76f924a90660ffd781afaca761178270cc62a762af5d208f6cdbe3f24d89824e60001b61009a565b610b357f6a0a050fb7c18f35bc82a57f5f023e4c627a130602c5012f515ee9b3dd80cceb60001b61009a565b610b617f5287a839d2eb54d51ae95dfc6d0e9091b4f5160e192dde8e9355e1f336a6ff9460001b61009a565b610b8d7f4bdcda6de1ec3c7611ff34da6910c18b1bf790630c08a1c12c905cfc0958ab5260001b61009a565b818190508484905014610bd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bcc90612c0d565b60405180910390fd5b610c017f840cc7cddc926f229f0eb993890c7f113929b07dbe7de7683de26cd0035ab1b160001b61009a565b610c2d7fda471798f0b7e33c47552540ca3ad99096390cb259aeab25ad3d5d0274e6bef660001b61009a565b610c597f40d98f1e3bd30fdf9eb0046e66e1b131d26126ba7097319e5e764395e35922b760001b61009a565b610c857fc72d4032d3b486d19984d226568ce4224392e65e0babc0a9ac24b066069b23db60001b61009a565b6004875114610cc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc090612d6d565b60405180910390fd5b610cf57fa0e3a7728322302ead4ee50bda6f840bc844651c0fbac3598801463b538914f160001b61009a565b610d217fbcb53111df07d65716f7d37ed853349255f4303041714b3144b41fd8fa4f618a60001b61009a565b610d4d7f906b7b33fb9991687c8989e27701dd46341cf7355ab8cab37e73b2b2faa2c02e60001b61009a565b610dda87600281518110610d8a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101518689600381518110610dcd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516113d9565b610e067f08bd47c89ae48cba9655c4b3049a989e5a9be7b4165010dc21d3b55e4c773ada60001b61009a565b610e327f5c104ab8f8ab57b2e9d3c0b38766a7b387906e98862cd67987300ccd97c25aaf60001b61009a565b610ebf88858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050611fe4565b610eeb7ff0d321d1b7dd2c118a4ee6611e18955fc9f3adc46400a3f7a3edf1f606580d7660001b61009a565b610f177f827879f8ebbd0e918c254f258e4b72a596a37005e00bac85ce30b41089283dca60001b61009a565b610f437fbd9de88a28aa423253c2e8c63b72b1fe6e846709af1dca03235b94bee1cc628660001b61009a565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e869d45f8973ffffffffffffffffffffffffffffffffffffffff1663bf40fac16040518163ffffffff1660e01b8152600401610fb690612c8d565b60206040518083038186803b158015610fce57600080fd5b505afa158015610fe2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061100691906124dc565b6000801b600160e01b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518563ffffffff1660e01b81526004016110519493929190612b45565b602060405180830381600087803b15801561106b57600080fd5b505af115801561107f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110a39190612554565b6110e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d990612c6d565b60405180910390fd5b61110e7f326789d0b63d4edc88ee00ab696bdefa6d855ff7a8ae93e6a280336fa6760f7560001b61009a565b61113a7fc98ae6a1243cd38cec67850a0e3eef8824fbe35dd4a3bc2db5341085ec6d71a860001b61009a565b6111667f54e940803a43fbb0a56659116d1bbdf89b77ef2bce448fdd8f68ebd1e94be25260001b61009a565b6111927f90f82887e95664784667f2d5513d40bf67533e5cf2d38a789e7e4f0753c1c91660001b61009a565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663039de01d8973ffffffffffffffffffffffffffffffffffffffff1663bf40fac16040518163ffffffff1660e01b815260040161120590612d0d565b60206040518083038186803b15801561121d57600080fd5b505afa158015611231573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061125591906124dc565b73ffffffffffffffffffffffffffffffffffffffff16634b75f54f6040518163ffffffff1660e01b815260040160206040518083038186803b15801561129a57600080fd5b505afa1580156112ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112d291906124dc565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff1660e01b8152600401611312929190612ad7565b602060405180830381600087803b15801561132c57600080fd5b505af1158015611340573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113649190612554565b6113a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139a90612ccd565b60405180910390fd5b6113cf7f1b942dbfce2b6c69e5493d952a55086fbb133c33d8578e807c160317cac8bd5360001b61009a565b5050505050505050565b6114057fc9bbb0c1b25ec09bec0a632a2608c7f69804d5ac52ce5a50c937e81e8edd124b60001b61009a565b6114317f8a5d15b0b3df417400e4e3280462aa1e91dd6b5791ebf7fc3e99cb67a65d75f860001b61009a565b61145d7f59d7e2d9a2f3b431ddb48f817ad77f61304e68aa255bd67776e4d3022623004b60001b61009a565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e1758bd86040518163ffffffff1660e01b815260040160206040518083038186803b1580156114c757600080fd5b505afa1580156114db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114ff91906124dc565b905061152d7fc4436dcc3f9fa87627a62e75d90fbae12deecb15bff72762b8447f96ceb90ad060001b61009a565b6115597fdc4fbff900ec126c1f2f47549f397b14b143204d6e2d7ada4d5eaf39c59e7b2160001b61009a565b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231866040518263ffffffff1660e01b81526004016115949190612abc565b60206040518083038186803b1580156115ac57600080fd5b505afa1580156115c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115e491906126d5565b90506116127f7700d23f9ac835d2a386639a5303daeb50af4bca30c67cb510cb31602182584860001b61009a565b61163e7f888e9bafaed318462a8ef7729902043058e273f1290f7f2e517b0d70afa70f3660001b61009a565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d1b7089a858760405160240161168f9190612abc565b6040516020818303038152906040527f2c336822000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660006040518563ffffffff1660e01b81526004016117509493929190612b8a565b600060405180830381600087803b15801561176a57600080fd5b505af115801561177e573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906117a7919061257d565b5090506117d67f2e2670c3e97f77a29a34632d22d9a04b0b4b05c7132575eba99659081a56c5b360001b61009a565b6118027ff3f17106ff1277cc35937f30fb5e1f4f952c92b6810e17d6477eac6426e9438c60001b61009a565b61182e7fd223089d169c6bdb0cb795964457449827371183fc80cad0c2c90fb88b94bcb560001b61009a565b8061186e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186590612ced565b60405180910390fd5b61189a7fd0b9bf288479c895e544d90058fbf95bde0012fc4da4657ceec56bbeb07f07a760001b61009a565b6118c67fd9707e0ca237c838d2acf7ea9e2fe2a684f878529d0a59f2c472c4196db4fc3460001b61009a565b6118f27f07af66a7809c16f837d6174ed0778435e2d64b5209e8ca6c4eabae7ecdf8a24f60001b61009a565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d1b7089a876040516024016040516020818303038152906040527fefbe1c1c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660006040518563ffffffff1660e01b81526004016119f69493929190612b8a565b600060405180830381600087803b158015611a1057600080fd5b505af1158015611a24573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611a4d919061257d565b5080915050611a7e7f50c7f62b48327224bc4b6dec9eb18c03f2ceb88abb00bbb19612165cbd95a97160001b61009a565b611aaa7f4e42537547564dbc40411c8f94bcb2810ca005cebe21d5fd079887cb90ddfbcf60001b61009a565b611ad67f8e639255616509529c1d3d618ec4b6f65f00120fbff1a154c3822f71ddade9b560001b61009a565b80611b16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0d90612c2d565b60405180910390fd5b611b427f5749f8b0985695721a3bcdddfba40694cc25b5f4b6a6e98f489ecc195177cb0760001b61009a565b611b6e7f309342aeef7bc73123bf6b8f1def6eb6557575bc2afb20c47c8e17b1a9903afb60001b61009a565b611b9a7f1afef01c7d5e47f77e99e03281c8246041338f49d5d638f8c2ccde06f316f08e60001b61009a565b611bc67fd13b2b4a932275dd11d6e1ae063fc161d92d6044a68cb2f529be646c56cb58c560001b61009a565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663039de01d87600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff1660e01b8152600401611c43929190612ad7565b602060405180830381600087803b158015611c5d57600080fd5b505af1158015611c71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c959190612554565b611cd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ccb90612d4d565b60405180910390fd5b611d007f8b2822f4b530221f117ae5e75aeccadeb9be6c0eb908c43ba7271b2816b0eb3060001b61009a565b611d2c7f959cc9f4f009a7619f80f3ae5db35a3f92b24dd918b659c2625a1d21a2e1257e60001b61009a565b611d587fcd700c9215ecb350510713a2bbbf9c3c17e22eabec00eb36ca06bb5f419185da60001b61009a565b6000821115611faf57611d8d7f1dec6e22581505b1fb6e910e158193433ba5ceff8ae539f89d565525e522691460001b61009a565b611db97f5e61662526c99ed38ca992b9a8790755544dd379742720593ac92b8f53ec482760001b61009a565b611de57f2d8cb3925fe11b1ad70770935097552bffc3edfc341df2362798fabc2ca6505560001b61009a565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b9a04cdd848785600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518563ffffffff1660e01b8152600401611e669493929190612b00565b602060405180830381600087803b158015611e8057600080fd5b505af1158015611e94573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611eb89190612554565b9050611ee67fcaa51136be1db5064f4c944c7b178d1c401afe76f244c03f5d5d23cfea33baa560001b61009a565b611f127f0ad30f12bffad3ef0c26114541e0e8e4b7d086de8c4914bdaf13004c0482548a60001b61009a565b611f3e7f68bb2363df6e19e67e2dea37179a0b92fbb9e3381bcd4cbe54cc457cf741aaf360001b61009a565b80611f7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7590612ded565b60405180910390fd5b611faa7fa4063197ef21012d5447aff84e86ab304ac1b93e2e0e1ef45f484ea49a2039a460001b61009a565b611fdc565b611fdb7fb42f941166466241fba7666f12a94289e892b4f99191066da1ae971b5310091760001b61009a565b5b505050505050565b6120107fcd5587172520f7a61a9dfad8a8b89adb8920d346720d652b0857d6c0c5326a4760001b61009a565b61203c7fcb479892d9b23bbd77ccbbef5c44dabd5e251ad04de434740cb853e35424dc5160001b61009a565b6120687fd2bd89b720b5b86dbc700680f4a11333bb3616a2d0c51754c944a623577572ca60001b61009a565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d1b7089a8585856040516024016120bb929190612bd6565b6040516020818303038152906040527f4ab01f5b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660006040518563ffffffff1660e01b815260040161217c9493929190612b8a565b600060405180830381600087803b15801561219657600080fd5b505af11580156121aa573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906121d3919061257d565b5090506122027ff0b480e995e483a27b1f9260f435b61d6f20666a73da9e0d7a910913ebdeae0560001b61009a565b61222e7f88f0c68c8111b1cc2e6c0d5852a0e0b6a386ac822a86737ca5caa2a4f819f1fd60001b61009a565b61225a7f1baa686bae970f6953c8b0c9d18565bcd6ddf74319e4cb3493a42b1ed1ec44b560001b61009a565b8061229a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229190612dad565b60405180910390fd5b6122c67f2d1acba28a153ff4a16d64efa5b6e015e6c8734d596a97a54a051eca6b433d7d60001b61009a565b50505050565b60006122df6122da84612e32565b612e0d565b905080838252602082019050828560208602820111156122fe57600080fd5b60005b8581101561232e57816123148882612376565b845260208401935060208301925050600181019050612301565b5050509392505050565b600061234b61234684612e5e565b612e0d565b90508281526020810184848401111561236357600080fd5b61236e848285612fd0565b509392505050565b6000813590506123858161340e565b92915050565b60008151905061239a8161340e565b92915050565b60008083601f8401126123b257600080fd5b8235905067ffffffffffffffff8111156123cb57600080fd5b6020830191508360208202830111156123e357600080fd5b9250929050565b600082601f8301126123fb57600080fd5b813561240b8482602086016122cc565b91505092915050565b60008083601f84011261242657600080fd5b8235905067ffffffffffffffff81111561243f57600080fd5b60208301915083602082028301111561245757600080fd5b9250929050565b60008151905061246d81613425565b92915050565b6000813590506124828161343c565b92915050565b600082601f83011261249957600080fd5b81516124a9848260208601612338565b91505092915050565b6000813590506124c181613453565b92915050565b6000815190506124d68161346a565b92915050565b6000602082840312156124ee57600080fd5b60006124fc8482850161238b565b91505092915050565b60008060006060848603121561251a57600080fd5b600061252886828701612376565b935050602061253986828701612376565b925050604061254a86828701612376565b9150509250925092565b60006020828403121561256657600080fd5b60006125748482850161245e565b91505092915050565b6000806040838503121561259057600080fd5b600061259e8582860161245e565b925050602083015167ffffffffffffffff8111156125bb57600080fd5b6125c785828601612488565b9150509250929050565b6000602082840312156125e357600080fd5b60006125f184828501612473565b91505092915050565b60008060008060008060008060c0898b03121561261657600080fd5b60006126248b828c016124b2565b985050602089013567ffffffffffffffff81111561264157600080fd5b61264d8b828c016123ea565b975050604061265e8b828c01612376565b965050606061266f8b828c01612376565b955050608089013567ffffffffffffffff81111561268c57600080fd5b6126988b828c01612414565b945094505060a089013567ffffffffffffffff8111156126b757600080fd5b6126c38b828c016123a0565b92509250509295985092959890939650565b6000602082840312156126e757600080fd5b60006126f5848285016124c7565b91505092915050565b600061270a838361272e565b60208301905092915050565b60006127228383612808565b60208301905092915050565b61273781612f2e565b82525050565b61274681612f2e565b82525050565b600061275782612eaf565b6127618185612eea565b935061276c83612e8f565b8060005b8381101561279d57815161278488826126fe565b975061278f83612ed0565b925050600181019050612770565b5085935050505092915050565b60006127b582612eba565b6127bf8185612efb565b93506127ca83612e9f565b8060005b838110156127fb5781516127e28882612716565b97506127ed83612edd565b9250506001810190506127ce565b5085935050505092915050565b61281181612f4c565b82525050565b61282081612f4c565b82525050565b61282f81612f56565b82525050565b600061284082612ec5565b61284a8185612f0c565b935061285a818560208601612fd0565b61286381613063565b840191505092915050565b61287781612fbe565b82525050565b600061288a600f83612f1d565b915061289582613074565b602082019050919050565b60006128ad601883612f1d565b91506128b88261309d565b602082019050919050565b60006128d0602483612f1d565b91506128db826130c6565b604082019050919050565b60006128f3601b83612f1d565b91506128fe82613115565b602082019050919050565b6000612916600883612f1d565b91506129218261313e565b602082019050919050565b6000612939602283612f1d565b915061294482613167565b604082019050919050565b600061295c601c83612f1d565b9150612967826131b6565b602082019050919050565b600061297f601383612f1d565b915061298a826131df565b602082019050919050565b60006129a2600a83612f1d565b91506129ad82613208565b602082019050919050565b60006129c5602883612f1d565b91506129d082613231565b604082019050919050565b60006129e8602283612f1d565b91506129f382613280565b604082019050919050565b6000612a0b601b83612f1d565b9150612a16826132cf565b602082019050919050565b6000612a2e600a83612f1d565b9150612a39826132f8565b602082019050919050565b6000612a51602683612f1d565b9150612a5c82613321565b604082019050919050565b6000612a74602883612f1d565b9150612a7f82613370565b604082019050919050565b6000612a97602683612f1d565b9150612aa2826133bf565b604082019050919050565b612ab681612fb4565b82525050565b6000602082019050612ad1600083018461273d565b92915050565b6000604082019050612aec600083018561273d565b612af9602083018461273d565b9392505050565b6000608082019050612b15600083018761273d565b612b22602083018661273d565b612b2f6040830185612aad565b612b3c606083018461273d565b95945050505050565b6000608082019050612b5a600083018761273d565b612b676020830186612817565b612b746040830185612826565b612b81606083018461273d565b95945050505050565b6000608082019050612b9f600083018761273d565b8181036020830152612bb18186612835565b9050612bc0604083018561273d565b612bcd606083018461286e565b95945050505050565b60006040820190508181036000830152612bf081856127aa565b90508181036020830152612c04818461274c565b90509392505050565b60006020820190508181036000830152612c268161287d565b9050919050565b60006020820190508181036000830152612c46816128a0565b9050919050565b60006020820190508181036000830152612c66816128c3565b9050919050565b60006020820190508181036000830152612c86816128e6565b9050919050565b60006020820190508181036000830152612ca681612909565b9050919050565b60006020820190508181036000830152612cc68161292c565b9050919050565b60006020820190508181036000830152612ce68161294f565b9050919050565b60006020820190508181036000830152612d0681612972565b9050919050565b60006020820190508181036000830152612d2681612995565b9050919050565b60006020820190508181036000830152612d46816129b8565b9050919050565b60006020820190508181036000830152612d66816129db565b9050919050565b60006020820190508181036000830152612d86816129fe565b9050919050565b60006020820190508181036000830152612da681612a21565b9050919050565b60006020820190508181036000830152612dc681612a44565b9050919050565b60006020820190508181036000830152612de681612a67565b9050919050565b60006020820190508181036000830152612e0681612a8a565b9050919050565b6000612e17612e28565b9050612e238282613003565b919050565b6000604051905090565b600067ffffffffffffffff821115612e4d57612e4c613034565b5b602082029050602081019050919050565b600067ffffffffffffffff821115612e7957612e78613034565b5b612e8282613063565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b6000612f3982612f94565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000612f8d82612f2e565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000612fc982612fb4565b9050919050565b60005b83811015612fee578082015181840152602081019050612fd3565b83811115612ffd576000848401525b50505050565b61300c82613063565b810181811067ffffffffffffffff8211171561302b5761302a613034565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f6c656e677468206d69736d617463680000000000000000000000000000000000600082015250565b7f6f6c6420756269736368656d6520656e64206661696c65640000000000000000600082015250565b7f756e7265676973746572696e6720736368656d6552656769737472617220666160008201527f696c656400000000000000000000000000000000000000000000000000000000602082015250565b7f7265676973746572696e67204964656e74697479206661696c65640000000000600082015250565b7f4944454e54495459000000000000000000000000000000000000000000000000600082015250565b7f756e7265676973746572696e672075706772616465536368656d65206661696c60008201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b7f756e7265676973746572696e6720666f726d756c61206661696c656400000000600082015250565b7f736574554249536368656d65206661696c656400000000000000000000000000600082015250565b7f474f4f44444f4c4c415200000000000000000000000000000000000000000000600082015250565b7f7265676973746572696e6720636f6d706f756e64566f74696e674d616368696e60008201527f65206661696c6564000000000000000000000000000000000000000000000000602082015250565b7f756e7265676973746572696e67206f6c6420554249536368656d65206661696c60008201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b7f6f6c6420636f6e7472616374732073697a65206d69736d617463680000000000600082015250565b7f6f6e6c79206f776e657200000000000000000000000000000000000000000000600082015250565b7f43616c6c696e67207365744e616d6553657276696365436f6e7472616374732060008201527f6661696c65640000000000000000000000000000000000000000000000000000602082015250565b7f756e7265676973746572696e672050726f746f636f6c5570677261646546757360008201527f65206661696c6564000000000000000000000000000000000000000000000000602082015250565b7f66756e6473207472616e7366657220746f206e657720756269736368656d652060008201527f6661696c65640000000000000000000000000000000000000000000000000000602082015250565b61341781612f2e565b811461342257600080fd5b50565b61342e81612f40565b811461343957600080fd5b50565b61344581612f4c565b811461345057600080fd5b50565b61345c81612f82565b811461346757600080fd5b50565b61347381612fb4565b811461347e57600080fd5b5056fea2646970667358221220fc649130ec1aee92c2d3a541d61f8486dfcb587b417e3aba9796aa04f61f09a864736f6c63430008030033",
93
- "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c80634eb70b39146100465780635c0d087b1461006257806375a2d2431461007e575b600080fd5b610060600480360381019061005b91906125d1565b61009a565b005b61007c60048036038101906100779190612505565b61009d565b005b610098600480360381019061009391906125fa565b61099d565b005b50565b6100c97f6f99860b838b0dfe59db29d8dc8be062744270ec3220b9bc644dd17e972bd73860001b61009a565b6100f57f504317b5368544e0229fbd0b940d757122448f9c7d4b72cd1d4aea1eb80181c660001b61009a565b6101217f41decebe2e3ae2efc30b410103950a3b5c22adec5d8c19592598ec496bb7008860001b61009a565b61014d7f32a3a1183016d95e4daee6a1c1db5fb54d34a101350e413ac106a4a5eaca2c2860001b61009a565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146101dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101d490612d8d565b60405180910390fd5b6102097fa4cbd9e7d4aaab96c961b0742ffc6d3f4ec38a616fa56a4bc1eeb0b6eaa7359560001b61009a565b6102357fddbf5fa5c047f2c4f0cc826a68932c385dcd84d72a35008a145e0780b7c6300860001b61009a565b6102617f5d88a7b571c175ec8e6c873c5f61bb68de4609784bed21892694b8fb263451ee60001b61009a565b61028d7fa3ebe0b4b2b33d02e5a9ecf19a69663ff1f1e08291cc047fc5f9e550c5cb15c560001b61009a565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663039de01d84600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff1660e01b815260040161030a929190612ad7565b602060405180830381600087803b15801561032457600080fd5b505af1158015610338573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061035c9190612554565b61039b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161039290612c4d565b60405180910390fd5b6103c77f75a4da7c3d83af405517463444c5412bd9db2b0ff9eca74c65e300b2b974b4de60001b61009a565b6103f37fbc8b5b7a0cce2fd87ab790738e374f9f65b1341d8c491c032d62ed9251365c6560001b61009a565b61041f7f828f970e0b04686ee47a2eccfbddfb7c202bbfc660fe437d28293a7ddcba233b60001b61009a565b61044b7f173576014d1464b88d10d1f87e745c950dcc103addb74b693920bb6003e122d360001b61009a565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663039de01d83600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff1660e01b81526004016104c8929190612ad7565b602060405180830381600087803b1580156104e257600080fd5b505af11580156104f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051a9190612554565b610559576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161055090612cad565b60405180910390fd5b6105857f2517a3b1271006bd27c20aeb410887b459d432bfd0e7d64b20fdd7707a1c13a160001b61009a565b6105b17fa4a83039dcca433c0178409d585b9aec32729fe7b33500b5121d56dd46179bf460001b61009a565b6105dd7fbe58ee543ca6ebc77d4f18789917e098219a99e7a2c724d83148fa4ce3242cdd60001b61009a565b6106097f201575b15d41ecd6e0244e7551408dd8f74b76eef4512c1b0fc591d9dc995f5360001b61009a565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e869d45f826000801b601f60e01b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518563ffffffff1660e01b81526004016106919493929190612b45565b602060405180830381600087803b1580156106ab57600080fd5b505af11580156106bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106e39190612554565b610722576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161071990612d2d565b60405180910390fd5b61074e7fd2f47bf21669fa85ab0bba9c4e049ebd73e9645548fec9c9dc0df9f559a3cf4060001b61009a565b61077a7fb9eac905e8a7c2f1bae65ac256a02d362534f04efe8d871a5dc93a1a42f12f3760001b61009a565b6107a67f730d4461029406ad2e08de23bcd8246ea25f0b42411ca4ac01423bee7be4a83060001b61009a565b6107d27f5fe0fafddd644c69ac16bb9f8c4266cc158c7b32792fd0758259f3a3b6fa152f60001b61009a565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636c525b13600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b815260040161084d9190612abc565b602060405180830381600087803b15801561086757600080fd5b505af115801561087b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061089f9190612554565b6108de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d590612dcd565b60405180910390fd5b61090a7fee0de9ebf44d4cc435496fe2ca1ae8cd328160118a8645054d3faafe0ccfa08360001b61009a565b6109367f643b6c01e7e5992f435b87fea2e59e181e6094a313ab0c577fc531811253e27d60001b61009a565b6109627fac73d7202d0b00903ae1854afc29062c1c80ab510563530b85f664899da798e160001b61009a565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16ff5b6109c97fc2825fd9763c86bdfc63de52102d4c0912d1eef522dc8ffbad2bf87863b52a2060001b61009a565b6109f57f36746936312f76142c7b4a056fd3ec9d8fe2f252b0b0b6296286adbd7f501c5060001b61009a565b610a217fb23b9587b78f39f0d394d6347efe7e758baa24b85b3440c55d41b8112d3e11f060001b61009a565b610a4d7f8fb52f82ea275f35b88b1e88a9a435688896d586682604de07e4835d9f5a103e60001b61009a565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610add576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad490612d8d565b60405180910390fd5b610b097f76f924a90660ffd781afaca761178270cc62a762af5d208f6cdbe3f24d89824e60001b61009a565b610b357f6a0a050fb7c18f35bc82a57f5f023e4c627a130602c5012f515ee9b3dd80cceb60001b61009a565b610b617f5287a839d2eb54d51ae95dfc6d0e9091b4f5160e192dde8e9355e1f336a6ff9460001b61009a565b610b8d7f4bdcda6de1ec3c7611ff34da6910c18b1bf790630c08a1c12c905cfc0958ab5260001b61009a565b818190508484905014610bd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bcc90612c0d565b60405180910390fd5b610c017f840cc7cddc926f229f0eb993890c7f113929b07dbe7de7683de26cd0035ab1b160001b61009a565b610c2d7fda471798f0b7e33c47552540ca3ad99096390cb259aeab25ad3d5d0274e6bef660001b61009a565b610c597f40d98f1e3bd30fdf9eb0046e66e1b131d26126ba7097319e5e764395e35922b760001b61009a565b610c857fc72d4032d3b486d19984d226568ce4224392e65e0babc0a9ac24b066069b23db60001b61009a565b6004875114610cc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc090612d6d565b60405180910390fd5b610cf57fa0e3a7728322302ead4ee50bda6f840bc844651c0fbac3598801463b538914f160001b61009a565b610d217fbcb53111df07d65716f7d37ed853349255f4303041714b3144b41fd8fa4f618a60001b61009a565b610d4d7f906b7b33fb9991687c8989e27701dd46341cf7355ab8cab37e73b2b2faa2c02e60001b61009a565b610dda87600281518110610d8a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101518689600381518110610dcd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516113d9565b610e067f08bd47c89ae48cba9655c4b3049a989e5a9be7b4165010dc21d3b55e4c773ada60001b61009a565b610e327f5c104ab8f8ab57b2e9d3c0b38766a7b387906e98862cd67987300ccd97c25aaf60001b61009a565b610ebf88858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050611fe4565b610eeb7ff0d321d1b7dd2c118a4ee6611e18955fc9f3adc46400a3f7a3edf1f606580d7660001b61009a565b610f177f827879f8ebbd0e918c254f258e4b72a596a37005e00bac85ce30b41089283dca60001b61009a565b610f437fbd9de88a28aa423253c2e8c63b72b1fe6e846709af1dca03235b94bee1cc628660001b61009a565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e869d45f8973ffffffffffffffffffffffffffffffffffffffff1663bf40fac16040518163ffffffff1660e01b8152600401610fb690612c8d565b60206040518083038186803b158015610fce57600080fd5b505afa158015610fe2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061100691906124dc565b6000801b600160e01b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518563ffffffff1660e01b81526004016110519493929190612b45565b602060405180830381600087803b15801561106b57600080fd5b505af115801561107f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110a39190612554565b6110e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d990612c6d565b60405180910390fd5b61110e7f326789d0b63d4edc88ee00ab696bdefa6d855ff7a8ae93e6a280336fa6760f7560001b61009a565b61113a7fc98ae6a1243cd38cec67850a0e3eef8824fbe35dd4a3bc2db5341085ec6d71a860001b61009a565b6111667f54e940803a43fbb0a56659116d1bbdf89b77ef2bce448fdd8f68ebd1e94be25260001b61009a565b6111927f90f82887e95664784667f2d5513d40bf67533e5cf2d38a789e7e4f0753c1c91660001b61009a565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663039de01d8973ffffffffffffffffffffffffffffffffffffffff1663bf40fac16040518163ffffffff1660e01b815260040161120590612d0d565b60206040518083038186803b15801561121d57600080fd5b505afa158015611231573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061125591906124dc565b73ffffffffffffffffffffffffffffffffffffffff16634b75f54f6040518163ffffffff1660e01b815260040160206040518083038186803b15801561129a57600080fd5b505afa1580156112ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112d291906124dc565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff1660e01b8152600401611312929190612ad7565b602060405180830381600087803b15801561132c57600080fd5b505af1158015611340573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113649190612554565b6113a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139a90612ccd565b60405180910390fd5b6113cf7f1b942dbfce2b6c69e5493d952a55086fbb133c33d8578e807c160317cac8bd5360001b61009a565b5050505050505050565b6114057fc9bbb0c1b25ec09bec0a632a2608c7f69804d5ac52ce5a50c937e81e8edd124b60001b61009a565b6114317f8a5d15b0b3df417400e4e3280462aa1e91dd6b5791ebf7fc3e99cb67a65d75f860001b61009a565b61145d7f59d7e2d9a2f3b431ddb48f817ad77f61304e68aa255bd67776e4d3022623004b60001b61009a565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e1758bd86040518163ffffffff1660e01b815260040160206040518083038186803b1580156114c757600080fd5b505afa1580156114db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114ff91906124dc565b905061152d7fc4436dcc3f9fa87627a62e75d90fbae12deecb15bff72762b8447f96ceb90ad060001b61009a565b6115597fdc4fbff900ec126c1f2f47549f397b14b143204d6e2d7ada4d5eaf39c59e7b2160001b61009a565b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231866040518263ffffffff1660e01b81526004016115949190612abc565b60206040518083038186803b1580156115ac57600080fd5b505afa1580156115c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115e491906126d5565b90506116127f7700d23f9ac835d2a386639a5303daeb50af4bca30c67cb510cb31602182584860001b61009a565b61163e7f888e9bafaed318462a8ef7729902043058e273f1290f7f2e517b0d70afa70f3660001b61009a565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d1b7089a858760405160240161168f9190612abc565b6040516020818303038152906040527f2c336822000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660006040518563ffffffff1660e01b81526004016117509493929190612b8a565b600060405180830381600087803b15801561176a57600080fd5b505af115801561177e573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906117a7919061257d565b5090506117d67f2e2670c3e97f77a29a34632d22d9a04b0b4b05c7132575eba99659081a56c5b360001b61009a565b6118027ff3f17106ff1277cc35937f30fb5e1f4f952c92b6810e17d6477eac6426e9438c60001b61009a565b61182e7fd223089d169c6bdb0cb795964457449827371183fc80cad0c2c90fb88b94bcb560001b61009a565b8061186e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186590612ced565b60405180910390fd5b61189a7fd0b9bf288479c895e544d90058fbf95bde0012fc4da4657ceec56bbeb07f07a760001b61009a565b6118c67fd9707e0ca237c838d2acf7ea9e2fe2a684f878529d0a59f2c472c4196db4fc3460001b61009a565b6118f27f07af66a7809c16f837d6174ed0778435e2d64b5209e8ca6c4eabae7ecdf8a24f60001b61009a565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d1b7089a876040516024016040516020818303038152906040527fefbe1c1c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660006040518563ffffffff1660e01b81526004016119f69493929190612b8a565b600060405180830381600087803b158015611a1057600080fd5b505af1158015611a24573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611a4d919061257d565b5080915050611a7e7f50c7f62b48327224bc4b6dec9eb18c03f2ceb88abb00bbb19612165cbd95a97160001b61009a565b611aaa7f4e42537547564dbc40411c8f94bcb2810ca005cebe21d5fd079887cb90ddfbcf60001b61009a565b611ad67f8e639255616509529c1d3d618ec4b6f65f00120fbff1a154c3822f71ddade9b560001b61009a565b80611b16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0d90612c2d565b60405180910390fd5b611b427f5749f8b0985695721a3bcdddfba40694cc25b5f4b6a6e98f489ecc195177cb0760001b61009a565b611b6e7f309342aeef7bc73123bf6b8f1def6eb6557575bc2afb20c47c8e17b1a9903afb60001b61009a565b611b9a7f1afef01c7d5e47f77e99e03281c8246041338f49d5d638f8c2ccde06f316f08e60001b61009a565b611bc67fd13b2b4a932275dd11d6e1ae063fc161d92d6044a68cb2f529be646c56cb58c560001b61009a565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663039de01d87600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff1660e01b8152600401611c43929190612ad7565b602060405180830381600087803b158015611c5d57600080fd5b505af1158015611c71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c959190612554565b611cd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ccb90612d4d565b60405180910390fd5b611d007f8b2822f4b530221f117ae5e75aeccadeb9be6c0eb908c43ba7271b2816b0eb3060001b61009a565b611d2c7f959cc9f4f009a7619f80f3ae5db35a3f92b24dd918b659c2625a1d21a2e1257e60001b61009a565b611d587fcd700c9215ecb350510713a2bbbf9c3c17e22eabec00eb36ca06bb5f419185da60001b61009a565b6000821115611faf57611d8d7f1dec6e22581505b1fb6e910e158193433ba5ceff8ae539f89d565525e522691460001b61009a565b611db97f5e61662526c99ed38ca992b9a8790755544dd379742720593ac92b8f53ec482760001b61009a565b611de57f2d8cb3925fe11b1ad70770935097552bffc3edfc341df2362798fabc2ca6505560001b61009a565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b9a04cdd848785600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518563ffffffff1660e01b8152600401611e669493929190612b00565b602060405180830381600087803b158015611e8057600080fd5b505af1158015611e94573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611eb89190612554565b9050611ee67fcaa51136be1db5064f4c944c7b178d1c401afe76f244c03f5d5d23cfea33baa560001b61009a565b611f127f0ad30f12bffad3ef0c26114541e0e8e4b7d086de8c4914bdaf13004c0482548a60001b61009a565b611f3e7f68bb2363df6e19e67e2dea37179a0b92fbb9e3381bcd4cbe54cc457cf741aaf360001b61009a565b80611f7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7590612ded565b60405180910390fd5b611faa7fa4063197ef21012d5447aff84e86ab304ac1b93e2e0e1ef45f484ea49a2039a460001b61009a565b611fdc565b611fdb7fb42f941166466241fba7666f12a94289e892b4f99191066da1ae971b5310091760001b61009a565b5b505050505050565b6120107fcd5587172520f7a61a9dfad8a8b89adb8920d346720d652b0857d6c0c5326a4760001b61009a565b61203c7fcb479892d9b23bbd77ccbbef5c44dabd5e251ad04de434740cb853e35424dc5160001b61009a565b6120687fd2bd89b720b5b86dbc700680f4a11333bb3616a2d0c51754c944a623577572ca60001b61009a565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d1b7089a8585856040516024016120bb929190612bd6565b6040516020818303038152906040527f4ab01f5b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660006040518563ffffffff1660e01b815260040161217c9493929190612b8a565b600060405180830381600087803b15801561219657600080fd5b505af11580156121aa573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906121d3919061257d565b5090506122027ff0b480e995e483a27b1f9260f435b61d6f20666a73da9e0d7a910913ebdeae0560001b61009a565b61222e7f88f0c68c8111b1cc2e6c0d5852a0e0b6a386ac822a86737ca5caa2a4f819f1fd60001b61009a565b61225a7f1baa686bae970f6953c8b0c9d18565bcd6ddf74319e4cb3493a42b1ed1ec44b560001b61009a565b8061229a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229190612dad565b60405180910390fd5b6122c67f2d1acba28a153ff4a16d64efa5b6e015e6c8734d596a97a54a051eca6b433d7d60001b61009a565b50505050565b60006122df6122da84612e32565b612e0d565b905080838252602082019050828560208602820111156122fe57600080fd5b60005b8581101561232e57816123148882612376565b845260208401935060208301925050600181019050612301565b5050509392505050565b600061234b61234684612e5e565b612e0d565b90508281526020810184848401111561236357600080fd5b61236e848285612fd0565b509392505050565b6000813590506123858161340e565b92915050565b60008151905061239a8161340e565b92915050565b60008083601f8401126123b257600080fd5b8235905067ffffffffffffffff8111156123cb57600080fd5b6020830191508360208202830111156123e357600080fd5b9250929050565b600082601f8301126123fb57600080fd5b813561240b8482602086016122cc565b91505092915050565b60008083601f84011261242657600080fd5b8235905067ffffffffffffffff81111561243f57600080fd5b60208301915083602082028301111561245757600080fd5b9250929050565b60008151905061246d81613425565b92915050565b6000813590506124828161343c565b92915050565b600082601f83011261249957600080fd5b81516124a9848260208601612338565b91505092915050565b6000813590506124c181613453565b92915050565b6000815190506124d68161346a565b92915050565b6000602082840312156124ee57600080fd5b60006124fc8482850161238b565b91505092915050565b60008060006060848603121561251a57600080fd5b600061252886828701612376565b935050602061253986828701612376565b925050604061254a86828701612376565b9150509250925092565b60006020828403121561256657600080fd5b60006125748482850161245e565b91505092915050565b6000806040838503121561259057600080fd5b600061259e8582860161245e565b925050602083015167ffffffffffffffff8111156125bb57600080fd5b6125c785828601612488565b9150509250929050565b6000602082840312156125e357600080fd5b60006125f184828501612473565b91505092915050565b60008060008060008060008060c0898b03121561261657600080fd5b60006126248b828c016124b2565b985050602089013567ffffffffffffffff81111561264157600080fd5b61264d8b828c016123ea565b975050604061265e8b828c01612376565b965050606061266f8b828c01612376565b955050608089013567ffffffffffffffff81111561268c57600080fd5b6126988b828c01612414565b945094505060a089013567ffffffffffffffff8111156126b757600080fd5b6126c38b828c016123a0565b92509250509295985092959890939650565b6000602082840312156126e757600080fd5b60006126f5848285016124c7565b91505092915050565b600061270a838361272e565b60208301905092915050565b60006127228383612808565b60208301905092915050565b61273781612f2e565b82525050565b61274681612f2e565b82525050565b600061275782612eaf565b6127618185612eea565b935061276c83612e8f565b8060005b8381101561279d57815161278488826126fe565b975061278f83612ed0565b925050600181019050612770565b5085935050505092915050565b60006127b582612eba565b6127bf8185612efb565b93506127ca83612e9f565b8060005b838110156127fb5781516127e28882612716565b97506127ed83612edd565b9250506001810190506127ce565b5085935050505092915050565b61281181612f4c565b82525050565b61282081612f4c565b82525050565b61282f81612f56565b82525050565b600061284082612ec5565b61284a8185612f0c565b935061285a818560208601612fd0565b61286381613063565b840191505092915050565b61287781612fbe565b82525050565b600061288a600f83612f1d565b915061289582613074565b602082019050919050565b60006128ad601883612f1d565b91506128b88261309d565b602082019050919050565b60006128d0602483612f1d565b91506128db826130c6565b604082019050919050565b60006128f3601b83612f1d565b91506128fe82613115565b602082019050919050565b6000612916600883612f1d565b91506129218261313e565b602082019050919050565b6000612939602283612f1d565b915061294482613167565b604082019050919050565b600061295c601c83612f1d565b9150612967826131b6565b602082019050919050565b600061297f601383612f1d565b915061298a826131df565b602082019050919050565b60006129a2600a83612f1d565b91506129ad82613208565b602082019050919050565b60006129c5602883612f1d565b91506129d082613231565b604082019050919050565b60006129e8602283612f1d565b91506129f382613280565b604082019050919050565b6000612a0b601b83612f1d565b9150612a16826132cf565b602082019050919050565b6000612a2e600a83612f1d565b9150612a39826132f8565b602082019050919050565b6000612a51602683612f1d565b9150612a5c82613321565b604082019050919050565b6000612a74602883612f1d565b9150612a7f82613370565b604082019050919050565b6000612a97602683612f1d565b9150612aa2826133bf565b604082019050919050565b612ab681612fb4565b82525050565b6000602082019050612ad1600083018461273d565b92915050565b6000604082019050612aec600083018561273d565b612af9602083018461273d565b9392505050565b6000608082019050612b15600083018761273d565b612b22602083018661273d565b612b2f6040830185612aad565b612b3c606083018461273d565b95945050505050565b6000608082019050612b5a600083018761273d565b612b676020830186612817565b612b746040830185612826565b612b81606083018461273d565b95945050505050565b6000608082019050612b9f600083018761273d565b8181036020830152612bb18186612835565b9050612bc0604083018561273d565b612bcd606083018461286e565b95945050505050565b60006040820190508181036000830152612bf081856127aa565b90508181036020830152612c04818461274c565b90509392505050565b60006020820190508181036000830152612c268161287d565b9050919050565b60006020820190508181036000830152612c46816128a0565b9050919050565b60006020820190508181036000830152612c66816128c3565b9050919050565b60006020820190508181036000830152612c86816128e6565b9050919050565b60006020820190508181036000830152612ca681612909565b9050919050565b60006020820190508181036000830152612cc68161292c565b9050919050565b60006020820190508181036000830152612ce68161294f565b9050919050565b60006020820190508181036000830152612d0681612972565b9050919050565b60006020820190508181036000830152612d2681612995565b9050919050565b60006020820190508181036000830152612d46816129b8565b9050919050565b60006020820190508181036000830152612d66816129db565b9050919050565b60006020820190508181036000830152612d86816129fe565b9050919050565b60006020820190508181036000830152612da681612a21565b9050919050565b60006020820190508181036000830152612dc681612a44565b9050919050565b60006020820190508181036000830152612de681612a67565b9050919050565b60006020820190508181036000830152612e0681612a8a565b9050919050565b6000612e17612e28565b9050612e238282613003565b919050565b6000604051905090565b600067ffffffffffffffff821115612e4d57612e4c613034565b5b602082029050602081019050919050565b600067ffffffffffffffff821115612e7957612e78613034565b5b612e8282613063565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b6000612f3982612f94565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000612f8d82612f2e565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000612fc982612fb4565b9050919050565b60005b83811015612fee578082015181840152602081019050612fd3565b83811115612ffd576000848401525b50505050565b61300c82613063565b810181811067ffffffffffffffff8211171561302b5761302a613034565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f6c656e677468206d69736d617463680000000000000000000000000000000000600082015250565b7f6f6c6420756269736368656d6520656e64206661696c65640000000000000000600082015250565b7f756e7265676973746572696e6720736368656d6552656769737472617220666160008201527f696c656400000000000000000000000000000000000000000000000000000000602082015250565b7f7265676973746572696e67204964656e74697479206661696c65640000000000600082015250565b7f4944454e54495459000000000000000000000000000000000000000000000000600082015250565b7f756e7265676973746572696e672075706772616465536368656d65206661696c60008201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b7f756e7265676973746572696e6720666f726d756c61206661696c656400000000600082015250565b7f736574554249536368656d65206661696c656400000000000000000000000000600082015250565b7f474f4f44444f4c4c415200000000000000000000000000000000000000000000600082015250565b7f7265676973746572696e6720636f6d706f756e64566f74696e674d616368696e60008201527f65206661696c6564000000000000000000000000000000000000000000000000602082015250565b7f756e7265676973746572696e67206f6c6420554249536368656d65206661696c60008201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b7f6f6c6420636f6e7472616374732073697a65206d69736d617463680000000000600082015250565b7f6f6e6c79206f776e657200000000000000000000000000000000000000000000600082015250565b7f43616c6c696e67207365744e616d6553657276696365436f6e7472616374732060008201527f6661696c65640000000000000000000000000000000000000000000000000000602082015250565b7f756e7265676973746572696e672050726f746f636f6c5570677261646546757360008201527f65206661696c6564000000000000000000000000000000000000000000000000602082015250565b7f66756e6473207472616e7366657220746f206e657720756269736368656d652060008201527f6661696c65640000000000000000000000000000000000000000000000000000602082015250565b61341781612f2e565b811461342257600080fd5b50565b61342e81612f40565b811461343957600080fd5b50565b61344581612f4c565b811461345057600080fd5b50565b61345c81612f82565b811461346757600080fd5b50565b61347381612fb4565b811461347e57600080fd5b5056fea2646970667358221220fc649130ec1aee92c2d3a541d61f8486dfcb587b417e3aba9796aa04f61f09a864736f6c63430008030033",
92
+ "bytecode": "0x60806040523480156200001157600080fd5b5060405162003b3038038062003b3083398181016040528101906200003791906200036a565b6200006b7f5aca5fbc38f97deffe5b568666b75ae0cca436b09f19a47fd0af39c092bcca2260001b6200030d60201b60201c565b6200009f7f127c7111204f5dac07b9455059da289f5c99a5927847fc74517e4d5a546f193460001b6200030d60201b60201c565b620000d37f9f3c86bdb895d68a7dcb806e3a2a9f49634f224ccce615c59eff41d92565153460001b6200030d60201b60201c565b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620001477f9e41da728359fdca4d06771742bf17a95fa737dd26347c0285f7a0b02c3e134e60001b6200030d60201b60201c565b6200017b7f8b80e7f48cfcc6ad7d88307edecfdcdb5e1592fb0aaec7899f14b34f2e009e9060001b6200030d60201b60201c565b33600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620001f07ff7c22efe342b6e585ec0c5a60c305932e15ecc7f5fae850546fce4e96980be0160001b6200030d60201b60201c565b620002247f8bfc5924e872ee103467b92cd92000a65dd6aa13edb61837b8ec2b9c397e6f2960001b6200030d60201b60201c565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635aef7de66040518163ffffffff1660e01b815260040160206040518083038186803b1580156200028b57600080fd5b505afa158015620002a0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002c691906200033e565b600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505062000412565b50565b6000815190506200032181620003de565b92915050565b6000815190506200033881620003f8565b92915050565b6000602082840312156200035157600080fd5b6000620003618482850162000310565b91505092915050565b6000602082840312156200037d57600080fd5b60006200038d8482850162000327565b91505092915050565b6000620003a382620003be565b9050919050565b6000620003b78262000396565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b620003e98162000396565b8114620003f557600080fd5b50565b6200040381620003aa565b81146200040f57600080fd5b50565b61370e80620004226000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80634eb70b39146100465780635c0d087b1461006257806375a2d2431461007e575b600080fd5b610060600480360381019061005b91906127bc565b61009a565b005b61007c600480360381019061007791906126f0565b61009d565b005b610098600480360381019061009391906127e5565b610b88565b005b50565b6100c97f309342aeef7bc73123bf6b8f1def6eb6557575bc2afb20c47c8e17b1a9903afb60001b61009a565b6100f57f1afef01c7d5e47f77e99e03281c8246041338f49d5d638f8c2ccde06f316f08e60001b61009a565b6101217fd13b2b4a932275dd11d6e1ae063fc161d92d6044a68cb2f529be646c56cb58c560001b61009a565b61014d7f8b2822f4b530221f117ae5e75aeccadeb9be6c0eb908c43ba7271b2816b0eb3060001b61009a565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146101dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101d490612f9b565b60405180910390fd5b6102097f959cc9f4f009a7619f80f3ae5db35a3f92b24dd918b659c2625a1d21a2e1257e60001b61009a565b6102357fcd700c9215ecb350510713a2bbbf9c3c17e22eabec00eb36ca06bb5f419185da60001b61009a565b6102617f1dec6e22581505b1fb6e910e158193433ba5ceff8ae539f89d565525e522691460001b61009a565b61028d7f5e61662526c99ed38ca992b9a8790755544dd379742720593ac92b8f53ec482760001b61009a565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663039de01d84600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff1660e01b815260040161030a929190612ce5565b602060405180830381600087803b15801561032457600080fd5b505af1158015610338573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061035c919061273f565b61039b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161039290612e5b565b60405180910390fd5b6103c77f2d8cb3925fe11b1ad70770935097552bffc3edfc341df2362798fabc2ca6505560001b61009a565b6103f37fcaa51136be1db5064f4c944c7b178d1c401afe76f244c03f5d5d23cfea33baa560001b61009a565b61041f7f0ad30f12bffad3ef0c26114541e0e8e4b7d086de8c4914bdaf13004c0482548a60001b61009a565b61044b7f68bb2363df6e19e67e2dea37179a0b92fbb9e3381bcd4cbe54cc457cf741aaf360001b61009a565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663039de01d83600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff1660e01b81526004016104c8929190612ce5565b602060405180830381600087803b1580156104e257600080fd5b505af11580156104f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051a919061273f565b610559576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161055090612ebb565b60405180910390fd5b6105857fa4063197ef21012d5447aff84e86ab304ac1b93e2e0e1ef45f484ea49a2039a460001b61009a565b6105b17fb42f941166466241fba7666f12a94289e892b4f99191066da1ae971b5310091760001b61009a565b6105dd7f6f99860b838b0dfe59db29d8dc8be062744270ec3220b9bc644dd17e972bd73860001b61009a565b6106097f504317b5368544e0229fbd0b940d757122448f9c7d4b72cd1d4aea1eb80181c660001b61009a565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e869d45f826000801b601f60e01b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518563ffffffff1660e01b81526004016106919493929190612d53565b602060405180830381600087803b1580156106ab57600080fd5b505af11580156106bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106e3919061273f565b610722576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161071990612f3b565b60405180910390fd5b61074e7f41decebe2e3ae2efc30b410103950a3b5c22adec5d8c19592598ec496bb7008860001b61009a565b61077a7f32a3a1183016d95e4daee6a1c1db5fb54d34a101350e413ac106a4a5eaca2c2860001b61009a565b6107a67fa4cbd9e7d4aaab96c961b0742ffc6d3f4ec38a616fa56a4bc1eeb0b6eaa7359560001b61009a565b6107d27fddbf5fa5c047f2c4f0cc826a68932c385dcd84d72a35008a145e0780b7c6300860001b61009a565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e869d45f600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000801b601f60e01b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518563ffffffff1660e01b815260040161087c9493929190612d53565b602060405180830381600087803b15801561089657600080fd5b505af11580156108aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ce919061273f565b61090d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090490612fbb565b60405180910390fd5b6109397f5d88a7b571c175ec8e6c873c5f61bb68de4609784bed21892694b8fb263451ee60001b61009a565b6109657fa3ebe0b4b2b33d02e5a9ecf19a69663ff1f1e08291cc047fc5f9e550c5cb15c560001b61009a565b6109917f75a4da7c3d83af405517463444c5412bd9db2b0ff9eca74c65e300b2b974b4de60001b61009a565b6109bd7fbc8b5b7a0cce2fd87ab790738e374f9f65b1341d8c491c032d62ed9251365c6560001b61009a565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636c525b13600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401610a389190612cca565b602060405180830381600087803b158015610a5257600080fd5b505af1158015610a66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a8a919061273f565b610ac9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac090612ffb565b60405180910390fd5b610af57f828f970e0b04686ee47a2eccfbddfb7c202bbfc660fe437d28293a7ddcba233b60001b61009a565b610b217f173576014d1464b88d10d1f87e745c950dcc103addb74b693920bb6003e122d360001b61009a565b610b4d7f2517a3b1271006bd27c20aeb410887b459d432bfd0e7d64b20fdd7707a1c13a160001b61009a565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16ff5b610bb47f10fbdfe920ab2b62c3740117afce7c546df302476cf20bbdf993c779b6e4420760001b61009a565b610be07f81790c8c4fe01b9c7d78166f32b933ec8110c1896d498ea8fe2c14667dc4768060001b61009a565b610c0c7f1f06256a89afab52e569770119b7455723d150201dd4288a1755ad47fff9b50960001b61009a565b610c387fc7dd0304c7cb41d46447e2260f68593d1a7d13163dbb3048836052649bfdd22560001b61009a565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610cc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbf90612f9b565b60405180910390fd5b610cf47ffcf94c7ce210fb757d7658b8b95990ede5448edfd6dceed516a81261522656c360001b61009a565b610d207f03bd12088888a9074ba6efb18277d1d3c379afc6628a7476666d74785118b9d260001b61009a565b610d4c7fef15df308fe03da9affbec511c33b38439b6ef1cccbcd93d6f5021ed02171a3a60001b61009a565b610d787f8c42f5e355865ee700fb4f5f64f3c0a68ca7a8423e71d04ddf2437abac3ee7d660001b61009a565b818190508484905014610dc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db790612e1b565b60405180910390fd5b610dec7f377d321c6ef0a25d17af4a5d304dac012ab801233fbd5a1f07051c779d90dd8260001b61009a565b610e187fbc3b16e057120003a6d2666bca3ae611f6eb4b50ff73418724e166edc1baa01460001b61009a565b610e447f59bf6103067e9fd432d140fcdcbddf4b71c525bd45362006ec09d74b6be4aa2c60001b61009a565b610e707f6c40c2b95c31660d37c4b34c046b80defcdc1f312c19f30dfeccf1fb70c6a4aa60001b61009a565b6004875114610eb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eab90612f7b565b60405180910390fd5b610ee07f322b4a5f14757189c9e8b9f88d63dc6ea237d9ea62cd9a8ec365477824f10cd560001b61009a565b610f0c7f6b37c4ad3598c12ce7193b6712e66a6a638297da896ae9d6b8750836ae4b108460001b61009a565b610f387fc2825fd9763c86bdfc63de52102d4c0912d1eef522dc8ffbad2bf87863b52a2060001b61009a565b610fc587600281518110610f75577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101518689600381518110610fb8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516115c4565b610ff17f36746936312f76142c7b4a056fd3ec9d8fe2f252b0b0b6296286adbd7f501c5060001b61009a565b61101d7fb23b9587b78f39f0d394d6347efe7e758baa24b85b3440c55d41b8112d3e11f060001b61009a565b6110aa88858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050506121cf565b6110d67f8fb52f82ea275f35b88b1e88a9a435688896d586682604de07e4835d9f5a103e60001b61009a565b6111027f76f924a90660ffd781afaca761178270cc62a762af5d208f6cdbe3f24d89824e60001b61009a565b61112e7f6a0a050fb7c18f35bc82a57f5f023e4c627a130602c5012f515ee9b3dd80cceb60001b61009a565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e869d45f8973ffffffffffffffffffffffffffffffffffffffff1663bf40fac16040518163ffffffff1660e01b81526004016111a190612e9b565b60206040518083038186803b1580156111b957600080fd5b505afa1580156111cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111f191906126c7565b6000801b600160e01b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518563ffffffff1660e01b815260040161123c9493929190612d53565b602060405180830381600087803b15801561125657600080fd5b505af115801561126a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061128e919061273f565b6112cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c490612e7b565b60405180910390fd5b6112f97f5287a839d2eb54d51ae95dfc6d0e9091b4f5160e192dde8e9355e1f336a6ff9460001b61009a565b6113257f4bdcda6de1ec3c7611ff34da6910c18b1bf790630c08a1c12c905cfc0958ab5260001b61009a565b6113517f840cc7cddc926f229f0eb993890c7f113929b07dbe7de7683de26cd0035ab1b160001b61009a565b61137d7fda471798f0b7e33c47552540ca3ad99096390cb259aeab25ad3d5d0274e6bef660001b61009a565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663039de01d8973ffffffffffffffffffffffffffffffffffffffff1663bf40fac16040518163ffffffff1660e01b81526004016113f090612f1b565b60206040518083038186803b15801561140857600080fd5b505afa15801561141c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061144091906126c7565b73ffffffffffffffffffffffffffffffffffffffff16634b75f54f6040518163ffffffff1660e01b815260040160206040518083038186803b15801561148557600080fd5b505afa158015611499573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114bd91906126c7565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff1660e01b81526004016114fd929190612ce5565b602060405180830381600087803b15801561151757600080fd5b505af115801561152b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061154f919061273f565b61158e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158590612edb565b60405180910390fd5b6115ba7f40d98f1e3bd30fdf9eb0046e66e1b131d26126ba7097319e5e764395e35922b760001b61009a565b5050505050505050565b6115f07fc72d4032d3b486d19984d226568ce4224392e65e0babc0a9ac24b066069b23db60001b61009a565b61161c7fa0e3a7728322302ead4ee50bda6f840bc844651c0fbac3598801463b538914f160001b61009a565b6116487fbcb53111df07d65716f7d37ed853349255f4303041714b3144b41fd8fa4f618a60001b61009a565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e1758bd86040518163ffffffff1660e01b815260040160206040518083038186803b1580156116b257600080fd5b505afa1580156116c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116ea91906126c7565b90506117187f906b7b33fb9991687c8989e27701dd46341cf7355ab8cab37e73b2b2faa2c02e60001b61009a565b6117447f08bd47c89ae48cba9655c4b3049a989e5a9be7b4165010dc21d3b55e4c773ada60001b61009a565b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231866040518263ffffffff1660e01b815260040161177f9190612cca565b60206040518083038186803b15801561179757600080fd5b505afa1580156117ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117cf91906128c0565b90506117fd7f5c104ab8f8ab57b2e9d3c0b38766a7b387906e98862cd67987300ccd97c25aaf60001b61009a565b6118297ff0d321d1b7dd2c118a4ee6611e18955fc9f3adc46400a3f7a3edf1f606580d7660001b61009a565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d1b7089a858760405160240161187a9190612cca565b6040516020818303038152906040527f2c336822000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660006040518563ffffffff1660e01b815260040161193b9493929190612d98565b600060405180830381600087803b15801561195557600080fd5b505af1158015611969573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906119929190612768565b5090506119c17f827879f8ebbd0e918c254f258e4b72a596a37005e00bac85ce30b41089283dca60001b61009a565b6119ed7fbd9de88a28aa423253c2e8c63b72b1fe6e846709af1dca03235b94bee1cc628660001b61009a565b611a197f326789d0b63d4edc88ee00ab696bdefa6d855ff7a8ae93e6a280336fa6760f7560001b61009a565b80611a59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5090612efb565b60405180910390fd5b611a857fc98ae6a1243cd38cec67850a0e3eef8824fbe35dd4a3bc2db5341085ec6d71a860001b61009a565b611ab17f54e940803a43fbb0a56659116d1bbdf89b77ef2bce448fdd8f68ebd1e94be25260001b61009a565b611add7f90f82887e95664784667f2d5513d40bf67533e5cf2d38a789e7e4f0753c1c91660001b61009a565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d1b7089a876040516024016040516020818303038152906040527fefbe1c1c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660006040518563ffffffff1660e01b8152600401611be19493929190612d98565b600060405180830381600087803b158015611bfb57600080fd5b505af1158015611c0f573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611c389190612768565b5080915050611c697f1b942dbfce2b6c69e5493d952a55086fbb133c33d8578e807c160317cac8bd5360001b61009a565b611c957fc9bbb0c1b25ec09bec0a632a2608c7f69804d5ac52ce5a50c937e81e8edd124b60001b61009a565b611cc17f8a5d15b0b3df417400e4e3280462aa1e91dd6b5791ebf7fc3e99cb67a65d75f860001b61009a565b80611d01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf890612e3b565b60405180910390fd5b611d2d7f59d7e2d9a2f3b431ddb48f817ad77f61304e68aa255bd67776e4d3022623004b60001b61009a565b611d597fc4436dcc3f9fa87627a62e75d90fbae12deecb15bff72762b8447f96ceb90ad060001b61009a565b611d857fdc4fbff900ec126c1f2f47549f397b14b143204d6e2d7ada4d5eaf39c59e7b2160001b61009a565b611db17f7700d23f9ac835d2a386639a5303daeb50af4bca30c67cb510cb31602182584860001b61009a565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663039de01d87600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff1660e01b8152600401611e2e929190612ce5565b602060405180830381600087803b158015611e4857600080fd5b505af1158015611e5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e80919061273f565b611ebf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eb690612f5b565b60405180910390fd5b611eeb7f888e9bafaed318462a8ef7729902043058e273f1290f7f2e517b0d70afa70f3660001b61009a565b611f177f2e2670c3e97f77a29a34632d22d9a04b0b4b05c7132575eba99659081a56c5b360001b61009a565b611f437ff3f17106ff1277cc35937f30fb5e1f4f952c92b6810e17d6477eac6426e9438c60001b61009a565b600082111561219a57611f787fd223089d169c6bdb0cb795964457449827371183fc80cad0c2c90fb88b94bcb560001b61009a565b611fa47fd0b9bf288479c895e544d90058fbf95bde0012fc4da4657ceec56bbeb07f07a760001b61009a565b611fd07fd9707e0ca237c838d2acf7ea9e2fe2a684f878529d0a59f2c472c4196db4fc3460001b61009a565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b9a04cdd848785600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518563ffffffff1660e01b81526004016120519493929190612d0e565b602060405180830381600087803b15801561206b57600080fd5b505af115801561207f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120a3919061273f565b90506120d17f07af66a7809c16f837d6174ed0778435e2d64b5209e8ca6c4eabae7ecdf8a24f60001b61009a565b6120fd7f50c7f62b48327224bc4b6dec9eb18c03f2ceb88abb00bbb19612165cbd95a97160001b61009a565b6121297f4e42537547564dbc40411c8f94bcb2810ca005cebe21d5fd079887cb90ddfbcf60001b61009a565b80612169576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121609061301b565b60405180910390fd5b6121957f8e639255616509529c1d3d618ec4b6f65f00120fbff1a154c3822f71ddade9b560001b61009a565b6121c7565b6121c67f5749f8b0985695721a3bcdddfba40694cc25b5f4b6a6e98f489ecc195177cb0760001b61009a565b5b505050505050565b6121fb7fa4a83039dcca433c0178409d585b9aec32729fe7b33500b5121d56dd46179bf460001b61009a565b6122277fbe58ee543ca6ebc77d4f18789917e098219a99e7a2c724d83148fa4ce3242cdd60001b61009a565b6122537f201575b15d41ecd6e0244e7551408dd8f74b76eef4512c1b0fc591d9dc995f5360001b61009a565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d1b7089a8585856040516024016122a6929190612de4565b6040516020818303038152906040527f4ab01f5b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660006040518563ffffffff1660e01b81526004016123679493929190612d98565b600060405180830381600087803b15801561238157600080fd5b505af1158015612395573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906123be9190612768565b5090506123ed7fd2f47bf21669fa85ab0bba9c4e049ebd73e9645548fec9c9dc0df9f559a3cf4060001b61009a565b6124197fb9eac905e8a7c2f1bae65ac256a02d362534f04efe8d871a5dc93a1a42f12f3760001b61009a565b6124457f730d4461029406ad2e08de23bcd8246ea25f0b42411ca4ac01423bee7be4a83060001b61009a565b80612485576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247c90612fdb565b60405180910390fd5b6124b17f5fe0fafddd644c69ac16bb9f8c4266cc158c7b32792fd0758259f3a3b6fa152f60001b61009a565b50505050565b60006124ca6124c584613060565b61303b565b905080838252602082019050828560208602820111156124e957600080fd5b60005b8581101561251957816124ff8882612561565b8452602084019350602083019250506001810190506124ec565b5050509392505050565b60006125366125318461308c565b61303b565b90508281526020810184848401111561254e57600080fd5b6125598482856131fe565b509392505050565b60008135905061257081613665565b92915050565b60008151905061258581613665565b92915050565b60008083601f84011261259d57600080fd5b8235905067ffffffffffffffff8111156125b657600080fd5b6020830191508360208202830111156125ce57600080fd5b9250929050565b600082601f8301126125e657600080fd5b81356125f68482602086016124b7565b91505092915050565b60008083601f84011261261157600080fd5b8235905067ffffffffffffffff81111561262a57600080fd5b60208301915083602082028301111561264257600080fd5b9250929050565b6000815190506126588161367c565b92915050565b60008135905061266d81613693565b92915050565b600082601f83011261268457600080fd5b8151612694848260208601612523565b91505092915050565b6000813590506126ac816136aa565b92915050565b6000815190506126c1816136c1565b92915050565b6000602082840312156126d957600080fd5b60006126e784828501612576565b91505092915050565b60008060006060848603121561270557600080fd5b600061271386828701612561565b935050602061272486828701612561565b925050604061273586828701612561565b9150509250925092565b60006020828403121561275157600080fd5b600061275f84828501612649565b91505092915050565b6000806040838503121561277b57600080fd5b600061278985828601612649565b925050602083015167ffffffffffffffff8111156127a657600080fd5b6127b285828601612673565b9150509250929050565b6000602082840312156127ce57600080fd5b60006127dc8482850161265e565b91505092915050565b60008060008060008060008060c0898b03121561280157600080fd5b600061280f8b828c0161269d565b985050602089013567ffffffffffffffff81111561282c57600080fd5b6128388b828c016125d5565b97505060406128498b828c01612561565b965050606061285a8b828c01612561565b955050608089013567ffffffffffffffff81111561287757600080fd5b6128838b828c016125ff565b945094505060a089013567ffffffffffffffff8111156128a257600080fd5b6128ae8b828c0161258b565b92509250509295985092959890939650565b6000602082840312156128d257600080fd5b60006128e0848285016126b2565b91505092915050565b60006128f58383612919565b60208301905092915050565b600061290d83836129f3565b60208301905092915050565b6129228161315c565b82525050565b6129318161315c565b82525050565b6000612942826130dd565b61294c8185613118565b9350612957836130bd565b8060005b8381101561298857815161296f88826128e9565b975061297a836130fe565b92505060018101905061295b565b5085935050505092915050565b60006129a0826130e8565b6129aa8185613129565b93506129b5836130cd565b8060005b838110156129e65781516129cd8882612901565b97506129d88361310b565b9250506001810190506129b9565b5085935050505092915050565b6129fc8161317a565b82525050565b612a0b8161317a565b82525050565b612a1a81613184565b82525050565b6000612a2b826130f3565b612a35818561313a565b9350612a458185602086016131fe565b612a4e81613291565b840191505092915050565b612a62816131ec565b82525050565b6000612a75600f8361314b565b9150612a80826132a2565b602082019050919050565b6000612a9860188361314b565b9150612aa3826132cb565b602082019050919050565b6000612abb60248361314b565b9150612ac6826132f4565b604082019050919050565b6000612ade601b8361314b565b9150612ae982613343565b602082019050919050565b6000612b0160088361314b565b9150612b0c8261336c565b602082019050919050565b6000612b2460228361314b565b9150612b2f82613395565b604082019050919050565b6000612b47601c8361314b565b9150612b52826133e4565b602082019050919050565b6000612b6a60138361314b565b9150612b758261340d565b602082019050919050565b6000612b8d600a8361314b565b9150612b9882613436565b602082019050919050565b6000612bb060288361314b565b9150612bbb8261345f565b604082019050919050565b6000612bd360228361314b565b9150612bde826134ae565b604082019050919050565b6000612bf6601b8361314b565b9150612c01826134fd565b602082019050919050565b6000612c19600a8361314b565b9150612c2482613526565b602082019050919050565b6000612c3c601f8361314b565b9150612c478261354f565b602082019050919050565b6000612c5f60268361314b565b9150612c6a82613578565b604082019050919050565b6000612c8260288361314b565b9150612c8d826135c7565b604082019050919050565b6000612ca560268361314b565b9150612cb082613616565b604082019050919050565b612cc4816131e2565b82525050565b6000602082019050612cdf6000830184612928565b92915050565b6000604082019050612cfa6000830185612928565b612d076020830184612928565b9392505050565b6000608082019050612d236000830187612928565b612d306020830186612928565b612d3d6040830185612cbb565b612d4a6060830184612928565b95945050505050565b6000608082019050612d686000830187612928565b612d756020830186612a02565b612d826040830185612a11565b612d8f6060830184612928565b95945050505050565b6000608082019050612dad6000830187612928565b8181036020830152612dbf8186612a20565b9050612dce6040830185612928565b612ddb6060830184612a59565b95945050505050565b60006040820190508181036000830152612dfe8185612995565b90508181036020830152612e128184612937565b90509392505050565b60006020820190508181036000830152612e3481612a68565b9050919050565b60006020820190508181036000830152612e5481612a8b565b9050919050565b60006020820190508181036000830152612e7481612aae565b9050919050565b60006020820190508181036000830152612e9481612ad1565b9050919050565b60006020820190508181036000830152612eb481612af4565b9050919050565b60006020820190508181036000830152612ed481612b17565b9050919050565b60006020820190508181036000830152612ef481612b3a565b9050919050565b60006020820190508181036000830152612f1481612b5d565b9050919050565b60006020820190508181036000830152612f3481612b80565b9050919050565b60006020820190508181036000830152612f5481612ba3565b9050919050565b60006020820190508181036000830152612f7481612bc6565b9050919050565b60006020820190508181036000830152612f9481612be9565b9050919050565b60006020820190508181036000830152612fb481612c0c565b9050919050565b60006020820190508181036000830152612fd481612c2f565b9050919050565b60006020820190508181036000830152612ff481612c52565b9050919050565b6000602082019050818103600083015261301481612c75565b9050919050565b6000602082019050818103600083015261303481612c98565b9050919050565b6000613045613056565b90506130518282613231565b919050565b6000604051905090565b600067ffffffffffffffff82111561307b5761307a613262565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156130a7576130a6613262565b5b6130b082613291565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b6000613167826131c2565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006131bb8261315c565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006131f7826131e2565b9050919050565b60005b8381101561321c578082015181840152602081019050613201565b8381111561322b576000848401525b50505050565b61323a82613291565b810181811067ffffffffffffffff8211171561325957613258613262565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f6c656e677468206d69736d617463680000000000000000000000000000000000600082015250565b7f6f6c6420756269736368656d6520656e64206661696c65640000000000000000600082015250565b7f756e7265676973746572696e6720736368656d6552656769737472617220666160008201527f696c656400000000000000000000000000000000000000000000000000000000602082015250565b7f7265676973746572696e67204964656e74697479206661696c65640000000000600082015250565b7f4944454e54495459000000000000000000000000000000000000000000000000600082015250565b7f756e7265676973746572696e672075706772616465536368656d65206661696c60008201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b7f756e7265676973746572696e6720666f726d756c61206661696c656400000000600082015250565b7f736574554249536368656d65206661696c656400000000000000000000000000600082015250565b7f474f4f44444f4c4c415200000000000000000000000000000000000000000000600082015250565b7f7265676973746572696e6720636f6d706f756e64566f74696e674d616368696e60008201527f65206661696c6564000000000000000000000000000000000000000000000000602082015250565b7f756e7265676973746572696e67206f6c6420554249536368656d65206661696c60008201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b7f6f6c6420636f6e7472616374732073697a65206d69736d617463680000000000600082015250565b7f6f6e6c79206f776e657200000000000000000000000000000000000000000000600082015250565b7f7265676973746572696e6720676f76206661696c73616665206661696c656400600082015250565b7f43616c6c696e67207365744e616d6553657276696365436f6e7472616374732060008201527f6661696c65640000000000000000000000000000000000000000000000000000602082015250565b7f756e7265676973746572696e672050726f746f636f6c5570677261646546757360008201527f65206661696c6564000000000000000000000000000000000000000000000000602082015250565b7f66756e6473207472616e7366657220746f206e657720756269736368656d652060008201527f6661696c65640000000000000000000000000000000000000000000000000000602082015250565b61366e8161315c565b811461367957600080fd5b50565b6136858161316e565b811461369057600080fd5b50565b61369c8161317a565b81146136a757600080fd5b50565b6136b3816131b0565b81146136be57600080fd5b50565b6136ca816131e2565b81146136d557600080fd5b5056fea26469706673582212201da54a01c51cf43598d05f6d048604ea3a26ce72d6ea9a77b0bd3fb9e1af37e764736f6c63430008030033",
93
+ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c80634eb70b39146100465780635c0d087b1461006257806375a2d2431461007e575b600080fd5b610060600480360381019061005b91906127bc565b61009a565b005b61007c600480360381019061007791906126f0565b61009d565b005b610098600480360381019061009391906127e5565b610b88565b005b50565b6100c97f309342aeef7bc73123bf6b8f1def6eb6557575bc2afb20c47c8e17b1a9903afb60001b61009a565b6100f57f1afef01c7d5e47f77e99e03281c8246041338f49d5d638f8c2ccde06f316f08e60001b61009a565b6101217fd13b2b4a932275dd11d6e1ae063fc161d92d6044a68cb2f529be646c56cb58c560001b61009a565b61014d7f8b2822f4b530221f117ae5e75aeccadeb9be6c0eb908c43ba7271b2816b0eb3060001b61009a565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146101dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101d490612f9b565b60405180910390fd5b6102097f959cc9f4f009a7619f80f3ae5db35a3f92b24dd918b659c2625a1d21a2e1257e60001b61009a565b6102357fcd700c9215ecb350510713a2bbbf9c3c17e22eabec00eb36ca06bb5f419185da60001b61009a565b6102617f1dec6e22581505b1fb6e910e158193433ba5ceff8ae539f89d565525e522691460001b61009a565b61028d7f5e61662526c99ed38ca992b9a8790755544dd379742720593ac92b8f53ec482760001b61009a565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663039de01d84600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff1660e01b815260040161030a929190612ce5565b602060405180830381600087803b15801561032457600080fd5b505af1158015610338573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061035c919061273f565b61039b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161039290612e5b565b60405180910390fd5b6103c77f2d8cb3925fe11b1ad70770935097552bffc3edfc341df2362798fabc2ca6505560001b61009a565b6103f37fcaa51136be1db5064f4c944c7b178d1c401afe76f244c03f5d5d23cfea33baa560001b61009a565b61041f7f0ad30f12bffad3ef0c26114541e0e8e4b7d086de8c4914bdaf13004c0482548a60001b61009a565b61044b7f68bb2363df6e19e67e2dea37179a0b92fbb9e3381bcd4cbe54cc457cf741aaf360001b61009a565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663039de01d83600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff1660e01b81526004016104c8929190612ce5565b602060405180830381600087803b1580156104e257600080fd5b505af11580156104f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051a919061273f565b610559576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161055090612ebb565b60405180910390fd5b6105857fa4063197ef21012d5447aff84e86ab304ac1b93e2e0e1ef45f484ea49a2039a460001b61009a565b6105b17fb42f941166466241fba7666f12a94289e892b4f99191066da1ae971b5310091760001b61009a565b6105dd7f6f99860b838b0dfe59db29d8dc8be062744270ec3220b9bc644dd17e972bd73860001b61009a565b6106097f504317b5368544e0229fbd0b940d757122448f9c7d4b72cd1d4aea1eb80181c660001b61009a565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e869d45f826000801b601f60e01b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518563ffffffff1660e01b81526004016106919493929190612d53565b602060405180830381600087803b1580156106ab57600080fd5b505af11580156106bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106e3919061273f565b610722576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161071990612f3b565b60405180910390fd5b61074e7f41decebe2e3ae2efc30b410103950a3b5c22adec5d8c19592598ec496bb7008860001b61009a565b61077a7f32a3a1183016d95e4daee6a1c1db5fb54d34a101350e413ac106a4a5eaca2c2860001b61009a565b6107a67fa4cbd9e7d4aaab96c961b0742ffc6d3f4ec38a616fa56a4bc1eeb0b6eaa7359560001b61009a565b6107d27fddbf5fa5c047f2c4f0cc826a68932c385dcd84d72a35008a145e0780b7c6300860001b61009a565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e869d45f600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000801b601f60e01b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518563ffffffff1660e01b815260040161087c9493929190612d53565b602060405180830381600087803b15801561089657600080fd5b505af11580156108aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ce919061273f565b61090d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090490612fbb565b60405180910390fd5b6109397f5d88a7b571c175ec8e6c873c5f61bb68de4609784bed21892694b8fb263451ee60001b61009a565b6109657fa3ebe0b4b2b33d02e5a9ecf19a69663ff1f1e08291cc047fc5f9e550c5cb15c560001b61009a565b6109917f75a4da7c3d83af405517463444c5412bd9db2b0ff9eca74c65e300b2b974b4de60001b61009a565b6109bd7fbc8b5b7a0cce2fd87ab790738e374f9f65b1341d8c491c032d62ed9251365c6560001b61009a565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636c525b13600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401610a389190612cca565b602060405180830381600087803b158015610a5257600080fd5b505af1158015610a66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a8a919061273f565b610ac9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac090612ffb565b60405180910390fd5b610af57f828f970e0b04686ee47a2eccfbddfb7c202bbfc660fe437d28293a7ddcba233b60001b61009a565b610b217f173576014d1464b88d10d1f87e745c950dcc103addb74b693920bb6003e122d360001b61009a565b610b4d7f2517a3b1271006bd27c20aeb410887b459d432bfd0e7d64b20fdd7707a1c13a160001b61009a565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16ff5b610bb47f10fbdfe920ab2b62c3740117afce7c546df302476cf20bbdf993c779b6e4420760001b61009a565b610be07f81790c8c4fe01b9c7d78166f32b933ec8110c1896d498ea8fe2c14667dc4768060001b61009a565b610c0c7f1f06256a89afab52e569770119b7455723d150201dd4288a1755ad47fff9b50960001b61009a565b610c387fc7dd0304c7cb41d46447e2260f68593d1a7d13163dbb3048836052649bfdd22560001b61009a565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610cc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbf90612f9b565b60405180910390fd5b610cf47ffcf94c7ce210fb757d7658b8b95990ede5448edfd6dceed516a81261522656c360001b61009a565b610d207f03bd12088888a9074ba6efb18277d1d3c379afc6628a7476666d74785118b9d260001b61009a565b610d4c7fef15df308fe03da9affbec511c33b38439b6ef1cccbcd93d6f5021ed02171a3a60001b61009a565b610d787f8c42f5e355865ee700fb4f5f64f3c0a68ca7a8423e71d04ddf2437abac3ee7d660001b61009a565b818190508484905014610dc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db790612e1b565b60405180910390fd5b610dec7f377d321c6ef0a25d17af4a5d304dac012ab801233fbd5a1f07051c779d90dd8260001b61009a565b610e187fbc3b16e057120003a6d2666bca3ae611f6eb4b50ff73418724e166edc1baa01460001b61009a565b610e447f59bf6103067e9fd432d140fcdcbddf4b71c525bd45362006ec09d74b6be4aa2c60001b61009a565b610e707f6c40c2b95c31660d37c4b34c046b80defcdc1f312c19f30dfeccf1fb70c6a4aa60001b61009a565b6004875114610eb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eab90612f7b565b60405180910390fd5b610ee07f322b4a5f14757189c9e8b9f88d63dc6ea237d9ea62cd9a8ec365477824f10cd560001b61009a565b610f0c7f6b37c4ad3598c12ce7193b6712e66a6a638297da896ae9d6b8750836ae4b108460001b61009a565b610f387fc2825fd9763c86bdfc63de52102d4c0912d1eef522dc8ffbad2bf87863b52a2060001b61009a565b610fc587600281518110610f75577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101518689600381518110610fb8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516115c4565b610ff17f36746936312f76142c7b4a056fd3ec9d8fe2f252b0b0b6296286adbd7f501c5060001b61009a565b61101d7fb23b9587b78f39f0d394d6347efe7e758baa24b85b3440c55d41b8112d3e11f060001b61009a565b6110aa88858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050506121cf565b6110d67f8fb52f82ea275f35b88b1e88a9a435688896d586682604de07e4835d9f5a103e60001b61009a565b6111027f76f924a90660ffd781afaca761178270cc62a762af5d208f6cdbe3f24d89824e60001b61009a565b61112e7f6a0a050fb7c18f35bc82a57f5f023e4c627a130602c5012f515ee9b3dd80cceb60001b61009a565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e869d45f8973ffffffffffffffffffffffffffffffffffffffff1663bf40fac16040518163ffffffff1660e01b81526004016111a190612e9b565b60206040518083038186803b1580156111b957600080fd5b505afa1580156111cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111f191906126c7565b6000801b600160e01b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518563ffffffff1660e01b815260040161123c9493929190612d53565b602060405180830381600087803b15801561125657600080fd5b505af115801561126a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061128e919061273f565b6112cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c490612e7b565b60405180910390fd5b6112f97f5287a839d2eb54d51ae95dfc6d0e9091b4f5160e192dde8e9355e1f336a6ff9460001b61009a565b6113257f4bdcda6de1ec3c7611ff34da6910c18b1bf790630c08a1c12c905cfc0958ab5260001b61009a565b6113517f840cc7cddc926f229f0eb993890c7f113929b07dbe7de7683de26cd0035ab1b160001b61009a565b61137d7fda471798f0b7e33c47552540ca3ad99096390cb259aeab25ad3d5d0274e6bef660001b61009a565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663039de01d8973ffffffffffffffffffffffffffffffffffffffff1663bf40fac16040518163ffffffff1660e01b81526004016113f090612f1b565b60206040518083038186803b15801561140857600080fd5b505afa15801561141c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061144091906126c7565b73ffffffffffffffffffffffffffffffffffffffff16634b75f54f6040518163ffffffff1660e01b815260040160206040518083038186803b15801561148557600080fd5b505afa158015611499573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114bd91906126c7565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff1660e01b81526004016114fd929190612ce5565b602060405180830381600087803b15801561151757600080fd5b505af115801561152b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061154f919061273f565b61158e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158590612edb565b60405180910390fd5b6115ba7f40d98f1e3bd30fdf9eb0046e66e1b131d26126ba7097319e5e764395e35922b760001b61009a565b5050505050505050565b6115f07fc72d4032d3b486d19984d226568ce4224392e65e0babc0a9ac24b066069b23db60001b61009a565b61161c7fa0e3a7728322302ead4ee50bda6f840bc844651c0fbac3598801463b538914f160001b61009a565b6116487fbcb53111df07d65716f7d37ed853349255f4303041714b3144b41fd8fa4f618a60001b61009a565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e1758bd86040518163ffffffff1660e01b815260040160206040518083038186803b1580156116b257600080fd5b505afa1580156116c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116ea91906126c7565b90506117187f906b7b33fb9991687c8989e27701dd46341cf7355ab8cab37e73b2b2faa2c02e60001b61009a565b6117447f08bd47c89ae48cba9655c4b3049a989e5a9be7b4165010dc21d3b55e4c773ada60001b61009a565b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231866040518263ffffffff1660e01b815260040161177f9190612cca565b60206040518083038186803b15801561179757600080fd5b505afa1580156117ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117cf91906128c0565b90506117fd7f5c104ab8f8ab57b2e9d3c0b38766a7b387906e98862cd67987300ccd97c25aaf60001b61009a565b6118297ff0d321d1b7dd2c118a4ee6611e18955fc9f3adc46400a3f7a3edf1f606580d7660001b61009a565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d1b7089a858760405160240161187a9190612cca565b6040516020818303038152906040527f2c336822000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660006040518563ffffffff1660e01b815260040161193b9493929190612d98565b600060405180830381600087803b15801561195557600080fd5b505af1158015611969573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906119929190612768565b5090506119c17f827879f8ebbd0e918c254f258e4b72a596a37005e00bac85ce30b41089283dca60001b61009a565b6119ed7fbd9de88a28aa423253c2e8c63b72b1fe6e846709af1dca03235b94bee1cc628660001b61009a565b611a197f326789d0b63d4edc88ee00ab696bdefa6d855ff7a8ae93e6a280336fa6760f7560001b61009a565b80611a59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5090612efb565b60405180910390fd5b611a857fc98ae6a1243cd38cec67850a0e3eef8824fbe35dd4a3bc2db5341085ec6d71a860001b61009a565b611ab17f54e940803a43fbb0a56659116d1bbdf89b77ef2bce448fdd8f68ebd1e94be25260001b61009a565b611add7f90f82887e95664784667f2d5513d40bf67533e5cf2d38a789e7e4f0753c1c91660001b61009a565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d1b7089a876040516024016040516020818303038152906040527fefbe1c1c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660006040518563ffffffff1660e01b8152600401611be19493929190612d98565b600060405180830381600087803b158015611bfb57600080fd5b505af1158015611c0f573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611c389190612768565b5080915050611c697f1b942dbfce2b6c69e5493d952a55086fbb133c33d8578e807c160317cac8bd5360001b61009a565b611c957fc9bbb0c1b25ec09bec0a632a2608c7f69804d5ac52ce5a50c937e81e8edd124b60001b61009a565b611cc17f8a5d15b0b3df417400e4e3280462aa1e91dd6b5791ebf7fc3e99cb67a65d75f860001b61009a565b80611d01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf890612e3b565b60405180910390fd5b611d2d7f59d7e2d9a2f3b431ddb48f817ad77f61304e68aa255bd67776e4d3022623004b60001b61009a565b611d597fc4436dcc3f9fa87627a62e75d90fbae12deecb15bff72762b8447f96ceb90ad060001b61009a565b611d857fdc4fbff900ec126c1f2f47549f397b14b143204d6e2d7ada4d5eaf39c59e7b2160001b61009a565b611db17f7700d23f9ac835d2a386639a5303daeb50af4bca30c67cb510cb31602182584860001b61009a565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663039de01d87600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff1660e01b8152600401611e2e929190612ce5565b602060405180830381600087803b158015611e4857600080fd5b505af1158015611e5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e80919061273f565b611ebf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eb690612f5b565b60405180910390fd5b611eeb7f888e9bafaed318462a8ef7729902043058e273f1290f7f2e517b0d70afa70f3660001b61009a565b611f177f2e2670c3e97f77a29a34632d22d9a04b0b4b05c7132575eba99659081a56c5b360001b61009a565b611f437ff3f17106ff1277cc35937f30fb5e1f4f952c92b6810e17d6477eac6426e9438c60001b61009a565b600082111561219a57611f787fd223089d169c6bdb0cb795964457449827371183fc80cad0c2c90fb88b94bcb560001b61009a565b611fa47fd0b9bf288479c895e544d90058fbf95bde0012fc4da4657ceec56bbeb07f07a760001b61009a565b611fd07fd9707e0ca237c838d2acf7ea9e2fe2a684f878529d0a59f2c472c4196db4fc3460001b61009a565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b9a04cdd848785600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518563ffffffff1660e01b81526004016120519493929190612d0e565b602060405180830381600087803b15801561206b57600080fd5b505af115801561207f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120a3919061273f565b90506120d17f07af66a7809c16f837d6174ed0778435e2d64b5209e8ca6c4eabae7ecdf8a24f60001b61009a565b6120fd7f50c7f62b48327224bc4b6dec9eb18c03f2ceb88abb00bbb19612165cbd95a97160001b61009a565b6121297f4e42537547564dbc40411c8f94bcb2810ca005cebe21d5fd079887cb90ddfbcf60001b61009a565b80612169576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121609061301b565b60405180910390fd5b6121957f8e639255616509529c1d3d618ec4b6f65f00120fbff1a154c3822f71ddade9b560001b61009a565b6121c7565b6121c67f5749f8b0985695721a3bcdddfba40694cc25b5f4b6a6e98f489ecc195177cb0760001b61009a565b5b505050505050565b6121fb7fa4a83039dcca433c0178409d585b9aec32729fe7b33500b5121d56dd46179bf460001b61009a565b6122277fbe58ee543ca6ebc77d4f18789917e098219a99e7a2c724d83148fa4ce3242cdd60001b61009a565b6122537f201575b15d41ecd6e0244e7551408dd8f74b76eef4512c1b0fc591d9dc995f5360001b61009a565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d1b7089a8585856040516024016122a6929190612de4565b6040516020818303038152906040527f4ab01f5b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660006040518563ffffffff1660e01b81526004016123679493929190612d98565b600060405180830381600087803b15801561238157600080fd5b505af1158015612395573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906123be9190612768565b5090506123ed7fd2f47bf21669fa85ab0bba9c4e049ebd73e9645548fec9c9dc0df9f559a3cf4060001b61009a565b6124197fb9eac905e8a7c2f1bae65ac256a02d362534f04efe8d871a5dc93a1a42f12f3760001b61009a565b6124457f730d4461029406ad2e08de23bcd8246ea25f0b42411ca4ac01423bee7be4a83060001b61009a565b80612485576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247c90612fdb565b60405180910390fd5b6124b17f5fe0fafddd644c69ac16bb9f8c4266cc158c7b32792fd0758259f3a3b6fa152f60001b61009a565b50505050565b60006124ca6124c584613060565b61303b565b905080838252602082019050828560208602820111156124e957600080fd5b60005b8581101561251957816124ff8882612561565b8452602084019350602083019250506001810190506124ec565b5050509392505050565b60006125366125318461308c565b61303b565b90508281526020810184848401111561254e57600080fd5b6125598482856131fe565b509392505050565b60008135905061257081613665565b92915050565b60008151905061258581613665565b92915050565b60008083601f84011261259d57600080fd5b8235905067ffffffffffffffff8111156125b657600080fd5b6020830191508360208202830111156125ce57600080fd5b9250929050565b600082601f8301126125e657600080fd5b81356125f68482602086016124b7565b91505092915050565b60008083601f84011261261157600080fd5b8235905067ffffffffffffffff81111561262a57600080fd5b60208301915083602082028301111561264257600080fd5b9250929050565b6000815190506126588161367c565b92915050565b60008135905061266d81613693565b92915050565b600082601f83011261268457600080fd5b8151612694848260208601612523565b91505092915050565b6000813590506126ac816136aa565b92915050565b6000815190506126c1816136c1565b92915050565b6000602082840312156126d957600080fd5b60006126e784828501612576565b91505092915050565b60008060006060848603121561270557600080fd5b600061271386828701612561565b935050602061272486828701612561565b925050604061273586828701612561565b9150509250925092565b60006020828403121561275157600080fd5b600061275f84828501612649565b91505092915050565b6000806040838503121561277b57600080fd5b600061278985828601612649565b925050602083015167ffffffffffffffff8111156127a657600080fd5b6127b285828601612673565b9150509250929050565b6000602082840312156127ce57600080fd5b60006127dc8482850161265e565b91505092915050565b60008060008060008060008060c0898b03121561280157600080fd5b600061280f8b828c0161269d565b985050602089013567ffffffffffffffff81111561282c57600080fd5b6128388b828c016125d5565b97505060406128498b828c01612561565b965050606061285a8b828c01612561565b955050608089013567ffffffffffffffff81111561287757600080fd5b6128838b828c016125ff565b945094505060a089013567ffffffffffffffff8111156128a257600080fd5b6128ae8b828c0161258b565b92509250509295985092959890939650565b6000602082840312156128d257600080fd5b60006128e0848285016126b2565b91505092915050565b60006128f58383612919565b60208301905092915050565b600061290d83836129f3565b60208301905092915050565b6129228161315c565b82525050565b6129318161315c565b82525050565b6000612942826130dd565b61294c8185613118565b9350612957836130bd565b8060005b8381101561298857815161296f88826128e9565b975061297a836130fe565b92505060018101905061295b565b5085935050505092915050565b60006129a0826130e8565b6129aa8185613129565b93506129b5836130cd565b8060005b838110156129e65781516129cd8882612901565b97506129d88361310b565b9250506001810190506129b9565b5085935050505092915050565b6129fc8161317a565b82525050565b612a0b8161317a565b82525050565b612a1a81613184565b82525050565b6000612a2b826130f3565b612a35818561313a565b9350612a458185602086016131fe565b612a4e81613291565b840191505092915050565b612a62816131ec565b82525050565b6000612a75600f8361314b565b9150612a80826132a2565b602082019050919050565b6000612a9860188361314b565b9150612aa3826132cb565b602082019050919050565b6000612abb60248361314b565b9150612ac6826132f4565b604082019050919050565b6000612ade601b8361314b565b9150612ae982613343565b602082019050919050565b6000612b0160088361314b565b9150612b0c8261336c565b602082019050919050565b6000612b2460228361314b565b9150612b2f82613395565b604082019050919050565b6000612b47601c8361314b565b9150612b52826133e4565b602082019050919050565b6000612b6a60138361314b565b9150612b758261340d565b602082019050919050565b6000612b8d600a8361314b565b9150612b9882613436565b602082019050919050565b6000612bb060288361314b565b9150612bbb8261345f565b604082019050919050565b6000612bd360228361314b565b9150612bde826134ae565b604082019050919050565b6000612bf6601b8361314b565b9150612c01826134fd565b602082019050919050565b6000612c19600a8361314b565b9150612c2482613526565b602082019050919050565b6000612c3c601f8361314b565b9150612c478261354f565b602082019050919050565b6000612c5f60268361314b565b9150612c6a82613578565b604082019050919050565b6000612c8260288361314b565b9150612c8d826135c7565b604082019050919050565b6000612ca560268361314b565b9150612cb082613616565b604082019050919050565b612cc4816131e2565b82525050565b6000602082019050612cdf6000830184612928565b92915050565b6000604082019050612cfa6000830185612928565b612d076020830184612928565b9392505050565b6000608082019050612d236000830187612928565b612d306020830186612928565b612d3d6040830185612cbb565b612d4a6060830184612928565b95945050505050565b6000608082019050612d686000830187612928565b612d756020830186612a02565b612d826040830185612a11565b612d8f6060830184612928565b95945050505050565b6000608082019050612dad6000830187612928565b8181036020830152612dbf8186612a20565b9050612dce6040830185612928565b612ddb6060830184612a59565b95945050505050565b60006040820190508181036000830152612dfe8185612995565b90508181036020830152612e128184612937565b90509392505050565b60006020820190508181036000830152612e3481612a68565b9050919050565b60006020820190508181036000830152612e5481612a8b565b9050919050565b60006020820190508181036000830152612e7481612aae565b9050919050565b60006020820190508181036000830152612e9481612ad1565b9050919050565b60006020820190508181036000830152612eb481612af4565b9050919050565b60006020820190508181036000830152612ed481612b17565b9050919050565b60006020820190508181036000830152612ef481612b3a565b9050919050565b60006020820190508181036000830152612f1481612b5d565b9050919050565b60006020820190508181036000830152612f3481612b80565b9050919050565b60006020820190508181036000830152612f5481612ba3565b9050919050565b60006020820190508181036000830152612f7481612bc6565b9050919050565b60006020820190508181036000830152612f9481612be9565b9050919050565b60006020820190508181036000830152612fb481612c0c565b9050919050565b60006020820190508181036000830152612fd481612c2f565b9050919050565b60006020820190508181036000830152612ff481612c52565b9050919050565b6000602082019050818103600083015261301481612c75565b9050919050565b6000602082019050818103600083015261303481612c98565b9050919050565b6000613045613056565b90506130518282613231565b919050565b6000604051905090565b600067ffffffffffffffff82111561307b5761307a613262565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156130a7576130a6613262565b5b6130b082613291565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b6000613167826131c2565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006131bb8261315c565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006131f7826131e2565b9050919050565b60005b8381101561321c578082015181840152602081019050613201565b8381111561322b576000848401525b50505050565b61323a82613291565b810181811067ffffffffffffffff8211171561325957613258613262565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f6c656e677468206d69736d617463680000000000000000000000000000000000600082015250565b7f6f6c6420756269736368656d6520656e64206661696c65640000000000000000600082015250565b7f756e7265676973746572696e6720736368656d6552656769737472617220666160008201527f696c656400000000000000000000000000000000000000000000000000000000602082015250565b7f7265676973746572696e67204964656e74697479206661696c65640000000000600082015250565b7f4944454e54495459000000000000000000000000000000000000000000000000600082015250565b7f756e7265676973746572696e672075706772616465536368656d65206661696c60008201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b7f756e7265676973746572696e6720666f726d756c61206661696c656400000000600082015250565b7f736574554249536368656d65206661696c656400000000000000000000000000600082015250565b7f474f4f44444f4c4c415200000000000000000000000000000000000000000000600082015250565b7f7265676973746572696e6720636f6d706f756e64566f74696e674d616368696e60008201527f65206661696c6564000000000000000000000000000000000000000000000000602082015250565b7f756e7265676973746572696e67206f6c6420554249536368656d65206661696c60008201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b7f6f6c6420636f6e7472616374732073697a65206d69736d617463680000000000600082015250565b7f6f6e6c79206f776e657200000000000000000000000000000000000000000000600082015250565b7f7265676973746572696e6720676f76206661696c73616665206661696c656400600082015250565b7f43616c6c696e67207365744e616d6553657276696365436f6e7472616374732060008201527f6661696c65640000000000000000000000000000000000000000000000000000602082015250565b7f756e7265676973746572696e672050726f746f636f6c5570677261646546757360008201527f65206661696c6564000000000000000000000000000000000000000000000000602082015250565b7f66756e6473207472616e7366657220746f206e657720756269736368656d652060008201527f6661696c65640000000000000000000000000000000000000000000000000000602082015250565b61366e8161315c565b811461367957600080fd5b50565b6136858161316e565b811461369057600080fd5b50565b61369c8161317a565b81146136a757600080fd5b50565b6136b3816131b0565b81146136be57600080fd5b50565b6136ca816131e2565b81146136d557600080fd5b5056fea26469706673582212201da54a01c51cf43598d05f6d048604ea3a26ce72d6ea9a77b0bd3fb9e1af37e764736f6c63430008030033",
94
94
  "linkReferences": {},
95
95
  "deployedLinkReferences": {}
96
96
  }
@@ -1,4 +1,4 @@
1
1
  {
2
2
  "_format": "hh-sol-dbg-1",
3
- "buildInfo": "../../../build-info/5eade22d1f653c4aa1bee298f68e5fb1.json"
3
+ "buildInfo": "../../../build-info/827ce34b5f5e1273bc2043a326b3f20e.json"
4
4
  }
@@ -74,8 +74,8 @@
74
74
  "type": "function"
75
75
  }
76
76
  ],
77
- "bytecode": "0x608060405234801561001057600080fd5b5060405161060b38038061060b8339818101604052810190610032919061008d565b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050610111565b600081519050610087816100fa565b92915050565b60006020828403121561009f57600080fd5b60006100ad84828501610078565b91505092915050565b60006100c1826100da565b9050919050565b60006100d3826100b6565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b610103816100c8565b811461010e57600080fd5b50565b6104eb806101206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80635653eeeb1461004657806391d61f3e14610062578063c52164c61461007e575b600080fd5b610060600480360381019061005b91906102a3565b61009c565b005b61007c600480360381019061007791906102a3565b61016e565b005b610086610240565b6040516100939190610371565b60405180910390f35b60005b818110156101685760008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1985856040518363ffffffff1660e01b8152600401610102929190610348565b602060405180830381600087803b15801561011c57600080fd5b505af1158015610130573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061015491906102f2565b508080610160906103f8565b91505061009f565b50505050565b60005b8181101561023a5760008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639dc29fac85856040518363ffffffff1660e01b81526004016101d4929190610348565b602060405180830381600087803b1580156101ee57600080fd5b505af1158015610202573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061022691906102f2565b508080610232906103f8565b915050610171565b50505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008135905061027381610470565b92915050565b60008151905061028881610487565b92915050565b60008135905061029d8161049e565b92915050565b6000806000606084860312156102b857600080fd5b60006102c686828701610264565b93505060206102d78682870161028e565b92505060406102e88682870161028e565b9150509250925092565b60006020828403121561030457600080fd5b600061031284828501610279565b91505092915050565b6103248161038c565b82525050565b610333816103d4565b82525050565b610342816103ca565b82525050565b600060408201905061035d600083018561031b565b61036a6020830184610339565b9392505050565b6000602082019050610386600083018461032a565b92915050565b6000610397826103aa565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006103df826103e6565b9050919050565b60006103f1826103aa565b9050919050565b6000610403826103ca565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561043657610435610441565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6104798161038c565b811461048457600080fd5b50565b6104908161039e565b811461049b57600080fd5b50565b6104a7816103ca565b81146104b257600080fd5b5056fea2646970667358221220263dab94bb14972184452ea7b7b22c57b9a46f2b7228be1b1cf8f7573460d29d64736f6c63430008030033",
78
- "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c80635653eeeb1461004657806391d61f3e14610062578063c52164c61461007e575b600080fd5b610060600480360381019061005b91906102a3565b61009c565b005b61007c600480360381019061007791906102a3565b61016e565b005b610086610240565b6040516100939190610371565b60405180910390f35b60005b818110156101685760008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1985856040518363ffffffff1660e01b8152600401610102929190610348565b602060405180830381600087803b15801561011c57600080fd5b505af1158015610130573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061015491906102f2565b508080610160906103f8565b91505061009f565b50505050565b60005b8181101561023a5760008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639dc29fac85856040518363ffffffff1660e01b81526004016101d4929190610348565b602060405180830381600087803b1580156101ee57600080fd5b505af1158015610202573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061022691906102f2565b508080610232906103f8565b915050610171565b50505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008135905061027381610470565b92915050565b60008151905061028881610487565b92915050565b60008135905061029d8161049e565b92915050565b6000806000606084860312156102b857600080fd5b60006102c686828701610264565b93505060206102d78682870161028e565b92505060406102e88682870161028e565b9150509250925092565b60006020828403121561030457600080fd5b600061031284828501610279565b91505092915050565b6103248161038c565b82525050565b610333816103d4565b82525050565b610342816103ca565b82525050565b600060408201905061035d600083018561031b565b61036a6020830184610339565b9392505050565b6000602082019050610386600083018461032a565b92915050565b6000610397826103aa565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006103df826103e6565b9050919050565b60006103f1826103aa565b9050919050565b6000610403826103ca565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561043657610435610441565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6104798161038c565b811461048457600080fd5b50565b6104908161039e565b811461049b57600080fd5b50565b6104a7816103ca565b81146104b257600080fd5b5056fea2646970667358221220263dab94bb14972184452ea7b7b22c57b9a46f2b7228be1b1cf8f7573460d29d64736f6c63430008030033",
77
+ "bytecode": "0x608060405234801561001057600080fd5b5060405161060b38038061060b8339818101604052810190610032919061008d565b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050610111565b600081519050610087816100fa565b92915050565b60006020828403121561009f57600080fd5b60006100ad84828501610078565b91505092915050565b60006100c1826100da565b9050919050565b60006100d3826100b6565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b610103816100c8565b811461010e57600080fd5b50565b6104eb806101206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80635653eeeb1461004657806391d61f3e14610062578063c52164c61461007e575b600080fd5b610060600480360381019061005b91906102a3565b61009c565b005b61007c600480360381019061007791906102a3565b61016e565b005b610086610240565b6040516100939190610371565b60405180910390f35b60005b818110156101685760008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1985856040518363ffffffff1660e01b8152600401610102929190610348565b602060405180830381600087803b15801561011c57600080fd5b505af1158015610130573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061015491906102f2565b508080610160906103f8565b91505061009f565b50505050565b60005b8181101561023a5760008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639dc29fac85856040518363ffffffff1660e01b81526004016101d4929190610348565b602060405180830381600087803b1580156101ee57600080fd5b505af1158015610202573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061022691906102f2565b508080610232906103f8565b915050610171565b50505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008135905061027381610470565b92915050565b60008151905061028881610487565b92915050565b60008135905061029d8161049e565b92915050565b6000806000606084860312156102b857600080fd5b60006102c686828701610264565b93505060206102d78682870161028e565b92505060406102e88682870161028e565b9150509250925092565b60006020828403121561030457600080fd5b600061031284828501610279565b91505092915050565b6103248161038c565b82525050565b610333816103d4565b82525050565b610342816103ca565b82525050565b600060408201905061035d600083018561031b565b61036a6020830184610339565b9392505050565b6000602082019050610386600083018461032a565b92915050565b6000610397826103aa565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006103df826103e6565b9050919050565b60006103f1826103aa565b9050919050565b6000610403826103ca565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561043657610435610441565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6104798161038c565b811461048457600080fd5b50565b6104908161039e565b811461049b57600080fd5b50565b6104a7816103ca565b81146104b257600080fd5b5056fea2646970667358221220269fa9feedabaea7a6adbee6647a07ed32d0f7fbdc7cbbb482b34c93503ed4f264736f6c63430008030033",
78
+ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c80635653eeeb1461004657806391d61f3e14610062578063c52164c61461007e575b600080fd5b610060600480360381019061005b91906102a3565b61009c565b005b61007c600480360381019061007791906102a3565b61016e565b005b610086610240565b6040516100939190610371565b60405180910390f35b60005b818110156101685760008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1985856040518363ffffffff1660e01b8152600401610102929190610348565b602060405180830381600087803b15801561011c57600080fd5b505af1158015610130573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061015491906102f2565b508080610160906103f8565b91505061009f565b50505050565b60005b8181101561023a5760008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639dc29fac85856040518363ffffffff1660e01b81526004016101d4929190610348565b602060405180830381600087803b1580156101ee57600080fd5b505af1158015610202573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061022691906102f2565b508080610232906103f8565b915050610171565b50505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008135905061027381610470565b92915050565b60008151905061028881610487565b92915050565b60008135905061029d8161049e565b92915050565b6000806000606084860312156102b857600080fd5b60006102c686828701610264565b93505060206102d78682870161028e565b92505060406102e88682870161028e565b9150509250925092565b60006020828403121561030457600080fd5b600061031284828501610279565b91505092915050565b6103248161038c565b82525050565b610333816103d4565b82525050565b610342816103ca565b82525050565b600060408201905061035d600083018561031b565b61036a6020830184610339565b9392505050565b6000602082019050610386600083018461032a565b92915050565b6000610397826103aa565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006103df826103e6565b9050919050565b60006103f1826103aa565b9050919050565b6000610403826103ca565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561043657610435610441565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6104798161038c565b811461048457600080fd5b50565b6104908161039e565b811461049b57600080fd5b50565b6104a7816103ca565b81146104b257600080fd5b5056fea2646970667358221220269fa9feedabaea7a6adbee6647a07ed32d0f7fbdc7cbbb482b34c93503ed4f264736f6c63430008030033",
79
79
  "linkReferences": {},
80
80
  "deployedLinkReferences": {}
81
81
  }
@@ -1,8 +1,6 @@
1
1
  // SPDX-License-Identifier: MIT
2
2
  pragma solidity >=0.8.0;
3
3
 
4
- import "@openzeppelin/contracts-upgradeable/utils/cryptography/MerkleProofUpgradeable.sol";
5
-
6
4
  import "./Reputation.sol";
7
5
  import "../Interfaces.sol";
8
6
 
@@ -333,26 +331,30 @@ contract GReputation is Reputation {
333
331
  /**
334
332
  * @notice prove user balance in a specific blockchain state hash
335
333
  * @dev "rootState" is a special state that can be supplied once, and actually mints reputation on the current blockchain
334
+ * we use non sorted merkle tree, as sorting while preparing merkle tree is heavy
336
335
  * @param _id the string id of the blockchain we supply proof for
337
336
  * @param _user the user to prove his balance
338
337
  * @param _balance the balance we are prooving
339
338
  * @param _proof array of byte32 with proof data (currently merkle tree path)
339
+ * @param _nodeIndex index of node in the tree (for unsorted merkle tree proof)
340
+
340
341
  * @return true if proof is valid
341
342
  */
342
343
  function proveBalanceOfAtBlockchain(
343
344
  string memory _id,
344
345
  address _user,
345
346
  uint256 _balance,
346
- bytes32[] memory _proof
347
+ bytes32[] memory _proof,
348
+ uint256 _nodeIndex
347
349
  ) public returns (bool) {
348
350
  bytes32 idHash = keccak256(bytes(_id));
349
351
  require(
350
352
  blockchainStates[idHash].length > 0,
351
353
  "no state found for given _id"
352
354
  );
353
- bytes32 stateHash =
354
- blockchainStates[idHash][blockchainStates[idHash].length - 1]
355
- .stateHash;
355
+ bytes32 stateHash = blockchainStates[idHash][
356
+ blockchainStates[idHash].length - 1
357
+ ].stateHash;
356
358
 
357
359
  //this is specifically important for rootState that should update real balance only once
358
360
  require(
@@ -360,8 +362,14 @@ contract GReputation is Reputation {
360
362
  "stateHash already proved"
361
363
  );
362
364
 
363
- (, bool isProofValid) =
364
- _checkMerkleProof(_user, _balance, stateHash, _proof);
365
+ bytes32 leafHash = keccak256(abi.encode(_user, _balance));
366
+ bool isProofValid = checkProofOrdered(
367
+ _proof,
368
+ stateHash,
369
+ leafHash,
370
+ _nodeIndex
371
+ );
372
+
365
373
  require(isProofValid, "invalid merkle proof");
366
374
 
367
375
  //if initiial state then set real balance
@@ -412,23 +420,20 @@ contract GReputation is Reputation {
412
420
  bytes32 _r,
413
421
  bytes32 _s
414
422
  ) public {
415
- bytes32 domainSeparator =
416
- keccak256(
417
- abi.encode(
418
- DOMAIN_TYPEHASH,
419
- keccak256(bytes(name)),
420
- getChainId(),
421
- address(this)
422
- )
423
- );
424
- bytes32 structHash =
425
- keccak256(
426
- abi.encode(DELEGATION_TYPEHASH, _delegate, _nonce, _expiry)
427
- );
428
- bytes32 digest =
429
- keccak256(
430
- abi.encodePacked("\x19\x01", domainSeparator, structHash)
431
- );
423
+ bytes32 domainSeparator = keccak256(
424
+ abi.encode(
425
+ DOMAIN_TYPEHASH,
426
+ keccak256(bytes(name)),
427
+ getChainId(),
428
+ address(this)
429
+ )
430
+ );
431
+ bytes32 structHash = keccak256(
432
+ abi.encode(DELEGATION_TYPEHASH, _delegate, _nonce, _expiry)
433
+ );
434
+ bytes32 digest = keccak256(
435
+ abi.encodePacked("\x19\x01", domainSeparator, structHash)
436
+ );
432
437
  address signatory = ecrecover(digest, _v, _r, _s);
433
438
  require(
434
439
  signatory != address(0),
@@ -474,12 +479,7 @@ contract GReputation is Reputation {
474
479
 
475
480
  //move votes to new delegator
476
481
  uint256 addVotes = getVotesAt(_delegate, false, block.number);
477
- _updateDelegateVotes(
478
- _delegate,
479
- _user,
480
- addVotes,
481
- addVotes + coreBalance
482
- );
482
+ _updateDelegateVotes(_delegate, _user, addVotes, addVotes + coreBalance);
483
483
  }
484
484
 
485
485
  /// @notice internal function to update delegated votes, emits event with changes
@@ -497,16 +497,46 @@ contract GReputation is Reputation {
497
497
  emit DelegateVotesChanged(_delegate, _delegator, _oldVotes, _newVotes);
498
498
  }
499
499
 
500
- /// @notice helper function to check merkle proof using openzeppelin
501
- /// @return leafHash isProofValid tuple (byte32, bool) with the hash of the leaf data we prove and true if proof is valid
502
- function _checkMerkleProof(
503
- address _user,
504
- uint256 _balance,
500
+ // from StorJ -- https://github.com/nginnever/storj-audit-verifier/blob/master/contracts/MerkleVerifyv3.sol
501
+ /**
502
+ * @dev non sorted merkle tree proof check
503
+ */
504
+ function checkProofOrdered(
505
+ bytes32[] memory _proof,
505
506
  bytes32 _root,
506
- bytes32[] memory _proof
507
- ) internal pure returns (bytes32 leafHash, bool isProofValid) {
508
- leafHash = keccak256(abi.encode(_user, _balance));
509
- isProofValid = MerkleProofUpgradeable.verify(_proof, _root, leafHash);
507
+ bytes32 _hash,
508
+ uint256 _index
509
+ ) public pure returns (bool) {
510
+ // use the index to determine the node ordering
511
+ // index ranges 1 to n
512
+
513
+ bytes32 proofElement;
514
+ bytes32 computedHash = _hash;
515
+ uint256 remaining;
516
+
517
+ for (uint256 j = 0; j < _proof.length; j++) {
518
+ proofElement = _proof[j];
519
+
520
+ // calculate remaining elements in proof
521
+ remaining = _proof.length - j;
522
+
523
+ // we don't assume that the tree is padded to a power of 2
524
+ // if the index is odd then the proof will start with a hash at a higher
525
+ // layer, so we have to adjust the index to be the index at that layer
526
+ while (remaining > 0 && _index % 2 == 1 && _index > 2**remaining) {
527
+ _index = _index / 2 + 1;
528
+ }
529
+
530
+ if (_index % 2 == 0) {
531
+ computedHash = keccak256(abi.encodePacked(proofElement, computedHash));
532
+ _index = _index / 2;
533
+ } else {
534
+ computedHash = keccak256(abi.encodePacked(computedHash, proofElement));
535
+ _index = _index / 2 + 1;
536
+ }
537
+ }
538
+
539
+ return computedHash == _root;
510
540
  }
511
541
 
512
542
  /// @notice helper function to get current chain id
@@ -51,6 +51,14 @@ contract GoodFundManager is DAOUpgradeableContract, DSMath {
51
51
  uint64 blockEnd; // # of the end block to distribute rewards
52
52
  bool isBlackListed; // If staking contract is blacklisted or not
53
53
  }
54
+ struct InterestInfo {
55
+ address contractAddress; // staking contract address which interest will be collected
56
+ uint256 interestBalance; // Interest amount that staking contract has
57
+ uint256 collectedInterestSoFar; // Collected interest amount so far including this contract
58
+ uint256 gasCostSoFar; // Spent gas amount so far including this contract
59
+ uint256 maxGasAmountSoFar; // Max gas amount that can spend to collect this interest according to interest amount
60
+ bool maxGasLargerOrEqualRequired; // Bool that indicates if max gas amount larger or equal to actual gas needed
61
+ }
54
62
  // Rewards per block for particular Staking contract
55
63
  mapping(address => Reward) public rewardsForStakingContract;
56
64
  // Emits when `transferInterest` transfers
@@ -288,22 +296,18 @@ contract GoodFundManager is DAOUpgradeableContract, DSMath {
288
296
  }
289
297
 
290
298
  /**
291
- * @dev Function that get addresses of staking contracts that we can collect interest from with a specific gas limit
292
- * but that also pass the interest>=gascosts*multiplier
293
- * @param _maxGasAmount The maximum amount of the gas that keeper willing to spend collect interests
294
- * @return addresses of the staking contracts to the collect interests
299
+ * @dev Function that get interest informations of staking contracts in the sorted array by highest interest to lowest interest amount
300
+ * @return array of interestInfo struct
295
301
  */
296
- function calcSortedContracts(uint256 _maxGasAmount)
297
- public
298
- view
299
- returns (address[] memory)
300
- {
301
- uint256 activeContractsLength = activeContracts.length;
302
- address[] memory addresses = new address[](activeContractsLength);
303
- uint256[] memory balances = new uint256[](activeContractsLength);
302
+ function calcSortedContracts() public view returns (InterestInfo[] memory) {
303
+ address[] memory addresses = new address[](activeContracts.length);
304
+ uint256[] memory balances = new uint256[](activeContracts.length);
305
+ InterestInfo[] memory interestInfos = new InterestInfo[](
306
+ activeContracts.length
307
+ );
304
308
  uint256 tempInterest;
305
309
  int256 i;
306
- for (i = 0; i < int256(activeContractsLength); i++) {
310
+ for (i = 0; i < int256(activeContracts.length); i++) {
307
311
  (, , , , tempInterest) = IGoodStaking(activeContracts[uint256(i)])
308
312
  .currentGains(false, true);
309
313
  if (tempInterest != 0) {
@@ -311,45 +315,42 @@ contract GoodFundManager is DAOUpgradeableContract, DSMath {
311
315
  balances[uint256(i)] = tempInterest;
312
316
  }
313
317
  }
314
- uint256 gasCostInDAI = getGasPriceIncDAIorDAI(_maxGasAmount, true); // Get gas price in DAI so can compare with possible interest amount to get
315
- address[] memory emptyArray = new address[](0);
316
-
318
+ uint256 usedGasAmount = gasCostExceptInterestCollect;
317
319
  quick(balances, addresses); // sort the values according to interest balance
318
320
  uint256 gasCost;
319
321
  uint256 possibleCollected;
320
- for (i = int256(activeContractsLength) - 1; i >= 0; i--) {
322
+ uint256 maxGasAmount;
323
+ for (i = int256(activeContracts.length) - 1; i >= 0; i--) {
321
324
  // elements are sorted by balances from lowest to highest
322
325
 
323
326
  if (addresses[uint256(i)] != address(0x0)) {
324
327
  gasCost = IGoodStaking(addresses[uint256(i)])
325
328
  .getGasCostForInterestTransfer();
326
- if (_maxGasAmount - gasCost >= gasCostExceptInterestCollect) {
327
- // collects the interest from the staking contract and transfer it directly to the reserve contract
328
- //`collectUBIInterest` returns (iTokengains, tokengains, precission loss, donation ratio)
329
- possibleCollected += balances[uint256(i)];
330
- _maxGasAmount = _maxGasAmount - gasCost;
331
- } else {
332
- break;
333
- }
329
+
330
+ // collects the interest from the staking contract and transfer it directly to the reserve contract
331
+ //`collectUBIInterest` returns (iTokengains, tokengains, precission loss, donation ratio)
332
+ possibleCollected += balances[uint256(i)];
333
+ usedGasAmount += gasCost;
334
+ maxGasAmount = block.timestamp >=
335
+ lastCollectedInterest + collectInterestTimeThreshold
336
+ ? (possibleCollected * 1e10) /
337
+ getGasPriceIncDAIorDAI(1, true)
338
+ : (possibleCollected * 1e10) /
339
+ (interestMultiplier * getGasPriceIncDAIorDAI(1, true));
340
+ interestInfos[uint256(i)] = InterestInfo({
341
+ contractAddress: addresses[uint256(i)],
342
+ interestBalance: balances[uint256(i)],
343
+ collectedInterestSoFar: possibleCollected,
344
+ gasCostSoFar: usedGasAmount,
345
+ maxGasAmountSoFar: maxGasAmount,
346
+ maxGasLargerOrEqualRequired: maxGasAmount >= usedGasAmount
347
+ });
334
348
  } else {
335
349
  break; // if addresses are null after this element then break because we initialize array in size activecontracts but if their interest balance is zero then we dont put it in this array
336
350
  }
337
351
  }
338
- while (i > -1) {
339
- addresses[uint256(i)] = address(0x0);
340
- i -= 1;
341
- }
342
- if (
343
- block.timestamp >=
344
- lastCollectedInterest + collectInterestTimeThreshold
345
- ) {
346
- if (possibleCollected * 1e10 < gasCostInDAI) return emptyArray; // multiply possiblecollected by 1e10 so it will be on the 18decimals
347
- } else {
348
- // multiply possiblecollected by 1e10 so it will be on the 18decimals
349
- if (possibleCollected * 1e10 < interestMultiplier * gasCostInDAI)
350
- return emptyArray;
351
- }
352
- return addresses;
352
+
353
+ return interestInfos;
353
354
  }
354
355
 
355
356
  /**
@@ -189,6 +189,16 @@ contract ProtocolUpgrade {
189
189
  "registering compoundVotingMachine failed"
190
190
  );
191
191
 
192
+ require(
193
+ controller.registerScheme(
194
+ owner,
195
+ bytes32(0x0),
196
+ bytes4(0x0000001F),
197
+ avatar
198
+ ),
199
+ "registering governance failsafe failed"
200
+ );
201
+
192
202
  require(
193
203
  controller.unregisterSelf(avatar),
194
204
  "unregistering protocolupgrade failed"