Contract 0x00f0feed50DcDF57b4f1B532E8f5e7f291E0C84b 2

Contract Overview

Balance:
0 Ether
Txn Hash
Method
Block
From
To
Value
0x321e3d15a46d6bb5407be34a522598881ff6a64e22af04cc8ad5b46306b46171Submit Feed114042002022-09-18 22:20:0410 days 16 hrs ago0x00f0000000f11a5380da5a184f0c563b5995fee2 IN  0x00f0feed50dcdf57b4f1b532e8f5e7f291e0c84b0 Ether0.01458697 2.33103441
0x1bdb45ab90e512e3b996cb9ab765957cdccc5cecff6a4b92b83123fc9dd1dfbaSubmit Feed114039612022-09-18 21:20:0910 days 17 hrs ago0x00f0000000f11a5380da5a184f0c563b5995fee2 IN  0x00f0feed50dcdf57b4f1b532e8f5e7f291e0c84b0 Ether0.01286942 2.05473892
0x7dbee0d051389a596f605ff234faa1fb69332cf604538f340a488e09eefbc101Submit Feed114037222022-09-18 20:19:5910 days 18 hrs ago0x00f0000000f11a5380da5a184f0c563b5995fee2 IN  0x00f0feed50dcdf57b4f1b532e8f5e7f291e0c84b0 Ether0.01092101 1.746
0x02a4ae2b37ef596e2951e8788b8074521dd4365e73e9f5b7893806bc0242c0f7Submit Feed114034842022-09-18 19:20:0410 days 19 hrs ago0x00f0000000f11a5380da5a184f0c563b5995fee2 IN  0x00f0feed50dcdf57b4f1b532e8f5e7f291e0c84b0 Ether0.00938644 1.5
0x66801a4423c7994c1d27edaf937ff5b657a750c9787910e0b09ce3f2e0dfea74Submit Feed114032452022-09-18 18:20:1010 days 20 hrs ago0x00f0000000f11a5380da5a184f0c563b5995fee2 IN  0x00f0feed50dcdf57b4f1b532e8f5e7f291e0c84b0 Ether0.01032979 1.650001
0xd3299a2a22b4fcbefde256e78dd425465ae9e7f7245e959a898dd1421f7a04dbSubmit Feed114030072022-09-18 17:20:0110 days 21 hrs ago0x00f0000000f11a5380da5a184f0c563b5995fee2 IN  0x00f0feed50dcdf57b4f1b532e8f5e7f291e0c84b0 Ether0.00938218 1.5
0x1be65945a515a6a1abb45c423d8f7126d93ba8b89c518f868f43512e4e41ca36Submit Feed114027682022-09-18 16:20:0610 days 22 hrs ago0x00f0000000f11a5380da5a184f0c563b5995fee2 IN  0x00f0feed50dcdf57b4f1b532e8f5e7f291e0c84b0 Ether0.00938664 1.5
0xc7e8a90dc58030167043e643c1d0a212d5381493cb0baebf66ccaa7f80107d81Submit Feed114025302022-09-18 15:20:0210 days 23 hrs ago0x00f0000000f11a5380da5a184f0c563b5995fee2 IN  0x00f0feed50dcdf57b4f1b532e8f5e7f291e0c84b0 Ether0.00938642 1.5
0x00ba328c1e5e3525a4c56158ec6334a35bd0c0f6a5be533feebf6e29b6ebb94cSubmit Feed114022912022-09-18 14:20:0411 days 20 mins ago0x00f0000000f11a5380da5a184f0c563b5995fee2 IN  0x00f0feed50dcdf57b4f1b532e8f5e7f291e0c84b0 Ether0.0102755 1.6428114
0x744643a99efa8203470c164578e8951b83452571bb1a8195c1ca12a6260b2d1bSubmit Feed114020522022-09-18 13:20:0011 days 1 hr ago0x00f0000000f11a5380da5a184f0c563b5995fee2 IN  0x00f0feed50dcdf57b4f1b532e8f5e7f291e0c84b0 Ether0.00938233 1.5
0xe21d79d1636760aa010d93b21dfc4e7cd44beaff13fa688dc391308b0df44232Submit Feed114018142022-09-18 12:20:0211 days 2 hrs ago0x00f0000000f11a5380da5a184f0c563b5995fee2 IN  0x00f0feed50dcdf57b4f1b532e8f5e7f291e0c84b0 Ether0.00937407 1.5
0x1a6c9faccba00475496cc0ea4d1d89b32493c71aa22f5f4cc9d62b76a8857b92Submit Feed114015752022-09-18 11:20:0211 days 3 hrs ago0x00f0000000f11a5380da5a184f0c563b5995fee2 IN  0x00f0feed50dcdf57b4f1b532e8f5e7f291e0c84b0 Ether0.00937816 1.5
0xe2a8f5c5b292d41926be9f6ad26205c14cf278e7b3a15dddeb0762af183d4c97Submit Feed114013362022-09-18 10:20:0511 days 4 hrs ago0x00f0000000f11a5380da5a184f0c563b5995fee2 IN  0x00f0feed50dcdf57b4f1b532e8f5e7f291e0c84b0 Ether0.00938235 1.5
0x0c09b8f3e39c1a38fe3c8e99d7a7c331466724f7469fde5a647a0be07966a63aSubmit Feed114010972022-09-18 9:19:5711 days 5 hrs ago0x00f0000000f11a5380da5a184f0c563b5995fee2 IN  0x00f0feed50dcdf57b4f1b532e8f5e7f291e0c84b0 Ether0.00937386 1.5
0x120268fadef572ac6ee7a4a00774ea0c990f8835eeb9143a8fb111f2dbaff437Submit Feed114008592022-09-18 8:20:0611 days 6 hrs ago0x00f0000000f11a5380da5a184f0c563b5995fee2 IN  0x00f0feed50dcdf57b4f1b532e8f5e7f291e0c84b0 Ether0.00937387 1.5
0xc21bc8bb5bf13e6d1a1009913a57083a2d056858fb963fa865bc82f9bb301a80Submit Feed114006212022-09-18 7:19:5911 days 7 hrs ago0x00f0000000f11a5380da5a184f0c563b5995fee2 IN  0x00f0feed50dcdf57b4f1b532e8f5e7f291e0c84b0 Ether0.00938233 1.5
0x5049aa12bff8de841bf3fd050a5af6b98f46476a1045c0205bfc202c0793e647Submit Feed114003822022-09-18 6:19:5811 days 8 hrs ago0x00f0000000f11a5380da5a184f0c563b5995fee2 IN  0x00f0feed50dcdf57b4f1b532e8f5e7f291e0c84b0 Ether0.0093822 1.5
0x4bf0e6b02f624f98ea61f2e39f865c143b7f6cddaa09cb660555df2a7f2f9d6bSubmit Feed114001432022-09-18 5:19:5511 days 9 hrs ago0x00f0000000f11a5380da5a184f0c563b5995fee2 IN  0x00f0feed50dcdf57b4f1b532e8f5e7f291e0c84b0 Ether0.00937804 1.5
0xb2ed3f70a0697d89fe994c99d11a1196816f7f33345522a31b25fc403dbecd89Submit Feed113999052022-09-18 4:20:0311 days 10 hrs ago0x00f0000000f11a5380da5a184f0c563b5995fee2 IN  0x00f0feed50dcdf57b4f1b532e8f5e7f291e0c84b0 Ether0.0093614 1.5
0x5973bf423b871995617923b65a7d1945a028a1ab34dc99abe530a0fc3e0b6fb7Submit Feed113996662022-09-18 3:20:0011 days 11 hrs ago0x00f0000000f11a5380da5a184f0c563b5995fee2 IN  0x00f0feed50dcdf57b4f1b532e8f5e7f291e0c84b0 Ether0.00938651 1.5
0xf32dd8bc49953bb731d7b6cb84a5516a8c04a31b7d7f5081a876160ea32c525bSubmit Feed113994262022-09-18 2:19:5311 days 12 hrs ago0x00f0000000f11a5380da5a184f0c563b5995fee2 IN  0x00f0feed50dcdf57b4f1b532e8f5e7f291e0c84b0 Ether0.00936971 1.5
0x2df4231b52ff9e949531a218ee173d37cd524ba19e8cf23ca03e9e95062cf11dSubmit Feed113991882022-09-18 1:20:0511 days 13 hrs ago0x00f0000000f11a5380da5a184f0c563b5995fee2 IN  0x00f0feed50dcdf57b4f1b532e8f5e7f291e0c84b0 Ether0.00938238 1.5
0x6234af455648dd89974fe382fdb8a721fd9384b5dd32da6f41745c9f883a2d0aSubmit Feed113989502022-09-18 0:20:0111 days 14 hrs ago0x00f0000000f11a5380da5a184f0c563b5995fee2 IN  0x00f0feed50dcdf57b4f1b532e8f5e7f291e0c84b0 Ether0.0093824 1.5
0x8de319fd5234c0c35b11e80a26c31bf235ea3aaa1bae63c886e8bb72c1529cfaSubmit Feed113987112022-09-17 23:20:0411 days 15 hrs ago0x00f0000000f11a5380da5a184f0c563b5995fee2 IN  0x00f0feed50dcdf57b4f1b532e8f5e7f291e0c84b0 Ether0.00938655 1.5
0xa07e2b29b7e329e046d2f9ca05cb440b204cbc203645db5d0cd39e3560eb7c63Submit Feed113984722022-09-17 22:19:5811 days 16 hrs ago0x00f0000000f11a5380da5a184f0c563b5995fee2 IN  0x00f0feed50dcdf57b4f1b532e8f5e7f291e0c84b0 Ether0.00938229 1.5
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
OpenOracleFramework

Compiler Version
v0.7.6+commit.7338295f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion
File 1 of 5 : OpenOracleFramework.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.7.6;
pragma abicoder v2;

import {Address} from "@openzeppelin/contracts/utils/Address.sol";
import "@openzeppelin/contracts/math/SafeMath.sol";
import "./interfaces/IConjureFactory.sol";
import "./interfaces/IConjureRouter.sol";

contract OpenOracleFramework {

    // using Openzeppelin contracts for SafeMath and Address
    using SafeMath for uint256;
    using Address for address;

    // the address of the collateral contract factory
    address public factoryContract;

    // address used for pay out
    address payable public payoutAddress;

    // number of signers
    uint256 public signerLength;

    // addresses of the signers
    address[] public signers;

    // threshold which has to be reached
    uint256 public signerThreshold;

    // struct to keep the values for each individual round
    struct feedRoundStruct {
        uint256 value;
        uint256 timestamp;
    }

    // stores historical values of feeds
    mapping(uint256 => mapping(uint256 => uint256)) private historicalFeeds;

    // indicates if sender is a signer
    mapping(address => bool) private isSigner;

    // mapping to store the actual submitted values per FeedId, per round number
    mapping(uint256 => mapping(uint256 => mapping(address => feedRoundStruct))) private feedRoundNumberToStructMapping;

    // indicates support of feeds
    mapping(uint256 => uint256) public feedSupport;

    // indicates if address si subscribed to a feed
    mapping(address => mapping(uint256 => uint256)) private subscribedTo;

    struct oracleStruct {
        string feedName;
        uint256 feedDecimals;
        uint256 feedTimeslot;
        uint256 latestPrice;
        uint256 latestPriceUpdate;
        // 0... donation, 1... subscription
        uint256 revenueMode;
        uint256 feedCost;
    }

    oracleStruct[] private feedList;

    // indicates if oracle subscription is turned on. 0 indicates no pass
    uint256 public subscriptionPassPrice;

    mapping(address => uint256) private hasPass;

    struct proposalStruct {
        uint256 uintValue;
        address addressValue;
        address proposer;
        // 0 ... pricePass
        // 1 ... threshold
        // 2 ... add signer
        // 3 ... remove signer
        // 4 ... payoutAddress
        // 5 ... revenueMode
        // 6 ... feedCost
        uint256 proposalType;
        uint256 proposalFeedId;
        uint256 proposalActive;
    }

    proposalStruct[] public proposalList;

    mapping(uint256 => mapping(address => bool)) private hasSignedProposal;

    event contractSetup(address[] signers, uint256 signerThreshold, address payout);
    event feedAdded(string name, string description, uint256 decimal, uint256 timeslot, uint256 feedId, uint256 mode, uint256 price);
    event feedSigned(uint256 feedId, uint256 roundId, uint256 value, uint256 timestamp, address signer);
    event routerFeeTaken(uint256 value, address sender);
    event feedSupported(uint256 feedId, uint256 supportvalue);
    event newProposal(uint256 proposalId, uint256 uintValue, address addressValue, uint256 oracleType, address proposer);
    event proposalSigned(uint256 proposalId, address signer);
    event newFee(uint256 value);
    event newThreshold(uint256 value);
    event newSigner(address signer);
    event signerRemoved(address signer);
    event newPayoutAddress(address payout);
    event newRevenueMode(uint256 mode, uint256 feed);
    event newFeedCost(uint256 cost, uint256 feed);
    event subscriptionPassPriceUpdated(uint256 newPass);

    // only Signer modifier
    modifier onlySigner {
        _onlySigner();
        _;
    }

    // only Signer view
    function _onlySigner() private view {
        require(isSigner[msg.sender], "Only a signer can perform this action");
    }

    constructor() {
        // Don't allow implementation to be initialized.
        //factoryContract = address(1);
    }

    function initialize(
        address[] memory signers_,
        uint256 signerThreshold_,
        address payable payoutAddress_,
        uint256 subscriptionPassPrice_,
        address factoryContract_
    ) external
    {
        require(factoryContract == address(0), "already initialized");
        require(factoryContract_ != address(0), "factory can not be null");
        require(signerThreshold_ != 0, "Threshold cant be 0");
        require(signerThreshold_ <= signers_.length, "Threshold cant be more then signer count");

        factoryContract = factoryContract_;
        signerThreshold = signerThreshold_;
        signers = signers_;

        for(uint i=0; i< signers.length; i++) {
            require(signers[i] != address(0), "Not zero address");
            isSigner[signers[i]] = true;
        }

        signerLength = signers_.length;
        payoutAddress = payoutAddress_;
        subscriptionPassPrice = subscriptionPassPrice_;

        emit contractSetup(signers_, signerThreshold, payoutAddress);
    }

    //---------------------------helper functions---------------------------

    /**
    * @dev implementation of a quicksort algorithm
    *
    * @param arr the array to be sorted
    * @param left the left outer bound element to start the sort
    * @param right the right outer bound element to stop the sort
    */
    function quickSort(uint[] memory arr, int left, int right) private pure {
        int i = left;
        int j = right;
        if (i == j) return;
        uint pivot = arr[uint(left + (right - left) / 2)];
        while (i <= j) {
            while (arr[uint(i)] < pivot) i++;
            while (pivot < arr[uint(j)]) j--;
            if (i <= j) {
                (arr[uint(i)], arr[uint(j)]) = (arr[uint(j)], arr[uint(i)]);
                i++;
                j--;
            }
        }
        if (left < j)
            quickSort(arr, left, j);
        if (i < right)
            quickSort(arr, i, right);
    }

    /**
    * @dev sort implementation which calls the quickSort function
    *
    * @param data the array to be sorted
    * @return the sorted array
    */
    function sort(uint[] memory data) private pure returns (uint[] memory) {
        quickSort(data, int(0), int(data.length - 1));
        return data;
    }

    //---------------------------view functions ---------------------------

    function getHistoricalFeeds(uint256[] memory feedIDs, uint256[] memory timestamps) external view returns (uint256[] memory) {

        uint256 feedLen = feedIDs.length;
        uint256[] memory returnPrices = new uint256[](feedLen);
        require(feedIDs.length == timestamps.length, "Feeds and Timestamps must match");

        for (uint i = 0; i < feedIDs.length; i++) {

            if (subscriptionPassPrice > 0) {
                if (hasPass[msg.sender] <= block.timestamp) {
                    if (feedList[feedIDs[i]].revenueMode == 1 && subscribedTo[msg.sender][feedIDs[i]] < block.timestamp) {
                        revert("No subscription to feed");
                    }
                }
            } else {
                if (feedList[feedIDs[i]].revenueMode == 1 && subscribedTo[msg.sender][feedIDs[i]] < block.timestamp) {
                    revert("No subscription to feed");
                }
            }

            uint256 roundNumber = timestamps[i] / feedList[feedIDs[i]].feedTimeslot;
            returnPrices[i] =  historicalFeeds[feedIDs[i]][roundNumber];
        }

        return (returnPrices);
    }


    /**
    * @dev getFeeds function lets anyone call the oracle to receive data (maybe pay an optional fee)
    *
    * @param feedIDs the array of feedIds
    */
    function getFeeds(uint256[] memory feedIDs) external view returns (uint256[] memory, uint256[] memory, uint256[] memory) {

        uint256 feedLen = feedIDs.length;
        uint256[] memory returnPrices = new uint256[](feedLen);
        uint256[] memory returnTimestamps = new uint256[](feedLen);
        uint256[] memory returnDecimals = new uint256[](feedLen);

        for (uint i = 0; i < feedIDs.length; i++) {
            (returnPrices[i] ,returnTimestamps[i], returnDecimals[i]) = getFeed(feedIDs[i]);
        }

        return (returnPrices, returnTimestamps, returnDecimals);
    }

    /**
    * @dev getFeed function lets anyone call the oracle to receive data (maybe pay an optional fee)
    *
    * @param feedID the array of feedId
    */
    function getFeed(uint256 feedID) public view returns (uint256, uint256, uint256) {

        uint256 returnPrice;
        uint256 returnTimestamp;
        uint256 returnDecimals;

        if (subscriptionPassPrice > 0) {
            if (hasPass[msg.sender] <= block.timestamp) {
                if (feedList[feedID].revenueMode == 1 && subscribedTo[msg.sender][feedID] < block.timestamp) {
                    revert("No subscription to feed");
                }
            }
        } else {
            if (feedList[feedID].revenueMode == 1 && subscribedTo[msg.sender][feedID] < block.timestamp) {
                revert("No subscription to feed");
            }
        }

        returnPrice = feedList[feedID].latestPrice;
        returnTimestamp = feedList[feedID].latestPriceUpdate;
        returnDecimals = feedList[feedID].feedDecimals;

        return (returnPrice, returnTimestamp, returnDecimals);
    }

    function getFeedLength() external view returns(uint256){
        return feedList.length;
    }

    function getFeedList(uint256[] memory feedIDs) external view returns(string[] memory, uint256[] memory, uint256[] memory, uint256[] memory, uint256[] memory) {

        uint256 feedLen = feedIDs.length;
        string[] memory returnNames = new string[](feedLen);
        uint256[] memory returnDecimals = new uint256[](feedLen);
        uint256[] memory returnTimeslot = new uint256[](feedLen);
        uint256[] memory returnRevenueMode = new uint256[](feedLen);
        uint256[] memory returnCost = new uint256[](feedLen);

        for (uint i = 0; i < feedIDs.length; i++) {
            returnNames[i] = feedList[feedIDs[i]].feedName;
            returnDecimals[i] = feedList[feedIDs[i]].feedDecimals;
            returnTimeslot[i] = feedList[feedIDs[i]].feedTimeslot;
            returnRevenueMode[i] = feedList[feedIDs[i]].revenueMode;
            returnCost[i] = feedList[feedIDs[i]].feedCost;
        }

        return (returnNames, returnDecimals, returnTimeslot, returnRevenueMode, returnCost);
    }

    //---------------------------oracle management functions ---------------------------

    // function to withdraw funds
    function withdrawFunds() external {

        if (payoutAddress == address(0)) {
            for (uint n = 0; n < signers.length; n++){
                payable(signers[n]).transfer(address(this).balance/signers.length);
            }
        } else {
            payoutAddress.transfer(address(this).balance);
        }
    }

    function createNewFeeds(string[] memory names, string[] memory descriptions, uint256[] memory decimals, uint256[] memory timeslots, uint256[] memory feedCosts, uint256[] memory revenueModes) onlySigner external {
        require(names.length == descriptions.length, "Length mismatch");
        require(descriptions.length == decimals.length, "Length mismatch");
        require(decimals.length == timeslots.length, "Length mismatch");
        require(timeslots.length == feedCosts.length, "Length mismatch");
        require(feedCosts.length == revenueModes.length, "Length mismatch");

        for(uint i = 0; i < names.length; i++) {
            require(decimals[i] <= 18, "Decimal places too high");
            require(timeslots[i] > 0, "Timeslot cannot be 0");
            require(revenueModes[i] <= 1, "Wrong revenueMode parameter");

            feedList.push(oracleStruct({
            feedName: names[i],
            feedDecimals: decimals[i],
            feedTimeslot: timeslots[i],
            latestPrice: 0,
            latestPriceUpdate: 0,
            revenueMode: revenueModes[i],
            feedCost: feedCosts[i]
            }));

            emit feedAdded(names[i], descriptions[i], decimals[i], timeslots[i], feedList.length - 1, revenueModes[i], feedCosts[i]);
        }
    }

    /**
    * @dev submitFeed function lets a signer submit as many feeds as they want to
    *
    * @param values the array of values
    * @param feedIDs the array of feedIds
    */
    function submitFeed(uint256[] memory feedIDs, uint256[] memory values) onlySigner external {
        require(values.length == feedIDs.length, "Value length and feedID length do not match");

        // process feeds
        for (uint i = 0; i < values.length; i++) {
            // get current round number for feed
            uint256 roundNumber = block.timestamp / feedList[feedIDs[i]].feedTimeslot;

            // check if the signer already pushed an update for the given period
            if (feedRoundNumberToStructMapping[feedIDs[i]][roundNumber][msg.sender].timestamp != 0) {
                delete feedRoundNumberToStructMapping[feedIDs[i]][roundNumber][msg.sender];
            }

            // feed - number and push value
            feedRoundNumberToStructMapping[feedIDs[i]][roundNumber][msg.sender] = feedRoundStruct({
            value: values[i],
            timestamp: block.timestamp
            });

            emit feedSigned(feedIDs[i], roundNumber, values[i], block.timestamp, msg.sender);

            // check if threshold was met
            uint256 signedFeedsLen;
            uint256[] memory prices = new uint256[](signers.length);
            uint256 k;

            for (uint j = 0; j < signers.length; j++) {
                if (feedRoundNumberToStructMapping[feedIDs[i]][roundNumber][signers[j]].timestamp != 0) {
                    signedFeedsLen++;
                    prices[k++] = feedRoundNumberToStructMapping[feedIDs[i]][roundNumber][signers[j]].value;
                }
            }

            // Change the list size of the array in place
            assembly {
                mstore(prices, k)
            }

            // if threshold is met process price
            if (signedFeedsLen >= signerThreshold) {

                uint[] memory sorted = sort(prices);
                uint returnPrice;

                // uneven so we can take the middle
                if (sorted.length % 2 == 1) {
                    uint sizer = (sorted.length + 1) / 2;
                    returnPrice = sorted[sizer-1];
                    // take average of the 2 most inner numbers
                } else {
                    uint size1 = (sorted.length) / 2;
                    returnPrice =  (sorted[size1-1]+sorted[size1])/2;
                }

                // process the struct for storing
                if (block.timestamp / feedList[feedIDs[i]].feedTimeslot > feedList[feedIDs[i]].latestPriceUpdate / feedList[feedIDs[i]].feedTimeslot) {
                    historicalFeeds[feedIDs[i]][feedList[feedIDs[i]].latestPriceUpdate / feedList[feedIDs[i]].feedTimeslot] = feedList[feedIDs[i]].latestPrice;
                }
                feedList[feedIDs[i]].latestPriceUpdate = block.timestamp;
                feedList[feedIDs[i]].latestPrice = returnPrice;
            }
        }
    }

    function signProposal(uint256 proposalId) onlySigner external {
        require(proposalList[proposalId].proposalActive != 0, "Proposal not active");

        hasSignedProposal[proposalId][msg.sender] = true;
        emit proposalSigned(proposalId, msg.sender);

        uint256 signedProposalLen;

        for(uint i = 0; i < signers.length; i++) {
            if (hasSignedProposal[proposalId][signers[i]]) {
                signedProposalLen++;
            }
        }

        // execute proposal
        if (signedProposalLen >= signerThreshold) {
            if (proposalList[proposalId].proposalType == 0) {
                updatePricePass(proposalList[proposalId].uintValue);
            } else if (proposalList[proposalId].proposalType == 1) {
                updateThreshold(proposalList[proposalId].uintValue);
            } else if (proposalList[proposalId].proposalType == 2) {
                addSigners(proposalList[proposalId].addressValue);
            } else if (proposalList[proposalId].proposalType == 3) {
                removeSigner(proposalList[proposalId].addressValue);
            } else if (proposalList[proposalId].proposalType == 4) {
                updatePayoutAddress(proposalList[proposalId].addressValue);
            } else if (proposalList[proposalId].proposalType == 5) {
                updateRevenueMode(proposalList[proposalId].uintValue, proposalList[proposalId].proposalFeedId);
            } else {
                updateFeedCost(proposalList[proposalId].uintValue, proposalList[proposalId].proposalFeedId);
            }

            // lock proposal
            proposalList[proposalId].proposalActive = 0;
        }
    }

    function createProposal(uint256 uintValue, address addressValue, uint256 proposalType, uint256 feedId) onlySigner external {

        uint256 proposalArrayLen = proposalList.length;

        // fee or threshold
        if (proposalType == 0 || proposalType == 1 || proposalType == 7) {
            proposalList.push(proposalStruct({
            uintValue: uintValue,
            addressValue: address(0),
            proposer: msg.sender,
            proposalType: proposalType,
            proposalFeedId: 0,
            proposalActive: 1
            }));
        } else if (proposalType == 5 || proposalType == 6) {
            proposalList.push(proposalStruct({
            uintValue: uintValue,
            addressValue: address(0),
            proposer: msg.sender,
            proposalType: proposalType,
            proposalFeedId : feedId,
            proposalActive: 1
            }));
        } else {
            proposalList.push(proposalStruct({
            uintValue: 0,
            addressValue: addressValue,
            proposer: msg.sender,
            proposalType: proposalType,
            proposalFeedId : 0,
            proposalActive: 1
            }));
        }

        hasSignedProposal[proposalArrayLen][msg.sender] = true;

        emit newProposal(proposalArrayLen, uintValue, addressValue, proposalType, msg.sender);
        emit proposalSigned(proposalArrayLen, msg.sender);
    }

    function updatePricePass(uint256 newPricePass) private {
        subscriptionPassPrice = newPricePass;

        emit subscriptionPassPriceUpdated(newPricePass);
    }

    function updateRevenueMode(uint256 newRevenueModeValue, uint256 feedId ) private {
        require(newRevenueModeValue <= 1, "Invalid argument for revenue Mode");
        feedList[feedId].revenueMode = newRevenueModeValue;
        emit newRevenueMode(newRevenueModeValue, feedId);
    }

    function updateFeedCost(uint256 feedCost, uint256 feedId) private {
        require(feedCost > 0, "Feed price cant be 0");
        feedList[feedId].feedCost = feedCost;
        emit newFeedCost(feedCost, feedId);
    }

    function updateThreshold(uint256 newThresholdValue) private {
        require(newThresholdValue != 0, "Threshold cant be 0");
        require(newThresholdValue <= signerLength, "Threshold cant be bigger then length of signers");

        signerThreshold = newThresholdValue;
        emit newThreshold(newThresholdValue);
    }

    function addSigners(address newSignerValue) private {

        // check for duplicate signer
        for (uint i=0; i < signers.length; i++) {
            if (signers[i] == newSignerValue) {
                revert("Signer already exists");
            }
        }

        signers.push(newSignerValue);
        signerLength++;
        isSigner[newSignerValue] = true;
        emit newSigner(newSignerValue);
    }

    function updatePayoutAddress(address newPayoutAddressValue) private {
        payoutAddress = payable(newPayoutAddressValue);
        emit newPayoutAddress(newPayoutAddressValue);
    }

    function removeSigner(address toRemove) internal {
        require(isSigner[toRemove], "Address to remove has to be a signer");
        require(signers.length -1 >= signerThreshold, "Less signers than threshold");

        for (uint i = 0; i < signers.length; i++) {
            if (signers[i] == toRemove) {
                delete signers[i];
                signerLength --;
                isSigner[toRemove] = false;
                emit signerRemoved(toRemove);
            }
        }
    }

    //---------------------------subscription functions---------------------------

    function subscribeToFeed(uint256[] memory feedIDs, uint256[] memory durations, address buyer) payable external {
        require(feedIDs.length == durations.length, "Length mismatch");

        uint256 total;
        for (uint i = 0; i < feedIDs.length; i++) {
            require(feedList[feedIDs[i]].revenueMode == 1, "Donation mode turned on");
            require(durations[i] >= 3600, "Minimum subscription is 1h");

            if (subscribedTo[buyer][feedIDs[i]] <=block.timestamp) {
                subscribedTo[buyer][feedIDs[i]] = block.timestamp.add(durations[i]);
            } else {
                subscribedTo[buyer][feedIDs[i]] = subscribedTo[buyer][feedIDs[i]].add(durations[i]);
            }

            total += feedList[feedIDs[i]].feedCost * durations[i] / 3600;
        }

        // check if enough payment was sent
        require(msg.value >= total, "Not enough funds sent to cover oracle fees");

        // send feeds to router
        address payable conjureRouter = IConjureFactory(factoryContract).getConjureRouter();
        IConjureRouter(conjureRouter).deposit{value:msg.value/50}();
        emit routerFeeTaken(msg.value/50, msg.sender);
    }

    function buyPass(address buyer, uint256 duration) payable external {
        require(subscriptionPassPrice != 0, "Subscription Pass turned off");
        require(duration >= 3600, "Minimum subscription is 1h");
        require(msg.value >= subscriptionPassPrice * duration / 86400, "Not enough payment");

        if (hasPass[buyer] <=block.timestamp) {
            hasPass[buyer] = block.timestamp.add(duration);
        } else {
            hasPass[buyer] = hasPass[buyer].add(duration);
        }

        address payable conjureRouter = IConjureFactory(factoryContract).getConjureRouter();
        IConjureRouter(conjureRouter).deposit{value:msg.value/50}();
        emit routerFeeTaken(msg.value/50, msg.sender);
    }

    function supportFeeds(uint256[] memory feedIds, uint256[] memory values) payable external {
        require(feedIds.length == values.length, "Length mismatch");

        uint256 total;
        for (uint i = 0; i < feedIds.length; i++) {
            require(feedList[feedIds[i]].revenueMode == 0, "Subscription mode turned on");
            feedSupport[feedIds[i]] = feedSupport[feedIds[i]].add(values[i]);
            total += values[i];

            emit feedSupported(feedIds[i], values[i]);
        }

        require(msg.value >= total, "Msg.value does not meet support values");

        address payable conjureRouter = IConjureFactory(factoryContract).getConjureRouter();
        IConjureRouter(conjureRouter).deposit{value:total/100}();
        emit routerFeeTaken(total/100, msg.sender);
    }
}

File 2 of 5 : Address.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.2 <0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain`call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
      return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

File 3 of 5 : SafeMath.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        uint256 c = a + b;
        if (c < a) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b > a) return (false, 0);
        return (true, a - b);
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) return (true, 0);
        uint256 c = a * b;
        if (c / a != b) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a / b);
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a % b);
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");
        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a, "SafeMath: subtraction overflow");
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) return 0;
        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0, "SafeMath: division by zero");
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0, "SafeMath: modulo by zero");
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        return a - b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryDiv}.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a % b;
    }
}

File 4 of 5 : IConjureFactory.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.7.6;

/// @author Conjure Finance Team
/// @title IConjureFactory
/// @notice Interface for interacting with the ConjureFactory Contract
interface IConjureFactory {

    /**
     * @dev gets the current conjure router
     *
     * @return the current conjure router
    */
    function getConjureRouter() external returns (address payable);
}

File 5 of 5 : IConjureRouter.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.7.6;

/// @author Conjure Finance Team
/// @title IConjureRouter
/// @notice Interface for interacting with the ConjureRouter Contract
interface IConjureRouter {

    /**
     * @dev calls the deposit function
    */
    function deposit() external payable;
}

Settings
{
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"signers","type":"address[]"},{"indexed":false,"internalType":"uint256","name":"signerThreshold","type":"uint256"},{"indexed":false,"internalType":"address","name":"payout","type":"address"}],"name":"contractSetup","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"name","type":"string"},{"indexed":false,"internalType":"string","name":"description","type":"string"},{"indexed":false,"internalType":"uint256","name":"decimal","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timeslot","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"feedId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"mode","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"}],"name":"feedAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"feedId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"roundId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"address","name":"signer","type":"address"}],"name":"feedSigned","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"feedId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"supportvalue","type":"uint256"}],"name":"feedSupported","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"newFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"cost","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"feed","type":"uint256"}],"name":"newFeedCost","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"payout","type":"address"}],"name":"newPayoutAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"uintValue","type":"uint256"},{"indexed":false,"internalType":"address","name":"addressValue","type":"address"},{"indexed":false,"internalType":"uint256","name":"oracleType","type":"uint256"},{"indexed":false,"internalType":"address","name":"proposer","type":"address"}],"name":"newProposal","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"mode","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"feed","type":"uint256"}],"name":"newRevenueMode","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"signer","type":"address"}],"name":"newSigner","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"newThreshold","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"address","name":"signer","type":"address"}],"name":"proposalSigned","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"address","name":"sender","type":"address"}],"name":"routerFeeTaken","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"signer","type":"address"}],"name":"signerRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newPass","type":"uint256"}],"name":"subscriptionPassPriceUpdated","type":"event"},{"inputs":[{"internalType":"address","name":"buyer","type":"address"},{"internalType":"uint256","name":"duration","type":"uint256"}],"name":"buyPass","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string[]","name":"names","type":"string[]"},{"internalType":"string[]","name":"descriptions","type":"string[]"},{"internalType":"uint256[]","name":"decimals","type":"uint256[]"},{"internalType":"uint256[]","name":"timeslots","type":"uint256[]"},{"internalType":"uint256[]","name":"feedCosts","type":"uint256[]"},{"internalType":"uint256[]","name":"revenueModes","type":"uint256[]"}],"name":"createNewFeeds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"uintValue","type":"uint256"},{"internalType":"address","name":"addressValue","type":"address"},{"internalType":"uint256","name":"proposalType","type":"uint256"},{"internalType":"uint256","name":"feedId","type":"uint256"}],"name":"createProposal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"factoryContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"feedSupport","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"feedID","type":"uint256"}],"name":"getFeed","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFeedLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"feedIDs","type":"uint256[]"}],"name":"getFeedList","outputs":[{"internalType":"string[]","name":"","type":"string[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"feedIDs","type":"uint256[]"}],"name":"getFeeds","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"feedIDs","type":"uint256[]"},{"internalType":"uint256[]","name":"timestamps","type":"uint256[]"}],"name":"getHistoricalFeeds","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"signers_","type":"address[]"},{"internalType":"uint256","name":"signerThreshold_","type":"uint256"},{"internalType":"address payable","name":"payoutAddress_","type":"address"},{"internalType":"uint256","name":"subscriptionPassPrice_","type":"uint256"},{"internalType":"address","name":"factoryContract_","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"payoutAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"proposalList","outputs":[{"internalType":"uint256","name":"uintValue","type":"uint256"},{"internalType":"address","name":"addressValue","type":"address"},{"internalType":"address","name":"proposer","type":"address"},{"internalType":"uint256","name":"proposalType","type":"uint256"},{"internalType":"uint256","name":"proposalFeedId","type":"uint256"},{"internalType":"uint256","name":"proposalActive","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"signProposal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"signerLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"signerThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"signers","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"feedIDs","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"submitFeed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"feedIDs","type":"uint256[]"},{"internalType":"uint256[]","name":"durations","type":"uint256[]"},{"internalType":"address","name":"buyer","type":"address"}],"name":"subscribeToFeed","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"subscriptionPassPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"feedIds","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"supportFeeds","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdrawFunds","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405234801561001057600080fd5b50615d1d80620000216000396000f3fe6080604052600436106101355760003560e01c80638c604296116100ab578063c37219ba1161006f578063c37219ba146103eb578063c4c1d0bf14610414578063c6311e3f1461043f578063d69d117c14610481578063de11c94a146104c2578063ecb76d90146104ed57610135565b80638c604296146103135780638e486eec1461032f5780639da6553b1461035a578063a4a4f39014610397578063ab273016146103c257610135565b80634a45ea5c116100fd5780634a45ea5c1461020b5780635b8d02d71461024a57806368238181146102755780637f5090041461029157806384f3c585146102ba578063882fd782146102f757610135565b80630f3c80b21461013a5780632079fb9a1461016357806324600fc3146101a057806330c942e0146101b7578063442a33df146101e2575b600080fd5b34801561014657600080fd5b50610161600480360381019061015c919061459b565b61052c565b005b34801561016f57600080fd5b5061018a6004803603810190610185919061486f565b61091b565b604051610197919061532c565b60405180910390f35b3480156101ac57600080fd5b506101b561095a565b005b3480156101c357600080fd5b506101cc610acc565b6040516101d99190615861565b60405180910390f35b3480156101ee57600080fd5b506102096004803603810190610204919061462a565b610ad2565b005b34801561021757600080fd5b50610232600480360381019061022d9190614743565b610f2b565b60405161024193929190615438565b60405180910390f35b34801561025657600080fd5b5061025f6110a9565b60405161026c9190615347565b60405180910390f35b61028f600480360381019061028a91906147f0565b6110cf565b005b34801561029d57600080fd5b506102b860048036038101906102b39190614784565b6115de565b005b3480156102c657600080fd5b506102e160048036038101906102dc9190614784565b611d4a565b6040516102ee9190615416565b60405180910390f35b610311600480360381019061030c9190614784565b6120c7565b005b61032d6004803603810190610328919061455f565b612427565b005b34801561033b57600080fd5b50610344612794565b6040516103519190615861565b60405180910390f35b34801561036657600080fd5b50610381600480360381019061037c919061486f565b61279a565b60405161038e9190615861565b60405180910390f35b3480156103a357600080fd5b506103ac6127b2565b6040516103b99190615861565b60405180910390f35b3480156103ce57600080fd5b506103e960048036038101906103e4919061486f565b6127b8565b005b3480156103f757600080fd5b50610412600480360381019061040d9190614898565b612c79565b005b34801561042057600080fd5b5061042961316e565b6040516104369190615861565b60405180910390f35b34801561044b57600080fd5b506104666004803603810190610461919061486f565b61317b565b604051610478969594939291906158a5565b60405180910390f35b34801561048d57600080fd5b506104a860048036038101906104a39190614743565b613207565b6040516104b99594939291906153a0565b60405180910390f35b3480156104ce57600080fd5b506104d76135d2565b6040516104e4919061532c565b60405180910390f35b3480156104f957600080fd5b50610514600480360381019061050f919061486f565b6135f6565b60405161052393929190615982565b60405180910390f35b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146105bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105b2906156e1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561062b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610622906155a1565b60405180910390fd5b600084141561066f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161066690615581565b60405180910390fd5b84518411156106b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106aa90615621565b60405180910390fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550836004819055508460039080519060200190610710929190614192565b5060005b60038054905081101561086457600073ffffffffffffffffffffffffffffffffffffffff166003828154811061074657fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156107c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107bf90615701565b60405180910390fd5b600160066000600384815481106107db57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080600101915050610714565b50845160028190555082600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600b819055507ff4955da0e7ea6f8c9297d8046c39168f24abc71dd60d47c7e4e2172f28f0c93385600454600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660405161090c93929190615362565b60405180910390a15050505050565b6003818154811061092b57600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600073ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610a605760005b600380549050811015610a5a57600381815481106109ce57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc6003805490504781610a2057fe5b049081150290604051600060405180830381858888f19350505050158015610a4c573d6000803e3d6000fd5b5080806001019150506109b4565b50610aca565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610ac8573d6000803e3d6000fd5b505b565b60025481565b610ada613847565b8451865114610b1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b15906157c1565b60405180910390fd5b8351855114610b62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b59906157c1565b60405180910390fd5b8251845114610ba6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9d906157c1565b60405180910390fd5b8151835114610bea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be1906157c1565b60405180910390fd5b8051825114610c2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c25906157c1565b60405180910390fd5b60005b8651811015610f22576012858281518110610c4857fe5b60200260200101511115610c91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c88906157a1565b60405180910390fd5b6000848281518110610c9f57fe5b602002602001015111610ce7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cde90615721565b60405180910390fd5b6001828281518110610cf557fe5b60200260200101511115610d3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d35906156c1565b60405180910390fd5b600a6040518060e00160405280898481518110610d5757fe5b60200260200101518152602001878481518110610d7057fe5b60200260200101518152602001868481518110610d8957fe5b602002602001015181526020016000815260200160008152602001848481518110610db057fe5b60200260200101518152602001858481518110610dc957fe5b602002602001015181525090806001815401808255809150506001900390600052602060002090600702016000909190919091506000820151816000019080519060200190610e1992919061421c565b506020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015550507f7987e4b97b6de28ab6f19d4724c233a6f4fe564ba5413dc5d74b4c2c7841651a878281518110610e8557fe5b6020026020010151878381518110610e9957fe5b6020026020010151878481518110610ead57fe5b6020026020010151878581518110610ec157fe5b60200260200101516001600a8054905003878781518110610ede57fe5b6020026020010151898881518110610ef257fe5b6020026020010151604051610f0d9796959493929190615484565b60405180910390a18080600101915050610c31565b50505050505050565b606080606060008451905060008167ffffffffffffffff81118015610f4f57600080fd5b50604051908082528060200260200182016040528015610f7e5781602001602082028036833780820191505090505b50905060008267ffffffffffffffff81118015610f9a57600080fd5b50604051908082528060200260200182016040528015610fc95781602001602082028036833780820191505090505b50905060008367ffffffffffffffff81118015610fe557600080fd5b506040519080825280602002602001820160405280156110145781602001602082028036833780820191505090505b50905060005b88518110156110945761103f89828151811061103257fe5b60200260200101516135f6565b86848151811061104b57fe5b6020026020010186858151811061105e57fe5b6020026020010186868151811061107157fe5b60200260200101838152508381525083815250505050808060010191505061101a565b50828282965096509650505050509193909250565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b8151835114611113576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110a906157c1565b60405180910390fd5b600080600090505b8451811015611440576001600a86838151811061113457fe5b60200260200101518154811061114657fe5b90600052602060002090600702016005015414611198576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118f90615501565b60405180910390fd5b610e108482815181106111a757fe5b602002602001015110156111f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e790615541565b60405180910390fd5b42600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600087848151811061123e57fe5b6020026020010151815260200190815260200160002054116112ec5761128084828151811061126957fe5b6020026020010151426138d590919063ffffffff16565b600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008784815181106112cd57fe5b60200260200101518152602001908152602001600020819055506113dd565b6113758482815181106112fb57fe5b6020026020010151600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600088858151811061135057fe5b60200260200101518152602001908152602001600020546138d590919063ffffffff16565b600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008784815181106113c257fe5b60200260200101518152602001908152602001600020819055505b610e108482815181106113ec57fe5b6020026020010151600a87848151811061140257fe5b60200260200101518154811061141457fe5b906000526020600020906007020160060154028161142e57fe5b0482019150808060010191505061111b565b5080341015611484576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147b90615641565b60405180910390fd5b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c216844a6040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156114ef57600080fd5b505af1158015611503573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115279190614536565b90508073ffffffffffffffffffffffffffffffffffffffff1663d0e30db06032348161154f57fe5b046040518263ffffffff1660e01b81526004016000604051808303818588803b15801561157b57600080fd5b505af115801561158f573d6000803e3d6000fd5b50505050507f103515a9d6bc0233f6381d5e58df739f3078b58635e20d5dd204e558769ddc42603234816115bf57fe5b04336040516115cf92919061587c565b60405180910390a15050505050565b6115e6613847565b815181511461162a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162190615561565b60405180910390fd5b60005b8151811015611d45576000600a84838151811061164657fe5b60200260200101518154811061165857fe5b906000526020600020906007020160020154428161167257fe5b04905060006007600086858151811061168757fe5b60200260200101518152602001908152602001600020600083815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101541461177c576007600085848151811061170457fe5b60200260200101518152602001908152602001600020600082815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600080820160009055600182016000905550505b604051806040016040528084848151811061179357fe5b6020026020010151815260200142815250600760008685815181106117b457fe5b60200260200101518152602001908152602001600020600083815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000155602082015181600101559050507fba4832b2bf8c9586edd5026f5bf3a5b8a69b0b29dea651d15bfda0cddf0e954884838151811061185c57fe5b60200260200101518285858151811061187157fe5b6020026020010151423360405161188c9594939291906159b9565b60405180910390a160008060038054905067ffffffffffffffff811180156118b357600080fd5b506040519080825280602002602001820160405280156118e25781602001602082028036833780820191505090505b509050600080600090505b600380549050811015611a93576000600760008a898151811061190c57fe5b60200260200101518152602001908152602001600020600087815260200190815260200160002060006003848154811061194257fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015414611a86578380600101945050600760008988815181106119c857fe5b6020026020010151815260200190815260200160002060008681526020019081526020016000206000600383815481106119fe57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154838380600101945081518110611a7957fe5b6020026020010181815250505b80806001019150506118ed565b508082526004548310611d34576000611aab8361395d565b9050600060016002835181611abc57fe5b061415611af55760006002600184510181611ad357fe5b049050826001820381518110611ae557fe5b6020026020010151915050611b3f565b60006002835181611b0257fe5b0490506002838281518110611b1357fe5b6020026020010151846001840381518110611b2a57fe5b60200260200101510181611b3a57fe5b049150505b600a898881518110611b4d57fe5b602002602001015181548110611b5f57fe5b906000526020600020906007020160020154600a8a8981518110611b7f57fe5b602002602001015181548110611b9157fe5b90600052602060002090600702016004015481611baa57fe5b04600a8a8981518110611bb957fe5b602002602001015181548110611bcb57fe5b9060005260206000209060070201600201544281611be557fe5b041115611cc557600a898881518110611bfa57fe5b602002602001015181548110611c0c57fe5b906000526020600020906007020160030154600560008b8a81518110611c2e57fe5b602002602001015181526020019081526020016000206000600a8c8b81518110611c5457fe5b602002602001015181548110611c6657fe5b906000526020600020906007020160020154600a8d8c81518110611c8657fe5b602002602001015181548110611c9857fe5b90600052602060002090600702016004015481611cb157fe5b048152602001908152602001600020819055505b42600a8a8981518110611cd457fe5b602002602001015181548110611ce657fe5b90600052602060002090600702016004018190555080600a8a8981518110611d0a57fe5b602002602001015181548110611d1c57fe5b90600052602060002090600702016003018190555050505b50505050808060010191505061162d565b505050565b606060008351905060008167ffffffffffffffff81118015611d6b57600080fd5b50604051908082528060200260200182016040528015611d9a5781602001602082028036833780820191505090505b5090508351855114611de1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd890615801565b60405180910390fd5b60005b85518110156120bb576000600b541115611f275742600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411611f22576001600a878381518110611e4e57fe5b602002602001015181548110611e6057fe5b906000526020600020906007020160050154148015611ee1575042600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000888481518110611ec857fe5b6020026020010151815260200190815260200160002054105b15611f21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1890615681565b60405180910390fd5b5b61200b565b6001600a878381518110611f3757fe5b602002602001015181548110611f4957fe5b906000526020600020906007020160050154148015611fca575042600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000888481518110611fb157fe5b6020026020010151815260200190815260200160002054105b1561200a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200190615681565b60405180910390fd5b5b6000600a87838151811061201b57fe5b60200260200101518154811061202d57fe5b90600052602060002090600702016002015486838151811061204b57fe5b60200260200101518161205a57fe5b0490506005600088848151811061206d57fe5b602002602001015181526020019081526020016000206000828152602001908152602001600020548383815181106120a157fe5b602002602001018181525050508080600101915050611de4565b50809250505092915050565b805182511461210b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612102906157c1565b60405180910390fd5b600080600090505b835181101561228a576000600a85838151811061212c57fe5b60200260200101518154811061213e57fe5b90600052602060002090600702016005015414612190576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218790615521565b60405180910390fd5b6121dc83828151811061219f57fe5b6020026020010151600860008785815181106121b757fe5b60200260200101518152602001908152602001600020546138d590919063ffffffff16565b600860008684815181106121ec57fe5b602002602001015181526020019081526020016000208190555082818151811061221257fe5b6020026020010151820191507f3444f0007ac07416465c167c0d7657d48e9d410b498f8849035fc9cf9523976d84828151811061224b57fe5b602002602001015184838151811061225f57fe5b6020026020010151604051612275929190615906565b60405180910390a18080600101915050612113565b50803410156122ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c590615661565b60405180910390fd5b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c216844a6040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561233957600080fd5b505af115801561234d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123719190614536565b90508073ffffffffffffffffffffffffffffffffffffffff1663d0e30db06064848161239957fe5b046040518263ffffffff1660e01b81526004016000604051808303818588803b1580156123c557600080fd5b505af11580156123d9573d6000803e3d6000fd5b50505050507f103515a9d6bc0233f6381d5e58df739f3078b58635e20d5dd204e558769ddc426064838161240957fe5b043360405161241992919061587c565b60405180910390a150505050565b6000600b54141561246d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246490615821565b60405180910390fd5b610e108110156124b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a990615541565b60405180910390fd5b6201518081600b5402816124c257fe5b04341015612505576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124fc906157e1565b60405180910390fd5b42600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054116125a65761255e81426138d590919063ffffffff16565b600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061263c565b6125f881600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546138d590919063ffffffff16565b600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c216844a6040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156126a757600080fd5b505af11580156126bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126df9190614536565b90508073ffffffffffffffffffffffffffffffffffffffff1663d0e30db06032348161270757fe5b046040518263ffffffff1660e01b81526004016000604051808303818588803b15801561273357600080fd5b505af1158015612747573d6000803e3d6000fd5b50505050507f103515a9d6bc0233f6381d5e58df739f3078b58635e20d5dd204e558769ddc426032348161277757fe5b043360405161278792919061587c565b60405180910390a1505050565b600b5481565b60086020528060005260406000206000915090505481565b60045481565b6127c0613847565b6000600d82815481106127cf57fe5b9060005260206000209060060201600501541415612822576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612819906155e1565b60405180910390fd5b6001600e600083815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f163fd1b723c0447962b4aca81cc014e8103ab3753a07542f4edbed3e59444d6781336040516128bc92919061587c565b60405180910390a1600080600090505b60038054905081101561298957600e60008481526020019081526020016000206000600383815481106128fb57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561297c5781806001019250505b80806001019150506128cc565b506004548110612c75576000600d83815481106129a257fe5b90600052602060002090600602016003015414156129e6576129e1600d83815481106129ca57fe5b906000526020600020906006020160000154613977565b612c50565b6001600d83815481106129f557fe5b9060005260206000209060060201600301541415612a3957612a34600d8381548110612a1d57fe5b9060005260206000209060060201600001546139b8565b612c4f565b6002600d8381548110612a4857fe5b9060005260206000209060060201600301541415612aac57612aa7600d8381548110612a7057fe5b906000526020600020906006020160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16613a82565b612c4e565b6003600d8381548110612abb57fe5b9060005260206000209060060201600301541415612b1f57612b1a600d8381548110612ae357fe5b906000526020600020906006020160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16613c4d565b612c4d565b6004600d8381548110612b2e57fe5b9060005260206000209060060201600301541415612b9257612b8d600d8381548110612b5657fe5b906000526020600020906006020160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16613e8f565b612c4c565b6005600d8381548110612ba157fe5b9060005260206000209060060201600301541415612c0457612bff600d8381548110612bc957fe5b906000526020600020906006020160000154600d8481548110612be857fe5b906000526020600020906006020160040154613f0a565b612c4b565b612c4a600d8381548110612c1457fe5b906000526020600020906006020160000154600d8481548110612c3357fe5b906000526020600020906006020160040154613fae565b5b5b5b5b5b5b6000600d8381548110612c5f57fe5b9060005260206000209060060201600501819055505b5050565b612c81613847565b6000600d8054905090506000831480612c9a5750600183145b80612ca55750600783145b15612dee57600d6040518060c00160405280878152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff16815260200185815260200160008152602001600181525090806001815401808255809150506001900390600052602060002090600602016000909190919091506000820151816000015560208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550606082015181600301556080820151816004015560a082015181600501555050613086565b6005831480612dfd5750600683145b15612f4557600d6040518060c00160405280878152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff168152602001858152602001848152602001600181525090806001815401808255809150506001900390600052602060002090600602016000909190919091506000820151816000015560208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550606082015181600301556080820151816004015560a082015181600501555050613085565b600d6040518060c00160405280600081526020018673ffffffffffffffffffffffffffffffffffffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff16815260200185815260200160008152602001600181525090806001815401808255809150506001900390600052602060002090600602016000909190919091506000820151816000015560208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550606082015181600301556080820151816004015560a0820151816005015550505b5b6001600e600083815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507fa7105ed77601732b2ee4362ad1a2ca325d1983be801d553d907e0aa29dcdb79a818686863360405161312695949392919061592f565b60405180910390a17f163fd1b723c0447962b4aca81cc014e8103ab3753a07542f4edbed3e59444d67813360405161315f92919061587c565b60405180910390a15050505050565b6000600a80549050905090565b600d818154811061318b57600080fd5b90600052602060002090600602016000915090508060000154908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060030154908060040154908060050154905086565b606080606080606060008651905060008167ffffffffffffffff8111801561322e57600080fd5b5060405190808252806020026020018201604052801561326257816020015b606081526020019060019003908161324d5790505b50905060008267ffffffffffffffff8111801561327e57600080fd5b506040519080825280602002602001820160405280156132ad5781602001602082028036833780820191505090505b50905060008367ffffffffffffffff811180156132c957600080fd5b506040519080825280602002602001820160405280156132f85781602001602082028036833780820191505090505b50905060008467ffffffffffffffff8111801561331457600080fd5b506040519080825280602002602001820160405280156133435781602001602082028036833780820191505090505b50905060008567ffffffffffffffff8111801561335f57600080fd5b5060405190808252806020026020018201604052801561338e5781602001602082028036833780820191505090505b50905060005b8c518110156135b357600a8d82815181106133ab57fe5b6020026020010151815481106133bd57fe5b90600052602060002090600702016000018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156134625780601f1061343757610100808354040283529160200191613462565b820191906000526020600020905b81548152906001019060200180831161344557829003601f168201915b505050505086828151811061347357fe5b6020026020010181905250600a8d828151811061348c57fe5b60200260200101518154811061349e57fe5b9060005260206000209060070201600101548582815181106134bc57fe5b602002602001018181525050600a8d82815181106134d657fe5b6020026020010151815481106134e857fe5b90600052602060002090600702016002015484828151811061350657fe5b602002602001018181525050600a8d828151811061352057fe5b60200260200101518154811061353257fe5b90600052602060002090600702016005015483828151811061355057fe5b602002602001018181525050600a8d828151811061356a57fe5b60200260200101518154811061357c57fe5b90600052602060002090600702016006015482828151811061359a57fe5b6020026020010181815250508080600101915050613394565b5084848484849a509a509a509a509a5050505050505091939590929450565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806000806000806000600b5411156137135742600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541161370e576001600a888154811061365f57fe5b9060005260206000209060070201600501541480156136cd575042600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600089815260200190815260200160002054105b1561370d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161370490615681565b60405180910390fd5b5b6137d1565b6001600a888154811061372257fe5b906000526020600020906007020160050154148015613790575042600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600089815260200190815260200160002054105b156137d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137c790615681565b60405180910390fd5b5b600a87815481106137de57fe5b9060005260206000209060070201600301549250600a87815481106137ff57fe5b9060005260206000209060070201600401549150600a878154811061382057fe5b90600052602060002090600702016001015490508282829550955095505050509193909250565b600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166138d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138ca906155c1565b60405180910390fd5b565b600080828401905083811015613953576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b606061396f8260006001855103614051565b819050919050565b80600b819055507f35a14b8b09dda49419beccb57b8ab7a2333bfeb9634690a2fdd9e62ca2b73dea816040516139ad9190615861565b60405180910390a150565b60008114156139fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139f390615581565b60405180910390fd5b600254811115613a41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a3890615741565b60405180910390fd5b806004819055507fd88532aad776d079efe3ac298f9e21dc4ef893e240d8c13107298e7c4f6eb8b881604051613a779190615861565b60405180910390a150565b60005b600380549050811015613b45578173ffffffffffffffffffffffffffffffffffffffff1660038281548110613ab657fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415613b38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b2f90615761565b60405180910390fd5b8080600101915050613a85565b506003819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506002600081548092919060010191905055506001600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f3dc2a8437aef0e8d2839b5e75d0d93e6c7f43b3acf5d2ef2db79beb54cb47b3d81604051613c42919061532c565b60405180910390a150565b600660008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16613cd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613cd090615841565b60405180910390fd5b6004546001600380549050031015613d26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d1d906156a1565b60405180910390fd5b60005b600380549050811015613e8b578173ffffffffffffffffffffffffffffffffffffffff1660038281548110613d5a57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415613e7e5760038181548110613dae57fe5b9060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600260008154809291906001900391905055506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507ffa15964370ccf7acface74df78a85aa4857e703226c446d3e24a69663dc302e782604051613e75919061532c565b60405180910390a15b8080600101915050613d29565b5050565b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f4bc0293774d2baff337ab66d049d9fb89b31c492a1c82fd1b53d43ac85e8da5181604051613eff919061532c565b60405180910390a150565b6001821115613f4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613f4590615781565b60405180910390fd5b81600a8281548110613f5c57fe5b9060005260206000209060070201600501819055507fe7fdf61d93ca682755140eb73628f48cfc090ca0f669e547790b227980e1a22c8282604051613fa2929190615906565b60405180910390a15050565b60008211613ff1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613fe890615601565b60405180910390fd5b81600a8281548110613fff57fe5b9060005260206000209060070201600601819055507f66317a45088a6e6e10f3831e0347d9fbaa68b04f54503eaf4e8683512a69077a8282604051614045929190615906565b60405180910390a15050565b600082905060008290508082141561406a57505061418d565b60008560028686038161407957fe5b0586018151811061408657fe5b602002602001015190505b818313614161575b808684815181106140a657fe5b602002602001015110156140c1578280600101935050614099565b5b8582815181106140ce57fe5b60200260200101518110156140eb578180600190039250506140c2565b81831361415c578582815181106140fe57fe5b602002602001015186848151811061411257fe5b602002602001015187858151811061412657fe5b6020026020010188858151811061413957fe5b602002602001018281525082815250505082806001019350508180600190039250505b614091565b8185121561417557614174868684614051565b5b8383121561418957614188868486614051565b5b5050505b505050565b82805482825590600052602060002090810192821561420b579160200282015b8281111561420a5782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550916020019190600101906141b2565b5b50905061421891906142aa565b5090565b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826142525760008555614299565b82601f1061426b57805160ff1916838001178555614299565b82800160010185558215614299579182015b8281111561429857825182559160200191906001019061427d565b5b5090506142a691906142aa565b5090565b5b808211156142c35760008160009055506001016142ab565b5090565b60006142da6142d584615a3d565b615a0c565b905080838252602082019050828560208602820111156142f957600080fd5b60005b85811015614329578161430f888261443a565b8452602084019350602083019250506001810190506142fc565b5050509392505050565b600061434661434184615a69565b615a0c565b9050808382526020820190508260005b85811015614386578135850161436c88826144f7565b845260208401935060208301925050600181019050614356565b5050509392505050565b60006143a361439e84615a95565b615a0c565b905080838252602082019050828560208602820111156143c257600080fd5b60005b858110156143f257816143d88882614521565b8452602084019350602083019250506001810190506143c5565b5050509392505050565b600061440f61440a84615ac1565b615a0c565b90508281526020810184848401111561442757600080fd5b614432848285615c4d565b509392505050565b60008135905061444981615ca2565b92915050565b60008135905061445e81615cb9565b92915050565b60008151905061447381615cb9565b92915050565b600082601f83011261448a57600080fd5b813561449a8482602086016142c7565b91505092915050565b600082601f8301126144b457600080fd5b81356144c4848260208601614333565b91505092915050565b600082601f8301126144de57600080fd5b81356144ee848260208601614390565b91505092915050565b600082601f83011261450857600080fd5b81356145188482602086016143fc565b91505092915050565b60008135905061453081615cd0565b92915050565b60006020828403121561454857600080fd5b600061455684828501614464565b91505092915050565b6000806040838503121561457257600080fd5b60006145808582860161443a565b925050602061459185828601614521565b9150509250929050565b600080600080600060a086880312156145b357600080fd5b600086013567ffffffffffffffff8111156145cd57600080fd5b6145d988828901614479565b95505060206145ea88828901614521565b94505060406145fb8882890161444f565b935050606061460c88828901614521565b925050608061461d8882890161443a565b9150509295509295909350565b60008060008060008060c0878903121561464357600080fd5b600087013567ffffffffffffffff81111561465d57600080fd5b61466989828a016144a3565b965050602087013567ffffffffffffffff81111561468657600080fd5b61469289828a016144a3565b955050604087013567ffffffffffffffff8111156146af57600080fd5b6146bb89828a016144cd565b945050606087013567ffffffffffffffff8111156146d857600080fd5b6146e489828a016144cd565b935050608087013567ffffffffffffffff81111561470157600080fd5b61470d89828a016144cd565b92505060a087013567ffffffffffffffff81111561472a57600080fd5b61473689828a016144cd565b9150509295509295509295565b60006020828403121561475557600080fd5b600082013567ffffffffffffffff81111561476f57600080fd5b61477b848285016144cd565b91505092915050565b6000806040838503121561479757600080fd5b600083013567ffffffffffffffff8111156147b157600080fd5b6147bd858286016144cd565b925050602083013567ffffffffffffffff8111156147da57600080fd5b6147e6858286016144cd565b9150509250929050565b60008060006060848603121561480557600080fd5b600084013567ffffffffffffffff81111561481f57600080fd5b61482b868287016144cd565b935050602084013567ffffffffffffffff81111561484857600080fd5b614854868287016144cd565b92505060406148658682870161443a565b9150509250925092565b60006020828403121561488157600080fd5b600061488f84828501614521565b91505092915050565b600080600080608085870312156148ae57600080fd5b60006148bc87828801614521565b94505060206148cd8782880161443a565b93505060406148de87828801614521565b92505060606148ef87828801614521565b91505092959194509250565b6000614907838361495d565b60208301905092915050565b600061491f8383614aac565b905092915050565b6000614933838361530e565b60208301905092915050565b61494881615c17565b82525050565b61495781615bdb565b82525050565b61496681615bc9565b82525050565b61497581615bc9565b82525050565b600061498682615b21565b6149908185615b74565b935061499b83615af1565b8060005b838110156149cc5781516149b388826148fb565b97506149be83615b4d565b92505060018101905061499f565b5085935050505092915050565b60006149e482615b2c565b6149ee8185615b85565b935083602082028501614a0085615b01565b8060005b85811015614a3c5784840389528151614a1d8582614913565b9450614a2883615b5a565b925060208a01995050600181019050614a04565b50829750879550505050505092915050565b6000614a5982615b37565b614a638185615b96565b9350614a6e83615b11565b8060005b83811015614a9f578151614a868882614927565b9750614a9183615b67565b925050600181019050614a72565b5085935050505092915050565b6000614ab782615b42565b614ac18185615ba7565b9350614ad1818560208601615c5c565b614ada81615c91565b840191505092915050565b6000614af082615b42565b614afa8185615bb8565b9350614b0a818560208601615c5c565b614b1381615c91565b840191505092915050565b6000614b2b601783615bb8565b91507f446f6e6174696f6e206d6f6465207475726e6564206f6e0000000000000000006000830152602082019050919050565b6000614b6b601b83615bb8565b91507f537562736372697074696f6e206d6f6465207475726e6564206f6e00000000006000830152602082019050919050565b6000614bab601a83615bb8565b91507f4d696e696d756d20737562736372697074696f6e2069732031680000000000006000830152602082019050919050565b6000614beb602b83615bb8565b91507f56616c7565206c656e67746820616e6420666565644944206c656e677468206460008301527f6f206e6f74206d617463680000000000000000000000000000000000000000006020830152604082019050919050565b6000614c51601383615bb8565b91507f5468726573686f6c642063616e742062652030000000000000000000000000006000830152602082019050919050565b6000614c91601783615bb8565b91507f666163746f72792063616e206e6f74206265206e756c6c0000000000000000006000830152602082019050919050565b6000614cd1602583615bb8565b91507f4f6e6c792061207369676e65722063616e20706572666f726d2074686973206160008301527f6374696f6e0000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614d37601383615bb8565b91507f50726f706f73616c206e6f7420616374697665000000000000000000000000006000830152602082019050919050565b6000614d77601483615bb8565b91507f466565642070726963652063616e7420626520300000000000000000000000006000830152602082019050919050565b6000614db7602883615bb8565b91507f5468726573686f6c642063616e74206265206d6f7265207468656e207369676e60008301527f657220636f756e740000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614e1d602a83615bb8565b91507f4e6f7420656e6f7567682066756e64732073656e7420746f20636f766572206f60008301527f7261636c652066656573000000000000000000000000000000000000000000006020830152604082019050919050565b6000614e83602683615bb8565b91507f4d73672e76616c756520646f6573206e6f74206d65657420737570706f72742060008301527f76616c75657300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614ee9601783615bb8565b91507f4e6f20737562736372697074696f6e20746f20666565640000000000000000006000830152602082019050919050565b6000614f29601b83615bb8565b91507f4c657373207369676e657273207468616e207468726573686f6c6400000000006000830152602082019050919050565b6000614f69601b83615bb8565b91507f57726f6e6720726576656e75654d6f646520706172616d6574657200000000006000830152602082019050919050565b6000614fa9601383615bb8565b91507f616c726561647920696e697469616c697a6564000000000000000000000000006000830152602082019050919050565b6000614fe9601083615bb8565b91507f4e6f74207a65726f2061646472657373000000000000000000000000000000006000830152602082019050919050565b6000615029601483615bb8565b91507f54696d65736c6f742063616e6e6f7420626520300000000000000000000000006000830152602082019050919050565b6000615069602f83615bb8565b91507f5468726573686f6c642063616e7420626520626967676572207468656e206c6560008301527f6e677468206f66207369676e65727300000000000000000000000000000000006020830152604082019050919050565b60006150cf601583615bb8565b91507f5369676e657220616c72656164792065786973747300000000000000000000006000830152602082019050919050565b600061510f602183615bb8565b91507f496e76616c696420617267756d656e7420666f7220726576656e7565204d6f6460008301527f65000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000615175601783615bb8565b91507f446563696d616c20706c6163657320746f6f20686967680000000000000000006000830152602082019050919050565b60006151b5600f83615bb8565b91507f4c656e677468206d69736d6174636800000000000000000000000000000000006000830152602082019050919050565b60006151f5601283615bb8565b91507f4e6f7420656e6f756768207061796d656e7400000000000000000000000000006000830152602082019050919050565b6000615235601f83615bb8565b91507f466565647320616e642054696d657374616d7073206d757374206d61746368006000830152602082019050919050565b6000615275601c83615bb8565b91507f537562736372697074696f6e2050617373207475726e6564206f6666000000006000830152602082019050919050565b60006152b5602483615bb8565b91507f4164647265737320746f2072656d6f76652068617320746f206265206120736960008301527f676e6572000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b61531781615c0d565b82525050565b61532681615c0d565b82525050565b6000602082019050615341600083018461496c565b92915050565b600060208201905061535c600083018461494e565b92915050565b6000606082019050818103600083015261537c818661497b565b905061538b602083018561531d565b615398604083018461493f565b949350505050565b600060a08201905081810360008301526153ba81886149d9565b905081810360208301526153ce8187614a4e565b905081810360408301526153e28186614a4e565b905081810360608301526153f68185614a4e565b9050818103608083015261540a8184614a4e565b90509695505050505050565b600060208201905081810360008301526154308184614a4e565b905092915050565b600060608201905081810360008301526154528186614a4e565b905081810360208301526154668185614a4e565b9050818103604083015261547a8184614a4e565b9050949350505050565b600060e082019050818103600083015261549e818a614ae5565b905081810360208301526154b28189614ae5565b90506154c1604083018861531d565b6154ce606083018761531d565b6154db608083018661531d565b6154e860a083018561531d565b6154f560c083018461531d565b98975050505050505050565b6000602082019050818103600083015261551a81614b1e565b9050919050565b6000602082019050818103600083015261553a81614b5e565b9050919050565b6000602082019050818103600083015261555a81614b9e565b9050919050565b6000602082019050818103600083015261557a81614bde565b9050919050565b6000602082019050818103600083015261559a81614c44565b9050919050565b600060208201905081810360008301526155ba81614c84565b9050919050565b600060208201905081810360008301526155da81614cc4565b9050919050565b600060208201905081810360008301526155fa81614d2a565b9050919050565b6000602082019050818103600083015261561a81614d6a565b9050919050565b6000602082019050818103600083015261563a81614daa565b9050919050565b6000602082019050818103600083015261565a81614e10565b9050919050565b6000602082019050818103600083015261567a81614e76565b9050919050565b6000602082019050818103600083015261569a81614edc565b9050919050565b600060208201905081810360008301526156ba81614f1c565b9050919050565b600060208201905081810360008301526156da81614f5c565b9050919050565b600060208201905081810360008301526156fa81614f9c565b9050919050565b6000602082019050818103600083015261571a81614fdc565b9050919050565b6000602082019050818103600083015261573a8161501c565b9050919050565b6000602082019050818103600083015261575a8161505c565b9050919050565b6000602082019050818103600083015261577a816150c2565b9050919050565b6000602082019050818103600083015261579a81615102565b9050919050565b600060208201905081810360008301526157ba81615168565b9050919050565b600060208201905081810360008301526157da816151a8565b9050919050565b600060208201905081810360008301526157fa816151e8565b9050919050565b6000602082019050818103600083015261581a81615228565b9050919050565b6000602082019050818103600083015261583a81615268565b9050919050565b6000602082019050818103600083015261585a816152a8565b9050919050565b6000602082019050615876600083018461531d565b92915050565b6000604082019050615891600083018561531d565b61589e602083018461493f565b9392505050565b600060c0820190506158ba600083018961531d565b6158c7602083018861496c565b6158d4604083018761496c565b6158e1606083018661531d565b6158ee608083018561531d565b6158fb60a083018461531d565b979650505050505050565b600060408201905061591b600083018561531d565b615928602083018461531d565b9392505050565b600060a082019050615944600083018861531d565b615951602083018761531d565b61595e604083018661496c565b61596b606083018561531d565b615978608083018461493f565b9695505050505050565b6000606082019050615997600083018661531d565b6159a4602083018561531d565b6159b1604083018461531d565b949350505050565b600060a0820190506159ce600083018861531d565b6159db602083018761531d565b6159e8604083018661531d565b6159f5606083018561531d565b615a02608083018461493f565b9695505050505050565b6000604051905081810181811067ffffffffffffffff82111715615a3357615a32615c8f565b5b8060405250919050565b600067ffffffffffffffff821115615a5857615a57615c8f565b5b602082029050602081019050919050565b600067ffffffffffffffff821115615a8457615a83615c8f565b5b602082029050602081019050919050565b600067ffffffffffffffff821115615ab057615aaf615c8f565b5b602082029050602081019050919050565b600067ffffffffffffffff821115615adc57615adb615c8f565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b6000615bd482615bed565b9050919050565b6000615be682615bed565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000615c2282615c29565b9050919050565b6000615c3482615c3b565b9050919050565b6000615c4682615bed565b9050919050565b82818337600083830152505050565b60005b83811015615c7a578082015181840152602081019050615c5f565b83811115615c89576000848401525b50505050565bfe5b6000601f19601f8301169050919050565b615cab81615bc9565b8114615cb657600080fd5b50565b615cc281615bdb565b8114615ccd57600080fd5b50565b615cd981615c0d565b8114615ce457600080fd5b5056fea26469706673582212200473977c2ba1ae8d3232d8c2f6c7eed485875e7529cca20f654d811486b8422964736f6c63430007060033

Block Transaction Difficulty Gas Used Reward
Block Uncle Number Difficulty Gas Used Reward
Loading

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.