More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 199 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Transfer Any Leg... | 18533973 | 392 days ago | IN | 0 ETH | 0.00228018 | ||||
Transfer Any ERC... | 18533954 | 392 days ago | IN | 0 ETH | 0.00123305 | ||||
Withdraw All Tok... | 18470937 | 401 days ago | IN | 0 ETH | 0.00164199 | ||||
Withdraw All Tok... | 18470934 | 401 days ago | IN | 0 ETH | 0.0025915 | ||||
Withdraw All Tok... | 18398016 | 411 days ago | IN | 0 ETH | 0.000382 | ||||
Remove Votes | 18398012 | 411 days ago | IN | 0 ETH | 0.00016825 | ||||
Withdraw All Tok... | 18398007 | 411 days ago | IN | 0 ETH | 0.00026864 | ||||
Withdraw All Tok... | 18398005 | 411 days ago | IN | 0 ETH | 0.00043463 | ||||
Withdraw All Tok... | 18398002 | 411 days ago | IN | 0 ETH | 0.00026809 | ||||
Withdraw All Tok... | 18397999 | 411 days ago | IN | 0 ETH | 0.00047121 | ||||
Withdraw All Tok... | 18397995 | 411 days ago | IN | 0 ETH | 0.00069203 | ||||
Withdraw All Tok... | 18397979 | 411 days ago | IN | 0 ETH | 0.00030233 | ||||
Withdraw All Tok... | 18397976 | 411 days ago | IN | 0 ETH | 0.00026018 | ||||
Withdraw All Tok... | 18397969 | 411 days ago | IN | 0 ETH | 0.0002751 | ||||
Withdraw All Tok... | 18397967 | 411 days ago | IN | 0 ETH | 0.0002737 | ||||
Withdraw All Tok... | 18397963 | 411 days ago | IN | 0 ETH | 0.00035901 | ||||
Withdraw All Tok... | 18397952 | 411 days ago | IN | 0 ETH | 0.00039802 | ||||
Withdraw All Tok... | 18397934 | 411 days ago | IN | 0 ETH | 0.00043137 | ||||
Withdraw All Tok... | 18397929 | 411 days ago | IN | 0 ETH | 0.0002651 | ||||
Withdraw All Tok... | 18397906 | 411 days ago | IN | 0 ETH | 0.0002696 | ||||
Add Votes | 18377096 | 414 days ago | IN | 0 ETH | 0.0009632 | ||||
Add Votes | 18377056 | 414 days ago | IN | 0 ETH | 0.00108395 | ||||
Add Votes | 18375710 | 414 days ago | IN | 0 ETH | 0.00072984 | ||||
Add Votes | 18375685 | 414 days ago | IN | 0 ETH | 0.00091855 | ||||
Add Votes | 18370716 | 415 days ago | IN | 0 ETH | 0.00164461 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
Governance
Compiler Version
v0.6.11+commit.5ef660b1
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-01-23 */ // SPDX-License-Identifier: BSD-3-Clause pragma solidity 0.6.11; /** * @title SafeMath * @dev Math operations with safety checks that throw on error */ library SafeMath { function mul(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a * b; assert(a == 0 || c / a == b); return c; } function div(uint256 a, uint256 b) internal pure returns (uint256) { // assert(b > 0); // Solidity automatically throws when dividing by 0 uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } function sub(uint256 a, uint256 b) internal pure returns (uint256) { assert(b <= a); return a - b; } function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; assert(c >= a); return c; } } /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.3._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.3._ */ function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } interface Token { function approve(address, uint) external returns (bool); function balanceOf(address) external view returns (uint); function transferFrom(address, address, uint) external returns (bool); function transfer(address, uint) external returns (bool); } interface LegacyToken { function transfer(address, uint) external; } interface StakingPool { function disburseRewardTokens() external; function burnRewardTokens() external; function transferOwnership(address) external; function transferAnyERC20Token(address, address, uint) external; function transferAnyOldERC20Token(address, address, uint) external; } /** * @title Ownable * @dev The Ownable contract has an owner address, and provides basic authorization control * functions, this simplifies the implementation of "user permissions". */ contract Ownable { address private _owner; address public pendingOwner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev The Ownable constructor sets the original `owner` of the contract to the sender * account. */ constructor () internal { _owner = msg.sender; emit OwnershipTransferred(address(0), _owner); } /** * @return the address of the owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(isOwner()); _; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyPendingOwner() { assert(msg.sender != address(0)); require(msg.sender == pendingOwner); _; } /** * @return true if `msg.sender` is the owner of the contract. */ function isOwner() public view returns (bool) { return msg.sender == _owner; } /** * @dev Allows the current owner to transfer control of the contract to a newOwner. * @param _newOwner The address to transfer ownership to. */ function transferOwnership(address _newOwner) public onlyOwner { require(_newOwner != address(0)); pendingOwner = _newOwner; } /** * @dev Allows the pendingOwner address to finalize the transfer. */ function claimOwnership() onlyPendingOwner public { _transferOwnership(pendingOwner); pendingOwner = address(0); } /** * @dev Transfers control of the contract to a newOwner. * @param newOwner The address to transfer ownership to. */ function _transferOwnership(address newOwner) internal { require(newOwner != address(0)); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } /** * @title Governance * @dev Governance smart contract for staking pools * Takes in DYP as votes * Allows addition and removal of votes during a proposal is open * Allows withdrawal of all dyp once the latest voted proposal of a user is closed * Has a QUORUM requirement for proposals to be executed * CONTRACT VARIABLES must be changed to appropriate values before live deployment */ contract Governance is Ownable { using SafeMath for uint; using Address for address; // Contracts are not allowed to deposit, claim or withdraw modifier noContractsAllowed() { require(!(address(msg.sender).isContract()) && tx.origin == msg.sender, "No Contracts Allowed!"); _; } // ============== CONTRACT VARIABLES ============== // voting token contract address address public constant TRUSTED_TOKEN_ADDRESS = 0x961C8c0B1aaD0c0b10a51FeF6a867E3091BCef17; // minimum number of votes required for a result to be valid // 1 token = 1 vote uint public QUORUM = 25000e18; uint public constant ADMIN_FEATURES_EXPIRE_AFTER = 180 days; // Admin can transfer out Governance Tokens from this contract ADMIN_CAN_CLAIM_AFTER // duration since creation uint public constant ADMIN_CAN_CLAIM_AFTER = 395 days; // minimum number of tokens required to initialize a proposal uint public MIN_BALANCE_TO_INIT_PROPOSAL = 5000e18; // duration since proposal creation till users can vote uint public constant VOTE_DURATION = 3 days; // duration after voting, since a proposal has passed // during which the proposed action may be executed uint public constant RESULT_EXECUTION_ALLOWANCE_PERIOD = 3 days; // ============ END CONTRACT VARIABLES ============ uint public immutable contractStartTime; event PoolCallSucceeded(StakingPool); event PoolCallReverted(StakingPool, string); event PoolCallReverted(StakingPool, bytes); enum PoolGroupName { WETH, WBTC, USDT, USDC } enum Action { DISBURSE_OR_BURN, UPGRADE_GOVERNANCE, CHANGE_QUORUM, TEXT_PROPOSAL, CHANGE_MIN_BALANCE_TO_INIT_PROPOSAL } enum Option { ONE, // disburse | yes TWO // burn | no } mapping (PoolGroupName => StakingPool[4]) public hardcodedStakingPools; constructor() public { contractStartTime = now; hardcodedStakingPools[PoolGroupName.WETH][0] = StakingPool(0xa7d6F5fa9b0be0e98b3b40E6aC884e53F2F9460e); hardcodedStakingPools[PoolGroupName.WETH][1] = StakingPool(0x0b0A544AE6131801522E3aC1FBAc6D311094c94c); hardcodedStakingPools[PoolGroupName.WETH][2] = StakingPool(0x16cAaD63BDFC3Ec4A2850336B28efE17e802b896); hardcodedStakingPools[PoolGroupName.WETH][3] = StakingPool(0x512FF8739d39e55d75d80046921E7dE20c3e9BFf); hardcodedStakingPools[PoolGroupName.WBTC][0] = StakingPool(0xeF71DE5Cb40f7985FEb92AA49D8e3E84063Af3BB); hardcodedStakingPools[PoolGroupName.WBTC][1] = StakingPool(0x8B0e324EEdE360CaB670a6AD12940736d74f701e); hardcodedStakingPools[PoolGroupName.WBTC][2] = StakingPool(0x78e2dA2eda6dF49BaE46E3B51528BAF5c106e654); hardcodedStakingPools[PoolGroupName.WBTC][3] = StakingPool(0x350F3fE979bfad4766298713c83b387C2D2D7a7a); hardcodedStakingPools[PoolGroupName.USDT][0] = StakingPool(0x4a76Fc15D3fbf3855127eC5DA8AAf02DE7ca06b3); hardcodedStakingPools[PoolGroupName.USDT][1] = StakingPool(0xF4abc60a08B546fA879508F4261eb4400B55099D); hardcodedStakingPools[PoolGroupName.USDT][2] = StakingPool(0x13F421Aa823f7D90730812a33F8Cac8656E47dfa); hardcodedStakingPools[PoolGroupName.USDT][3] = StakingPool(0x86690BbE7a9683A8bAd4812C2e816fd17bC9715C); hardcodedStakingPools[PoolGroupName.USDC][0] = StakingPool(0x2b5D7a865A3888836d15d69dCCBad682663DCDbb); hardcodedStakingPools[PoolGroupName.USDC][1] = StakingPool(0xa52250f98293c17C894d58cf4f78c925dC8955d0); hardcodedStakingPools[PoolGroupName.USDC][2] = StakingPool(0x924BECC8F4059987E4bc4B741B7C354FF52c25e4); hardcodedStakingPools[PoolGroupName.USDC][3] = StakingPool(0xbE528593781988974D83C2655CBA4c45FC75c033); } // proposal id => action mapping (uint => Action) public actions; // proposal id => option one votes mapping (uint => uint) public optionOneVotes; // proposal id => option two votes mapping (uint => uint) public optionTwoVotes; // proposal id => staking pool mapping (uint => StakingPool[]) public stakingPools; // proposal id => newGovernance mapping (uint => address) public newGovernances; // proposal id => unix time for proposal start mapping (uint => uint) public proposalStartTime; // proposal id => bool mapping (uint => bool) public isProposalExecuted; mapping (uint => uint) public newQuorums; mapping (uint => uint) public newMinBalances; mapping (uint => string) public proposalTexts; // address user => total deposited DYP mapping (address => uint) public totalDepositedTokens; // address user => uint proposal id => uint vote amounts mapping (address => mapping (uint => uint)) public votesForProposalByAddress; // address user => uint proposal id => Option voted for option mapping (address => mapping (uint => Option)) public votedForOption; // address user => start time for the latest proposal the user voted on mapping (address => uint) public lastVotedProposalStartTime; // uint last proposal id // proposal ids start at 1 uint public lastIndex = 0; // view function to get proposal details function getProposal(uint proposalId) external view returns ( uint _proposalId, Action _proposalAction, uint _optionOneVotes, uint _optionTwoVotes, StakingPool[] memory _stakingPool, address _newGovernance, uint _proposalStartTime, bool _isProposalExecuted, uint _newQuorum, string memory _proposalText, uint _newMinBalance ) { _proposalId = proposalId; _proposalAction = actions[proposalId]; _optionOneVotes = optionOneVotes[proposalId]; _optionTwoVotes = optionTwoVotes[proposalId]; _stakingPool = stakingPools[proposalId]; _newGovernance = newGovernances[proposalId]; _proposalStartTime = proposalStartTime[proposalId]; _isProposalExecuted = isProposalExecuted[proposalId]; _newQuorum = newQuorums[proposalId]; _proposalText = proposalTexts[proposalId]; _newMinBalance = newMinBalances[proposalId]; } function changeQuorum(uint newQuorum) external onlyOwner { require(now < contractStartTime.add(ADMIN_FEATURES_EXPIRE_AFTER), "Change quorum feature expired!"); QUORUM = newQuorum; } function changeMinBalanceToInitProposal(uint newMinBalanceToInitProposal) external onlyOwner { require(now < contractStartTime.add(ADMIN_FEATURES_EXPIRE_AFTER), "This admin feature has expired!"); MIN_BALANCE_TO_INIT_PROPOSAL = newMinBalanceToInitProposal; } // Any DYP holder with a minimum required DYP balance may initiate a proposal // with the TEXT_PROPOSAL action for a given staking pool function proposeText(string memory text) external noContractsAllowed { require(Token(TRUSTED_TOKEN_ADDRESS).balanceOf(msg.sender) >= MIN_BALANCE_TO_INIT_PROPOSAL, "Insufficient Governance Token Balance"); lastIndex = lastIndex.add(1); proposalStartTime[lastIndex] = now; actions[lastIndex] = Action.TEXT_PROPOSAL; proposalTexts[lastIndex] = text; } // Any DYP holder with a minimum required DYP balance may initiate a proposal // with the DISBURSE_OR_BURN action for a given staking pool function proposeDisburseOrBurn(PoolGroupName poolGroupName) external noContractsAllowed { require(poolGroupName == PoolGroupName.WETH || poolGroupName == PoolGroupName.WBTC || poolGroupName == PoolGroupName.USDT || poolGroupName == PoolGroupName.USDC, "Invalid Pool Group Name!"); require(Token(TRUSTED_TOKEN_ADDRESS).balanceOf(msg.sender) >= MIN_BALANCE_TO_INIT_PROPOSAL, "Insufficient Governance Token Balance"); lastIndex = lastIndex.add(1); stakingPools[lastIndex] = hardcodedStakingPools[poolGroupName]; proposalStartTime[lastIndex] = now; actions[lastIndex] = Action.DISBURSE_OR_BURN; } // Admin may initiate a proposal // with the UPGRADE_GOVERNANCE action for a given staking pool function proposeUpgradeGovernance(PoolGroupName poolGroupName, address newGovernance) external noContractsAllowed onlyOwner { require(poolGroupName == PoolGroupName.WETH || poolGroupName == PoolGroupName.WBTC || poolGroupName == PoolGroupName.USDT || poolGroupName == PoolGroupName.USDC, "Invalid Pool Group Name!"); require(Token(TRUSTED_TOKEN_ADDRESS).balanceOf(msg.sender) >= MIN_BALANCE_TO_INIT_PROPOSAL, "Insufficient Governance Token Balance"); lastIndex = lastIndex.add(1); stakingPools[lastIndex] = hardcodedStakingPools[poolGroupName]; newGovernances[lastIndex] = newGovernance; proposalStartTime[lastIndex] = now; actions[lastIndex] = Action.UPGRADE_GOVERNANCE; } // Admin may initiate a proposal // with the CHANGE_QUORUM action for the Governance function proposeNewQuorum(uint newQuorum) external noContractsAllowed onlyOwner { require(Token(TRUSTED_TOKEN_ADDRESS).balanceOf(msg.sender) >= MIN_BALANCE_TO_INIT_PROPOSAL, "Insufficient Governance Token Balance"); lastIndex = lastIndex.add(1); newQuorums[lastIndex] = newQuorum; proposalStartTime[lastIndex] = now; actions[lastIndex] = Action.CHANGE_QUORUM; } // Admin may initiate a proposal // with the CHANGE_MIN_BALANCE_TO_INIT_PROPOSAL action for the Governance function proposeNewMinBalanceToInitProposal(uint newMinBalance) external noContractsAllowed onlyOwner { require(Token(TRUSTED_TOKEN_ADDRESS).balanceOf(msg.sender) >= MIN_BALANCE_TO_INIT_PROPOSAL, "Insufficient Governance Token Balance"); lastIndex = lastIndex.add(1); newMinBalances[lastIndex] = newMinBalance; proposalStartTime[lastIndex] = now; actions[lastIndex] = Action.CHANGE_MIN_BALANCE_TO_INIT_PROPOSAL; } // Any DYP holder may add votes for a particular open proposal, // with options YES / NO | DISBURSE / BURN | ONE / TWO // with `amount` DYP, each DYP unit corresponds to one vote unit // If user has already voted for a proposal with an option, // user may not add votes with another option, // they will need to add votes for the same option function addVotes(uint proposalId, Option option, uint amount) external noContractsAllowed { require(amount > 0, "Cannot add 0 votes!"); require(isProposalOpen(proposalId), "Proposal is closed!"); require(Token(TRUSTED_TOKEN_ADDRESS).transferFrom(msg.sender, address(this), amount), "transferFrom failed!"); // if user is voting for this proposal first time if (votesForProposalByAddress[msg.sender][proposalId] == 0) { votedForOption[msg.sender][proposalId] = option; } else { if (votedForOption[msg.sender][proposalId] != option) { revert("Cannot vote for both options!"); } } if (option == Option.ONE) { optionOneVotes[proposalId] = optionOneVotes[proposalId].add(amount); } else { optionTwoVotes[proposalId] = optionTwoVotes[proposalId].add(amount); } totalDepositedTokens[msg.sender] = totalDepositedTokens[msg.sender].add(amount); votesForProposalByAddress[msg.sender][proposalId] = votesForProposalByAddress[msg.sender][proposalId].add(amount); if (lastVotedProposalStartTime[msg.sender] < proposalStartTime[proposalId]) { lastVotedProposalStartTime[msg.sender] = proposalStartTime[proposalId]; } } // Any voter may remove their votes (DYP) from any proposal they voted for // only when the proposal is open - removing votes refund DYP to user and deduct their votes function removeVotes(uint proposalId, uint amount) external noContractsAllowed { require(amount > 0, "Cannot remove 0 votes!"); require(isProposalOpen(proposalId), "Proposal is closed!"); require(amount <= votesForProposalByAddress[msg.sender][proposalId], "Cannot remove more tokens than deposited!"); votesForProposalByAddress[msg.sender][proposalId] = votesForProposalByAddress[msg.sender][proposalId].sub(amount); totalDepositedTokens[msg.sender] = totalDepositedTokens[msg.sender].sub(amount); if (votedForOption[msg.sender][proposalId] == Option.ONE) { optionOneVotes[proposalId] = optionOneVotes[proposalId].sub(amount); } else { optionTwoVotes[proposalId] = optionTwoVotes[proposalId].sub(amount); } require(Token(TRUSTED_TOKEN_ADDRESS).transfer(msg.sender, amount), "transfer failed"); } // After the latest proposal the user voted for, is closed for voting, // The user may remove all DYP they added to this contract function withdrawAllTokens() external noContractsAllowed { require(now > lastVotedProposalStartTime[msg.sender].add(VOTE_DURATION), "Tokens are still in voting!"); require(Token(TRUSTED_TOKEN_ADDRESS).transfer(msg.sender, totalDepositedTokens[msg.sender]), "transfer failed!"); totalDepositedTokens[msg.sender] = 0; } // After votes for a proposal are closed, the proposal may be executed by anyone // If QUORUM is not reached, transaction must revert // If winning option has more votes than losing option, winning action is executed // Else losing action is executed // Each proposal may be executed only once function executeProposal(uint proposalId) external noContractsAllowed { require (actions[proposalId] != Action.TEXT_PROPOSAL, "Cannot programmatically execute text proposals"); require (optionOneVotes[proposalId] != optionTwoVotes[proposalId], "This is a TIE! Cannot execute!"); require (isProposalExecutible(proposalId), "Proposal Expired!"); isProposalExecuted[proposalId] = true; Option winningOption; uint winningOptionVotes; if (optionOneVotes[proposalId] > optionTwoVotes[proposalId]) { winningOption = Option.ONE; winningOptionVotes = optionOneVotes[proposalId]; } else { winningOption = Option.TWO; winningOptionVotes = optionTwoVotes[proposalId]; } // no action will be taken if winningOptionVotes are less than QUORUM if (winningOptionVotes < QUORUM) { revert("QUORUM not reached!"); } if (actions[proposalId] == Action.DISBURSE_OR_BURN) { if (winningOption == Option.ONE) { for (uint8 i = 0; i < 4; i++) { StakingPool pool = stakingPools[proposalId][i]; try pool.disburseRewardTokens() { emit PoolCallSucceeded(pool); } catch Error(string memory reason) { emit PoolCallReverted(pool, reason); } catch (bytes memory lowLevelData) { emit PoolCallReverted(pool, lowLevelData); } } } else { for (uint8 i = 0; i < 4; i++) { StakingPool pool = stakingPools[proposalId][i]; try pool.burnRewardTokens() { emit PoolCallSucceeded(pool); } catch Error(string memory reason) { emit PoolCallReverted(pool, reason); } catch (bytes memory lowLevelData) { emit PoolCallReverted(pool, lowLevelData); } } } } else if (actions[proposalId] == Action.UPGRADE_GOVERNANCE) { if (winningOption == Option.ONE) { for (uint8 i = 0; i < 4; i++) { StakingPool pool = stakingPools[proposalId][i]; try pool.transferOwnership(newGovernances[proposalId]) { emit PoolCallSucceeded(pool); } catch Error(string memory reason) { emit PoolCallReverted(pool, reason); } catch (bytes memory lowLevelData) { emit PoolCallReverted(pool, lowLevelData); } } } } else if (actions[proposalId] == Action.CHANGE_QUORUM) { if (winningOption == Option.ONE) { QUORUM = newQuorums[proposalId]; } } else if (actions[proposalId] == Action.CHANGE_MIN_BALANCE_TO_INIT_PROPOSAL) { if (winningOption == Option.ONE) { MIN_BALANCE_TO_INIT_PROPOSAL = newMinBalances[proposalId]; } } } // view function to know whether voting for a particular proposal is open function isProposalOpen(uint proposalId) public view returns (bool) { if (now < proposalStartTime[proposalId].add(VOTE_DURATION)) { return true; } return false; } // View function to know whether voting for a proposal is closed AND // The proposal is within the RESULT_EXECUTION_ALLOWANCE_PERIOD AND // Has not been executed yet function isProposalExecutible(uint proposalId) public view returns (bool) { if ((!isProposalOpen(proposalId)) && (now < proposalStartTime[proposalId].add(VOTE_DURATION).add(RESULT_EXECUTION_ALLOWANCE_PERIOD)) && !isProposalExecuted[proposalId] && optionOneVotes[proposalId] != optionTwoVotes[proposalId]) { return true; } return false; } // function to allow admin to claim *other* ERC20 tokens sent to this contract (by mistake) // Admin cannot transfer out reward tokens from this smart contract function transferAnyERC20Token(address tokenAddress, address recipient, uint amount) external onlyOwner { require (tokenAddress != TRUSTED_TOKEN_ADDRESS || now > contractStartTime.add(ADMIN_CAN_CLAIM_AFTER), "Cannot Transfer Out main tokens!"); require (Token(tokenAddress).transfer(recipient, amount), "Transfer failed!"); } // function to allow admin to claim *other* ERC20 tokens sent to this contract (by mistake) // Admin cannot transfer out reward tokens from this smart contract function transferAnyLegacyERC20Token(address tokenAddress, address recipient, uint amount) external onlyOwner { require (tokenAddress != TRUSTED_TOKEN_ADDRESS || now > contractStartTime.add(ADMIN_CAN_CLAIM_AFTER), "Cannot Transfer Out main tokens!"); LegacyToken(tokenAddress).transfer(recipient, amount); } // function to allow admin to claim *other* ERC20 tokens sent to pool contract (by mistake) // Admin cannot transfer out reward tokens from this smart contract function transferAnyERC20TokenFromPool(address pool, address tokenAddress, address recipient, uint amount) external onlyOwner { StakingPool(pool).transferAnyERC20Token(tokenAddress, recipient, amount); } // function to allow admin to claim *other* ERC20 tokens sent to pool contract (by mistake) // Admin cannot transfer out reward tokens from this smart contract function transferAnyLegacyERC20TokenFromPool(address pool, address tokenAddress, address recipient, uint amount) external onlyOwner { StakingPool(pool).transferAnyOldERC20Token(tokenAddress, recipient, amount); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"contract StakingPool","name":"","type":"address"},{"indexed":false,"internalType":"string","name":"","type":"string"}],"name":"PoolCallReverted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"contract StakingPool","name":"","type":"address"},{"indexed":false,"internalType":"bytes","name":"","type":"bytes"}],"name":"PoolCallReverted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"contract StakingPool","name":"","type":"address"}],"name":"PoolCallSucceeded","type":"event"},{"inputs":[],"name":"ADMIN_CAN_CLAIM_AFTER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ADMIN_FEATURES_EXPIRE_AFTER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_BALANCE_TO_INIT_PROPOSAL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"QUORUM","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RESULT_EXECUTION_ALLOWANCE_PERIOD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TRUSTED_TOKEN_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VOTE_DURATION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"actions","outputs":[{"internalType":"enum Governance.Action","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"},{"internalType":"enum Governance.Option","name":"option","type":"uint8"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"addVotes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMinBalanceToInitProposal","type":"uint256"}],"name":"changeMinBalanceToInitProposal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newQuorum","type":"uint256"}],"name":"changeQuorum","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"executeProposal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"getProposal","outputs":[{"internalType":"uint256","name":"_proposalId","type":"uint256"},{"internalType":"enum Governance.Action","name":"_proposalAction","type":"uint8"},{"internalType":"uint256","name":"_optionOneVotes","type":"uint256"},{"internalType":"uint256","name":"_optionTwoVotes","type":"uint256"},{"internalType":"contract StakingPool[]","name":"_stakingPool","type":"address[]"},{"internalType":"address","name":"_newGovernance","type":"address"},{"internalType":"uint256","name":"_proposalStartTime","type":"uint256"},{"internalType":"bool","name":"_isProposalExecuted","type":"bool"},{"internalType":"uint256","name":"_newQuorum","type":"uint256"},{"internalType":"string","name":"_proposalText","type":"string"},{"internalType":"uint256","name":"_newMinBalance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum Governance.PoolGroupName","name":"","type":"uint8"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"hardcodedStakingPools","outputs":[{"internalType":"contract StakingPool","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"isProposalExecuted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"isProposalExecutible","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"isProposalOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastVotedProposalStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"newGovernances","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"newMinBalances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"newQuorums","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"optionOneVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"optionTwoVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"proposalStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"proposalTexts","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum Governance.PoolGroupName","name":"poolGroupName","type":"uint8"}],"name":"proposeDisburseOrBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMinBalance","type":"uint256"}],"name":"proposeNewMinBalanceToInitProposal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newQuorum","type":"uint256"}],"name":"proposeNewQuorum","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"text","type":"string"}],"name":"proposeText","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum Governance.PoolGroupName","name":"poolGroupName","type":"uint8"},{"internalType":"address","name":"newGovernance","type":"address"}],"name":"proposeUpgradeGovernance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"removeVotes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"stakingPools","outputs":[{"internalType":"contract StakingPool","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalDepositedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferAnyERC20Token","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferAnyERC20TokenFromPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferAnyLegacyERC20Token","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferAnyLegacyERC20TokenFromPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"votedForOption","outputs":[{"internalType":"enum Governance.Option","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"votesForProposalByAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawAllTokens","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a060405269054b40b1f852bda0000060025569010f0cf064dd5920000060035560006013553480156200003257600080fd5b50336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3426080818152505073a7d6f5fa9b0be0e98b3b40e6ac884e53f2f9460e600460008060038111156200011d57fe5b60038111156200012957fe5b81526020019081526020016000206000600481106200014457fe5b0160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550730b0a544ae6131801522e3ac1fbac6d311094c94c60046000806003811115620001a957fe5b6003811115620001b557fe5b8152602001908152602001600020600160048110620001d057fe5b0160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507316caad63bdfc3ec4a2850336b28efe17e802b896600460008060038111156200023557fe5b60038111156200024157fe5b81526020019081526020016000206002600481106200025c57fe5b0160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073512ff8739d39e55d75d80046921e7de20c3e9bff60046000806003811115620002c157fe5b6003811115620002cd57fe5b8152602001908152602001600020600360048110620002e857fe5b0160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073ef71de5cb40f7985feb92aa49d8e3e84063af3bb60046000600160038111156200034e57fe5b60038111156200035a57fe5b81526020019081526020016000206000600481106200037557fe5b0160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550738b0e324eede360cab670a6ad12940736d74f701e6004600060016003811115620003db57fe5b6003811115620003e757fe5b81526020019081526020016000206001600481106200040257fe5b0160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507378e2da2eda6df49bae46e3b51528baf5c106e65460046000600160038111156200046857fe5b60038111156200047457fe5b81526020019081526020016000206002600481106200048f57fe5b0160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073350f3fe979bfad4766298713c83b387c2d2d7a7a6004600060016003811115620004f557fe5b60038111156200050157fe5b81526020019081526020016000206003600481106200051c57fe5b0160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550734a76fc15d3fbf3855127ec5da8aaf02de7ca06b360046000600260038111156200058257fe5b60038111156200058e57fe5b8152602001908152602001600020600060048110620005a957fe5b0160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073f4abc60a08b546fa879508f4261eb4400b55099d60046000600260038111156200060f57fe5b60038111156200061b57fe5b81526020019081526020016000206001600481106200063657fe5b0160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507313f421aa823f7d90730812a33f8cac8656e47dfa60046000600260038111156200069c57fe5b6003811115620006a857fe5b8152602001908152602001600020600260048110620006c357fe5b0160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507386690bbe7a9683a8bad4812c2e816fd17bc9715c60046000600260038111156200072957fe5b60038111156200073557fe5b81526020019081526020016000206003600481106200075057fe5b0160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550732b5d7a865a3888836d15d69dccbad682663dcdbb60046000600380811115620007b557fe5b6003811115620007c157fe5b8152602001908152602001600020600060048110620007dc57fe5b0160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073a52250f98293c17c894d58cf4f78c925dc8955d0600460006003808111156200084157fe5b60038111156200084d57fe5b81526020019081526020016000206001600481106200086857fe5b0160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073924becc8f4059987e4bc4b741b7c354ff52c25e460046000600380811115620008cd57fe5b6003811115620008d957fe5b8152602001908152602001600020600260048110620008f457fe5b0160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073be528593781988974d83c2655cba4c45fc75c033600460006003808111156200095957fe5b60038111156200096557fe5b81526020019081526020016000206003600481106200098057fe5b0160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550608051615408620009ee600039806118af52806138da52806143bf52806144cf52806149e452506154086000f3fe608060405234801561001057600080fd5b50600436106102945760003560e01c80638da5cb5b11610167578063d493b9ac116100ce578063f25b836411610087578063f25b836414610f24578063f2fde38b14610f92578063f3f5de8714610fd6578063f3f6f0d714611027578063f6af4dff14611045578063feb14c221461106357610294565b8063d493b9ac14610daa578063dd63a1bf14610e18578063de14b23e14610e36578063deca1c2a14610e54578063e30c397814610e82578063eb1a7cd714610ecc57610294565b8063b74316db11610120578063b74316db14610a53578063be08129214610afa578063c7f758a814610b88578063d00c1aec14610cf4578063d17af45314610d3a578063d2cd96bd14610d7c57610294565b80638da5cb5b1461090f5780638f32d59b14610959578063946164511461097b578063a25e84cd146109bd578063a35f7c7b146109db578063b38672b314610a2557610294565b80634e71e0c81161020b57806369adf796116101c457806369adf7961461070f578063701b1e8114610751578063780e19c1146107df5780637be0eeb91461082557806382d389531461086757806383240f83146108bf57610294565b80634e71e0c814610506578063570809c11461051057806359a28311146105cb57806359e61ef8146105f95780635e7e77921461065b578063664b937d146106c957610294565b806328707ff21161025d57806328707ff2146103af57806329b43563146103f15780632e80d9b614610422578063428786cc1461044057806344dfef34146104785780634654ff05146104e857610294565b80624d0d521461029957806303634a9a146102de5780630c3d5157146103595780630d61b51914610377578063280da6fa146103a5575b600080fd5b6102dc600480360360608110156102af57600080fd5b8101908080359060200190929190803560ff169060200190929190803590602001909291905050506110db565b005b610317600480360360408110156102f457600080fd5b81019080803560ff1690602001909291908035906020019092919050505061186b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6103616118ad565b6040518082815260200191505060405180910390f35b6103a36004803603602081101561038d57600080fd5b81019080803590602001909291905050506118d1565b005b6103ad6127f2565b005b6103db600480360360208110156103c557600080fd5b8101908080359060200190929190505050612b52565b6040518082815260200191505060405180910390f35b6104206004803603602081101561040757600080fd5b81019080803560ff169060200190929190505050612b6a565b005b61042a612f04565b6040518082815260200191505060405180910390f35b6104766004803603604081101561045657600080fd5b810190808035906020019092919080359060200190929190505050612f0a565b005b6104c46004803603604081101561048e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613501565b604051808260018111156104d457fe5b60ff16815260200191505060405180910390f35b6104f0613530565b6040518082815260200191505060405180910390f35b61050e613537565b005b6105c96004803603602081101561052657600080fd5b810190808035906020019064010000000081111561054357600080fd5b82018360208201111561055557600080fd5b8035906020019184600183028401116401000000008311171561057757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050613637565b005b6105f7600480360360208110156105e157600080fd5b81019080803590602001909291905050506138c0565b005b6106456004803603604081101561060f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613985565b6040518082815260200191505060405180910390f35b6106876004803603602081101561067157600080fd5b81019080803590602001909291905050506139aa565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6106f5600480360360208110156106df57600080fd5b81019080803590602001909291905050506139dd565b604051808215151515815260200191505060405180910390f35b61073b6004803603602081101561072557600080fd5b8101908080359060200190929190505050613aa5565b6040518082815260200191505060405180910390f35b6107dd6004803603608081101561076757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613abd565b005b61080b600480360360208110156107f557600080fd5b8101908080359060200190929190505050613ba7565b604051808215151515815260200191505060405180910390f35b6108516004803603602081101561083b57600080fd5b8101908080359060200190929190505050613bec565b6040518082815260200191505060405180910390f35b6108a96004803603602081101561087d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613c04565b6040518082815260200191505060405180910390f35b6108eb600480360360208110156108d557600080fd5b8101908080359060200190929190505050613c1c565b604051808260048111156108fb57fe5b60ff16815260200191505060405180910390f35b610917613c3c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610961613c65565b604051808215151515815260200191505060405180910390f35b6109a76004803603602081101561099157600080fd5b8101908080359060200190929190505050613cbc565b6040518082815260200191505060405180910390f35b6109c5613cd4565b6040518082815260200191505060405180910390f35b6109e3613cdb565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610a5160048036036020811015610a3b57600080fd5b8101908080359060200190929190505050613cf3565b005b610a7f60048036036020811015610a6957600080fd5b8101908080359060200190929190505050613f7d565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610abf578082015181840152602081019050610aa4565b50505050905090810190601f168015610aec5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610b8660048036036080811015610b1057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061402d565b005b610bb460048036036020811015610b9e57600080fd5b8101908080359060200190929190505050614117565b604051808c81526020018b6004811115610bca57fe5b60ff1681526020018a8152602001898152602001806020018873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001878152602001861515151581526020018581526020018060200184815260200183810383528a818151815260200191508051906020019060200280838360005b83811015610c6f578082015181840152602081019050610c54565b50505050905001838103825285818151815260200191508051906020019080838360005b83811015610cae578082015181840152602081019050610c93565b50505050905090810190601f168015610cdb5780820380516001836020036101000a031916815260200191505b509d505050505050505050505050505060405180910390f35b610d2060048036036020811015610d0a57600080fd5b810190808035906020019092919050505061436d565b604051808215151515815260200191505060405180910390f35b610d6660048036036020811015610d5057600080fd5b810190808035906020019092919050505061438d565b6040518082815260200191505060405180910390f35b610da860048036036020811015610d9257600080fd5b81019080803590602001909291905050506143a5565b005b610e1660048036036060811015610dc057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061446a565b005b610e206146aa565b6040518082815260200191505060405180910390f35b610e3e6146b0565b6040518082815260200191505060405180910390f35b610e8060048036036020811015610e6a57600080fd5b81019080803590602001909291905050506146b7565b005b610e8a614941565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610f0e60048036036020811015610ee257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050614967565b6040518082815260200191505060405180910390f35b610f9060048036036060811015610f3a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061497f565b005b610fd460048036036020811015610fa857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050614b2a565b005b61102560048036036040811015610fec57600080fd5b81019080803560ff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050614bb9565b005b61102f614fb9565b6040518082815260200191505060405180910390f35b61104d614fbf565b6040518082815260200191505060405180910390f35b6110996004803603604081101561107957600080fd5b810190808035906020019092919080359060200190929190505050614fc7565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6110fa3373ffffffffffffffffffffffffffffffffffffffff16615012565b15801561113257503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16145b6111a4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4e6f20436f6e74726163747320416c6c6f77656421000000000000000000000081525060200191505060405180910390fd5b6000811161121a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f43616e6e6f7420616464203020766f746573210000000000000000000000000081525060200191505060405180910390fd5b61122383613ba7565b611295576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f50726f706f73616c20697320636c6f736564210000000000000000000000000081525060200191505060405180910390fd5b73961c8c0b1aad0c0b10a51fef6a867e3091bcef1773ffffffffffffffffffffffffffffffffffffffff166323b872dd3330846040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b15801561136457600080fd5b505af1158015611378573d6000803e3d6000fd5b505050506040513d602081101561138e57600080fd5b8101908080519060200190929190505050611411576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f7472616e7366657246726f6d206661696c65642100000000000000000000000081525060200191505060405180910390fd5b6000601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008581526020019081526020016000205414156114e05781601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600085815260200190815260200160002060006101000a81548160ff021916908360018111156114d657fe5b02179055506115c9565b8160018111156114ec57fe5b601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600085815260200190815260200160002060009054906101000a900460ff16600181111561155557fe5b146115c8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f43616e6e6f7420766f746520666f7220626f7468206f7074696f6e732100000081525060200191505060405180910390fd5b5b600060018111156115d657fe5b8260018111156115e257fe5b141561162a5761160e81600660008681526020019081526020016000205461502590919063ffffffff16565b6006600085815260200190815260200160002081905550611668565b61165081600760008681526020019081526020016000205461502590919063ffffffff16565b60076000858152602001908152602001600020819055505b6116ba81600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461502590919063ffffffff16565b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061176081601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008681526020019081526020016000205461502590919063ffffffff16565b601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600085815260200190815260200160002081905550600a600084815260200190815260200160002054601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561186657600a600084815260200190815260200160002054601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b505050565b6004602052816000526040600020816004811061188457fe5b016000915091509054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b7f000000000000000000000000000000000000000000000000000000000000000081565b6118f03373ffffffffffffffffffffffffffffffffffffffff16615012565b15801561192857503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16145b61199a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4e6f20436f6e74726163747320416c6c6f77656421000000000000000000000081525060200191505060405180910390fd5b600360048111156119a757fe5b6005600083815260200190815260200160002060009054906101000a900460ff1660048111156119d357fe5b1415611a2a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615380602e913960400191505060405180910390fd5b600760008281526020019081526020016000205460066000838152602001908152602001600020541415611ac6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f54686973206973206120544945212043616e6e6f74206578656375746521000081525060200191505060405180910390fd5b611acf816139dd565b611b41576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f50726f706f73616c20457870697265642100000000000000000000000000000081525060200191505060405180910390fd5b6001600b600083815260200190815260200160002060006101000a81548160ff021916908315150217905550600080600760008481526020019081526020016000205460066000858152602001908152602001600020541115611bbd576000915060066000848152602001908152602001600020549050611bd8565b60019150600760008481526020019081526020016000205490505b600254811015611c50576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f51554f52554d206e6f742072656163686564210000000000000000000000000081525060200191505060405180910390fd5b60006004811115611c5d57fe5b6005600085815260200190815260200160002060009054906101000a900460ff166004811115611c8957fe5b14156123015760006001811115611c9c57fe5b826001811115611ca857fe5b1415611fd75760008090505b60048160ff161015611fd1576000600860008681526020019081526020016000208260ff1681548110611ce357fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff1663aabcad826040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611d5857600080fd5b505af1925050508015611d69575060015b611f5f57611d756152a0565b80611d805750611e56565b7f18ebaa21ec0ffd473423d603c62f44820061770fab2ec3e53019069c1e9fc86c8282604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b83811015611e15578082015181840152602081019050611dfa565b50505050905090810190601f168015611e425780820380516001836020036101000a031916815260200191505b50935050505060405180910390a150611f5a565b3d8060008114611e82576040519150601f19603f3d011682016040523d82523d6000602084013e611e87565b606091505b507f9b952a19df98629b6d2b9207388cbf7b8a80e5c53e74f633fd23ff0da0e912328282604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b83811015611f1d578082015181840152602081019050611f02565b50505050905090810190601f168015611f4a5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a1505b611fc3565b7f5aca19a9d0e90b2fb5cbc3cf422cd492303dc0b612352deff075278ed7bba40b81604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a15b508080600101915050611cb4565b506122fc565b60008090505b60048160ff1610156122fa576000600860008681526020019081526020016000208260ff168154811061200c57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff1663e3956a956040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561208157600080fd5b505af1925050508015612092575060015b6122885761209e6152a0565b806120a9575061217f565b7f18ebaa21ec0ffd473423d603c62f44820061770fab2ec3e53019069c1e9fc86c8282604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561213e578082015181840152602081019050612123565b50505050905090810190601f16801561216b5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a150612283565b3d80600081146121ab576040519150601f19603f3d011682016040523d82523d6000602084013e6121b0565b606091505b507f9b952a19df98629b6d2b9207388cbf7b8a80e5c53e74f633fd23ff0da0e912328282604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561224657808201518184015260208101905061222b565b50505050905090810190601f1680156122735780820380516001836020036101000a031916815260200191505b50935050505060405180910390a1505b6122ec565b7f5aca19a9d0e90b2fb5cbc3cf422cd492303dc0b612352deff075278ed7bba40b81604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a15b508080600101915050611fdd565b505b6127ed565b6001600481111561230e57fe5b6005600085815260200190815260200160002060009054906101000a900460ff16600481111561233a57fe5b14156126f3576000600181111561234d57fe5b82600181111561235957fe5b14156126ee5760008090505b60048160ff1610156126ec576000600860008681526020019081526020016000208260ff168154811061239457fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff1663f2fde38b6009600088815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b15801561247357600080fd5b505af1925050508015612484575060015b61267a576124906152a0565b8061249b5750612571565b7f18ebaa21ec0ffd473423d603c62f44820061770fab2ec3e53019069c1e9fc86c8282604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b83811015612530578082015181840152602081019050612515565b50505050905090810190601f16801561255d5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a150612675565b3d806000811461259d576040519150601f19603f3d011682016040523d82523d6000602084013e6125a2565b606091505b507f9b952a19df98629b6d2b9207388cbf7b8a80e5c53e74f633fd23ff0da0e912328282604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561263857808201518184015260208101905061261d565b50505050905090810190601f1680156126655780820380516001836020036101000a031916815260200191505b50935050505060405180910390a1505b6126de565b7f5aca19a9d0e90b2fb5cbc3cf422cd492303dc0b612352deff075278ed7bba40b81604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a15b508080600101915050612365565b505b6127ec565b6002600481111561270057fe5b6005600085815260200190815260200160002060009054906101000a900460ff16600481111561272c57fe5b1415612771576000600181111561273f57fe5b82600181111561274b57fe5b141561276c57600c6000848152602001908152602001600020546002819055505b6127eb565b60048081111561277d57fe5b6005600085815260200190815260200160002060009054906101000a900460ff1660048111156127a957fe5b14156127ea57600060018111156127bc57fe5b8260018111156127c857fe5b14156127e957600d6000848152602001908152602001600020546003819055505b5b5b5b5b505050565b6128113373ffffffffffffffffffffffffffffffffffffffff16615012565b15801561284957503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16145b6128bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4e6f20436f6e74726163747320416c6c6f77656421000000000000000000000081525060200191505060405180910390fd5b6129106203f480601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461502590919063ffffffff16565b4211612984576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f546f6b656e7320617265207374696c6c20696e20766f74696e6721000000000081525060200191505060405180910390fd5b73961c8c0b1aad0c0b10a51fef6a867e3091bcef1773ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612a5e57600080fd5b505af1158015612a72573d6000803e3d6000fd5b505050506040513d6020811015612a8857600080fd5b8101908080519060200190929190505050612b0b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f7472616e73666572206661696c6564210000000000000000000000000000000081525060200191505060405180910390fd5b6000600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550565b600d6020528060005260406000206000915090505481565b612b893373ffffffffffffffffffffffffffffffffffffffff16615012565b158015612bc157503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16145b612c33576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4e6f20436f6e74726163747320416c6c6f77656421000000000000000000000081525060200191505060405180910390fd5b60006003811115612c4057fe5b816003811115612c4c57fe5b1480612c6e575060016003811115612c6057fe5b816003811115612c6c57fe5b145b80612c8f575060026003811115612c8157fe5b816003811115612c8d57fe5b145b80612caf5750600380811115612ca157fe5b816003811115612cad57fe5b145b612d21576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f496e76616c696420506f6f6c2047726f7570204e616d6521000000000000000081525060200191505060405180910390fd5b60035473961c8c0b1aad0c0b10a51fef6a867e3091bcef1773ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612db557600080fd5b505afa158015612dc9573d6000803e3d6000fd5b505050506040513d6020811015612ddf57600080fd5b81019080805190602001909291905050501015612e47576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153ae6025913960400191505060405180910390fd5b612e5d600160135461502590919063ffffffff16565b60138190555060046000826003811115612e7357fe5b6003811115612e7e57fe5b8152602001908152602001600020600860006013548152602001908152602001600020906004612eaf929190615150565b5042600a6000601354815260200190815260200160002081905550600060056000601354815260200190815260200160002060006101000a81548160ff02191690836004811115612efc57fe5b021790555050565b60025481565b612f293373ffffffffffffffffffffffffffffffffffffffff16615012565b158015612f6157503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16145b612fd3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4e6f20436f6e74726163747320416c6c6f77656421000000000000000000000081525060200191505060405180910390fd5b60008111613049576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f43616e6e6f742072656d6f7665203020766f746573210000000000000000000081525060200191505060405180910390fd5b61305282613ba7565b6130c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f50726f706f73616c20697320636c6f736564210000000000000000000000000081525060200191505060405180910390fd5b601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000205481111561316d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806153576029913960400191505060405180910390fd5b6131d081601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008581526020019081526020016000205461504190919063ffffffff16565b601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008481526020019081526020016000208190555061327681600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461504190919063ffffffff16565b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600060018111156132c657fe5b601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002060009054906101000a900460ff16600181111561332f57fe5b14156133775761335b81600660008581526020019081526020016000205461504190919063ffffffff16565b60066000848152602001908152602001600020819055506133b5565b61339d81600760008581526020019081526020016000205461504190919063ffffffff16565b60076000848152602001908152602001600020819055505b73961c8c0b1aad0c0b10a51fef6a867e3091bcef1773ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561345057600080fd5b505af1158015613464573d6000803e3d6000fd5b505050506040513d602081101561347a57600080fd5b81019080805190602001909291905050506134fd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f7472616e73666572206661696c6564000000000000000000000000000000000081525060200191505060405180910390fd5b5050565b60116020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b6203f48081565b600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141561356e57fe5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146135c857600080fd5b6135f3600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16615058565b6000600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6136563373ffffffffffffffffffffffffffffffffffffffff16615012565b15801561368e57503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16145b613700576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4e6f20436f6e74726163747320416c6c6f77656421000000000000000000000081525060200191505060405180910390fd5b60035473961c8c0b1aad0c0b10a51fef6a867e3091bcef1773ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561379457600080fd5b505afa1580156137a8573d6000803e3d6000fd5b505050506040513d60208110156137be57600080fd5b81019080805190602001909291905050501015613826576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153ae6025913960400191505060405180910390fd5b61383c600160135461502590919063ffffffff16565b60138190555042600a6000601354815260200190815260200160002081905550600360056000601354815260200190815260200160002060006101000a81548160ff0219169083600481111561388e57fe5b021790555080600e6000601354815260200190815260200160002090805190602001906138bc92919061519a565b5050565b6138c8613c65565b6138d157600080fd5b61390762ed4e007f000000000000000000000000000000000000000000000000000000000000000061502590919063ffffffff16565b421061397b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f546869732061646d696e2066656174757265206861732065787069726564210081525060200191505060405180910390fd5b8060038190555050565b6010602052816000526040600020602052806000526040600020600091509150505481565b60096020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006139e882613ba7565b158015613a315750613a2e6203f480613a206203f480600a60008781526020019081526020016000205461502590919063ffffffff16565b61502590919063ffffffff16565b42105b8015613a5b5750600b600083815260200190815260200160002060009054906101000a900460ff16155b8015613a8d57506007600083815260200190815260200160002054600660008481526020019081526020016000205414155b15613a9b5760019050613aa0565b600090505b919050565b60066020528060005260406000206000915090505481565b613ac5613c65565b613ace57600080fd5b8373ffffffffffffffffffffffffffffffffffffffff1663d493b9ac8484846040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b158015613b8957600080fd5b505af1158015613b9d573d6000803e3d6000fd5b5050505050505050565b6000613bd26203f480600a60008581526020019081526020016000205461502590919063ffffffff16565b421015613be25760019050613be7565b600090505b919050565b60076020528060005260406000206000915090505481565b600f6020528060005260406000206000915090505481565b60056020528060005260406000206000915054906101000a900460ff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905090565b600a6020528060005260406000206000915090505481565b6203f48081565b73961c8c0b1aad0c0b10a51fef6a867e3091bcef1781565b613d123373ffffffffffffffffffffffffffffffffffffffff16615012565b158015613d4a57503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16145b613dbc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4e6f20436f6e74726163747320416c6c6f77656421000000000000000000000081525060200191505060405180910390fd5b613dc4613c65565b613dcd57600080fd5b60035473961c8c0b1aad0c0b10a51fef6a867e3091bcef1773ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015613e6157600080fd5b505afa158015613e75573d6000803e3d6000fd5b505050506040513d6020811015613e8b57600080fd5b81019080805190602001909291905050501015613ef3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153ae6025913960400191505060405180910390fd5b613f09600160135461502590919063ffffffff16565b60138190555080600c600060135481526020019081526020016000208190555042600a6000601354815260200190815260200160002081905550600260056000601354815260200190815260200160002060006101000a81548160ff02191690836004811115613f7557fe5b021790555050565b600e6020528060005260406000206000915090508054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156140255780601f10613ffa57610100808354040283529160200191614025565b820191906000526020600020905b81548152906001019060200180831161400857829003601f168201915b505050505081565b614035613c65565b61403e57600080fd5b8373ffffffffffffffffffffffffffffffffffffffff1663ed3e91748484846040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b1580156140f957600080fd5b505af115801561410d573d6000803e3d6000fd5b5050505050505050565b6000806000806060600080600080606060008b9a50600560008d815260200190815260200160002060009054906101000a900460ff169950600660008d8152602001908152602001600020549850600760008d8152602001908152602001600020549750600860008d815260200190815260200160002080548060200260200160405190810160405280929190818152602001828054801561420e57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116141c4575b50505050509650600960008d815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169550600a60008d8152602001908152602001600020549450600b60008d815260200190815260200160002060009054906101000a900460ff169350600c60008d8152602001908152602001600020549250600e60008d81526020019081526020016000208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156143415780601f1061431657610100808354040283529160200191614341565b820191906000526020600020905b81548152906001019060200180831161432457829003601f168201915b50505050509150600d60008d815260200190815260200160002054905091939597999b90929496989a50565b600b6020528060005260406000206000915054906101000a900460ff1681565b600c6020528060005260406000206000915090505481565b6143ad613c65565b6143b657600080fd5b6143ec62ed4e007f000000000000000000000000000000000000000000000000000000000000000061502590919063ffffffff16565b4210614460576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4368616e67652071756f72756d2066656174757265206578706972656421000081525060200191505060405180910390fd5b8060028190555050565b614472613c65565b61447b57600080fd5b73961c8c0b1aad0c0b10a51fef6a867e3091bcef1773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415806144ff57506144fc630208c0807f000000000000000000000000000000000000000000000000000000000000000061502590919063ffffffff16565b42115b614571576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f43616e6e6f74205472616e73666572204f7574206d61696e20746f6b656e732181525060200191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156145f857600080fd5b505af115801561460c573d6000803e3d6000fd5b505050506040513d602081101561462257600080fd5b81019080805190602001909291905050506146a5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5472616e73666572206661696c6564210000000000000000000000000000000081525060200191505060405180910390fd5b505050565b60035481565b62ed4e0081565b6146d63373ffffffffffffffffffffffffffffffffffffffff16615012565b15801561470e57503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16145b614780576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4e6f20436f6e74726163747320416c6c6f77656421000000000000000000000081525060200191505060405180910390fd5b614788613c65565b61479157600080fd5b60035473961c8c0b1aad0c0b10a51fef6a867e3091bcef1773ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561482557600080fd5b505afa158015614839573d6000803e3d6000fd5b505050506040513d602081101561484f57600080fd5b810190808051906020019092919050505010156148b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153ae6025913960400191505060405180910390fd5b6148cd600160135461502590919063ffffffff16565b60138190555080600d600060135481526020019081526020016000208190555042600a6000601354815260200190815260200160002081905550600460056000601354815260200190815260200160002060006101000a81548160ff0219169083600481111561493957fe5b021790555050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60126020528060005260406000206000915090505481565b614987613c65565b61499057600080fd5b73961c8c0b1aad0c0b10a51fef6a867e3091bcef1773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580614a145750614a11630208c0807f000000000000000000000000000000000000000000000000000000000000000061502590919063ffffffff16565b42115b614a86576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f43616e6e6f74205472616e73666572204f7574206d61696e20746f6b656e732181525060200191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b158015614b0d57600080fd5b505af1158015614b21573d6000803e3d6000fd5b50505050505050565b614b32613c65565b614b3b57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415614b7557600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b614bd83373ffffffffffffffffffffffffffffffffffffffff16615012565b158015614c1057503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16145b614c82576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4e6f20436f6e74726163747320416c6c6f77656421000000000000000000000081525060200191505060405180910390fd5b614c8a613c65565b614c9357600080fd5b60006003811115614ca057fe5b826003811115614cac57fe5b1480614cce575060016003811115614cc057fe5b826003811115614ccc57fe5b145b80614cef575060026003811115614ce157fe5b826003811115614ced57fe5b145b80614d0f5750600380811115614d0157fe5b826003811115614d0d57fe5b145b614d81576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f496e76616c696420506f6f6c2047726f7570204e616d6521000000000000000081525060200191505060405180910390fd5b60035473961c8c0b1aad0c0b10a51fef6a867e3091bcef1773ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015614e1557600080fd5b505afa158015614e29573d6000803e3d6000fd5b505050506040513d6020811015614e3f57600080fd5b81019080805190602001909291905050501015614ea7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153ae6025913960400191505060405180910390fd5b614ebd600160135461502590919063ffffffff16565b60138190555060046000836003811115614ed357fe5b6003811115614ede57fe5b8152602001908152602001600020600860006013548152602001908152602001600020906004614f0f929190615150565b508060096000601354815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555042600a6000601354815260200190815260200160002081905550600160056000601354815260200190815260200160002060006101000a81548160ff02191690836004811115614fb057fe5b02179055505050565b60135481565b630208c08081565b60086020528160005260406000208181548110614fe057fe5b906000526020600020016000915091509054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080823b905060008111915050919050565b60008082840190508381101561503757fe5b8091505092915050565b60008282111561504d57fe5b818303905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561509257600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b828054828255906000526020600020908101928215615189579182015b8281111561518857825482559160010191906001019061516d565b5b509050615196919061521a565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106151db57805160ff1916838001178555615209565b82800160010185558215615209579182015b828111156152085782518255916020019190600101906151ed565b5b509050615216919061525d565b5090565b61525a91905b8082111561525657600081816101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905550600101615220565b5090565b90565b61527f91905b8082111561527b576000816000905550600101615263565b5090565b90565b6000601f19601f8301169050919050565b60008160e01c9050919050565b600060443d10156152b057615353565b60046000803e6152c1600051615293565b6308c379a081146152d25750615353565b60405160043d036004823e80513d602482011167ffffffffffffffff821117156152fe57505050615353565b808201805167ffffffffffffffff81111561531d575050505050615353565b8060208301013d850181111561533857505050505050615353565b61534182615282565b60208401016040528296505050505050505b9056fe43616e6e6f742072656d6f7665206d6f726520746f6b656e73207468616e206465706f73697465642143616e6e6f742070726f6772616d6d61746963616c6c79206578656375746520746578742070726f706f73616c73496e73756666696369656e7420476f7665726e616e636520546f6b656e2042616c616e6365a2646970667358221220ca0a6ace76e2fba50d8dc98ea05bed9b965f65485955705e0a0b0edac736c09764736f6c634300060b0033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102945760003560e01c80638da5cb5b11610167578063d493b9ac116100ce578063f25b836411610087578063f25b836414610f24578063f2fde38b14610f92578063f3f5de8714610fd6578063f3f6f0d714611027578063f6af4dff14611045578063feb14c221461106357610294565b8063d493b9ac14610daa578063dd63a1bf14610e18578063de14b23e14610e36578063deca1c2a14610e54578063e30c397814610e82578063eb1a7cd714610ecc57610294565b8063b74316db11610120578063b74316db14610a53578063be08129214610afa578063c7f758a814610b88578063d00c1aec14610cf4578063d17af45314610d3a578063d2cd96bd14610d7c57610294565b80638da5cb5b1461090f5780638f32d59b14610959578063946164511461097b578063a25e84cd146109bd578063a35f7c7b146109db578063b38672b314610a2557610294565b80634e71e0c81161020b57806369adf796116101c457806369adf7961461070f578063701b1e8114610751578063780e19c1146107df5780637be0eeb91461082557806382d389531461086757806383240f83146108bf57610294565b80634e71e0c814610506578063570809c11461051057806359a28311146105cb57806359e61ef8146105f95780635e7e77921461065b578063664b937d146106c957610294565b806328707ff21161025d57806328707ff2146103af57806329b43563146103f15780632e80d9b614610422578063428786cc1461044057806344dfef34146104785780634654ff05146104e857610294565b80624d0d521461029957806303634a9a146102de5780630c3d5157146103595780630d61b51914610377578063280da6fa146103a5575b600080fd5b6102dc600480360360608110156102af57600080fd5b8101908080359060200190929190803560ff169060200190929190803590602001909291905050506110db565b005b610317600480360360408110156102f457600080fd5b81019080803560ff1690602001909291908035906020019092919050505061186b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6103616118ad565b6040518082815260200191505060405180910390f35b6103a36004803603602081101561038d57600080fd5b81019080803590602001909291905050506118d1565b005b6103ad6127f2565b005b6103db600480360360208110156103c557600080fd5b8101908080359060200190929190505050612b52565b6040518082815260200191505060405180910390f35b6104206004803603602081101561040757600080fd5b81019080803560ff169060200190929190505050612b6a565b005b61042a612f04565b6040518082815260200191505060405180910390f35b6104766004803603604081101561045657600080fd5b810190808035906020019092919080359060200190929190505050612f0a565b005b6104c46004803603604081101561048e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613501565b604051808260018111156104d457fe5b60ff16815260200191505060405180910390f35b6104f0613530565b6040518082815260200191505060405180910390f35b61050e613537565b005b6105c96004803603602081101561052657600080fd5b810190808035906020019064010000000081111561054357600080fd5b82018360208201111561055557600080fd5b8035906020019184600183028401116401000000008311171561057757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050613637565b005b6105f7600480360360208110156105e157600080fd5b81019080803590602001909291905050506138c0565b005b6106456004803603604081101561060f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613985565b6040518082815260200191505060405180910390f35b6106876004803603602081101561067157600080fd5b81019080803590602001909291905050506139aa565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6106f5600480360360208110156106df57600080fd5b81019080803590602001909291905050506139dd565b604051808215151515815260200191505060405180910390f35b61073b6004803603602081101561072557600080fd5b8101908080359060200190929190505050613aa5565b6040518082815260200191505060405180910390f35b6107dd6004803603608081101561076757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613abd565b005b61080b600480360360208110156107f557600080fd5b8101908080359060200190929190505050613ba7565b604051808215151515815260200191505060405180910390f35b6108516004803603602081101561083b57600080fd5b8101908080359060200190929190505050613bec565b6040518082815260200191505060405180910390f35b6108a96004803603602081101561087d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613c04565b6040518082815260200191505060405180910390f35b6108eb600480360360208110156108d557600080fd5b8101908080359060200190929190505050613c1c565b604051808260048111156108fb57fe5b60ff16815260200191505060405180910390f35b610917613c3c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610961613c65565b604051808215151515815260200191505060405180910390f35b6109a76004803603602081101561099157600080fd5b8101908080359060200190929190505050613cbc565b6040518082815260200191505060405180910390f35b6109c5613cd4565b6040518082815260200191505060405180910390f35b6109e3613cdb565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610a5160048036036020811015610a3b57600080fd5b8101908080359060200190929190505050613cf3565b005b610a7f60048036036020811015610a6957600080fd5b8101908080359060200190929190505050613f7d565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610abf578082015181840152602081019050610aa4565b50505050905090810190601f168015610aec5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610b8660048036036080811015610b1057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061402d565b005b610bb460048036036020811015610b9e57600080fd5b8101908080359060200190929190505050614117565b604051808c81526020018b6004811115610bca57fe5b60ff1681526020018a8152602001898152602001806020018873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001878152602001861515151581526020018581526020018060200184815260200183810383528a818151815260200191508051906020019060200280838360005b83811015610c6f578082015181840152602081019050610c54565b50505050905001838103825285818151815260200191508051906020019080838360005b83811015610cae578082015181840152602081019050610c93565b50505050905090810190601f168015610cdb5780820380516001836020036101000a031916815260200191505b509d505050505050505050505050505060405180910390f35b610d2060048036036020811015610d0a57600080fd5b810190808035906020019092919050505061436d565b604051808215151515815260200191505060405180910390f35b610d6660048036036020811015610d5057600080fd5b810190808035906020019092919050505061438d565b6040518082815260200191505060405180910390f35b610da860048036036020811015610d9257600080fd5b81019080803590602001909291905050506143a5565b005b610e1660048036036060811015610dc057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061446a565b005b610e206146aa565b6040518082815260200191505060405180910390f35b610e3e6146b0565b6040518082815260200191505060405180910390f35b610e8060048036036020811015610e6a57600080fd5b81019080803590602001909291905050506146b7565b005b610e8a614941565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610f0e60048036036020811015610ee257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050614967565b6040518082815260200191505060405180910390f35b610f9060048036036060811015610f3a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061497f565b005b610fd460048036036020811015610fa857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050614b2a565b005b61102560048036036040811015610fec57600080fd5b81019080803560ff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050614bb9565b005b61102f614fb9565b6040518082815260200191505060405180910390f35b61104d614fbf565b6040518082815260200191505060405180910390f35b6110996004803603604081101561107957600080fd5b810190808035906020019092919080359060200190929190505050614fc7565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6110fa3373ffffffffffffffffffffffffffffffffffffffff16615012565b15801561113257503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16145b6111a4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4e6f20436f6e74726163747320416c6c6f77656421000000000000000000000081525060200191505060405180910390fd5b6000811161121a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f43616e6e6f7420616464203020766f746573210000000000000000000000000081525060200191505060405180910390fd5b61122383613ba7565b611295576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f50726f706f73616c20697320636c6f736564210000000000000000000000000081525060200191505060405180910390fd5b73961c8c0b1aad0c0b10a51fef6a867e3091bcef1773ffffffffffffffffffffffffffffffffffffffff166323b872dd3330846040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b15801561136457600080fd5b505af1158015611378573d6000803e3d6000fd5b505050506040513d602081101561138e57600080fd5b8101908080519060200190929190505050611411576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f7472616e7366657246726f6d206661696c65642100000000000000000000000081525060200191505060405180910390fd5b6000601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008581526020019081526020016000205414156114e05781601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600085815260200190815260200160002060006101000a81548160ff021916908360018111156114d657fe5b02179055506115c9565b8160018111156114ec57fe5b601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600085815260200190815260200160002060009054906101000a900460ff16600181111561155557fe5b146115c8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f43616e6e6f7420766f746520666f7220626f7468206f7074696f6e732100000081525060200191505060405180910390fd5b5b600060018111156115d657fe5b8260018111156115e257fe5b141561162a5761160e81600660008681526020019081526020016000205461502590919063ffffffff16565b6006600085815260200190815260200160002081905550611668565b61165081600760008681526020019081526020016000205461502590919063ffffffff16565b60076000858152602001908152602001600020819055505b6116ba81600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461502590919063ffffffff16565b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061176081601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008681526020019081526020016000205461502590919063ffffffff16565b601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600085815260200190815260200160002081905550600a600084815260200190815260200160002054601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561186657600a600084815260200190815260200160002054601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b505050565b6004602052816000526040600020816004811061188457fe5b016000915091509054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b7f00000000000000000000000000000000000000000000000000000000600c0d7781565b6118f03373ffffffffffffffffffffffffffffffffffffffff16615012565b15801561192857503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16145b61199a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4e6f20436f6e74726163747320416c6c6f77656421000000000000000000000081525060200191505060405180910390fd5b600360048111156119a757fe5b6005600083815260200190815260200160002060009054906101000a900460ff1660048111156119d357fe5b1415611a2a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615380602e913960400191505060405180910390fd5b600760008281526020019081526020016000205460066000838152602001908152602001600020541415611ac6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f54686973206973206120544945212043616e6e6f74206578656375746521000081525060200191505060405180910390fd5b611acf816139dd565b611b41576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f50726f706f73616c20457870697265642100000000000000000000000000000081525060200191505060405180910390fd5b6001600b600083815260200190815260200160002060006101000a81548160ff021916908315150217905550600080600760008481526020019081526020016000205460066000858152602001908152602001600020541115611bbd576000915060066000848152602001908152602001600020549050611bd8565b60019150600760008481526020019081526020016000205490505b600254811015611c50576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f51554f52554d206e6f742072656163686564210000000000000000000000000081525060200191505060405180910390fd5b60006004811115611c5d57fe5b6005600085815260200190815260200160002060009054906101000a900460ff166004811115611c8957fe5b14156123015760006001811115611c9c57fe5b826001811115611ca857fe5b1415611fd75760008090505b60048160ff161015611fd1576000600860008681526020019081526020016000208260ff1681548110611ce357fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff1663aabcad826040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611d5857600080fd5b505af1925050508015611d69575060015b611f5f57611d756152a0565b80611d805750611e56565b7f18ebaa21ec0ffd473423d603c62f44820061770fab2ec3e53019069c1e9fc86c8282604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b83811015611e15578082015181840152602081019050611dfa565b50505050905090810190601f168015611e425780820380516001836020036101000a031916815260200191505b50935050505060405180910390a150611f5a565b3d8060008114611e82576040519150601f19603f3d011682016040523d82523d6000602084013e611e87565b606091505b507f9b952a19df98629b6d2b9207388cbf7b8a80e5c53e74f633fd23ff0da0e912328282604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b83811015611f1d578082015181840152602081019050611f02565b50505050905090810190601f168015611f4a5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a1505b611fc3565b7f5aca19a9d0e90b2fb5cbc3cf422cd492303dc0b612352deff075278ed7bba40b81604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a15b508080600101915050611cb4565b506122fc565b60008090505b60048160ff1610156122fa576000600860008681526020019081526020016000208260ff168154811061200c57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff1663e3956a956040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561208157600080fd5b505af1925050508015612092575060015b6122885761209e6152a0565b806120a9575061217f565b7f18ebaa21ec0ffd473423d603c62f44820061770fab2ec3e53019069c1e9fc86c8282604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561213e578082015181840152602081019050612123565b50505050905090810190601f16801561216b5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a150612283565b3d80600081146121ab576040519150601f19603f3d011682016040523d82523d6000602084013e6121b0565b606091505b507f9b952a19df98629b6d2b9207388cbf7b8a80e5c53e74f633fd23ff0da0e912328282604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561224657808201518184015260208101905061222b565b50505050905090810190601f1680156122735780820380516001836020036101000a031916815260200191505b50935050505060405180910390a1505b6122ec565b7f5aca19a9d0e90b2fb5cbc3cf422cd492303dc0b612352deff075278ed7bba40b81604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a15b508080600101915050611fdd565b505b6127ed565b6001600481111561230e57fe5b6005600085815260200190815260200160002060009054906101000a900460ff16600481111561233a57fe5b14156126f3576000600181111561234d57fe5b82600181111561235957fe5b14156126ee5760008090505b60048160ff1610156126ec576000600860008681526020019081526020016000208260ff168154811061239457fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff1663f2fde38b6009600088815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b15801561247357600080fd5b505af1925050508015612484575060015b61267a576124906152a0565b8061249b5750612571565b7f18ebaa21ec0ffd473423d603c62f44820061770fab2ec3e53019069c1e9fc86c8282604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b83811015612530578082015181840152602081019050612515565b50505050905090810190601f16801561255d5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a150612675565b3d806000811461259d576040519150601f19603f3d011682016040523d82523d6000602084013e6125a2565b606091505b507f9b952a19df98629b6d2b9207388cbf7b8a80e5c53e74f633fd23ff0da0e912328282604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561263857808201518184015260208101905061261d565b50505050905090810190601f1680156126655780820380516001836020036101000a031916815260200191505b50935050505060405180910390a1505b6126de565b7f5aca19a9d0e90b2fb5cbc3cf422cd492303dc0b612352deff075278ed7bba40b81604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a15b508080600101915050612365565b505b6127ec565b6002600481111561270057fe5b6005600085815260200190815260200160002060009054906101000a900460ff16600481111561272c57fe5b1415612771576000600181111561273f57fe5b82600181111561274b57fe5b141561276c57600c6000848152602001908152602001600020546002819055505b6127eb565b60048081111561277d57fe5b6005600085815260200190815260200160002060009054906101000a900460ff1660048111156127a957fe5b14156127ea57600060018111156127bc57fe5b8260018111156127c857fe5b14156127e957600d6000848152602001908152602001600020546003819055505b5b5b5b5b505050565b6128113373ffffffffffffffffffffffffffffffffffffffff16615012565b15801561284957503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16145b6128bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4e6f20436f6e74726163747320416c6c6f77656421000000000000000000000081525060200191505060405180910390fd5b6129106203f480601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461502590919063ffffffff16565b4211612984576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f546f6b656e7320617265207374696c6c20696e20766f74696e6721000000000081525060200191505060405180910390fd5b73961c8c0b1aad0c0b10a51fef6a867e3091bcef1773ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612a5e57600080fd5b505af1158015612a72573d6000803e3d6000fd5b505050506040513d6020811015612a8857600080fd5b8101908080519060200190929190505050612b0b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f7472616e73666572206661696c6564210000000000000000000000000000000081525060200191505060405180910390fd5b6000600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550565b600d6020528060005260406000206000915090505481565b612b893373ffffffffffffffffffffffffffffffffffffffff16615012565b158015612bc157503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16145b612c33576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4e6f20436f6e74726163747320416c6c6f77656421000000000000000000000081525060200191505060405180910390fd5b60006003811115612c4057fe5b816003811115612c4c57fe5b1480612c6e575060016003811115612c6057fe5b816003811115612c6c57fe5b145b80612c8f575060026003811115612c8157fe5b816003811115612c8d57fe5b145b80612caf5750600380811115612ca157fe5b816003811115612cad57fe5b145b612d21576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f496e76616c696420506f6f6c2047726f7570204e616d6521000000000000000081525060200191505060405180910390fd5b60035473961c8c0b1aad0c0b10a51fef6a867e3091bcef1773ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612db557600080fd5b505afa158015612dc9573d6000803e3d6000fd5b505050506040513d6020811015612ddf57600080fd5b81019080805190602001909291905050501015612e47576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153ae6025913960400191505060405180910390fd5b612e5d600160135461502590919063ffffffff16565b60138190555060046000826003811115612e7357fe5b6003811115612e7e57fe5b8152602001908152602001600020600860006013548152602001908152602001600020906004612eaf929190615150565b5042600a6000601354815260200190815260200160002081905550600060056000601354815260200190815260200160002060006101000a81548160ff02191690836004811115612efc57fe5b021790555050565b60025481565b612f293373ffffffffffffffffffffffffffffffffffffffff16615012565b158015612f6157503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16145b612fd3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4e6f20436f6e74726163747320416c6c6f77656421000000000000000000000081525060200191505060405180910390fd5b60008111613049576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f43616e6e6f742072656d6f7665203020766f746573210000000000000000000081525060200191505060405180910390fd5b61305282613ba7565b6130c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f50726f706f73616c20697320636c6f736564210000000000000000000000000081525060200191505060405180910390fd5b601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000205481111561316d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806153576029913960400191505060405180910390fd5b6131d081601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008581526020019081526020016000205461504190919063ffffffff16565b601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008481526020019081526020016000208190555061327681600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461504190919063ffffffff16565b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600060018111156132c657fe5b601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002060009054906101000a900460ff16600181111561332f57fe5b14156133775761335b81600660008581526020019081526020016000205461504190919063ffffffff16565b60066000848152602001908152602001600020819055506133b5565b61339d81600760008581526020019081526020016000205461504190919063ffffffff16565b60076000848152602001908152602001600020819055505b73961c8c0b1aad0c0b10a51fef6a867e3091bcef1773ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561345057600080fd5b505af1158015613464573d6000803e3d6000fd5b505050506040513d602081101561347a57600080fd5b81019080805190602001909291905050506134fd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f7472616e73666572206661696c6564000000000000000000000000000000000081525060200191505060405180910390fd5b5050565b60116020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b6203f48081565b600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141561356e57fe5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146135c857600080fd5b6135f3600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16615058565b6000600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6136563373ffffffffffffffffffffffffffffffffffffffff16615012565b15801561368e57503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16145b613700576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4e6f20436f6e74726163747320416c6c6f77656421000000000000000000000081525060200191505060405180910390fd5b60035473961c8c0b1aad0c0b10a51fef6a867e3091bcef1773ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561379457600080fd5b505afa1580156137a8573d6000803e3d6000fd5b505050506040513d60208110156137be57600080fd5b81019080805190602001909291905050501015613826576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153ae6025913960400191505060405180910390fd5b61383c600160135461502590919063ffffffff16565b60138190555042600a6000601354815260200190815260200160002081905550600360056000601354815260200190815260200160002060006101000a81548160ff0219169083600481111561388e57fe5b021790555080600e6000601354815260200190815260200160002090805190602001906138bc92919061519a565b5050565b6138c8613c65565b6138d157600080fd5b61390762ed4e007f00000000000000000000000000000000000000000000000000000000600c0d7761502590919063ffffffff16565b421061397b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f546869732061646d696e2066656174757265206861732065787069726564210081525060200191505060405180910390fd5b8060038190555050565b6010602052816000526040600020602052806000526040600020600091509150505481565b60096020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006139e882613ba7565b158015613a315750613a2e6203f480613a206203f480600a60008781526020019081526020016000205461502590919063ffffffff16565b61502590919063ffffffff16565b42105b8015613a5b5750600b600083815260200190815260200160002060009054906101000a900460ff16155b8015613a8d57506007600083815260200190815260200160002054600660008481526020019081526020016000205414155b15613a9b5760019050613aa0565b600090505b919050565b60066020528060005260406000206000915090505481565b613ac5613c65565b613ace57600080fd5b8373ffffffffffffffffffffffffffffffffffffffff1663d493b9ac8484846040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b158015613b8957600080fd5b505af1158015613b9d573d6000803e3d6000fd5b5050505050505050565b6000613bd26203f480600a60008581526020019081526020016000205461502590919063ffffffff16565b421015613be25760019050613be7565b600090505b919050565b60076020528060005260406000206000915090505481565b600f6020528060005260406000206000915090505481565b60056020528060005260406000206000915054906101000a900460ff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905090565b600a6020528060005260406000206000915090505481565b6203f48081565b73961c8c0b1aad0c0b10a51fef6a867e3091bcef1781565b613d123373ffffffffffffffffffffffffffffffffffffffff16615012565b158015613d4a57503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16145b613dbc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4e6f20436f6e74726163747320416c6c6f77656421000000000000000000000081525060200191505060405180910390fd5b613dc4613c65565b613dcd57600080fd5b60035473961c8c0b1aad0c0b10a51fef6a867e3091bcef1773ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015613e6157600080fd5b505afa158015613e75573d6000803e3d6000fd5b505050506040513d6020811015613e8b57600080fd5b81019080805190602001909291905050501015613ef3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153ae6025913960400191505060405180910390fd5b613f09600160135461502590919063ffffffff16565b60138190555080600c600060135481526020019081526020016000208190555042600a6000601354815260200190815260200160002081905550600260056000601354815260200190815260200160002060006101000a81548160ff02191690836004811115613f7557fe5b021790555050565b600e6020528060005260406000206000915090508054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156140255780601f10613ffa57610100808354040283529160200191614025565b820191906000526020600020905b81548152906001019060200180831161400857829003601f168201915b505050505081565b614035613c65565b61403e57600080fd5b8373ffffffffffffffffffffffffffffffffffffffff1663ed3e91748484846040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b1580156140f957600080fd5b505af115801561410d573d6000803e3d6000fd5b5050505050505050565b6000806000806060600080600080606060008b9a50600560008d815260200190815260200160002060009054906101000a900460ff169950600660008d8152602001908152602001600020549850600760008d8152602001908152602001600020549750600860008d815260200190815260200160002080548060200260200160405190810160405280929190818152602001828054801561420e57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116141c4575b50505050509650600960008d815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169550600a60008d8152602001908152602001600020549450600b60008d815260200190815260200160002060009054906101000a900460ff169350600c60008d8152602001908152602001600020549250600e60008d81526020019081526020016000208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156143415780601f1061431657610100808354040283529160200191614341565b820191906000526020600020905b81548152906001019060200180831161432457829003601f168201915b50505050509150600d60008d815260200190815260200160002054905091939597999b90929496989a50565b600b6020528060005260406000206000915054906101000a900460ff1681565b600c6020528060005260406000206000915090505481565b6143ad613c65565b6143b657600080fd5b6143ec62ed4e007f00000000000000000000000000000000000000000000000000000000600c0d7761502590919063ffffffff16565b4210614460576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4368616e67652071756f72756d2066656174757265206578706972656421000081525060200191505060405180910390fd5b8060028190555050565b614472613c65565b61447b57600080fd5b73961c8c0b1aad0c0b10a51fef6a867e3091bcef1773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415806144ff57506144fc630208c0807f00000000000000000000000000000000000000000000000000000000600c0d7761502590919063ffffffff16565b42115b614571576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f43616e6e6f74205472616e73666572204f7574206d61696e20746f6b656e732181525060200191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156145f857600080fd5b505af115801561460c573d6000803e3d6000fd5b505050506040513d602081101561462257600080fd5b81019080805190602001909291905050506146a5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5472616e73666572206661696c6564210000000000000000000000000000000081525060200191505060405180910390fd5b505050565b60035481565b62ed4e0081565b6146d63373ffffffffffffffffffffffffffffffffffffffff16615012565b15801561470e57503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16145b614780576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4e6f20436f6e74726163747320416c6c6f77656421000000000000000000000081525060200191505060405180910390fd5b614788613c65565b61479157600080fd5b60035473961c8c0b1aad0c0b10a51fef6a867e3091bcef1773ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561482557600080fd5b505afa158015614839573d6000803e3d6000fd5b505050506040513d602081101561484f57600080fd5b810190808051906020019092919050505010156148b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153ae6025913960400191505060405180910390fd5b6148cd600160135461502590919063ffffffff16565b60138190555080600d600060135481526020019081526020016000208190555042600a6000601354815260200190815260200160002081905550600460056000601354815260200190815260200160002060006101000a81548160ff0219169083600481111561493957fe5b021790555050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60126020528060005260406000206000915090505481565b614987613c65565b61499057600080fd5b73961c8c0b1aad0c0b10a51fef6a867e3091bcef1773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580614a145750614a11630208c0807f00000000000000000000000000000000000000000000000000000000600c0d7761502590919063ffffffff16565b42115b614a86576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f43616e6e6f74205472616e73666572204f7574206d61696e20746f6b656e732181525060200191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b158015614b0d57600080fd5b505af1158015614b21573d6000803e3d6000fd5b50505050505050565b614b32613c65565b614b3b57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415614b7557600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b614bd83373ffffffffffffffffffffffffffffffffffffffff16615012565b158015614c1057503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16145b614c82576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4e6f20436f6e74726163747320416c6c6f77656421000000000000000000000081525060200191505060405180910390fd5b614c8a613c65565b614c9357600080fd5b60006003811115614ca057fe5b826003811115614cac57fe5b1480614cce575060016003811115614cc057fe5b826003811115614ccc57fe5b145b80614cef575060026003811115614ce157fe5b826003811115614ced57fe5b145b80614d0f5750600380811115614d0157fe5b826003811115614d0d57fe5b145b614d81576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f496e76616c696420506f6f6c2047726f7570204e616d6521000000000000000081525060200191505060405180910390fd5b60035473961c8c0b1aad0c0b10a51fef6a867e3091bcef1773ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015614e1557600080fd5b505afa158015614e29573d6000803e3d6000fd5b505050506040513d6020811015614e3f57600080fd5b81019080805190602001909291905050501015614ea7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153ae6025913960400191505060405180910390fd5b614ebd600160135461502590919063ffffffff16565b60138190555060046000836003811115614ed357fe5b6003811115614ede57fe5b8152602001908152602001600020600860006013548152602001908152602001600020906004614f0f929190615150565b508060096000601354815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555042600a6000601354815260200190815260200160002081905550600160056000601354815260200190815260200160002060006101000a81548160ff02191690836004811115614fb057fe5b02179055505050565b60135481565b630208c08081565b60086020528160005260406000208181548110614fe057fe5b906000526020600020016000915091509054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080823b905060008111915050919050565b60008082840190508381101561503757fe5b8091505092915050565b60008282111561504d57fe5b818303905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561509257600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b828054828255906000526020600020908101928215615189579182015b8281111561518857825482559160010191906001019061516d565b5b509050615196919061521a565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106151db57805160ff1916838001178555615209565b82800160010185558215615209579182015b828111156152085782518255916020019190600101906151ed565b5b509050615216919061525d565b5090565b61525a91905b8082111561525657600081816101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905550600101615220565b5090565b90565b61527f91905b8082111561527b576000816000905550600101615263565b5090565b90565b6000601f19601f8301169050919050565b60008160e01c9050919050565b600060443d10156152b057615353565b60046000803e6152c1600051615293565b6308c379a081146152d25750615353565b60405160043d036004823e80513d602482011167ffffffffffffffff821117156152fe57505050615353565b808201805167ffffffffffffffff81111561531d575050505050615353565b8060208301013d850181111561533857505050505050615353565b61534182615282565b60208401016040528296505050505050505b9056fe43616e6e6f742072656d6f7665206d6f726520746f6b656e73207468616e206465706f73697465642143616e6e6f742070726f6772616d6d61746963616c6c79206578656375746520746578742070726f706f73616c73496e73756666696369656e7420476f7665726e616e636520546f6b656e2042616c616e6365a2646970667358221220ca0a6ace76e2fba50d8dc98ea05bed9b965f65485955705e0a0b0edac736c09764736f6c634300060b0033
Deployed Bytecode Sourcemap
12148:20381:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23115:1371;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;14149:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;13580:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;26453:3296;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;25773:349;;;:::i;:::-;;16888:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;19943:722;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;12776:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;24677:948;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;17326:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13269:43;;;:::i;:::-;;;;;;;;;;;;;;;;;;;11261:137;;;:::i;:::-;;19384:398;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;18945:281;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;17169:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;16580:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;30241:430;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;16289:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;31895:217;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;29840:207;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;16386:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;17041:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;16197:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10183:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;10748:92;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;16692:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;13441:63;;;:::i;:::-;;;;;;;;;;;;;;;;;;;12582:90;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;21720:411;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;16939:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32294:226;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;17701:1016;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16780:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;16841:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;18729:204;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;30853:348;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;13145:50;;;:::i;:::-;;;;;;;;;;;;;;;;;;;12818:59;;;:::i;:::-;;;;;;;;;;;;;;;;;;;22260:463;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;9741:27;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;17483:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;31383:330;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;11015:149;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;20783:830;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;17617:25;;;:::i;:::-;;;;;;;;;;;;;;;;;;;13012:53;;;:::i;:::-;;;;;;;;;;;;;;;;;;;16479:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;23115:1371;12363:32;12371:10;12363:30;;;:32::i;:::-;12361:35;:62;;;;;12413:10;12400:23;;:9;:23;;;12361:62;12353:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23234:1:::1;23225:6;:10;23217:42;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;23278:26;23293:10;23278:14;:26::i;:::-;23270:58;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;12630:42;23357:41;;;23399:10;23419:4;23426:6;23357:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;23349:109;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;23595:1;23542:25;:37;23568:10;23542:37;;;;;;;;;;;;;;;:49;23580:10;23542:49;;;;;;;;;;;;:54;23538:294;;;23654:6;23613:14;:26;23628:10;23613:26;;;;;;;;;;;;;;;:38;23640:10;23613:38;;;;;;;;;;;;:47;;;;;;;;;;;;;;;;;;;;;;;;23538:294;;;23739:6;23697:48;;;;;;;;:14;:26;23712:10;23697:26;;;;;;;;;;;;;;;:38;23724:10;23697:38;;;;;;;;;;;;;;;;;;;;;:48;;;;;;;;;23693:128;;23766:39;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;23693:128;23538:294;23866:10;23856:20;;;;;;;;:6;:20;;;;;;;;;23852:220;;;23922:38;23953:6;23922:14;:26;23937:10;23922:26;;;;;;;;;;;;:30;;:38;;;;:::i;:::-;23893:14;:26;23908:10;23893:26;;;;;;;;;;;:67;;;;23852:220;;;24022:38;24053:6;24022:14;:26;24037:10;24022:26;;;;;;;;;;;;:30;;:38;;;;:::i;:::-;23993:14;:26;24008:10;23993:26;;;;;;;;;;;:67;;;;23852:220;24117:44;24154:6;24117:20;:32;24138:10;24117:32;;;;;;;;;;;;;;;;:36;;:44;;;;:::i;:::-;24082:20;:32;24103:10;24082:32;;;;;;;;;;;;;;;:79;;;;24224:61;24278:6;24224:25;:37;24250:10;24224:37;;;;;;;;;;;;;;;:49;24262:10;24224:49;;;;;;;;;;;;:53;;:61;;;;:::i;:::-;24172:25;:37;24198:10;24172:37;;;;;;;;;;;;;;;:49;24210:10;24172:49;;;;;;;;;;;:113;;;;24351:17;:29;24369:10;24351:29;;;;;;;;;;;;24310:26;:38;24337:10;24310:38;;;;;;;;;;;;;;;;:70;24306:173;;;24438:17;:29;24456:10;24438:29;;;;;;;;;;;;24397:26;:38;24424:10;24397:38;;;;;;;;;;;;;;;:70;;;;24306:173;23115:1371:::0;;;:::o;14149:70::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;13580:39::-;;;:::o;26453:3296::-;12363:32;12371:10;12363:30;;;:32::i;:::-;12361:35;:62;;;;;12413:10;12400:23;;:9;:23;;;12361:62;12353:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26566:20:::1;26543:43;;;;;;;;:7;:19;26551:10;26543:19;;;;;;;;;;;;;;;;;;;;;:43;;;;;;;;;;26534:103;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26687:14;:26;26702:10;26687:26;;;;;;;;;;;;26657:14;:26;26672:10;26657:26;;;;;;;;;;;;:56;;26648:100;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;26768:32;26789:10;26768:20;:32::i;:::-;26759:63;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;26876:4;26843:18;:30;26862:10;26843:30;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;26897:20;26928:23:::0;27005:14:::1;:26;27020:10;27005:26;;;;;;;;;;;;26976:14;:26;26991:10;26976:26;;;;;;;;;;;;:55;26972:297;;;27064:10;27048:26;;27110:14;:26;27125:10;27110:26;;;;;;;;;;;;27089:47;;26972:297;;;27185:10;27169:26;;27231:14;:26;27246:10;27231:26;;;;;;;;;;;;27210:47;;26972:297;27393:6;;27372:18;:27;27368:89;;;27416:29;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;27368:89;27504:23;27481:46;;;;;;;;:7;:19;27489:10;27481:19;;;;;;;;;;;;;;;;;;;;;:46;;;;;;;;;27477:2265;;;27565:10;27548:27;;;;;;;;:13;:27;;;;;;;;;27544:1103;;;27601:7;27611:1:::0;27601:11:::1;;27596:500;27618:1;27614;:5;;;27596:500;;;27649:16;27668:12;:24;27681:10;27668:24;;;;;;;;;;;27693:1;27668:27;;;;;;;;;;;;;;;;;;;;;;;;;;;27649:46;;27722:4;:25;;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;27718:359;;;;:::i;:::-;;;;;;;;27896:30;27913:4;27919:6;27896:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27830:120;27718:359;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28017:36;28034:4;28040:12;28017:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27951:126;27718:359;;;;27782:23;27800:4;27782:23;;;;;;;;;;;;;;;;;;;;;;27718:359;27596:500;27621:3;;;;;;;27596:500;;;;27544:1103;;;28141:7;28151:1:::0;28141:11:::1;;28136:496;28158:1;28154;:5;;;28136:496;;;28189:16;28208:12;:24;28221:10;28208:24;;;;;;;;;;;28233:1;28208:27;;;;;;;;;;;;;;;;;;;;;;;;;;;28189:46;;28262:4;:21;;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;28258:355;;;;:::i;:::-;;;;;;;;28432:30;28449:4;28455:6;28432:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28366:120;28258:355;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28553:36;28570:4;28576:12;28553:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28487:126;28258:355;;;;28318:23;28336:4;28318:23;;;;;;;;;;;;;;;;;;;;;;28258:355;28136:496;28161:3;;;;;;;28136:496;;;;27544:1103;27477:2265;;;28691:25;28668:48;;;;;;;;:7;:19;28676:10;28668:19;;;;;;;;;;;;;;;;;;;;;:48;;;;;;;;;28664:1078;;;28754:10;28737:27;;;;;;;;:13;:27;;;;;;;;;28733:590;;;28790:7;28800:1:::0;28790:11:::1;;28785:523;28807:1;28803;:5;;;28785:523;;;28838:16;28857:12;:24;28870:10;28857:24;;;;;;;;;;;28882:1;28857:27;;;;;;;;;;;;;;;;;;;;;;;;;;;28838:46;;28911:4;:22;;;28934:14;:26;28949:10;28934:26;;;;;;;;;;;;;;;;;;;;;28911:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;28907:382;;;;:::i;:::-;;;;;;;;29108:30;29125:4;29131:6;29108:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29042:120;28907:382;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29229:36;29246:4;29252:12;29229:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29163:126;28907:382;;;;28994:23;29012:4;28994:23;;;;;;;;;;;;;;;;;;;;;;28907:382;28785:523;28810:3;;;;;;;28785:523;;;;28733:590;28664:1078;;;29367:20;29344:43;;;;;;;;:7;:19;29352:10;29344:19;;;;;;;;;;;;;;;;;;;;;:43;;;;;;;;;29340:402;;;29425:10;29408:27;;;;;;;;:13;:27;;;;;;;;;29404:99;;;29465:10;:22;29476:10;29465:22;;;;;;;;;;;;29456:6;:31;;;;29404:99;29340:402;;;29547:42;29524:65:::0;::::1;;;;;;;:7;:19;29532:10;29524:19;;;;;;;;;;;;;;;;;;;;;:65;;;;;;;;;29520:222;;;29627:10;29610:27;;;;;;;;:13;:27;;;;;;;;;29606:125;;;29689:14;:26;29704:10;29689:26;;;;;;;;;;;;29658:28;:57;;;;29606:125;29520:222;29340:402;28664:1078;27477:2265;12460:1;;26453:3296:::0;:::o;25773:349::-;12363:32;12371:10;12363:30;;;:32::i;:::-;12361:35;:62;;;;;12413:10;12400:23;;:9;:23;;;12361:62;12353:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25855:57:::1;13306:6;25855:26;:38;25882:10;25855:38;;;;;;;;;;;;;;;;:42;;:57;;;;:::i;:::-;25849:3;:63;25841:103;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;12630:42;25963:37;;;26001:10;26013:20;:32;26034:10;26013:32;;;;;;;;;;;;;;;;25963:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;25955:112;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;26113:1;26078:20;:32;26099:10;26078:32;;;;;;;;;;;;;;;:36;;;;25773:349::o:0;16888:44::-;;;;;;;;;;;;;;;;;:::o;19943:722::-;12363:32;12371:10;12363:30;;;:32::i;:::-;12361:35;:62;;;;;12413:10;12400:23;;:9;:23;;;12361:62;12353:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20067:18:::1;20050:35;;;;;;;;:13;:35;;;;;;;;;:91;;;;20123:18;20106:35;;;;;;;;:13;:35;;;;;;;;;20050:91;:147;;;;20179:18;20162:35;;;;;;;;:13;:35;;;;;;;;;20050:147;:203;;;;20235:18;20218:35:::0;::::1;;;;;;;:13;:35;;;;;;;;;20050:203;20042:240;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;20355:28;;12630:42;20301:38;;;20340:10;20301:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;:82;;20293:132;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20448:16;20462:1;20448:9;;:13;;:16;;;;:::i;:::-;20436:9;:28;;;;20511:21;:36;20533:13;20511:36;;;;;;;;;;;;;;;;;;;;;;;;;;;20485:12;:23;20498:9;;20485:23;;;;;;;;;;;:62;;;;;;;:::i;:::-;;20599:3;20568:17;:28;20586:9;;20568:28;;;;;;;;;;;:34;;;;20634:23;20613:7;:18;20621:9;;20613:18;;;;;;;;;;;;:44;;;;;;;;;;;;;;;;;;;;;;;;19943:722:::0;:::o;12776:29::-;;;;:::o;24677:948::-;12363:32;12371:10;12363:30;;;:32::i;:::-;12361:35;:62;;;;;12413:10;12400:23;;:9;:23;;;12361:62;12353:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24784:1:::1;24775:6;:10;24767:45;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;24831:26;24846:10;24831:14;:26::i;:::-;24823:58;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;24920:25;:37;24946:10;24920:37;;;;;;;;;;;;;;;:49;24958:10;24920:49;;;;;;;;;;;;24910:6;:59;;24902:113;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25088:61;25142:6;25088:25;:37;25114:10;25088:37;;;;;;;;;;;;;;;:49;25126:10;25088:49;;;;;;;;;;;;:53;;:61;;;;:::i;:::-;25036:25;:37;25062:10;25036:37;;;;;;;;;;;;;;;:49;25074:10;25036:49;;;;;;;;;;;:113;;;;25195:44;25232:6;25195:20;:32;25216:10;25195:32;;;;;;;;;;;;;;;;:36;;:44;;;;:::i;:::-;25160:20;:32;25181:10;25160:32;;;;;;;;;;;;;;;:79;;;;25306:10;25264:52;;;;;;;;:14;:26;25279:10;25264:26;;;;;;;;;;;;;;;:38;25291:10;25264:38;;;;;;;;;;;;;;;;;;;;;:52;;;;;;;;;25260:252;;;25362:38;25393:6;25362:14;:26;25377:10;25362:26;;;;;;;;;;;;:30;;:38;;;;:::i;:::-;25333:14;:26;25348:10;25333:26;;;;;;;;;;;:67;;;;25260:252;;;25462:38;25493:6;25462:14;:26;25477:10;25462:26;;;;;;;;;;;;:30;;:38;;;;:::i;:::-;25433:14;:26;25448:10;25433:26;;;;;;;;;;;:67;;;;25260:252;12630:42;25540:37;;;25578:10;25590:6;25540:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;25532:85;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;24677:948:::0;;:::o;17326:67::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;13269:43::-;13306:6;13269:43;:::o;11261:137::-;10586:1;10564:24;;:10;:24;;;;10557:32;;;;10622:12;;;;;;;;;;;10608:26;;:10;:26;;;10600:35;;;;;;11322:32:::1;11341:12;;;;;;;;;;;11322:18;:32::i;:::-;11388:1;11365:12;;:25;;;;;;;;;;;;;;;;;;11261:137::o:0;19384:398::-;12363:32;12371:10;12363:30;;;:32::i;:::-;12361:35;:62;;;;;12413:10;12400:23;;:9;:23;;;12361:62;12353:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19526:28:::1;;12630:42;19472:38;;;19511:10;19472:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;:82;;19464:132;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19619:16;19633:1;19619:9;;:13;;:16;;;;:::i;:::-;19607:9;:28;;;;19677:3;19646:17;:28;19664:9;;19646:28;;;;;;;;;;;:34;;;;19712:20;19691:7;:18;19699:9;;19691:18;;;;;;;;;;;;:41;;;;;;;;;;;;;;;;;;;;;;;;19770:4;19743:13;:24;19757:9;;19743:24;;;;;;;;;;;:31;;;;;;;;;;;;:::i;:::-;;19384:398:::0;:::o;18945:281::-;10395:9;:7;:9::i;:::-;10387:18;;;;;;19063:50:::1;12869:8;19063:17;:21;;:50;;;;:::i;:::-;19057:3;:56;19049:100;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;19191:27;19160:28;:58;;;;18945:281:::0;:::o;17169:76::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;16580:47::-;;;;;;;;;;;;;;;;;;;;;;:::o;30241:430::-;30309:4;30332:26;30347:10;30332:14;:26::i;:::-;30331:27;30330:142;;;;;30384:87;13498:6;30384:48;13306:6;30384:17;:29;30402:10;30384:29;;;;;;;;;;;;:33;;:48;;;;:::i;:::-;:52;;:87;;;;:::i;:::-;30378:3;:93;30330:142;:190;;;;;30490:18;:30;30509:10;30490:30;;;;;;;;;;;;;;;;;;;;;30489:31;30330:190;:263;;;;;30567:14;:26;30582:10;30567:26;;;;;;;;;;;;30537:14;:26;30552:10;30537:26;;;;;;;;;;;;:56;;30330:263;30326:315;;;30621:4;30614:11;;;;30326:315;30658:5;30651:12;;30241:430;;;;:::o;16289:44::-;;;;;;;;;;;;;;;;;:::o;31895:217::-;10395:9;:7;:9::i;:::-;10387:18;;;;;;32044:4:::1;32032:39;;;32072:12;32086:9;32097:6;32032:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;31895:217:::0;;;;:::o;29840:207::-;29902:4;29929:48;13306:6;29929:17;:29;29947:10;29929:29;;;;;;;;;;;;:33;;:48;;;;:::i;:::-;29923:3;:54;29919:98;;;30001:4;29994:11;;;;29919:98;30034:5;30027:12;;29840:207;;;;:::o;16386:44::-;;;;;;;;;;;;;;;;;:::o;17041:53::-;;;;;;;;;;;;;;;;;:::o;16197:39::-;;;;;;;;;;;;;;;;;;;;;;:::o;10183:79::-;10221:7;10248:6;;;;;;;;;;;10241:13;;10183:79;:::o;10748:92::-;10788:4;10826:6;;;;;;;;;;;10812:20;;:10;:20;;;10805:27;;10748:92;:::o;16692:47::-;;;;;;;;;;;;;;;;;:::o;13441:63::-;13498:6;13441:63;:::o;12582:90::-;12630:42;12582:90;:::o;21720:411::-;12363:32;12371:10;12363:30;;;:32::i;:::-;12361:35;:62;;;;;12413:10;12400:23;;:9;:23;;;12361:62;12353:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10395:9:::1;:7;:9::i;:::-;10387:18;;;::::0;::::1;;21873:28:::2;;12630:42;21819:38;;;21858:10;21819:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;:82;;21811:132;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21966:16;21980:1;21966:9;;:13;;:16;;;;:::i;:::-;21954:9;:28;;;;22017:9;21993:10;:21;22004:9;;21993:21;;;;;;;;;;;:33;;;;22068:3;22037:17;:28;22055:9;;22037:28;;;;;;;;;;;:34;;;;22103:20;22082:7;:18;22090:9;;22082:18;;;;;;;;;;;;:41;;;;;;;;;;;;;;;;;;;;;;;;21720:411:::0;:::o;16939:45::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;32294:226::-;10395:9;:7;:9::i;:::-;10387:18;;;;;;32449:4:::1;32437:42;;;32480:12;32494:9;32505:6;32437:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;32294:226:::0;;;;:::o;17701:1016::-;17772:16;17800:22;17833:20;17864;17895:33;17939:22;17972:23;18006:24;18041:15;18067:27;18105:19;18161:10;18147:24;;18200:7;:19;18208:10;18200:19;;;;;;;;;;;;;;;;;;;;;18182:37;;18248:14;:26;18263:10;18248:26;;;;;;;;;;;;18230:44;;18303:14;:26;18318:10;18303:26;;;;;;;;;;;;18285:44;;18355:12;:24;18368:10;18355:24;;;;;;;;;;;18340:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18407:14;:26;18422:10;18407:26;;;;;;;;;;;;;;;;;;;;;18390:43;;18465:17;:29;18483:10;18465:29;;;;;;;;;;;;18444:50;;18527:18;:30;18546:10;18527:30;;;;;;;;;;;;;;;;;;;;;18505:52;;18581:10;:22;18592:10;18581:22;;;;;;;;;;;;18568:35;;18630:13;:25;18644:10;18630:25;;;;;;;;;;;18614:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18683:14;:26;18698:10;18683:26;;;;;;;;;;;;18666:43;;17701:1016;;;;;;;;;;;;;:::o;16780:48::-;;;;;;;;;;;;;;;;;;;;;;:::o;16841:40::-;;;;;;;;;;;;;;;;;:::o;18729:204::-;10395:9;:7;:9::i;:::-;10387:18;;;;;;18811:50:::1;12869:8;18811:17;:21;;:50;;;;:::i;:::-;18805:3;:56;18797:99;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;18916:9;18907:6;:18;;;;18729:204:::0;:::o;30853:348::-;10395:9;:7;:9::i;:::-;10387:18;;;;;;12630:42:::1;30977:37;;:12;:37;;;;:91;;;;31024:44;13057:8;31024:17;:21;;:44;;;;:::i;:::-;31018:3;:50;30977:91;30968:137;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;31131:12;31125:28;;;31154:9;31165:6;31125:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;31116:77;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;30853:348:::0;;;:::o;13145:50::-;;;;:::o;12818:59::-;12869:8;12818:59;:::o;22260:463::-;12363:32;12371:10;12363:30;;;:32::i;:::-;12361:35;:62;;;;;12413:10;12400:23;;:9;:23;;;12361:62;12353:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10395:9:::1;:7;:9::i;:::-;10387:18;;;::::0;::::1;;22435:28:::2;;12630:42;22381:38;;;22420:10;22381:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;:82;;22373:132;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22528:16;22542:1;22528:9;;:13;;:16;;;;:::i;:::-;22516:9;:28;;;;22583:13;22555:14;:25;22570:9;;22555:25;;;;;;;;;;;:41;;;;22638:3;22607:17;:28;22625:9;;22607:28;;;;;;;;;;;:34;;;;22673:42;22652:7;:18;22660:9;;22652:18;;;;;;;;;;;;:63;;;;;;;;;;;;;;;;;;;;;;;;22260:463:::0;:::o;9741:27::-;;;;;;;;;;;;;:::o;17483:59::-;;;;;;;;;;;;;;;;;:::o;31383:330::-;10395:9;:7;:9::i;:::-;10387:18;;;;;;12630:42:::1;31513:37;;:12;:37;;;;:91;;;;31560:44;13057:8;31560:17;:21;;:44;;;;:::i;:::-;31554:3;:50;31513:91;31504:137;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;31664:12;31652:34;;;31687:9;31698:6;31652:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;31383:330:::0;;;:::o;11015:149::-;10395:9;:7;:9::i;:::-;10387:18;;;;;;11118:1:::1;11097:23;;:9;:23;;;;11089:32;;;::::0;::::1;;11147:9;11132:12;;:24;;;;;;;;;;;;;;;;;;11015:149:::0;:::o;20783:830::-;12363:32;12371:10;12363:30;;;:32::i;:::-;12361:35;:62;;;;;12413:10;12400:23;;:9;:23;;;12361:62;12353:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10395:9:::1;:7;:9::i;:::-;10387:18;;;::::0;::::1;;20943::::2;20926:35;;;;;;;;:13;:35;;;;;;;;;:91;;;;20999:18;20982:35;;;;;;;;:13;:35;;;;;;;;;20926:91;:147;;;;21055:18;21038:35;;;;;;;;:13;:35;;;;;;;;;20926:147;:203;;;;21111:18;21094:35:::0;::::2;;;;;;;:13;:35;;;;;;;;;20926:203;20918:240;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;21249:28;;12630:42;21195:38;;;21234:10;21195:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;:82;;21187:132;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21342:16;21356:1;21342:9;;:13;;:16;;;;:::i;:::-;21330:9;:28;;;;21405:21;:36;21427:13;21405:36;;;;;;;;;;;;;;;;;;;;;;;;;;;21379:12;:23;21392:9;;21379:23;;;;;;;;;;;:62;;;;;;;:::i;:::-;;21490:13;21462:14;:25;21477:9;;21462:25;;;;;;;;;;;;:41;;;;;;;;;;;;;;;;;;21545:3;21514:17;:28;21532:9;;21514:28;;;;;;;;;;;:34;;;;21580:25;21559:7;:18;21567:9;;21559:18;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;;;;;;;20783:830:::0;;:::o;17617:25::-;;;;:::o;13012:53::-;13057:8;13012:53;:::o;16479:51::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1554:422::-;1614:4;1822:12;1933:7;1921:20;1913:28;;1967:1;1960:4;:8;1953:15;;;1554:422;;;:::o;733:133::-;791:7;807:9;823:1;819;:5;807:17;;843:1;838;:6;;831:14;;;;859:1;852:8;;;733:133;;;;:::o;614:113::-;672:7;700:1;695;:6;;688:14;;;;720:1;716;:5;709:12;;614:113;;;;:::o;11548:187::-;11642:1;11622:22;;:8;:22;;;;11614:31;;;;;;11690:8;11661:38;;11682:6;;;;;;;;;;;11661:38;;;;;;;;;;;;11719:8;11710:6;;:17;;;;;;;;;;;;;;;;;;11548:187;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5:97::-;;93:2;89:7;84:2;77:5;73:14;69:28;59:38;;53:49;;;:::o;110:106::-;;200:5;195:3;191:15;169:37;;163:53;;;:::o;224:739::-;;297:4;279:16;276:26;273:2;;;305:5;;273:2;339:1;336;333;318:23;357:34;388:1;382:8;357:34;:::i;:::-;414:10;409:3;406:19;396:2;;429:5;;;396:2;460;454:9;514:1;496:16;492:24;489:1;483:4;468:49;543:4;537:11;624:16;617:4;609:6;605:17;602:39;576:18;568:6;565:30;556:91;553:2;;;655:5;;;;;553:2;693:6;687:4;683:17;725:3;719:10;748:18;740:6;737:30;734:2;;;770:5;;;;;;;734:2;814:6;807:4;802:3;798:14;794:27;847:16;841:4;837:27;832:3;829:36;826:2;;;868:5;;;;;;;;826:2;912:29;934:6;912:29;:::i;:::-;905:4;900:3;896:14;892:50;888:2;881:62;955:3;948:10;;267:696;;;;;;;;:::o
Swarm Source
ipfs://ca0a6ace76e2fba50d8dc98ea05bed9b965f65485955705e0a0b0edac736c097
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.