Contract 0x6C77f2c171C8cEe08F7A5645c34BB14A29b8532f

Contract Overview

Balance:
0 ETH
Txn Hash Method
Block
From
To
Value [Txn Fee]
0xafe592e87e239099db0d4875e439f81ce5b4e6b18566f88fbf6d27e6eddeb6670x6080604075895162023-02-13 17:33:56104 days 19 hrs ago0x51edb9cc0a86a32870753e4de2c363aefcc25d8c IN  Create: Autopay0 ETH0.00236316 0.1
[ Download CSV Export 
Latest 1 internal transaction
Parent Txn Hash Block From To Value
0xafe592e87e239099db0d4875e439f81ce5b4e6b18566f88fbf6d27e6eddeb66775895162023-02-13 17:33:56104 days 19 hrs ago 0x6c77f2c171c8cee08f7a5645c34bb14a29b8532f 0x46038969d7dc0b17bc72137d07b4ede43859da450 ETH
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Autopay

Compiler Version
v0.8.3+commit.8d00100c

Optimization Enabled:
Yes with 300 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Arbiscan on 2023-02-13
*/

// SPDX-License-Identifier: MIT
pragma solidity 0.8.3;

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
        );
}



/**
    * @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]);
        }
    }
}



interface IERC20 {
  function transfer(address _to, uint256 _amount) external returns(bool);
  function transferFrom(address _from, address _to, uint256 _amount) external returns(bool);
  function approve(address _spender, uint256 _amount) external returns(bool);
}


interface IQueryDataStorage {
  function storeData(bytes memory _queryData) external; 
  function getQueryData(bytes32 _queryId) external view returns (bytes memory);
}

/**
 @author Tellor Inc.
 @title Autopay
 @dev This is a contract for automatically paying for Tellor oracle data at
 * specific time intervals, as well as one time tips.
*/
contract Autopay is UsingTellor {
    // Storage
    IERC20 public token; // TRB token address
    IQueryDataStorage public queryDataStorage; // Query data storage contract
    uint256 public fee; // 1000 is 100%, 50 is 5%, etc.

    mapping(bytes32 => bytes32[]) currentFeeds; // mapping queryId to dataFeedIds array
    mapping(bytes32 => mapping(bytes32 => Feed)) dataFeed; // mapping queryId to dataFeedId to details
    mapping(bytes32 => bytes32) public queryIdFromDataFeedId; // mapping dataFeedId to queryId
    mapping(bytes32 => uint256) public queryIdsWithFundingIndex; // mapping queryId to queryIdsWithFunding index plus one (0 if not in array)
    mapping(bytes32 => Tip[]) public tips; // mapping queryId to tips
    mapping(address => uint256) public userTipsTotal; // track user tip total per user

    bytes32[] public feedsWithFunding; // array of dataFeedIds that have funding
    bytes32[] public queryIdsWithFunding; // array of queryIds that have funding

    // Structs
    struct Feed {
        FeedDetails details;
        mapping(uint256 => bool) rewardClaimed; // tracks which tips were already paid out
    }

    struct FeedDetails {
        uint256 reward; // amount paid for each eligible data submission
        uint256 balance; // account remaining balance
        uint256 startTime; // time of first payment window
        uint256 interval; // time between pay periods
        uint256 window; // amount of time data can be submitted per interval
        uint256 priceThreshold; //change in price necessitating an update 100 = 1%
        uint256 rewardIncreasePerSecond; // amount reward increases per second within window (0 for flat rewards)
        uint256 feedsWithFundingIndex; // index plus one of dataFeedID in feedsWithFunding array (0 if not in array)
    }

    struct FeedDetailsWithQueryData {
        FeedDetails details; // feed details for feed id with funding
        bytes queryData; // query data for requested data
    }

    struct SingleTipsWithQueryData {
        bytes queryData; // query data with single tip for requested data
        uint256 tip; // reward amount for request
    }

    struct Tip {
        uint256 amount; // amount tipped
        uint256 timestamp; // time tipped
        uint256 cumulativeTips; // cumulative tips for query ID
    }

    // Events
    event DataFeedFunded(
        bytes32 indexed _queryId,
        bytes32 indexed _feedId,
        uint256 indexed _amount,
        address _feedFunder,
        FeedDetails _feedDetails
    );
    event NewDataFeed(
        bytes32 indexed _queryId,
        bytes32 indexed _feedId,
        bytes _queryData,
        address _feedCreator
    );
    event OneTimeTipClaimed(
        bytes32 indexed _queryId,
        uint256 indexed _amount,
        address indexed _reporter
    );
    event TipAdded(
        bytes32 indexed _queryId,
        uint256 indexed _amount,
        bytes _queryData,
        address _tipper
    );
    event TipClaimed(
        bytes32 indexed _feedId,
        bytes32 indexed _queryId,
        uint256 indexed _amount,
        address _reporter
    );

    // Functions
    /**
     * @dev Initializes system parameters
     * @param _tellor address of Tellor contract
     * @param _queryDataStorage address of query data storage contract
     * @param _fee percentage, 1000 is 100%, 50 is 5%, etc.
     */
    constructor(
        address payable _tellor,
        address _queryDataStorage,
        uint256 _fee
    ) UsingTellor(_tellor) {
        token = IERC20(tellor.token());
        queryDataStorage = IQueryDataStorage(_queryDataStorage);
        fee = _fee;
    }

    /**
     * @dev Function to claim singular tip
     * @param _queryId id of reported data
     * @param _timestamps[] batch of timestamps array of reported data eligible for reward
     */
    function claimOneTimeTip(bytes32 _queryId, uint256[] calldata _timestamps)
        external
    {
        require(
            tips[_queryId].length > 0,
            "no tips submitted for this queryId"
        );
        uint256 _cumulativeReward;
        for (uint256 _i = 0; _i < _timestamps.length; _i++) {
            _cumulativeReward += _getOneTimeTipAmount(
                _queryId,
                _timestamps[_i]
            );
        }
        require(
            token.transfer(
                msg.sender,
                _cumulativeReward - ((_cumulativeReward * fee) / 1000)
            )
        );
        token.approve(address(tellor), (_cumulativeReward * fee) / 1000);
        tellor.addStakingRewards((_cumulativeReward * fee) / 1000);
        if (getCurrentTip(_queryId) == 0) {
            if (queryIdsWithFundingIndex[_queryId] != 0) {
                uint256 _idx = queryIdsWithFundingIndex[_queryId] - 1;
                // Replace unfunded feed in array with last element
                queryIdsWithFunding[_idx] = queryIdsWithFunding[
                    queryIdsWithFunding.length - 1
                ];
                bytes32 _queryIdLastFunded = queryIdsWithFunding[_idx];
                queryIdsWithFundingIndex[_queryIdLastFunded] = _idx + 1;
                queryIdsWithFundingIndex[_queryId] = 0;
                queryIdsWithFunding.pop();
            }
        }
        emit OneTimeTipClaimed(_queryId, _cumulativeReward, msg.sender);
    }

    /**
     * @dev Allows Tellor reporters to claim their tips in batches
     * @param _feedId unique feed identifier
     * @param _queryId ID of reported data
     * @param _timestamps batch of timestamps array of reported data eligible for reward
     */
    function claimTip(
        bytes32 _feedId,
        bytes32 _queryId,
        uint256[] calldata _timestamps
    ) external {
        Feed storage _feed = dataFeed[_queryId][_feedId];
        uint256 _balance = _feed.details.balance;
        require(_balance > 0, "no funds available for this feed");
        uint256 _cumulativeReward;
        for (uint256 _i = 0; _i < _timestamps.length; _i++) {
            require(
                block.timestamp - _timestamps[_i] > 12 hours,
                "buffer time has not passed"
            );
            require(
                getReporterByTimestamp(_queryId, _timestamps[_i]) == msg.sender,
                "message sender not reporter for given queryId and timestamp"
            );
            _cumulativeReward += _getRewardAmount(
                _feedId,
                _queryId,
                _timestamps[_i]
            );
            if (_cumulativeReward >= _balance) {
                // Balance runs out
                require(
                    _i == _timestamps.length - 1,
                    "insufficient balance for all submitted timestamps"
                );
                _cumulativeReward = _balance;
                // Adjust currently funded feeds
                if (feedsWithFunding.length > 1) {
                    uint256 _idx = _feed.details.feedsWithFundingIndex - 1;
                    // Replace unfunded feed in array with last element
                    feedsWithFunding[_idx] = feedsWithFunding[
                        feedsWithFunding.length - 1
                    ];
                    bytes32 _feedIdLastFunded = feedsWithFunding[_idx];
                    bytes32 _queryIdLastFunded = queryIdFromDataFeedId[
                        _feedIdLastFunded
                    ];
                    dataFeed[_queryIdLastFunded][_feedIdLastFunded]
                        .details
                        .feedsWithFundingIndex = _idx + 1;
                }
                feedsWithFunding.pop();
                _feed.details.feedsWithFundingIndex = 0;
            }
            _feed.rewardClaimed[_timestamps[_i]] = true;
        }
        _feed.details.balance -= _cumulativeReward;
        require(
            token.transfer(
                msg.sender,
                _cumulativeReward - ((_cumulativeReward * fee) / 1000)
            )
        );
        token.approve(address(tellor), (_cumulativeReward * fee) / 1000);
        tellor.addStakingRewards((_cumulativeReward * fee) / 1000);
        emit TipClaimed(_feedId, _queryId, _cumulativeReward, msg.sender);
    }

    /**
     * @dev Allows dataFeed account to be filled with tokens
     * @param _feedId unique feed identifier
     * @param _queryId identifier of reported data type associated with feed
     * @param _amount quantity of tokens to fund feed
     */
    function fundFeed(
        bytes32 _feedId,
        bytes32 _queryId,
        uint256 _amount
    ) public {
        FeedDetails storage _feed = dataFeed[_queryId][_feedId].details;
        require(_feed.reward > 0, "feed not set up");
        require(_amount > 0, "must be sending an amount");
        _feed.balance += _amount;
        require(
            token.transferFrom(msg.sender, address(this), _amount),
            "ERC20: transfer amount exceeds balance"
        );
        // Add to array of feeds with funding
        if (_feed.feedsWithFundingIndex == 0 && _feed.balance > 0) {
            feedsWithFunding.push(_feedId);
            _feed.feedsWithFundingIndex = feedsWithFunding.length;
        }
        userTipsTotal[msg.sender] += _amount;
        emit DataFeedFunded(_feedId, _queryId, _amount, msg.sender, _feed);
    }

    /**
     * @dev Initializes dataFeed parameters.
     * @param _queryId unique identifier of desired data feed
     * @param _reward tip amount per eligible data submission
     * @param _startTime timestamp of first autopay window
     * @param _interval amount of time between autopay windows
     * @param _window amount of time after each new interval when reports are eligible for tips
     * @param _priceThreshold amount price must change to automate update regardless of time (negated if 0, 100 = 1%)
     * @param _rewardIncreasePerSecond amount reward increases per second within a window (0 for flat reward)
     * @param _queryData the data used by reporters to fulfill the query
     * @param _amount optional initial amount to fund it with
     */
    function setupDataFeed(
        bytes32 _queryId,
        uint256 _reward,
        uint256 _startTime,
        uint256 _interval,
        uint256 _window,
        uint256 _priceThreshold,
        uint256 _rewardIncreasePerSecond,
        bytes calldata _queryData,
        uint256 _amount
    ) external returns (bytes32 _feedId) {
        require(
            _queryId == keccak256(_queryData),
            "id must be hash of bytes data"
        );
        _feedId = keccak256(
            abi.encode(
                _queryId,
                _reward,
                _startTime,
                _interval,
                _window,
                _priceThreshold,
                _rewardIncreasePerSecond
            )
        );
        FeedDetails storage _feed = dataFeed[_queryId][_feedId].details;
        require(_feed.reward == 0, "feed must not be set up already");
        require(_reward > 0, "reward must be greater than zero");
        require(_interval > 0, "interval must be greater than zero");
        require(
            _window < _interval,
            "window must be less than interval length"
        );
        _feed.reward = _reward;
        _feed.startTime = _startTime;
        _feed.interval = _interval;
        _feed.window = _window;
        _feed.priceThreshold = _priceThreshold;
        _feed.rewardIncreasePerSecond = _rewardIncreasePerSecond;
        currentFeeds[_queryId].push(_feedId);
        queryIdFromDataFeedId[_feedId] = _queryId;
        queryDataStorage.storeData(_queryData);
        emit NewDataFeed(_queryId, _feedId, _queryData, msg.sender);
        if (_amount > 0) {
            fundFeed(_feedId, _queryId, _amount);
        }
        return _feedId;
    }

    /**
     * @dev Function to run a single tip
     * @param _queryId ID of tipped data
     * @param _amount amount to tip
     * @param _queryData the data used by reporters to fulfill the query
     */
    function tip(
        bytes32 _queryId,
        uint256 _amount,
        bytes calldata _queryData
    ) external {
        require(
            _queryId == keccak256(_queryData),
            "id must be hash of bytes data"
        );
        require(_amount > 0, "tip must be greater than zero");
        Tip[] storage _tips = tips[_queryId];
        if (_tips.length == 0) {
            _tips.push(Tip(_amount, block.timestamp, _amount));
            queryDataStorage.storeData(_queryData);
        } else {
            (, uint256 _timestampRetrieved) = _getCurrentValue(_queryId);
            if (_timestampRetrieved < _tips[_tips.length - 1].timestamp) {
                _tips[_tips.length - 1].timestamp = block.timestamp;
                _tips[_tips.length - 1].amount += _amount;
                _tips[_tips.length - 1].cumulativeTips += _amount;
            } else {
                _tips.push(
                    Tip(
                        _amount,
                        block.timestamp,
                        _tips[_tips.length - 1].cumulativeTips + _amount
                    )
                );
            }
        }
        if (
            queryIdsWithFundingIndex[_queryId] == 0 &&
            getCurrentTip(_queryId) > 0
        ) {
            queryIdsWithFunding.push(_queryId);
            queryIdsWithFundingIndex[_queryId] = queryIdsWithFunding.length;
        }
        require(
            token.transferFrom(msg.sender, address(this), _amount),
            "ERC20: transfer amount exceeds balance"
        );
        userTipsTotal[msg.sender] += _amount;
        emit TipAdded(_queryId, _amount, _queryData, msg.sender);
    }

    // Getters
    /**
     * @dev Getter function to read current data feeds
     * @param _queryId id of reported data
     * @return feedIds array for queryId
     */
    function getCurrentFeeds(bytes32 _queryId)
        external
        view
        returns (bytes32[] memory)
    {
        return currentFeeds[_queryId];
    }

    /**
     * @dev Getter function to current oneTime tip by queryId
     * @param _queryId id of reported data
     * @return amount of tip
     */
    function getCurrentTip(bytes32 _queryId) public view returns (uint256) {
        // if no tips, return 0
        if (tips[_queryId].length == 0) {
            return 0;
        }
        (, uint256 _timestampRetrieved) = _getCurrentValue(_queryId);
        Tip memory _lastTip = tips[_queryId][tips[_queryId].length - 1];
        if (_timestampRetrieved < _lastTip.timestamp) {
            return _lastTip.amount;
        } else {
            return 0;
        }
    }

    /**
     * @dev Getter function to read a specific dataFeed
     * @param _feedId unique feedId of parameters
     * @return FeedDetails details of specified feed
     */
    function getDataFeed(bytes32 _feedId)
        external
        view
        returns (FeedDetails memory)
    {
        return (dataFeed[queryIdFromDataFeedId[_feedId]][_feedId].details);
    }

    /**
     * @dev Getter function for currently funded feed details
     * @return FeedDetailsWithQueryData[] array of details for funded feeds
     */
    function getFundedFeedDetails()
        external
        view
        returns (FeedDetailsWithQueryData[] memory)
    {
        bytes32[] memory _feeds = this.getFundedFeeds();
        FeedDetailsWithQueryData[]
            memory _details = new FeedDetailsWithQueryData[](_feeds.length);
        for (uint256 i = 0; i < _feeds.length; i++) {
            FeedDetails memory _feedDetail = this.getDataFeed(_feeds[i]);
            bytes32 _queryId = this.getQueryIdFromFeedId(_feeds[i]);
            bytes memory _queryData = queryDataStorage.getQueryData(_queryId);
            _details[i].details = _feedDetail;
            _details[i].queryData = _queryData;
        }
        return _details;
    }

    /**
     * @dev Getter function for currently funded feeds
     */
    function getFundedFeeds() external view returns (bytes32[] memory) {
        return feedsWithFunding;
    }

    /**
     * @dev Getter function for queryIds with current one time tips
     */
    function getFundedQueryIds() external view returns (bytes32[] memory) {
        return queryIdsWithFunding;
    }

    /**
     * @dev Getter function for currently funded single tips with queryData
     * @return SingleTipsWithQueryData[] array of current tips
     */
    function getFundedSingleTipsInfo()
        external
        view
        returns (SingleTipsWithQueryData[] memory)
    {
        bytes32[] memory _fundedQueryIds = this.getFundedQueryIds();
        SingleTipsWithQueryData[] memory _query = new SingleTipsWithQueryData[](
            _fundedQueryIds.length
        );
        for (uint256 i = 0; i < _fundedQueryIds.length; i++) {
            bytes memory _data = queryDataStorage.getQueryData(
                _fundedQueryIds[i]
            );
            uint256 _reward = this.getCurrentTip(_fundedQueryIds[i]);
            _query[i].queryData = _data;
            _query[i].tip = _reward;
        }
        return _query;
    }

    /**
     * @dev Getter function to get number of past tips
     * @param _queryId id of reported data
     * @return count of tips available
     */
    function getPastTipCount(bytes32 _queryId) external view returns (uint256) {
        return tips[_queryId].length;
    }

    /**
     * @dev Getter function for past tips
     * @param _queryId id of reported data
     * @return Tip struct (amount/timestamp) of all past tips
     */
    function getPastTips(bytes32 _queryId)
        external
        view
        returns (Tip[] memory)
    {
        return tips[_queryId];
    }

    /**
     * @dev Getter function for past tips by index
     * @param _queryId id of reported data
     * @param _index uint index in the Tip array
     * @return amount/timestamp of specific tip
     */
    function getPastTipByIndex(bytes32 _queryId, uint256 _index)
        external
        view
        returns (Tip memory)
    {
        return tips[_queryId][_index];
    }

    /**
     * @dev Getter function to lookup query IDs from dataFeed IDs
     * @param _feedId dataFeed unique identifier
     * @return bytes32 corresponding query ID
     */
    function getQueryIdFromFeedId(bytes32 _feedId)
        external
        view
        returns (bytes32)
    {
        return queryIdFromDataFeedId[_feedId];
    }

    /**
     * @dev Getter function to read potential rewards for a set of oracle submissions
     * NOTE: Does not consider reporter address, 12-hour dispute buffer period, or duplicate timestamps
     * @param _feedId dataFeed unique identifier
     * @param _queryId unique identifier of reported data
     * @param _timestamps array of timestamps of oracle submissions
     * @return _cumulativeReward total potential reward for the set of oracle submissions
     */
    function getRewardAmount(
        bytes32 _feedId,
        bytes32 _queryId,
        uint256[] calldata _timestamps
    ) external view returns (uint256 _cumulativeReward) {
        FeedDetails storage _feed = dataFeed[_queryId][_feedId].details;
        for (uint256 _i = 0; _i < _timestamps.length; _i++) {
            _cumulativeReward += _getRewardAmount(
                _feedId,
                _queryId,
                _timestamps[_i]
            );
        }
        if (_cumulativeReward > _feed.balance) {
            _cumulativeReward = _feed.balance;
        }
        _cumulativeReward -= ((_cumulativeReward * fee) / 1000);
    }

    /**
     * @dev Getter function for reading whether a reward has been claimed
     * @param _feedId feedId of dataFeed
     * @param _queryId id of reported data
     * @param _timestamp id or reported data
     * @return bool rewardClaimed
     */
    function getRewardClaimedStatus(
        bytes32 _feedId,
        bytes32 _queryId,
        uint256 _timestamp
    ) external view returns (bool) {
        return dataFeed[_queryId][_feedId].rewardClaimed[_timestamp];
    }

    /**
     * @dev Getter function for reading whether a reward has been claimed
     * @param _feedId feedId of dataFeed
     * @param _queryId queryId of reported data
     * @param _timestamp[] list of report timestamps
     * @return bool[] list of rewardClaim status
     */
    function getRewardClaimStatusList(
        bytes32 _feedId,
        bytes32 _queryId,
        uint256[] calldata _timestamp
    ) external view returns (bool[] memory) {
        bool[] memory _status = new bool[](_timestamp.length);
        for (uint256 i = 0; i < _timestamp.length; i++) {
            _status[i] = dataFeed[_queryId][_feedId].rewardClaimed[
                _timestamp[i]
            ];
        }
        return _status;
    }

    /**
     * @dev Getter function for retrieving the total amount of tips paid by a given address
     * @param _user address of user to query
     * @return uint256 total amount of tips paid by user
     */
    function getTipsByAddress(address _user) external view returns (uint256) {
        return userTipsTotal[_user];
    }

    // Internal functions
    /**
     * @dev Internal function to read if a reward has been claimed
     * @param _b bytes value to convert to uint256
     * @return _number uint256 converted from bytes
     */
    function _bytesToUint(bytes memory _b)
        internal
        pure
        returns (uint256 _number)
    {
        for (uint256 _i = 0; _i < _b.length; _i++) {
            _number = _number * 256 + uint8(_b[_i]);
        }
    }

    /**
     ** @dev Internal function which determines tip eligibility for a given oracle submission
     * @param _queryId id of reported data
     * @param _timestamp timestamp of one time tip
     * @return _tipAmount of tip
     */
    function _getOneTimeTipAmount(bytes32 _queryId, uint256 _timestamp)
        internal
        returns (uint256 _tipAmount)
    {
        require(
            block.timestamp - _timestamp > 12 hours,
            "buffer time has not passed"
        );
        require(!isInDispute(_queryId, _timestamp), "value disputed");
        require(
            msg.sender == getReporterByTimestamp(_queryId, _timestamp),
            "msg sender must be reporter address"
        );
        Tip[] storage _tips = tips[_queryId];
        uint256 _min = 0;
        uint256 _max = _tips.length;
        uint256 _mid;
        while (_max - _min > 1) {
            _mid = (_max + _min) / 2;
            if (_tips[_mid].timestamp > _timestamp) {
                _max = _mid;
            } else {
                _min = _mid;
            }
        }
        (, uint256 _timestampBefore) = getDataBefore(_queryId, _timestamp);
        require(
            _timestampBefore < _tips[_min].timestamp,
            "tip earned by previous submission"
        );
        require(
            _timestamp >= _tips[_min].timestamp,
            "timestamp not eligible for tip"
        );
        require(_tips[_min].amount > 0, "tip already claimed");
        _tipAmount = _tips[_min].amount;
        _tips[_min].amount = 0;
        uint256 _minBackup = _min;
        // check whether eligible for previous tips in array due to disputes
        (, uint256 _indexNow) = getIndexForDataBefore(_queryId, _timestamp + 1);
        (bool _found, uint256 _indexBefore) = getIndexForDataBefore(
            _queryId,
            _timestampBefore + 1
        );
        if (_indexNow - _indexBefore > 1 || !_found) {
            if (!_found) {
                _tipAmount = _tips[_minBackup].cumulativeTips;
            } else {
                _max = _min;
                _min = 0;
                _mid;
                while (_max - _min > 1) {
                    _mid = (_max + _min) / 2;
                    if (_tips[_mid].timestamp > _timestampBefore) {
                        _max = _mid;
                    } else {
                        _min = _mid;
                    }
                }
                _min++;
                if (_min < _minBackup) {
                    _tipAmount =
                        _tips[_minBackup].cumulativeTips -
                        _tips[_min].cumulativeTips +
                        _tips[_min].amount;
                }
            }
        }
    }

    /**
     * @dev Allows the user to get the latest value for the queryId specified
     * @param _queryId is the id to look up the value for
     * @return _value the value retrieved
     * @return _timestampRetrieved the retrieved value's timestamp
     */

    function _getCurrentValue(bytes32 _queryId)
        internal
        view
        returns (bytes memory _value, uint256 _timestampRetrieved)
    {
        uint256 _count = getNewValueCountbyQueryId(_queryId);
        if (_count == 0) {
            return (bytes(""), 0);
        }
        uint256 _time;
        //loop handles for dispute (value = "" if disputed)
        while (_count > 0) {
            _count--;
            _time = getTimestampbyQueryIdandIndex(_queryId, _count);
            _value = retrieveData(_queryId, _time);
            if (_value.length > 0) {
                return (_value, _time);
            }
        }
        return (bytes(""), _time);
    }

    /**
     * @dev Internal function which determines the reward amount for a given oracle submission
     * @param _feedId id of dataFeed
     * @param _queryId id of reported data
     * @param _timestamp timestamp of reported data eligible for reward
     * @return _rewardAmount potential reward amount for the given oracle submission
     */
    function _getRewardAmount(
        bytes32 _feedId,
        bytes32 _queryId,
        uint256 _timestamp
    ) internal view returns (uint256 _rewardAmount) {
        require(
            block.timestamp - _timestamp < 4 weeks,
            "timestamp too old to claim tip"
        );
        Feed storage _feed = dataFeed[_queryId][_feedId];
        require(!_feed.rewardClaimed[_timestamp], "reward already claimed");
        uint256 _n = (_timestamp - _feed.details.startTime) /
            _feed.details.interval; // finds closest interval _n to timestamp
        uint256 _c = _feed.details.startTime + _feed.details.interval * _n; // finds start timestamp _c of interval _n
        bytes memory _valueRetrieved = retrieveData(_queryId, _timestamp);
        require(_valueRetrieved.length != 0, "no value exists at timestamp");
        (
            bytes memory _valueRetrievedBefore,
            uint256 _timestampBefore
        ) = getDataBefore(_queryId, _timestamp);
        uint256 _priceChange = 0; // price change from last value to current value
        if (_feed.details.priceThreshold != 0) {
            uint256 _v1 = _bytesToUint(_valueRetrieved);
            uint256 _v2 = _bytesToUint(_valueRetrievedBefore);
            if (_v2 == 0) {
                _priceChange = 10000;
            } else if (_v1 >= _v2) {
                _priceChange = (10000 * (_v1 - _v2)) / _v2;
            } else {
                _priceChange = (10000 * (_v2 - _v1)) / _v2;
            }
        }
        _rewardAmount = _feed.details.reward;
        uint256 _timeDiff = _timestamp - _c; // time difference between report timestamp and start of interval
        // ensure either report is first within a valid window, or price change threshold is met
        if (_timeDiff < _feed.details.window && _timestampBefore < _c) {
            // add time based rewards if applicable
            _rewardAmount += _feed.details.rewardIncreasePerSecond * _timeDiff;
        } else {
            require(
                _priceChange > _feed.details.priceThreshold,
                "price threshold not met"
            );
        }

        if (_feed.details.balance < _rewardAmount) {
            _rewardAmount = _feed.details.balance;
        }
    }
}

Contract ABI

[{"inputs":[{"internalType":"address payable","name":"_tellor","type":"address"},{"internalType":"address","name":"_queryDataStorage","type":"address"},{"internalType":"uint256","name":"_fee","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"_feedId","type":"bytes32"},{"indexed":true,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"_feedFunder","type":"address"},{"components":[{"internalType":"uint256","name":"reward","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"interval","type":"uint256"},{"internalType":"uint256","name":"window","type":"uint256"},{"internalType":"uint256","name":"priceThreshold","type":"uint256"},{"internalType":"uint256","name":"rewardIncreasePerSecond","type":"uint256"},{"internalType":"uint256","name":"feedsWithFundingIndex","type":"uint256"}],"indexed":false,"internalType":"struct Autopay.FeedDetails","name":"_feedDetails","type":"tuple"}],"name":"DataFeedFunded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"_feedId","type":"bytes32"},{"indexed":false,"internalType":"bytes","name":"_queryData","type":"bytes"},{"indexed":false,"internalType":"address","name":"_feedCreator","type":"address"}],"name":"NewDataFeed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"indexed":true,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"_reporter","type":"address"}],"name":"OneTimeTipClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"indexed":true,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"_queryData","type":"bytes"},{"indexed":false,"internalType":"address","name":"_tipper","type":"address"}],"name":"TipAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"_feedId","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"indexed":true,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"_reporter","type":"address"}],"name":"TipClaimed","type":"event"},{"inputs":[{"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"internalType":"uint256[]","name":"_timestamps","type":"uint256[]"}],"name":"claimOneTimeTip","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_feedId","type":"bytes32"},{"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"internalType":"uint256[]","name":"_timestamps","type":"uint256[]"}],"name":"claimTip","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"feedsWithFunding","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_feedId","type":"bytes32"},{"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"fundFeed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_queryId","type":"bytes32"}],"name":"getCurrentFeeds","outputs":[{"internalType":"bytes32[]","name":"","type":"bytes32[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_queryId","type":"bytes32"}],"name":"getCurrentTip","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":[{"internalType":"bytes32","name":"_feedId","type":"bytes32"}],"name":"getDataFeed","outputs":[{"components":[{"internalType":"uint256","name":"reward","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"interval","type":"uint256"},{"internalType":"uint256","name":"window","type":"uint256"},{"internalType":"uint256","name":"priceThreshold","type":"uint256"},{"internalType":"uint256","name":"rewardIncreasePerSecond","type":"uint256"},{"internalType":"uint256","name":"feedsWithFundingIndex","type":"uint256"}],"internalType":"struct Autopay.FeedDetails","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFundedFeedDetails","outputs":[{"components":[{"components":[{"internalType":"uint256","name":"reward","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"interval","type":"uint256"},{"internalType":"uint256","name":"window","type":"uint256"},{"internalType":"uint256","name":"priceThreshold","type":"uint256"},{"internalType":"uint256","name":"rewardIncreasePerSecond","type":"uint256"},{"internalType":"uint256","name":"feedsWithFundingIndex","type":"uint256"}],"internalType":"struct Autopay.FeedDetails","name":"details","type":"tuple"},{"internalType":"bytes","name":"queryData","type":"bytes"}],"internalType":"struct Autopay.FeedDetailsWithQueryData[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFundedFeeds","outputs":[{"internalType":"bytes32[]","name":"","type":"bytes32[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFundedQueryIds","outputs":[{"internalType":"bytes32[]","name":"","type":"bytes32[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFundedSingleTipsInfo","outputs":[{"components":[{"internalType":"bytes","name":"queryData","type":"bytes"},{"internalType":"uint256","name":"tip","type":"uint256"}],"internalType":"struct Autopay.SingleTipsWithQueryData[]","name":"","type":"tuple[]"}],"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"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getPastTipByIndex","outputs":[{"components":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"cumulativeTips","type":"uint256"}],"internalType":"struct Autopay.Tip","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_queryId","type":"bytes32"}],"name":"getPastTipCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_queryId","type":"bytes32"}],"name":"getPastTips","outputs":[{"components":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"cumulativeTips","type":"uint256"}],"internalType":"struct Autopay.Tip[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_feedId","type":"bytes32"}],"name":"getQueryIdFromFeedId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"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":"_feedId","type":"bytes32"},{"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"internalType":"uint256[]","name":"_timestamps","type":"uint256[]"}],"name":"getRewardAmount","outputs":[{"internalType":"uint256","name":"_cumulativeReward","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_feedId","type":"bytes32"},{"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"internalType":"uint256[]","name":"_timestamp","type":"uint256[]"}],"name":"getRewardClaimStatusList","outputs":[{"internalType":"bool[]","name":"","type":"bool[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_feedId","type":"bytes32"},{"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"getRewardClaimedStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getTimestampbyQueryIdandIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getTipsByAddress","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":"queryDataStorage","outputs":[{"internalType":"contract IQueryDataStorage","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"queryIdFromDataFeedId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"queryIdsWithFunding","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"queryIdsWithFundingIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"bytes32","name":"_queryId","type":"bytes32"},{"internalType":"uint256","name":"_reward","type":"uint256"},{"internalType":"uint256","name":"_startTime","type":"uint256"},{"internalType":"uint256","name":"_interval","type":"uint256"},{"internalType":"uint256","name":"_window","type":"uint256"},{"internalType":"uint256","name":"_priceThreshold","type":"uint256"},{"internalType":"uint256","name":"_rewardIncreasePerSecond","type":"uint256"},{"internalType":"bytes","name":"_queryData","type":"bytes"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setupDataFeed","outputs":[{"internalType":"bytes32","name":"_feedId","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tellor","outputs":[{"internalType":"contract ITellor","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes","name":"_queryData","type":"bytes"}],"name":"tip","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"tips","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"cumulativeTips","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userTipsTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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"}]

60806040523480156200001157600080fd5b50604051620048e4380380620048e4833981016040819052620000349162000124565b600080546001600160a01b0319166001600160a01b03851690811790915560408051637e062a3560e11b8152905163fc0c546a91600480820192602092909190829003018186803b1580156200008957600080fd5b505afa1580156200009e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000c49190620000fe565b600280546001600160a01b039283166001600160a01b03199182161790915560038054949092169316929092179091556004555062000184565b60006020828403121562000110578081fd5b81516200011d816200016b565b9392505050565b60008060006060848603121562000139578182fd5b835162000146816200016b565b602085015190935062000159816200016b565b80925050604084015190509250925092565b6001600160a01b03811681146200018157600080fd5b50565b61475080620001946000396000f3fe608060405234801561001057600080fd5b50600436106102995760003560e01c806377b03e0d11610171578063bd05a23a116100d3578063e07c548611610097578063fc0c546a11610071578063fc0c546a146106c7578063fcd4a546146106da578063fdb9d0e2146106fb57610299565b8063e07c54861461068e578063f66f49c3146106a1578063f78eea83146106b457610299565b8063bd05a23a1461061f578063c5958af91461063f578063c7fafff81461065f578063ce5e11bf14610672578063ddca3f431461068557610299565b8063997b799011610135578063a9352c091161010f578063a9352c09146105cc578063b0e5fd07146105ec578063b7c9d376146105ff57610299565b8063997b79901461056c578063a733d2db146105a6578063a792765f146105b957610299565b806377b03e0d146104e55780637bcdfa7a146104f85780637f23d1ce14610526578063868d8b591461053957806393d539321461055957610299565b806344e87f911161021a5780634fff7099116101de57806364ee3c6d116101b857806364ee3c6d1461049157806366c1de50146104b2578063751c895c146104d257610299565b80634fff70991461043e57806357806e701461045e578063579b6d061461047157610299565b806344e87f91146103ac57806345740ccc146103cf57806345d60823146103e25780634637de0b1461040b5780634fce1e181461042b57610299565b80632af8aae0116102615780632af8aae014610347578063353d8ac91461035a57806337db4faf1461036f5780633d3fc43d1461038f57806342505164146103a457610299565b806309d6e27e1461029e578063193b505b146102bc5780631959ad5b146102d15780631af4075f146102fc578063294490851461031d575b600080fd5b6102a661070e565b6040516102b3919061430b565b60405180910390f35b6102cf6102ca366004613d48565b610a51565b005b6000546102e4906001600160a01b031681565b6040516001600160a01b0390911681526020016102b3565b61030f61030a366004613f43565b610a96565b6040519081526020016102b3565b61033061032b366004613fbf565b610b4c565b6040805192151583526020830191909152016102b3565b6001546102e4906001600160a01b031681565b610362610bdb565b6040516102b3919061423a565b61030f61037d366004613ec9565b60086020526000908152604090205481565b610397610c33565b6040516102b391906143d5565b610362610f00565b6103bf6103ba366004613fbf565b610f56565b60405190151581526020016102b3565b61030f6103dd366004613ec9565b610fe3565b61030f6103f0366004613d48565b6001600160a01b03166000908152600a602052604090205490565b61041e610419366004613ec9565b61109d565b6040516102b3919061455c565b61030f610439366004613ec9565b611162565b61030f61044c366004613ec9565b60009081526007602052604090205490565b6102cf61046c366004613f43565b611183565b61048461047f366004613ec9565b6117d0565b6040516102b3919061444a565b6104a461049f366004613fbf565b611860565b6040516102b39291906144f4565b61030f6104c0366004613d48565b600a6020526000908152604090205481565b6102cf6104e0366004613fe0565b6118b9565b61030f6104f3366004613ec9565b611d9a565b61050b610506366004613fbf565b611e17565b604080519384526020840192909252908201526060016102b3565b6102cf610534366004613f94565b611e59565b61030f610547366004613ec9565b60076020526000908152604090205481565b610362610567366004613ec9565b6120c9565b6103bf61057a366004613f94565b600091825260066020908152604080842094845293815283832091835260089091019052205460ff1690565b61030f6105b4366004614056565b61212b565b6104a46105c7366004613fbf565b61246a565b6105df6105da366004613fbf565b612500565b6040516102b391906145b4565b6003546102e4906001600160a01b031681565b61030f61060d366004613ec9565b60009081526009602052604090205490565b61063261062d366004613f43565b612591565b6040516102b391906141f4565b61065261064d366004613fbf565b61269f565b6040516102b391906144e1565b61030f61066d366004613ec9565b612727565b61030f610680366004613fbf565b612737565b61030f60045481565b6102e461069c366004613fbf565b6127bb565b6103306106af366004613fbf565b61283f565b61050b6106c2366004613ec9565b6129fb565b6002546102e4906001600160a01b031681565b6106ed6106e8366004614025565b612acb565b6040516102b3929190614272565b6102cf610709366004613ef9565b612e2a565b60606000306001600160a01b031663353d8ac96040518163ffffffff1660e01b815260040160006040518083038186803b15801561074b57600080fd5b505afa15801561075f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526107879190810190613d87565b90506000815167ffffffffffffffff8111156107b357634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156107ec57816020015b6107d9613beb565b8152602001906001900390816107d15790505b50905060005b8251811015610a4a576000306001600160a01b0316634637de0b85848151811061082c57634e487b7160e01b600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b815260040161085291815260200190565b6101006040518083038186803b15801561086b57600080fd5b505afa15801561087f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108a3919061411c565b90506000306001600160a01b0316634fff70998685815181106108d657634e487b7160e01b600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b81526004016108fc91815260200190565b60206040518083038186803b15801561091457600080fd5b505afa158015610928573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061094c9190613ee1565b6003546040516341b6849f60e11b8152600481018390529192506000916001600160a01b039091169063836d093e9060240160006040518083038186803b15801561099657600080fd5b505afa1580156109aa573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109d291908101906140e9565b9050828585815181106109f557634e487b7160e01b600052603260045260246000fd5b60200260200101516000018190525080858581518110610a2557634e487b7160e01b600052603260045260246000fd5b6020026020010151602001819052505050508080610a42906146bb565b9150506107f2565b5091505090565b6001546001600160a01b031615610a6757600080fd5b6001805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b60008381526006602090815260408083208784529091528120815b83811015610b0857610aea8787878785818110610ade57634e487b7160e01b600052603260045260246000fd5b9050602002013561324e565b610af49084614606565b925080610b00816146bb565b915050610ab1565b508060010154821115610b1d57806001015491505b6103e860045483610b2e919061463e565b610b38919061461e565b610b42908361465d565b9695505050505050565b60008054604051632944908560e01b8152600481018590526024810184905282916001600160a01b031690632944908590604401604080518083038186803b158015610b9757600080fd5b505afa158015610bab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bcf9190613e9e565b915091505b9250929050565b6060600b805480602002602001604051908101604052809291908181526020018280548015610c2957602002820191906000526020600020905b815481526020019060010190808311610c15575b5050505050905090565b60606000306001600160a01b031663425051646040518163ffffffff1660e01b815260040160006040518083038186803b158015610c7057600080fd5b505afa158015610c84573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610cac9190810190613d87565b90506000815167ffffffffffffffff811115610cd857634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610d1e57816020015b604080518082019091526060815260006020820152815260200190600190039081610cf65790505b50905060005b8251811015610a4a5760035483516000916001600160a01b03169063836d093e90869085908110610d6557634e487b7160e01b600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b8152600401610d8b91815260200190565b60006040518083038186803b158015610da357600080fd5b505afa158015610db7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610ddf91908101906140e9565b90506000306001600160a01b03166345740ccc868581518110610e1257634e487b7160e01b600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b8152600401610e3891815260200190565b60206040518083038186803b158015610e5057600080fd5b505afa158015610e64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e889190613ee1565b905081848481518110610eab57634e487b7160e01b600052603260045260246000fd5b60200260200101516000018190525080848481518110610edb57634e487b7160e01b600052603260045260246000fd5b6020026020010151602001818152505050508080610ef8906146bb565b915050610d24565b6060600c805480602002602001604051908101604052809291908181526020018280548015610c295760200282019190600052602060002090815481526020019060010190808311610c15575050505050905090565b600080546040516344e87f9160e01b815260048101859052602481018490526001600160a01b03909116906344e87f919060440160206040518083038186803b158015610fa257600080fd5b505afa158015610fb6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fda9190613e2f565b90505b92915050565b600081815260096020526040812054610ffe57506000611098565b60006110098361352b565b600085815260096020526040812080549294509092509061102c9060019061465d565b8154811061104a57634e487b7160e01b600052603260045260246000fd5b600091825260209182902060408051606081018252600390930290910180548352600181015493830184905260020154908201529150821015611091575191506110989050565b6000925050505b919050565b6110e560405180610100016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b506000818152600760208181526040808420548452600680835281852095855294825292839020835161010081018552815481526001820154928101929092526002810154938201939093526003830154606082015260048301546080820152600583015460a08201529282015460c0840152015460e082015290565b600b818154811061117257600080fd5b600091825260209091200154905081565b600083815260066020908152604080832087845290915290206001810154806111f35760405162461bcd60e51b815260206004820181905260248201527f6e6f2066756e647320617661696c61626c6520666f722074686973206665656460448201526064015b60405180910390fd5b6000805b8481101561157a5761a8c086868381811061122257634e487b7160e01b600052603260045260246000fd5b9050602002013542611234919061465d565b116112815760405162461bcd60e51b815260206004820152601a60248201527f6275666665722074696d6520686173206e6f742070617373656400000000000060448201526064016111ea565b336112b2888888858181106112a657634e487b7160e01b600052603260045260246000fd5b905060200201356127bb565b6001600160a01b03161461132e5760405162461bcd60e51b815260206004820152603b60248201527f6d6573736167652073656e646572206e6f74207265706f7274657220666f722060448201527f676976656e207175657279496420616e642074696d657374616d70000000000060648201526084016111ea565b6113538888888885818110610ade57634e487b7160e01b600052603260045260246000fd5b61135d9083614606565b91508282106115135761137160018661465d565b81146113d95760405162461bcd60e51b815260206004820152603160248201527f696e73756666696369656e742062616c616e636520666f7220616c6c207375626044820152706d69747465642074696d657374616d707360781b60648201526084016111ea565b600b54839250600110156114d45760078401546000906113fb9060019061465d565b600b80549192509061140f9060019061465d565b8154811061142d57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154600b828154811061145957634e487b7160e01b600052603260045260246000fd5b90600052602060002001819055506000600b828154811061148a57634e487b7160e01b600052603260045260246000fd5b600091825260208083209091015480835260079091526040909120549091506114b4836001614606565b600091825260066020908152604080842094845293905291902060070155505b600b8054806114f357634e487b7160e01b600052603160045260246000fd5b600082815260208120820160001990810182905590910190915560078501555b600184600801600088888581811061153b57634e487b7160e01b600052603260045260246000fd5b90506020020135815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611572906146bb565b9150506111f7565b5080836000016001016000828254611592919061465d565b90915550506002546004546001600160a01b039091169063a9059cbb9033906103e8906115bf908661463e565b6115c9919061461e565b6115d3908561465d565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b15801561161957600080fd5b505af115801561162d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116519190613e2f565b61165a57600080fd5b6002546000546004546001600160a01b039283169263095ea7b39216906103e890611685908661463e565b61168f919061461e565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b1580156116d557600080fd5b505af11580156116e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061170d9190613e2f565b506000546004546001600160a01b039091169063d9c51cd4906103e890611734908561463e565b61173e919061461e565b6040518263ffffffff1660e01b815260040161175c91815260200190565b600060405180830381600087803b15801561177657600080fd5b505af115801561178a573d6000803e3d6000fd5b505060405133815283925088915089907fbe397b811472239aa40c62686337c1611135342d6e238e8aa16580dcd7223adf9060200160405180910390a450505050505050565b606060096000838152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b828210156118555783829060005260206000209060030201604051806060016040529081600082015481526020016001820154815260200160028201548152505081526020019060010190611805565b505050509050919050565b60606000806000611871868661283f565b91509150816118985760006040518060200160405280600081525090935093505050610bd4565b6118a28682612737565b92506118ae868461269f565b935050509250929050565b81816040516118c99291906141e4565b6040518091039020841461191f5760405162461bcd60e51b815260206004820152601d60248201527f6964206d7573742062652068617368206f66206279746573206461746100000060448201526064016111ea565b6000831161196f5760405162461bcd60e51b815260206004820152601d60248201527f746970206d7573742062652067726561746572207468616e207a65726f00000060448201526064016111ea565b60008481526009602052604090208054611a375760408051606081018252858152426020808301918252828401888152855460018181018855600088815293909320945160039182029095019485559251918401919091555160029092019190915554905163ac5c853560e01b81526001600160a01b039091169063ac5c853590611a0090869086906004016144a0565b600060405180830381600087803b158015611a1a57600080fd5b505af1158015611a2e573d6000803e3d6000fd5b50505050611c21565b6000611a428661352b565b8354909250839150611a569060019061465d565b81548110611a7457634e487b7160e01b600052603260045260246000fd5b906000526020600020906003020160010154811015611b8357815442908390611a9f9060019061465d565b81548110611abd57634e487b7160e01b600052603260045260246000fd5b906000526020600020906003020160010181905550848260018480549050611ae5919061465d565b81548110611b0357634e487b7160e01b600052603260045260246000fd5b90600052602060002090600302016000016000828254611b239190614606565b9091555050815485908390611b3a9060019061465d565b81548110611b5857634e487b7160e01b600052603260045260246000fd5b90600052602060002090600302016002016000828254611b789190614606565b90915550611c1f9050565b816040518060600160405280878152602001428152602001878560018780549050611bae919061465d565b81548110611bcc57634e487b7160e01b600052603260045260246000fd5b906000526020600020906003020160020154611be89190614606565b9052815460018181018455600093845260209384902083516003909302019182559282015192810192909255604001516002909101555b505b600085815260086020526040902054158015611c4557506000611c4386610fe3565b115b15611c8a57600c80546001810182557fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c701869055546000868152600860205260409020555b6002546040516323b872dd60e01b8152336004820152306024820152604481018690526001600160a01b03909116906323b872dd90606401602060405180830381600087803b158015611cdc57600080fd5b505af1158015611cf0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d149190613e2f565b611d305760405162461bcd60e51b81526004016111ea90614516565b336000908152600a602052604081208054869290611d4f908490614606565b9250508190555083857ff5ab15991b2cec1142b66b2c57a205c2af5e9d8fc5056bcb33b53b193990b07e858533604051611d8b939291906144b4565b60405180910390a35050505050565b600080546040516377b03e0d60e01b8152600481018490526001600160a01b03909116906377b03e0d9060240160206040518083038186803b158015611ddf57600080fd5b505afa158015611df3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fdd9190613ee1565b60096020528160005260406000208181548110611e3357600080fd5b600091825260209091206003909102018054600182015460029092015490935090915083565b600082815260066020908152604080832086845290915290208054611eb25760405162461bcd60e51b815260206004820152600f60248201526e066656564206e6f742073657420757608c1b60448201526064016111ea565b60008211611f025760405162461bcd60e51b815260206004820152601960248201527f6d7573742062652073656e64696e6720616e20616d6f756e740000000000000060448201526064016111ea565b81816001016000828254611f169190614606565b90915550506002546040516323b872dd60e01b8152336004820152306024820152604481018490526001600160a01b03909116906323b872dd90606401602060405180830381600087803b158015611f6d57600080fd5b505af1158015611f81573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fa59190613e2f565b611fc15760405162461bcd60e51b81526004016111ea90614516565b6007810154158015611fd7575060008160010154115b1561201757600b805460018101825560008290527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db9018590555460078201555b336000908152600a602052604081208054849290612036908490614606565b909155505060408051338152825460208201526001830154818301526002830154606082015260038301546080820152600483015460a0820152600583015460c0820152600683015460e0820152600783015461010082015290518391859187917fdaf477f4ffa6a044c31632ac3040e483553fb75f8437629291046a833cc352af91908190036101200190a450505050565b60008181526005602090815260409182902080548351818402810184019094528084526060939283018282801561211f57602002820191906000526020600020905b81548152602001906001019080831161210b575b50505050509050919050565b6000838360405161213d9291906141e4565b60405180910390208b146121935760405162461bcd60e51b815260206004820152601d60248201527f6964206d7573742062652068617368206f66206279746573206461746100000060448201526064016111ea565b60408051602081018d90529081018b9052606081018a90526080810189905260a0810188905260c0810187905260e081018690526101000160408051601f19818403018152918152815160209283012060008e81526006845282812082825290935291208054919250901561224a5760405162461bcd60e51b815260206004820152601f60248201527f66656564206d757374206e6f742062652073657420757020616c72656164790060448201526064016111ea565b60008b1161229a5760405162461bcd60e51b815260206004820181905260248201527f726577617264206d7573742062652067726561746572207468616e207a65726f60448201526064016111ea565b600089116122f55760405162461bcd60e51b815260206004820152602260248201527f696e74657276616c206d7573742062652067726561746572207468616e207a65604482015261726f60f01b60648201526084016111ea565b8888106123555760405162461bcd60e51b815260206004820152602860248201527f77696e646f77206d757374206265206c657373207468616e20696e74657276616044820152670d840d8cadccee8d60c31b60648201526084016111ea565b8a8155600281018a905560038082018a905560048083018a905560058084018a90556006840189905560008f81526020918252604080822080546001810182559083528383200187905586825260079092528190208f90559154915163ac5c853560e01b81526001600160a01b039092169163ac5c8535916123db9189918991016144a0565b600060405180830381600087803b1580156123f557600080fd5b505af1158015612409573d6000803e3d6000fd5b50505050818c7f25b7a245f1298a141e9a73052d47515c64a19a5550bc21f5c896f2097e155efe878733604051612442939291906144b4565b60405180910390a3821561245b5761245b828d85611e59565b509a9950505050505050505050565b6000805460405163a792765f60e01b81526004810185905260248101849052606092916001600160a01b03169063a792765f9060440160006040518083038186803b1580156124b857600080fd5b505afa1580156124cc573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526124f49190810190613e49565b90969095509350505050565b61252460405180606001604052806000815260200160008152602001600081525090565b600083815260096020526040902080548390811061255257634e487b7160e01b600052603260045260246000fd5b90600052602060002090600302016040518060600160405290816000820154815260200160018201548152602001600282015481525050905092915050565b606060008267ffffffffffffffff8111156125bc57634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156125e5578160200160208202803683370190505b50905060005b838110156126955760008681526006602090815260408083208a845290915281206008019086868481811061263057634e487b7160e01b600052603260045260246000fd5b90506020020135815260200190815260200160002060009054906101000a900460ff1682828151811061267357634e487b7160e01b600052603260045260246000fd5b911515602092830291909101909101528061268d816146bb565b9150506125eb565b5095945050505050565b60005460405163c5958af960e01b815260048101849052602481018390526060916001600160a01b03169063c5958af99060440160006040518083038186803b1580156126eb57600080fd5b505afa1580156126ff573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610fda91908101906140e9565b600c818154811061117257600080fd5b6000805460405163ce5e11bf60e01b815260048101859052602481018490526001600160a01b039091169063ce5e11bf9060440160206040518083038186803b15801561278357600080fd5b505afa158015612797573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fda9190613ee1565b6000805460405163703e2a4360e11b815260048101859052602481018490526001600160a01b039091169063e07c54869060440160206040518083038186803b15801561280757600080fd5b505afa15801561281b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fda9190613d6b565b600080600061284d85611d9a565b905080612861576000809250925050610bd4565b8061286b816146a4565b91506001905060008083816128808a83612737565b905088811161289b5760008097509750505050505050610bd4565b6128a58a84612737565b9050888111156128b457600094505b84156129665760026128c68484614606565b6128d0919061461e565b93506128dc8a85612737565b90508881111561291d5760006128f78b61068060018861465d565b90508981116129095760009550612917565b61291460018661465d565b92505b50612961565b600061292e8b610680876001614606565b905089811115612951576000955084612946816146bb565b95505080915061295f565b61295c856001614606565b93505b505b6128b4565b6129708a82610f56565b6129865760018497509750505050505050610bd4565b6129908a82610f56565b801561299b57508584105b156129be57836129aa816146bb565b9450506129b78a85612737565b9050612986565b85841480156129d257506129d28a82610f56565b156129e95760008097509750505050505050610bd4565b60018497509750505050505050610bd4565b6001546040516387a475fd60e01b8152600481018390526000918291829182916001600160a01b03909116906387a475fd9060240160206040518083038186803b158015612a4857600080fd5b505afa158015612a5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a809190613ee1565b90506060612a93826105c7426001614606565b9450905083612aaf576000806101949450945094505050612ac4565b6000612aba826135ba565b955060c893505050505b9193909250565b606080600080612adf886106af888a61465d565b9150915081612b30576040805160008082526020820190925290612b13565b6060815260200190600190039081612afe5790505b506040805160008152602081019091529094509250612e21915050565b6000612b3c8989610b4c565b909350905082612b8f576040805160008082526020820190925290612b71565b6060815260200190600190039081612b5c5790505b506040805160008152602081019091529095509350612e2192505050565b60008060008867ffffffffffffffff811115612bbb57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015612be4578160200160208202803683370190505b5090505b8883108015612c0b57508482612bff866001614606565b612c09919061465d565b115b15612c7d576000612c208d610680858861465d565b9050612c2c8d82610f56565b612c6a5780828581518110612c5157634e487b7160e01b600052603260045260246000fd5b602090810291909101015283612c66816146bb565b9450505b82612c74816146bb565b93505050612be8565b60008367ffffffffffffffff811115612ca657634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015612cd957816020015b6060815260200190600190039081612cc45790505b50905060008467ffffffffffffffff811115612d0557634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015612d2e578160200160208202803683370190505b50905060005b85811015612e14578381612d4960018961465d565b612d53919061465d565b81518110612d7157634e487b7160e01b600052603260045260246000fd5b6020026020010151828281518110612d9957634e487b7160e01b600052603260045260246000fd5b602002602001018181525050612dd68f838381518110612dc957634e487b7160e01b600052603260045260246000fd5b602002602001015161269f565b838281518110612df657634e487b7160e01b600052603260045260246000fd5b60200260200101819052508080612e0c906146bb565b915050612d34565b5090985096505050505050505b94509492505050565b600083815260096020526040902054612e905760405162461bcd60e51b815260206004820152602260248201527f6e6f2074697073207375626d697474656420666f722074686973207175657279604482015261125960f21b60648201526084016111ea565b6000805b82811015612eea57612ecc85858584818110612ec057634e487b7160e01b600052603260045260246000fd5b9050602002013561361f565b612ed69083614606565b915080612ee2816146bb565b915050612e94565b506002546004546001600160a01b039091169063a9059cbb9033906103e890612f13908661463e565b612f1d919061461e565b612f27908561465d565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b158015612f6d57600080fd5b505af1158015612f81573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fa59190613e2f565b612fae57600080fd5b6002546000546004546001600160a01b039283169263095ea7b39216906103e890612fd9908661463e565b612fe3919061461e565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b15801561302957600080fd5b505af115801561303d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130619190613e2f565b506000546004546001600160a01b039091169063d9c51cd4906103e890613088908561463e565b613092919061461e565b6040518263ffffffff1660e01b81526004016130b091815260200190565b600060405180830381600087803b1580156130ca57600080fd5b505af11580156130de573d6000803e3d6000fd5b505050506130eb84610fe3565b61321957600084815260086020526040902054156132195760008481526008602052604081205461311e9060019061465d565b600c8054919250906131329060019061465d565b8154811061315057634e487b7160e01b600052603260045260246000fd5b9060005260206000200154600c828154811061317c57634e487b7160e01b600052603260045260246000fd5b90600052602060002001819055506000600c82815481106131ad57634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508160016131c79190614606565b6000828152600860205260408082209290925587815290812055600c80548061320057634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505b6040513390829086907fdff45d500502d35c7f1150acbb404c5b2e288e31a74354c8553a283dd1e806e790600090a450505050565b60006224ea0061325e834261465d565b106132ab5760405162461bcd60e51b815260206004820152601e60248201527f74696d657374616d7020746f6f206f6c6420746f20636c61696d20746970000060448201526064016111ea565b60008381526006602090815260408083208784528252808320858452600881019092529091205460ff16156133225760405162461bcd60e51b815260206004820152601660248201527f72657761726420616c726561647920636c61696d65640000000000000000000060448201526064016111ea565b600381015460028201546000919061333a908661465d565b613344919061461e565b9050600081836000016003015461335b919061463e565b600284015461336a9190614606565b90506000613378878761269f565b90508051600014156133cc5760405162461bcd60e51b815260206004820152601c60248201527f6e6f2076616c7565206578697374732061742074696d657374616d700000000060448201526064016111ea565b6000806133d9898961246a565b600588015491935091506000901561346a5760006133f685613b8c565b9050600061340385613b8c565b905080613414576127109250613467565b8082106134435780613426818461465d565b6134329061271061463e565b61343c919061461e565b9250613467565b8061344e838261465d565b61345a9061271061463e565b613464919061461e565b92505b50505b86549750600061347a868b61465d565b60048901549091508110801561348f57508583105b156134b55760068801546134a490829061463e565b6134ae908a614606565b9850613508565b600588015482116135085760405162461bcd60e51b815260206004820152601760248201527f7072696365207468726573686f6c64206e6f74206d657400000000000000000060448201526064016111ea565b600188015489111561351c57600188015498505b50505050505050509392505050565b606060008061353984611d9a565b90508061355c5760405180602001604052806000815250600092509250506135b5565b60005b81156135a0578161356f816146a4565b92505061357c8583612737565b9050613588858261269f565b80519094501561359b5791506135b59050565b61355f565b60408051602081019091526000815293509150505b915091565b6000805b8251811015613619578281815181106135e757634e487b7160e01b600052603260045260246000fd5b016020015160f81c6135fb8361010061463e565b6136059190614606565b915080613611816146bb565b9150506135be565b50919050565b600061a8c061362e834261465d565b1161367b5760405162461bcd60e51b815260206004820152601a60248201527f6275666665722074696d6520686173206e6f742070617373656400000000000060448201526064016111ea565b6136858383610f56565b156136c35760405162461bcd60e51b815260206004820152600e60248201526d1d985b1d5948191a5cdc1d5d195960921b60448201526064016111ea565b6136cd83836127bb565b6001600160a01b0316336001600160a01b0316146137395760405162461bcd60e51b815260206004820152602360248201527f6d73672073656e646572206d757374206265207265706f72746572206164647260448201526265737360e81b60648201526084016111ea565b60008381526009602052604081208054909190815b600161375a848461465d565b11156137c257600261376c8484614606565b613776919061461e565b90508584828154811061379957634e487b7160e01b600052603260045260246000fd5b90600052602060002090600302016001015411156137b9578091506137bd565b8092505b61374e565b60006137ce888861246a565b9150508484815481106137f157634e487b7160e01b600052603260045260246000fd5b906000526020600020906003020160010154811061385b5760405162461bcd60e51b815260206004820152602160248201527f746970206561726e65642062792070726576696f7573207375626d697373696f6044820152603760f91b60648201526084016111ea565b84848154811061387b57634e487b7160e01b600052603260045260246000fd5b9060005260206000209060030201600101548710156138dc5760405162461bcd60e51b815260206004820152601e60248201527f74696d657374616d70206e6f7420656c696769626c6520666f7220746970000060448201526064016111ea565b60008585815481106138fe57634e487b7160e01b600052603260045260246000fd5b906000526020600020906003020160000154116139535760405162461bcd60e51b81526020600482015260136024820152721d1a5c08185b1c9958591e4818db185a5b5959606a1b60448201526064016111ea565b84848154811061397357634e487b7160e01b600052603260045260246000fd5b906000526020600020906003020160000154955060008585815481106139a957634e487b7160e01b600052603260045260246000fd5b6000918252602082206003909102019190915584906139cd8a61032b8b6001614606565b915060009050806139e38c61032b876001614606565b909250905060016139f4828561465d565b11806139fe575081155b15613b7d5781613a4157888481548110613a2857634e487b7160e01b600052603260045260246000fd5b9060005260206000209060030201600201549950613b7d565b60009796505b6001613a53898961465d565b1115613abb576002613a658989614606565b613a6f919061461e565b955084898781548110613a9257634e487b7160e01b600052603260045260246000fd5b9060005260206000209060030201600101541115613ab257859650613ab6565b8597505b613a47565b87613ac5816146bb565b98505083881015613b7d57888881548110613af057634e487b7160e01b600052603260045260246000fd5b906000526020600020906003020160000154898981548110613b2257634e487b7160e01b600052603260045260246000fd5b9060005260206000209060030201600201548a8681548110613b5457634e487b7160e01b600052603260045260246000fd5b906000526020600020906003020160020154613b70919061465d565b613b7a9190614606565b99505b50505050505050505092915050565b6000805b825181101561361957828181518110613bb957634e487b7160e01b600052603260045260246000fd5b016020015160f81c613bcd8361010061463e565b613bd79190614606565b915080613be3816146bb565b915050613b90565b6040518060400160405280613c3e60405180610100016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b8152602001606081525090565b60008083601f840112613c5c578182fd5b50813567ffffffffffffffff811115613c73578182fd5b6020830191508360208260051b8501011115610bd457600080fd5b8051801515811461109857600080fd5b60008083601f840112613caf578182fd5b50813567ffffffffffffffff811115613cc6578182fd5b602083019150836020828501011115610bd457600080fd5b600082601f830112613cee578081fd5b815167ffffffffffffffff811115613d0857613d086146ec565b613d1b601f8201601f19166020016145d5565b818152846020838601011115613d2f578283fd5b613d40826020830160208701614674565b949350505050565b600060208284031215613d59578081fd5b8135613d6481614702565b9392505050565b600060208284031215613d7c578081fd5b8151613d6481614702565b60006020808385031215613d99578182fd5b825167ffffffffffffffff80821115613db0578384fd5b818501915085601f830112613dc3578384fd5b815181811115613dd557613dd56146ec565b8060051b9150613de68483016145d5565b8181528481019084860184860187018a1015613e00578788fd5b8795505b83861015613e22578051835260019590950194918601918601613e04565b5098975050505050505050565b600060208284031215613e40578081fd5b610fda82613c8e565b600080600060608486031215613e5d578182fd5b613e6684613c8e565b9250602084015167ffffffffffffffff811115613e81578283fd5b613e8d86828701613cde565b925050604084015190509250925092565b60008060408385031215613eb0578182fd5b613eb983613c8e565b9150602083015190509250929050565b600060208284031215613eda578081fd5b5035919050565b600060208284031215613ef2578081fd5b5051919050565b600080600060408486031215613f0d578283fd5b83359250602084013567ffffffffffffffff811115613f2a578283fd5b613f3686828701613c4b565b9497909650939450505050565b60008060008060608587031215613f58578081fd5b8435935060208501359250604085013567ffffffffffffffff811115613f7c578182fd5b613f8887828801613c4b565b95989497509550505050565b600080600060608486031215613fa8578081fd5b505081359360208301359350604090920135919050565b60008060408385031215613fd1578182fd5b50508035926020909101359150565b60008060008060608587031215613ff5578182fd5b8435935060208501359250604085013567ffffffffffffffff811115614019578283fd5b613f8887828801613c9e565b6000806000806080858703121561403a578182fd5b5050823594602084013594506040840135936060013592509050565b6000806000806000806000806000806101208b8d031215614075578788fd5b8a35995060208b0135985060408b0135975060608b0135965060808b0135955060a08b0135945060c08b0135935060e08b013567ffffffffffffffff8111156140bc578384fd5b6140c88d828e01613c9e565b915080945050809250506101008b013590509295989b9194979a5092959850565b6000602082840312156140fa578081fd5b815167ffffffffffffffff811115614110578182fd5b613d4084828501613cde565b600061010080838503121561412f578182fd5b614138816145d5565b9050825181526020830151602082015260408301516040820152606083015160608201526080830151608082015260a083015160a082015260c083015160c082015260e083015160e08201528091505092915050565b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b600081518084526141d0816020860160208601614674565b601f01601f19169290920160200192915050565b6000828483379101908152919050565b6020808252825182820181905260009190848201906040850190845b8181101561422e578351151583529284019291840191600101614210565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561422e57835183529284019291840191600101614256565b6000604082016040835280855180835260608501915060608160051b86010192506020808801855b838110156142c857605f198887030185526142b68683516141b8565b9550938201939082019060010161429a565b505085840381870152865180855287820194820193509150845b828110156142fe578451845293810193928101926001016142e2565b5091979650505050505050565b6000602080830181845280855180835260408601915060408160051b8701019250838701855b828110156143c857603f19888603018452815161012061439b878351805182526020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a083015260c081015160c083015260e081015160e08301525050565b878201519150806101008801526143b4818801836141b8565b965050509285019290850190600101614331565b5092979650505050505050565b60006020808301818452808551808352604092508286019150828160051b870101848801865b8381101561443c57888303603f190185528151805187855261441f888601826141b8565b9189015194890194909452948701949250908601906001016143fb565b509098975050505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561422e5761448d8385518051825260208082015190830152604090810151910152565b9284019260609290920191600101614466565b600060208252613d4060208301848661418e565b6000604082526144c860408301858761418e565b90506001600160a01b0383166020830152949350505050565b600060208252610fda60208301846141b8565b60006040825261450760408301856141b8565b90508260208301529392505050565b60208082526026908201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604082015265616c616e636560d01b606082015260800190565b6101008101610fdd8284805182526020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a083015260c081015160c083015260e081015160e08301525050565b81518152602080830151908201526040808301519082015260608101610fdd565b604051601f8201601f1916810167ffffffffffffffff811182821017156145fe576145fe6146ec565b604052919050565b60008219821115614619576146196146d6565b500190565b60008261463957634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615614658576146586146d6565b500290565b60008282101561466f5761466f6146d6565b500390565b60005b8381101561468f578181015183820152602001614677565b8381111561469e576000848401525b50505050565b6000816146b3576146b36146d6565b506000190190565b60006000198214156146cf576146cf6146d6565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461471757600080fd5b5056fea2646970667358221220b61624ef0f357a5e7526f080dae2d83b72d8789cfb8d340d3bd07dd05386129c64736f6c6343000803003300000000000000000000000046038969d7dc0b17bc72137d07b4ede43859da450000000000000000000000009be9b0cfa89ea800556c6efba67b455d336db1d00000000000000000000000000000000000000000000000000000000000000014

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000046038969d7dc0b17bc72137d07b4ede43859da450000000000000000000000009be9b0cfa89ea800556c6efba67b455d336db1d00000000000000000000000000000000000000000000000000000000000000014

-----Decoded View---------------
Arg [0] : _tellor (address): 0x46038969d7dc0b17bc72137d07b4ede43859da45
Arg [1] : _queryDataStorage (address): 0x9be9b0cfa89ea800556c6efba67b455d336db1d0
Arg [2] : _fee (uint256): 20

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 00000000000000000000000046038969d7dc0b17bc72137d07b4ede43859da45
Arg [1] : 0000000000000000000000009be9b0cfa89ea800556c6efba67b455d336db1d0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000014


Deployed ByteCode Sourcemap

27317:28470:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42822:716;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25108:176;;;;;;:::i;:::-;;:::i;:::-;;13895:21;;;;;-1:-1:-1;;;;;13895:21:0;;;;;;-1:-1:-1;;;;;11233:55:1;;;11215:74;;11203:2;11188:18;13895:21:0;11170:125:1;46658:661:0;;;;;;:::i;:::-;;:::i;:::-;;;18938:25:1;;;18926:2;18911:18;46658:661:0;18893:76:1;19858:227:0;;;;;;:::i;:::-;;:::i;:::-;;;;18722:14:1;;18715:22;18697:41;;18769:2;18754:18;;18747:34;;;;18670:18;19858:227:0;18652:135:1;13923:41:0;;;;;-1:-1:-1;;;;;13923:41:0;;;43620:109;;;:::i;:::-;;;;;;;:::i;27846:59::-;;;;;;:::i;:::-;;;;;;;;;;;;;;44106:699;;;:::i;:::-;;;;;;;:::i;43824:115::-;;;:::i;24339:184::-;;;;;;:::i;:::-;;:::i;:::-;;;18502:14:1;;18495:22;18477:41;;18465:2;18450:18;24339:184:0;18432:92:1;41790:480:0;;;;;;:::i;:::-;;:::i;48790:119::-;;;;;;:::i;:::-;-1:-1:-1;;;;;48881:20:0;48854:7;48881:20;;;:13;:20;;;;;;;48790:119;42458:198;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;28150:33::-;;;;;;:::i;:::-;;:::i;46004:167::-;;;;;;:::i;:::-;46101:7;46133:30;;;:21;:30;;;;;;;46004:167;33044:2636;;;;;;:::i;:::-;;:::i;45269:148::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;14564:547::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;28060:48::-;;;;;;:::i;:::-;;;;;;;;;;;;;;39575:1704;;;;;;:::i;:::-;;:::i;22839:183::-;;;;;;:::i;:::-;;:::i;27989:37::-;;;;;;:::i;:::-;;:::i;:::-;;;;22177:25:1;;;22233:2;22218:18;;22211:34;;;;22261:18;;;22254:34;22165:2;22150:18;27989:37:0;22132:162:1;35947:861:0;;;;;;:::i;:::-;;:::i;27750:56::-;;;;;;:::i;:::-;;;;;;;;;;;;;;41463:164;;;;;;:::i;:::-;;:::i;47587:229::-;;;;;;:::i;:::-;47731:4;47755:18;;;:8;:18;;;;;;;;:27;;;;;;;;;:53;;;:41;;;;:53;;;;;;;47587:229;37594:1760;;;;;;:::i;:::-;;:::i;15455:296::-;;;;;;:::i;:::-;;:::i;45638:176::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;27419:41::-;;;;;-1:-1:-1;;;;;27419:41:0;;;44971:122;;;;;;:::i;:::-;45037:7;45064:14;;;:4;:14;;;;;:21;;44971:122;48112:455;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;24768:194::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;28232:36::-;;;;;;:::i;:::-;;:::i;23823:215::-;;;;;;:::i;:::-;;:::i;27498:18::-;;;;;;23390:209;;;;;;:::i;:::-;;:::i;16198:3213::-;;;;;;:::i;:::-;;:::i;25595:649::-;;;;;;:::i;:::-;;:::i;27372:19::-;;;;;-1:-1:-1;;;;;27372:19:0;;;20622:1988;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;31251:1519::-;;;;;;:::i;:::-;;:::i;42822:716::-;42904:33;42955:23;42981:4;-1:-1:-1;;;;;42981:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;42981:21:0;;;;;;;;;;;;:::i;:::-;42955:47;;43013:55;43102:6;:13;43071:45;;;;;;-1:-1:-1;;;43071:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;43013:103;;43132:9;43127:378;43151:6;:13;43147:1;:17;43127:378;;;43186:30;43219:4;-1:-1:-1;;;;;43219:16:0;;43236:6;43243:1;43236:9;;;;;;-1:-1:-1;;;43236:9:0;;;;;;;;;;;;;;;43219:27;;;;;;;;;;;;;18938:25:1;;18926:2;18911:18;;18893:76;43219:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43186:60;;43261:16;43280:4;-1:-1:-1;;;;;43280:25:0;;43306:6;43313:1;43306:9;;;;;;-1:-1:-1;;;43306:9:0;;;;;;;;;;;;;;;43280:36;;;;;;;;;;;;;18938:25:1;;18926:2;18911:18;;18893:76;43280:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43357:16;;:39;;-1:-1:-1;;;43357:39:0;;;;;18938:25:1;;;43261:55:0;;-1:-1:-1;43331:23:0;;-1:-1:-1;;;;;43357:16:0;;;;:29;;18911:18:1;;43357:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;43357:39:0;;;;;;;;;;;;:::i;:::-;43331:65;;43433:11;43411:8;43420:1;43411:11;;;;;;-1:-1:-1;;;43411:11:0;;;;;;;;;;;;;;;:19;;:33;;;;43483:10;43459:8;43468:1;43459:11;;;;;;-1:-1:-1;;;43459:11:0;;;;;;;;;;;;;;;:21;;:34;;;;43127:378;;;43166:3;;;;;:::i;:::-;;;;43127:378;;;-1:-1:-1;43522:8:0;-1:-1:-1;;42822:716:0;:::o;25108:176::-;25189:17;;-1:-1:-1;;;;;25189:17:0;25181:40;25173:49;;;;;;25233:17;:43;;-1:-1:-1;;25233:43:0;-1:-1:-1;;;;;25233:43:0;;;;;;;;;;25108:176::o;46658:661::-;46807:25;46873:18;;;:8;:18;;;;;;;;:27;;;;;;;;46807:25;46919:218;46940:23;;;46919:218;;;47007:118;47042:7;47068:8;47095:11;;47107:2;47095:15;;;;;-1:-1:-1;;;47095:15:0;;;;;;;;;;;;;;;47007:16;:118::i;:::-;46986:139;;;;:::i;:::-;;-1:-1:-1;46965:4:0;;;;:::i;:::-;;;;46919:218;;;;47171:5;:13;;;47151:17;:33;47147:99;;;47221:5;:13;;;47201:33;;47147:99;47306:4;47299:3;;47279:17;:23;;;;:::i;:::-;47278:32;;;;:::i;:::-;47256:55;;;;:::i;:::-;;46658:661;-1:-1:-1;;;;;;46658:661:0:o;19858:227::-;19975:11;20027:6;;:50;;-1:-1:-1;;;20027:50:0;;;;;19148:25:1;;;19189:18;;;19182:34;;;19975:11:0;;-1:-1:-1;;;;;20027:6:0;;:28;;19121:18:1;;20027:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20020:57;;;;19858:227;;;;;;:::o;43620:109::-;43669:16;43705;43698:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43620:109;:::o;44106:699::-;44191:32;44241;44276:4;-1:-1:-1;;;;;44276:22:0;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;44276:24:0;;;;;;;;;;;;:::i;:::-;44241:59;;44311:39;44397:15;:22;44353:77;;;;;;-1:-1:-1;;;44353:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;44353:77:0;;;;;;;;;;;;;;;;44311:119;;44446:9;44441:333;44465:15;:22;44461:1;:26;44441:333;;;44530:16;;44578:18;;44509;;-1:-1:-1;;;;;44530:16:0;;:29;;44578:15;;44594:1;;44578:18;;;;-1:-1:-1;;;44578:18:0;;;;;;;;;;;;;;;44530:81;;;;;;;;;;;;;18938:25:1;;18926:2;18911:18;;18893:76;44530:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;44530:81:0;;;;;;;;;;;;:::i;:::-;44509:102;;44626:15;44644:4;-1:-1:-1;;;;;44644:18:0;;44663:15;44679:1;44663:18;;;;;;-1:-1:-1;;;44663:18:0;;;;;;;;;;;;;;;44644:38;;;;;;;;;;;;;18938:25:1;;18926:2;18911:18;;18893:76;44644:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44626:56;;44719:5;44697:6;44704:1;44697:9;;;;;;-1:-1:-1;;;44697:9:0;;;;;;;;;;;;;;;:19;;:27;;;;44755:7;44739:6;44746:1;44739:9;;;;;;-1:-1:-1;;;44739:9:0;;;;;;;;;;;;;;;:13;;:23;;;;;44441:333;;44489:3;;;;;:::i;:::-;;;;44441:333;;43824:115;43876:16;43912:19;43905:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43824:115;:::o;24339:184::-;24446:4;24475:6;;:40;;-1:-1:-1;;;24475:40:0;;;;;19148:25:1;;;19189:18;;;19182:34;;;-1:-1:-1;;;;;24475:6:0;;;;:18;;19121::1;;24475:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24468:47;;24339:184;;;;;:::o;41790:480::-;41852:7;41909:14;;;:4;:14;;;;;:21;41905:67;;-1:-1:-1;41959:1:0;41952:8;;41905:67;41985:27;42016:26;42033:8;42016:16;:26::i;:::-;42053:19;42075:14;;;:4;:14;;;;;42090:21;;41982:60;;-1:-1:-1;42053:19:0;;-1:-1:-1;42075:14:0;42090:25;;42114:1;;42090:25;:::i;:::-;42075:41;;;;;;-1:-1:-1;;;42075:41:0;;;;;;;;;;;;;;;;;;42053:63;;;;;;;;42075:41;;;;;;;42053:63;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42131:40:0;;42127:136;;;42195:15;;-1:-1:-1;42188:22:0;;-1:-1:-1;42188:22:0;42127:136;42250:1;42243:8;;;;41790:480;;;;:::o;42458:198::-;42546:18;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42546:18:0;-1:-1:-1;42590:40:0;42599:30;;;:21;:30;;;;;;;;;42590:40;;:8;:40;;;;;;:49;;;;;;;;;;42582:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42458:198::o;28150:33::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28150:33:0;:::o;33044:2636::-;33183:18;33204;;;:8;:18;;;;;;;;:27;;;;;;;;33261:21;;;;33301:12;33293:57;;;;-1:-1:-1;;;33293:57:0;;30375:2:1;33293:57:0;;;30357:21:1;;;30394:18;;;30387:30;30453:34;30433:18;;;30426:62;30505:18;;33293:57:0;;;;;;;;;33361:25;;33397:1828;33418:23;;;33397:1828;;;33526:8;33508:11;;33520:2;33508:15;;;;;-1:-1:-1;;;33508:15:0;;;;;;;;;;;;;;;33490;:33;;;;:::i;:::-;:44;33464:132;;;;-1:-1:-1;;;33464:132:0;;23998:2:1;33464:132:0;;;23980:21:1;24037:2;24017:18;;;24010:30;24076:28;24056:18;;;24049:56;24122:18;;33464:132:0;23970:176:1;33464:132:0;33690:10;33637:49;33660:8;33670:11;;33682:2;33670:15;;;;;-1:-1:-1;;;33670:15:0;;;;;;;;;;;;;;;33637:22;:49::i;:::-;-1:-1:-1;;;;;33637:63:0;;33611:184;;;;-1:-1:-1;;;33611:184:0;;27009:2:1;33611:184:0;;;26991:21:1;27048:2;27028:18;;;27021:30;27087:34;27067:18;;;27060:62;27158:29;27138:18;;;27131:57;27205:19;;33611:184:0;26981:249:1;33611:184:0;33831:118;33866:7;33892:8;33919:11;;33931:2;33919:15;;;;;-1:-1:-1;;;33919:15:0;;;;;;;;33831:118;33810:139;;;;:::i;:::-;;;33989:8;33968:17;:29;33964:1192;;34091:22;34112:1;34091:11;:22;:::i;:::-;34085:2;:28;34055:151;;;;-1:-1:-1;;;34055:151:0;;28149:2:1;34055:151:0;;;28131:21:1;28188:2;28168:18;;;28161:30;28227:34;28207:18;;;28200:62;-1:-1:-1;;;28278:18:1;;;28271:47;28335:19;;34055:151:0;28121:239:1;34055:151:0;34326:16;:23;34245:8;;-1:-1:-1;34352:1:0;-1:-1:-1;34322:720:0;;;34393:35;;;;34378:12;;34393:39;;34431:1;;34393:39;:::i;:::-;34553:16;34596:23;;34378:54;;-1:-1:-1;34553:16:0;34596:27;;34622:1;;34596:27;:::i;:::-;34553:93;;;;;;-1:-1:-1;;;34553:93:0;;;;;;;;;;;;;;;;;34528:16;34545:4;34528:22;;;;;;-1:-1:-1;;;34528:22:0;;;;;;;;;;;;;;;;:118;;;;34669:25;34697:16;34714:4;34697:22;;;;;;-1:-1:-1;;;34697:22:0;;;;;;;;;;;;;;;;;;;;;34771:88;;;:21;:88;;;;;;;;34697:22;;-1:-1:-1;35014:8:0;:4;35021:1;35014:8;:::i;:::-;34882:28;;;;:8;:28;;;;;;;;:47;;;;;;;;;:129;;:140;-1:-1:-1;34322:720:0;35060:16;:22;;;;;-1:-1:-1;;;35060:22:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;35060:22:0;;;;;;;;;;;;35101:35;;;:39;33964:1192;35209:4;35170:5;:19;;:36;35190:11;;35202:2;35190:15;;;;;-1:-1:-1;;;35190:15:0;;;;;;;;;;;;;;;35170:36;;;;;;;;;;;;:43;;;;;;;;;;;;;;;;;;33443:4;;;;;:::i;:::-;;;;33397:1828;;;;35260:17;35235:5;:13;;:21;;;:42;;;;;;;:::i;:::-;;;;-1:-1:-1;;35310:5:0;;35414:3;;-1:-1:-1;;;;;35310:5:0;;;;:14;;35343:10;;35421:4;;35394:23;;:17;:23;:::i;:::-;35393:32;;;;:::i;:::-;35372:54;;:17;:54;:::i;:::-;35310:131;;-1:-1:-1;;;;;;35310:131:0;;;;;;;-1:-1:-1;;;;;12696:55:1;;;35310:131:0;;;12678:74:1;12768:18;;;12761:34;12651:18;;35310:131:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35288:164;;;;;;35463:5;;;35485:6;35515:3;;-1:-1:-1;;;;;35463:5:0;;;;:13;;35485:6;;35522:4;;35495:23;;:17;:23;:::i;:::-;35494:32;;;;:::i;:::-;35463:64;;-1:-1:-1;;;;;;35463:64:0;;;;;;;-1:-1:-1;;;;;12696:55:1;;;35463:64:0;;;12678:74:1;12768:18;;;12761:34;12651:18;;35463:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;35538:6:0;;35584:3;;-1:-1:-1;;;;;35538:6:0;;;;:24;;35591:4;;35564:23;;:17;:23;:::i;:::-;35563:32;;;;:::i;:::-;35538:58;;;;;;;;;;;;;18938:25:1;;18926:2;18911:18;;18893:76;35538:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;35612:60:0;;35661:10;11215:74:1;;35642:17:0;;-1:-1:-1;35632:8:0;;-1:-1:-1;35623:7:0;;35612:60;;11203:2:1;11188:18;35612:60:0;;;;;;;33044:2636;;;;;;;:::o;45269:148::-;45358:12;45395:4;:14;45400:8;45395:14;;;;;;;;;;;45388:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45269:148;;;:::o;14564:547::-;14672:19;14693:27;14739:11;14752:14;14770:79;14805:8;14828:10;14770:20;:79::i;:::-;14738:111;;;;14865:6;14860:54;;14900:1;14888:14;;;;;;;;;;;;;;;;;;;;;14860:54;14946:47;14976:8;14986:6;14946:29;:47::i;:::-;14924:69;;15013:43;15026:8;15036:19;15013:12;:43::i;:::-;15004:52;;15067:36;;14564:547;;;;;:::o;39575:1704::-;39748:10;;39738:21;;;;;;;:::i;:::-;;;;;;;;39726:8;:33;39704:112;;;;-1:-1:-1;;;39704:112:0;;25116:2:1;39704:112:0;;;25098:21:1;25155:2;25135:18;;;25128:30;25194:31;25174:18;;;25167:59;25243:18;;39704:112:0;25088:179:1;39704:112:0;39845:1;39835:7;:11;39827:53;;;;-1:-1:-1;;;39827:53:0;;27791:2:1;39827:53:0;;;27773:21:1;27830:2;27810:18;;;27803:30;27869:31;27849:18;;;27842:59;27918:18;;39827:53:0;27763:179:1;39827:53:0;39891:19;39913:14;;;:4;:14;;;;;39942:12;;39938:805;;39987:38;;;;;;;;;;;40000:15;39987:38;;;;;;;;;;;;;39976:50;;;;;;;;-1:-1:-1;39976:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40041:16;:38;;-1:-1:-1;;;40041:38:0;;-1:-1:-1;;;;;40041:16:0;;;;:26;;:38;;40068:10;;;;40041:38;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39938:805;;;40115:27;40146:26;40163:8;40146:16;:26::i;:::-;40219:12;;40112:60;;-1:-1:-1;40213:5:0;;-1:-1:-1;40219:16:0;;40234:1;;40219:16;:::i;:::-;40213:23;;;;;;-1:-1:-1;;;40213:23:0;;;;;;;;;;;;;;;;;;;:33;;;40191:19;:55;40187:545;;;40273:12;;40303:15;;40267:5;;40273:16;;40288:1;;40273:16;:::i;:::-;40267:23;;;;;;-1:-1:-1;;;40267:23:0;;;;;;;;;;;;;;;;;;;:33;;:51;;;;40371:7;40337:5;40358:1;40343:5;:12;;;;:16;;;;:::i;:::-;40337:23;;;;;;-1:-1:-1;;;40337:23:0;;;;;;;;;;;;;;;;;;;:30;;;:41;;;;;;;:::i;:::-;;;;-1:-1:-1;;40403:12:0;;40439:7;;40397:5;;40403:16;;40418:1;;40403:16;:::i;:::-;40397:23;;;;;;-1:-1:-1;;;40397:23:0;;;;;;;;;;;;;;;;;;;:38;;;:49;;;;;;;:::i;:::-;;;;-1:-1:-1;40187:545:0;;-1:-1:-1;40187:545:0;;40487:5;40520:177;;;;;;;;40550:7;40520:177;;;;40584:15;40520:177;;;;40667:7;40626:5;40647:1;40632:5;:12;;;;:16;;;;:::i;:::-;40626:23;;;;;;-1:-1:-1;;;40626:23:0;;;;;;;;;;;;;;;;;;;:38;;;:48;;;;:::i;:::-;40520:177;;40487:229;;;;;;;;-1:-1:-1;40487:229:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40187:545;39938:805;;40771:34;;;;:24;:34;;;;;;:39;:83;;;;;40853:1;40827:23;40841:8;40827:13;:23::i;:::-;:27;40771:83;40753:252;;;40881:19;:34;;;;;;;;;;;;40967:26;-1:-1:-1;40930:34:0;;;:24;40881:34;40930;;;;:63;40753:252;41037:5;;:54;;-1:-1:-1;;;41037:54:0;;41056:10;41037:54;;;11563:34:1;41076:4:0;11613:18:1;;;11606:43;11665:18;;;11658:34;;;-1:-1:-1;;;;;41037:5:0;;;;:18;;11475::1;;41037:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41015:142;;;;-1:-1:-1;;;41015:142:0;;;;;;;:::i;:::-;41182:10;41168:25;;;;:13;:25;;;;;:36;;41197:7;;41168:25;:36;;41197:7;;41168:36;:::i;:::-;;;;;;;;41239:7;41229:8;41220:51;41248:10;;41260;41220:51;;;;;;;;:::i;:::-;;;;;;;;39575:1704;;;;;:::o;22839:183::-;22940:7;22972:6;;:42;;-1:-1:-1;;;22972:42:0;;;;;18938:25:1;;;-1:-1:-1;;;;;22972:6:0;;;;:32;;18911:18:1;;22972:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;27989:37::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27989:37:0;;-1:-1:-1;27989:37:0;:::o;35947:861::-;36069:25;36097:18;;;:8;:18;;;;;;;;:27;;;;;;;;36151:12;;36143:44;;;;-1:-1:-1;;;36143:44:0;;29328:2:1;36143:44:0;;;29310:21:1;29367:2;29347:18;;;29340:30;-1:-1:-1;;;29386:18:1;;;29379:45;29441:18;;36143:44:0;29300:165:1;36143:44:0;36216:1;36206:7;:11;36198:49;;;;-1:-1:-1;;;36198:49:0;;27437:2:1;36198:49:0;;;27419:21:1;27476:2;27456:18;;;27449:30;27515:27;27495:18;;;27488:55;27560:18;;36198:49:0;27409:175:1;36198:49:0;36275:7;36258:5;:13;;;:24;;;;;;;:::i;:::-;;;;-1:-1:-1;;36315:5:0;;:54;;-1:-1:-1;;;36315:54:0;;36334:10;36315:54;;;11563:34:1;36354:4:0;11613:18:1;;;11606:43;11665:18;;;11658:34;;;-1:-1:-1;;;;;36315:5:0;;;;:18;;11475::1;;36315:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36293:142;;;;-1:-1:-1;;;36293:142:0;;;;;;;:::i;:::-;36497:27;;;;:32;:53;;;;;36549:1;36533:5;:13;;;:17;36497:53;36493:184;;;36567:16;:30;;;;;;;-1:-1:-1;36567:30:0;;;;;;;;36642:23;36612:27;;;:53;36493:184;36701:10;36687:25;;;;:13;:25;;;;;:36;;36716:7;;36687:25;:36;;36716:7;;36687:36;:::i;:::-;;;;-1:-1:-1;;36739:61:0;;;36782:10;11937:74:1;;12047:13;;12042:2;12027:18;;12020:41;12115:4;12103:17;;12097:24;12077:18;;;12070:52;12176:4;12164:17;;12158:24;12153:2;12138:18;;12131:52;12238:4;12226:17;;12220:24;12214:3;12199:19;;12192:53;12300:4;12288:17;;12282:24;12276:3;12261:19;;12254:53;12362:4;12350:17;;12344:24;12338:3;12323:19;;12316:53;12424:4;12412:17;;12406:24;12400:3;12385:19;;12378:53;12486:4;12474:17;;12468:24;12462:3;12447:19;;12440:53;36739:61:0;;36773:7;;36763:8;;36754:7;;36739:61;;;;;;11924:3:1;36739:61:0;;;35947:861;;;;:::o;41463:164::-;41597:22;;;;:12;:22;;;;;;;;;41590:29;;;;;;;;;;;;;;;;;41556:16;;41590:29;;;41597:22;41590:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41463:164;;;:::o;37594:1760::-;37917:15;37989:10;;37979:21;;;;;;;:::i;:::-;;;;;;;;37967:8;:33;37945:112;;;;-1:-1:-1;;;37945:112:0;;25116:2:1;37945:112:0;;;25098:21:1;25155:2;25135:18;;;25128:30;25194:31;25174:18;;;25167:59;25243:18;;37945:112:0;25088:179:1;37945:112:0;38102:238;;;;;;19542:25:1;;;19583:18;;;19576:34;;;19626:18;;;19619:34;;;19669:18;;;19662:34;;;19712:19;;;19705:35;;;19756:19;;;19749:35;;;19800:19;;;19793:35;;;19514:19;;38102:238:0;;;-1:-1:-1;;38102:238:0;;;;;;;;;38078:273;;38102:238;38078:273;;;;38362:25;38390:18;;;:8;:18;;;;;:27;;;;;;;;38444:12;;38078:273;;-1:-1:-1;38390:27:0;38444:17;38436:61;;;;-1:-1:-1;;;38436:61:0;;26649:2:1;38436:61:0;;;26631:21:1;26688:2;26668:18;;;26661:30;26727:33;26707:18;;;26700:61;26778:18;;38436:61:0;26621:181:1;38436:61:0;38526:1;38516:7;:11;38508:56;;;;-1:-1:-1;;;38508:56:0;;24755:2:1;38508:56:0;;;24737:21:1;;;24774:18;;;24767:30;24833:34;24813:18;;;24806:62;24885:18;;38508:56:0;24727:182:1;38508:56:0;38595:1;38583:9;:13;38575:60;;;;-1:-1:-1;;;38575:60:0;;22904:2:1;38575:60:0;;;22886:21:1;22943:2;22923:18;;;22916:30;22982:34;22962:18;;;22955:62;-1:-1:-1;;;23033:18:1;;;23026:32;23075:19;;38575:60:0;22876:224:1;38575:60:0;38678:9;38668:7;:19;38646:109;;;;-1:-1:-1;;;38646:109:0;;26240:2:1;38646:109:0;;;26222:21:1;26279:2;26259:18;;;26252:30;26318:34;26298:18;;;26291:62;-1:-1:-1;;;26369:18:1;;;26362:38;26417:19;;38646:109:0;26212:230:1;38646:109:0;38766:22;;;38799:15;;;:28;;;38838:14;;;;:26;;;38875:12;;;;:22;;;38908:20;;;;:38;;;38957:29;;;:56;;;38766:12;39024:22;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;39071:30;;;:21;:30;;;;;;:41;;;39123:16;;:38;;-1:-1:-1;;;39123:38:0;;-1:-1:-1;;;;;39123:16:0;;;;:26;;:38;;39150:10;;;;39123:38;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39199:7;39189:8;39177:54;39208:10;;39220;39177:54;;;;;;;;:::i;:::-;;;;;;;;39246:11;;39242:80;;39274:36;39283:7;39292:8;39302:7;39274:8;:36::i;:::-;39332:14;37594:1760;;;;;;;;;;;;:::o;15455:296::-;15585:27;15664:6;;:79;;-1:-1:-1;;;15664:79:0;;;;;19148:25:1;;;19189:18;;;19182:34;;;15564:19:0;;15585:27;-1:-1:-1;;;;;15664:6:0;;:20;;19121:18:1;;15664:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;15664:79:0;;;;;;;;;;;;:::i;:::-;15630:113;;;;-1:-1:-1;15455:296:0;-1:-1:-1;;;;15455:296:0:o;45638:176::-;45749:10;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;45749:10:0;45784:14;;;;:4;:14;;;;;:22;;45799:6;;45784:22;;;;-1:-1:-1;;;45784:22:0;;;;;;;;;;;;;;;;;;;45777:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45638:176;;;;:::o;48112:455::-;48269:13;48295:21;48330:10;48319:29;;;;;;-1:-1:-1;;;48319:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48319:29:0;;48295:53;;48364:9;48359:176;48379:21;;;48359:176;;;48435:18;;;;:8;:18;;;;;;;;:27;;;;;;;;:41;;;48495:10;;48506:1;48495:13;;;;;-1:-1:-1;;;48495:13:0;;;;;;;;;;;;;;;48435:88;;;;;;;;;;;;;;;;;;;;;48422:7;48430:1;48422:10;;;;;;-1:-1:-1;;;48422:10:0;;;;;;;;;:101;;;:10;;;;;;;;;;;:101;48402:3;;;;:::i;:::-;;;;48359:176;;;-1:-1:-1;48552:7:0;48112:455;-1:-1:-1;;;;;48112:455:0:o;24768:194::-;24913:6;;:41;;-1:-1:-1;;;24913:41:0;;;;;19148:25:1;;;19189:18;;;19182:34;;;24876:12:0;;-1:-1:-1;;;;;24913:6:0;;:19;;19121:18:1;;24913:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;24913:41:0;;;;;;;;;;;;:::i;28232:36::-;;;;;;;;;;;;23823:215;23944:7;23976:6;;:54;;-1:-1:-1;;;23976:54:0;;;;;19148:25:1;;;19189:18;;;19182:34;;;-1:-1:-1;;;;;23976:6:0;;;;:36;;19121:18:1;;23976:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;23390:209::-;23508:7;23540:6;;:51;;-1:-1:-1;;;23540:51:0;;;;;19148:25:1;;;19189:18;;;19182:34;;;-1:-1:-1;;;;;23540:6:0;;;;:29;;19121:18:1;;23540:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;16198:3213::-;16314:11;16327:14;16359;16376:35;16402:8;16376:25;:35::i;:::-;16359:52;-1:-1:-1;16426:11:0;16422:34;;16447:5;16454:1;16439:17;;;;;;;16422:34;16467:8;;;;:::i;:::-;;-1:-1:-1;16501:4:0;;-1:-1:-1;16486:12:0;;16467:8;16486:12;16755:45;16785:8;16467;16755:29;:45::i;:::-;16733:67;;16838:10;16815:19;:33;16811:56;;16858:5;16865:1;16850:17;;;;;;;;;;;;16811:56;16900:47;16930:8;16940:6;16900:29;:47::i;:::-;16878:69;;16984:10;16962:19;:32;16958:132;;;17073:5;17063:15;;16958:132;17180:7;17173:1374;;;17232:1;17215:13;17222:6;17215:4;:13;:::i;:::-;17214:19;;;;:::i;:::-;17204:29;;17270:97;17318:8;17345:7;17270:29;:97::i;:::-;17248:119;;17408:10;17386:19;:32;17382:1154;;;17488:17;17508:113;17560:8;17591:11;17601:1;17591:7;:11;:::i;17508:113::-;17488:133;;17657:10;17644:9;:23;17640:279;;17762:5;17752:15;;17640:279;;;17888:11;17898:1;17888:7;:11;:::i;:::-;17881:18;;17640:279;17382:1154;;;;18004:17;18024:113;18076:8;18107:11;:7;18117:1;18107:11;:::i;18024:113::-;18004:133;;18172:10;18160:9;:22;18156:365;;;18277:5;;-1:-1:-1;18305:9:0;;;;:::i;:::-;;;;18359;18337:31;;18156:365;;;18490:11;:7;18500:1;18490:11;:::i;:::-;18481:20;;18156:365;17382:1154;;17173:1374;;;18617:42;18629:8;18639:19;18617:11;:42::i;:::-;18612:792;;18731:4;18737:7;18723:22;;;;;;;;;;;;18612:792;18870:42;18882:8;18892:19;18870:11;:42::i;:::-;:62;;;;;18926:6;18916:7;:16;18870:62;18845:297;;;18967:9;;;;:::i;:::-;;;;19017:109;19069:8;19100:7;19017:29;:109::i;:::-;18995:131;;18845:297;;;19189:6;19178:7;:17;:63;;;;;19199:42;19211:8;19221:19;19199:11;:42::i;:::-;19156:153;;;19284:5;19291:1;19276:17;;;;;;;;;;;;19156:153;19378:4;19384:7;19370:22;;;;;;;;;;;;25595:649;25835:17;;:34;;-1:-1:-1;;;25835:34:0;;;;;18938:25:1;;;25708:13:0;;;;;;;;-1:-1:-1;;;;;25835:17:0;;;;:29;;18911:18:1;;25835:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25816:53;-1:-1:-1;25880:24:0;25943:81;25816:53;25994:19;:15;26012:1;25994:19;:::i;25943:81::-;25915:109;-1:-1:-1;25915:109:0;-1:-1:-1;26039:15:0;26035:66;;26079:1;26082;26085:3;26071:18;;;;;;;;;;26035:66;26111:18;26132:23;26143:11;26132:10;:23::i;:::-;26111:44;-1:-1:-1;26232:3:0;;-1:-1:-1;;;;25595:649:0;;;;;;:::o;20622:1988::-;20820:22;;20937:16;;20978:89;21013:8;21036:20;21049:7;21036:10;:20;:::i;20978:89::-;20936:131;;;;21117:11;21112:86;;21153:14;;;21165:1;21153:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21169:16:0;;;21183:1;21169:16;;;;;;;;21145:41;;-1:-1:-1;21169:16:0;-1:-1:-1;21145:41:0;;-1:-1:-1;;21145:41:0;21112:86;21208:17;21308:43;21330:8;21340:10;21308:21;:43::i;:::-;21281:70;;-1:-1:-1;21281:70:0;-1:-1:-1;21281:70:0;21401:86;;21442:14;;;21454:1;21442:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21458:16:0;;;21472:1;21458:16;;;;;;;;21434:41;;-1:-1:-1;21458:16:0;-1:-1:-1;21434:41:0;;-1:-1:-1;;;21434:41:0;21401:86;21497:17;21529:14;21558:37;21612:9;21598:24;;;;;;-1:-1:-1;;;21598:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21598:24:0;;21558:64;;21700:439;21719:9;21707;:21;:61;;;;-1:-1:-1;21757:11:0;21748:6;21732:13;:9;21744:1;21732:13;:::i;:::-;:22;;;;:::i;:::-;:36;21707:61;21700:439;;;21785:27;21815:108;21863:8;21890:18;21902:6;21890:9;:18;:::i;21815:108::-;21785:138;;21943:42;21955:8;21965:19;21943:11;:42::i;:::-;21938:167;;22040:19;22006:20;22027:9;22006:31;;;;;;-1:-1:-1;;;22006:31:0;;;;;;;;;;;;;;;;;;:53;22078:11;;;;:::i;:::-;;;;21938:167;22119:8;;;;:::i;:::-;;;;21700:439;;;;22151:27;22193:9;22181:22;;;;;;-1:-1:-1;;;22181:22:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22151:52;;22214:33;22264:9;22250:24;;;;;;-1:-1:-1;;;22250:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22250:24:0;;22214:60;;22347:10;22342:211;22368:9;22363:2;:14;22342:211;;;22423:20;22460:2;22444:13;22456:1;22444:9;:13;:::i;:::-;:18;;;;:::i;:::-;22423:40;;;;;;-1:-1:-1;;;22423:40:0;;;;;;;;;;;;;;;22400:16;22417:2;22400:20;;;;;;-1:-1:-1;;;22400:20:0;;;;;;;;;;;;;;:63;;;;;22497:44;22510:8;22520:16;22537:2;22520:20;;;;;;-1:-1:-1;;;22520:20:0;;;;;;;;;;;;;;;22497:12;:44::i;:::-;22478:12;22491:2;22478:16;;;;;;-1:-1:-1;;;22478:16:0;;;;;;;;;;;;;;:63;;;;22379:4;;;;;:::i;:::-;;;;22342:211;;;-1:-1:-1;22571:12:0;;-1:-1:-1;22585:16:0;-1:-1:-1;;;;;;;20622:1988:0;;;;;;;;:::o;31251:1519::-;31406:1;31382:14;;;:4;:14;;;;;:21;31360:109;;;;-1:-1:-1;;;31360:109:0;;22501:2:1;31360:109:0;;;22483:21:1;22540:2;22520:18;;;22513:30;22579:34;22559:18;;;22552:62;-1:-1:-1;;;22630:18:1;;;22623:32;22672:19;;31360:109:0;22473:224:1;31360:109:0;31480:25;;31516:196;31537:23;;;31516:196;;;31604:96;31643:8;31670:11;;31682:2;31670:15;;;;;-1:-1:-1;;;31670:15:0;;;;;;;;;;;;;;;31604:20;:96::i;:::-;31583:117;;;;:::i;:::-;;-1:-1:-1;31562:4:0;;;;:::i;:::-;;;;31516:196;;;-1:-1:-1;31744:5:0;;31848:3;;-1:-1:-1;;;;;31744:5:0;;;;:14;;31777:10;;31855:4;;31828:23;;:17;:23;:::i;:::-;31827:32;;;;:::i;:::-;31806:54;;:17;:54;:::i;:::-;31744:131;;-1:-1:-1;;;;;;31744:131:0;;;;;;;-1:-1:-1;;;;;12696:55:1;;;31744:131:0;;;12678:74:1;12768:18;;;12761:34;12651:18;;31744:131:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31722:164;;;;;;31897:5;;;31919:6;31949:3;;-1:-1:-1;;;;;31897:5:0;;;;:13;;31919:6;;31956:4;;31929:23;;:17;:23;:::i;:::-;31928:32;;;;:::i;:::-;31897:64;;-1:-1:-1;;;;;;31897:64:0;;;;;;;-1:-1:-1;;;;;12696:55:1;;;31897:64:0;;;12678:74:1;12768:18;;;12761:34;12651:18;;31897:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;31972:6:0;;32018:3;;-1:-1:-1;;;;;31972:6:0;;;;:24;;32025:4;;31998:23;;:17;:23;:::i;:::-;31997:32;;;;:::i;:::-;31972:58;;;;;;;;;;;;;18938:25:1;;18926:2;18911:18;;18893:76;31972:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32045:23;32059:8;32045:13;:23::i;:::-;32041:648;;32094:34;;;;:24;:34;;;;;;:39;32090:588;;32154:12;32169:34;;;:24;:34;;;;;;:38;;32206:1;;32169:38;:::i;:::-;32323:19;32365:26;;32154:53;;-1:-1:-1;32323:19:0;32365:30;;32394:1;;32365:30;:::i;:::-;32323:91;;;;;;-1:-1:-1;;;32323:91:0;;;;;;;;;;;;;;;;;32295:19;32315:4;32295:25;;;;;;-1:-1:-1;;;32295:25:0;;;;;;;;;;;;;;;;:119;;;;32433:26;32462:19;32482:4;32462:25;;;;;;-1:-1:-1;;;32462:25:0;;;;;;;;;;;;;;;;;32433:54;;32553:4;32560:1;32553:8;;;;:::i;:::-;32506:44;;;;:24;:44;;;;;;:55;;;;32580:34;;;;;;:38;32637:19;:25;;;;;-1:-1:-1;;;32637:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;32090:588;;;32704:58;;32751:10;;32732:17;;32722:8;;32704:58;;;;;31251:1519;;;;:::o;53496:2288::-;53634:21;53721:7;53690:28;53708:10;53690:15;:28;:::i;:::-;:38;53668:118;;;;-1:-1:-1;;;53668:118:0;;30736:2:1;53668:118:0;;;30718:21:1;30775:2;30755:18;;;30748:30;30814:32;30794:18;;;30787:60;30864:18;;53668:118:0;30708:180:1;53668:118:0;53797:18;53818;;;:8;:18;;;;;;;;:27;;;;;;;;53865:31;;;:19;;;:31;;;;;;;;;53864:32;53856:67;;;;-1:-1:-1;;;53856:67:0;;30024:2:1;53856:67:0;;;30006:21:1;30063:2;30043:18;;;30036:30;30102:24;30082:18;;;30075:52;30144:18;;53856:67:0;29996:172:1;53856:67:0;54001:22;;;;53961:23;;;;53934:10;;54001:22;53948:36;;:10;:36;:::i;:::-;53947:76;;;;:::i;:::-;53934:89;;54076:10;54140:2;54115:5;:13;;:22;;;:27;;;;:::i;:::-;54089:23;;;;:53;;;;:::i;:::-;54076:66;;54196:28;54227:34;54240:8;54250:10;54227:12;:34::i;:::-;54196:65;;54280:15;:22;54306:1;54280:27;;54272:68;;;;-1:-1:-1;;;54272:68:0;;28567:2:1;54272:68:0;;;28549:21:1;28606:2;28586:18;;;28579:30;28645;28625:18;;;28618:58;28693:18;;54272:68:0;28539:178:1;54272:68:0;54366:34;54415:24;54453:35;54467:8;54477:10;54453:13;:35::i;:::-;54587:28;;;;54351:137;;-1:-1:-1;54351:137:0;-1:-1:-1;54499:20:0;;54587:33;54583:438;;54637:11;54651:29;54664:15;54651:12;:29::i;:::-;54637:43;;54695:11;54709:35;54722:21;54709:12;:35::i;:::-;54695:49;-1:-1:-1;54763:8:0;54759:251;;54807:5;54792:20;;54759:251;;;54845:3;54838;:10;54834:176;;54908:3;54894:9;54908:3;54894;:9;:::i;:::-;54885:19;;:5;:19;:::i;:::-;54884:27;;;;:::i;:::-;54869:42;;54834:176;;;54991:3;54977:9;54983:3;54991;54977:9;:::i;:::-;54968:19;;:5;:19;:::i;:::-;54967:27;;;;:::i;:::-;54952:42;;54834:176;54583:438;;;55047:20;;;-1:-1:-1;55047:13:0;55098:15;55111:2;55098:10;:15;:::i;:::-;55304:20;;;;55078:35;;-1:-1:-1;55292:32:0;;:57;;;;;55347:2;55328:16;:21;55292:57;55288:370;;;55436:37;;;;:49;;55476:9;;55436:49;:::i;:::-;55419:66;;;;:::i;:::-;;;55288:370;;;55559:28;;;;55544:43;;55518:128;;;;-1:-1:-1;;;55518:128:0;;29672:2:1;55518:128:0;;;29654:21:1;29711:2;29691:18;;;29684:30;29750:25;29730:18;;;29723:53;29793:18;;55518:128:0;29644:173:1;55518:128:0;55674:21;;;;:37;-1:-1:-1;55670:107:0;;;55744:21;;;;;-1:-1:-1;55670:107:0;53496:2288;;;;;;;;;;;;;:::o;52436:697::-;52530:19;52551:27;52596:14;52613:35;52639:8;52613:25;:35::i;:::-;52596:52;-1:-1:-1;52663:11:0;52659:65;;52699:9;;;;;;;;;;;;52710:1;52691:21;;;;;;;52659:65;52734:13;52819:271;52826:10;;52819:271;;52853:8;;;;:::i;:::-;;;;52884:47;52914:8;52924:6;52884:29;:47::i;:::-;52876:55;;52955:29;52968:8;52978:5;52955:12;:29::i;:::-;53003:13;;52946:38;;-1:-1:-1;53003:17:0;52999:80;;53057:5;-1:-1:-1;53041:22:0;;-1:-1:-1;53041:22:0;52999:80;52819:271;;;53108:9;;;;;;;;;-1:-1:-1;53108:9:0;;;-1:-1:-1;53119:5:0;-1:-1:-1;;52436:697:0;;;;:::o;26440:236::-;26527:15;;26560:109;26586:2;:9;26581:2;:14;26560:109;;;26650:2;26653;26650:6;;;;;;-1:-1:-1;;;26650:6:0;;;;;;;;;;;;;;;26628:13;:7;26638:3;26628:13;:::i;:::-;:29;;;;:::i;:::-;26618:39;-1:-1:-1;26597:4:0;;;;:::i;:::-;;;;26560:109;;;;26440:236;;;:::o;49624:2535::-;49728:18;49817:8;49786:28;49804:10;49786:15;:28;:::i;:::-;:39;49764:115;;;;-1:-1:-1;;;49764:115:0;;23998:2:1;49764:115:0;;;23980:21:1;24037:2;24017:18;;;24010:30;24076:28;24056:18;;;24049:56;24122:18;;49764:115:0;23970:176:1;49764:115:0;49899:33;49911:8;49921:10;49899:11;:33::i;:::-;49898:34;49890:61;;;;-1:-1:-1;;;49890:61:0;;23307:2:1;49890:61:0;;;23289:21:1;23346:2;23326:18;;;23319:30;-1:-1:-1;;;23365:18:1;;;23358:44;23419:18;;49890:61:0;23279:164:1;49890:61:0;49998:44;50021:8;50031:10;49998:22;:44::i;:::-;-1:-1:-1;;;;;49984:58:0;:10;-1:-1:-1;;;;;49984:58:0;;49962:143;;;;-1:-1:-1;;;49962:143:0;;28924:2:1;49962:143:0;;;28906:21:1;28963:2;28943:18;;;28936:30;29002:34;28982:18;;;28975:62;-1:-1:-1;;;29053:18:1;;;29046:33;29096:19;;49962:143:0;28896:225:1;49962:143:0;50116:19;50138:14;;;:4;:14;;;;;50205:12;;50138:14;;50116:19;;50251:227;50272:1;50258:11;50265:4;50258;:11;:::i;:::-;:15;50251:227;;;50313:1;50298:11;50305:4;50298;:11;:::i;:::-;50297:17;;;;:::i;:::-;50290:24;;50357:10;50333:5;50339:4;50333:11;;;;;;-1:-1:-1;;;50333:11:0;;;;;;;;;;;;;;;;;;;:21;;;:34;50329:138;;;50395:4;50388:11;;50329:138;;;50447:4;50440:11;;50329:138;50251:227;;;50491:24;50519:35;50533:8;50543:10;50519:13;:35::i;:::-;50488:66;;;50606:5;50612:4;50606:11;;;;;;-1:-1:-1;;;50606:11:0;;;;;;;;;;;;;;;;;;;:21;;;50587:16;:40;50565:123;;;;-1:-1:-1;;;50565:123:0;;24353:2:1;50565:123:0;;;24335:21:1;24392:2;24372:18;;;24365:30;24431:34;24411:18;;;24404:62;-1:-1:-1;;;24482:18:1;;;24475:31;24523:19;;50565:123:0;24325:223:1;50565:123:0;50735:5;50741:4;50735:11;;;;;;-1:-1:-1;;;50735:11:0;;;;;;;;;;;;;;;;;;;:21;;;50721:10;:35;;50699:115;;;;-1:-1:-1;;;50699:115:0;;25474:2:1;50699:115:0;;;25456:21:1;25513:2;25493:18;;;25486:30;25552:32;25532:18;;;25525:60;25602:18;;50699:115:0;25446:180:1;50699:115:0;50854:1;50833:5;50839:4;50833:11;;;;;;-1:-1:-1;;;50833:11:0;;;;;;;;;;;;;;;;;;;:18;;;:22;50825:54;;;;-1:-1:-1;;;50825:54:0;;23650:2:1;50825:54:0;;;23632:21:1;23689:2;23669:18;;;23662:30;-1:-1:-1;;;23708:18:1;;;23701:49;23767:18;;50825:54:0;23622:169:1;50825:54:0;50903:5;50909:4;50903:11;;;;;;-1:-1:-1;;;50903:11:0;;;;;;;;;;;;;;;;;;;:18;;;50890:31;;50953:1;50932:5;50938:4;50932:11;;;;;;-1:-1:-1;;;50932:11:0;;;;;;;;;;;;;;;;;;;;;:22;;;;50986:4;;51103:47;51125:8;51135:14;:10;51148:1;51135:14;:::i;51103:47::-;51079:71;-1:-1:-1;51162:11:0;;-1:-1:-1;51162:11:0;51199:90;51235:8;51258:20;:16;51277:1;51258:20;:::i;51199:90::-;51161:128;;-1:-1:-1;51161:128:0;-1:-1:-1;51331:1:0;51304:24;51161:128;51304:9;:24;:::i;:::-;:28;:39;;;;51337:6;51336:7;51304:39;51300:852;;;51365:6;51360:781;;51405:5;51411:10;51405:17;;;;;;-1:-1:-1;;;51405:17:0;;;;;;;;;;;;;;;;;;;:32;;;51392:45;;51360:781;;;51515:1;;51485:4;-1:-1:-1;51558:289:0;51579:1;51565:11;51572:4;51565;:11;:::i;:::-;:15;51558:289;;;51628:1;51613:11;51620:4;51613;:11;:::i;:::-;51612:17;;;;:::i;:::-;51605:24;;51680:16;51656:5;51662:4;51656:11;;;;;;-1:-1:-1;;;51656:11:0;;;;;;;;;;;;;;;;;;;:21;;;:40;51652:176;;;51732:4;51725:11;;51652:176;;;51800:4;51793:11;;51652:176;51558:289;;;51865:6;;;;:::i;:::-;;;;51901:10;51894:4;:17;51890:236;;;52088:5;52094:4;52088:11;;;;;;-1:-1:-1;;;52088:11:0;;;;;;;;;;;;;;;;;;;:18;;;52034:5;52040:4;52034:11;;;;;;-1:-1:-1;;;52034:11:0;;;;;;;;;;;;;;;;;;;:26;;;51974:5;51980:10;51974:17;;;;;;-1:-1:-1;;;51974:17:0;;;;;;;;;;;;;;;;;;;:32;;;:86;;;;:::i;:::-;:132;;;;:::i;:::-;51936:170;;51890:236;49624:2535;;;;;;;;;;;;;:::o;49135:238::-;49224:15;;49257:109;49283:2;:9;49278:2;:14;49257:109;;;49347:2;49350;49347:6;;;;;;-1:-1:-1;;;49347:6:0;;;;;;;;;;;;;;;49325:13;:7;49335:3;49325:13;:::i;:::-;:29;;;;:::i;:::-;49315:39;-1:-1:-1;49294:4:0;;;;:::i;:::-;;;;49257:109;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:395:1:-;;;141:3;134:4;126:6;122:17;118:27;108:2;;166:8;156;149:26;108:2;-1:-1:-1;196:20:1;;239:18;228:30;;225:2;;;278:8;268;261:26;225:2;322:4;314:6;310:17;298:29;;382:3;375:4;365:6;362:1;358:14;350:6;346:27;342:38;339:47;336:2;;;399:1;396;389:12;414:164;490:13;;539;;532:21;522:32;;512:2;;568:1;565;558:12;583:375;;;698:3;691:4;683:6;679:17;675:27;665:2;;723:8;713;706:26;665:2;-1:-1:-1;753:20:1;;796:18;785:30;;782:2;;;835:8;825;818:26;782:2;879:4;871:6;867:17;855:29;;931:3;924:4;915:6;907;903:19;899:30;896:39;893:2;;;948:1;945;938:12;963:512;;1069:3;1062:4;1054:6;1050:17;1046:27;1036:2;;1091:5;1084;1077:20;1036:2;1124:6;1118:13;1150:18;1146:2;1143:26;1140:2;;;1172:18;;:::i;:::-;1216:55;1259:2;1240:13;;-1:-1:-1;;1236:27:1;1265:4;1232:38;1216:55;:::i;:::-;1296:2;1287:7;1280:19;1342:3;1335:4;1330:2;1322:6;1318:15;1314:26;1311:35;1308:2;;;1363:5;1356;1349:20;1308:2;1380:64;1441:2;1434:4;1425:7;1421:18;1414:4;1406:6;1402:17;1380:64;:::i;:::-;1462:7;1026:449;-1:-1:-1;;;;1026:449:1:o;1480:257::-;;1592:2;1580:9;1571:7;1567:23;1563:32;1560:2;;;1613:6;1605;1598:22;1560:2;1657:9;1644:23;1676:31;1701:5;1676:31;:::i;:::-;1726:5;1550:187;-1:-1:-1;;;1550:187:1:o;1742:261::-;;1865:2;1853:9;1844:7;1840:23;1836:32;1833:2;;;1886:6;1878;1871:22;1833:2;1923:9;1917:16;1942:31;1967:5;1942:31;:::i;2008:992::-;;2134:2;2177;2165:9;2156:7;2152:23;2148:32;2145:2;;;2198:6;2190;2183:22;2145:2;2236:9;2230:16;2265:18;2306:2;2298:6;2295:14;2292:2;;;2327:6;2319;2312:22;2292:2;2370:6;2359:9;2355:22;2345:32;;2415:7;2408:4;2404:2;2400:13;2396:27;2386:2;;2442:6;2434;2427:22;2386:2;2476;2470:9;2498:2;2494;2491:10;2488:2;;;2504:18;;:::i;:::-;2550:2;2547:1;2543:10;2533:20;;2573:28;2597:2;2593;2589:11;2573:28;:::i;:::-;2635:15;;;2666:12;;;;2698:11;;;2728;;;2724:20;;2721:33;-1:-1:-1;2718:2:1;;;2772:6;2764;2757:22;2718:2;2799:6;2790:15;;2814:156;2828:2;2825:1;2822:9;2814:156;;;2885:10;;2873:23;;2846:1;2839:9;;;;;2916:12;;;;2948;;2814:156;;;-1:-1:-1;2989:5:1;2114:886;-1:-1:-1;;;;;;;;2114:886:1:o;3005:212::-;;3125:2;3113:9;3104:7;3100:23;3096:32;3093:2;;;3146:6;3138;3131:22;3093:2;3174:37;3201:9;3174:37;:::i;3222:495::-;;;;3385:2;3373:9;3364:7;3360:23;3356:32;3353:2;;;3406:6;3398;3391:22;3353:2;3434:37;3461:9;3434:37;:::i;:::-;3424:47;;3515:2;3504:9;3500:18;3494:25;3542:18;3534:6;3531:30;3528:2;;;3579:6;3571;3564:22;3528:2;3607:60;3659:7;3650:6;3639:9;3635:22;3607:60;:::i;:::-;3597:70;;;3707:2;3696:9;3692:18;3686:25;3676:35;;3343:374;;;;;:::o;3722:273::-;;;3859:2;3847:9;3838:7;3834:23;3830:32;3827:2;;;3880:6;3872;3865:22;3827:2;3908:37;3935:9;3908:37;:::i;:::-;3898:47;;3985:2;3974:9;3970:18;3964:25;3954:35;;3817:178;;;;;:::o;4000:190::-;;4112:2;4100:9;4091:7;4087:23;4083:32;4080:2;;;4133:6;4125;4118:22;4080:2;-1:-1:-1;4161:23:1;;4070:120;-1:-1:-1;4070:120:1:o;4195:194::-;;4318:2;4306:9;4297:7;4293:23;4289:32;4286:2;;;4339:6;4331;4324:22;4286:2;-1:-1:-1;4367:16:1;;4276:113;-1:-1:-1;4276:113:1:o;4394:525::-;;;;4558:2;4546:9;4537:7;4533:23;4529:32;4526:2;;;4579:6;4571;4564:22;4526:2;4620:9;4607:23;4597:33;;4681:2;4670:9;4666:18;4653:32;4708:18;4700:6;4697:30;4694:2;;;4745:6;4737;4730:22;4694:2;4789:70;4851:7;4842:6;4831:9;4827:22;4789:70;:::i;:::-;4516:403;;4878:8;;-1:-1:-1;4763:96:1;;-1:-1:-1;;;;4516:403:1:o;4924:593::-;;;;;5105:2;5093:9;5084:7;5080:23;5076:32;5073:2;;;5126:6;5118;5111:22;5073:2;5167:9;5154:23;5144:33;;5224:2;5213:9;5209:18;5196:32;5186:42;;5279:2;5268:9;5264:18;5251:32;5306:18;5298:6;5295:30;5292:2;;;5343:6;5335;5328:22;5292:2;5387:70;5449:7;5440:6;5429:9;5425:22;5387:70;:::i;:::-;5063:454;;;;-1:-1:-1;5476:8:1;-1:-1:-1;;;;5063:454:1:o;5522:326::-;;;;5668:2;5656:9;5647:7;5643:23;5639:32;5636:2;;;5689:6;5681;5674:22;5636:2;-1:-1:-1;;5717:23:1;;;5787:2;5772:18;;5759:32;;-1:-1:-1;5838:2:1;5823:18;;;5810:32;;5626:222;-1:-1:-1;5626:222:1:o;5853:258::-;;;5982:2;5970:9;5961:7;5957:23;5953:32;5950:2;;;6003:6;5995;5988:22;5950:2;-1:-1:-1;;6031:23:1;;;6101:2;6086:18;;;6073:32;;-1:-1:-1;5940:171:1:o;6116:565::-;;;;;6281:2;6269:9;6260:7;6256:23;6252:32;6249:2;;;6302:6;6294;6287:22;6249:2;6343:9;6330:23;6320:33;;6400:2;6389:9;6385:18;6372:32;6362:42;;6455:2;6444:9;6440:18;6427:32;6482:18;6474:6;6471:30;6468:2;;;6519:6;6511;6504:22;6468:2;6563:58;6613:7;6604:6;6593:9;6589:22;6563:58;:::i;6686:395::-;;;;;6849:3;6837:9;6828:7;6824:23;6820:33;6817:2;;;6871:6;6863;6856:22;6817:2;-1:-1:-1;;6899:23:1;;;6969:2;6954:18;;6941:32;;-1:-1:-1;7020:2:1;7005:18;;6992:32;;7071:2;7056:18;7043:32;;-1:-1:-1;6807:274:1;-1:-1:-1;6807:274:1:o;7086:979::-;;;;;;;;;;;7353:3;7341:9;7332:7;7328:23;7324:33;7321:2;;;7375:6;7367;7360:22;7321:2;7416:9;7403:23;7393:33;;7473:2;7462:9;7458:18;7445:32;7435:42;;7524:2;7513:9;7509:18;7496:32;7486:42;;7575:2;7564:9;7560:18;7547:32;7537:42;;7626:3;7615:9;7611:19;7598:33;7588:43;;7678:3;7667:9;7663:19;7650:33;7640:43;;7730:3;7719:9;7715:19;7702:33;7692:43;;7786:3;7775:9;7771:19;7758:33;7814:18;7806:6;7803:30;7800:2;;;7851:6;7843;7836:22;7800:2;7895:58;7945:7;7936:6;7925:9;7921:22;7895:58;:::i;:::-;7869:84;;7972:8;7962:18;;;7999:8;7989:18;;;8054:3;8043:9;8039:19;8026:33;8016:43;;7311:754;;;;;;;;;;;;;:::o;8070:355::-;;8202:2;8190:9;8181:7;8177:23;8173:32;8170:2;;;8223:6;8215;8208:22;8170:2;8261:9;8255:16;8294:18;8286:6;8283:30;8280:2;;;8331:6;8323;8316:22;8280:2;8359:60;8411:7;8402:6;8391:9;8387:22;8359:60;:::i;8430:729::-;;8560:3;8604:2;8592:9;8583:7;8579:23;8575:32;8572:2;;;8625:6;8617;8610:22;8572:2;8656:19;8672:2;8656:19;:::i;:::-;8643:32;;8704:9;8698:16;8691:5;8684:31;8768:2;8757:9;8753:18;8747:25;8742:2;8735:5;8731:14;8724:49;8826:2;8815:9;8811:18;8805:25;8800:2;8793:5;8789:14;8782:49;8884:2;8873:9;8869:18;8863:25;8858:2;8851:5;8847:14;8840:49;8943:3;8932:9;8928:19;8922:26;8916:3;8909:5;8905:15;8898:51;9003:3;8992:9;8988:19;8982:26;8976:3;8969:5;8965:15;8958:51;9063:3;9052:9;9048:19;9042:26;9036:3;9029:5;9025:15;9018:51;9123:3;9112:9;9108:19;9102:26;9096:3;9089:5;9085:15;9078:51;9148:5;9138:15;;;8540:619;;;;:::o;9558:268::-;;9646:6;9641:3;9634:19;9698:6;9691:5;9684:4;9679:3;9675:14;9662:43;9750:3;9743:4;9734:6;9729:3;9725:16;9721:27;9714:40;9815:4;9808:2;9804:7;9799:2;9791:6;9787:15;9783:29;9778:3;9774:39;9770:50;9763:57;;9624:202;;;;;:::o;9831:257::-;;9910:5;9904:12;9937:6;9932:3;9925:19;9953:63;10009:6;10002:4;9997:3;9993:14;9986:4;9979:5;9975:16;9953:63;:::i;:::-;10070:2;10049:15;-1:-1:-1;;10045:29:1;10036:39;;;;10077:4;10032:50;;9880:208;-1:-1:-1;;9880:208:1:o;10791:273::-;;10974:6;10966;10961:3;10948:33;11000:16;;11025:15;;;11000:16;10938:126;-1:-1:-1;10938:126:1:o;12806:645::-;12971:2;13023:21;;;13093:13;;12996:18;;;13115:22;;;12806:645;;12971:2;13194:15;;;;13168:2;13153:18;;;12806:645;13240:185;13254:6;13251:1;13248:13;13240:185;;;13329:13;;13322:21;13315:29;13303:42;;13400:15;;;;13365:12;;;;13276:1;13269:9;13240:185;;;-1:-1:-1;13442:3:1;;12951:500;-1:-1:-1;;;;;;12951:500:1:o;13456:635::-;13627:2;13679:21;;;13749:13;;13652:18;;;13771:22;;;13456:635;;13627:2;13850:15;;;;13824:2;13809:18;;;13456:635;13896:169;13910:6;13907:1;13904:13;13896:169;;;13971:13;;13959:26;;14040:15;;;;14005:12;;;;13932:1;13925:9;13896:169;;14096:1335;;14382:2;14371:9;14367:18;14412:2;14401:9;14394:21;14435:6;14470;14464:13;14501:6;14493;14486:22;14539:2;14528:9;14524:18;14517:25;;14601:2;14591:6;14588:1;14584:14;14573:9;14569:30;14565:39;14551:53;;14623:4;14662:2;14654:6;14650:15;14683:4;14696:254;14710:6;14707:1;14704:13;14696:254;;;14803:2;14799:7;14787:9;14779:6;14775:22;14771:36;14766:3;14759:49;14831:39;14863:6;14854;14848:13;14831:39;:::i;:::-;14821:49;-1:-1:-1;14928:12:1;;;;14893:15;;;;14732:1;14725:9;14696:254;;;-1:-1:-1;;14986:22:1;;;14966:18;;;14959:50;15062:13;;15084:24;;;15166:15;;;;15126;;;-1:-1:-1;15062:13:1;-1:-1:-1;15201:4:1;15214:189;15230:8;15225:3;15222:17;15214:189;;;15299:15;;15285:30;;15376:17;;;;15337:14;;;;15258:1;15249:11;15214:189;;;-1:-1:-1;15420:5:1;;14343:1088;-1:-1:-1;;;;;;;14343:1088:1:o;15436:1098::-;;15691:2;15731;15720:9;15716:18;15761:2;15750:9;15743:21;15784:6;15819;15813:13;15850:6;15842;15835:22;15888:2;15877:9;15873:18;15866:25;;15950:2;15940:6;15937:1;15933:14;15922:9;15918:30;15914:39;15900:53;;15988:2;15980:6;15976:15;16009:4;16022:483;16036:6;16033:1;16030:13;16022:483;;;16129:2;16125:7;16113:9;16105:6;16101:22;16097:36;16092:3;16085:49;16163:6;16157:13;16193:6;16212:48;16253:6;16248:2;16242:9;10176:5;10170:12;10165:3;10158:25;10232:4;10225:5;10221:16;10215:23;10208:4;10203:3;10199:14;10192:47;10288:4;10281:5;10277:16;10271:23;10264:4;10259:3;10255:14;10248:47;10344:4;10337:5;10333:16;10327:23;10320:4;10315:3;10311:14;10304:47;10400:4;10393:5;10389:16;10383:23;10376:4;10371:3;10367:14;10360:47;10456:4;10449:5;10445:16;10439:23;10432:4;10427:3;10423:14;10416:47;10512:4;10505:5;10501:16;10495:23;10488:4;10483:3;10479:14;10472:47;10568:4;10561:5;10557:16;10551:23;10544:4;10539:3;10535:14;10528:47;10148:433;;;16212:48;16307:2;16303;16299:11;16293:18;16273:38;;16352:2;16343:6;16335;16331:19;16324:31;16378:47;16421:2;16413:6;16409:15;16395:12;16378:47;:::i;:::-;16368:57;-1:-1:-1;;;16483:12:1;;;;16448:15;;;;16058:1;16051:9;16022:483;;;-1:-1:-1;16522:6:1;;15671:863;-1:-1:-1;;;;;;;15671:863:1:o;16539:1094::-;;16792:2;16832;16821:9;16817:18;16862:2;16851:9;16844:21;16885:6;16920;16914:13;16951:6;16943;16936:22;16977:2;16967:12;;17010:2;16999:9;16995:18;16988:25;;17072:2;17062:6;17059:1;17055:14;17044:9;17040:30;17036:39;17110:2;17102:6;17098:15;17131:4;17144:460;17158:6;17155:1;17152:13;17144:460;;;17223:22;;;-1:-1:-1;;17219:36:1;17207:49;;17279:13;;17325:9;;17347:18;;;17392:47;17423:15;;;17325:9;17392:47;:::i;:::-;17482:11;;;17476:18;17459:15;;;17452:43;;;;17582:12;;;;17378:61;-1:-1:-1;17547:15:1;;;;17180:1;17173:9;17144:460;;;-1:-1:-1;17621:6:1;;16772:861;-1:-1:-1;;;;;;;;16772:861:1:o;17638:694::-;17851:2;17903:21;;;17973:13;;17876:18;;;17995:22;;;17638:694;;17851:2;18074:15;;;;18048:2;18033:18;;;17638:694;18120:186;18134:6;18131:1;18128:13;18120:186;;;18183:41;18220:3;18211:6;18205:13;10655:12;;10643:25;;10717:4;10706:16;;;10700:23;10684:14;;;10677:47;10773:4;10762:16;;;10756:23;10740:14;;10733:47;10633:153;18183:41;18281:15;;;;18253:4;18244:14;;;;;18156:1;18149:9;18120:186;;19839:244;;19996:2;19985:9;19978:21;20016:61;20073:2;20062:9;20058:18;20050:6;20042;20016:61;:::i;20088:364::-;;20273:2;20262:9;20255:21;20293:61;20350:2;20339:9;20335:18;20327:6;20319;20293:61;:::i;:::-;20285:69;;-1:-1:-1;;;;;20394:6:1;20390:55;20385:2;20374:9;20370:18;20363:83;20245:207;;;;;;:::o;20457:217::-;;20604:2;20593:9;20586:21;20624:44;20664:2;20653:9;20649:18;20641:6;20624:44;:::i;20679:288::-;;20854:2;20843:9;20836:21;20874:44;20914:2;20903:9;20899:18;20891:6;20874:44;:::i;:::-;20866:52;;20954:6;20949:2;20938:9;20934:18;20927:34;20826:141;;;;;:::o;25631:402::-;25833:2;25815:21;;;25872:2;25852:18;;;25845:30;25911:34;25906:2;25891:18;;25884:62;-1:-1:-1;;;25977:2:1;25962:18;;25955:36;26023:3;26008:19;;25805:228::o;30893:259::-;31085:3;31070:19;;31098:48;31074:9;31128:6;10176:5;10170:12;10165:3;10158:25;10232:4;10225:5;10221:16;10215:23;10208:4;10203:3;10199:14;10192:47;10288:4;10281:5;10277:16;10271:23;10264:4;10259:3;10255:14;10248:47;10344:4;10337:5;10333:16;10327:23;10320:4;10315:3;10311:14;10304:47;10400:4;10393:5;10389:16;10383:23;10376:4;10371:3;10367:14;10360:47;10456:4;10449:5;10445:16;10439:23;10432:4;10427:3;10423:14;10416:47;10512:4;10505:5;10501:16;10495:23;10488:4;10483:3;10479:14;10472:47;10568:4;10561:5;10557:16;10551:23;10544:4;10539:3;10535:14;10528:47;10148:433;;;31157:234;10655:12;;10643:25;;10717:4;10706:16;;;10700:23;10684:14;;;10677:47;10773:4;10762:16;;;10756:23;10740:14;;;10733:47;31333:2;31318:18;;31345:40;10633:153;31902:275;31973:2;31967:9;32038:2;32019:13;;-1:-1:-1;;32015:27:1;32003:40;;32073:18;32058:34;;32094:22;;;32055:62;32052:2;;;32120:18;;:::i;:::-;32156:2;32149:22;31947:230;;-1:-1:-1;31947:230:1:o;32182:128::-;;32253:1;32249:6;32246:1;32243:13;32240:2;;;32259:18;;:::i;:::-;-1:-1:-1;32295:9:1;;32230:80::o;32315:217::-;;32381:1;32371:2;;-1:-1:-1;;;32406:31:1;;32460:4;32457:1;32450:15;32488:4;32413:1;32478:15;32371:2;-1:-1:-1;32517:9:1;;32361:171::o;32537:168::-;;32643:1;32639;32635:6;32631:14;32628:1;32625:21;32620:1;32613:9;32606:17;32602:45;32599:2;;;32650:18;;:::i;:::-;-1:-1:-1;32690:9:1;;32589:116::o;32710:125::-;;32778:1;32775;32772:8;32769:2;;;32783:18;;:::i;:::-;-1:-1:-1;32820:9:1;;32759:76::o;32840:258::-;32912:1;32922:113;32936:6;32933:1;32930:13;32922:113;;;33012:11;;;33006:18;32993:11;;;32986:39;32958:2;32951:10;32922:113;;;33053:6;33050:1;33047:13;33044:2;;;33088:1;33079:6;33074:3;33070:16;33063:27;33044:2;;32893:205;;;:::o;33103:136::-;;33170:5;33160:2;;33179:18;;:::i;:::-;-1:-1:-1;;;33215:18:1;;33150:89::o;33244:135::-;;-1:-1:-1;;33304:17:1;;33301:2;;;33324:18;;:::i;:::-;-1:-1:-1;33371:1:1;33360:13;;33291:88::o;33384:127::-;33445:10;33440:3;33436:20;33433:1;33426:31;33476:4;33473:1;33466:15;33500:4;33497:1;33490:15;33516:127;33577:10;33572:3;33568:20;33565:1;33558:31;33608:4;33605:1;33598:15;33632:4;33629:1;33622:15;33648:154;-1:-1:-1;;;;;33727:5:1;33723:54;33716:5;33713:65;33703:2;;33792:1;33789;33782:12;33703:2;33693:109;:::o

Metadata Hash

b61624ef0f357a5e7526f080dae2d83b72d8789cfb8d340d3bd07dd05386129c
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading