Contract Overview
Balance:
0 frxETH
My Name Tag:
Not Available
TokenTracker:
[ Download CSV Export ]
Contract Name:
TellorPlayground
Compiler Version
v0.8.3+commit.8d00100c
Contract Source Code (Solidity)
/** *Submitted for verification at holesky.fraxscan.com on 2024-03-26 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; contract TellorPlayground { // Events event Approval( address indexed owner, address indexed spender, uint256 value ); event NewReport( bytes32 _queryId, uint256 _time, bytes _value, uint256 _nonce, bytes _queryData, address _reporter ); event NewStaker(address _staker, uint256 _amount); event StakeWithdrawRequested(address _staker, uint256 _amount); event StakeWithdrawn(address _staker); event Transfer(address indexed from, address indexed to, uint256 value); // Storage mapping(bytes32 => mapping(uint256 => bool)) public isDisputed; //queryId -> timestamp -> value mapping(bytes32 => mapping(uint256 => address)) public reporterByTimestamp; mapping(address => StakeInfo) stakerDetails; //mapping from a persons address to their staking info mapping(bytes32 => uint256[]) public timestamps; mapping(bytes32 => uint256) public tips; // mapping of data IDs to the amount of TRB they are tipped mapping(bytes32 => mapping(uint256 => bytes)) public values; //queryId -> timestamp -> value mapping(bytes32 => uint256[]) public voteRounds; // mapping of vote identifier hashes to an array of dispute IDs mapping(address => mapping(address => uint256)) private _allowances; mapping(address => uint256) private _balances; uint256 public stakeAmount; uint256 public constant timeBasedReward = 5e17; // time based reward for a reporter for successfully submitting a value uint256 public tipsInContract; // number of tips within the contract uint256 public voteCount; address public token; uint256 private _totalSupply; string private _name; string private _symbol; uint8 private _decimals; // Structs struct StakeInfo { uint256 startDate; //stake start date uint256 stakedBalance; // staked balance uint256 lockedBalance; // amount locked for withdrawal uint256 reporterLastTimestamp; // timestamp of reporter's last reported value uint256 reportsSubmitted; // total number of reports submitted by reporter } // Functions /** * @dev Initializes playground parameters */ constructor() { _name = "TellorPlayground"; _symbol = "TRBP"; _decimals = 18; token = address(this); } /** * @dev Mock function for adding staking rewards. No rewards actually given to stakers * @param _amount Amount of TRB to be added to the contract */ function addStakingRewards(uint256 _amount) external { require(_transferFrom(msg.sender, address(this), _amount)); } /** * @dev Approves amount that an address is alowed to spend of behalf of another * @param _spender The address which is allowed to spend the tokens * @param _amount The amount that msg.sender is allowing spender to use * @return bool Whether the transaction succeeded * */ function approve(address _spender, uint256 _amount) external returns (bool){ _approve(msg.sender, _spender, _amount); return true; } /** * @dev A mock function to create a dispute * @param _queryId The tellorId to be disputed * @param _timestamp the timestamp of the value to be disputed */ function beginDispute(bytes32 _queryId, uint256 _timestamp) external { values[_queryId][_timestamp] = bytes(""); isDisputed[_queryId][_timestamp] = true; voteCount++; voteRounds[keccak256(abi.encodePacked(_queryId, _timestamp))].push( voteCount ); } /** * @dev Allows a reporter to submit stake * @param _amount amount of tokens to stake */ function depositStake(uint256 _amount) external { StakeInfo storage _staker = stakerDetails[msg.sender]; if (_staker.lockedBalance > 0) { if (_staker.lockedBalance >= _amount) { _staker.lockedBalance -= _amount; } else { require( _transferFrom( msg.sender, address(this), _amount - _staker.lockedBalance ) ); _staker.lockedBalance = 0; } } else { require(_transferFrom(msg.sender, address(this), _amount)); } _staker.startDate = block.timestamp; // This resets their stake start date to now _staker.stakedBalance += _amount; emit NewStaker(msg.sender, _amount); } /** * @dev Public function to mint tokens to the given address * @param _user The address which will receive the tokens */ function faucet(address _user) external { _mint(_user, 1000 ether); } /** * @dev Allows a reporter to request to withdraw their stake * @param _amount amount of staked tokens requesting to withdraw */ function requestStakingWithdraw(uint256 _amount) external { StakeInfo storage _staker = stakerDetails[msg.sender]; require( _staker.stakedBalance >= _amount, "insufficient staked balance" ); _staker.startDate = block.timestamp; _staker.lockedBalance += _amount; _staker.stakedBalance -= _amount; emit StakeWithdrawRequested(msg.sender, _amount); } /** * @dev A mock function to submit a value to be read without reporter staking needed * @param _queryId the ID to associate the value to * @param _value the value for the queryId * @param _nonce the current value count for the query id * @param _queryData the data used by reporters to fulfill the data query */ // slither-disable-next-line timestamp function submitValue( bytes32 _queryId, bytes calldata _value, uint256 _nonce, bytes memory _queryData ) external { require(keccak256(_value) != keccak256(""), "value must be submitted"); require( _nonce == timestamps[_queryId].length || _nonce == 0, "nonce must match timestamp index" ); require( _queryId == keccak256(_queryData) || uint256(_queryId) <= 100, "id must be hash of bytes data" ); values[_queryId][block.timestamp] = _value; timestamps[_queryId].push(block.timestamp); reporterByTimestamp[_queryId][block.timestamp] = msg.sender; stakerDetails[msg.sender].reporterLastTimestamp = block.timestamp; stakerDetails[msg.sender].reportsSubmitted++; emit NewReport( _queryId, block.timestamp, _value, _nonce, _queryData, msg.sender ); } /** * @dev Transfer tokens from one user to another * @param _recipient The destination address * @param _amount The amount of tokens, including decimals, to transfer * @return bool If the transfer succeeded */ function transfer(address _recipient, uint256 _amount) public returns (bool) { _transfer(msg.sender, _recipient, _amount); return true; } /** * @dev Transfer tokens from user to another * @param _sender The address which owns the tokens * @param _recipient The destination address * @param _amount The quantity of tokens to transfer * @return bool Whether the transfer succeeded */ function transferFrom( address _sender, address _recipient, uint256 _amount ) public returns (bool) { _transfer(_sender, _recipient, _amount); _approve( _sender, msg.sender, _allowances[_sender][msg.sender] - _amount ); return true; } /** * @dev Withdraws a reporter's stake */ function withdrawStake() external { StakeInfo storage _s = stakerDetails[msg.sender]; // Ensure reporter is locked and that enough time has passed require(block.timestamp - _s.startDate >= 7 days, "7 days didn't pass"); require(_s.lockedBalance > 0, "reporter not locked for withdrawal"); _transfer(address(this), msg.sender, _s.lockedBalance); _s.lockedBalance = 0; emit StakeWithdrawn(msg.sender); } // Getters /** * @dev Returns the amount that an address is alowed to spend of behalf of another * @param _owner The address which owns the tokens * @param _spender The address that will use the tokens * @return uint256 The amount of allowed tokens */ function allowance(address _owner, address _spender) external view returns (uint256){ return _allowances[_owner][_spender]; } /** * @dev Returns the balance of a given user. * @param _account user address * @return uint256 user's token balance */ function balanceOf(address _account) external view returns (uint256) { return _balances[_account]; } /** * @dev Returns the number of decimals used to get its user representation. * @return uint8 the number of decimals; used only for display purposes */ function decimals() external view returns (uint8) { return _decimals; } /** * @dev Retrieves the latest value for the queryId before the specified timestamp * @param _queryId is the queryId to look up the value for * @param _timestamp before which to search for latest value * @return _ifRetrieve bool true if able to retrieve a non-zero value * @return _value the value retrieved * @return _timestampRetrieved the value's timestamp */ function getDataBefore(bytes32 _queryId, uint256 _timestamp) external view returns ( bool _ifRetrieve, bytes memory _value, uint256 _timestampRetrieved ) { (bool _found, uint256 _index) = getIndexForDataBefore( _queryId, _timestamp ); if (!_found) return (false, bytes(""), 0); _timestampRetrieved = getTimestampbyQueryIdandIndex(_queryId, _index); _value = values[_queryId][_timestampRetrieved]; return (true, _value, _timestampRetrieved); } /** * @dev Retrieves latest array index of data before the specified timestamp for the queryId * @param _queryId is the queryId to look up the index for * @param _timestamp is the timestamp before which to search for the latest index * @return _found whether the index was found * @return _index the latest index found before the specified timestamp */ // slither-disable-next-line calls-loop function getIndexForDataBefore(bytes32 _queryId, uint256 _timestamp) public view returns (bool _found, uint256 _index) { uint256 _count = getNewValueCountbyQueryId(_queryId); if (_count > 0) { uint256 _middle; uint256 _start = 0; uint256 _end = _count - 1; uint256 _time; //Checking Boundaries to short-circuit the algorithm _time = getTimestampbyQueryIdandIndex(_queryId, _start); if (_time >= _timestamp) return (false, 0); _time = getTimestampbyQueryIdandIndex(_queryId, _end); if (_time < _timestamp) { while (isInDispute(_queryId, _time) && _end > 0) { _end--; _time = getTimestampbyQueryIdandIndex(_queryId, _end); } if (_end == 0 && isInDispute(_queryId, _time)) { return (false, 0); } return (true, _end); } //Since the value is within our boundaries, do a binary search while (true) { _middle = (_end - _start) / 2 + 1 + _start; _time = getTimestampbyQueryIdandIndex(_queryId, _middle); if (_time < _timestamp) { //get immediate next value uint256 _nextTime = getTimestampbyQueryIdandIndex( _queryId, _middle + 1 ); if (_nextTime >= _timestamp) { if (!isInDispute(_queryId, _time)) { // _time is correct return (true, _middle); } else { // iterate backwards until we find a non-disputed value while ( isInDispute(_queryId, _time) && _middle > 0 ) { _middle--; _time = getTimestampbyQueryIdandIndex( _queryId, _middle ); } if (_middle == 0 && isInDispute(_queryId, _time)) { return (false, 0); } // _time is correct return (true, _middle); } } else { //look from middle + 1(next value) to end _start = _middle + 1; } } else { uint256 _prevTime = getTimestampbyQueryIdandIndex( _queryId, _middle - 1 ); if (_prevTime < _timestamp) { if (!isInDispute(_queryId, _prevTime)) { // _prevTime is correct return (true, _middle - 1); } else { // iterate backwards until we find a non-disputed value _middle--; while ( isInDispute(_queryId, _prevTime) && _middle > 0 ) { _middle--; _prevTime = getTimestampbyQueryIdandIndex( _queryId, _middle ); } if ( _middle == 0 && isInDispute(_queryId, _prevTime) ) { return (false, 0); } // _prevtime is correct return (true, _middle); } } else { //look from start to middle -1(prev value) _end = _middle - 1; } } } } return (false, 0); } /** * @dev Counts the number of values that have been submitted for a given ID * @param _queryId the ID to look up * @return uint256 count of the number of values received for the queryId */ function getNewValueCountbyQueryId(bytes32 _queryId) public view returns (uint256) { return timestamps[_queryId].length; } /** * @dev Returns the reporter for a given timestamp and queryId * @param _queryId bytes32 version of the queryId * @param _timestamp uint256 timestamp of report * @return address of data reporter */ function getReporterByTimestamp(bytes32 _queryId, uint256 _timestamp) external view returns (address) { return reporterByTimestamp[_queryId][_timestamp]; } /** * @dev Returns mock stake amount * @return uint256 stake amount */ function getStakeAmount() external view returns (uint256) { return stakeAmount; } /** * @dev Allows users to retrieve all information about a staker * @param _stakerAddress address of staker inquiring about * @return uint startDate of staking * @return uint current amount staked * @return uint current amount locked for withdrawal * @return uint reward debt used to calculate staking reward * @return uint reporter's last reported timestamp * @return uint total number of reports submitted by reporter * @return uint governance vote count when first staked * @return uint number of votes case by staker when first staked * @return uint whether staker is counted in totalStakers */ function getStakerInfo(address _stakerAddress) external view returns ( uint256, uint256, uint256, uint256, uint256, uint256, uint256, uint256, bool ) { StakeInfo storage _staker = stakerDetails[_stakerAddress]; return ( _staker.startDate, _staker.stakedBalance, _staker.lockedBalance, 0, // reward debt _staker.reporterLastTimestamp, _staker.reportsSubmitted, 0, // start vote count 0, // start vote tally false ); } /** * @dev Gets the timestamp for the value based on their index * @param _queryId is the queryId to look up * @param _index is the value index to look up * @return uint256 timestamp */ function getTimestampbyQueryIdandIndex(bytes32 _queryId, uint256 _index) public view returns (uint256) { uint256 _len = timestamps[_queryId].length; if (_len == 0 || _len <= _index) return 0; return timestamps[_queryId][_index]; } /** * @dev Returns an array of voting rounds for a given vote * @param _hash is the identifier hash for a vote * @return uint256[] memory dispute IDs of the vote rounds */ function getVoteRounds(bytes32 _hash) public view returns (uint256[] memory){ return voteRounds[_hash]; } /** * @dev Returns the governance address of the contract * @return address (this address) */ function governance() external view returns (address) { return address(this); } /** * @dev Returns whether a given value is disputed * @param _queryId unique ID of the data feed * @param _timestamp timestamp of the value * @return bool whether the value is disputed */ function isInDispute(bytes32 _queryId, uint256 _timestamp) public view returns (bool) { return isDisputed[_queryId][_timestamp]; } /** * @dev Returns the name of the token. * @return string name of the token */ function name() external view returns (string memory) { return _name; } /** * @dev Retrieves value from oracle based on queryId/timestamp * @param _queryId being requested * @param _timestamp to retrieve data/value from * @return bytes value for queryId/timestamp submitted */ function retrieveData(bytes32 _queryId, uint256 _timestamp) external view returns (bytes memory) { return values[_queryId][_timestamp]; } /** * @dev Returns the symbol of the token. * @return string symbol of the token */ function symbol() external view returns (string memory) { return _symbol; } /** * @dev Returns the total supply of the token. * @return uint256 total supply of token */ function totalSupply() external view returns (uint256) { return _totalSupply; } // Internal functions /** * @dev Internal function to approve tokens for the user * @param _owner The owner of the tokens * @param _spender The address which is allowed to spend the tokens * @param _amount The amount that msg.sender is allowing spender to use */ function _approve( address _owner, address _spender, uint256 _amount ) internal { require(_owner != address(0), "ERC20: approve from the zero address"); require(_spender != address(0), "ERC20: approve to the zero address"); _allowances[_owner][_spender] = _amount; emit Approval(_owner, _spender, _amount); } /** * @dev Internal function to burn tokens for the user * @param _account The address whose tokens to burn * @param _amount The quantity of tokens to burn */ function _burn(address _account, uint256 _amount) internal{ require(_account != address(0), "ERC20: burn from the zero address"); _balances[_account] -= _amount; _totalSupply -= _amount; emit Transfer(_account, address(0), _amount); } /** * @dev Internal function to create new tokens for the user * @param _account The address which receives minted tokens * @param _amount The quantity of tokens to min */ function _mint(address _account, uint256 _amount) internal{ require(_account != address(0), "ERC20: mint to the zero address"); _totalSupply += _amount; _balances[_account] += _amount; emit Transfer(address(0), _account, _amount); } /** * @dev Internal function to perform token transfer * @param _sender The address which owns the tokens * @param _recipient The destination address * @param _amount The quantity of tokens to transfer */ function _transfer( address _sender, address _recipient, uint256 _amount ) internal{ require(_sender != address(0), "ERC20: transfer from the zero address"); require( _recipient != address(0),"ERC20: transfer to the zero address"); _balances[_sender] -= _amount; _balances[_recipient] += _amount; emit Transfer(_sender, _recipient, _amount); } /** * @dev Allows this contract to transfer tokens from one user to another * @param _sender The address which owns the tokens * @param _recipient The destination address * @param _amount The quantity of tokens to transfer * @return bool Whether the transfer succeeded */ function _transferFrom( address _sender, address _recipient, uint256 _amount ) internal returns (bool) { _transfer(_sender, _recipient, _amount); _approve( _sender, msg.sender, _allowances[_sender][address(this)] - _amount ); return true; } }
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"_time","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"_value","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"_nonce","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"_queryData","type":"bytes"},{"indexed":false,"internalType":"address","name":"_reporter","type":"address"}],"name":"NewReport","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_staker","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"NewStaker","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_staker","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"StakeWithdrawRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_staker","type":"address"}],"name":"StakeWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"addStakingRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"beginDispute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"depositStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"faucet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"getDataBefore","outputs":[{"internalType":"bool","name":"_ifRetrieve","type":"bool"},{"internalType":"bytes","name":"_value","type":"bytes"},{"internalType":"uint256","name":"_timestampRetrieved","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"getIndexForDataBefore","outputs":[{"internalType":"bool","name":"_found","type":"bool"},{"internalType":"uint256","name":"_index","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_queryId","type":"bytes32"}],"name":"getNewValueCountbyQueryId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"getReporterByTimestamp","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getStakeAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_stakerAddress","type":"address"}],"name":"getStakerInfo","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getTimestampbyQueryIdandIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_hash","type":"bytes32"}],"name":"getVoteRounds","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governance","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"isDisputed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"isInDispute","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"reporterByTimestamp","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"requestStakingWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"retrieveData","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakeAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"internalType":"bytes","name":"_value","type":"bytes"},{"internalType":"uint256","name":"_nonce","type":"uint256"},{"internalType":"bytes","name":"_queryData","type":"bytes"}],"name":"submitValue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"timeBasedReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"timestamps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"tips","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tipsInContract","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_sender","type":"address"},{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"values","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"voteCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"voteRounds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawStake","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040805180820190915260108082526f15195b1b1bdc941b185e59dc9bdd5b9960821b60209092019182526200004b91600e916200009f565b50604080518082019091526004808252630545242560e41b60209092019182526200007991600f916200009f565b506010805460ff19166012179055600c80546001600160a01b0319163017905562000182565b828054620000ad9062000145565b90600052602060002090601f016020900481019282620000d157600085556200011c565b82601f10620000ec57805160ff19168380011785556200011c565b828001600101855582156200011c579182015b828111156200011c578251825591602001919060010190620000ff565b506200012a9291506200012e565b5090565b5b808211156200012a57600081556001016200012f565b600181811c908216806200015a57607f821691505b602082108114156200017c57634e487b7160e01b600052602260045260246000fd5b50919050565b611d6380620001926000396000f3fe608060405234801561001057600080fd5b50600436106102325760003560e01c8063733bdef011610130578063c5958af9116100b8578063d9c51cd41161007c578063d9c51cd4146105c7578063dd62ed3e146105da578063e07c548614610613578063f25133f314610647578063fc0c546a1461065a57610232565b8063c5958af914610572578063c638407114610585578063c979fe9f1461058e578063cb82cc8f146105a1578063ce5e11bf146105b457610232565b806396426d97116100ff57806396426d9714610513578063a792765f14610522578063a9059cbb14610544578063b86d1d6314610557578063bed9d8611461056a57610232565b8063733bdef01461044357806377b03e0d146104d85780638929f4c6146104f857806395d89b411461050b57610232565b8063313ce567116101be57806360c7dc471161018257806360c7dc47146103d557806364473df2146103de57806369d43bd31461040957806370a0823114610412578063722580b61461043b57610232565b8063313ce5671461035b57806344e87f91146103705780635aa6e6751461039c5780635eaa9ced146103a2578063602bf227146103b557610232565b80631f379acc116102055780631f379acc1461029d578063217053c0146102b257806323b872dd146102fe578063248638e514610311578063294490851461033157610232565b806306fdde0314610237578063091b50ff14610255578063095ea7b31461026857806318160ddd1461028b575b600080fd5b61023f61066d565b60405161024c9190611c32565b60405180910390f35b61023f610263366004611ada565b6106ff565b61027b6102763660046119f4565b6107a4565b604051901515815260200161024c565b600d545b60405190815260200161024c565b6102b06102ab366004611ada565b6107bb565b005b6102e66102c0366004611ada565b60016020908152600092835260408084209091529082529020546001600160a01b031681565b6040516001600160a01b03909116815260200161024c565b61027b61030c3660046119b9565b610881565b61032461031f366004611a1d565b6108d3565b60405161024c9190611b56565b61034461033f366004611ada565b610936565b60408051921515835260208301919091520161024c565b60105460405160ff909116815260200161024c565b61027b61037e366004611ada565b60009182526020828152604080842092845291905290205460ff1690565b306102e6565b6102b06103b0366004611a35565b610c60565b61028f6103c3366004611a1d565b60046020526000908152604090205481565b61028f60095481565b61027b6103ec366004611ada565b600060208181529281526040808220909352908152205460ff1681565b61028f600a5481565b61028f610420366004611966565b6001600160a01b031660009081526008602052604090205490565b60095461028f565b610492610451366004611966565b6001600160a01b0316600090815260026020819052604082208054600182015492820154600383015460049093015491959394909390929190839081908190565b60408051998a5260208a0198909852968801959095526060870193909352608086019190915260a085015260c084015260e083015215156101008201526101200161024c565b61028f6104e6366004611a1d565b60009081526003602052604090205490565b6102b0610506366004611a1d565b610e9a565b61023f610f75565b61028f6706f05b59d3b2000081565b610535610530366004611ada565b610f84565b60405161024c93929190611b9a565b61027b6105523660046119f4565b611081565b6102b0610565366004611966565b61108e565b6102b06110a4565b61023f610580366004611ada565b6111b2565b61028f600b5481565b61028f61059c366004611ada565b611260565b6102b06105af366004611a1d565b611291565b61028f6105c2366004611ada565b61136f565b6102b06105d5366004611a1d565b6113dc565b61028f6105e8366004611987565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205490565b6102e6610621366004611ada565b60009182526001602090815260408084209284529190529020546001600160a01b031690565b61028f610655366004611ada565b6113f0565b600c546102e6906001600160a01b031681565b6060600e805461067c90611cab565b80601f01602080910402602001604051908101604052809291908181526020018280546106a890611cab565b80156106f55780601f106106ca576101008083540402835291602001916106f5565b820191906000526020600020905b8154815290600101906020018083116106d857829003601f168201915b5050505050905090565b60056020908152600092835260408084209091529082529020805461072390611cab565b80601f016020809104026020016040519081016040528092919081815260200182805461074f90611cab565b801561079c5780601f106107715761010080835404028352916020019161079c565b820191906000526020600020905b81548152906001019060200180831161077f57829003601f168201915b505050505081565b60006107b133848461140c565b5060015b92915050565b60408051602080820180845260008084528681526005835284812086825290925292902090516107eb92906117bb565b506000828152602081815260408083208484529091528120805460ff19166001179055600b80549161081c83611ce6565b9190505550600660008383604051602001610841929190918252602082015260400190565b60408051601f19818403018152918152815160209283012083528282019390935291016000908120600b5481546001810183559183529290912001555050565b600061088e848484611531565b6001600160a01b0384166000908152600760209081526040808320338085529252909120546108c99186916108c4908690611c7d565b61140c565b5060019392505050565b60008181526006602090815260409182902080548351818402810184019094528084526060939283018282801561092957602002820191906000526020600020905b815481526020019060010190808311610915575b505050505090505b919050565b60008281526003602052604081205481908015610c50576000808061095c600185611c7d565b9050600061096a898461136f565b905087811061098457600080965096505050505050610c59565b61098e898361136f565b905087811015610a2e575b60008981526020818152604080832084845290915290205460ff1680156109c05750600082115b156109e357816109cf81611c94565b9250506109dc898361136f565b9050610999565b81158015610a08575060008981526020818152604080832084845290915290205460ff165b15610a1e57600080965096505050505050610c59565b50600195509350610c5992505050565b826002610a3b8285611c7d565b610a459190611c5d565b610a50906001611c45565b610a5a9190611c45565b9350610a66898561136f565b905087811015610b66576000610a818a6105c2876001611c45565b9050888110610b535760008a81526020818152604080832085845290915290205460ff16610abb5760018597509750505050505050610c59565b60008a81526020818152604080832085845290915290205460ff168015610ae25750600085115b15610b055784610af181611c94565b955050610afe8a8661136f565b9150610abb565b84158015610b2a575060008a81526020818152604080832085845290915290205460ff165b15610b415760008097509750505050505050610c59565b60018597509750505050505050610c59565b610b5e856001611c45565b935050610c4b565b6000610b778a6105c2600188611c7d565b905088811015610c3c5760008a81526020818152604080832084845290915290205460ff16610bbb576001610bac8187611c7d565b97509750505050505050610c59565b84610bc581611c94565b9550505b60008a81526020818152604080832084845290915290205460ff168015610bf05750600085115b15610c135784610bff81611c94565b955050610c0c8a8661136f565b9050610bc9565b84158015610b2a575060008a81526020818152604080832084845290915290205460ff16610b2a565b610c47600186611c7d565b9250505b610a2e565b60008092509250505b9250929050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708484604051610c91929190611b46565b60405180910390201415610cec5760405162461bcd60e51b815260206004820152601760248201527f76616c7565206d757374206265207375626d697474656400000000000000000060448201526064015b60405180910390fd5b600085815260036020526040902054821480610d06575081155b610d525760405162461bcd60e51b815260206004820181905260248201527f6e6f6e6365206d757374206d617463682074696d657374616d7020696e6465786044820152606401610ce3565b80516020820120851480610d67575060648511155b610db35760405162461bcd60e51b815260206004820152601d60248201527f6964206d7573742062652068617368206f6620627974657320646174610000006044820152606401610ce3565b60008581526005602090815260408083204284529091529020610dd790858561183f565b5060008581526003602081815260408084208054600181810183559186528386204291018190558a86529083528185208186528352818520805473ffffffffffffffffffffffffffffffffffffffff19163390811790915585526002909252832091820155600401805491610e4b83611ce6565b91905055507f48e9e2c732ba278de6ac88a3a57a5c5ba13d3d8370e709b3b98333a57876ca9585428686868633604051610e8b9796959493929190611bc5565b60405180910390a15050505050565b3360009081526002602052604090206001810154821115610efd5760405162461bcd60e51b815260206004820152601b60248201527f696e73756666696369656e74207374616b65642062616c616e636500000000006044820152606401610ce3565b428155600281018054839190600090610f17908490611c45565b9250508190555081816001016000828254610f329190611c7d565b909155505060408051338152602081018490527f3d8d9df4bd0172df32e557fa48e96435cd7f2cac06aaffacfaee608e6f7898ef91015b60405180910390a15050565b6060600f805461067c90611cab565b600060606000806000610f978787610936565b9150915081610fc1576000604051806020016040528060008152506000945094509450505061107a565b610fcb878261136f565b60008881526005602090815260408083208484529091529020805491945090610ff390611cab565b80601f016020809104026020016040519081016040528092919081815260200182805461101f90611cab565b801561106c5780601f106110415761010080835404028352916020019161106c565b820191906000526020600020905b81548152906001019060200180831161104f57829003601f168201915b505050505093506001945050505b9250925092565b60006107b1338484611531565b6110a181683635c9adc5dea00000611698565b50565b336000908152600260205260409020805462093a80906110c49042611c7d565b10156111075760405162461bcd60e51b8152602060048201526012602482015271372064617973206469646e2774207061737360701b6044820152606401610ce3565b60008160020154116111665760405162461bcd60e51b815260206004820152602260248201527f7265706f72746572206e6f74206c6f636b656420666f72207769746864726177604482015261185b60f21b6064820152608401610ce3565b61117530338360020154611531565b600060028201556040513381527f4a7934670bd8304e7da22378be1368f7c4fef17c5aee81804beda8638fe428ec9060200160405180910390a150565b600082815260056020908152604080832084845290915290208054606091906111da90611cab565b80601f016020809104026020016040519081016040528092919081815260200182805461120690611cab565b80156112535780601f1061122857610100808354040283529160200191611253565b820191906000526020600020905b81548152906001019060200180831161123657829003601f168201915b5050505050905092915050565b6006602052816000526040600020818154811061127c57600080fd5b90600052602060002001600091509150505481565b336000908152600260208190526040909120908101541561130657818160020154106112d657818160020160008282546112cb9190611c7d565b909155506113019050565b6112f033308360020154856112eb9190611c7d565b611777565b6112f957600080fd5b600060028201555b61131a565b611311333084611777565b61131a57600080fd5b428155600181018054839190600090611334908490611c45565b909155505060408051338152602081018490527fa96c2cce65119a2170d1711a6e82f18f2006448828483ba7545e5954765436479101610f69565b60008281526003602052604081205480158061138b5750828111155b1561139a5760009150506107b5565b60008481526003602052604090208054849081106113c857634e487b7160e01b600052603260045260246000fd5b906000526020600020015491505092915050565b6113e7333083611777565b6110a157600080fd5b6003602052816000526040600020818154811061127c57600080fd5b6001600160a01b03831661146e5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610ce3565b6001600160a01b0382166114cf5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610ce3565b6001600160a01b0383811660008181526007602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0383166115955760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610ce3565b6001600160a01b0382166115f75760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610ce3565b6001600160a01b0383166000908152600860205260408120805483929061161f908490611c7d565b90915550506001600160a01b0382166000908152600860205260408120805483929061164c908490611c45565b92505081905550816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161152491815260200190565b6001600160a01b0382166116ee5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610ce3565b80600d60008282546117009190611c45565b90915550506001600160a01b0382166000908152600860205260408120805483929061172d908490611c45565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6000611784848484611531565b6001600160a01b03841660009081526007602090815260408083203084529091529020546108c990859033906108c4908690611c7d565b8280546117c790611cab565b90600052602060002090601f0160209004810192826117e9576000855561182f565b82601f1061180257805160ff191683800117855561182f565b8280016001018555821561182f579182015b8281111561182f578251825591602001919060010190611814565b5061183b9291506118b3565b5090565b82805461184b90611cab565b90600052602060002090601f01602090048101928261186d576000855561182f565b82601f106118865782800160ff1982351617855561182f565b8280016001018555821561182f579182015b8281111561182f578235825591602001919060010190611898565b5b8082111561183b57600081556001016118b4565b80356001600160a01b038116811461093157600080fd5b600082601f8301126118ef578081fd5b813567ffffffffffffffff8082111561190a5761190a611d17565b604051601f8301601f19908116603f0116810190828211818310171561193257611932611d17565b8160405283815286602085880101111561194a578485fd5b8360208701602083013792830160200193909352509392505050565b600060208284031215611977578081fd5b611980826118c8565b9392505050565b60008060408385031215611999578081fd5b6119a2836118c8565b91506119b0602084016118c8565b90509250929050565b6000806000606084860312156119cd578081fd5b6119d6846118c8565b92506119e4602085016118c8565b9150604084013590509250925092565b60008060408385031215611a06578182fd5b611a0f836118c8565b946020939093013593505050565b600060208284031215611a2e578081fd5b5035919050565b600080600080600060808688031215611a4c578081fd5b85359450602086013567ffffffffffffffff80821115611a6a578283fd5b818801915088601f830112611a7d578283fd5b813581811115611a8b578384fd5b896020828501011115611a9c578384fd5b60208301965080955050604088013593506060880135915080821115611ac0578283fd5b50611acd888289016118df565b9150509295509295909350565b60008060408385031215611aec578182fd5b50508035926020909101359150565b60008151808452815b81811015611b2057602081850181015186830182015201611b04565b81811115611b315782602083870101525b50601f01601f19169290920160200192915050565b6000828483379101908152919050565b6020808252825182820181905260009190848201906040850190845b81811015611b8e57835183529284019291840191600101611b72565b50909695505050505050565b6000841515825260606020830152611bb56060830185611afb565b9050826040830152949350505050565b600088825287602083015260c060408301528560c0830152858760e08401378060e08784010152601f19601f870116820185606084015260e0838203016080840152611c1460e0820186611afb565b9150506001600160a01b03831660a083015298975050505050505050565b6000602082526119806020830184611afb565b60008219821115611c5857611c58611d01565b500190565b600082611c7857634e487b7160e01b81526012600452602481fd5b500490565b600082821015611c8f57611c8f611d01565b500390565b600081611ca357611ca3611d01565b506000190190565b600181811c90821680611cbf57607f821691505b60208210811415611ce057634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415611cfa57611cfa611d01565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fdfea2646970667358221220f2233fa3c479dfac43a71b519542a8a0dc83f6b7f3788fccd8c715ebdd6b418264736f6c63430008030033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102325760003560e01c8063733bdef011610130578063c5958af9116100b8578063d9c51cd41161007c578063d9c51cd4146105c7578063dd62ed3e146105da578063e07c548614610613578063f25133f314610647578063fc0c546a1461065a57610232565b8063c5958af914610572578063c638407114610585578063c979fe9f1461058e578063cb82cc8f146105a1578063ce5e11bf146105b457610232565b806396426d97116100ff57806396426d9714610513578063a792765f14610522578063a9059cbb14610544578063b86d1d6314610557578063bed9d8611461056a57610232565b8063733bdef01461044357806377b03e0d146104d85780638929f4c6146104f857806395d89b411461050b57610232565b8063313ce567116101be57806360c7dc471161018257806360c7dc47146103d557806364473df2146103de57806369d43bd31461040957806370a0823114610412578063722580b61461043b57610232565b8063313ce5671461035b57806344e87f91146103705780635aa6e6751461039c5780635eaa9ced146103a2578063602bf227146103b557610232565b80631f379acc116102055780631f379acc1461029d578063217053c0146102b257806323b872dd146102fe578063248638e514610311578063294490851461033157610232565b806306fdde0314610237578063091b50ff14610255578063095ea7b31461026857806318160ddd1461028b575b600080fd5b61023f61066d565b60405161024c9190611c32565b60405180910390f35b61023f610263366004611ada565b6106ff565b61027b6102763660046119f4565b6107a4565b604051901515815260200161024c565b600d545b60405190815260200161024c565b6102b06102ab366004611ada565b6107bb565b005b6102e66102c0366004611ada565b60016020908152600092835260408084209091529082529020546001600160a01b031681565b6040516001600160a01b03909116815260200161024c565b61027b61030c3660046119b9565b610881565b61032461031f366004611a1d565b6108d3565b60405161024c9190611b56565b61034461033f366004611ada565b610936565b60408051921515835260208301919091520161024c565b60105460405160ff909116815260200161024c565b61027b61037e366004611ada565b60009182526020828152604080842092845291905290205460ff1690565b306102e6565b6102b06103b0366004611a35565b610c60565b61028f6103c3366004611a1d565b60046020526000908152604090205481565b61028f60095481565b61027b6103ec366004611ada565b600060208181529281526040808220909352908152205460ff1681565b61028f600a5481565b61028f610420366004611966565b6001600160a01b031660009081526008602052604090205490565b60095461028f565b610492610451366004611966565b6001600160a01b0316600090815260026020819052604082208054600182015492820154600383015460049093015491959394909390929190839081908190565b60408051998a5260208a0198909852968801959095526060870193909352608086019190915260a085015260c084015260e083015215156101008201526101200161024c565b61028f6104e6366004611a1d565b60009081526003602052604090205490565b6102b0610506366004611a1d565b610e9a565b61023f610f75565b61028f6706f05b59d3b2000081565b610535610530366004611ada565b610f84565b60405161024c93929190611b9a565b61027b6105523660046119f4565b611081565b6102b0610565366004611966565b61108e565b6102b06110a4565b61023f610580366004611ada565b6111b2565b61028f600b5481565b61028f61059c366004611ada565b611260565b6102b06105af366004611a1d565b611291565b61028f6105c2366004611ada565b61136f565b6102b06105d5366004611a1d565b6113dc565b61028f6105e8366004611987565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205490565b6102e6610621366004611ada565b60009182526001602090815260408084209284529190529020546001600160a01b031690565b61028f610655366004611ada565b6113f0565b600c546102e6906001600160a01b031681565b6060600e805461067c90611cab565b80601f01602080910402602001604051908101604052809291908181526020018280546106a890611cab565b80156106f55780601f106106ca576101008083540402835291602001916106f5565b820191906000526020600020905b8154815290600101906020018083116106d857829003601f168201915b5050505050905090565b60056020908152600092835260408084209091529082529020805461072390611cab565b80601f016020809104026020016040519081016040528092919081815260200182805461074f90611cab565b801561079c5780601f106107715761010080835404028352916020019161079c565b820191906000526020600020905b81548152906001019060200180831161077f57829003601f168201915b505050505081565b60006107b133848461140c565b5060015b92915050565b60408051602080820180845260008084528681526005835284812086825290925292902090516107eb92906117bb565b506000828152602081815260408083208484529091528120805460ff19166001179055600b80549161081c83611ce6565b9190505550600660008383604051602001610841929190918252602082015260400190565b60408051601f19818403018152918152815160209283012083528282019390935291016000908120600b5481546001810183559183529290912001555050565b600061088e848484611531565b6001600160a01b0384166000908152600760209081526040808320338085529252909120546108c99186916108c4908690611c7d565b61140c565b5060019392505050565b60008181526006602090815260409182902080548351818402810184019094528084526060939283018282801561092957602002820191906000526020600020905b815481526020019060010190808311610915575b505050505090505b919050565b60008281526003602052604081205481908015610c50576000808061095c600185611c7d565b9050600061096a898461136f565b905087811061098457600080965096505050505050610c59565b61098e898361136f565b905087811015610a2e575b60008981526020818152604080832084845290915290205460ff1680156109c05750600082115b156109e357816109cf81611c94565b9250506109dc898361136f565b9050610999565b81158015610a08575060008981526020818152604080832084845290915290205460ff165b15610a1e57600080965096505050505050610c59565b50600195509350610c5992505050565b826002610a3b8285611c7d565b610a459190611c5d565b610a50906001611c45565b610a5a9190611c45565b9350610a66898561136f565b905087811015610b66576000610a818a6105c2876001611c45565b9050888110610b535760008a81526020818152604080832085845290915290205460ff16610abb5760018597509750505050505050610c59565b60008a81526020818152604080832085845290915290205460ff168015610ae25750600085115b15610b055784610af181611c94565b955050610afe8a8661136f565b9150610abb565b84158015610b2a575060008a81526020818152604080832085845290915290205460ff165b15610b415760008097509750505050505050610c59565b60018597509750505050505050610c59565b610b5e856001611c45565b935050610c4b565b6000610b778a6105c2600188611c7d565b905088811015610c3c5760008a81526020818152604080832084845290915290205460ff16610bbb576001610bac8187611c7d565b97509750505050505050610c59565b84610bc581611c94565b9550505b60008a81526020818152604080832084845290915290205460ff168015610bf05750600085115b15610c135784610bff81611c94565b955050610c0c8a8661136f565b9050610bc9565b84158015610b2a575060008a81526020818152604080832084845290915290205460ff16610b2a565b610c47600186611c7d565b9250505b610a2e565b60008092509250505b9250929050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708484604051610c91929190611b46565b60405180910390201415610cec5760405162461bcd60e51b815260206004820152601760248201527f76616c7565206d757374206265207375626d697474656400000000000000000060448201526064015b60405180910390fd5b600085815260036020526040902054821480610d06575081155b610d525760405162461bcd60e51b815260206004820181905260248201527f6e6f6e6365206d757374206d617463682074696d657374616d7020696e6465786044820152606401610ce3565b80516020820120851480610d67575060648511155b610db35760405162461bcd60e51b815260206004820152601d60248201527f6964206d7573742062652068617368206f6620627974657320646174610000006044820152606401610ce3565b60008581526005602090815260408083204284529091529020610dd790858561183f565b5060008581526003602081815260408084208054600181810183559186528386204291018190558a86529083528185208186528352818520805473ffffffffffffffffffffffffffffffffffffffff19163390811790915585526002909252832091820155600401805491610e4b83611ce6565b91905055507f48e9e2c732ba278de6ac88a3a57a5c5ba13d3d8370e709b3b98333a57876ca9585428686868633604051610e8b9796959493929190611bc5565b60405180910390a15050505050565b3360009081526002602052604090206001810154821115610efd5760405162461bcd60e51b815260206004820152601b60248201527f696e73756666696369656e74207374616b65642062616c616e636500000000006044820152606401610ce3565b428155600281018054839190600090610f17908490611c45565b9250508190555081816001016000828254610f329190611c7d565b909155505060408051338152602081018490527f3d8d9df4bd0172df32e557fa48e96435cd7f2cac06aaffacfaee608e6f7898ef91015b60405180910390a15050565b6060600f805461067c90611cab565b600060606000806000610f978787610936565b9150915081610fc1576000604051806020016040528060008152506000945094509450505061107a565b610fcb878261136f565b60008881526005602090815260408083208484529091529020805491945090610ff390611cab565b80601f016020809104026020016040519081016040528092919081815260200182805461101f90611cab565b801561106c5780601f106110415761010080835404028352916020019161106c565b820191906000526020600020905b81548152906001019060200180831161104f57829003601f168201915b505050505093506001945050505b9250925092565b60006107b1338484611531565b6110a181683635c9adc5dea00000611698565b50565b336000908152600260205260409020805462093a80906110c49042611c7d565b10156111075760405162461bcd60e51b8152602060048201526012602482015271372064617973206469646e2774207061737360701b6044820152606401610ce3565b60008160020154116111665760405162461bcd60e51b815260206004820152602260248201527f7265706f72746572206e6f74206c6f636b656420666f72207769746864726177604482015261185b60f21b6064820152608401610ce3565b61117530338360020154611531565b600060028201556040513381527f4a7934670bd8304e7da22378be1368f7c4fef17c5aee81804beda8638fe428ec9060200160405180910390a150565b600082815260056020908152604080832084845290915290208054606091906111da90611cab565b80601f016020809104026020016040519081016040528092919081815260200182805461120690611cab565b80156112535780601f1061122857610100808354040283529160200191611253565b820191906000526020600020905b81548152906001019060200180831161123657829003601f168201915b5050505050905092915050565b6006602052816000526040600020818154811061127c57600080fd5b90600052602060002001600091509150505481565b336000908152600260208190526040909120908101541561130657818160020154106112d657818160020160008282546112cb9190611c7d565b909155506113019050565b6112f033308360020154856112eb9190611c7d565b611777565b6112f957600080fd5b600060028201555b61131a565b611311333084611777565b61131a57600080fd5b428155600181018054839190600090611334908490611c45565b909155505060408051338152602081018490527fa96c2cce65119a2170d1711a6e82f18f2006448828483ba7545e5954765436479101610f69565b60008281526003602052604081205480158061138b5750828111155b1561139a5760009150506107b5565b60008481526003602052604090208054849081106113c857634e487b7160e01b600052603260045260246000fd5b906000526020600020015491505092915050565b6113e7333083611777565b6110a157600080fd5b6003602052816000526040600020818154811061127c57600080fd5b6001600160a01b03831661146e5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610ce3565b6001600160a01b0382166114cf5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610ce3565b6001600160a01b0383811660008181526007602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0383166115955760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610ce3565b6001600160a01b0382166115f75760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610ce3565b6001600160a01b0383166000908152600860205260408120805483929061161f908490611c7d565b90915550506001600160a01b0382166000908152600860205260408120805483929061164c908490611c45565b92505081905550816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161152491815260200190565b6001600160a01b0382166116ee5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610ce3565b80600d60008282546117009190611c45565b90915550506001600160a01b0382166000908152600860205260408120805483929061172d908490611c45565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6000611784848484611531565b6001600160a01b03841660009081526007602090815260408083203084529091529020546108c990859033906108c4908690611c7d565b8280546117c790611cab565b90600052602060002090601f0160209004810192826117e9576000855561182f565b82601f1061180257805160ff191683800117855561182f565b8280016001018555821561182f579182015b8281111561182f578251825591602001919060010190611814565b5061183b9291506118b3565b5090565b82805461184b90611cab565b90600052602060002090601f01602090048101928261186d576000855561182f565b82601f106118865782800160ff1982351617855561182f565b8280016001018555821561182f579182015b8281111561182f578235825591602001919060010190611898565b5b8082111561183b57600081556001016118b4565b80356001600160a01b038116811461093157600080fd5b600082601f8301126118ef578081fd5b813567ffffffffffffffff8082111561190a5761190a611d17565b604051601f8301601f19908116603f0116810190828211818310171561193257611932611d17565b8160405283815286602085880101111561194a578485fd5b8360208701602083013792830160200193909352509392505050565b600060208284031215611977578081fd5b611980826118c8565b9392505050565b60008060408385031215611999578081fd5b6119a2836118c8565b91506119b0602084016118c8565b90509250929050565b6000806000606084860312156119cd578081fd5b6119d6846118c8565b92506119e4602085016118c8565b9150604084013590509250925092565b60008060408385031215611a06578182fd5b611a0f836118c8565b946020939093013593505050565b600060208284031215611a2e578081fd5b5035919050565b600080600080600060808688031215611a4c578081fd5b85359450602086013567ffffffffffffffff80821115611a6a578283fd5b818801915088601f830112611a7d578283fd5b813581811115611a8b578384fd5b896020828501011115611a9c578384fd5b60208301965080955050604088013593506060880135915080821115611ac0578283fd5b50611acd888289016118df565b9150509295509295909350565b60008060408385031215611aec578182fd5b50508035926020909101359150565b60008151808452815b81811015611b2057602081850181015186830182015201611b04565b81811115611b315782602083870101525b50601f01601f19169290920160200192915050565b6000828483379101908152919050565b6020808252825182820181905260009190848201906040850190845b81811015611b8e57835183529284019291840191600101611b72565b50909695505050505050565b6000841515825260606020830152611bb56060830185611afb565b9050826040830152949350505050565b600088825287602083015260c060408301528560c0830152858760e08401378060e08784010152601f19601f870116820185606084015260e0838203016080840152611c1460e0820186611afb565b9150506001600160a01b03831660a083015298975050505050505050565b6000602082526119806020830184611afb565b60008219821115611c5857611c58611d01565b500190565b600082611c7857634e487b7160e01b81526012600452602481fd5b500490565b600082821015611c8f57611c8f611d01565b500390565b600081611ca357611ca3611d01565b506000190190565b600181811c90821680611cbf57607f821691505b60208210811415611ce057634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415611cfa57611cfa611d01565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fdfea2646970667358221220f2233fa3c479dfac43a71b519542a8a0dc83f6b7f3788fccd8c715ebdd6b418264736f6c63430008030033
Deployed ByteCode Sourcemap
60:23400:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19529:85;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1121:59;;;;;;:::i;:::-;;:::i;3122:155::-;;;;;;:::i;:::-;;:::i;:::-;;;6038:14:1;;6031:22;6013:41;;6001:2;5986:18;3122:155:0;5968:92:1;20373:93:0;20446:12;;20373:93;;;12343:25:1;;;12331:2;12316:18;20373:93:0;12298:76:1;3472:312:0;;;;;;:::i;:::-;;:::i;:::-;;775:74;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;775:74:0;;;;;;-1:-1:-1;;;;;4864:55:1;;;4846:74;;4834:2;4819:18;775:74:0;4801:125:1;7779:346:0;;;;;;:::i;:::-;;:::i;18673:119::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;11115:4380::-;;;;;;:::i;:::-;;:::i;:::-;;;;6632:14:1;;6625:22;6607:41;;6679:2;6664:18;;6657:34;;;;6580:18;11115:4380:0;6562:135:1;9557:85:0;9625:9;;9557:85;;9625:9;;;;13287:36:1;;13275:2;13260:18;9557:85:0;13242:87:1;19242:176:0;;;;;;:::i;:::-;19349:4;19378:20;;;;;;;;;;;:32;;;;;;;;;;;;19242:176;18917:93;18997:4;18917:93;;6021:1028;;;;;;:::i;:::-;;:::i;1015:39::-;;;;;;:::i;:::-;;;;;;;;;;;;;;1465:26;;;;;;674:62;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;1623:29;;;;;;9259:114;;;;;;:::i;:::-;-1:-1:-1;;;;;9346:19:0;9319:7;9346:19;;;:9;:19;;;;;;;9259:114;16438:95;16514:11;;16438:95;;17218:723;;;;;;:::i;:::-;-1:-1:-1;;;;;17565:29:0;17329:7;17565:29;;;:13;:29;;;;;;;17627:17;;17659:21;;;;17695;;;;17762:29;;;;17806:24;;;;;17627:17;;17659:21;;17695;;17329:7;;17762:29;17806:24;17329:7;;;;;;17218:723;;;;;12744:25:1;;;12800:2;12785:18;;12778:34;;;;12828:18;;;12821:34;;;;12886:2;12871:18;;12864:34;;;;12929:3;12914:19;;12907:35;;;;12973:3;12958:19;;12951:35;13017:3;13002:19;;12995:35;13061:3;13046:19;;13039:35;13118:14;13111:22;13105:3;13090:19;;13083:51;12731:3;12716:19;17218:723:0;12698:442:1;15723:168:0;;;;;;:::i;:::-;15824:7;15856:20;;;:10;:20;;;;;:27;;15723:168;5173:441;;;;;;:::i;:::-;;:::i;20160:89::-;;;:::i;1498:46::-;;1540:4;1498:46;;10061:607;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;7303:183::-;;;;;;:::i;:::-;;:::i;4928:83::-;;;;;;:::i;:::-;;:::i;8193:469::-;;;:::i;19862:183::-;;;;;;:::i;:::-;;:::i;1697:24::-;;;;;;1219:47;;;;;;:::i;:::-;;:::i;3906:868::-;;;;;;:::i;:::-;;:::i;18170:294::-;;;;;;:::i;:::-;;:::i;2668:130::-;;;;;;:::i;:::-;;:::i;8962:139::-;;;;;;:::i;:::-;-1:-1:-1;;;;;9064:19:0;;;9038:7;9064:19;;;:11;:19;;;;;;;;:29;;;;;;;;;;;;;8962:139;16135:201;;;;;;:::i;:::-;16255:7;16287:29;;;:19;:29;;;;;;;;:41;;;;;;;;;-1:-1:-1;;;;;16287:41:0;;16135:201;961:47;;;;;;:::i;:::-;;:::i;1728:20::-;;;;;-1:-1:-1;;;;;1728:20:0;;;19529:85;19568:13;19601:5;19594:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19529:85;:::o;1121:59::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3122:155::-;3192:4;3208:39;3217:10;3229:8;3239:7;3208:8;:39::i;:::-;-1:-1:-1;3265:4:0;3122:155;;;;;:::o;3472:312::-;3583:9;;;;;;;;;;-1:-1:-1;3583:9:0;;;3552:16;;;:6;:16;;;;;:28;;;;;;;;;:40;;;;3583:9;3552:40;:::i;:::-;-1:-1:-1;3603:10:0;:20;;;;;;;;;;;:32;;;;;;;;:39;;-1:-1:-1;;3603:39:0;3638:4;3603:39;;;3653:9;:11;;;;;;:::i;:::-;;;;;;3675:10;:61;3713:8;3723:10;3696:38;;;;;;;;4327:19:1;;;4371:2;4362:12;;4355:28;4408:2;4399:12;;4317:100;3696:38:0;;;;-1:-1:-1;;3696:38:0;;;;;;;;;3686:49;;3696:38;3686:49;;;;3675:61;;;;;;;;;;;-1:-1:-1;3675:61:0;;;3756:9;;3675:101;;;;;;;;;;;;;;;;-1:-1:-1;;3472:312:0:o;7779:346::-;7905:4;7922:39;7932:7;7941:10;7953:7;7922:9;:39::i;:::-;-1:-1:-1;;;;;8042:20:0;;;;;;:11;:20;;;;;;;;8017:10;8042:32;;;;;;;;;7972:123;;7995:7;;8042:42;;8077:7;;8042:42;:::i;:::-;7972:8;:123::i;:::-;-1:-1:-1;8113:4:0;7779:346;;;;;:::o;18673:119::-;18767:17;;;;:10;:17;;;;;;;;;18760:24;;;;;;;;;;;;;;;;;18732:16;;18760:24;;;18767:17;18760:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18673:119;;;;:::o;11115:4380::-;11232:11;15856:20;;;:10;:20;;;;;:27;11232:11;;11344:10;;11340:4120;;11371:15;;;11449:10;11458:1;11449:6;:10;:::i;:::-;11434:25;;11474:13;11576:47;11606:8;11616:6;11576:29;:47::i;:::-;11568:55;;11651:10;11642:5;:19;11638:42;;11671:5;11678:1;11663:17;;;;;;;;;;;11638:42;11703:45;11733:8;11743:4;11703:29;:45::i;:::-;11695:53;;11775:10;11767:5;:18;11763:395;;;11806:174;19349:4;19378:20;;;;;;;;;;;:32;;;;;;;;;;;11813:40;;;;;11852:1;11845:4;:8;11813:40;11806:174;;;11878:6;;;;:::i;:::-;;;;11915:45;11945:8;11955:4;11915:29;:45::i;:::-;11907:53;;11806:174;;;12002:9;;:41;;;;-1:-1:-1;19349:4:0;19378:20;;;;;;;;;;;:32;;;;;;;;;;;12015:28;11998:107;;;12076:5;12083:1;12068:17;;;;;;;;;;;11998:107;-1:-1:-1;12131:4:0;;-1:-1:-1;12137:4:0;-1:-1:-1;12123:19:0;;-1:-1:-1;;;12123:19:0;11763:395;12316:6;12308:1;12291:13;12316:6;12291:4;:13;:::i;:::-;12290:19;;;;:::i;:::-;:23;;12312:1;12290:23;:::i;:::-;:32;;;;:::i;:::-;12280:42;;12349:48;12379:8;12389:7;12349:29;:48::i;:::-;12341:56;;12428:10;12420:5;:18;12416:3018;;;12511:17;12531:125;12587:8;12622:11;:7;12632:1;12622:11;:::i;12531:125::-;12511:145;;12696:10;12683:9;:23;12679:1195;;19349:4;19378:20;;;;;;;;;;;:32;;;;;;;;;;;12735:972;;12858:4;12864:7;12850:22;;;;;;;;;;;;12735:972;19349:4;19378:20;;;;;;;;;;;:32;;;;;;;;;;;13063:43;;;;;13105:1;13095:7;:11;13063:43;13022:392;;;13173:9;;;;:::i;:::-;;;;13225:157;13293:8;13340:7;13225:29;:157::i;:::-;13217:165;;13022:392;;;13448:12;;:44;;;;-1:-1:-1;19349:4:0;19378:20;;;;;;;;;;;:32;;;;;;;;;;;13464:28;13444:134;;;13537:5;13544:1;13529:17;;;;;;;;;;;;13444:134;13665:4;13671:7;13657:22;;;;;;;;;;;;12679:1195;13839:11;:7;13849:1;13839:11;:::i;:::-;13830:20;;12416:3018;;;;13922:17;13942:125;13998:8;14033:11;14043:1;14033:7;:11;:::i;13942:125::-;13922:145;;14106:10;14094:9;:22;14090:1325;;;19349:4;19378:20;;;;;;;;;;;:32;;;;;;;;;;;14145:1104;;14276:4;14282:11;14276:4;14282:7;:11;:::i;:::-;14268:26;;;;;;;;;;;;14145:1104;14444:9;;;;:::i;:::-;;;;14484:400;19349:4;19378:20;;;;;;;;;;;:32;;;;;;;;;;;14525:47;;;;;14571:1;14561:7;:11;14525:47;14484:400;;;14639:9;;;;:::i;:::-;;;;14695:157;14763:8;14810:7;14695:29;:157::i;:::-;14683:169;;14484:400;;;14952:12;;:48;;;;-1:-1:-1;19349:4:0;19378:20;;;;;;;;;;;:32;;;;;;;;;;;14968;19242:176;14090:1325;15380:11;15390:1;15380:7;:11;:::i;:::-;15373:18;;12416:3018;;12248:3201;;11340:4120;15478:5;15485:1;15470:17;;;;;11115:4380;;;;;;:::o;6021:1028::-;6216:13;6205:6;;6195:17;;;;;;;:::i;:::-;;;;;;;;:34;;6187:70;;;;-1:-1:-1;;;6187:70:0;;9756:2:1;6187:70:0;;;9738:21:1;9795:2;9775:18;;;9768:30;9834:25;9814:18;;;9807:53;9877:18;;6187:70:0;;;;;;;;;6300:20;;;;:10;:20;;;;;:27;6290:37;;;:52;;-1:-1:-1;6331:11:0;;6290:52;6268:134;;;;-1:-1:-1;;;6268:134:0;;10108:2:1;6268:134:0;;;10090:21:1;;;10127:18;;;10120:30;10186:34;10166:18;;;10159:62;10238:18;;6268:134:0;10080:182:1;6268:134:0;6447:21;;;;;;6435:33;;;:61;;-1:-1:-1;6493:3:0;6472:24;;;6435:61;6413:140;;;;-1:-1:-1;;;6413:140:0;;9051:2:1;6413:140:0;;;9033:21:1;9090:2;9070:18;;;9063:30;9129:31;9109:18;;;9102:59;9178:18;;6413:140:0;9023:179:1;6413:140:0;6564:16;;;;:6;:16;;;;;;;;6581:15;6564:33;;;;;;;:42;;6600:6;;6564:42;:::i;:::-;-1:-1:-1;6617:20:0;;;;:10;:20;;;;;;;;:42;;;;;;;;;;;;;;6643:15;6617:42;;;;;6670:29;;;;;;;;;:46;;;;;;;;:59;;-1:-1:-1;;6670:59:0;6719:10;6670:59;;;;;;6740:25;;:13;:25;;;;;:47;;;:65;6816:42;;:44;;;;;;:::i;:::-;;;;;;6876:165;6900:8;6923:15;6953:6;;6974;6995:10;7020;6876:165;;;;;;;;;;;;:::i;:::-;;;;;;;;6021:1028;;;;;:::o;5173:441::-;5284:10;5242:25;5270;;;:13;:25;;;;;5328:21;;;;:32;-1:-1:-1;5328:32:0;5306:109;;;;-1:-1:-1;;;5306:109:0;;11683:2:1;5306:109:0;;;11665:21:1;11722:2;11702:18;;;11695:30;11761:29;11741:18;;;11734:57;11808:18;;5306:109:0;11655:177:1;5306:109:0;5446:15;5426:35;;5472:21;;;:32;;5497:7;;5472:21;5426:17;;5472:32;;5497:7;;5472:32;:::i;:::-;;;;;;;;5540:7;5515;:21;;;:32;;;;;;;:::i;:::-;;;;-1:-1:-1;;5563:43:0;;;5586:10;5105:74:1;;5210:2;5195:18;;5188:34;;;5563:43:0;;5078:18:1;5563:43:0;;;;;;;;5173:441;;:::o;20160:89::-;20201:13;20234:7;20227:14;;;;;:::i;10061:607::-;10186:16;10217:19;10251:27;10307:11;10320:14;10338:80;10374:8;10397:10;10338:21;:80::i;:::-;10306:112;;;;10434:6;10429:41;;10450:5;10457:9;;;;;;;;;;;;10468:1;10442:28;;;;;;;;;;10429:41;10503:47;10533:8;10543:6;10503:29;:47::i;:::-;10570:16;;;;:6;:16;;;;;;;;:37;;;;;;;;10561:46;;10481:69;;-1:-1:-1;10570:37:0;10561:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10626:4;10618:42;;;;10061:607;;;;;;:::o;7303:183::-;7392:4;7414:42;7424:10;7436;7448:7;7414:9;:42::i;4928:83::-;4979:24;4985:5;4992:10;4979:5;:24::i;:::-;4928:83;:::o;8193:469::-;8275:10;8238:20;8261:25;;;:13;:25;;;;;8393:12;;8409:6;;8375:30;;:15;:30;:::i;:::-;:40;;8367:71;;;;-1:-1:-1;;;8367:71:0;;9409:2:1;8367:71:0;;;9391:21:1;9448:2;9428:18;;;9421:30;-1:-1:-1;;;9467:18:1;;;9460:48;9525:18;;8367:71:0;9381:168:1;8367:71:0;8476:1;8457:2;:16;;;:20;8449:67;;;;-1:-1:-1;;;8449:67:0;;10875:2:1;8449:67:0;;;10857:21:1;10914:2;10894:18;;;10887:30;10953:34;10933:18;;;10926:62;-1:-1:-1;;;11004:18:1;;;10997:32;11046:19;;8449:67:0;10847:224:1;8449:67:0;8527:54;8545:4;8552:10;8564:2;:16;;;8527:9;:54::i;:::-;8611:1;8592:16;;;:20;8628:26;;8643:10;4846:74:1;;8628:26:0;;4834:2:1;4819:18;8628:26:0;;;;;;;8193:469;:::o;19862:183::-;20009:16;;;;:6;:16;;;;;;;;:28;;;;;;;;20002:35;;19972:12;;20009:28;20002:35;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19862:183;;;;:::o;1219:47::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3906:868::-;4007:10;3965:25;3993;;;:13;:25;;;;;;;;4033:21;;;;:25;4029:558;;4104:7;4079;:21;;;:32;4075:410;;4157:7;4132;:21;;;:32;;;;;;;:::i;:::-;;;;-1:-1:-1;4075:410:0;;-1:-1:-1;4075:410:0;;4235:171;4275:10;4320:4;4362:7;:21;;;4352:7;:31;;;;:::i;:::-;4235:13;:171::i;:::-;4205:220;;;;;;4468:1;4444:21;;;:25;4075:410;4029:558;;;4525:49;4539:10;4559:4;4566:7;4525:13;:49::i;:::-;4517:58;;;;;;4617:15;4597:35;;4688:21;;;:32;;4713:7;;4688:21;4597:17;;4688:32;;4713:7;;4688:32;:::i;:::-;;;;-1:-1:-1;;4736:30:0;;;4746:10;5105:74:1;;5210:2;5195:18;;5188:34;;;4736:30:0;;5078:18:1;4736:30:0;5060:168:1;18170:294:0;18291:7;18331:20;;;:10;:20;;;;;:27;18373:9;;;:27;;;18394:6;18386:4;:14;;18373:27;18369:41;;;18409:1;18402:8;;;;;18369:41;18428:20;;;;:10;:20;;;;;:28;;18449:6;;18428:28;;;;-1:-1:-1;;;18428:28:0;;;;;;;;;;;;;;;;;18421:35;;;18170:294;;;;:::o;2668:130::-;2740:49;2754:10;2774:4;2781:7;2740:13;:49::i;:::-;2732:58;;;;;961:47;;;;;;;;;;;;;;;;;;;;20777:381;-1:-1:-1;;;;;20908:20:0;;20900:69;;;;-1:-1:-1;;;20900:69:0;;11278:2:1;20900:69:0;;;11260:21:1;11317:2;11297:18;;;11290:30;11356:34;11336:18;;;11329:62;-1:-1:-1;;;11407:18:1;;;11400:34;11451:19;;20900:69:0;11250:226:1;20900:69:0;-1:-1:-1;;;;;20988:22:0;;20980:69;;;;-1:-1:-1;;;20980:69:0;;8648:2:1;20980:69:0;;;8630:21:1;8687:2;8667:18;;;8660:30;8726:34;8706:18;;;8699:62;-1:-1:-1;;;8777:18:1;;;8770:32;8819:19;;20980:69:0;8620:224:1;20980:69:0;-1:-1:-1;;;;;21060:19:0;;;;;;;:11;:19;;;;;;;;:29;;;;;;;;;;;;;:39;;;21115:35;;12343:25:1;;;21115:35:0;;12316:18:1;21115:35:0;;;;;;;;20777:381;;;:::o;22359:425::-;-1:-1:-1;;;;;22493:21:0;;22485:71;;;;-1:-1:-1;;;22485:71:0;;10469:2:1;22485:71:0;;;10451:21:1;10508:2;10488:18;;;10481:30;10547:34;10527:18;;;10520:62;-1:-1:-1;;;10598:18:1;;;10591:35;10643:19;;22485:71:0;10441:227:1;22485:71:0;-1:-1:-1;;;;;22576:24:0;;22567:72;;;;-1:-1:-1;;;22567:72:0;;8244:2:1;22567:72:0;;;8226:21:1;8283:2;8263:18;;;8256:30;8322:34;8302:18;;;8295:62;-1:-1:-1;;;8373:18:1;;;8366:33;8416:19;;22567:72:0;8216:225:1;22567:72:0;-1:-1:-1;;;;;22650:18:0;;;;;;:9;:18;;;;;:29;;22672:7;;22650:18;:29;;22672:7;;22650:29;:::i;:::-;;;;-1:-1:-1;;;;;;;22690:21:0;;;;;;:9;:21;;;;;:32;;22715:7;;22690:21;:32;;22715:7;;22690:32;:::i;:::-;;;;;;;;22756:10;-1:-1:-1;;;;;22738:38:0;22747:7;-1:-1:-1;;;;;22738:38:0;;22768:7;22738:38;;;;12343:25:1;;12331:2;12316:18;;12298:76;21838:273:0;-1:-1:-1;;;;;21915:22:0;;21907:66;;;;-1:-1:-1;;;21907:66:0;;12039:2:1;21907:66:0;;;12021:21:1;12078:2;12058:18;;;12051:30;12117:33;12097:18;;;12090:61;12168:18;;21907:66:0;12011:181:1;21907:66:0;22000:7;21984:12;;:23;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;22018:19:0;;;;;;:9;:19;;;;;:30;;22041:7;;22018:19;:30;;22041:7;;22018:30;:::i;:::-;;;;-1:-1:-1;;22064:39:0;;12343:25:1;;;-1:-1:-1;;;;;22064:39:0;;;22081:1;;22064:39;;12331:2:1;12316:18;22064:39:0;;;;;;;21838:273;;:::o;23105:352::-;23234:4;23251:39;23261:7;23270:10;23282:7;23251:9;:39::i;:::-;-1:-1:-1;;;;;23371:20:0;;;;;;:11;:20;;;;;;;;23400:4;23371:35;;;;;;;;23301:126;;23324:7;;23346:10;;23371:45;;23409:7;;23371:45;:::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:196:1;82:20;;-1:-1:-1;;;;;131:54:1;;121:65;;111:2;;200:1;197;190:12;215:738;;310:3;303:4;295:6;291:17;287:27;277:2;;332:5;325;318:20;277:2;372:6;359:20;398:18;435:2;431;428:10;425:2;;;441:18;;:::i;:::-;516:2;510:9;484:2;570:13;;-1:-1:-1;;566:22:1;;;590:2;562:31;558:40;546:53;;;614:18;;;634:22;;;611:46;608:2;;;660:18;;:::i;:::-;700:10;696:2;689:22;735:2;727:6;720:18;781:3;774:4;769:2;761:6;757:15;753:26;750:35;747:2;;;802:5;795;788:20;747:2;870;863:4;855:6;851:17;844:4;836:6;832:17;819:54;893:15;;;910:4;889:26;882:41;;;;-1:-1:-1;897:6:1;267:686;-1:-1:-1;;;267:686:1:o;958:196::-;;1070:2;1058:9;1049:7;1045:23;1041:32;1038:2;;;1091:6;1083;1076:22;1038:2;1119:29;1138:9;1119:29;:::i;:::-;1109:39;1028:126;-1:-1:-1;;;1028:126:1:o;1159:270::-;;;1288:2;1276:9;1267:7;1263:23;1259:32;1256:2;;;1309:6;1301;1294:22;1256:2;1337:29;1356:9;1337:29;:::i;:::-;1327:39;;1385:38;1419:2;1408:9;1404:18;1385:38;:::i;:::-;1375:48;;1246:183;;;;;:::o;1434:338::-;;;;1580:2;1568:9;1559:7;1555:23;1551:32;1548:2;;;1601:6;1593;1586:22;1548:2;1629:29;1648:9;1629:29;:::i;:::-;1619:39;;1677:38;1711:2;1700:9;1696:18;1677:38;:::i;:::-;1667:48;;1762:2;1751:9;1747:18;1734:32;1724:42;;1538:234;;;;;:::o;1777:264::-;;;1906:2;1894:9;1885:7;1881:23;1877:32;1874:2;;;1927:6;1919;1912:22;1874:2;1955:29;1974:9;1955:29;:::i;:::-;1945:39;2031:2;2016:18;;;;2003:32;;-1:-1:-1;;;1864:177:1:o;2046:190::-;;2158:2;2146:9;2137:7;2133:23;2129:32;2126:2;;;2179:6;2171;2164:22;2126:2;-1:-1:-1;2207:23:1;;2116:120;-1:-1:-1;2116:120:1:o;2241:986::-;;;;;;2432:3;2420:9;2411:7;2407:23;2403:33;2400:2;;;2454:6;2446;2439:22;2400:2;2495:9;2482:23;2472:33;;2556:2;2545:9;2541:18;2528:32;2579:18;2620:2;2612:6;2609:14;2606:2;;;2641:6;2633;2626:22;2606:2;2684:6;2673:9;2669:22;2659:32;;2729:7;2722:4;2718:2;2714:13;2710:27;2700:2;;2756:6;2748;2741:22;2700:2;2801;2788:16;2827:2;2819:6;2816:14;2813:2;;;2848:6;2840;2833:22;2813:2;2898:7;2893:2;2884:6;2880:2;2876:15;2872:24;2869:37;2866:2;;;2924:6;2916;2909:22;2866:2;2960;2956;2952:11;2942:21;;2982:6;2972:16;;;3035:2;3024:9;3020:18;3007:32;2997:42;;3092:2;3081:9;3077:18;3064:32;3048:48;;3121:2;3111:8;3108:16;3105:2;;;3142:6;3134;3127:22;3105:2;;3170:51;3213:7;3202:8;3191:9;3187:24;3170:51;:::i;:::-;3160:61;;;2390:837;;;;;;;;:::o;3232:258::-;;;3361:2;3349:9;3340:7;3336:23;3332:32;3329:2;;;3382:6;3374;3367:22;3329:2;-1:-1:-1;;3410:23:1;;;3480:2;3465:18;;;3452:32;;-1:-1:-1;3319:171:1:o;3690:475::-;;3769:5;3763:12;3796:6;3791:3;3784:19;3821:3;3833:162;3847:6;3844:1;3841:13;3833:162;;;3909:4;3965:13;;;3961:22;;3955:29;3937:11;;;3933:20;;3926:59;3862:12;3833:162;;;4013:6;4010:1;4007:13;4004:2;;;4079:3;4072:4;4063:6;4058:3;4054:16;4050:27;4043:40;4004:2;-1:-1:-1;4147:2:1;4126:15;-1:-1:-1;;4122:29:1;4113:39;;;;4154:4;4109:50;;3739:426;-1:-1:-1;;3739:426:1:o;4422:273::-;;4605:6;4597;4592:3;4579:33;4631:16;;4656:15;;;4631:16;4569:126;-1:-1:-1;4569:126:1:o;5233:635::-;5404:2;5456:21;;;5526:13;;5429:18;;;5548:22;;;5233:635;;5404:2;5627:15;;;;5601:2;5586:18;;;5233:635;5673:169;5687:6;5684:1;5681:13;5673:169;;;5748:13;;5736:26;;5817:15;;;;5782:12;;;;5709:1;5702:9;5673:169;;;-1:-1:-1;5859:3:1;;5384:484;-1:-1:-1;;;;;;5384:484:1:o;6065:369::-;;6276:6;6269:14;6262:22;6251:9;6244:41;6321:2;6316;6305:9;6301:18;6294:30;6341:44;6381:2;6370:9;6366:18;6358:6;6341:44;:::i;:::-;6333:52;;6421:6;6416:2;6405:9;6401:18;6394:34;6234:200;;;;;;:::o;6702:889::-;;7017:6;7006:9;6999:25;7060:6;7055:2;7044:9;7040:18;7033:34;7103:3;7098:2;7087:9;7083:18;7076:31;7144:6;7138:3;7127:9;7123:19;7116:35;7202:6;7194;7188:3;7177:9;7173:19;7160:49;7259:4;7253:3;7244:6;7233:9;7229:22;7225:32;7218:46;7323:2;7319:7;7314:2;7306:6;7302:15;7298:29;7287:9;7283:45;7364:6;7359:2;7348:9;7344:18;7337:34;7432:3;7420:9;7416:2;7412:18;7408:28;7402:3;7391:9;7387:19;7380:57;7454:38;7487:3;7483:2;7479:12;7471:6;7454:38;:::i;:::-;7446:46;;;-1:-1:-1;;;;;7533:6:1;7529:55;7523:3;7512:9;7508:19;7501:84;6989:602;;;;;;;;;;:::o;7596:217::-;;7743:2;7732:9;7725:21;7763:44;7803:2;7792:9;7788:18;7780:6;7763:44;:::i;13334:128::-;;13405:1;13401:6;13398:1;13395:13;13392:2;;;13411:18;;:::i;:::-;-1:-1:-1;13447:9:1;;13382:80::o;13467:217::-;;13533:1;13523:2;;-1:-1:-1;;;13558:31:1;;13612:4;13609:1;13602:15;13640:4;13565:1;13630:15;13523:2;-1:-1:-1;13669:9:1;;13513:171::o;13689:125::-;;13757:1;13754;13751:8;13748:2;;;13762:18;;:::i;:::-;-1:-1:-1;13799:9:1;;13738:76::o;13819:136::-;;13886:5;13876:2;;13895:18;;:::i;:::-;-1:-1:-1;;;13931:18:1;;13866:89::o;13960:380::-;14039:1;14035:12;;;;14082;;;14103:2;;14157:4;14149:6;14145:17;14135:27;;14103:2;14210;14202:6;14199:14;14179:18;14176:38;14173:2;;;14256:10;14251:3;14247:20;14244:1;14237:31;14291:4;14288:1;14281:15;14319:4;14316:1;14309:15;14173:2;;14015:325;;;:::o;14345:135::-;;-1:-1:-1;;14405:17:1;;14402:2;;;14425:18;;:::i;:::-;-1:-1:-1;14472:1:1;14461:13;;14392:88::o;14485:127::-;14546:10;14541:3;14537:20;14534:1;14527:31;14577:4;14574:1;14567:15;14601:4;14598:1;14591:15;14617:127;14678:10;14673:3;14669:20;14666:1;14659:31;14709:4;14706:1;14699:15;14733:4;14730:1;14723:15
Swarm Source
ipfs://f2233fa3c479dfac43a71b519542a8a0dc83f6b7f3788fccd8c715ebdd6b4182