Source Code
Overview
ETH Balance
0 ETH
More Info
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x60a06040 | 488012 | 172 days ago | IN | 0 ETH | 0.00524695 |
Loading...
Loading
Similar Match Source Code This contract matches the deployed Bytecode of the Source Code for Contract 0x16d623f2...3fdA14249 The constructor portion of the code might be different and could alter the actual behaviour of the contract
Contract Name:
Governance
Compiler Version
v0.8.3+commit.8d00100c
Contract Source Code (Solidity)
/** *Submitted for verification at sepolia.lineascan.build/ on 2024-04-12 */ // SPDX-License-Identifier: MIT pragma solidity 0.8.3; /** @author Tellor Inc. @title TellorFlex @dev This is a streamlined Tellor oracle system which handles staking, reporting, * slashing, and user data getters in one contract. This contract is controlled * by a single address known as 'governance', which could be an externally owned * account or a contract, allowing for a flexible, modular design. */ interface IOracle { /** * @dev Removes a value from the oracle. * Note: this function is only callable by the Governance contract. * @param _queryId is ID of the specific data feed * @param _timestamp is the timestamp of the data value to remove */ function removeValue(bytes32 _queryId, uint256 _timestamp) external; /** * @dev Slashes a reporter and transfers their stake amount to the given recipient * Note: this function is only callable by the governance address. * @param _reporter is the address of the reporter being slashed * @param _recipient is the address receiving the reporter's stake * @return uint256 amount of token slashed and sent to recipient address */ function slashReporter(address _reporter, address _recipient) external returns (uint256); // ***************************************************************************** // * * // * Getters * // * * // ***************************************************************************** /** * @dev Returns the block number at a given timestamp * @param _queryId is ID of the specific data feed * @param _timestamp is the timestamp to find the corresponding block number for * @return uint256 block number of the timestamp for the given data ID */ function getBlockNumberByTimestamp(bytes32 _queryId, uint256 _timestamp) external view returns (uint256); /** * @dev Returns the address of the reporter who submitted a value for a data ID at a specific time * @param _queryId is ID of the specific data feed * @param _timestamp is the timestamp to find a corresponding reporter for * @return address of the reporter who reported the value for the data ID at the given timestamp */ function getReporterByTimestamp(bytes32 _queryId, uint256 _timestamp) external view returns (address); /** * @dev Returns the number of values submitted by a specific reporter address * @param _reporter is the address of a reporter * @return uint256 of the number of values submitted by the given reporter */ function getReportsSubmittedByAddress(address _reporter) external view returns (uint256); /** * @dev Returns amount required to report oracle values * @return uint256 stake amount */ function getStakeAmount() external view returns (uint256); /** * @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 rewards * @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 cast by staker when first staked */ function getStakerInfo(address _stakerAddress) external view returns ( uint256, uint256, uint256, uint256, uint256, uint256, uint256, uint256 ); /** * @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 ); /** * @dev Returns the address of the token used for staking * @return address of the token used for staking */ function getTokenAddress() external view returns (address); /** * @dev Retrieve value from oracle based on timestamp * @param _queryId being requested * @param _timestamp to retrieve data/value from * @return bytes value for timestamp submitted */ function retrieveData(bytes32 _queryId, uint256 _timestamp) external view returns (bytes memory); } interface IERC20 { function balanceOf(address account) external view returns (uint256); function transfer(address recipient, uint256 amount) external returns (bool); function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); } interface ITellor { //Controller function addresses(bytes32) external view returns (address); function uints(bytes32) external view returns (uint256); function burn(uint256 _amount) external; function changeDeity(address _newDeity) external; function changeOwner(address _newOwner) external; function changeUint(bytes32 _target, uint256 _amount) external; function migrate() external; function mint(address _reciever, uint256 _amount) external; function init() external; function getAllDisputeVars(uint256 _disputeId) external view returns ( bytes32, bool, bool, bool, address, address, address, uint256[9] memory, int256 ); function getDisputeIdByDisputeHash(bytes32 _hash) external view returns (uint256); function getDisputeUintVars(uint256 _disputeId, bytes32 _data) external view returns (uint256); function getLastNewValueById(uint256 _requestId) external view returns (uint256, bool); function retrieveData(uint256 _requestId, uint256 _timestamp) external view returns (uint256); function getNewValueCountbyRequestId(uint256 _requestId) external view returns (uint256); function getAddressVars(bytes32 _data) external view returns (address); function getUintVar(bytes32 _data) external view returns (uint256); function totalSupply() external view returns (uint256); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function isMigrated(address _addy) external view returns (bool); function allowance(address _user, address _spender) external view returns (uint256); function allowedToTrade(address _user, uint256 _amount) external view returns (bool); function approve(address _spender, uint256 _amount) external returns (bool); function approveAndTransferFrom( address _from, address _to, uint256 _amount ) external returns (bool); function balanceOf(address _user) external view returns (uint256); function balanceOfAt(address _user, uint256 _blockNumber) external view returns (uint256); function transfer(address _to, uint256 _amount) external returns (bool success); function transferFrom( address _from, address _to, uint256 _amount ) external returns (bool success); function depositStake() external; function requestStakingWithdraw() external; function withdrawStake() external; function changeStakingStatus(address _reporter, uint256 _status) external; function slashReporter(address _reporter, address _disputer) external; function getStakerInfo(address _staker) external view returns (uint256, uint256); function getTimestampbyRequestIDandIndex(uint256 _requestId, uint256 _index) external view returns (uint256); function getNewCurrentVariables() external view returns ( bytes32 _c, uint256[5] memory _r, uint256 _d, uint256 _t ); function getNewValueCountbyQueryId(bytes32 _queryId) external view returns (uint256); function getTimestampbyQueryIdandIndex(bytes32 _queryId, uint256 _index) external view returns (uint256); function retrieveData(bytes32 _queryId, uint256 _timestamp) external view returns (bytes memory); //Governance enum VoteResult { FAILED, PASSED, INVALID } function setApprovedFunction(bytes4 _func, bool _val) external; function beginDispute(bytes32 _queryId, uint256 _timestamp) external; function delegate(address _delegate) external; function delegateOfAt(address _user, uint256 _blockNumber) external view returns (address); function executeVote(uint256 _disputeId) external; function proposeVote( address _contract, bytes4 _function, bytes calldata _data, uint256 _timestamp ) external; function tallyVotes(uint256 _disputeId) external; function governance() external view returns (address); function updateMinDisputeFee() external; function verify() external pure returns (uint256); function vote( uint256 _disputeId, bool _supports, bool _invalidQuery ) external; function voteFor( address[] calldata _addys, uint256 _disputeId, bool _supports, bool _invalidQuery ) external; function getDelegateInfo(address _holder) external view returns (address, uint256); function isFunctionApproved(bytes4 _func) external view returns (bool); function isApprovedGovernanceContract(address _contract) external returns (bool); function getVoteRounds(bytes32 _hash) external view returns (uint256[] memory); function getVoteCount() external view returns (uint256); function getVoteInfo(uint256 _disputeId) external view returns ( bytes32, uint256[9] memory, bool[2] memory, VoteResult, bytes memory, bytes4, address[2] memory ); function getDisputeInfo(uint256 _disputeId) external view returns ( uint256, uint256, bytes memory, address ); function getOpenDisputesOnId(bytes32 _queryId) external view returns (uint256); function didVote(uint256 _disputeId, address _voter) external view returns (bool); //Oracle function getReportTimestampByIndex(bytes32 _queryId, uint256 _index) external view returns (uint256); function getValueByTimestamp(bytes32 _queryId, uint256 _timestamp) external view returns (bytes memory); function getBlockNumberByTimestamp(bytes32 _queryId, uint256 _timestamp) external view returns (uint256); function getReportingLock() external view returns (uint256); function getReporterByTimestamp(bytes32 _queryId, uint256 _timestamp) external view returns (address); function reportingLock() external view returns (uint256); function removeValue(bytes32 _queryId, uint256 _timestamp) external; function getTipsByUser(address _user) external view returns(uint256); function tipQuery(bytes32 _queryId, uint256 _tip, bytes memory _queryData) external; function submitValue(bytes32 _queryId, bytes calldata _value, uint256 _nonce, bytes memory _queryData) external; function burnTips() external; function changeReportingLock(uint256 _newReportingLock) external; function getReportsSubmittedByAddress(address _reporter) external view returns(uint256); function changeTimeBasedReward(uint256 _newTimeBasedReward) external; function getReporterLastTimestamp(address _reporter) external view returns(uint256); function getTipsById(bytes32 _queryId) external view returns(uint256); function getTimeBasedReward() external view returns(uint256); function getTimestampCountById(bytes32 _queryId) external view returns(uint256); function getTimestampIndexByTimestamp(bytes32 _queryId, uint256 _timestamp) external view returns(uint256); function getCurrentReward(bytes32 _queryId) external view returns(uint256, uint256); function getCurrentValue(bytes32 _queryId) external view returns(bytes memory); function getDataBefore(bytes32 _queryId, uint256 _timestamp) external view returns(bool _ifRetrieve, bytes memory _value, uint256 _timestampRetrieved); function getTimeOfLastNewValue() external view returns(uint256); function depositStake(uint256 _amount) external; function requestStakingWithdraw(uint256 _amount) external; //Test functions function changeAddressVar(bytes32 _id, address _addy) external; //parachute functions function killContract() external; function migrateFor(address _destination, uint256 _amount) external; function rescue51PercentAttack(address _tokenHolder) external; function rescueBrokenDataReporting() external; function rescueFailedUpdate() external; //Tellor 360 function addStakingRewards(uint256 _amount) external; function _sliceUint(bytes memory _b) external pure returns (uint256 _number); function claimOneTimeTip(bytes32 _queryId, uint256[] memory _timestamps) external; function claimTip( bytes32 _feedId, bytes32 _queryId, uint256[] memory _timestamps ) external; function fee() external view returns (uint256); function feedsWithFunding(uint256) external view returns (bytes32); function fundFeed( bytes32 _feedId, bytes32 _queryId, uint256 _amount ) external; function getCurrentFeeds(bytes32 _queryId) external view returns (bytes32[] memory); function getCurrentTip(bytes32 _queryId) external view returns (uint256); function getDataAfter(bytes32 _queryId, uint256 _timestamp) external view returns (bytes memory _value, uint256 _timestampRetrieved); function getDataFeed(bytes32 _feedId) external view returns (Autopay.FeedDetails memory); function getFundedFeeds() external view returns (bytes32[] memory); function getFundedQueryIds() external view returns (bytes32[] memory); function getIndexForDataAfter(bytes32 _queryId, uint256 _timestamp) external view returns (bool _found, uint256 _index); function getIndexForDataBefore(bytes32 _queryId, uint256 _timestamp) external view returns (bool _found, uint256 _index); function getMultipleValuesBefore( bytes32 _queryId, uint256 _timestamp, uint256 _maxAge, uint256 _maxCount ) external view returns (uint256[] memory _values, uint256[] memory _timestamps); function getPastTipByIndex(bytes32 _queryId, uint256 _index) external view returns (Autopay.Tip memory); function getPastTipCount(bytes32 _queryId) external view returns (uint256); function getPastTips(bytes32 _queryId) external view returns (Autopay.Tip[] memory); function getQueryIdFromFeedId(bytes32 _feedId) external view returns (bytes32); function getRewardAmount( bytes32 _feedId, bytes32 _queryId, uint256[] memory _timestamps ) external view returns (uint256 _cumulativeReward); function getRewardClaimedStatus( bytes32 _feedId, bytes32 _queryId, uint256 _timestamp ) external view returns (bool); function getTipsByAddress(address _user) external view returns (uint256); function isInDispute(bytes32 _queryId, uint256 _timestamp) external view returns (bool); function queryIdFromDataFeedId(bytes32) external view returns (bytes32); function queryIdsWithFunding(uint256) external view returns (bytes32); function queryIdsWithFundingIndex(bytes32) external view returns (uint256); function setupDataFeed( bytes32 _queryId, uint256 _reward, uint256 _startTime, uint256 _interval, uint256 _window, uint256 _priceThreshold, uint256 _rewardIncreasePerSecond, bytes memory _queryData, uint256 _amount ) external; function tellor() external view returns (address); function tip( bytes32 _queryId, uint256 _amount, bytes memory _queryData ) external; function tips(bytes32, uint256) external view returns (uint256 amount, uint256 timestamp); function token() external view returns (address); function userTipsTotal(address) external view returns (uint256); function valueFor(bytes32 _id) external view returns ( int256 _value, uint256 _timestamp, uint256 _statusCode ); } interface Autopay { struct FeedDetails { uint256 reward; uint256 balance; uint256 startTime; uint256 interval; uint256 window; uint256 priceThreshold; uint256 rewardIncreasePerSecond; uint256 feedsWithFundingIndex; } struct Tip { uint256 amount; uint256 timestamp; } function getStakeAmount() external view returns(uint256); function stakeAmount() external view returns(uint256); function token() external view returns(address); } /** * @dev EIP2362 Interface for pull oracles * https://github.com/tellor-io/EIP-2362 */ interface IERC2362 { /** * @dev Exposed function pertaining to EIP standards * @param _id bytes32 ID of the query * @return int,uint,uint returns the value, timestamp, and status code of query */ function valueFor(bytes32 _id) external view returns(int256,uint256,uint256); } interface IMappingContract{ function getTellorID(bytes32 _id) external view returns(bytes32); } /** @author Tellor Inc @title UsingTellor @dev This contract helps smart contracts read data from Tellor */ contract UsingTellor is IERC2362 { ITellor public tellor; IMappingContract public idMappingContract; /*Constructor*/ /** * @dev the constructor sets the oracle address in storage * @param _tellor is the Tellor Oracle address */ constructor(address payable _tellor) { tellor = ITellor(_tellor); } /*Getters*/ /** * @dev Retrieves the next value for the queryId after the specified timestamp * @param _queryId is the queryId to look up the value for * @param _timestamp after which to search for next value * @return _value the value retrieved * @return _timestampRetrieved the value's timestamp */ function getDataAfter(bytes32 _queryId, uint256 _timestamp) public view returns (bytes memory _value, uint256 _timestampRetrieved) { (bool _found, uint256 _index) = getIndexForDataAfter( _queryId, _timestamp ); if (!_found) { return ("", 0); } _timestampRetrieved = getTimestampbyQueryIdandIndex(_queryId, _index); _value = retrieveData(_queryId, _timestampRetrieved); return (_value, _timestampRetrieved); } /** * @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 _value the value retrieved * @return _timestampRetrieved the value's timestamp */ function getDataBefore(bytes32 _queryId, uint256 _timestamp) public view returns (bytes memory _value, uint256 _timestampRetrieved) { (, _value, _timestampRetrieved) = tellor.getDataBefore( _queryId, _timestamp ); } /** * @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 getIndexForDataAfter(bytes32 _queryId, uint256 _timestamp) public view returns (bool _found, uint256 _index) { uint256 _count = getNewValueCountbyQueryId(_queryId); if (_count == 0) return (false, 0); _count--; bool _search = true; // perform binary search uint256 _middle = 0; uint256 _start = 0; uint256 _end = _count; uint256 _timestampRetrieved; // checking boundaries to short-circuit the algorithm _timestampRetrieved = getTimestampbyQueryIdandIndex(_queryId, _end); if (_timestampRetrieved <= _timestamp) return (false, 0); _timestampRetrieved = getTimestampbyQueryIdandIndex(_queryId, _start); if (_timestampRetrieved > _timestamp) { // candidate found, check for disputes _search = false; } // since the value is within our boundaries, do a binary search while (_search) { _middle = (_end + _start) / 2; _timestampRetrieved = getTimestampbyQueryIdandIndex( _queryId, _middle ); if (_timestampRetrieved > _timestamp) { // get immediate previous value uint256 _prevTime = getTimestampbyQueryIdandIndex( _queryId, _middle - 1 ); if (_prevTime <= _timestamp) { // candidate found, check for disputes _search = false; } else { // look from start to middle -1(prev value) _end = _middle - 1; } } else { // get immediate next value uint256 _nextTime = getTimestampbyQueryIdandIndex( _queryId, _middle + 1 ); if (_nextTime > _timestamp) { // candidate found, check for disputes _search = false; _middle++; _timestampRetrieved = _nextTime; } else { // look from middle + 1(next value) to end _start = _middle + 1; } } } // candidate found, check for disputed values if (!isInDispute(_queryId, _timestampRetrieved)) { // _timestampRetrieved is correct return (true, _middle); } else { // iterate forward until we find a non-disputed value while ( isInDispute(_queryId, _timestampRetrieved) && _middle < _count ) { _middle++; _timestampRetrieved = getTimestampbyQueryIdandIndex( _queryId, _middle ); } if ( _middle == _count && isInDispute(_queryId, _timestampRetrieved) ) { return (false, 0); } // _timestampRetrieved is correct return (true, _middle); } } /** * @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) { return tellor.getIndexForDataBefore(_queryId, _timestamp); } /** * @dev Retrieves multiple uint256 values before the specified timestamp * @param _queryId the unique id of the data query * @param _timestamp the timestamp before which to search for values * @param _maxAge the maximum number of seconds before the _timestamp to search for values * @param _maxCount the maximum number of values to return * @return _values the values retrieved, ordered from oldest to newest * @return _timestamps the timestamps of the values retrieved */ function getMultipleValuesBefore( bytes32 _queryId, uint256 _timestamp, uint256 _maxAge, uint256 _maxCount ) public view returns (bytes[] memory _values, uint256[] memory _timestamps) { // get index of first possible value (bool _ifRetrieve, uint256 _startIndex) = getIndexForDataAfter( _queryId, _timestamp - _maxAge ); // no value within range if (!_ifRetrieve) { return (new bytes[](0), new uint256[](0)); } uint256 _endIndex; // get index of last possible value (_ifRetrieve, _endIndex) = getIndexForDataBefore(_queryId, _timestamp); // no value before _timestamp if (!_ifRetrieve) { return (new bytes[](0), new uint256[](0)); } uint256 _valCount = 0; uint256 _index = 0; uint256[] memory _timestampsArrayTemp = new uint256[](_maxCount); // generate array of non-disputed timestamps within range while (_valCount < _maxCount && _endIndex + 1 - _index > _startIndex) { uint256 _timestampRetrieved = getTimestampbyQueryIdandIndex( _queryId, _endIndex - _index ); if (!isInDispute(_queryId, _timestampRetrieved)) { _timestampsArrayTemp[_valCount] = _timestampRetrieved; _valCount++; } _index++; } bytes[] memory _valuesArray = new bytes[](_valCount); uint256[] memory _timestampsArray = new uint256[](_valCount); // retrieve values and reverse timestamps order for (uint256 _i = 0; _i < _valCount; _i++) { _timestampsArray[_i] = _timestampsArrayTemp[_valCount - 1 - _i]; _valuesArray[_i] = retrieveData(_queryId, _timestampsArray[_i]); } return (_valuesArray, _timestampsArray); } /** * @dev Counts the number of values that have been submitted for the queryId * @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 tellor.getNewValueCountbyQueryId(_queryId); } /** * @dev Returns the address of the reporter who submitted a value for a data ID at a specific time * @param _queryId is ID of the specific data feed * @param _timestamp is the timestamp to find a corresponding reporter for * @return address of the reporter who reported the value for the data ID at the given timestamp */ function getReporterByTimestamp(bytes32 _queryId, uint256 _timestamp) public view returns (address) { return tellor.getReporterByTimestamp(_queryId, _timestamp); } /** * @dev Gets the timestamp for the value based on their index * @param _queryId is the id 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) { return tellor.getTimestampbyQueryIdandIndex(_queryId, _index); } /** * @dev Determines whether a value with a given queryId and timestamp has been disputed * @param _queryId is the value id to look up * @param _timestamp is the timestamp of the value to look up * @return bool true if queryId/timestamp is under dispute */ function isInDispute(bytes32 _queryId, uint256 _timestamp) public view returns (bool) { return tellor.isInDispute(_queryId, _timestamp); } /** * @dev Retrieve value from oracle based on queryId/timestamp * @param _queryId being requested * @param _timestamp to retrieve data/value from * @return bytes value for query/timestamp submitted */ function retrieveData(bytes32 _queryId, uint256 _timestamp) public view returns (bytes memory) { return tellor.retrieveData(_queryId, _timestamp); } /** * @dev allows dev to set mapping contract for valueFor (EIP2362) * @param _addy address of mapping contract */ function setIdMappingContract(address _addy) external { require(address(idMappingContract) == address(0)); idMappingContract = IMappingContract(_addy); } /** * @dev Retrieve most recent int256 value from oracle based on queryId * @param _id being requested * @return _value most recent value submitted * @return _timestamp timestamp of most recent value * @return _statusCode 200 if value found, 404 if not found */ function valueFor(bytes32 _id) external view override returns ( int256 _value, uint256 _timestamp, uint256 _statusCode ) { bytes32 _queryId = idMappingContract.getTellorID(_id); bytes memory _valueBytes; (_valueBytes, _timestamp) = getDataBefore( _queryId, block.timestamp + 1 ); if (_timestamp == 0) { return (0, 0, 404); } uint256 _valueUint = _sliceUint(_valueBytes); _value = int256(_valueUint); return (_value, _timestamp, 200); } // Internal functions /** * @dev Convert bytes to uint256 * @param _b bytes value to convert to uint256 * @return _number uint256 converted from bytes */ function _sliceUint(bytes memory _b) internal pure returns (uint256 _number) { for (uint256 _i = 0; _i < _b.length; _i++) { _number = _number * 256 + uint8(_b[_i]); } } } /** @author Tellor Inc. @title Governance @dev This is a governance contract to be used with TellorFlex. It handles disputing * Tellor oracle data and voting on those disputes */ contract Governance is UsingTellor { // Storage IOracle public oracle; // Tellor oracle contract IERC20 public token; // token used for dispute fees, same as reporter staking token address public oracleAddress; //tellorFlex address address public teamMultisig; // address of team multisig wallet, one of four stakeholder groups uint256 public voteCount; // total number of votes initiated bytes32 public autopayAddrsQueryId = keccak256(abi.encode("AutopayAddresses", abi.encode(bytes("")))); // query id for autopay addresses array mapping(uint256 => Dispute) private disputeInfo; // mapping of dispute IDs to the details of the dispute mapping(bytes32 => uint256) private openDisputesOnId; // mapping of a query ID to the number of disputes on that query ID mapping(uint256 => Vote) private voteInfo; // mapping of dispute IDs to the details of the vote mapping(bytes32 => uint256[]) private voteRounds; // mapping of vote identifier hashes to an array of dispute IDs mapping(address => uint256) private voteTallyByAddress; // mapping of addresses to the number of votes they have cast mapping(address => uint256[]) private disputeIdsByReporter; // mapping of reporter addresses to an array of dispute IDs enum VoteResult { FAILED, PASSED, INVALID } // status of a potential vote // Structs struct Dispute { bytes32 queryId; // query ID of disputed value uint256 timestamp; // timestamp of disputed value bytes value; // disputed value address disputedReporter; // reporter who submitted the disputed value uint256 slashedAmount; // amount of tokens slashed from reporter } struct Tally { uint256 doesSupport; // number of votes in favor uint256 against; // number of votes against uint256 invalidQuery; // number of votes for invalid } struct Vote { bytes32 identifierHash; // identifier hash of the vote uint256 voteRound; // the round of voting on a given dispute or proposal uint256 startDate; // timestamp of when vote was initiated uint256 blockNumber; // block number of when vote was initiated uint256 fee; // fee paid to initiate the vote round uint256 tallyDate; // timestamp of when the votes were tallied Tally tokenholders; // vote tally of tokenholders Tally users; // vote tally of users Tally reporters; // vote tally of reporters Tally teamMultisig; // vote tally of teamMultisig bool executed; // boolean of whether the vote was executed VoteResult result; // VoteResult after votes were tallied address initiator; // address which initiated dispute/proposal mapping(address => bool) voted; // mapping of address to whether or not they voted } // Events event NewDispute( uint256 _disputeId, bytes32 _queryId, uint256 _timestamp, address _reporter ); // Emitted when a new dispute is opened event Voted( uint256 _disputeId, bool _supports, address _voter, bool _invalidQuery ); // Emitted when an address casts their vote event VoteExecuted(uint256 _disputeId, VoteResult _result); // Emitted when a vote is executed event VoteTallied( uint256 _disputeId, VoteResult _result, address _initiator, address _reporter ); // Emitted when all casting for a vote is tallied /** * @dev Initializes contract parameters * @param _tellor address of tellor oracle contract to be governed * @param _teamMultisig address of tellor team multisig, one of four voting * stakeholder groups */ constructor( address payable _tellor, address _teamMultisig ) UsingTellor(_tellor) { oracle = IOracle(_tellor); token = IERC20(oracle.getTokenAddress()); oracleAddress = _tellor; teamMultisig = _teamMultisig; } /** * @dev Initializes a dispute/vote in the system * @param _queryId being disputed * @param _timestamp being disputed */ function beginDispute(bytes32 _queryId, uint256 _timestamp) external { // Ensure value actually exists address _reporter = oracle.getReporterByTimestamp(_queryId, _timestamp); require(_reporter != address(0), "no value exists at given timestamp"); bytes32 _hash = keccak256(abi.encodePacked(_queryId, _timestamp)); // Push new vote round uint256 _disputeId = voteCount + 1; uint256[] storage _voteRounds = voteRounds[_hash]; _voteRounds.push(_disputeId); // Create new vote and dispute Vote storage _thisVote = voteInfo[_disputeId]; Dispute storage _thisDispute = disputeInfo[_disputeId]; // Initialize dispute information - query ID, timestamp, value, etc. _thisDispute.queryId = _queryId; _thisDispute.timestamp = _timestamp; _thisDispute.disputedReporter = _reporter; // Initialize vote information - hash, initiator, block number, etc. _thisVote.identifierHash = _hash; _thisVote.initiator = msg.sender; _thisVote.blockNumber = block.number; _thisVote.startDate = block.timestamp; _thisVote.voteRound = _voteRounds.length; disputeIdsByReporter[_reporter].push(_disputeId); uint256 _disputeFee = getDisputeFee(); if (_voteRounds.length == 1) { require( block.timestamp - _timestamp < 12 hours, "Dispute must be started within reporting lock time" ); openDisputesOnId[_queryId]++; // calculate dispute fee based on number of open disputes on query ID if (openDisputesOnId[_queryId] > 4) { _disputeFee = oracle.getStakeAmount(); } else { _disputeFee = _disputeFee * 2 ** (openDisputesOnId[_queryId] - 1); } // slash a single stakeAmount from reporter _thisDispute.slashedAmount = oracle.slashReporter( _reporter, address(this) ); _thisDispute.value = oracle.retrieveData(_queryId, _timestamp); oracle.removeValue(_queryId, _timestamp); } else { uint256 _prevId = _voteRounds[_voteRounds.length - 2]; require( block.timestamp - voteInfo[_prevId].tallyDate < 1 days, "New dispute round must be started within a day" ); if (_voteRounds.length > 4) { _disputeFee = oracle.getStakeAmount(); } else { _disputeFee = _disputeFee * 2 ** (_voteRounds.length - 1); } _thisDispute.slashedAmount = disputeInfo[_voteRounds[0]] .slashedAmount; _thisDispute.value = disputeInfo[_voteRounds[0]].value; } _thisVote.fee = _disputeFee; voteCount++; require( token.transferFrom(msg.sender, address(this), _disputeFee), "Fee must be paid" ); // This is the dispute fee. Returned if dispute passes emit NewDispute(_disputeId, _queryId, _timestamp, _reporter); } /** * @dev Executes vote and transfers corresponding balances to initiator/reporter * @param _disputeId is the ID of the vote being executed */ function executeVote(uint256 _disputeId) external { // Ensure validity of vote ID, vote has been executed, and vote must be tallied Vote storage _thisVote = voteInfo[_disputeId]; require( _disputeId <= voteCount && _disputeId > 0, "Dispute ID must be valid" ); require(!_thisVote.executed, "Vote has already been executed"); require(_thisVote.tallyDate > 0, "Vote must be tallied"); // Ensure vote must be final vote and that time has to be pass (86400 = 24 * 60 * 60 for seconds in a day) require( voteRounds[_thisVote.identifierHash].length == _thisVote.voteRound, "Must be the final vote" ); //The time has to pass after the vote is tallied require( block.timestamp - _thisVote.tallyDate >= 1 days, "1 day has to pass after tally to allow for disputes" ); _thisVote.executed = true; Dispute storage _thisDispute = disputeInfo[_disputeId]; openDisputesOnId[_thisDispute.queryId]--; uint256 _i; uint256 _voteID; if (_thisVote.result == VoteResult.PASSED) { // If vote is in dispute and passed, iterate through each vote round and transfer the dispute to initiator for ( _i = voteRounds[_thisVote.identifierHash].length; _i > 0; _i-- ) { _voteID = voteRounds[_thisVote.identifierHash][_i - 1]; _thisVote = voteInfo[_voteID]; // If the first vote round, also make sure to transfer the reporter's slashed stake to the initiator if (_i == 1) { token.transfer( _thisVote.initiator, _thisDispute.slashedAmount ); } token.transfer(_thisVote.initiator, _thisVote.fee); } } else if (_thisVote.result == VoteResult.INVALID) { // If vote is in dispute and is invalid, iterate through each vote round and transfer the dispute fee to initiator for ( _i = voteRounds[_thisVote.identifierHash].length; _i > 0; _i-- ) { _voteID = voteRounds[_thisVote.identifierHash][_i - 1]; _thisVote = voteInfo[_voteID]; token.transfer(_thisVote.initiator, _thisVote.fee); } // Transfer slashed tokens back to disputed reporter token.transfer( _thisDispute.disputedReporter, _thisDispute.slashedAmount ); } else if (_thisVote.result == VoteResult.FAILED) { // If vote is in dispute and fails, iterate through each vote round and transfer the dispute fee to disputed reporter uint256 _reporterReward = 0; for ( _i = voteRounds[_thisVote.identifierHash].length; _i > 0; _i-- ) { _voteID = voteRounds[_thisVote.identifierHash][_i - 1]; _thisVote = voteInfo[_voteID]; _reporterReward += _thisVote.fee; } _reporterReward += _thisDispute.slashedAmount; token.transfer(_thisDispute.disputedReporter, _reporterReward); } emit VoteExecuted(_disputeId, voteInfo[_disputeId].result); } /** * @dev Tallies the votes and begins the 1 day challenge period * @param _disputeId is the dispute id */ function tallyVotes(uint256 _disputeId) external { // Ensure vote has not been executed and that vote has not been tallied Vote storage _thisVote = voteInfo[_disputeId]; require(_thisVote.tallyDate == 0, "Vote has already been tallied"); require( _disputeId <= voteCount && _disputeId > 0, "Vote does not exist" ); // Determine appropriate vote duration dispute round // Vote time increases as rounds increase but only up to 6 days (withdrawal period) require( block.timestamp - _thisVote.startDate >= 86400 * _thisVote.voteRound || block.timestamp - _thisVote.startDate >= 86400 * 6, "Time for voting has not elapsed" ); // Get total votes from each separate stakeholder group. This will allow // normalization so each group's votes can be combined and compared to // determine the vote outcome. uint256 _tokenVoteSum = _thisVote.tokenholders.doesSupport + _thisVote.tokenholders.against + _thisVote.tokenholders.invalidQuery; uint256 _reportersVoteSum = _thisVote.reporters.doesSupport + _thisVote.reporters.against + _thisVote.reporters.invalidQuery; uint256 _multisigVoteSum = _thisVote.teamMultisig.doesSupport + _thisVote.teamMultisig.against + _thisVote.teamMultisig.invalidQuery; uint256 _usersVoteSum = _thisVote.users.doesSupport + _thisVote.users.against + _thisVote.users.invalidQuery; // Cannot divide by zero if (_tokenVoteSum == 0) { _tokenVoteSum++; } if (_reportersVoteSum == 0) { _reportersVoteSum++; } if (_multisigVoteSum == 0) { _multisigVoteSum++; } if (_usersVoteSum == 0) { _usersVoteSum++; } // Normalize and combine each stakeholder group votes uint256 _scaledDoesSupport = ((_thisVote.tokenholders.doesSupport * 1e18) / _tokenVoteSum) + ((_thisVote.reporters.doesSupport * 1e18) / _reportersVoteSum) + ((_thisVote.teamMultisig.doesSupport * 1e18) / _multisigVoteSum) + ((_thisVote.users.doesSupport * 1e18) / _usersVoteSum); uint256 _scaledAgainst = ((_thisVote.tokenholders.against * 1e18) / _tokenVoteSum) + ((_thisVote.reporters.against * 1e18) / _reportersVoteSum) + ((_thisVote.teamMultisig.against * 1e18) / _multisigVoteSum) + ((_thisVote.users.against * 1e18) / _usersVoteSum); uint256 _scaledInvalid = ((_thisVote.tokenholders.invalidQuery * 1e18) / _tokenVoteSum) + ((_thisVote.reporters.invalidQuery * 1e18) / _reportersVoteSum) + ((_thisVote.teamMultisig.invalidQuery * 1e18) / _multisigVoteSum) + ((_thisVote.users.invalidQuery * 1e18) / _usersVoteSum); // If votes in support outweight the sum of against and invalid, result is passed if (_scaledDoesSupport > _scaledAgainst + _scaledInvalid) { _thisVote.result = VoteResult.PASSED; // If votes in against outweight the sum of support and invalid, result is failed } else if (_scaledAgainst > _scaledDoesSupport + _scaledInvalid) { _thisVote.result = VoteResult.FAILED; // Otherwise, result is invalid } else { _thisVote.result = VoteResult.INVALID; } _thisVote.tallyDate = block.timestamp; // Update time vote was tallied emit VoteTallied( _disputeId, _thisVote.result, _thisVote.initiator, disputeInfo[_disputeId].disputedReporter ); } /** * @dev Enables the sender address to cast a vote * @param _disputeId is the ID of the vote * @param _supports is the address's vote: whether or not they support or are against * @param _invalidQuery is whether or not the dispute is valid */ function vote( uint256 _disputeId, bool _supports, bool _invalidQuery ) public { // Ensure that dispute has not been executed and that vote does not exist and is not tallied require( _disputeId <= voteCount && _disputeId > 0, "Vote does not exist" ); Vote storage _thisVote = voteInfo[_disputeId]; require(_thisVote.tallyDate == 0, "Vote has already been tallied"); require(!_thisVote.voted[msg.sender], "Sender has already voted"); // Update voting status and increment total queries for support, invalid, or against based on vote _thisVote.voted[msg.sender] = true; uint256 _tokenBalance = token.balanceOf(msg.sender); (, uint256 _stakedBalance, uint256 _lockedBalance, , , , , ) = oracle .getStakerInfo(msg.sender); _tokenBalance += _stakedBalance + _lockedBalance; if (_invalidQuery) { _thisVote.tokenholders.invalidQuery += _tokenBalance; _thisVote.reporters.invalidQuery += oracle .getReportsSubmittedByAddress(msg.sender); _thisVote.users.invalidQuery += _getUserTips(msg.sender); if (msg.sender == teamMultisig) { _thisVote.teamMultisig.invalidQuery += 1; } } else if (_supports) { _thisVote.tokenholders.doesSupport += _tokenBalance; _thisVote.reporters.doesSupport += oracle .getReportsSubmittedByAddress(msg.sender); _thisVote.users.doesSupport += _getUserTips(msg.sender); if (msg.sender == teamMultisig) { _thisVote.teamMultisig.doesSupport += 1; } } else { _thisVote.tokenholders.against += _tokenBalance; _thisVote.reporters.against += oracle.getReportsSubmittedByAddress( msg.sender ); _thisVote.users.against += _getUserTips(msg.sender); if (msg.sender == teamMultisig) { _thisVote.teamMultisig.against += 1; } } voteTallyByAddress[msg.sender]++; emit Voted(_disputeId, _supports, msg.sender, _invalidQuery); } /** * @dev Enables the sender address to cast votes for multiple disputes * @param _disputeIds is an array of vote IDs * @param _supports is an array of the address's votes: whether or not they support or are against * @param _invalidQuery is array of whether or not the dispute is valid */ function voteOnMultipleDisputes( uint256[] memory _disputeIds, bool[] memory _supports, bool[] memory _invalidQuery ) external { for (uint256 _i = 0; _i < _disputeIds.length; _i++) { vote(_disputeIds[_i], _supports[_i], _invalidQuery[_i]); } } // ***************************************************************************** // * * // * Getters * // * * // ***************************************************************************** /** * @dev Determines if an address voted for a specific vote * @param _disputeId is the ID of the vote * @param _voter is the address of the voter to check for * @return bool of whether or note the address voted for the specific vote */ function didVote( uint256 _disputeId, address _voter ) external view returns (bool) { return voteInfo[_disputeId].voted[_voter]; } /** * @dev Get the latest dispute fee */ function getDisputeFee() public view returns (uint256) { return (oracle.getStakeAmount() / 10); } function getDisputesByReporter( address _reporter ) external view returns (uint256[] memory) { return disputeIdsByReporter[_reporter]; } /** * @dev Returns info on a dispute for a given ID * @param _disputeId is the ID of a specific dispute * @return bytes32 of the data ID of the dispute * @return uint256 of the timestamp of the dispute * @return bytes memory of the value being disputed * @return address of the reporter being disputed */ function getDisputeInfo( uint256 _disputeId ) external view returns (bytes32, uint256, bytes memory, address) { Dispute storage _d = disputeInfo[_disputeId]; return (_d.queryId, _d.timestamp, _d.value, _d.disputedReporter); } /** * @dev Returns the number of open disputes for a specific query ID * @param _queryId is the ID of a specific data feed * @return uint256 of the number of open disputes for the query ID */ function getOpenDisputesOnId( bytes32 _queryId ) external view returns (uint256) { return openDisputesOnId[_queryId]; } /** * @dev Returns the total number of votes * @return uint256 of the total number of votes */ function getVoteCount() external view returns (uint256) { return voteCount; } /** * @dev Returns info on a vote for a given vote ID * @param _disputeId is the ID of a specific vote * @return bytes32 identifier hash of the vote * @return uint256[17] memory of the pertinent round info (vote rounds, start date, fee, etc.) * @return bool memory of both whether or not the vote was executed * @return VoteResult result of the vote * @return address memory of the vote initiator */ function getVoteInfo( uint256 _disputeId ) external view returns (bytes32, uint256[17] memory, bool, VoteResult, address) { Vote storage _v = voteInfo[_disputeId]; return ( _v.identifierHash, [ _v.voteRound, _v.startDate, _v.blockNumber, _v.fee, _v.tallyDate, _v.tokenholders.doesSupport, _v.tokenholders.against, _v.tokenholders.invalidQuery, _v.users.doesSupport, _v.users.against, _v.users.invalidQuery, _v.reporters.doesSupport, _v.reporters.against, _v.reporters.invalidQuery, _v.teamMultisig.doesSupport, _v.teamMultisig.against, _v.teamMultisig.invalidQuery ], _v.executed, _v.result, _v.initiator ); } /** * @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 ) external view returns (uint256[] memory) { return voteRounds[_hash]; } /** * @dev Returns the total number of votes cast by an address * @param _voter is the address of the voter to check for * @return uint256 of the total number of votes cast by the voter */ function getVoteTallyByAddress( address _voter ) external view returns (uint256) { return voteTallyByAddress[_voter]; } // Internal /** * @dev Retrieves total tips contributed to autopay by a given address * @param _user address of the user to check the tip count for * @return _userTipTally uint256 of total tips contributed to autopay by the address */ function _getUserTips( address _user ) internal returns (uint256 _userTipTally) { // get autopay addresses array from oracle (bytes memory _autopayAddrsBytes, uint256 _timestamp) = getDataBefore( autopayAddrsQueryId, block.timestamp - 12 hours ); if (_timestamp > 0) { address[] memory _autopayAddrs = abi.decode( _autopayAddrsBytes, (address[]) ); // iterate through autopay addresses retrieve tips by user address for (uint256 _i = 0; _i < _autopayAddrs.length; _i++) { (bool _success, bytes memory _returnData) = _autopayAddrs[_i] .call( abi.encodeWithSignature( "getTipsByAddress(address)", _user ) ); if (_success) { _userTipTally += abi.decode(_returnData, (uint256)); } } } } }
[{"inputs":[{"internalType":"address payable","name":"_tellor","type":"address"},{"internalType":"address","name":"_teamMultisig","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_disputeId","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"_timestamp","type":"uint256"},{"indexed":false,"internalType":"address","name":"_reporter","type":"address"}],"name":"NewDispute","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_disputeId","type":"uint256"},{"indexed":false,"internalType":"enum Governance.VoteResult","name":"_result","type":"uint8"}],"name":"VoteExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_disputeId","type":"uint256"},{"indexed":false,"internalType":"enum Governance.VoteResult","name":"_result","type":"uint8"},{"indexed":false,"internalType":"address","name":"_initiator","type":"address"},{"indexed":false,"internalType":"address","name":"_reporter","type":"address"}],"name":"VoteTallied","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_disputeId","type":"uint256"},{"indexed":false,"internalType":"bool","name":"_supports","type":"bool"},{"indexed":false,"internalType":"address","name":"_voter","type":"address"},{"indexed":false,"internalType":"bool","name":"_invalidQuery","type":"bool"}],"name":"Voted","type":"event"},{"inputs":[],"name":"autopayAddrsQueryId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"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":[{"internalType":"uint256","name":"_disputeId","type":"uint256"},{"internalType":"address","name":"_voter","type":"address"}],"name":"didVote","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_disputeId","type":"uint256"}],"name":"executeVote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"getDataAfter","outputs":[{"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":"getDataBefore","outputs":[{"internalType":"bytes","name":"_value","type":"bytes"},{"internalType":"uint256","name":"_timestampRetrieved","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDisputeFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_disputeId","type":"uint256"}],"name":"getDisputeInfo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_reporter","type":"address"}],"name":"getDisputesByReporter","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"getIndexForDataAfter","outputs":[{"internalType":"bool","name":"_found","type":"bool"},{"internalType":"uint256","name":"_index","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"},{"internalType":"uint256","name":"_timestamp","type":"uint256"},{"internalType":"uint256","name":"_maxAge","type":"uint256"},{"internalType":"uint256","name":"_maxCount","type":"uint256"}],"name":"getMultipleValuesBefore","outputs":[{"internalType":"bytes[]","name":"_values","type":"bytes[]"},{"internalType":"uint256[]","name":"_timestamps","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"}],"name":"getOpenDisputesOnId","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":[{"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":[],"name":"getVoteCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_disputeId","type":"uint256"}],"name":"getVoteInfo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint256[17]","name":"","type":"uint256[17]"},{"internalType":"bool","name":"","type":"bool"},{"internalType":"enum Governance.VoteResult","name":"","type":"uint8"},{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_hash","type":"bytes32"}],"name":"getVoteRounds","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_voter","type":"address"}],"name":"getVoteTallyByAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"idMappingContract","outputs":[{"internalType":"contract IMappingContract","name":"","type":"address"}],"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":"oracle","outputs":[{"internalType":"contract IOracle","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oracleAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":[{"internalType":"address","name":"_addy","type":"address"}],"name":"setIdMappingContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_disputeId","type":"uint256"}],"name":"tallyVotes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"teamMultisig","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tellor","outputs":[{"internalType":"contract ITellor","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_id","type":"bytes32"}],"name":"valueFor","outputs":[{"internalType":"int256","name":"_value","type":"int256"},{"internalType":"uint256","name":"_timestamp","type":"uint256"},{"internalType":"uint256","name":"_statusCode","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_disputeId","type":"uint256"},{"internalType":"bool","name":"_supports","type":"bool"},{"internalType":"bool","name":"_invalidQuery","type":"bool"}],"name":"vote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"voteCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_disputeIds","type":"uint256[]"},{"internalType":"bool[]","name":"_supports","type":"bool[]"},{"internalType":"bool[]","name":"_invalidQuery","type":"bool[]"}],"name":"voteOnMultipleDisputes","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102055760003560e01c8063a7c438bc1161011a578063dbc0c085116100ad578063f66f49c31161007c578063f66f49c3146104f1578063f78eea8314610504578063f98a4eca14610532578063fc0c546a14610545578063fcd4a5461461055857610205565b8063dbc0c085146104b0578063df133bca146104c3578063e07c5486146104d6578063e7b3387c146104e957610205565b8063c5958af9116100e9578063c5958af91461046b578063c63840711461048b578063ce5e11bf14610494578063d8add0f6146104a757610205565b8063a7c438bc146103ea578063a89ae4ba14610427578063bbf3e10b1461043a578063bdc7d9d81461044257610205565b806344e87f911161019d57806364ee3c6d1161016c57806364ee3c6d1461036c57806377b03e0d1461038d5780637dc0d1d0146103a05780638d824273146103b3578063a792765f146103d757610205565b806344e87f91146103005780634d318b0e146103235780634e9fe708146103365780636169c3081461034957610205565b80631f379acc116101d95780631f379acc14610290578063248638e5146102a357806329449085146102c35780632af8aae0146102ed57610205565b8062b121901461020a5780630e1596ef1461021f578063193b505b146102525780631959ad5b14610265575b600080fd5b61021d61021836600461337c565b610579565b005b61023f61022d3660046134fa565b60009081526009602052604090205490565b6040519081526020015b60405180910390f35b61021d6102603660046132a8565b61061d565b600054610278906001600160a01b031681565b6040516001600160a01b039091168152602001610249565b61021d61029e36600461352a565b610655565b6102b66102b13660046134fa565b610eba565b6040516102499190613794565b6102d66102d136600461352a565b610f1c565b604080519215158352602083019190915201610249565b600154610278906001600160a01b031681565b61031361030e36600461352a565b610fab565b6040519015158152602001610249565b61021d6103313660046134fa565b611036565b6102b66103443660046132a8565b61154b565b61035c6103573660046134fa565b6115b5565b604051610249949392919061380a565b61037f61037a36600461352a565b611689565b604051610249929190613856565b61023f61039b3660046134fa565b6116e2565b600254610278906001600160a01b031681565b6103c66103c13660046134fa565b611765565b6040516102499594939291906137a7565b61037f6103e536600461352a565b61186a565b6103136103f83660046135af565b6000828152600a602090815260408083206001600160a01b038516845260130190915290205460ff1692915050565b600454610278906001600160a01b031681565b61023f611900565b61023f6104503660046132a8565b6001600160a01b03166000908152600c602052604090205490565b61047e61047936600461352a565b611999565b6040516102499190613843565b61023f60065481565b61023f6104a236600461352a565b611a21565b61023f60075481565b600554610278906001600160a01b031681565b61021d6104d13660046135de565b611aa5565b6102786104e436600461352a565b612082565b60065461023f565b6102d66104ff36600461352a565b612106565b6105176105123660046134fa565b6122c2565b60408051938452602084019290925290820152606001610249565b61021d6105403660046134fa565b612392565b600354610278906001600160a01b031681565b61056b61056636600461354b565b612b71565b60405161024992919061371f565b60005b8351811015610617576106058482815181106105a857634e487b7160e01b600052603260045260246000fd5b60200260200101518483815181106105d057634e487b7160e01b600052603260045260246000fd5b60200260200101518484815181106105f857634e487b7160e01b600052603260045260246000fd5b6020026020010151611aa5565b8061060f81613b08565b91505061057c565b50505050565b6001546001600160a01b03161561063357600080fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b60025460405163703e2a4360e11b815260048101849052602481018390526000916001600160a01b03169063e07c54869060440160206040518083038186803b1580156106a157600080fd5b505afa1580156106b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106d991906132c4565b90506001600160a01b0381166107415760405162461bcd60e51b815260206004820152602260248201527f6e6f2076616c75652065786973747320617420676976656e2074696d6573746160448201526106d760f41b60648201526084015b60405180910390fd5b6040805160208082018690528183018590528251808303840181526060909201909252805191012060065460009061077a906001613917565b6000838152600b60209081526040808320805460018082018355828652848620909101869055858552600a8452828520600885528386208c81558083018c9055600380820180546001600160a01b0319166001600160a01b038e169081179091558b845560128401805475ffffffffffffffffffffffffffffffffffffffff0000191633620100000217905543918401919091554260028401558454838501558752600d8652938620805492830181558652938520018590559394509091610840611900565b845490915060011415610b4b5761a8c061085a8942613a79565b106108c25760405162461bcd60e51b815260206004820152603260248201527f44697370757465206d75737420626520737461727465642077697468696e207260448201527165706f7274696e67206c6f636b2074696d6560701b6064820152608401610738565b60008981526009602052604081208054916108dc83613b08565b90915550506000898152600960205260409020546004101561098557600260009054906101000a90046001600160a01b03166001600160a01b031663722580b66040518163ffffffff1660e01b815260040160206040518083038186803b15801561094657600080fd5b505afa15801561095a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061097e9190613512565b90506109b8565b6000898152600960205260409020546109a090600190613a79565b6109ab90600261398c565b6109b59082613a5a565b90505b60025460405163137f0a8d60e21b81526001600160a01b03898116600483015230602483015290911690634dfc2a3490604401602060405180830381600087803b158015610a0557600080fd5b505af1158015610a19573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a3d9190613512565b60048381019190915560025460405163c5958af960e01b81529182018b9052602482018a90526001600160a01b03169063c5958af99060440160006040518083038186803b158015610a8e57600080fd5b505afa158015610aa2573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610aca919081019061357c565b8051610ae0916002850191602090910190613093565b506002546040516316d7b73f60e21b8152600481018b9052602481018a90526001600160a01b0390911690635b5edcfc90604401600060405180830381600087803b158015610b2e57600080fd5b505af1158015610b42573d6000803e3d6000fd5b50505050610d79565b83546000908590610b5e90600290613a79565b81548110610b7c57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905062015180600a60008381526020019081526020016000206005015442610baf9190613a79565b10610c135760405162461bcd60e51b815260206004820152602e60248201527f4e6577206469737075746520726f756e64206d7573742062652073746172746560448201526d642077697468696e20612064617960901b6064820152608401610738565b845460041015610caa57600260009054906101000a90046001600160a01b03166001600160a01b031663722580b66040518163ffffffff1660e01b815260040160206040518083038186803b158015610c6b57600080fd5b505afa158015610c7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ca39190613512565b9150610cd0565b8454610cb890600190613a79565b610cc390600261398c565b610ccd9083613a5a565b91505b6008600086600081548110610cf557634e487b7160e01b600052603260045260246000fd5b906000526020600020015481526020019081526020016000206004015483600401819055506008600086600081548110610d3f57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154815260200190815260200160002060020183600201908054610d6b90613ad3565b610d76929190613117565b50505b6004830181905560068054906000610d9083613b08565b90915550506003546040516323b872dd60e01b8152336004820152306024820152604481018390526001600160a01b03909116906323b872dd90606401602060405180830381600087803b158015610de757600080fd5b505af1158015610dfb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e1f9190613459565b610e5e5760405162461bcd60e51b815260206004820152601060248201526f119959481b5d5cdd081899481c185a5960821b6044820152606401610738565b60408051868152602081018b90529081018990526001600160a01b03881660608201527f12b7317353cd7caa8eae8057464e3de356c1429d814fb3421797eccb19043044906080015b60405180910390a1505050505050505050565b6000818152600b6020908152604091829020805483518184028101840190945280845260609392830182828015610f1057602002820191906000526020600020905b815481526020019060010190808311610efc575b50505050509050919050565b60008054604051632944908560e01b8152600481018590526024810184905282916001600160a01b031690632944908590604401604080518083038186803b158015610f6757600080fd5b505afa158015610f7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f9f91906134cd565b915091505b9250929050565b600080546040516344e87f9160e01b815260048101859052602481018490526001600160a01b03909116906344e87f919060440160206040518083038186803b158015610ff757600080fd5b505afa15801561100b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061102f9190613459565b9392505050565b6000818152600a602052604090206005810154156110965760405162461bcd60e51b815260206004820152601d60248201527f566f74652068617320616c7265616479206265656e2074616c6c6965640000006044820152606401610738565b60065482111580156110a85750600082115b6110ea5760405162461bcd60e51b8152602060048201526013602482015272159bdd1948191bd95cc81b9bdd08195e1a5cdd606a1b6044820152606401610738565b60018101546110fc9062015180613a5a565b600282015461110b9042613a79565b10158061112a57506207e9008160020154426111279190613a79565b10155b6111765760405162461bcd60e51b815260206004820152601f60248201527f54696d6520666f7220766f74696e6720686173206e6f7420656c6170736564006044820152606401610738565b6008810154600782015460068301546000929161119291613917565b61119c9190613917565b600e830154600d840154600c8501549293506000926111bb9190613917565b6111c59190613917565b60118401546010850154600f8601549293506000926111e49190613917565b6111ee9190613917565b600b850154600a860154600987015492935060009261120d9190613917565b6112179190613917565b90508361122c578361122881613b08565b9450505b8261123f578261123b81613b08565b9350505b81611252578161124e81613b08565b9250505b80611265578061126181613b08565b9150505b6009850154600090829061128190670de0b6b3a7640000613a5a565b61128b919061392f565b600f87015484906112a490670de0b6b3a7640000613a5a565b6112ae919061392f565b600c88015486906112c790670de0b6b3a7640000613a5a565b6112d1919061392f565b600689015488906112ea90670de0b6b3a7640000613a5a565b6112f4919061392f565b6112fe9190613917565b6113089190613917565b6113129190613917565b90506000828760090160010154670de0b6b3a76400006113329190613a5a565b61133c919061392f565b6010880154859061135590670de0b6b3a7640000613a5a565b61135f919061392f565b600d890154879061137890670de0b6b3a7640000613a5a565b611382919061392f565b60078a0154899061139b90670de0b6b3a7640000613a5a565b6113a5919061392f565b6113af9190613917565b6113b99190613917565b6113c39190613917565b90506000838860090160020154670de0b6b3a76400006113e39190613a5a565b6113ed919061392f565b6011890154869061140690670de0b6b3a7640000613a5a565b611410919061392f565b600e8a0154889061142990670de0b6b3a7640000613a5a565b611433919061392f565b60088b01548a9061144c90670de0b6b3a7640000613a5a565b611456919061392f565b6114609190613917565b61146a9190613917565b6114749190613917565b90506114808183613917565b8311156114a5576012880180546001919061ff001916610100835b02179055506114e0565b6114af8184613917565b8211156114ce576012880180546000919061ff0019166101008361149b565b60128801805461ff0019166102001790555b426005890155601288015460008a815260086020526040908190206003015490517fa2d4e500801849d40ad00f0f12ba92a5263f83ec68946e647be95cfbe581c7b692610ea7928d9260ff610100840416926001600160a01b0362010000909104811692169061388c565b6001600160a01b0381166000908152600d6020908152604091829020805483518184028101840190945280845260609392830182828015610f105760200282019190600052602060002090815481526020019060010190808311610efc5750505050509050919050565b6000818152600860205260408120805460018201546003830154600284018054869560609587959194909391926001600160a01b039091169082906115f990613ad3565b80601f016020809104026020016040519081016040528092919081815260200182805461162590613ad3565b80156116725780601f1061164757610100808354040283529160200191611672565b820191906000526020600020905b81548152906001019060200180831161165557829003601f168201915b505050505091509450945094509450509193509193565b6060600080600061169a8686612106565b91509150816116c15760006040518060200160405280600081525090935093505050610fa4565b6116cb8682611a21565b92506116d78684611999565b935050509250929050565b600080546040516377b03e0d60e01b8152600481018490526001600160a01b03909116906377b03e0d9060240160206040518083038186803b15801561172757600080fd5b505afa15801561173b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061175f9190613512565b92915050565b600061176f613192565b50506000908152600a60208181526040928390208054845161022081018652600183015481526002830154938101939093526003820154948301949094526004810154606083015260058101546080830152600681015460a0830152600781015460c0830152600881015460e083015260098101546101008084019190915292810154610120830152600b810154610140830152600c810154610160830152600d810154610180830152600e8101546101a0830152600f8101546101c083015260108101546101e08301526011810154610200830152601201549293909260ff8082169382041691620100009091046001600160a01b031690565b6000805460405163a792765f60e01b81526004810185905260248101849052606092916001600160a01b03169063a792765f9060440160006040518083038186803b1580156118b857600080fd5b505afa1580156118cc573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526118f49190810190613475565b90969095509350505050565b6000600a600260009054906101000a90046001600160a01b03166001600160a01b031663722580b66040518163ffffffff1660e01b815260040160206040518083038186803b15801561195257600080fd5b505afa158015611966573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061198a9190613512565b611994919061392f565b905090565b60005460405163c5958af960e01b815260048101849052602481018390526060916001600160a01b03169063c5958af99060440160006040518083038186803b1580156119e557600080fd5b505afa1580156119f9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261102f919081019061357c565b6000805460405163ce5e11bf60e01b815260048101859052602481018490526001600160a01b039091169063ce5e11bf9060440160206040518083038186803b158015611a6d57600080fd5b505afa158015611a81573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061102f9190613512565b6006548311158015611ab75750600083115b611af95760405162461bcd60e51b8152602060048201526013602482015272159bdd1948191bd95cc81b9bdd08195e1a5cdd606a1b6044820152606401610738565b6000838152600a60205260409020600581015415611b595760405162461bcd60e51b815260206004820152601d60248201527f566f74652068617320616c7265616479206265656e2074616c6c6965640000006044820152606401610738565b33600090815260138201602052604090205460ff1615611bbb5760405162461bcd60e51b815260206004820152601860248201527f53656e6465722068617320616c726561647920766f74656400000000000000006044820152606401610738565b336000818152601383016020526040808220805460ff1916600117905560035490516370a0823160e01b8152600481019390935290916001600160a01b03909116906370a082319060240160206040518083038186803b158015611c1e57600080fd5b505afa158015611c32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c569190613512565b600254604051630733bdef60e41b815233600482015291925060009182916001600160a01b03169063733bdef0906024016101006040518083038186803b158015611ca057600080fd5b505afa158015611cb4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cd8919061361f565b505050505092509250508082611cee9190613917565b611cf89084613917565b92508415611e095782846006016002016000828254611d179190613917565b9091555050600254604051631c3c149f60e11b81523360048201526001600160a01b0390911690633878293e9060240160206040518083038186803b158015611d5f57600080fd5b505afa158015611d73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d979190613512565b600e85018054600090611dab908490613917565b90915550611dba905033612ed0565b600b85018054600090611dce908490613917565b90915550506005546001600160a01b0316331415611e0457600184600f016002016000828254611dfe9190613917565b90915550505b612011565b8515611f0d5782846006016000016000828254611e269190613917565b9091555050600254604051631c3c149f60e11b81523360048201526001600160a01b0390911690633878293e9060240160206040518083038186803b158015611e6e57600080fd5b505afa158015611e82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ea69190613512565b600c85018054600090611eba908490613917565b90915550611ec9905033612ed0565b600985018054600090611edd908490613917565b90915550506005546001600160a01b0316331415611e0457600184600f016000016000828254611dfe9190613917565b82846006016001016000828254611f249190613917565b9091555050600254604051631c3c149f60e11b81523360048201526001600160a01b0390911690633878293e9060240160206040518083038186803b158015611f6c57600080fd5b505afa158015611f80573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fa49190613512565b600d85018054600090611fb8908490613917565b90915550611fc7905033612ed0565b600a85018054600090611fdb908490613917565b90915550506005546001600160a01b031633141561201157600184600f01600101600082825461200b9190613917565b90915550505b336000908152600c6020526040812080549161202c83613b08565b90915550506040805188815287151560208201523381830152861515606082015290517fbe6f1c58cc15c8e86d6f0ef23c5a30eb33319af3b57f6b7d9b56ccfa87696b849181900360800190a150505050505050565b6000805460405163703e2a4360e11b815260048101859052602481018490526001600160a01b039091169063e07c54869060440160206040518083038186803b1580156120ce57600080fd5b505afa1580156120e2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061102f91906132c4565b6000806000612114856116e2565b905080612128576000809250925050610fa4565b8061213281613abc565b91506001905060008083816121478a83611a21565b90508881116121625760008097509750505050505050610fa4565b61216c8a84611a21565b90508881111561217b57600094505b841561222d57600261218d8484613917565b612197919061392f565b93506121a38a85611a21565b9050888111156121e45760006121be8b6104a2600188613a79565b90508981116121d057600095506121de565b6121db600186613a79565b92505b50612228565b60006121f58b6104a2876001613917565b90508981111561221857600095508461220d81613b08565b955050809150612226565b612223856001613917565b93505b505b61217b565b6122378a82610fab565b61224d5760018497509750505050505050610fa4565b6122578a82610fab565b801561226257508584105b15612285578361227181613b08565b94505061227e8a85611a21565b905061224d565b858414801561229957506122998a82610fab565b156122b05760008097509750505050505050610fa4565b60018497509750505050505050610fa4565b6001546040516387a475fd60e01b8152600481018390526000918291829182916001600160a01b03909116906387a475fd9060240160206040518083038186803b15801561230f57600080fd5b505afa158015612323573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123479190613512565b9050606061235a826103e5426001613917565b945090508361237657600080610194945094509450505061238b565b60006123818261302e565b955060c893505050505b9193909250565b6000818152600a6020526040902060065482118015906123b25750600082115b6123fe5760405162461bcd60e51b815260206004820152601860248201527f44697370757465204944206d7573742062652076616c696400000000000000006044820152606401610738565b601281015460ff16156124535760405162461bcd60e51b815260206004820152601e60248201527f566f74652068617320616c7265616479206265656e20657865637574656400006044820152606401610738565b60008160050154116124a75760405162461bcd60e51b815260206004820152601460248201527f566f7465206d7573742062652074616c6c6965640000000000000000000000006044820152606401610738565b600181015481546000908152600b60205260409020541461250a5760405162461bcd60e51b815260206004820152601660248201527f4d757374206265207468652066696e616c20766f7465000000000000000000006044820152606401610738565b6201518081600501544261251e9190613a79565b10156125885760405162461bcd60e51b815260206004820152603360248201527f31206461792068617320746f20706173732061667465722074616c6c7920746f60448201527220616c6c6f7720666f7220646973707574657360681b6064820152608401610738565b60128101805460ff1916600117905560008281526008602090815260408083208054845260099092528220805491926125c083613abc565b90915550600090508060016012850154610100900460ff1660028111156125f757634e487b7160e01b600052602160045260246000fd5b14156127c15783546000908152600b602052604090205491505b81156127bc5783546000908152600b60205260409020612632600184613a79565b8154811061265057634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050600a60008281526020019081526020016000209350816001141561271357600354601285015460048581015460405163a9059cbb60e01b81526001600160a01b0362010000909404841692810192909252602482015291169063a9059cbb90604401602060405180830381600087803b1580156126d957600080fd5b505af11580156126ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127119190613459565b505b600354601285015460048087015460405163a9059cbb60e01b81526001600160a01b0362010000909404841692810192909252602482015291169063a9059cbb90604401602060405180830381600087803b15801561277157600080fd5b505af1158015612785573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127a99190613459565b50816127b481613abc565b925050612611565b612b16565b60026012850154610100900460ff1660028111156127ef57634e487b7160e01b600052602160045260246000fd5b14156129ab5783546000908152600b602052604090205491505b81156129155783546000908152600b6020526040902061282a600184613a79565b8154811061284857634e487b7160e01b600052603260045260246000fd5b600091825260208083209190910154808352600a9091526040918290206003546012820154600480840154955163a9059cbb60e01b81526001600160a01b03620100009093048316918101919091526024810195909552919750919350169063a9059cbb90604401602060405180830381600087803b1580156128ca57600080fd5b505af11580156128de573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129029190613459565b508161290d81613abc565b925050612809565b600380549084015460048086015460405163a9059cbb60e01b81526001600160a01b0393841692810192909252602482015291169063a9059cbb90604401602060405180830381600087803b15801561296d57600080fd5b505af1158015612981573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129a59190613459565b50612b16565b60006012850154610100900460ff1660028111156129d957634e487b7160e01b600052602160045260246000fd5b1415612b165783546000908152600b602052604081205492505b8215612a785784546000908152600b60205260409020612a14600185613a79565b81548110612a3257634e487b7160e01b600052603260045260246000fd5b90600052602060002001549150600a60008381526020019081526020016000209450846004015481612a649190613917565b905082612a7081613abc565b9350506129f3565b6004840154612a879082613917565b600380549086015460405163a9059cbb60e01b81526001600160a01b03918216600482015260248101849052929350169063a9059cbb90604401602060405180830381600087803b158015612adb57600080fd5b505af1158015612aef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b139190613459565b50505b6000858152600a6020526040908190206012015490517f40d231bf91823121de9e1c012d95f835ea5684dc1d93360d9510a30543345da491612b62918891610100900460ff1690613878565b60405180910390a15050505050565b606080600080612b85886104ff888a613a79565b9150915081612bd6576040805160008082526020820190925290612bb9565b6060815260200190600190039081612ba45790505b506040805160008152602081019091529094509250612ec7915050565b6000612be28989610f1c565b909350905082612c35576040805160008082526020820190925290612c17565b6060815260200190600190039081612c025790505b506040805160008152602081019091529095509350612ec792505050565b60008060008867ffffffffffffffff811115612c6157634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015612c8a578160200160208202803683370190505b5090505b8883108015612cb157508482612ca5866001613917565b612caf9190613a79565b115b15612d23576000612cc68d6104a28588613a79565b9050612cd28d82610fab565b612d105780828581518110612cf757634e487b7160e01b600052603260045260246000fd5b602090810291909101015283612d0c81613b08565b9450505b82612d1a81613b08565b93505050612c8e565b60008367ffffffffffffffff811115612d4c57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015612d7f57816020015b6060815260200190600190039081612d6a5790505b50905060008467ffffffffffffffff811115612dab57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015612dd4578160200160208202803683370190505b50905060005b85811015612eba578381612def600189613a79565b612df99190613a79565b81518110612e1757634e487b7160e01b600052603260045260246000fd5b6020026020010151828281518110612e3f57634e487b7160e01b600052603260045260246000fd5b602002602001018181525050612e7c8f838381518110612e6f57634e487b7160e01b600052603260045260246000fd5b6020026020010151611999565b838281518110612e9c57634e487b7160e01b600052603260045260246000fd5b60200260200101819052508080612eb290613b08565b915050612dda565b5090985096505050505050505b94509492505050565b6000806000612ee960075461a8c0426103e59190613a79565b9092509050801561302757600082806020019051810190612f0a91906132e0565b905060005b815181101561302457600080838381518110612f3b57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b031688604051602401612f6c91906001600160a01b0391909116815260200190565b60408051601f198184030181529181526020820180516001600160e01b03166345d6082360e01b17905251612fa19190613703565b6000604051808303816000865af19150503d8060008114612fde576040519150601f19603f3d011682016040523d82523d6000602084013e612fe3565b606091505b5091509150811561300f57808060200190518101906130029190613512565b61300c9088613917565b96505b5050808061301c90613b08565b915050612f0f565b50505b5050919050565b6000805b825181101561308d5782818151811061305b57634e487b7160e01b600052603260045260246000fd5b016020015160f81c61306f83610100613a5a565b6130799190613917565b91508061308581613b08565b915050613032565b50919050565b82805461309f90613ad3565b90600052602060002090601f0160209004810192826130c15760008555613107565b82601f106130da57805160ff1916838001178555613107565b82800160010185558215613107579182015b828111156131075782518255916020019190600101906130ec565b506131139291506131b1565b5090565b82805461312390613ad3565b90600052602060002090601f0160209004810192826131455760008555613107565b82601f106131565780548555613107565b8280016001018555821561310757600052602060002091601f016020900482015b82811115613107578254825591600101919060010190613177565b6040518061022001604052806011906020820280368337509192915050565b5b8082111561311357600081556001016131b2565b600082601f8301126131d6578081fd5b813560206131eb6131e6836138f3565b6138c2565b80838252828201915082860187848660051b890101111561320a578586fd5b855b8581101561323157813561321f81613b67565b8452928401929084019060010161320c565b5090979650505050505050565b600082601f83011261324e578081fd5b815167ffffffffffffffff81111561326857613268613b39565b61327b601f8201601f19166020016138c2565b81815284602083860101111561328f578283fd5b6132a0826020830160208701613a90565b949350505050565b6000602082840312156132b9578081fd5b813561102f81613b4f565b6000602082840312156132d5578081fd5b815161102f81613b4f565b600060208083850312156132f2578182fd5b825167ffffffffffffffff811115613308578283fd5b8301601f81018513613318578283fd5b80516133266131e6826138f3565b80828252848201915084840188868560051b8701011115613345578687fd5b8694505b8385101561337057805161335c81613b4f565b835260019490940193918501918501613349565b50979650505050505050565b600080600060608486031215613390578182fd5b833567ffffffffffffffff808211156133a7578384fd5b818601915086601f8301126133ba578384fd5b813560206133ca6131e6836138f3565b8083825282820191508286018b848660051b89010111156133e9578889fd5b8896505b8487101561340b5780358352600196909601959183019183016133ed565b5097505087013592505080821115613421578384fd5b61342d878388016131c6565b93506040860135915080821115613442578283fd5b5061344f868287016131c6565b9150509250925092565b60006020828403121561346a578081fd5b815161102f81613b67565b600080600060608486031215613489578283fd5b835161349481613b67565b602085015190935067ffffffffffffffff8111156134b0578283fd5b6134bc8682870161323e565b925050604084015190509250925092565b600080604083850312156134df578182fd5b82516134ea81613b67565b6020939093015192949293505050565b60006020828403121561350b578081fd5b5035919050565b600060208284031215613523578081fd5b5051919050565b6000806040838503121561353c578182fd5b50508035926020909101359150565b60008060008060808587031215613560578182fd5b5050823594602084013594506040840135936060013592509050565b60006020828403121561358d578081fd5b815167ffffffffffffffff8111156135a3578182fd5b6132a08482850161323e565b600080604083850312156135c1578182fd5b8235915060208301356135d381613b4f565b809150509250929050565b6000806000606084860312156135f2578081fd5b83359250602084013561360481613b67565b9150604084013561361481613b67565b809150509250925092565b600080600080600080600080610100898b03121561363b578586fd5b505086516020880151604089015160608a015160808b015160a08c015160c08d015160e0909d0151959e949d50929b919a50985090965094509092509050565b6000815180845260208085019450808401835b838110156136aa5781518752958201959082019060010161368e565b509495945050505050565b600081518084526136cd816020860160208601613a90565b601f01601f19169290920160200192915050565b600381106136ff57634e487b7160e01b600052602160045260246000fd5b9052565b60008251613715818460208701613a90565b9190910192915050565b6000604082016040835280855180835260608501915060608160051b86010192506020808801855b8381101561377557605f198887030185526137638683516136b5565b95509382019390820190600101613747565b50508584038187015250505061378b818561367b565b95945050505050565b60006020825261102f602083018461367b565b8581526102a0810160208083018760005b60118110156137d5578151835291830191908301906001016137b8565b505050508415156102408301526137f06102608301856136e1565b6001600160a01b0383166102808301529695505050505050565b60008582528460208301526080604083015261382960808301856136b5565b90506001600160a01b038316606083015295945050505050565b60006020825261102f60208301846136b5565b60006040825261386960408301856136b5565b90508260208301529392505050565b8281526040810161102f60208301846136e1565b848152608081016138a060208301866136e1565b6001600160a01b03808516604084015280841660608401525095945050505050565b604051601f8201601f1916810167ffffffffffffffff811182821017156138eb576138eb613b39565b604052919050565b600067ffffffffffffffff82111561390d5761390d613b39565b5060051b60200190565b6000821982111561392a5761392a613b23565b500190565b60008261394a57634e487b7160e01b81526012600452602481fd5b500490565b80825b60018086116139615750612ec7565b81870482111561397357613973613b23565b8086161561398057918102915b9490941c938002613952565b600061102f60001984846000826139a55750600161102f565b816139b25750600061102f565b81600181146139c857600281146139d2576139ff565b600191505061102f565b60ff8411156139e3576139e3613b23565b6001841b9150848211156139f9576139f9613b23565b5061102f565b5060208310610133831016604e8410600b8410161715613a32575081810a83811115613a2d57613a2d613b23565b61102f565b613a3f848484600161394f565b808604821115613a5157613a51613b23565b02949350505050565b6000816000190483118215151615613a7457613a74613b23565b500290565b600082821015613a8b57613a8b613b23565b500390565b60005b83811015613aab578181015183820152602001613a93565b838111156106175750506000910152565b600081613acb57613acb613b23565b506000190190565b600181811c90821680613ae757607f821691505b6020821081141561308d57634e487b7160e01b600052602260045260246000fd5b6000600019821415613b1c57613b1c613b23565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114613b6457600080fd5b50565b8015158114613b6457600080fdfea2646970667358221220d430664f5f63987d8c7e884d4eda4cc1876f1977aa1fea560434b0fb9ca3dfe564736f6c63430008030033
Deployed Bytecode Sourcemap
33031:24511:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51179:311;;;;;;:::i;:::-;;:::i;:::-;;53570:147;;;;;;:::i;:::-;53656:7;53683:26;;;:16;:26;;;;;;;53570:147;;;;13231:25:1;;;13219:2;13204:18;53570:147:0;;;;;;;;31267:176;;;;;;:::i;:::-;;:::i;20054:21::-;;;;;-1:-1:-1;;;;;20054:21:0;;;;;;-1:-1:-1;;;;;10275:55:1;;;10257:74;;10245:2;10230:18;20054:21:0;10212:125:1;37305:3242:0;;;;;;:::i;:::-;;:::i;55658:138::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;26017:227::-;;;;;;:::i;:::-;;:::i;:::-;;;;13015:14:1;;13008:22;12990:41;;13062:2;13047:18;;13040:34;;;;12963:18;26017:227:0;12945:135:1;20082:41:0;;;;;-1:-1:-1;;;;;20082:41:0;;;30498:184;;;;;;:::i;:::-;;:::i;:::-;;;12795:14:1;;12788:22;12770:41;;12758:2;12743:18;30498:184:0;12725:92:1;44405:3886:0;;;;;;:::i;:::-;;:::i;52555:164::-;;;;;;:::i;:::-;;:::i;53079:262::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;20723:547::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;28998:183::-;;;;;;:::i;:::-;;:::i;33089:21::-;;;;;-1:-1:-1;;;;;33089:21:0;;;54395:1054;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;21614:296::-;;;;;;:::i;:::-;;:::i;52203:167::-;;;;;;:::i;:::-;52304:4;52328:20;;;:8;:20;;;;;;;;-1:-1:-1;;;;;52328:34:0;;;;:26;;:34;;;;;;;;52203:167;;;;;33232:28;;;;;-1:-1:-1;;;;;33232:28:0;;;52436:111;;;:::i;56022:147::-;;;;;;:::i;:::-;-1:-1:-1;;;;;56135:26:0;56108:7;56135:26;;;:18;:26;;;;;;;56022:147;30927:194;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;33389:24::-;;;;;;29982:215;;;;;;:::i;:::-;;:::i;33455:110::-;;;;;;33288:27;;;;;-1:-1:-1;;;;;33288:27:0;;;48579:2266;;;;;;:::i;:::-;;:::i;29549:209::-;;;;;;:::i;:::-;;:::i;53843:91::-;53917:9;;53843:91;;22357:3213;;;;;;:::i;:::-;;:::i;31754:649::-;;;;;;:::i;:::-;;:::i;:::-;;;;16584:25:1;;;16640:2;16625:18;;16618:34;;;;16668:18;;;16661:34;16572:2;16557:18;31754:649:0;16539:162:1;40722:3544:0;;;;;;:::i;:::-;;:::i;33143:19::-;;;;;-1:-1:-1;;;;;33143:19:0;;;26781:1988;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;51179:311::-;51354:10;51349:134;51375:11;:18;51370:2;:23;51349:134;;;51416:55;51421:11;51433:2;51421:15;;;;;;-1:-1:-1;;;51421:15:0;;;;;;;;;;;;;;;51438:9;51448:2;51438:13;;;;;;-1:-1:-1;;;51438:13:0;;;;;;;;;;;;;;;51453;51467:2;51453:17;;;;;;-1:-1:-1;;;51453:17:0;;;;;;;;;;;;;;;51416:4;:55::i;:::-;51395:4;;;;:::i;:::-;;;;51349:134;;;;51179:311;;;:::o;31267:176::-;31348:17;;-1:-1:-1;;;;;31348:17:0;31340:40;31332:49;;;;;;31392:17;:43;;-1:-1:-1;;;;;;31392:43:0;-1:-1:-1;;;;;31392:43:0;;;;;;;;;;31267:176::o;37305:3242::-;37446:6;;:51;;-1:-1:-1;;;37446:51:0;;;;;14310:25:1;;;14351:18;;;14344:34;;;37426:17:0;;-1:-1:-1;;;;;37446:6:0;;:29;;14283:18:1;;37446:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37426:71;-1:-1:-1;;;;;;37516:23:0;;37508:70;;;;-1:-1:-1;;;37508:70:0;;18390:2:1;37508:70:0;;;18372:21:1;18429:2;18409:18;;;18402:30;18468:34;18448:18;;;18441:62;-1:-1:-1;;;18519:18:1;;;18512:32;18561:19;;37508:70:0;;;;;;;;;37615:38;;;;;;;9737:19:1;;;9772:12;;;9765:28;;;37615:38:0;;;;;;;;;9809:12:1;;;;37615:38:0;;;37605:49;;;;;37718:9;;-1:-1:-1;;37718:13:0;;37730:1;37718:13;:::i;:::-;37742:29;37774:17;;;:10;:17;;;;;;;;37802:28;;;;;;;;;;;;;;;;;;;;37908:20;;;:8;:20;;;;;37970:11;:23;;;;;38084:31;;;38126:22;;;:35;;;38172:29;;;;:41;;-1:-1:-1;;;;;;38172:41:0;-1:-1:-1;;;;;38172:41:0;;;;;;;;38302:32;;;38345:19;;;:32;;-1:-1:-1;;38345:32:0;38367:10;38345:32;;;;;38412:12;38388:21;;;:36;;;;38457:15;38345:19;38435;;:37;38505:18;;38483:19;;;:40;38534:31;;:20;:31;;;;;:48;;;;;;;;;;;;;;;;37802:28;;-1:-1:-1;37908:20:0;;38615:15;:13;:15::i;:::-;38645:18;;38593:37;;-1:-1:-1;38667:1:0;38645:23;38641:1578;;;38742:8;38711:28;38729:10;38711:15;:28;:::i;:::-;:39;38685:151;;;;-1:-1:-1;;;38685:151:0;;17266:2:1;38685:151:0;;;17248:21:1;17305:2;17285:18;;;17278:30;17344:34;17324:18;;;17317:62;-1:-1:-1;;;17395:18:1;;;17388:48;17453:19;;38685:151:0;17238:240:1;38685:151:0;38851:26;;;;:16;:26;;;;;:28;;;;;;:::i;:::-;;;;-1:-1:-1;;38981:26:0;;;;:16;:26;;;;;;39010:1;-1:-1:-1;38977:256:0;;;39046:6;;;;;;;;;-1:-1:-1;;;;;39046:6:0;-1:-1:-1;;;;;39046:21:0;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39032:37;;38977:256;;;39186:26;;;;:16;:26;;;;;;:30;;39215:1;;39186:30;:::i;:::-;39180:37;;:1;:37;:::i;:::-;39145:72;;:11;:72;:::i;:::-;39110:107;;38977:256;39333:6;;:95;;-1:-1:-1;;;39333:95:0;;-1:-1:-1;;;;;10595:15:1;;;39333:95:0;;;10577:34:1;39408:4:0;10627:18:1;;;10620:43;39333:6:0;;;;:20;;10489:18:1;;39333:95:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39304:26;;;;:124;;;;39464:6;;:41;;-1:-1:-1;;;39464:41:0;;;;;14310:25:1;;;14351:18;;;14344:34;;;-1:-1:-1;;;;;39464:6:0;;:19;;14283:18:1;;39464:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;39464:41:0;;;;;;;;;;;;:::i;:::-;39443:62;;;;:18;;;;:62;;;;;;:::i;:::-;-1:-1:-1;39520:6:0;;:40;;-1:-1:-1;;;39520:40:0;;;;;14310:25:1;;;14351:18;;;14344:34;;;-1:-1:-1;;;;;39520:6:0;;;;:18;;14283::1;;39520:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38641:1578;;;39623:18;;39593:15;;39611:11;;39623:22;;39644:1;;39623:22;:::i;:::-;39611:35;;;;;;-1:-1:-1;;;39611:35:0;;;;;;;;;;;;;;;;;39593:53;;39735:6;39705:8;:17;39714:7;39705:17;;;;;;;;;;;:27;;;39687:15;:45;;;;:::i;:::-;:54;39661:162;;;;-1:-1:-1;;;39661:162:0;;20629:2:1;39661:162:0;;;20611:21:1;20668:2;20648:18;;;20641:30;20707:34;20687:18;;;20680:62;-1:-1:-1;;;20758:18:1;;;20751:44;20812:19;;39661:162:0;20601:236:1;39661:162:0;39842:18;;39863:1;-1:-1:-1;39838:198:0;;;39899:6;;;;;;;;;-1:-1:-1;;;;;39899:6:0;-1:-1:-1;;;;;39899:21:0;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39885:37;;39838:198;;;39997:18;;:22;;40018:1;;39997:22;:::i;:::-;39991:29;;:1;:29;:::i;:::-;39977:43;;:11;:43;:::i;:::-;39963:57;;39838:198;40079:11;:27;40091:11;40103:1;40091:14;;;;;;-1:-1:-1;;;40091:14:0;;;;;;;;;;;;;;;;;40079:27;;;;;;;;;;;:59;;;40050:12;:26;;:88;;;;40174:11;:27;40186:11;40198:1;40186:14;;;;;;-1:-1:-1;;;40186:14:0;;;;;;;;;;;;;;;;;40174:27;;;;;;;;;;;:33;;40153:12;:18;;:54;;;;;;:::i;:::-;;;;;;:::i;:::-;;38641:1578;;40229:13;;;:27;;;40267:9;:11;;;:9;:11;;;:::i;:::-;;;;-1:-1:-1;;40311:5:0;;:58;;-1:-1:-1;;;40311:58:0;;40330:10;40311:58;;;10937:34:1;40350:4:0;10987:18:1;;;10980:43;11039:18;;;11032:34;;;-1:-1:-1;;;;;40311:5:0;;;;:18;;10849::1;;40311:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40289:124;;;;-1:-1:-1;;;40289:124:0;;18045:2:1;40289:124:0;;;18027:21:1;18084:2;18064:18;;;18057:30;-1:-1:-1;;;18103:18:1;;;18096:46;18159:18;;40289:124:0;18017:166:1;40289:124:0;40484:55;;;22417:25:1;;;22473:2;22458:18;;22451:34;;;22501:18;;;22494:34;;;-1:-1:-1;;;;;22564:55:1;;22559:2;22544:18;;22537:83;40484:55:0;;22404:3:1;22389:19;40484:55:0;;;;;;;;37305:3242;;;;;;;;;:::o;55658:138::-;55771:17;;;;:10;:17;;;;;;;;;55764:24;;;;;;;;;;;;;;;;;55735:16;;55764:24;;;55771:17;55764:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55658:138;;;:::o;26017:227::-;26134:11;26186:6;;:50;;-1:-1:-1;;;26186:50:0;;;;;14310:25:1;;;14351:18;;;14344:34;;;26134:11:0;;-1:-1:-1;;;;;26186:6:0;;:28;;14283:18:1;;26186:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26179:57;;;;26017:227;;;;;;:::o;30498:184::-;30605:4;30634:6;;:40;;-1:-1:-1;;;30634:40:0;;;;;14310:25:1;;;14351:18;;;14344:34;;;-1:-1:-1;;;;;30634:6:0;;;;:18;;14283::1;;30634:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30627:47;30498:184;-1:-1:-1;;;30498:184:0:o;44405:3886::-;44546:22;44571:20;;;:8;:20;;;;;44610:19;;;;:24;44602:66;;;;-1:-1:-1;;;44602:66:0;;16908:2:1;44602:66:0;;;16890:21:1;16947:2;16927:18;;;16920:30;16986:31;16966:18;;;16959:59;17035:18;;44602:66:0;16880:179:1;44602:66:0;44715:9;;44701:10;:23;;:41;;;;;44741:1;44728:10;:14;44701:41;44679:110;;;;-1:-1:-1;;;44679:110:0;;21393:2:1;44679:110:0;;;21375:21:1;21432:2;21412:18;;;21405:30;-1:-1:-1;;;21451:18:1;;;21444:49;21510:18;;44679:110:0;21365:169:1;44679:110:0;45043:19;;;;45035:27;;:5;:27;:::i;:::-;44995:19;;;;44977:37;;:15;:37;:::i;:::-;:85;;:156;;;;45124:9;45101;:19;;;45083:15;:37;;;;:::i;:::-;:50;;44977:156;44955:237;;;;-1:-1:-1;;;44955:237:0;;17685:2:1;44955:237:0;;;17667:21:1;17724:2;17704:18;;;17697:30;17763:33;17743:18;;;17736:61;17814:18;;44955:237:0;17657:181:1;44955:237:0;45526:35;;;;45480:30;;;;45526:22;;;45430:34;45406:21;;45526:35;45430:80;;;:::i;:::-;:131;;;;:::i;:::-;45690:32;;;;45647:27;;;;45690:19;;;45600:31;45406:155;;-1:-1:-1;45572:25:0;;45600:74;;45647:27;45600:74;:::i;:::-;:122;;;;:::i;:::-;45856:35;;;;45810:30;;;;45856:22;;;45760:34;45572:150;;-1:-1:-1;45733:24:0;;45760:80;;45810:30;45760:80;:::i;:::-;:131;;;;:::i;:::-;46008:28;;;;45969:23;;;;46008:15;;;45926:27;45733:158;;-1:-1:-1;45902:21:0;;45926:66;;45969:23;45926:66;:::i;:::-;:110;;;;:::i;:::-;45902:134;-1:-1:-1;46085:18:0;46081:66;;46120:15;;;;:::i;:::-;;;;46081:66;46161:22;46157:74;;46200:19;;;;:::i;:::-;;;;46157:74;46245:21;46241:72;;46283:18;;;;:::i;:::-;;;;46241:72;46327:18;46323:66;;46362:15;;;;:::i;:::-;;;;46323:66;46741:15;;;:27;46462:26;;46779:13;;46741:34;;46771:4;46741:34;:::i;:::-;46740:52;;;;:::i;:::-;46661:22;;;:34;46706:16;;46661:41;;46698:4;46661:41;:::i;:::-;46660:62;;;;:::i;:::-;46583:19;;;:31;46625:17;;46583:38;;46617:4;46583:38;:::i;:::-;46582:60;;;;:::i;:::-;46493:22;;;:34;46551:13;;46493:54;;46543:4;46493:54;:::i;:::-;46492:72;;;;:::i;:::-;46491:152;;;;:::i;:::-;:232;;;;:::i;:::-;:302;;;;:::i;:::-;46462:331;;46804:22;47101:13;47067:9;:15;;:23;;;47093:4;47067:30;;;;:::i;:::-;47066:48;;;;:::i;:::-;46991:30;;;;47032:16;;46991:37;;47024:4;46991:37;:::i;:::-;46990:58;;;;:::i;:::-;46917:27;;;;46955:17;;46917:34;;46947:4;46917:34;:::i;:::-;46916:56;;;;:::i;:::-;46831:30;;;;46885:13;;46831:37;;46864:4;46831:37;:::i;:::-;46830:68;;;;:::i;:::-;46829:144;;;;:::i;:::-;:220;;;;:::i;:::-;:286;;;;:::i;:::-;46804:311;;47126:22;47443:13;47404:9;:15;;:28;;;47435:4;47404:35;;;;:::i;:::-;47403:53;;;;:::i;:::-;47323:35;;;;47369:16;;47323:42;;47361:4;47323:42;:::i;:::-;47322:63;;;;:::i;:::-;47244:32;;;;47287:17;;47244:39;;47279:4;47244:39;:::i;:::-;47243:61;;;;:::i;:::-;47153:35;;;;47212:13;;47153:42;;47191:4;47153:42;:::i;:::-;47152:73;;;;:::i;:::-;47151:154;;;;:::i;:::-;:235;;;;:::i;:::-;:306;;;;:::i;:::-;47126:331;-1:-1:-1;47586:31:0;47126:331;47586:14;:31;:::i;:::-;47565:18;:52;47561:458;;;47634:16;;;:36;;47653:17;;47634:16;-1:-1:-1;;47634:36:0;;47653:17;47634:36;;;;;;47561:458;;;47804:35;47825:14;47804:18;:35;:::i;:::-;47787:14;:52;47783:236;;;47856:16;;;:36;;47875:17;;47856:16;-1:-1:-1;;47856:36:0;;47875:17;47856:36;;47783:236;47970:16;;;:37;;-1:-1:-1;;47970:37:0;;;;;47783:236;48053:15;48031:19;;;:37;48167:16;;;;48232:23;;;;:11;:23;;;;;;;:40;;;48116:167;;;;;;48142:10;;48167:16;;;;;;-1:-1:-1;;;;;48198:19:0;;;;;;;48232:40;;48116:167;:::i;52555:164::-;-1:-1:-1;;;;;52680:31:0;;;;;;:20;:31;;;;;;;;;52673:38;;;;;;;;;;;;;;;;;52644:16;;52673:38;;;52680:31;52673:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52555:164;;;:::o;53079:262::-;53162:7;53235:23;;;:11;:23;;;;;53277:10;;53289:12;;;;53313:19;;;;53303:8;;;53269:64;;53162:7;;53180:12;;53162:7;;53235:23;;53277:10;;53289:12;;-1:-1:-1;;;;;53313:19:0;;;;53303:8;;53269:64;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53079:262;;;;;:::o;20723:547::-;20831:19;20852:27;20898:11;20911:14;20929:79;20964:8;20987:10;20929:20;:79::i;:::-;20897:111;;;;21024:6;21019:54;;21059:1;21047:14;;;;;;;;;;;;;;;;;;;;;21019:54;21105:47;21135:8;21145:6;21105:29;:47::i;:::-;21083:69;;21172:43;21185:8;21195:19;21172:12;:43::i;:::-;21163:52;;21226:36;;20723:547;;;;;:::o;28998:183::-;29099:7;29131:6;;:42;;-1:-1:-1;;;29131:42:0;;;;;13231:25:1;;;-1:-1:-1;;;;;29131:6:0;;;;:32;;13204:18:1;;29131:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29124:49;28998:183;-1:-1:-1;;28998:183:0:o;54395:1054::-;54502:7;54511:18;;:::i;:::-;-1:-1:-1;;54531:4:0;54592:20;;;:8;:20;;;;;;;;;54645:17;;54623:818;;;;;;;54696:12;;;;54623:818;;54727:12;;;;54623:818;;;;;;;54758:14;;;;54623:818;;;;;;;54791:6;;;;54623:818;;;;54816:12;;;;54623:818;;;;54847:15;;;:27;54623:818;;;;54893:23;;;;54623:818;;;;54935:28;;;;54623:818;;;;54982:8;;;:20;54623:818;;;;;;;;55021:16;;;;54623:818;;;;55056:21;;;;54623:818;;;;55096:12;;;:24;54623:818;;;;55139:20;;;;54623:818;;;;55178:25;;;;54623:818;;;;55222:15;;;:27;54623:818;;;;55268:23;;;;54623:818;;;;55310:28;;;;54623:818;;;;55368:11;;;54645:17;;54623:818;;55368:11;;;;;55394:9;;;;55418:12;;;;-1:-1:-1;;;;;55418:12:0;;54395:1054::o;21614:296::-;21744:27;21823:6;;:79;;-1:-1:-1;;;21823:79:0;;;;;14310:25:1;;;14351:18;;;14344:34;;;21723:19:0;;21744:27;-1:-1:-1;;;;;21823:6:0;;:20;;14283:18:1;;21823:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;21823:79:0;;;;;;;;;;;;:::i;:::-;21789:113;;;;-1:-1:-1;21614:296:0;-1:-1:-1;;;;21614:296:0:o;52436:111::-;52482:7;52536:2;52510:6;;;;;;;;;-1:-1:-1;;;;;52510:6:0;-1:-1:-1;;;;;52510:21:0;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:28;;;;:::i;:::-;52502:37;;52436:111;:::o;30927:194::-;31072:6;;:41;;-1:-1:-1;;;31072:41:0;;;;;14310:25:1;;;14351:18;;;14344:34;;;31035:12:0;;-1:-1:-1;;;;;31072:6:0;;:19;;14283:18:1;;31072:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;31072:41:0;;;;;;;;;;;;:::i;29982:215::-;30103:7;30135:6;;:54;;-1:-1:-1;;;30135:54:0;;;;;14310:25:1;;;14351:18;;;14344:34;;;-1:-1:-1;;;;;30135:6:0;;;;:36;;14283:18:1;;30135:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;48579:2266::-;48839:9;;48825:10;:23;;:41;;;;;48865:1;48852:10;:14;48825:41;48803:110;;;;-1:-1:-1;;;48803:110:0;;21393:2:1;48803:110:0;;;21375:21:1;21432:2;21412:18;;;21405:30;-1:-1:-1;;;21451:18:1;;;21444:49;21510:18;;48803:110:0;21365:169:1;48803:110:0;48924:22;48949:20;;;:8;:20;;;;;48988:19;;;;:24;48980:66;;;;-1:-1:-1;;;48980:66:0;;16908:2:1;48980:66:0;;;16890:21:1;16947:2;16927:18;;;16920:30;16986:31;16966:18;;;16959:59;17035:18;;48980:66:0;16880:179:1;48980:66:0;49082:10;49066:27;;;;:15;;;:27;;;;;;;;49065:28;49057:65;;;;-1:-1:-1;;;49057:65:0;;19925:2:1;49057:65:0;;;19907:21:1;19964:2;19944:18;;;19937:30;20003:26;19983:18;;;19976:54;20047:18;;49057:65:0;19897:174:1;49057:65:0;49257:10;49241:27;;;;:15;;;:27;;;;;;:34;;-1:-1:-1;;49241:34:0;49271:4;49241:34;;;49310:5;;:27;;-1:-1:-1;;;49310:27:0;;;;;10257:74:1;;;;49241:27:0;;-1:-1:-1;;;;;49310:5:0;;;;:15;;10230:18:1;;49310:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49411:6;;:46;;-1:-1:-1;;;49411:46:0;;49446:10;49411:46;;;10257:74:1;49286:51:0;;-1:-1:-1;49351:22:0;;;;-1:-1:-1;;;;;49411:6:0;;:34;;10230:18:1;;49411:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49348:109;;;;;;;;;;49502:14;49485;:31;;;;:::i;:::-;49468:48;;;;:::i;:::-;;;49531:13;49527:1197;;;49600:13;49561:9;:22;;:35;;;:52;;;;;;;:::i;:::-;;;;-1:-1:-1;;49664:6:0;;:65;;-1:-1:-1;;;49664:65:0;;49718:10;49664:65;;;10257:74:1;-1:-1:-1;;;;;49664:6:0;;;;:53;;10230:18:1;;49664:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49628:32;;;:101;;:32;;:101;;;;;:::i;:::-;;;;-1:-1:-1;49776:24:0;;-1:-1:-1;49789:10:0;49776:12;:24::i;:::-;49744:28;;;:56;;:28;;:56;;;;;:::i;:::-;;;;-1:-1:-1;;49833:12:0;;-1:-1:-1;;;;;49833:12:0;49819:10;:26;49815:107;;;49905:1;49866:9;:22;;:35;;;:40;;;;;;;:::i;:::-;;;;-1:-1:-1;;49815:107:0;49527:1197;;;49943:9;49939:785;;;50007:13;49969:9;:22;;:34;;;:51;;;;;;;:::i;:::-;;;;-1:-1:-1;;50070:6:0;;:65;;-1:-1:-1;;;50070:65:0;;50124:10;50070:65;;;10257:74:1;-1:-1:-1;;;;;50070:6:0;;;;:53;;10230:18:1;;50070:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50035:19;;;:100;;:31;;:100;;;;;:::i;:::-;;;;-1:-1:-1;50181:24:0;;-1:-1:-1;50194:10:0;50181:12;:24::i;:::-;50150:15;;;:55;;:27;;:55;;;;;:::i;:::-;;;;-1:-1:-1;;50238:12:0;;-1:-1:-1;;;;;50238:12:0;50224:10;:26;50220:106;;;50309:1;50271:9;:22;;:34;;;:39;;;;;;;:::i;49939:785::-;50392:13;50358:9;:22;;:30;;;:47;;;;;;;:::i;:::-;;;;-1:-1:-1;;50451:6:0;;:79;;-1:-1:-1;;;50451:79:0;;50505:10;50451:79;;;10257:74:1;-1:-1:-1;;;;;50451:6:0;;;;:35;;10230:18:1;;50451:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50420:27;;;:110;;:27;;:110;;;;;:::i;:::-;;;;-1:-1:-1;50572:24:0;;-1:-1:-1;50585:10:0;50572:12;:24::i;:::-;50545:23;;;:51;;:23;;:51;;;;;:::i;:::-;;;;-1:-1:-1;;50629:12:0;;-1:-1:-1;;;;;50629:12:0;50615:10;:26;50611:102;;;50696:1;50662:9;:22;;:30;;;:35;;;;;;;:::i;:::-;;;;-1:-1:-1;;50611:102:0;50753:10;50734:30;;;;:18;:30;;;;;:32;;;;;;:::i;:::-;;;;-1:-1:-1;;50782:55:0;;;21940:25:1;;;22008:14;;22001:22;21996:2;21981:18;;21974:50;50811:10:0;22040:18:1;;;22033:83;22159:14;;22152:22;22147:2;22132:18;;22125:50;50782:55:0;;;;;;;21927:3:1;50782:55:0;;;48579:2266;;;;;;;:::o;29549:209::-;29667:7;29699:6;;:51;;-1:-1:-1;;;29699:51:0;;;;;14310:25:1;;;14351:18;;;14344:34;;;-1:-1:-1;;;;;29699:6:0;;;;:29;;14283:18:1;;29699:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;22357:3213::-;22473:11;22486:14;22518;22535:35;22561:8;22535:25;:35::i;:::-;22518:52;-1:-1:-1;22585:11:0;22581:34;;22606:5;22613:1;22598:17;;;;;;;22581:34;22626:8;;;;:::i;:::-;;-1:-1:-1;22660:4:0;;-1:-1:-1;22645:12:0;;22626:8;22645:12;22914:45;22944:8;22626;22914:29;:45::i;:::-;22892:67;;22997:10;22974:19;:33;22970:56;;23017:5;23024:1;23009:17;;;;;;;;;;;;22970:56;23059:47;23089:8;23099:6;23059:29;:47::i;:::-;23037:69;;23143:10;23121:19;:32;23117:132;;;23232:5;23222:15;;23117:132;23339:7;23332:1374;;;23391:1;23374:13;23381:6;23374:4;:13;:::i;:::-;23373:19;;;;:::i;:::-;23363:29;;23429:97;23477:8;23504:7;23429:29;:97::i;:::-;23407:119;;23567:10;23545:19;:32;23541:1154;;;23647:17;23667:113;23719:8;23750:11;23760:1;23750:7;:11;:::i;23667:113::-;23647:133;;23816:10;23803:9;:23;23799:279;;23921:5;23911:15;;23799:279;;;24047:11;24057:1;24047:7;:11;:::i;:::-;24040:18;;23799:279;23541:1154;;;;24163:17;24183:113;24235:8;24266:11;:7;24276:1;24266:11;:::i;24183:113::-;24163:133;;24331:10;24319:9;:22;24315:365;;;24436:5;;-1:-1:-1;24464:9:0;;;;:::i;:::-;;;;24518;24496:31;;24315:365;;;24649:11;:7;24659:1;24649:11;:::i;:::-;24640:20;;24315:365;23541:1154;;23332:1374;;;24776:42;24788:8;24798:19;24776:11;:42::i;:::-;24771:792;;24890:4;24896:7;24882:22;;;;;;;;;;;;24771:792;25029:42;25041:8;25051:19;25029:11;:42::i;:::-;:62;;;;;25085:6;25075:7;:16;25029:62;25004:297;;;25126:9;;;;:::i;:::-;;;;25176:109;25228:8;25259:7;25176:29;:109::i;:::-;25154:131;;25004:297;;;25348:6;25337:7;:17;:63;;;;;25358:42;25370:8;25380:19;25358:11;:42::i;:::-;25315:153;;;25443:5;25450:1;25435:17;;;;;;;;;;;;25315:153;25537:4;25543:7;25529:22;;;;;;;;;;;;31754:649;31994:17;;:34;;-1:-1:-1;;;31994:34:0;;;;;13231:25:1;;;31867:13:0;;;;;;;;-1:-1:-1;;;;;31994:17:0;;;;:29;;13204:18:1;;31994:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31975:53;-1:-1:-1;32039:24:0;32102:81;31975:53;32153:19;:15;32171:1;32153:19;:::i;32102:81::-;32074:109;-1:-1:-1;32074:109:0;-1:-1:-1;32198:15:0;32194:66;;32238:1;32241;32244:3;32230:18;;;;;;;;;;32194:66;32270:18;32291:23;32302:11;32291:10;:23::i;:::-;32270:44;-1:-1:-1;32391:3:0;;-1:-1:-1;;;;31754:649:0;;;;;;:::o;40722:3544::-;40872:22;40897:20;;;:8;:20;;;;;40964:9;;40950:23;;;;;:41;;;40990:1;40977:10;:14;40950:41;40928:115;;;;-1:-1:-1;;;40928:115:0;;19213:2:1;40928:115:0;;;19195:21:1;19252:2;19232:18;;;19225:30;19291:26;19271:18;;;19264:54;19335:18;;40928:115:0;19185:174:1;40928:115:0;41063:18;;;;;;41062:19;41054:62;;;;-1:-1:-1;;;41054:62:0;;19566:2:1;41054:62:0;;;19548:21:1;19605:2;19585:18;;;19578:30;19644:32;19624:18;;;19617:60;19694:18;;41054:62:0;19538:180:1;41054:62:0;41157:1;41135:9;:19;;;:23;41127:56;;;;-1:-1:-1;;;41127:56:0;;21044:2:1;41127:56:0;;;21026:21:1;21083:2;21063:18;;;21056:30;21122:22;21102:18;;;21095:50;21162:18;;41127:56:0;21016:170:1;41127:56:0;41379:19;;;;41343:24;;41332:36;;;;:10;:36;;;;;:43;:66;41310:138;;;;-1:-1:-1;;;41310:138:0;;20278:2:1;41310:138:0;;;20260:21:1;20317:2;20297:18;;;20290:30;20356:24;20336:18;;;20329:52;20398:18;;41310:138:0;20250:172:1;41310:138:0;41581:6;41558:9;:19;;;41540:15;:37;;;;:::i;:::-;:47;;41518:148;;;;-1:-1:-1;;;41518:148:0;;18793:2:1;41518:148:0;;;18775:21:1;18832:2;18812:18;;;18805:30;18871:34;18851:18;;;18844:62;-1:-1:-1;;;18922:18:1;;;18915:49;18981:19;;41518:148:0;18765:241:1;41518:148:0;41677:18;;;:25;;-1:-1:-1;;41677:25:0;41698:4;41677:25;;;:18;41744:23;;;:11;:23;;;;;;;;41795:20;;41778:38;;:16;:38;;;;;:40;;41744:23;;41778:40;;;:::i;:::-;;;;-1:-1:-1;41829:10:0;;-1:-1:-1;41829:10:0;41900:17;41880:16;;;;;;;;;:37;;;;;;-1:-1:-1;;;41880:37:0;;;;;;;;;;41876:2314;;;42093:24;;42082:36;;;;:10;:36;;;;;:43;;-1:-1:-1;42054:669:0;42144:6;;42054:669;;42229:24;;42218:36;;;;:10;:36;;;;;42255:6;42260:1;42255:2;:6;:::i;:::-;42218:44;;;;;;-1:-1:-1;;;42218:44:0;;;;;;;;;;;;;;;;;42208:54;;42293:8;:17;42302:7;42293:17;;;;;;;;;;;42281:29;;42451:2;42457:1;42451:7;42447:192;;;42483:5;;42524:19;;;;42570:26;;;;;42483:136;;-1:-1:-1;;;42483:136:0;;-1:-1:-1;;;;;42524:19:0;;;;;;42483:136;;;11251:74:1;;;;11341:18;;;11334:34;42483:5:0;;;:14;;11224:18:1;;42483:136:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;42447:192;42657:5;;42672:19;;;;42693:13;;;;;42657:50;;-1:-1:-1;;;42657:50:0;;-1:-1:-1;;;;;42672:19:0;;;;;;42657:50;;;11251:74:1;;;;11341:18;;;11334:34;42657:5:0;;;:14;;11224:18:1;;42657:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;42169:4:0;;;;:::i;:::-;;;;42054:669;;;41876:2314;;;42764:18;42744:16;;;;;;;;;:38;;;;;;-1:-1:-1;;;42744:38:0;;;;;;;;;;42740:1450;;;42966:24;;42955:36;;;;:10;:36;;;;;:43;;-1:-1:-1;42927:341:0;43017:6;;42927:341;;43102:24;;43091:36;;;;:10;:36;;;;;43128:6;43133:1;43128:2;:6;:::i;:::-;43091:44;;;;;;-1:-1:-1;;;43091:44:0;;;;;;;;;;;;;;;;;;;;;;43166:17;;;:8;:17;;;;;;;;43202:5;;43217:19;;;;43238:13;;;;;43202:50;;-1:-1:-1;;;43202:50:0;;-1:-1:-1;;;;;43217:19:0;;;;;;43202:50;;;11251:74:1;;;;11341:18;;;11334:34;;;;43166:17:0;;-1:-1:-1;43091:44:0;;-1:-1:-1;43202:5:0;;:14;;11224:18:1;;43202:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;43042:4:0;;;;:::i;:::-;;;;42927:341;;;43348:5;;;43381:29;;;;43429:26;;;;;43348:122;;-1:-1:-1;;;43348:122:0;;-1:-1:-1;;;;;43381:29:0;;;43348:122;;;11251:74:1;;;;11341:18;;;11334:34;43348:5:0;;;:14;;11224:18:1;;43348:122:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;42740:1450;;;43512:17;43492:16;;;;;;;;;:37;;;;;;-1:-1:-1;;;43492:37:0;;;;;;;;;;43488:702;;;43758:24;;43677:23;43747:36;;;:10;:36;;;;;:43;;-1:-1:-1;43719:323:0;43809:6;;43719:323;;43894:24;;43883:36;;;;:10;:36;;;;;43920:6;43925:1;43920:2;:6;:::i;:::-;43883:44;;;;;;-1:-1:-1;;;43883:44:0;;;;;;;;;;;;;;;;;43873:54;;43958:8;:17;43967:7;43958:17;;;;;;;;;;;43946:29;;44013:9;:13;;;43994:32;;;;;:::i;:::-;;-1:-1:-1;43834:4:0;;;;:::i;:::-;;;;43719:323;;;44075:26;;;;44056:45;;;;:::i;:::-;44116:5;;;44131:29;;;;44116:62;;-1:-1:-1;;;44116:62:0;;-1:-1:-1;;;;;44131:29:0;;;44116:62;;;11251:74:1;11341:18;;;11334:34;;;44056:45:0;;-1:-1:-1;44116:5:0;;:14;;11224:18:1;;44116:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;43488:702;;44230:20;;;;:8;:20;;;;;;;:27;;;44205:53;;;;;;44230:20;;:27;;;;;;44205:53;:::i;:::-;;;;;;;;40722:3544;;;;;:::o;26781:1988::-;26979:22;;27096:16;;27137:89;27172:8;27195:20;27208:7;27195:10;:20;:::i;27137:89::-;27095:131;;;;27276:11;27271:86;;27312:14;;;27324:1;27312:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27328:16:0;;;27342:1;27328:16;;;;;;;;27304:41;;-1:-1:-1;27328:16:0;-1:-1:-1;27304:41:0;;-1:-1:-1;;27304:41:0;27271:86;27367:17;27467:43;27489:8;27499:10;27467:21;:43::i;:::-;27440:70;;-1:-1:-1;27440:70:0;-1:-1:-1;27440:70:0;27560:86;;27601:14;;;27613:1;27601:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27617:16:0;;;27631:1;27617:16;;;;;;;;27593:41;;-1:-1:-1;27617:16:0;-1:-1:-1;27593:41:0;;-1:-1:-1;;;27593:41:0;27560:86;27656:17;27688:14;27717:37;27771:9;27757:24;;;;;;-1:-1:-1;;;27757:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27757:24:0;;27717:64;;27859:439;27878:9;27866;:21;:61;;;;-1:-1:-1;27916:11:0;27907:6;27891:13;:9;27903:1;27891:13;:::i;:::-;:22;;;;:::i;:::-;:36;27866:61;27859:439;;;27944:27;27974:108;28022:8;28049:18;28061:6;28049:9;:18;:::i;27974:108::-;27944:138;;28102:42;28114:8;28124:19;28102:11;:42::i;:::-;28097:167;;28199:19;28165:20;28186:9;28165:31;;;;;;-1:-1:-1;;;28165:31:0;;;;;;;;;;;;;;;;;;:53;28237:11;;;;:::i;:::-;;;;28097:167;28278:8;;;;:::i;:::-;;;;27859:439;;;;28310:27;28352:9;28340:22;;;;;;-1:-1:-1;;;28340:22:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28310:52;;28373:33;28423:9;28409:24;;;;;;-1:-1:-1;;;28409:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28409:24:0;;28373:60;;28506:10;28501:211;28527:9;28522:2;:14;28501:211;;;28582:20;28619:2;28603:13;28615:1;28603:9;:13;:::i;:::-;:18;;;;:::i;:::-;28582:40;;;;;;-1:-1:-1;;;28582:40:0;;;;;;;;;;;;;;;28559:16;28576:2;28559:20;;;;;;-1:-1:-1;;;28559:20:0;;;;;;;;;;;;;;:63;;;;;28656:44;28669:8;28679:16;28696:2;28679:20;;;;;;-1:-1:-1;;;28679:20:0;;;;;;;;;;;;;;;28656:12;:44::i;:::-;28637:12;28650:2;28637:16;;;;;;-1:-1:-1;;;28637:16:0;;;;;;;;;;;;;;:63;;;;28538:4;;;;;:::i;:::-;;;;28501:211;;;-1:-1:-1;28730:12:0;;-1:-1:-1;28744:16:0;-1:-1:-1;;;;;;;26781:1988:0;;;;;;;;:::o;56446:1093::-;56517:21;56604:31;56637:18;56659:99;56687:19;;56739:8;56721:15;:26;;;;:::i;56659:99::-;56603:155;;-1:-1:-1;56603:155:0;-1:-1:-1;56773:14:0;;56769:763;;56804:30;56866:18;56837:92;;;;;;;;;;;;:::i;:::-;56804:125;;57029:10;57024:497;57050:13;:20;57045:2;:25;57024:497;;;57098:13;57113:24;57141:13;57155:2;57141:17;;;;;;-1:-1:-1;;;57141:17:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;57141:44:0;57324:5;57212:144;;;;;;;-1:-1:-1;;;;;10275:55:1;;;;10257:74;;10245:2;10230:18;;10212:125;57212:144:0;;;;-1:-1:-1;;57212:144:0;;;;;;;;;;;;;;-1:-1:-1;;;;;57212:144:0;-1:-1:-1;;;57212:144:0;;;57141:238;;;57212:144;57141:238;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57097:282;;;;57402:8;57398:108;;;57463:11;57452:34;;;;;;;;;;;;:::i;:::-;57435:51;;;;:::i;:::-;;;57398:108;57024:497;;57072:4;;;;;:::i;:::-;;;;57024:497;;;;56769:763;;56446:1093;;;;;:::o;32599:236::-;32686:15;;32719:109;32745:2;:9;32740:2;:14;32719:109;;;32809:2;32812;32809:6;;;;;;-1:-1:-1;;;32809:6:0;;;;;;;;;;;;;;;32787:13;:7;32797:3;32787:13;:::i;:::-;:29;;;;:::i;:::-;32777:39;-1:-1:-1;32756:4:0;;;;:::i;:::-;;;;32719:109;;;;32599:236;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;14:762:1;;118:3;111:4;103:6;99:17;95:27;85:2;;140:5;133;126:20;85:2;180:6;167:20;206:4;230:60;246:43;286:2;246:43;:::i;:::-;230:60;:::i;:::-;312:3;336:2;331:3;324:15;364:2;359:3;355:12;348:19;;399:2;391:6;387:15;451:3;446:2;440;437:1;433:10;425:6;421:23;417:32;414:41;411:2;;;472:5;465;458:20;411:2;498:5;512:235;526:2;523:1;520:9;512:235;;;597:3;584:17;614:28;636:5;614:28;:::i;:::-;655:18;;693:12;;;;725;;;;544:1;537:9;512:235;;;-1:-1:-1;765:5:1;;75:701;-1:-1:-1;;;;;;;75:701:1:o;781:512::-;;887:3;880:4;872:6;868:17;864:27;854:2;;909:5;902;895:20;854:2;942:6;936:13;968:18;964:2;961:26;958:2;;;990:18;;:::i;:::-;1034:55;1077:2;1058:13;;-1:-1:-1;;1054:27:1;1083:4;1050:38;1034:55;:::i;:::-;1114:2;1105:7;1098:19;1160:3;1153:4;1148:2;1140:6;1136:15;1132:26;1129:35;1126:2;;;1181:5;1174;1167:20;1126:2;1198:64;1259:2;1252:4;1243:7;1239:18;1232:4;1224:6;1220:17;1198:64;:::i;:::-;1280:7;844:449;-1:-1:-1;;;;844:449:1:o;1298:257::-;;1410:2;1398:9;1389:7;1385:23;1381:32;1378:2;;;1431:6;1423;1416:22;1378:2;1475:9;1462:23;1494:31;1519:5;1494:31;:::i;1560:261::-;;1683:2;1671:9;1662:7;1658:23;1654:32;1651:2;;;1704:6;1696;1689:22;1651:2;1741:9;1735:16;1760:31;1785:5;1760:31;:::i;1826:1012::-;;1952:2;1995;1983:9;1974:7;1970:23;1966:32;1963:2;;;2016:6;2008;2001:22;1963:2;2054:9;2048:16;2087:18;2079:6;2076:30;2073:2;;;2124:6;2116;2109:22;2073:2;2152:22;;2205:4;2197:13;;2193:27;-1:-1:-1;2183:2:1;;2239:6;2231;2224:22;2183:2;2273;2267:9;2296:60;2312:43;2352:2;2312:43;:::i;2296:60::-;2378:3;2402:2;2397:3;2390:15;2430:2;2425:3;2421:12;2414:19;;2461:2;2457;2453:11;2509:7;2504:2;2498;2495:1;2491:10;2487:2;2483:19;2479:28;2476:41;2473:2;;;2535:6;2527;2520:22;2473:2;2562:6;2553:15;;2577:231;2591:2;2588:1;2585:9;2577:231;;;2655:3;2649:10;2672:31;2697:5;2672:31;:::i;:::-;2716:18;;2609:1;2602:9;;;;;2754:12;;;;2786;;2577:231;;;-1:-1:-1;2827:5:1;1932:906;-1:-1:-1;;;;;;;1932:906:1:o;2843:1430::-;;;;3058:2;3046:9;3037:7;3033:23;3029:32;3026:2;;;3079:6;3071;3064:22;3026:2;3124:9;3111:23;3153:18;3194:2;3186:6;3183:14;3180:2;;;3215:6;3207;3200:22;3180:2;3258:6;3247:9;3243:22;3233:32;;3303:7;3296:4;3292:2;3288:13;3284:27;3274:2;;3330:6;3322;3315:22;3274:2;3371;3358:16;3393:4;3417:60;3433:43;3473:2;3433:43;:::i;3417:60::-;3499:3;3523:2;3518:3;3511:15;3551:2;3546:3;3542:12;3535:19;;3582:2;3578;3574:11;3630:7;3625:2;3619;3616:1;3612:10;3608:2;3604:19;3600:28;3597:41;3594:2;;;3656:6;3648;3641:22;3594:2;3683:6;3674:15;;3698:163;3712:2;3709:1;3706:9;3698:163;;;3769:17;;3757:30;;3730:1;3723:9;;;;;3807:12;;;;3839;;3698:163;;;-1:-1:-1;3880:5:1;-1:-1:-1;;3923:18:1;;3910:32;;-1:-1:-1;;3954:16:1;;;3951:2;;;3988:6;3980;3973:22;3951:2;4016:60;4068:7;4057:8;4046:9;4042:24;4016:60;:::i;:::-;4006:70;;4129:2;4118:9;4114:18;4101:32;4085:48;;4158:2;4148:8;4145:16;4142:2;;;4179:6;4171;4164:22;4142:2;;4207:60;4259:7;4248:8;4237:9;4233:24;4207:60;:::i;:::-;4197:70;;;3016:1257;;;;;:::o;4278:255::-;;4398:2;4386:9;4377:7;4373:23;4369:32;4366:2;;;4419:6;4411;4404:22;4366:2;4456:9;4450:16;4475:28;4497:5;4475:28;:::i;4538:538::-;;;;4701:2;4689:9;4680:7;4676:23;4672:32;4669:2;;;4722:6;4714;4707:22;4669:2;4759:9;4753:16;4778:28;4800:5;4778:28;:::i;:::-;4874:2;4859:18;;4853:25;4825:5;;-1:-1:-1;4901:18:1;4890:30;;4887:2;;;4938:6;4930;4923:22;4887:2;4966:60;5018:7;5009:6;4998:9;4994:22;4966:60;:::i;:::-;4956:70;;;5066:2;5055:9;5051:18;5045:25;5035:35;;4659:417;;;;;:::o;5081:316::-;;;5218:2;5206:9;5197:7;5193:23;5189:32;5186:2;;;5239:6;5231;5224:22;5186:2;5276:9;5270:16;5295:28;5317:5;5295:28;:::i;:::-;5387:2;5372:18;;;;5366:25;5342:5;;5366:25;;-1:-1:-1;;;5176:221:1:o;5402:190::-;;5514:2;5502:9;5493:7;5489:23;5485:32;5482:2;;;5535:6;5527;5520:22;5482:2;-1:-1:-1;5563:23:1;;5472:120;-1:-1:-1;5472:120:1:o;5597:194::-;;5720:2;5708:9;5699:7;5695:23;5691:32;5688:2;;;5741:6;5733;5726:22;5688:2;-1:-1:-1;5769:16:1;;5678:113;-1:-1:-1;5678:113:1:o;5796:258::-;;;5925:2;5913:9;5904:7;5900:23;5896:32;5893:2;;;5946:6;5938;5931:22;5893:2;-1:-1:-1;;5974:23:1;;;6044:2;6029:18;;;6016:32;;-1:-1:-1;5883:171:1:o;6059:395::-;;;;;6222:3;6210:9;6201:7;6197:23;6193:33;6190:2;;;6244:6;6236;6229:22;6190:2;-1:-1:-1;;6272:23:1;;;6342:2;6327:18;;6314:32;;-1:-1:-1;6393:2:1;6378:18;;6365:32;;6444:2;6429:18;6416:32;;-1:-1:-1;6180:274:1;-1:-1:-1;6180:274:1:o;6459:355::-;;6591:2;6579:9;6570:7;6566:23;6562:32;6559:2;;;6612:6;6604;6597:22;6559:2;6650:9;6644:16;6683:18;6675:6;6672:30;6669:2;;;6720:6;6712;6705:22;6669:2;6748:60;6800:7;6791:6;6780:9;6776:22;6748:60;:::i;7213:325::-;;;7342:2;7330:9;7321:7;7317:23;7313:32;7310:2;;;7363:6;7355;7348:22;7310:2;7404:9;7391:23;7381:33;;7464:2;7453:9;7449:18;7436:32;7477:31;7502:5;7477:31;:::i;:::-;7527:5;7517:15;;;7300:238;;;;;:::o;7543:454::-;;;;7683:2;7671:9;7662:7;7658:23;7654:32;7651:2;;;7704:6;7696;7689:22;7651:2;7745:9;7732:23;7722:33;;7805:2;7794:9;7790:18;7777:32;7818:28;7840:5;7818:28;:::i;:::-;7865:5;-1:-1:-1;7922:2:1;7907:18;;7894:32;7935:30;7894:32;7935:30;:::i;:::-;7984:7;7974:17;;;7641:356;;;;;:::o;8002:626::-;;;;;;;;;8244:3;8232:9;8223:7;8219:23;8215:33;8212:2;;;8266:6;8258;8251:22;8212:2;-1:-1:-1;;8294:16:1;;8350:2;8335:18;;8329:25;8394:2;8379:18;;8373:25;8438:2;8423:18;;8417:25;8482:3;8467:19;;8461:26;8527:3;8512:19;;8506:26;8572:3;8557:19;;8551:26;8617:3;8602:19;;;8596:26;8294:16;;8329:25;;-1:-1:-1;8373:25:1;;8417;;-1:-1:-1;8461:26:1;-1:-1:-1;8506:26:1;;-1:-1:-1;8551:26:1;-1:-1:-1;8596:26:1;;-1:-1:-1;8202:426:1;-1:-1:-1;8202:426:1:o;8633:437::-;;8724:5;8718:12;8751:6;8746:3;8739:19;8777:4;8806:2;8801:3;8797:12;8790:19;;8843:2;8836:5;8832:14;8864:3;8876:169;8890:6;8887:1;8884:13;8876:169;;;8951:13;;8939:26;;8985:12;;;;9020:15;;;;8912:1;8905:9;8876:169;;;-1:-1:-1;9061:3:1;;8694:376;-1:-1:-1;;;;;8694:376:1:o;9075:257::-;;9154:5;9148:12;9181:6;9176:3;9169:19;9197:63;9253:6;9246:4;9241:3;9237:14;9230:4;9223:5;9219:16;9197:63;:::i;:::-;9314:2;9293:15;-1:-1:-1;;9289:29:1;9280:39;;;;9321:4;9276:50;;9124:208;-1:-1:-1;;9124:208:1:o;9337:238::-;9419:1;9412:5;9409:12;9399:2;;9464:10;9459:3;9455:20;9452:1;9445:31;9499:4;9496:1;9489:15;9527:4;9524:1;9517:15;9399:2;9551:18;;9389:186::o;9832:274::-;;9999:6;9993:13;10015:53;10061:6;10056:3;10049:4;10041:6;10037:17;10015:53;:::i;:::-;10084:16;;;;;9969:137;-1:-1:-1;;9969:137:1:o;11379:980::-;;11665:2;11654:9;11650:18;11695:2;11684:9;11677:21;11718:6;11753;11747:13;11784:6;11776;11769:22;11822:2;11811:9;11807:18;11800:25;;11884:2;11874:6;11871:1;11867:14;11856:9;11852:30;11848:39;11834:53;;11906:4;11945:2;11937:6;11933:15;11966:4;11979:254;11993:6;11990:1;11987:13;11979:254;;;12086:2;12082:7;12070:9;12062:6;12058:22;12054:36;12049:3;12042:49;12114:39;12146:6;12137;12131:13;12114:39;:::i;:::-;12104:49;-1:-1:-1;12211:12:1;;;;12176:15;;;;12015:1;12008:9;11979:254;;;11983:3;;12281:9;12273:6;12269:22;12264:2;12253:9;12249:18;12242:50;;;;12309:44;12346:6;12338;12309:44;:::i;:::-;12301:52;11626:733;-1:-1:-1;;;;;11626:733:1:o;12364:261::-;;12543:2;12532:9;12525:21;12563:56;12615:2;12604:9;12600:18;12592:6;12563:56;:::i;13267:864::-;13581:25;;;13568:3;13553:19;;13625:2;13647:18;;;13707:6;13267:864;13741:167;13755:4;13752:1;13749:11;13741:167;;;13814:13;;13802:26;;13848:12;;;;13883:15;;;;13775:1;13768:9;13741:167;;;13745:3;;;;13959:6;13952:14;13945:22;13939:3;13928:9;13924:19;13917:51;13977:55;14027:3;14016:9;14012:19;14004:6;13977:55;:::i;:::-;-1:-1:-1;;;;;14073:6:1;14069:55;14063:3;14052:9;14048:19;14041:84;13535:596;;;;;;;;:::o;14389:481::-;;14620:6;14609:9;14602:25;14663:6;14658:2;14647:9;14643:18;14636:34;14706:3;14701:2;14690:9;14686:18;14679:31;14727:45;14767:3;14756:9;14752:19;14744:6;14727:45;:::i;:::-;14719:53;;-1:-1:-1;;;;;14812:6:1;14808:55;14803:2;14792:9;14788:18;14781:83;14592:278;;;;;;;:::o;14875:217::-;;15022:2;15011:9;15004:21;15042:44;15082:2;15071:9;15067:18;15059:6;15042:44;:::i;15097:288::-;;15272:2;15261:9;15254:21;15292:44;15332:2;15321:9;15317:18;15309:6;15292:44;:::i;:::-;15284:52;;15372:6;15367:2;15356:9;15352:18;15345:34;15244:141;;;;;:::o;22631:281::-;22818:25;;;22806:2;22791:18;;22852:54;22902:2;22887:18;;22879:6;22852:54;:::i;22917:503::-;23161:25;;;23148:3;23133:19;;23195:54;23245:2;23230:18;;23222:6;23195:54;:::i;:::-;-1:-1:-1;;;;;23358:2:1;23350:6;23346:15;23341:2;23330:9;23326:18;23319:43;23410:2;23402:6;23398:15;23393:2;23382:9;23378:18;23371:43;;23115:305;;;;;;;:::o;23425:275::-;23496:2;23490:9;23561:2;23542:13;;-1:-1:-1;;23538:27:1;23526:40;;23596:18;23581:34;;23617:22;;;23578:62;23575:2;;;23643:18;;:::i;:::-;23679:2;23672:22;23470:230;;-1:-1:-1;23470:230:1:o;23705:183::-;;23798:18;23790:6;23787:30;23784:2;;;23820:18;;:::i;:::-;-1:-1:-1;23865:1:1;23861:14;23877:4;23857:25;;23774:114::o;23893:128::-;;23964:1;23960:6;23957:1;23954:13;23951:2;;;23970:18;;:::i;:::-;-1:-1:-1;24006:9:1;;23941:80::o;24026:217::-;;24092:1;24082:2;;-1:-1:-1;;;24117:31:1;;24171:4;24168:1;24161:15;24199:4;24124:1;24189:15;24082:2;-1:-1:-1;24228:9:1;;24072:171::o;24248:453::-;24344:6;24367:5;24381:314;24430:1;24467:2;24457:8;24454:16;24444:2;;24474:5;;;24444:2;24515:4;24510:3;24506:14;24500:4;24497:24;24494:2;;;24524:18;;:::i;:::-;24574:2;24564:8;24560:17;24557:2;;;24589:16;;;;24557:2;24668:17;;;;;24628:15;;24381:314;;24706:139;;24795:44;-1:-1:-1;;24822:8:1;24816:4;24850:922;24934:8;24924:2;;-1:-1:-1;24975:1:1;24989:5;;24924:2;25023:4;25013:2;;-1:-1:-1;25060:1:1;25074:5;;25013:2;25105:4;25123:1;25118:59;;;;25191:1;25186:183;;;;25098:271;;25118:59;25148:1;25139:10;;25162:5;;;25186:183;25223:3;25213:8;25210:17;25207:2;;;25230:18;;:::i;:::-;25286:1;25276:8;25272:16;25263:25;;25314:3;25307:5;25304:14;25301:2;;;25321:18;;:::i;:::-;25354:5;;;25098:271;;25453:2;25443:8;25440:16;25434:3;25428:4;25425:13;25421:36;25415:2;25405:8;25402:16;25397:2;25391:4;25388:12;25384:35;25381:77;25378:2;;;-1:-1:-1;25490:19:1;;;25525:14;;;25522:2;;;25542:18;;:::i;:::-;25575:5;;25378:2;25622:42;25660:3;25650:8;25644:4;25641:1;25622:42;:::i;:::-;25697:6;25692:3;25688:16;25679:7;25676:29;25673:2;;;25708:18;;:::i;:::-;25746:20;;24914:858;-1:-1:-1;;;;24914:858:1:o;25777:168::-;;25883:1;25879;25875:6;25871:14;25868:1;25865:21;25860:1;25853:9;25846:17;25842:45;25839:2;;;25890:18;;:::i;:::-;-1:-1:-1;25930:9:1;;25829:116::o;25950:125::-;;26018:1;26015;26012:8;26009:2;;;26023:18;;:::i;:::-;-1:-1:-1;26060:9:1;;25999:76::o;26080:258::-;26152:1;26162:113;26176:6;26173:1;26170:13;26162:113;;;26252:11;;;26246:18;26233:11;;;26226:39;26198:2;26191:10;26162:113;;;26293:6;26290:1;26287:13;26284:2;;;-1:-1:-1;;26328:1:1;26310:16;;26303:27;26133:205::o;26343:136::-;;26410:5;26400:2;;26419:18;;:::i;:::-;-1:-1:-1;;;26455:18:1;;26390:89::o;26484:380::-;26563:1;26559:12;;;;26606;;;26627:2;;26681:4;26673:6;26669:17;26659:27;;26627:2;26734;26726:6;26723:14;26703:18;26700:38;26697:2;;;26780:10;26775:3;26771:20;26768:1;26761:31;26815:4;26812:1;26805:15;26843:4;26840:1;26833:15;26869:135;;-1:-1:-1;;26929:17:1;;26926:2;;;26949:18;;:::i;:::-;-1:-1:-1;26996:1:1;26985:13;;26916:88::o;27009:127::-;27070:10;27065:3;27061:20;27058:1;27051:31;27101:4;27098:1;27091:15;27125:4;27122:1;27115:15;27141:127;27202:10;27197:3;27193:20;27190:1;27183:31;27233:4;27230:1;27223:15;27257:4;27254:1;27247:15;27273:154;-1:-1:-1;;;;;27352:5:1;27348:54;27341:5;27338:65;27328:2;;27417:1;27414;27407:12;27328:2;27318:109;:::o;27432:118::-;27518:5;27511:13;27504:21;27497:5;27494:32;27484:2;;27540:1;27537;27530:12
Swarm Source
ipfs://d430664f5f63987d8c7e884d4eda4cc1876f1977aa1fea560434b0fb9ca3dfe5
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 27 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ Download: CSV Export ]
[ 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.