ETH Price: $3,310.94 (-3.35%)

Contract

0x92aFb2D65466FeeC2d608484287F8A05984A6344
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Withdraw From St...212708452024-11-26 8:51:3516 hrs ago1732611095IN
XDEFI: XHalfLife
0 ETH0.0013776213.29840657
Withdraw From St...212568212024-11-24 9:50:352 days ago1732441835IN
XDEFI: XHalfLife
0 ETH0.0011423610.99679201
Withdraw From St...212356702024-11-21 11:00:475 days ago1732186847IN
XDEFI: XHalfLife
0 ETH0.0012055411.60378832
Withdraw From St...212202822024-11-19 7:28:117 days ago1732001291IN
XDEFI: XHalfLife
0 ETH0.0011980911.56540573
Withdraw From St...212060612024-11-17 7:53:479 days ago1731830027IN
XDEFI: XHalfLife
0 ETH0.00098369.46759564
Withdraw From St...211914352024-11-15 6:54:3511 days ago1731653675IN
XDEFI: XHalfLife
0 ETH0.0018127217.49857519
Withdraw From St...211773772024-11-13 7:48:2313 days ago1731484103IN
XDEFI: XHalfLife
0 ETH0.0023478222.60391123
Withdraw From St...211607202024-11-11 0:01:1116 days ago1731283271IN
XDEFI: XHalfLife
0 ETH0.0015999815.40398506
Withdraw From St...211450122024-11-08 19:27:5918 days ago1731094079IN
XDEFI: XHalfLife
0 ETH0.0016222715.61503428
Withdraw From St...211286872024-11-06 12:43:5920 days ago1730897039IN
XDEFI: XHalfLife
0 ETH0.0027685126.65420089
Withdraw From St...211127382024-11-04 7:17:3522 days ago1730704655IN
XDEFI: XHalfLife
0 ETH0.000452164.35322308
Withdraw From St...210967892024-11-02 1:50:4724 days ago1730512247IN
XDEFI: XHalfLife
0 ETH0.00046494.47589164
Withdraw From St...210818272024-10-30 23:46:3527 days ago1730331995IN
XDEFI: XHalfLife
0 ETH0.000898588.65204867
Withdraw From St...210629362024-10-28 8:28:2329 days ago1730104103IN
XDEFI: XHalfLife
0 ETH0.000464114.46832
Withdraw From St...210465182024-10-26 1:28:4731 days ago1729906127IN
XDEFI: XHalfLife
0 ETH0.00056865.47434171
Withdraw From St...210305642024-10-23 20:04:4734 days ago1729713887IN
XDEFI: XHalfLife
0 ETH0.0014068313.54261664
Withdraw From St...210112162024-10-21 3:18:4736 days ago1729480727IN
XDEFI: XHalfLife
0 ETH0.000869268.36897997
Withdraw From St...209966042024-10-19 2:23:1138 days ago1729304591IN
XDEFI: XHalfLife
0 ETH0.0010420910.03290788
Withdraw From St...209815542024-10-16 23:58:4741 days ago1729123127IN
XDEFI: XHalfLife
0 ETH0.000904568.70884107
Withdraw From St...209670282024-10-14 23:16:3543 days ago1728947795IN
XDEFI: XHalfLife
0 ETH0.0020715219.94380997
Withdraw From St...209490852024-10-12 11:00:3545 days ago1728730835IN
XDEFI: XHalfLife
0 ETH0.000896678.63087218
Withdraw From St...209336402024-10-10 7:13:2347 days ago1728544403IN
XDEFI: XHalfLife
0 ETH0.000935029
Withdraw From St...209169832024-10-07 23:30:3550 days ago1728343835IN
XDEFI: XHalfLife
0 ETH0.000943349.08219489
Withdraw From St...209023332024-10-05 22:29:4752 days ago1728167387IN
XDEFI: XHalfLife
0 ETH0.000500484.83015919
Withdraw From St...208884832024-10-04 0:11:4754 days ago1728000707IN
XDEFI: XHalfLife
0 ETH0.000542825.24000543
View all transactions

Latest 2 internal transactions

Advanced mode:
Parent Transaction Hash Block From To
120806262021-03-21 6:51:011346 days ago1616309461
XDEFI: XHalfLife
0.1 ETH
120806092021-03-21 6:47:401346 days ago1616309260
XDEFI: XHalfLife
0.1 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
XHalfLife

Compiler Version
v0.5.17+commit.d19bba13

Optimization Enabled:
Yes with 200 runs

Other Settings:
istanbul EvmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-03-20
*/

// File: @openzeppelin/contracts/math/SafeMath.sol

pragma solidity ^0.5.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, 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) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     *
     * _Available since v2.4.0._
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

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

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts 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) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message 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.
     *
     * _Available since v2.4.0._
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts 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) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message 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.
     *
     * _Available since v2.4.0._
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

// File: @openzeppelin/contracts/utils/ReentrancyGuard.sol

pragma solidity ^0.5.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 *
 * _Since v2.5.0:_ this module is now much more gas efficient, given net gas
 * metering changes introduced in the Istanbul hardfork.
 */
contract ReentrancyGuard {
    bool private _notEntered;

    constructor () internal {
        // Storing an initial non-zero value makes deployment a bit more
        // expensive, but in exchange the refund on every call to nonReentrant
        // will be lower in amount. Since refunds are capped to a percetange of
        // the total transaction's gas, it is best to keep them low in cases
        // like this one, to increase the likelihood of the full refund coming
        // into effect.
        _notEntered = true;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_notEntered, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _notEntered = false;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _notEntered = true;
    }
}

// File: contracts/lib/AddressHelper.sol

pragma solidity 0.5.17;

// helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false
library AddressHelper {
    function safeTransfer(
        address token,
        address to,
        uint256 value
    ) internal {
        // bytes4(keccak256(bytes('transfer(address,uint256)')));
        (bool success, bytes memory data) = token.call(
            abi.encodeWithSelector(0xa9059cbb, to, value)
        );
        require(
            success && (data.length == 0 || abi.decode(data, (bool))),
            "TRANSFER_FAILED"
        );
    }

    function safeTransferFrom(
        address token,
        address from,
        address to,
        uint256 value
    ) internal {
        // bytes4(keccak256(bytes('transferFrom(address,address,uint256)')));
        (bool success, bytes memory data) = token.call(
            abi.encodeWithSelector(0x23b872dd, from, to, value)
        );
        require(
            success && (data.length == 0 || abi.decode(data, (bool))),
            "TRANSFER_FROM_FAILED"
        );
    }

    function safeTransferEther(address to, uint256 value) internal {
        (bool success, ) = to.call.value(value)(new bytes(0));
        require(success, "ETH_TRANSFER_FAILED");
    }

    function isContract(address token) internal view returns (bool) {
        if (token == address(0x0)) {
            return false;
        }
        uint256 size;
        assembly {
            size := extcodesize(token)
        }
        return size > 0;
    }

    /**
     * @dev returns the address used within the protocol to identify ETH
     * @return the address assigned to ETH
     */
    function ethAddress() internal pure returns (address) {
        return 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
    }
}

// File: contracts/lib/XNum.sol

pragma solidity 0.5.17;

library XNum {
    uint256 public constant BONE = 10**18;
    uint256 public constant MIN_BPOW_BASE = 1 wei;
    uint256 public constant MAX_BPOW_BASE = (2 * BONE) - 1 wei;
    uint256 public constant BPOW_PRECISION = BONE / 10**10;

    function btoi(uint256 a) internal pure returns (uint256) {
        return a / BONE;
    }

    function bfloor(uint256 a) internal pure returns (uint256) {
        return btoi(a) * BONE;
    }

    function badd(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "ERR_ADD_OVERFLOW");
        return c;
    }

    function bsub(uint256 a, uint256 b) internal pure returns (uint256) {
        (uint256 c, bool flag) = bsubSign(a, b);
        require(!flag, "ERR_SUB_UNDERFLOW");
        return c;
    }

    function bsubSign(uint256 a, uint256 b)
        internal
        pure
        returns (uint256, bool)
    {
        if (a >= b) {
            return (a - b, false);
        } else {
            return (b - a, true);
        }
    }

    function bmul(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c0 = a * b;
        require(a == 0 || c0 / a == b, "ERR_MUL_OVERFLOW");
        uint256 c1 = c0 + (BONE / 2);
        require(c1 >= c0, "ERR_MUL_OVERFLOW");
        uint256 c2 = c1 / BONE;
        return c2;
    }

    function bdiv(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b != 0, "ERR_DIV_ZERO");
        uint256 c0 = a * BONE;
        require(a == 0 || c0 / a == BONE, "ERR_DIV_INTERNAL"); // bmul overflow
        uint256 c1 = c0 + (b / 2);
        require(c1 >= c0, "ERR_DIV_INTERNAL"); //  badd require
        uint256 c2 = c1 / b;
        return c2;
    }

    // DSMath.wpow
    function bpowi(uint256 a, uint256 n) internal pure returns (uint256) {
        uint256 z = n % 2 != 0 ? a : BONE;

        for (n /= 2; n != 0; n /= 2) {
            a = bmul(a, a);

            if (n % 2 != 0) {
                z = bmul(z, a);
            }
        }
        return z;
    }

    // Compute b^(e.w) by splitting it into (b^e)*(b^0.w).
    // Use `bpowi` for `b^e` and `bpowK` for k iterations
    // of approximation of b^0.w
    function bpow(uint256 base, uint256 exp) internal pure returns (uint256) {
        require(base >= MIN_BPOW_BASE, "ERR_BPOW_BASE_TOO_LOW");
        require(base <= MAX_BPOW_BASE, "ERR_BPOW_BASE_TOO_HIGH");

        uint256 whole = bfloor(exp);
        uint256 remain = bsub(exp, whole);

        uint256 wholePow = bpowi(base, btoi(whole));

        if (remain == 0) {
            return wholePow;
        }

        uint256 partialResult = bpowApprox(base, remain, BPOW_PRECISION);
        return bmul(wholePow, partialResult);
    }

    function bpowApprox(
        uint256 base,
        uint256 exp,
        uint256 precision
    ) internal pure returns (uint256) {
        // term 0:
        uint256 a = exp;
        (uint256 x, bool xneg) = bsubSign(base, BONE);
        uint256 term = BONE;
        uint256 sum = term;
        bool negative = false;

        // term(k) = numer / denom
        //         = (product(a - i + 1, i=1-->k) * x^k) / (k!)
        // each iteration, multiply previous term by (a-(k-1)) * x / k
        // continue until term is less than precision
        for (uint256 i = 1; term >= precision; i++) {
            uint256 bigK = i * BONE;
            (uint256 c, bool cneg) = bsubSign(a, bsub(bigK, BONE));
            term = bmul(term, bmul(c, x));
            term = bdiv(term, bigK);
            if (term == 0) break;

            if (xneg) negative = !negative;
            if (cneg) negative = !negative;
            if (negative) {
                sum = bsub(sum, term);
            } else {
                sum = badd(sum, term);
            }
        }

        return sum;
    }
}

// File: contracts/interfaces/IERC20.sol

pragma solidity 0.5.17;

interface IERC20 {
    function name() external view returns (string memory);

    function symbol() external view returns (string memory);

    function decimals() external view returns (uint8);

    function totalSupply() external view returns (uint256);

    function balanceOf(address _owner) external view returns (uint256 balance);

    function transfer(address _to, uint256 _value)
        external
        returns (bool success);

    function transferFrom(
        address _from,
        address _to,
        uint256 _value
    ) external returns (bool success);

    function approve(address _spender, uint256 _value)
        external
        returns (bool success);

    function allowance(address _owner, address _spender)
        external
        view
        returns (uint256 remaining);
}

// File: contracts/XHalfLife.sol

pragma solidity 0.5.17;






contract XHalfLife is ReentrancyGuard {
    using SafeMath for uint256;
    using AddressHelper for address;

    uint256 private constant ONE = 10**18;

    /**
     * @notice Counter for new stream ids.
     */
    uint256 public nextStreamId = 1;

    /**
     * @notice key: stream id, value: minimum effective value(0.0001 TOKEN)
     */
    mapping(uint256 => uint256) public effectiveValues;

    // halflife stream
    struct Stream {
        uint256 depositAmount; // total deposited amount, must >= 0.0001 TOKEN
        uint256 remaining; // un-withdrawable balance
        uint256 withdrawable; // withdrawable balance
        uint256 startBlock; // when should start
        uint256 kBlock; // interval K blocks
        uint256 unlockRatio; // must be between [1-999], which means 0.1% to 99.9%
        uint256 denom; // one readable coin represent
        uint256 lastRewardBlock; // update by create(), fund() and withdraw()
        address token; // ERC20 token address or 0xEe for Ether
        address recipient;
        address sender;
        bool cancelable; // can be cancelled or not
        bool isEntity;
    }

    /**
     * @notice The stream objects identifiable by their unsigned integer ids.
     */
    mapping(uint256 => Stream) public streams;

    /**
     * @dev Throws if the provided id does not point to a valid stream.
     */
    modifier streamExists(uint256 streamId) {
        require(streams[streamId].isEntity, "stream does not exist");
        _;
    }

    /**
     * @dev Throws if the caller is not the sender of the recipient of the stream.
     *  Throws if the recipient is the zero address, the contract itself or the caller.
     *  Throws if the depositAmount is 0.
     *  Throws if the start block is before `block.number`.
     */
    modifier createStreamPreflight(
        address recipient,
        uint256 depositAmount,
        uint256 startBlock,
        uint256 kBlock
    ) {
        require(recipient != address(0), "stream to the zero address");
        require(recipient != address(this), "stream to the contract itself");
        require(recipient != msg.sender, "stream to the caller");
        require(depositAmount > 0, "deposit amount is zero");
        require(startBlock >= block.number, "start block before block.number");
        require(kBlock > 0, "k block is zero");
        _;
    }

    event StreamCreated(
        uint256 indexed streamId,
        address indexed sender,
        address indexed recipient,
        address token,
        uint256 depositAmount,
        uint256 startBlock,
        uint256 kBlock,
        uint256 unlockRatio,
        bool cancelable
    );

    event WithdrawFromStream(
        uint256 indexed streamId,
        address indexed recipient,
        uint256 amount
    );

    event StreamCanceled(
        uint256 indexed streamId,
        address indexed sender,
        address indexed recipient,
        uint256 senderBalance,
        uint256 recipientBalance
    );

    event StreamFunded(uint256 indexed streamId, uint256 amount);

    /**
     * @notice Creates a new stream funded by `msg.sender` and paid towards `recipient`.
     * @dev Throws if paused.
     *  Throws if the token is not a contract address
     *  Throws if the recipient is the zero address, the contract itself or the caller.
     *  Throws if the depositAmount is 0.
     *  Throws if the start block is before `block.number`.
     *  Throws if the rate calculation has a math error.
     *  Throws if the next stream id calculation has a math error.
     *  Throws if the contract is not allowed to transfer enough tokens.
     * @param token The ERC20 token address
     * @param recipient The address towards which the money is streamed.
     * @param depositAmount The amount of money to be streamed.
     * @param startBlock stream start block
     * @param kBlock unlock every k blocks
     * @param unlockRatio unlock ratio from remaining balance,
     *                    value must be between [1-1000], which means 0.1% to 1%
     * @param cancelable can be cancelled or not
     * @return The uint256 id of the newly created stream.
     */
    function createStream(
        address token,
        address recipient,
        uint256 depositAmount,
        uint256 startBlock,
        uint256 kBlock,
        uint256 unlockRatio,
        bool cancelable
    )
        external
        createStreamPreflight(recipient, depositAmount, startBlock, kBlock)
        returns (uint256 streamId)
    {
        require(unlockRatio < 1000, "unlockRatio must < 1000");
        require(unlockRatio > 0, "unlockRatio must > 0");

        require(token.isContract(), "not contract");
        token.safeTransferFrom(msg.sender, address(this), depositAmount);

        streamId = nextStreamId;
        {
            uint256 denom = 10**uint256(IERC20(token).decimals());
            require(denom >= 10**6, "token decimal too small");

            // 0.0001 TOKEN
            effectiveValues[streamId] = denom.div(10**4);
            require(
                depositAmount >= effectiveValues[streamId],
                "deposit too small"
            );

            streams[streamId] = Stream({
                token: token,
                remaining: depositAmount,
                withdrawable: 0,
                depositAmount: depositAmount,
                startBlock: startBlock,
                kBlock: kBlock,
                unlockRatio: unlockRatio,
                denom: denom,
                lastRewardBlock: startBlock,
                recipient: recipient,
                sender: msg.sender,
                isEntity: true,
                cancelable: cancelable
            });
        }

        nextStreamId = nextStreamId.add(1);
        emit StreamCreated(
            streamId,
            msg.sender,
            recipient,
            token,
            depositAmount,
            startBlock,
            kBlock,
            unlockRatio,
            cancelable
        );
    }

    /**
     * @notice Creates a new ether stream funded by `msg.sender` and paid towards `recipient`.
     * @dev Throws if paused.
     *  Throws if the recipient is the zero address, the contract itself or the caller.
     *  Throws if the depositAmount is 0.
     *  Throws if the start block is before `block.number`.
     *  Throws if the rate calculation has a math error.
     *  Throws if the next stream id calculation has a math error.
     *  Throws if the contract is not allowed to transfer enough tokens.
     * @param recipient The address towards which the money is streamed.
     * @param startBlock stream start block
     * @param kBlock unlock every k blocks
     * @param unlockRatio unlock ratio from remaining balance
     * @param cancelable can be cancelled or not
     * @return The uint256 id of the newly created stream.
     */
    function createEtherStream(
        address recipient,
        uint256 startBlock,
        uint256 kBlock,
        uint256 unlockRatio,
        bool cancelable
    )
        external
        payable
        createStreamPreflight(recipient, msg.value, startBlock, kBlock)
        returns (uint256 streamId)
    {
        require(unlockRatio < 1000, "unlockRatio must < 1000");
        require(unlockRatio > 0, "unlockRatio must > 0");
        require(msg.value >= 10**14, "deposit too small");

        /* Create and store the stream object. */
        streamId = nextStreamId;
        streams[streamId] = Stream({
            token: AddressHelper.ethAddress(),
            remaining: msg.value,
            withdrawable: 0,
            depositAmount: msg.value,
            startBlock: startBlock,
            kBlock: kBlock,
            unlockRatio: unlockRatio,
            denom: 10**18,
            lastRewardBlock: startBlock,
            recipient: recipient,
            sender: msg.sender,
            isEntity: true,
            cancelable: cancelable
        });

        nextStreamId = nextStreamId.add(1);
        emit StreamCreated(
            streamId,
            msg.sender,
            recipient,
            AddressHelper.ethAddress(),
            msg.value,
            startBlock,
            kBlock,
            unlockRatio,
            cancelable
        );
    }

    /**
     * @notice Check if given stream exists.
     * @param streamId The id of the stream to query.
     * @return bool true=exists, otherwise false.
     */
    function hasStream(uint256 streamId) external view returns (bool) {
        return streams[streamId].isEntity;
    }

    /**
     * @notice Returns the stream with all its properties.
     * @dev Throws if the id does not point to a valid stream.
     * @param streamId The id of the stream to query.
     * @return sender
     * @return recipient
     * @return token
     * @return depositAmount
     * @return startBlock
     * @return kBlock
     * @return remaining
     * @return withdrawable
     * @return unlockRatio
     * @return lastRewardBlock
     * @return cancelable
     */
    function getStream(uint256 streamId)
        external
        view
        streamExists(streamId)
        returns (
            address sender,
            address recipient,
            address token,
            uint256 depositAmount,
            uint256 startBlock,
            uint256 kBlock,
            uint256 remaining,
            uint256 withdrawable,
            uint256 unlockRatio,
            uint256 lastRewardBlock,
            bool cancelable
        )
    {
        Stream memory stream = streams[streamId];
        sender = stream.sender;
        recipient = stream.recipient;
        token = stream.token;
        depositAmount = stream.depositAmount;
        startBlock = stream.startBlock;
        kBlock = stream.kBlock;
        remaining = stream.remaining;
        withdrawable = stream.withdrawable;
        unlockRatio = stream.unlockRatio;
        lastRewardBlock = stream.lastRewardBlock;
        cancelable = stream.cancelable;
    }

    /**
     * @notice funds to an existing stream(for general purpose), 
     the amount of fund should be simply added to un-withdrawable.
     * @dev Throws if the caller is not the stream.sender
     * @param streamId The id of the stream to query.
     * @param amount deposit amount by stream sender
     */
    function singleFundStream(uint256 streamId, uint256 amount)
        external
        payable
        nonReentrant
        streamExists(streamId)
        returns (bool)
    {
        Stream storage stream = streams[streamId];
        require(
            msg.sender == stream.sender,
            "caller must be the sender of the stream"
        );
        require(amount > effectiveValues[streamId], "amount not effective");
        if (stream.token == AddressHelper.ethAddress()) {
            require(amount == msg.value, "bad ether fund");
        } else {
            stream.token.safeTransferFrom(msg.sender, address(this), amount);
        }

        (uint256 withdrawable, uint256 remaining) = balanceOf(streamId);

        // update remaining and withdrawable balance
        stream.lastRewardBlock = block.number;
        stream.remaining = remaining.add(amount); // = remaining + amount
        stream.withdrawable = withdrawable; // = withdrawable

        //add funds to total deposit amount
        stream.depositAmount = stream.depositAmount.add(amount);
        emit StreamFunded(streamId, amount);
        return true;
    }

    /**
     * @notice Implemented for XDEX farming and vesting,
     * the amount of fund should be splited to withdrawable and un-withdrawable according to lastRewardBlock.
     * @dev Throws if the caller is not the stream.sender
     * @param streamId The id of the stream to query.
     * @param amount deposit amount by stream sender
     * @param blockHeightDiff diff of block.number and farmPool's lastRewardBlock
     */
    function lazyFundStream(
        uint256 streamId,
        uint256 amount,
        uint256 blockHeightDiff
    ) external payable nonReentrant streamExists(streamId) returns (bool) {
        Stream storage stream = streams[streamId];
        require(
            msg.sender == stream.sender,
            "caller must be the sender of the stream"
        );
        require(amount > effectiveValues[streamId], "amount not effective");
        if (stream.token == AddressHelper.ethAddress()) {
            require(amount == msg.value, "bad ether fund");
        } else {
            stream.token.safeTransferFrom(msg.sender, address(this), amount);
        }

        (uint256 withdrawable, uint256 remaining) = balanceOf(streamId);

        //uint256 blockHeightDiff = block.number.sub(stream.lastRewardBlock);
        // If underflow m might be 0, peg true kBlock to 1, if bHD 0 then error.
        // Minimum amount is 100
        uint256 m = amount.mul(ONE).div(blockHeightDiff);
        // peg true kBlock to 1 so n over k always greater or equal 1
        uint256 noverk = blockHeightDiff.mul(ONE);
        // peg true mu to mu/kBlock
        uint256 mu = stream.unlockRatio.mul(ONE).div(1000).div(stream.kBlock);
        // Enlarged due to mu divided by kBlock
        uint256 onesubmu = ONE.sub(mu);
        // uint256 s = m.mul(ONE.sub(XNum.bpow(onesubmu,noverk))).div(ONE).div(mu).mul(ONE);
        uint256 s =
            m.mul(ONE.sub(XNum.bpow(onesubmu, noverk))).div(mu).div(ONE);

        // update remaining and withdrawable balance
        stream.lastRewardBlock = block.number;
        stream.remaining = remaining.add(s); // = remaining + s
        stream.withdrawable = withdrawable.add(amount).sub(s); // = withdrawable + (amount - s)

        // add funds to total deposit amount
        stream.depositAmount = stream.depositAmount.add(amount);
        emit StreamFunded(streamId, amount);
        return true;
    }

    /**
     * @notice Returns the available funds for the given stream id and address.
     * @dev Throws if the id does not point to a valid stream.
     * @param streamId The id of the stream for which to query the balance.
     * @return withdrawable The total funds allocated to `recipient` and `sender` as uint256.
     * @return remaining The total funds allocated to `recipient` and `sender` as uint256.
     */
    function balanceOf(uint256 streamId)
        public
        view
        streamExists(streamId)
        returns (uint256 withdrawable, uint256 remaining)
    {
        Stream memory stream = streams[streamId];

        if (block.number < stream.startBlock) {
            return (0, stream.depositAmount);
        }

        uint256 lastBalance = stream.withdrawable;

        uint256 n =
            block.number.sub(stream.lastRewardBlock).mul(ONE).div(
                stream.kBlock
            );
        uint256 k = stream.unlockRatio.mul(ONE).div(1000);
        uint256 mu = ONE.sub(k);
        uint256 r = stream.remaining.mul(XNum.bpow(mu, n)).div(ONE);
        uint256 w = stream.remaining.sub(r); // withdrawable, if n is float this process will be smooth and slightly

        if (lastBalance > 0) {
            w = w.add(lastBalance);
        }

        //If `remaining` + `withdrawable` < `depositAmount`, it means there have withdraws.
        require(
            r.add(w) <= stream.depositAmount,
            "balanceOf: remaining or withdrawable amount is bad"
        );

        if (w >= effectiveValues[streamId]) {
            withdrawable = w;
        } else {
            withdrawable = 0;
        }

        if (r >= effectiveValues[streamId]) {
            remaining = r;
        } else {
            remaining = 0;
        }
    }

    /**
     * @notice Withdraws from the contract to the recipient's account.
     * @dev Throws if the id does not point to a valid stream.
     *  Throws if the amount exceeds the withdrawable balance.
     *  Throws if the amount < the effective withdraw value.
     *  Throws if the caller is not the recipient.
     * @param streamId The id of the stream to withdraw tokens from.
     * @param amount The amount of tokens to withdraw.
     * @return bool true=success, otherwise false.
     */
    function withdrawFromStream(uint256 streamId, uint256 amount)
        external
        nonReentrant
        streamExists(streamId)
        returns (bool)
    {
        Stream storage stream = streams[streamId];

        require(
            msg.sender == stream.recipient,
            "caller must be the recipient of the stream"
        );

        require(
            amount >= effectiveValues[streamId],
            "amount is zero or not effective"
        );

        (uint256 withdrawable, uint256 remaining) = balanceOf(streamId);

        require(
            withdrawable >= amount,
            "withdraw amount exceeds the available balance"
        );

        if (stream.token == AddressHelper.ethAddress()) {
            stream.recipient.safeTransferEther(amount);
        } else {
            stream.token.safeTransfer(stream.recipient, amount);
        }

        stream.lastRewardBlock = block.number;
        stream.remaining = remaining;
        stream.withdrawable = withdrawable.sub(amount);

        emit WithdrawFromStream(streamId, stream.recipient, amount);
        return true;
    }

    /**
     * @notice Cancels the stream and transfers the tokens back
     * @dev Throws if the id does not point to a valid stream.
     *  Throws if the caller is not the sender or the recipient of the stream.
     *  Throws if there is a token transfer failure.
     * @param streamId The id of the stream to cancel.
     * @return bool true=success, otherwise false.
     */
    function cancelStream(uint256 streamId)
        external
        nonReentrant
        streamExists(streamId)
        returns (bool)
    {
        Stream memory stream = streams[streamId];

        require(stream.cancelable, "non cancelable stream");
        require(
            msg.sender == streams[streamId].sender ||
                msg.sender == streams[streamId].recipient,
            "caller must be the sender or the recipient"
        );

        (uint256 withdrawable, uint256 remaining) = balanceOf(streamId);

        //save gas
        delete streams[streamId];
        delete effectiveValues[streamId];

        if (withdrawable > 0) {
            if (stream.token == AddressHelper.ethAddress()) {
                stream.recipient.safeTransferEther(withdrawable);
            } else {
                stream.token.safeTransfer(stream.recipient, withdrawable);
            }
        }

        if (remaining > 0) {
            if (stream.token == AddressHelper.ethAddress()) {
                stream.sender.safeTransferEther(remaining);
            } else {
                stream.token.safeTransfer(stream.sender, remaining);
            }
        }

        emit StreamCanceled(
            streamId,
            stream.sender,
            stream.recipient,
            remaining,
            withdrawable
        );
        return true;
    }

    function getVersion() external pure returns (bytes32) {
        return bytes32("APOLLO");
    }
}

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"streamId","type":"uint256"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"senderBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"recipientBalance","type":"uint256"}],"name":"StreamCanceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"streamId","type":"uint256"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"depositAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"startBlock","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"kBlock","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"unlockRatio","type":"uint256"},{"indexed":false,"internalType":"bool","name":"cancelable","type":"bool"}],"name":"StreamCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"streamId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"StreamFunded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"streamId","type":"uint256"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"WithdrawFromStream","type":"event"},{"constant":true,"inputs":[{"internalType":"uint256","name":"streamId","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"withdrawable","type":"uint256"},{"internalType":"uint256","name":"remaining","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"streamId","type":"uint256"}],"name":"cancelStream","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"startBlock","type":"uint256"},{"internalType":"uint256","name":"kBlock","type":"uint256"},{"internalType":"uint256","name":"unlockRatio","type":"uint256"},{"internalType":"bool","name":"cancelable","type":"bool"}],"name":"createEtherStream","outputs":[{"internalType":"uint256","name":"streamId","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"depositAmount","type":"uint256"},{"internalType":"uint256","name":"startBlock","type":"uint256"},{"internalType":"uint256","name":"kBlock","type":"uint256"},{"internalType":"uint256","name":"unlockRatio","type":"uint256"},{"internalType":"bool","name":"cancelable","type":"bool"}],"name":"createStream","outputs":[{"internalType":"uint256","name":"streamId","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"effectiveValues","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"streamId","type":"uint256"}],"name":"getStream","outputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"depositAmount","type":"uint256"},{"internalType":"uint256","name":"startBlock","type":"uint256"},{"internalType":"uint256","name":"kBlock","type":"uint256"},{"internalType":"uint256","name":"remaining","type":"uint256"},{"internalType":"uint256","name":"withdrawable","type":"uint256"},{"internalType":"uint256","name":"unlockRatio","type":"uint256"},{"internalType":"uint256","name":"lastRewardBlock","type":"uint256"},{"internalType":"bool","name":"cancelable","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getVersion","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"streamId","type":"uint256"}],"name":"hasStream","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"streamId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"blockHeightDiff","type":"uint256"}],"name":"lazyFundStream","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"nextStreamId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"streamId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"singleFundStream","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"streams","outputs":[{"internalType":"uint256","name":"depositAmount","type":"uint256"},{"internalType":"uint256","name":"remaining","type":"uint256"},{"internalType":"uint256","name":"withdrawable","type":"uint256"},{"internalType":"uint256","name":"startBlock","type":"uint256"},{"internalType":"uint256","name":"kBlock","type":"uint256"},{"internalType":"uint256","name":"unlockRatio","type":"uint256"},{"internalType":"uint256","name":"denom","type":"uint256"},{"internalType":"uint256","name":"lastRewardBlock","type":"uint256"},{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"bool","name":"cancelable","type":"bool"},{"internalType":"bool","name":"isEntity","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"streamId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawFromStream","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"}]

608060405260018080556000805460ff19169091179055612f56806100256000396000f3fe6080604052600436106100c25760003560e01c80636ce92e211161007f578063894e9a0d11610059578063894e9a0d146102ed5780639cc7f7081461037c578063b5a3629d146103bf578063c791713a146103e2576100c2565b80636ce92e211461026a5780636db9241b146102935780637a9b2c6c146102bd576100c2565b80630d8e6e2c146100c75780631290fab4146100ee5780631e99d5691461014b5780633b749f6b1461016057806352fa95ec1461019e57806364d60d91146101c8575b600080fd5b3480156100d357600080fd5b506100dc610422565b60408051918252519081900360200190f35b3480156100fa57600080fd5b506100dc600480360360e081101561011157600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060808101359060a08101359060c00135151561042f565b34801561015757600080fd5b506100dc610aa8565b34801561016c57600080fd5b5061018a6004803603602081101561018357600080fd5b5035610aae565b604080519115158252519081900360200190f35b3480156101aa57600080fd5b506100dc600480360360208110156101c157600080fd5b5035610ad0565b3480156101d457600080fd5b506101f2600480360360208110156101eb57600080fd5b5035610ae2565b604080519d8e5260208e019c909c528c8c019a909a5260608c019890985260808b019690965260a08a019490945260c089019290925260e08801526001600160a01b03908116610100880152908116610120870152166101408501521515610160840152151561018083015251908190036101a00190f35b61018a6004803603606081101561028057600080fd5b5080359060208101359060400135610b61565b34801561029f57600080fd5b5061018a600480360360208110156102b657600080fd5b5035610ee9565b3480156102c957600080fd5b5061018a600480360360408110156102e057600080fd5b5080359060200135611322565b3480156102f957600080fd5b506103176004803603602081101561031057600080fd5b50356115d0565b604080516001600160a01b039c8d1681529a8c1660208c015298909a16898901526060890196909652608088019490945260a087019290925260c086015260e08501526101008401526101208301529115156101408201529051908190036101600190f35b34801561038857600080fd5b506103a66004803603602081101561039f57600080fd5b50356117ed565b6040805192835260208301919091528051918290030190f35b61018a600480360360408110156103d557600080fd5b5080359060200135611ac1565b6100dc600480360360a08110156103f857600080fd5b506001600160a01b0381351690602081013590604081013590606081013590608001351515611d4a565b6541504f4c4c4f60d01b90565b6000868686866001600160a01b038416610490576040805162461bcd60e51b815260206004820152601a60248201527f73747265616d20746f20746865207a65726f2061646472657373000000000000604482015290519081900360640190fd5b6001600160a01b0384163014156104ee576040805162461bcd60e51b815260206004820152601d60248201527f73747265616d20746f2074686520636f6e747261637420697473656c66000000604482015290519081900360640190fd5b6001600160a01b038416331415610543576040805162461bcd60e51b815260206004820152601460248201527339ba3932b0b6903a37903a34329031b0b63632b960611b604482015290519081900360640190fd5b60008311610591576040805162461bcd60e51b81526020600482015260166024820152756465706f73697420616d6f756e74206973207a65726f60501b604482015290519081900360640190fd5b438210156105e6576040805162461bcd60e51b815260206004820152601f60248201527f737461727420626c6f636b206265666f726520626c6f636b2e6e756d62657200604482015290519081900360640190fd5b6000811161062d576040805162461bcd60e51b815260206004820152600f60248201526e6b20626c6f636b206973207a65726f60881b604482015290519081900360640190fd5b6103e8871061067d576040805162461bcd60e51b81526020600482015260176024820152760756e6c6f636b526174696f206d757374203c203130303604c1b604482015290519081900360640190fd5b600087116106c9576040805162461bcd60e51b81526020600482015260146024820152730756e6c6f636b526174696f206d757374203e20360641b604482015290519081900360640190fd5b6106db8c6001600160a01b031661222c565b61071b576040805162461bcd60e51b815260206004820152600c60248201526b1b9bdd0818dbdb9d1c9858dd60a21b604482015290519081900360640190fd5b6107366001600160a01b038d1633308d63ffffffff61224b16565b600154945060008c6001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561077657600080fd5b505afa15801561078a573d6000803e3d6000fd5b505050506040513d60208110156107a057600080fd5b505160ff16600a0a9050620f4240811015610802576040805162461bcd60e51b815260206004820152601760248201527f746f6b656e20646563696d616c20746f6f20736d616c6c000000000000000000604482015290519081900360640190fd5b6108148161271063ffffffff6123b516565b60008781526002602052604090208190558b101561086d576040805162461bcd60e51b815260206004820152601160248201527019195c1bdcda5d081d1bdbc81cdb585b1b607a1b604482015290519081900360640190fd5b604051806101a001604052808c81526020018c8152602001600081526020018b81526020018a81526020018981526020018281526020018b81526020018e6001600160a01b031681526020018d6001600160a01b03168152602001336001600160a01b0316815260200188151581526020016001151581525060036000888152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e082015181600701556101008201518160080160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506101208201518160090160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555061014082015181600a0160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555061016082015181600a0160146101000a81548160ff02191690831515021790555061018082015181600a0160156101000a81548160ff02191690831515021790555090505050610a2e6001805461240090919063ffffffff16565b600155604080516001600160a01b038e81168252602082018d90528183018c9052606082018b9052608082018a905288151560a08301529151918d1691339188917f296dd961afc929c5e58943ef2ed406ae3188daf473f26b44f2ee263d7e0ee4e09181900360c00190a450505050979650505050505050565b60015481565b6000818152600360205260409020600a0154600160a81b900460ff165b919050565b60026020526000908152604090205481565b600360208190526000918252604090912080546001820154600283015493830154600484015460058501546006860154600787015460088801546009890154600a90990154979996989697959694959394929391926001600160a01b03918216929082169181169060ff600160a01b8204811691600160a81b9004168d565b6000805460ff16610ba7576040805162461bcd60e51b815260206004820152601f6024820152600080516020612e07833981519152604482015290519081900360640190fd5b6000805460ff19168155848152600360205260409020600a01548490600160a81b900460ff16610c16576040805162461bcd60e51b81526020600482015260156024820152741cdd1c99585b48191bd95cc81b9bdd08195e1a5cdd605a1b604482015290519081900360640190fd5b6000858152600360205260409020600a8101546001600160a01b03163314610c6f5760405162461bcd60e51b8152600401808060200182810382526027815260200180612efb6027913960400191505060405180910390fd5b6000868152600260205260409020548511610cc8576040805162461bcd60e51b8152602060048201526014602482015273616d6f756e74206e6f742065666665637469766560601b604482015290519081900360640190fd5b610cd061245a565b60088201546001600160a01b0390811691161415610d3257348514610d2d576040805162461bcd60e51b815260206004820152600e60248201526d18985908195d1a195c88199d5b9960921b604482015290519081900360640190fd5b610d52565b6008810154610d52906001600160a01b031633308863ffffffff61224b16565b600080610d5e886117ed565b90925090506000610d8d87610d818a670de0b6b3a764000063ffffffff61247216565b9063ffffffff6123b516565b90506000610da988670de0b6b3a764000063ffffffff61247216565b90506000610dda8660040154610d816103e8610d81670de0b6b3a76400008b6005015461247290919063ffffffff16565b90506000610df6670de0b6b3a76400008363ffffffff6124cb16565b90506000610e3c670de0b6b3a7640000610d8185610d81610e2f610e1a888b61250d565b670de0b6b3a76400009063ffffffff6124cb16565b8a9063ffffffff61247216565b4360078a01559050610e54868263ffffffff61240016565b6001890155610e7981610e6d898f63ffffffff61240016565b9063ffffffff6124cb16565b60028901558754610e90908d63ffffffff61240016565b8855604080518d815290518e917f700a4c5207a5280e621eed38effdd99714a7631fd21eea8da0c30b0f0f76fb05919081900360200190a2600199505050505050505050506000805460ff191660011790559392505050565b6000805460ff16610f2f576040805162461bcd60e51b815260206004820152601f6024820152600080516020612e07833981519152604482015290519081900360640190fd5b6000805460ff19168155828152600360205260409020600a01548290600160a81b900460ff16610f9e576040805162461bcd60e51b81526020600482015260156024820152741cdd1c99585b48191bd95cc81b9bdd08195e1a5cdd605a1b604482015290519081900360640190fd5b610fa6612d7f565b5060008381526003602081815260409283902083516101a0810185528154815260018201549281019290925260028101549382019390935290820154606082015260048201546080820152600582015460a0820152600682015460c0820152600782015460e082015260088201546001600160a01b0390811661010083015260098301548116610120830152600a9092015491821661014082015260ff600160a01b8304811615156101608301819052600160a81b909304161515610180820152906110b1576040805162461bcd60e51b81526020600482015260156024820152746e6f6e2063616e63656c61626c652073747265616d60581b604482015290519081900360640190fd5b6000848152600360205260409020600a01546001600160a01b03163314806110f257506000848152600360205260409020600901546001600160a01b031633145b61112d5760405162461bcd60e51b815260040180806020018281038252602a815260200180612e86602a913960400191505060405180910390fd5b600080611139866117ed565b6000888152600360208181526040808420848155600181018590556002808201869055938101859055600481018590556005810185905560068101859055600781018590556008810180546001600160a01b03199081169091556009820180549091169055600a0180546001600160b01b031916905591905281205590925090508115611232576111c861245a565b6001600160a01b03168361010001516001600160a01b0316141561120a57610120830151611205906001600160a01b03168363ffffffff61261b16565b611232565b611232836101200151838561010001516001600160a01b031661271f9092919063ffffffff16565b80156112aa5761124061245a565b6001600160a01b03168361010001516001600160a01b031614156112825761014083015161127d906001600160a01b03168263ffffffff61261b16565b6112aa565b6112aa836101400151828561010001516001600160a01b031661271f9092919063ffffffff16565b8261012001516001600160a01b03168361014001516001600160a01b0316877f15b38b64ef7ba7c991c4ed5d695a684c71bbfefe84978c647f3ba3e7c77f89188486604051808381526020018281526020019250505060405180910390a460019450505050506000805460ff19166001179055919050565b6000805460ff16611368576040805162461bcd60e51b815260206004820152601f6024820152600080516020612e07833981519152604482015290519081900360640190fd5b6000805460ff19168155838152600360205260409020600a01548390600160a81b900460ff166113d7576040805162461bcd60e51b81526020600482015260156024820152741cdd1c99585b48191bd95cc81b9bdd08195e1a5cdd605a1b604482015290519081900360640190fd5b600084815260036020526040902060098101546001600160a01b031633146114305760405162461bcd60e51b815260040180806020018281038252602a815260200180612eb0602a913960400191505060405180910390fd5b600085815260026020526040902054841015611493576040805162461bcd60e51b815260206004820152601f60248201527f616d6f756e74206973207a65726f206f72206e6f742065666665637469766500604482015290519081900360640190fd5b60008061149f876117ed565b91509150858210156114e25760405162461bcd60e51b815260040180806020018281038252602d815260200180612e59602d913960400191505060405180910390fd5b6114ea61245a565b60088401546001600160a01b0390811691161415611525576009830154611520906001600160a01b03168763ffffffff61261b16565b61154c565b6009830154600884015461154c916001600160a01b0391821691168863ffffffff61271f16565b43600784015560018301819055611569828763ffffffff6124cb16565b600284015560098301546040805188815290516001600160a01b039092169189917f36c3ab437e6a424ed25dc4bfdeb62706aa06558660fab2dab229d2555adaf89c919081900360200190a360019450505050506000805460ff1916600117905592915050565b60008060008060008060008060008060008b60036000828152602001908152602001600020600a0160159054906101000a900460ff1661164f576040805162461bcd60e51b81526020600482015260156024820152741cdd1c99585b48191bd95cc81b9bdd08195e1a5cdd605a1b604482015290519081900360640190fd5b611657612d7f565b600360008f8152602001908152602001600020604051806101a001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815260200160068201548152602001600782015481526020016008820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020016009820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b03168152602001600a820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b03168152602001600a820160149054906101000a900460ff16151515158152602001600a820160159054906101000a900460ff16151515158152505090508061014001519c508061012001519b508061010001519a5080600001519950806060015198508060800151975080602001519650806040015195508060a0015194508060e0015193508061016001519250505091939597999b90929496989a50565b6000818152600360205260408120600a015481908390600160a81b900460ff16611856576040805162461bcd60e51b81526020600482015260156024820152741cdd1c99585b48191bd95cc81b9bdd08195e1a5cdd605a1b604482015290519081900360640190fd5b61185e612d7f565b5060008481526003602081815260409283902083516101a08101855281548152600182015492810192909252600281015493820193909352908201546060820181905260048301546080830152600583015460a0830152600683015460c0830152600783015460e083015260088301546001600160a01b0390811661010084015260098401548116610120840152600a9093015492831661014083015260ff600160a01b840481161515610160840152600160a81b9093049092161515610180820152904310156119355751600093509150611abb565b60008160400151905060006119778360800151610d81670de0b6b3a764000061196b8760e00151436124cb90919063ffffffff16565b9063ffffffff61247216565b905060006119a06103e8610d81670de0b6b3a76400008760a0015161247290919063ffffffff16565b905060006119bc670de0b6b3a76400008363ffffffff6124cb16565b905060006119ea670de0b6b3a7640000610d816119d9858861250d565b60208a01519063ffffffff61247216565b90506000611a058288602001516124cb90919063ffffffff16565b90508515611a2057611a1d818763ffffffff61240016565b90505b8651611a32838363ffffffff61240016565b1115611a6f5760405162461bcd60e51b8152600401808060200182810382526032815260200180612e276032913960400191505060405180910390fd5b60008b8152600260205260409020548110611a8c57809950611a91565b600099505b60008b8152600260205260409020548210611aae57819850611ab3565b600098505b505050505050505b50915091565b6000805460ff16611b07576040805162461bcd60e51b815260206004820152601f6024820152600080516020612e07833981519152604482015290519081900360640190fd5b6000805460ff19168155838152600360205260409020600a01548390600160a81b900460ff16611b76576040805162461bcd60e51b81526020600482015260156024820152741cdd1c99585b48191bd95cc81b9bdd08195e1a5cdd605a1b604482015290519081900360640190fd5b6000848152600360205260409020600a8101546001600160a01b03163314611bcf5760405162461bcd60e51b8152600401808060200182810382526027815260200180612efb6027913960400191505060405180910390fd5b6000858152600260205260409020548411611c28576040805162461bcd60e51b8152602060048201526014602482015273616d6f756e74206e6f742065666665637469766560601b604482015290519081900360640190fd5b611c3061245a565b60088201546001600160a01b0390811691161415611c9257348414611c8d576040805162461bcd60e51b815260206004820152600e60248201526d18985908195d1a195c88199d5b9960921b604482015290519081900360640190fd5b611cb2565b6008810154611cb2906001600160a01b031633308763ffffffff61224b16565b600080611cbe876117ed565b4360078601559092509050611cd9818763ffffffff61240016565b6001840155600283018290558254611cf7908763ffffffff61240016565b835560408051878152905188917f700a4c5207a5280e621eed38effdd99714a7631fd21eea8da0c30b0f0f76fb05919081900360200190a260019450505050506000805460ff1916600117905592915050565b6000853486866001600160a01b038416611dab576040805162461bcd60e51b815260206004820152601a60248201527f73747265616d20746f20746865207a65726f2061646472657373000000000000604482015290519081900360640190fd5b6001600160a01b038416301415611e09576040805162461bcd60e51b815260206004820152601d60248201527f73747265616d20746f2074686520636f6e747261637420697473656c66000000604482015290519081900360640190fd5b6001600160a01b038416331415611e5e576040805162461bcd60e51b815260206004820152601460248201527339ba3932b0b6903a37903a34329031b0b63632b960611b604482015290519081900360640190fd5b60008311611eac576040805162461bcd60e51b81526020600482015260166024820152756465706f73697420616d6f756e74206973207a65726f60501b604482015290519081900360640190fd5b43821015611f01576040805162461bcd60e51b815260206004820152601f60248201527f737461727420626c6f636b206265666f726520626c6f636b2e6e756d62657200604482015290519081900360640190fd5b60008111611f48576040805162461bcd60e51b815260206004820152600f60248201526e6b20626c6f636b206973207a65726f60881b604482015290519081900360640190fd5b6103e88710611f98576040805162461bcd60e51b81526020600482015260176024820152760756e6c6f636b526174696f206d757374203c203130303604c1b604482015290519081900360640190fd5b60008711611fe4576040805162461bcd60e51b81526020600482015260146024820152730756e6c6f636b526174696f206d757374203e20360641b604482015290519081900360640190fd5b655af3107a4000341015612033576040805162461bcd60e51b815260206004820152601160248201527019195c1bdcda5d081d1bdbc81cdb585b1b607a1b604482015290519081900360640190fd5b6001549450604051806101a00160405280348152602001348152602001600081526020018a8152602001898152602001888152602001670de0b6b3a764000081526020018a815260200161208561245a565b6001600160a01b0390811682528c8116602080840191909152336040808501919091528a15156060808601919091526001608095860181905260008c8152600380865290849020885181559488015185830155928701516002850155908601519183019190915592840151600482015560a0840151600582015560c0840151600682015560e084015160078201556101008401516008820180549184166001600160a01b0319928316179055610120850151600983018054918516918316919091179055610140850151600a9092018054610160870151610180909701511515600160a81b0260ff60a81b19971515600160a01b0260ff60a01b199590961691909316179290921692909217939093161790915580546121aa9163ffffffff61240016565b6001556001600160a01b038a1633867f296dd961afc929c5e58943ef2ed406ae3188daf473f26b44f2ee263d7e0ee4e06121e261245a565b604080516001600160a01b0390921682523460208301528181018f9052606082018e9052608082018d90528b151560a0830152519081900360c00190a45050505095945050505050565b60006001600160a01b03821661224457506000610acb565b503b151590565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17815292518251600094606094938a169392918291908083835b602083106122d05780518252601f1990920191602091820191016122b1565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612332576040519150601f19603f3d011682016040523d82523d6000602084013e612337565b606091505b5091509150818015612365575080511580612365575080806020019051602081101561236257600080fd5b50515b6123ad576040805162461bcd60e51b81526020600482015260146024820152731514905394d1915497d19493d357d1905253115160621b604482015290519081900360640190fd5b505050505050565b60006123f783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061287b565b90505b92915050565b6000828201838110156123f7576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee90565b600082612481575060006123fa565b8282028284828161248e57fe5b04146123f75760405162461bcd60e51b8152600401808060200182810382526021815260200180612eda6021913960400191505060405180910390fd5b60006123f783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061291d565b6000600183101561255d576040805162461bcd60e51b81526020600482015260156024820152744552525f42504f575f424153455f544f4f5f4c4f5760581b604482015290519081900360640190fd5b671bc16d674ec7ffff8311156125b3576040805162461bcd60e51b815260206004820152601660248201527508aa4a4be84a09eaebe8482a68abea89e9ebe90928e960531b604482015290519081900360640190fd5b60006125be83612977565b905060006125cc8483612992565b905060006125e2866125dd856129f4565b612a02565b9050816125f35792506123fa915050565b600061260487846305f5e100612a59565b90506126108282612b3c565b979650505050505050565b604080516000808252602082019092526001600160a01b0384169083906040518082805190602001908083835b602083106126675780518252601f199092019160209182019101612648565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146126c9576040519150601f19603f3d011682016040523d82523d6000602084013e6126ce565b606091505b505090508061271a576040805162461bcd60e51b815260206004820152601360248201527211551217d514905394d1915497d19052531151606a1b604482015290519081900360640190fd5b505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b6020831061279c5780518252601f19909201916020918201910161277d565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146127fe576040519150601f19603f3d011682016040523d82523d6000602084013e612803565b606091505b5091509150818015612831575080511580612831575080806020019051602081101561282e57600080fd5b50515b612874576040805162461bcd60e51b815260206004820152600f60248201526e1514905394d1915497d19052531151608a1b604482015290519081900360640190fd5b5050505050565b600081836129075760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156128cc5781810151838201526020016128b4565b50505050905090810190601f1680156128f95780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161291357fe5b0495945050505050565b6000818484111561296f5760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156128cc5781810151838201526020016128b4565b505050900390565b6000670de0b6b3a764000061298b836129f4565b0292915050565b60008060006129a18585612c05565b9150915080156129ec576040805162461bcd60e51b81526020600482015260116024820152704552525f5355425f554e444552464c4f5760781b604482015290519081900360640190fd5b509392505050565b670de0b6b3a7640000900490565b60008060028306612a1b57670de0b6b3a7640000612a1d565b835b90506002830492505b82156123f757612a368485612b3c565b93506002830615612a4e57612a4b8185612b3c565b90505b600283049250612a26565b6000828180612a7087670de0b6b3a7640000612c05565b9092509050670de0b6b3a764000080600060015b888410612b2d576000670de0b6b3a764000082029050600080612ab88a612ab385670de0b6b3a7640000612992565b612c05565b91509150612acf87612aca848c612b3c565b612b3c565b9650612adb8784612c2a565b965086612aea57505050612b2d565b8715612af4579315935b8015612afe579315935b8415612b1557612b0e8688612992565b9550612b22565b612b1f8688612d32565b95505b505050600101612a84565b50909998505050505050505050565b6000828202831580612b56575082848281612b5357fe5b04145b612b9a576040805162461bcd60e51b815260206004820152601060248201526f4552525f4d554c5f4f564552464c4f5760801b604482015290519081900360640190fd5b6706f05b59d3b20000810181811015612bed576040805162461bcd60e51b815260206004820152601060248201526f4552525f4d554c5f4f564552464c4f5760801b604482015290519081900360640190fd5b6000670de0b6b3a7640000825b049695505050505050565b600080828410612c1b5750508082036000612c23565b505081810360015b9250929050565b600081612c6d576040805162461bcd60e51b815260206004820152600c60248201526b4552525f4449565f5a45524f60a01b604482015290519081900360640190fd5b670de0b6b3a76400008302831580612c955750670de0b6b3a7640000848281612c9257fe5b04145b612cd9576040805162461bcd60e51b815260206004820152601060248201526f11549497d1125597d25395115493905360821b604482015290519081900360640190fd5b60028304810181811015612d27576040805162461bcd60e51b815260206004820152601060248201526f11549497d1125597d25395115493905360821b604482015290519081900360640190fd5b6000848281612bfa57fe5b6000828201838110156123f7576040805162461bcd60e51b815260206004820152601060248201526f4552525f4144445f4f564552464c4f5760801b604482015290519081900360640190fd5b604051806101a00160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b03168152602001600015158152602001600015158152509056fe5265656e7472616e637947756172643a207265656e7472616e742063616c6c0062616c616e63654f663a2072656d61696e696e67206f7220776974686472617761626c6520616d6f756e7420697320626164776974686472617720616d6f756e7420657863656564732074686520617661696c61626c652062616c616e636563616c6c6572206d757374206265207468652073656e646572206f722074686520726563697069656e7463616c6c6572206d7573742062652074686520726563697069656e74206f66207468652073747265616d536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7763616c6c6572206d757374206265207468652073656e646572206f66207468652073747265616da265627a7a723158205e87d3ee6db25103178fda07cfdb9332ee39f260f532b3b317b3622d96ff510064736f6c63430005110032

Deployed Bytecode

0x6080604052600436106100c25760003560e01c80636ce92e211161007f578063894e9a0d11610059578063894e9a0d146102ed5780639cc7f7081461037c578063b5a3629d146103bf578063c791713a146103e2576100c2565b80636ce92e211461026a5780636db9241b146102935780637a9b2c6c146102bd576100c2565b80630d8e6e2c146100c75780631290fab4146100ee5780631e99d5691461014b5780633b749f6b1461016057806352fa95ec1461019e57806364d60d91146101c8575b600080fd5b3480156100d357600080fd5b506100dc610422565b60408051918252519081900360200190f35b3480156100fa57600080fd5b506100dc600480360360e081101561011157600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060808101359060a08101359060c00135151561042f565b34801561015757600080fd5b506100dc610aa8565b34801561016c57600080fd5b5061018a6004803603602081101561018357600080fd5b5035610aae565b604080519115158252519081900360200190f35b3480156101aa57600080fd5b506100dc600480360360208110156101c157600080fd5b5035610ad0565b3480156101d457600080fd5b506101f2600480360360208110156101eb57600080fd5b5035610ae2565b604080519d8e5260208e019c909c528c8c019a909a5260608c019890985260808b019690965260a08a019490945260c089019290925260e08801526001600160a01b03908116610100880152908116610120870152166101408501521515610160840152151561018083015251908190036101a00190f35b61018a6004803603606081101561028057600080fd5b5080359060208101359060400135610b61565b34801561029f57600080fd5b5061018a600480360360208110156102b657600080fd5b5035610ee9565b3480156102c957600080fd5b5061018a600480360360408110156102e057600080fd5b5080359060200135611322565b3480156102f957600080fd5b506103176004803603602081101561031057600080fd5b50356115d0565b604080516001600160a01b039c8d1681529a8c1660208c015298909a16898901526060890196909652608088019490945260a087019290925260c086015260e08501526101008401526101208301529115156101408201529051908190036101600190f35b34801561038857600080fd5b506103a66004803603602081101561039f57600080fd5b50356117ed565b6040805192835260208301919091528051918290030190f35b61018a600480360360408110156103d557600080fd5b5080359060200135611ac1565b6100dc600480360360a08110156103f857600080fd5b506001600160a01b0381351690602081013590604081013590606081013590608001351515611d4a565b6541504f4c4c4f60d01b90565b6000868686866001600160a01b038416610490576040805162461bcd60e51b815260206004820152601a60248201527f73747265616d20746f20746865207a65726f2061646472657373000000000000604482015290519081900360640190fd5b6001600160a01b0384163014156104ee576040805162461bcd60e51b815260206004820152601d60248201527f73747265616d20746f2074686520636f6e747261637420697473656c66000000604482015290519081900360640190fd5b6001600160a01b038416331415610543576040805162461bcd60e51b815260206004820152601460248201527339ba3932b0b6903a37903a34329031b0b63632b960611b604482015290519081900360640190fd5b60008311610591576040805162461bcd60e51b81526020600482015260166024820152756465706f73697420616d6f756e74206973207a65726f60501b604482015290519081900360640190fd5b438210156105e6576040805162461bcd60e51b815260206004820152601f60248201527f737461727420626c6f636b206265666f726520626c6f636b2e6e756d62657200604482015290519081900360640190fd5b6000811161062d576040805162461bcd60e51b815260206004820152600f60248201526e6b20626c6f636b206973207a65726f60881b604482015290519081900360640190fd5b6103e8871061067d576040805162461bcd60e51b81526020600482015260176024820152760756e6c6f636b526174696f206d757374203c203130303604c1b604482015290519081900360640190fd5b600087116106c9576040805162461bcd60e51b81526020600482015260146024820152730756e6c6f636b526174696f206d757374203e20360641b604482015290519081900360640190fd5b6106db8c6001600160a01b031661222c565b61071b576040805162461bcd60e51b815260206004820152600c60248201526b1b9bdd0818dbdb9d1c9858dd60a21b604482015290519081900360640190fd5b6107366001600160a01b038d1633308d63ffffffff61224b16565b600154945060008c6001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561077657600080fd5b505afa15801561078a573d6000803e3d6000fd5b505050506040513d60208110156107a057600080fd5b505160ff16600a0a9050620f4240811015610802576040805162461bcd60e51b815260206004820152601760248201527f746f6b656e20646563696d616c20746f6f20736d616c6c000000000000000000604482015290519081900360640190fd5b6108148161271063ffffffff6123b516565b60008781526002602052604090208190558b101561086d576040805162461bcd60e51b815260206004820152601160248201527019195c1bdcda5d081d1bdbc81cdb585b1b607a1b604482015290519081900360640190fd5b604051806101a001604052808c81526020018c8152602001600081526020018b81526020018a81526020018981526020018281526020018b81526020018e6001600160a01b031681526020018d6001600160a01b03168152602001336001600160a01b0316815260200188151581526020016001151581525060036000888152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e082015181600701556101008201518160080160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506101208201518160090160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555061014082015181600a0160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555061016082015181600a0160146101000a81548160ff02191690831515021790555061018082015181600a0160156101000a81548160ff02191690831515021790555090505050610a2e6001805461240090919063ffffffff16565b600155604080516001600160a01b038e81168252602082018d90528183018c9052606082018b9052608082018a905288151560a08301529151918d1691339188917f296dd961afc929c5e58943ef2ed406ae3188daf473f26b44f2ee263d7e0ee4e09181900360c00190a450505050979650505050505050565b60015481565b6000818152600360205260409020600a0154600160a81b900460ff165b919050565b60026020526000908152604090205481565b600360208190526000918252604090912080546001820154600283015493830154600484015460058501546006860154600787015460088801546009890154600a90990154979996989697959694959394929391926001600160a01b03918216929082169181169060ff600160a01b8204811691600160a81b9004168d565b6000805460ff16610ba7576040805162461bcd60e51b815260206004820152601f6024820152600080516020612e07833981519152604482015290519081900360640190fd5b6000805460ff19168155848152600360205260409020600a01548490600160a81b900460ff16610c16576040805162461bcd60e51b81526020600482015260156024820152741cdd1c99585b48191bd95cc81b9bdd08195e1a5cdd605a1b604482015290519081900360640190fd5b6000858152600360205260409020600a8101546001600160a01b03163314610c6f5760405162461bcd60e51b8152600401808060200182810382526027815260200180612efb6027913960400191505060405180910390fd5b6000868152600260205260409020548511610cc8576040805162461bcd60e51b8152602060048201526014602482015273616d6f756e74206e6f742065666665637469766560601b604482015290519081900360640190fd5b610cd061245a565b60088201546001600160a01b0390811691161415610d3257348514610d2d576040805162461bcd60e51b815260206004820152600e60248201526d18985908195d1a195c88199d5b9960921b604482015290519081900360640190fd5b610d52565b6008810154610d52906001600160a01b031633308863ffffffff61224b16565b600080610d5e886117ed565b90925090506000610d8d87610d818a670de0b6b3a764000063ffffffff61247216565b9063ffffffff6123b516565b90506000610da988670de0b6b3a764000063ffffffff61247216565b90506000610dda8660040154610d816103e8610d81670de0b6b3a76400008b6005015461247290919063ffffffff16565b90506000610df6670de0b6b3a76400008363ffffffff6124cb16565b90506000610e3c670de0b6b3a7640000610d8185610d81610e2f610e1a888b61250d565b670de0b6b3a76400009063ffffffff6124cb16565b8a9063ffffffff61247216565b4360078a01559050610e54868263ffffffff61240016565b6001890155610e7981610e6d898f63ffffffff61240016565b9063ffffffff6124cb16565b60028901558754610e90908d63ffffffff61240016565b8855604080518d815290518e917f700a4c5207a5280e621eed38effdd99714a7631fd21eea8da0c30b0f0f76fb05919081900360200190a2600199505050505050505050506000805460ff191660011790559392505050565b6000805460ff16610f2f576040805162461bcd60e51b815260206004820152601f6024820152600080516020612e07833981519152604482015290519081900360640190fd5b6000805460ff19168155828152600360205260409020600a01548290600160a81b900460ff16610f9e576040805162461bcd60e51b81526020600482015260156024820152741cdd1c99585b48191bd95cc81b9bdd08195e1a5cdd605a1b604482015290519081900360640190fd5b610fa6612d7f565b5060008381526003602081815260409283902083516101a0810185528154815260018201549281019290925260028101549382019390935290820154606082015260048201546080820152600582015460a0820152600682015460c0820152600782015460e082015260088201546001600160a01b0390811661010083015260098301548116610120830152600a9092015491821661014082015260ff600160a01b8304811615156101608301819052600160a81b909304161515610180820152906110b1576040805162461bcd60e51b81526020600482015260156024820152746e6f6e2063616e63656c61626c652073747265616d60581b604482015290519081900360640190fd5b6000848152600360205260409020600a01546001600160a01b03163314806110f257506000848152600360205260409020600901546001600160a01b031633145b61112d5760405162461bcd60e51b815260040180806020018281038252602a815260200180612e86602a913960400191505060405180910390fd5b600080611139866117ed565b6000888152600360208181526040808420848155600181018590556002808201869055938101859055600481018590556005810185905560068101859055600781018590556008810180546001600160a01b03199081169091556009820180549091169055600a0180546001600160b01b031916905591905281205590925090508115611232576111c861245a565b6001600160a01b03168361010001516001600160a01b0316141561120a57610120830151611205906001600160a01b03168363ffffffff61261b16565b611232565b611232836101200151838561010001516001600160a01b031661271f9092919063ffffffff16565b80156112aa5761124061245a565b6001600160a01b03168361010001516001600160a01b031614156112825761014083015161127d906001600160a01b03168263ffffffff61261b16565b6112aa565b6112aa836101400151828561010001516001600160a01b031661271f9092919063ffffffff16565b8261012001516001600160a01b03168361014001516001600160a01b0316877f15b38b64ef7ba7c991c4ed5d695a684c71bbfefe84978c647f3ba3e7c77f89188486604051808381526020018281526020019250505060405180910390a460019450505050506000805460ff19166001179055919050565b6000805460ff16611368576040805162461bcd60e51b815260206004820152601f6024820152600080516020612e07833981519152604482015290519081900360640190fd5b6000805460ff19168155838152600360205260409020600a01548390600160a81b900460ff166113d7576040805162461bcd60e51b81526020600482015260156024820152741cdd1c99585b48191bd95cc81b9bdd08195e1a5cdd605a1b604482015290519081900360640190fd5b600084815260036020526040902060098101546001600160a01b031633146114305760405162461bcd60e51b815260040180806020018281038252602a815260200180612eb0602a913960400191505060405180910390fd5b600085815260026020526040902054841015611493576040805162461bcd60e51b815260206004820152601f60248201527f616d6f756e74206973207a65726f206f72206e6f742065666665637469766500604482015290519081900360640190fd5b60008061149f876117ed565b91509150858210156114e25760405162461bcd60e51b815260040180806020018281038252602d815260200180612e59602d913960400191505060405180910390fd5b6114ea61245a565b60088401546001600160a01b0390811691161415611525576009830154611520906001600160a01b03168763ffffffff61261b16565b61154c565b6009830154600884015461154c916001600160a01b0391821691168863ffffffff61271f16565b43600784015560018301819055611569828763ffffffff6124cb16565b600284015560098301546040805188815290516001600160a01b039092169189917f36c3ab437e6a424ed25dc4bfdeb62706aa06558660fab2dab229d2555adaf89c919081900360200190a360019450505050506000805460ff1916600117905592915050565b60008060008060008060008060008060008b60036000828152602001908152602001600020600a0160159054906101000a900460ff1661164f576040805162461bcd60e51b81526020600482015260156024820152741cdd1c99585b48191bd95cc81b9bdd08195e1a5cdd605a1b604482015290519081900360640190fd5b611657612d7f565b600360008f8152602001908152602001600020604051806101a001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815260200160068201548152602001600782015481526020016008820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020016009820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b03168152602001600a820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b03168152602001600a820160149054906101000a900460ff16151515158152602001600a820160159054906101000a900460ff16151515158152505090508061014001519c508061012001519b508061010001519a5080600001519950806060015198508060800151975080602001519650806040015195508060a0015194508060e0015193508061016001519250505091939597999b90929496989a50565b6000818152600360205260408120600a015481908390600160a81b900460ff16611856576040805162461bcd60e51b81526020600482015260156024820152741cdd1c99585b48191bd95cc81b9bdd08195e1a5cdd605a1b604482015290519081900360640190fd5b61185e612d7f565b5060008481526003602081815260409283902083516101a08101855281548152600182015492810192909252600281015493820193909352908201546060820181905260048301546080830152600583015460a0830152600683015460c0830152600783015460e083015260088301546001600160a01b0390811661010084015260098401548116610120840152600a9093015492831661014083015260ff600160a01b840481161515610160840152600160a81b9093049092161515610180820152904310156119355751600093509150611abb565b60008160400151905060006119778360800151610d81670de0b6b3a764000061196b8760e00151436124cb90919063ffffffff16565b9063ffffffff61247216565b905060006119a06103e8610d81670de0b6b3a76400008760a0015161247290919063ffffffff16565b905060006119bc670de0b6b3a76400008363ffffffff6124cb16565b905060006119ea670de0b6b3a7640000610d816119d9858861250d565b60208a01519063ffffffff61247216565b90506000611a058288602001516124cb90919063ffffffff16565b90508515611a2057611a1d818763ffffffff61240016565b90505b8651611a32838363ffffffff61240016565b1115611a6f5760405162461bcd60e51b8152600401808060200182810382526032815260200180612e276032913960400191505060405180910390fd5b60008b8152600260205260409020548110611a8c57809950611a91565b600099505b60008b8152600260205260409020548210611aae57819850611ab3565b600098505b505050505050505b50915091565b6000805460ff16611b07576040805162461bcd60e51b815260206004820152601f6024820152600080516020612e07833981519152604482015290519081900360640190fd5b6000805460ff19168155838152600360205260409020600a01548390600160a81b900460ff16611b76576040805162461bcd60e51b81526020600482015260156024820152741cdd1c99585b48191bd95cc81b9bdd08195e1a5cdd605a1b604482015290519081900360640190fd5b6000848152600360205260409020600a8101546001600160a01b03163314611bcf5760405162461bcd60e51b8152600401808060200182810382526027815260200180612efb6027913960400191505060405180910390fd5b6000858152600260205260409020548411611c28576040805162461bcd60e51b8152602060048201526014602482015273616d6f756e74206e6f742065666665637469766560601b604482015290519081900360640190fd5b611c3061245a565b60088201546001600160a01b0390811691161415611c9257348414611c8d576040805162461bcd60e51b815260206004820152600e60248201526d18985908195d1a195c88199d5b9960921b604482015290519081900360640190fd5b611cb2565b6008810154611cb2906001600160a01b031633308763ffffffff61224b16565b600080611cbe876117ed565b4360078601559092509050611cd9818763ffffffff61240016565b6001840155600283018290558254611cf7908763ffffffff61240016565b835560408051878152905188917f700a4c5207a5280e621eed38effdd99714a7631fd21eea8da0c30b0f0f76fb05919081900360200190a260019450505050506000805460ff1916600117905592915050565b6000853486866001600160a01b038416611dab576040805162461bcd60e51b815260206004820152601a60248201527f73747265616d20746f20746865207a65726f2061646472657373000000000000604482015290519081900360640190fd5b6001600160a01b038416301415611e09576040805162461bcd60e51b815260206004820152601d60248201527f73747265616d20746f2074686520636f6e747261637420697473656c66000000604482015290519081900360640190fd5b6001600160a01b038416331415611e5e576040805162461bcd60e51b815260206004820152601460248201527339ba3932b0b6903a37903a34329031b0b63632b960611b604482015290519081900360640190fd5b60008311611eac576040805162461bcd60e51b81526020600482015260166024820152756465706f73697420616d6f756e74206973207a65726f60501b604482015290519081900360640190fd5b43821015611f01576040805162461bcd60e51b815260206004820152601f60248201527f737461727420626c6f636b206265666f726520626c6f636b2e6e756d62657200604482015290519081900360640190fd5b60008111611f48576040805162461bcd60e51b815260206004820152600f60248201526e6b20626c6f636b206973207a65726f60881b604482015290519081900360640190fd5b6103e88710611f98576040805162461bcd60e51b81526020600482015260176024820152760756e6c6f636b526174696f206d757374203c203130303604c1b604482015290519081900360640190fd5b60008711611fe4576040805162461bcd60e51b81526020600482015260146024820152730756e6c6f636b526174696f206d757374203e20360641b604482015290519081900360640190fd5b655af3107a4000341015612033576040805162461bcd60e51b815260206004820152601160248201527019195c1bdcda5d081d1bdbc81cdb585b1b607a1b604482015290519081900360640190fd5b6001549450604051806101a00160405280348152602001348152602001600081526020018a8152602001898152602001888152602001670de0b6b3a764000081526020018a815260200161208561245a565b6001600160a01b0390811682528c8116602080840191909152336040808501919091528a15156060808601919091526001608095860181905260008c8152600380865290849020885181559488015185830155928701516002850155908601519183019190915592840151600482015560a0840151600582015560c0840151600682015560e084015160078201556101008401516008820180549184166001600160a01b0319928316179055610120850151600983018054918516918316919091179055610140850151600a9092018054610160870151610180909701511515600160a81b0260ff60a81b19971515600160a01b0260ff60a01b199590961691909316179290921692909217939093161790915580546121aa9163ffffffff61240016565b6001556001600160a01b038a1633867f296dd961afc929c5e58943ef2ed406ae3188daf473f26b44f2ee263d7e0ee4e06121e261245a565b604080516001600160a01b0390921682523460208301528181018f9052606082018e9052608082018d90528b151560a0830152519081900360c00190a45050505095945050505050565b60006001600160a01b03821661224457506000610acb565b503b151590565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17815292518251600094606094938a169392918291908083835b602083106122d05780518252601f1990920191602091820191016122b1565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612332576040519150601f19603f3d011682016040523d82523d6000602084013e612337565b606091505b5091509150818015612365575080511580612365575080806020019051602081101561236257600080fd5b50515b6123ad576040805162461bcd60e51b81526020600482015260146024820152731514905394d1915497d19493d357d1905253115160621b604482015290519081900360640190fd5b505050505050565b60006123f783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061287b565b90505b92915050565b6000828201838110156123f7576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee90565b600082612481575060006123fa565b8282028284828161248e57fe5b04146123f75760405162461bcd60e51b8152600401808060200182810382526021815260200180612eda6021913960400191505060405180910390fd5b60006123f783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061291d565b6000600183101561255d576040805162461bcd60e51b81526020600482015260156024820152744552525f42504f575f424153455f544f4f5f4c4f5760581b604482015290519081900360640190fd5b671bc16d674ec7ffff8311156125b3576040805162461bcd60e51b815260206004820152601660248201527508aa4a4be84a09eaebe8482a68abea89e9ebe90928e960531b604482015290519081900360640190fd5b60006125be83612977565b905060006125cc8483612992565b905060006125e2866125dd856129f4565b612a02565b9050816125f35792506123fa915050565b600061260487846305f5e100612a59565b90506126108282612b3c565b979650505050505050565b604080516000808252602082019092526001600160a01b0384169083906040518082805190602001908083835b602083106126675780518252601f199092019160209182019101612648565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146126c9576040519150601f19603f3d011682016040523d82523d6000602084013e6126ce565b606091505b505090508061271a576040805162461bcd60e51b815260206004820152601360248201527211551217d514905394d1915497d19052531151606a1b604482015290519081900360640190fd5b505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b6020831061279c5780518252601f19909201916020918201910161277d565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146127fe576040519150601f19603f3d011682016040523d82523d6000602084013e612803565b606091505b5091509150818015612831575080511580612831575080806020019051602081101561282e57600080fd5b50515b612874576040805162461bcd60e51b815260206004820152600f60248201526e1514905394d1915497d19052531151608a1b604482015290519081900360640190fd5b5050505050565b600081836129075760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156128cc5781810151838201526020016128b4565b50505050905090810190601f1680156128f95780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161291357fe5b0495945050505050565b6000818484111561296f5760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156128cc5781810151838201526020016128b4565b505050900390565b6000670de0b6b3a764000061298b836129f4565b0292915050565b60008060006129a18585612c05565b9150915080156129ec576040805162461bcd60e51b81526020600482015260116024820152704552525f5355425f554e444552464c4f5760781b604482015290519081900360640190fd5b509392505050565b670de0b6b3a7640000900490565b60008060028306612a1b57670de0b6b3a7640000612a1d565b835b90506002830492505b82156123f757612a368485612b3c565b93506002830615612a4e57612a4b8185612b3c565b90505b600283049250612a26565b6000828180612a7087670de0b6b3a7640000612c05565b9092509050670de0b6b3a764000080600060015b888410612b2d576000670de0b6b3a764000082029050600080612ab88a612ab385670de0b6b3a7640000612992565b612c05565b91509150612acf87612aca848c612b3c565b612b3c565b9650612adb8784612c2a565b965086612aea57505050612b2d565b8715612af4579315935b8015612afe579315935b8415612b1557612b0e8688612992565b9550612b22565b612b1f8688612d32565b95505b505050600101612a84565b50909998505050505050505050565b6000828202831580612b56575082848281612b5357fe5b04145b612b9a576040805162461bcd60e51b815260206004820152601060248201526f4552525f4d554c5f4f564552464c4f5760801b604482015290519081900360640190fd5b6706f05b59d3b20000810181811015612bed576040805162461bcd60e51b815260206004820152601060248201526f4552525f4d554c5f4f564552464c4f5760801b604482015290519081900360640190fd5b6000670de0b6b3a7640000825b049695505050505050565b600080828410612c1b5750508082036000612c23565b505081810360015b9250929050565b600081612c6d576040805162461bcd60e51b815260206004820152600c60248201526b4552525f4449565f5a45524f60a01b604482015290519081900360640190fd5b670de0b6b3a76400008302831580612c955750670de0b6b3a7640000848281612c9257fe5b04145b612cd9576040805162461bcd60e51b815260206004820152601060248201526f11549497d1125597d25395115493905360821b604482015290519081900360640190fd5b60028304810181811015612d27576040805162461bcd60e51b815260206004820152601060248201526f11549497d1125597d25395115493905360821b604482015290519081900360640190fd5b6000848281612bfa57fe5b6000828201838110156123f7576040805162461bcd60e51b815260206004820152601060248201526f4552525f4144445f4f564552464c4f5760801b604482015290519081900360640190fd5b604051806101a00160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b03168152602001600015158152602001600015158152509056fe5265656e7472616e637947756172643a207265656e7472616e742063616c6c0062616c616e63654f663a2072656d61696e696e67206f7220776974686472617761626c6520616d6f756e7420697320626164776974686472617720616d6f756e7420657863656564732074686520617661696c61626c652062616c616e636563616c6c6572206d757374206265207468652073656e646572206f722074686520726563697069656e7463616c6c6572206d7573742062652074686520726563697069656e74206f66207468652073747265616d536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7763616c6c6572206d757374206265207468652073656e646572206f66207468652073747265616da265627a7a723158205e87d3ee6db25103178fda07cfdb9332ee39f260f532b3b317b3622d96ff510064736f6c63430005110032

Deployed Bytecode Sourcemap

14769:19603:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34272:97;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34272:97:0;;;:::i;:::-;;;;;;;;;;;;;;;;19039:1902;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19039:1902:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;19039:1902:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;14995:31::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14995:31:0;;;:::i;23433:118::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23433:118:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23433:118:0;;:::i;:::-;;;;;;;;;;;;;;;;;;15130:50;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15130:50:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;15130:50:0;;:::i;16039:41::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16039:41:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;16039:41:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16039:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26987:1978;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26987:1978:0;;;;;;;;;;;;:::i;32860:1404::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32860:1404:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32860:1404:0;;:::i;31317:1146::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31317:1146:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;31317:1146:0;;;;;;;:::i;24049:993::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24049:993:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24049:993:0;;:::i;:::-;;;;-1:-1:-1;;;;;24049:993:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29400:1399;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29400:1399:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29400:1399:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;25371:1170;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25371:1170:0;;;;;;;:::i;21823:1432::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;21823:1432:0;;;;;;;;;;;;;;;;;;;;;;;;;:::i;34272:97::-;-1:-1:-1;;;34272:97:0;:::o;19039:1902::-;19375:16;19311:9;19322:13;19337:10;19349:6;-1:-1:-1;;;;;16785:23:0;;16777:62;;;;;-1:-1:-1;;;16777:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16858:26:0;;16879:4;16858:26;;16850:68;;;;;-1:-1:-1;;;16850:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16937:23:0;;16950:10;16937:23;;16929:56;;;;;-1:-1:-1;;;16929:56:0;;;;;;;;;;;;-1:-1:-1;;;16929:56:0;;;;;;;;;;;;;;;17020:1;17004:13;:17;16996:52;;;;;-1:-1:-1;;;16996:52:0;;;;;;;;;;;;-1:-1:-1;;;16996:52:0;;;;;;;;;;;;;;;17081:12;17067:10;:26;;17059:70;;;;;-1:-1:-1;;;17059:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;17157:1;17148:6;:10;17140:38;;;;;-1:-1:-1;;;17140:38:0;;;;;;;;;;;;-1:-1:-1;;;17140:38:0;;;;;;;;;;;;;;;19431:4;19417:11;:18;19409:54;;;;;-1:-1:-1;;;19409:54:0;;;;;;;;;;;;-1:-1:-1;;;19409:54:0;;;;;;;;;;;;;;;19496:1;19482:11;:15;19474:48;;;;;-1:-1:-1;;;19474:48:0;;;;;;;;;;;;-1:-1:-1;;;19474:48:0;;;;;;;;;;;;;;;19543:18;:5;-1:-1:-1;;;;;19543:16:0;;:18::i;:::-;19535:43;;;;;-1:-1:-1;;;19535:43:0;;;;;;;;;;;;-1:-1:-1;;;19535:43:0;;;;;;;;;;;;;;;19589:64;-1:-1:-1;;;;;19589:22:0;;19612:10;19632:4;19639:13;19589:64;:22;:64;:::i;:::-;19677:12;;19666:23;;19715:13;19750:5;-1:-1:-1;;;;;19743:22:0;;:24;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19743:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19743:24:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19743:24:0;19735:33;;19731:2;:37;;-1:-1:-1;19800:5:0;19791:14;;;19783:50;;;;;-1:-1:-1;;;19783:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;19907:16;:5;19917;19907:16;:9;:16;:::i;:::-;19879:25;;;;:15;:25;;;;;:44;;;19964:42;;;19938:121;;;;;-1:-1:-1;;;19938:121:0;;;;;;;;;;;;-1:-1:-1;;;19938:121:0;;;;;;;;;;;;;;;20096:522;;;;;;;;20245:13;20096:522;;;;20164:13;20096:522;;;;20210:1;20096:522;;;;20289:10;20096:522;;;;20326:6;20096:522;;;;20364:11;20096:522;;;;20401:5;20096:522;;;;20442:10;20096:522;;;;20129:5;-1:-1:-1;;;;;20096:522:0;;;;;20482:9;-1:-1:-1;;;;;20096:522:0;;;;;20518:10;-1:-1:-1;;;;;20096:522:0;;;;;20592:10;20096:522;;;;;;20557:4;20096:522;;;;;20076:7;:17;20084:8;20076:17;;;;;;;;;;;:542;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20076:542:0;;;;;-1:-1:-1;;;;;20076:542:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20076:542:0;;;;;-1:-1:-1;;;;;20076:542:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20076:542:0;;;;;-1:-1:-1;;;;;20076:542:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17189:1;20657:19;20674:1;20657:12;;:16;;:19;;;;:::i;:::-;20642:12;:34;20692:241;;;-1:-1:-1;;;;;20692:241:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20743:10;;20720:8;;20692:241;;;;;;;;;19039:1902;;;;;;;;;;;;;:::o;14995:31::-;;;;:::o;23433:118::-;23493:4;23517:17;;;:7;:17;;;;;:26;;;-1:-1:-1;;;23517:26:0;;;;23433:118;;;;:::o;15130:50::-;;;;;;;;;;;;;:::o;16039:41::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16039:41:0;;;;;;;;;;;;-1:-1:-1;;;16039:41:0;;;;;-1:-1:-1;;;16039:41:0;;;;:::o;26987:1978::-;27166:4;7549:11;;;;7541:55;;;;;-1:-1:-1;;;7541:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;7541:55:0;;;;;;;;;;;;;;;7688:5;7674:19;;-1:-1:-1;;7674:19:0;;;16239:17;;;:7;:17;;;;;:26;;;27147:8;;-1:-1:-1;;;16239:26:0;;7674:19;16239:26;16231:60;;;;;-1:-1:-1;;;16231:60:0;;;;;;;;;;;;-1:-1:-1;;;16231:60:0;;;;;;;;;;;;;;;27183:21;27207:17;;;:7;:17;;;;;27271:13;;;;-1:-1:-1;;;;;27271:13:0;27257:10;:27;27235:116;;;;-1:-1:-1;;;27235:116:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27379:25;;;;:15;:25;;;;;;27370:34;;27362:67;;;;;-1:-1:-1;;;27362:67:0;;;;;;;;;;;;-1:-1:-1;;;27362:67:0;;;;;;;;;;;;;;;27460:26;:24;:26::i;:::-;27444:12;;;;-1:-1:-1;;;;;27444:12:0;;;:42;;;27440:218;;;27521:9;27511:6;:19;27503:46;;;;;-1:-1:-1;;;27503:46:0;;;;;;;;;;;;-1:-1:-1;;;27503:46:0;;;;;;;;;;;;;;;27440:218;;;27582:12;;;;:64;;-1:-1:-1;;;;;27582:12:0;27612:10;27632:4;27639:6;27582:64;:29;:64;:::i;:::-;27671:20;27693:17;27714:19;27724:8;27714:9;:19::i;:::-;27670:63;;-1:-1:-1;27670:63:0;-1:-1:-1;27941:9:0;27953:36;27973:15;27953;:6;14918;27953:15;:10;:15;:::i;:::-;:19;:36;:19;:36;:::i;:::-;27941:48;-1:-1:-1;28071:14:0;28088:24;:15;14918:6;28088:24;:19;:24;:::i;:::-;28071:41;;28160:10;28173:56;28215:6;:13;;;28173:37;28205:4;28173:27;14918:6;28173;:18;;;:22;;:27;;;;:::i;:56::-;28160:69;-1:-1:-1;28289:16:0;28308:11;14918:6;28160:69;28308:11;:7;:11;:::i;:::-;28289:30;;28424:9;28449:60;14918:6;28449:51;28497:2;28449:43;28455:36;28463:27;28473:8;28483:6;28463:9;:27::i;:::-;14918:6;;28455:36;:7;:36;:::i;:::-;28449:1;;:43;:5;:43;:::i;:60::-;28601:12;28576:22;;;:37;28424:85;-1:-1:-1;28643:16:0;:9;28424:85;28643:16;:13;:16;:::i;:::-;28624;;;:35;28711:31;28740:1;28711:24;:12;28728:6;28711:24;:16;:24;:::i;:::-;:28;:31;:28;:31;:::i;:::-;28689:19;;;:53;28857:20;;:32;;28882:6;28857:32;:24;:32;:::i;:::-;28834:55;;28905:30;;;;;;;;28918:8;;28905:30;;;;;;;;;;28953:4;28946:11;;;;;;;;;;-1:-1:-1;7854:11:0;:18;;-1:-1:-1;;7854:18:0;7868:4;7854:18;;;26987:1978;;-1:-1:-1;;;26987:1978:0:o;32860:1404::-;32990:4;7549:11;;;;7541:55;;;;;-1:-1:-1;;;7541:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;7541:55:0;;;;;;;;;;;;;;;7688:5;7674:19;;-1:-1:-1;;7674:19:0;;;16239:17;;;:7;:17;;;;;:26;;;32962:8;;-1:-1:-1;;;16239:26:0;;7674:19;16239:26;16231:60;;;;;-1:-1:-1;;;16231:60:0;;;;;;;;;;;;-1:-1:-1;;;16231:60:0;;;;;;;;;;;;;;;33012:20;;:::i;:::-;-1:-1:-1;33035:17:0;;;;:7;:17;;;;;;;;;33012:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33012:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;33012:40:0;;;;;;;;;;;;-1:-1:-1;;;33012:40:0;;;;;;;;;;;33065:51;;;;;-1:-1:-1;;;33065:51:0;;;;;;;;;;;;-1:-1:-1;;;33065:51:0;;;;;;;;;;;;;;;33163:17;;;;:7;:17;;;;;:24;;;-1:-1:-1;;;;;33163:24:0;33149:10;:38;;:100;;-1:-1:-1;33222:17:0;;;;:7;:17;;;;;:27;;;-1:-1:-1;;;;;33222:27:0;33208:10;:41;33149:100;33127:192;;;;-1:-1:-1;;;33127:192:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33333:20;33355:17;33376:19;33386:8;33376:9;:19::i;:::-;33435:17;;;;:7;:17;;;;;;;;33428:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;33428:24:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;33428:24:0;;;33470:25;;;;;33463:32;33332:63;;-1:-1:-1;33332:63:0;-1:-1:-1;33512:16:0;;33508:277;;33565:26;:24;:26::i;:::-;-1:-1:-1;;;;;33549:42:0;:6;:12;;;-1:-1:-1;;;;;33549:42:0;;33545:229;;;33612:16;;;;:48;;-1:-1:-1;;;;;33612:34:0;33647:12;33612:48;:34;:48;:::i;:::-;33545:229;;;33701:57;33727:6;:16;;;33745:12;33701:6;:12;;;-1:-1:-1;;;;;33701:25:0;;;:57;;;;;:::i;:::-;33801:13;;33797:262;;33851:26;:24;:26::i;:::-;-1:-1:-1;;;;;33835:42:0;:6;:12;;;-1:-1:-1;;;;;33835:42:0;;33831:217;;;33898:13;;;;:42;;-1:-1:-1;;;;;33898:31:0;33930:9;33898:42;:31;:42;:::i;:::-;33831:217;;;33981:51;34007:6;:13;;;34022:9;33981:6;:12;;;-1:-1:-1;;;;;33981:25:0;;;:51;;;;;:::i;:::-;34156:6;:16;;;-1:-1:-1;;;;;34076:158:0;34128:6;:13;;;-1:-1:-1;;;;;34076:158:0;34105:8;34076:158;34187:9;34211:12;34076:158;;;;;;;;;;;;;;;;;;;;;;;;34252:4;34245:11;;;;;-1:-1:-1;7854:11:0;:18;;-1:-1:-1;;7854:18:0;7868:4;7854:18;;;32860:1404;;-1:-1:-1;32860:1404:0:o;31317:1146::-;31469:4;7549:11;;;;7541:55;;;;;-1:-1:-1;;;7541:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;7541:55:0;;;;;;;;;;;;;;;7688:5;7674:19;;-1:-1:-1;;7674:19:0;;;16239:17;;;:7;:17;;;;;:26;;;31441:8;;-1:-1:-1;;;16239:26:0;;7674:19;16239:26;16231:60;;;;;-1:-1:-1;;;16231:60:0;;;;;;;;;;;;-1:-1:-1;;;16231:60:0;;;;;;;;;;;;;;;31491:21;31515:17;;;:7;:17;;;;;31581:16;;;;-1:-1:-1;;;;;31581:16:0;31567:10;:30;31545:122;;;;-1:-1:-1;;;31545:122:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31712:25;;;;:15;:25;;;;;;31702:35;;;31680:116;;;;;-1:-1:-1;;;31680:116:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;31810:20;31832:17;31853:19;31863:8;31853:9;:19::i;:::-;31809:63;;;;31923:6;31907:12;:22;;31885:117;;;;-1:-1:-1;;;31885:117:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32035:26;:24;:26::i;:::-;32019:12;;;;-1:-1:-1;;;;;32019:12:0;;;:42;;;32015:201;;;32078:16;;;;:42;;-1:-1:-1;;;;;32078:16:0;32113:6;32078:42;:34;:42;:::i;:::-;32015:201;;;32179:16;;;;32153:12;;;;:51;;-1:-1:-1;;;;;32153:12:0;;;;32179:16;32197:6;32153:51;:25;:51;:::i;:::-;32253:12;32228:22;;;:37;32276:16;;;:28;;;32337:24;:12;32354:6;32337:24;:16;:24;:::i;:::-;32315:19;;;:46;32408:16;;;;32379:54;;;;;;;;-1:-1:-1;;;;;32408:16:0;;;;32398:8;;32379:54;;;;;;;;;;32451:4;32444:11;;;;;-1:-1:-1;7854:11:0;:18;;-1:-1:-1;;7854:18:0;7868:4;7854:18;;;31317:1146;;-1:-1:-1;;31317:1146:0:o;24049:993::-;24182:14;24211:17;24243:13;24271:21;24307:18;24340:14;24369:17;24401:20;24436:19;24470:23;24508:15;24140:8;16239:7;:17;16247:8;16239:17;;;;;;;;;;;:26;;;;;;;;;;;;16231:60;;;;;-1:-1:-1;;;16231:60:0;;;;;;;;;;;;-1:-1:-1;;;16231:60:0;;;;;;;;;;;;;;;24551:20;;:::i;:::-;24574:7;:17;24582:8;24574:17;;;;;;;;;;;24551:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24551:40:0;-1:-1:-1;;;;;24551:40:0;-1:-1:-1;;;;;24551:40:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24551:40:0;-1:-1:-1;;;;;24551:40:0;-1:-1:-1;;;;;24551:40:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24551:40:0;-1:-1:-1;;;;;24551:40:0;-1:-1:-1;;;;;24551:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24611:6;:13;;;24602:22;;24647:6;:16;;;24635:28;;24682:6;:12;;;24674:20;;24721:6;:20;;;24705:36;;24765:6;:17;;;24752:30;;24802:6;:13;;;24793:22;;24838:6;:16;;;24826:28;;24880:6;:19;;;24865:34;;24924:6;:18;;;24910:32;;24971:6;:22;;;24953:40;;25017:6;:17;;;25004:30;;16302:1;24049:993;;;;;;;;;;;;;;:::o;29400:1399::-;29517:20;16239:17;;;:7;:17;;;;;:26;;;29517:20;;16239:17;;-1:-1:-1;;;16239:26:0;;;;16231:60;;;;;-1:-1:-1;;;16231:60:0;;;;;;;;;;;;-1:-1:-1;;;16231:60:0;;;;;;;;;;;;;;;29574:20;;:::i;:::-;-1:-1:-1;29597:17:0;;;;:7;:17;;;;;;;;;29574:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29574:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;29574:40:0;;;;;;;;;;-1:-1:-1;;;29574:40:0;;;;;;;;;;;;;29631:12;:32;29627:97;;;29691:20;29688:1;;-1:-1:-1;29691:20:0;-1:-1:-1;29680:32:0;;29627:97;29736:19;29758:6;:19;;;29736:41;;29790:9;29815:100;29887:6;:13;;;29815:49;14918:6;29815:40;29832:6;:22;;;29815:12;:16;;:40;;;;:::i;:::-;:44;:49;:44;:49;:::i;:100::-;29790:125;;29926:9;29938:37;29970:4;29938:27;14918:6;29938;:18;;;:22;;:27;;;;:::i;:37::-;29926:49;-1:-1:-1;29986:10:0;29999;14918:6;29926:49;29999:10;:7;:10;:::i;:::-;29986:23;;30020:9;30032:47;14918:6;30032:38;30053:16;30063:2;30067:1;30053:9;:16::i;:::-;30032;;;;;:38;:20;:38;:::i;:47::-;30020:59;;30090:9;30102:23;30123:1;30102:6;:16;;;:20;;:23;;;;:::i;:::-;30090:35;-1:-1:-1;30214:15:0;;30210:70;;30250:18;:1;30256:11;30250:18;:5;:18;:::i;:::-;30246:22;;30210:70;30419:20;;30407:8;:1;30413;30407:8;:5;:8;:::i;:::-;:32;;30385:132;;;;-1:-1:-1;;;30385:132:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30539:25;;;;:15;:25;;;;;;30534:30;;30530:128;;30596:1;30581:16;;30530:128;;;30645:1;30630:16;;30530:128;30679:25;;;;:15;:25;;;;;;30674:30;;30670:122;;30733:1;30721:13;;30670:122;;;30779:1;30767:13;;30670:122;16302:1;;;;;;;;29400:1399;;;;:::o;25371:1170::-;25538:4;7549:11;;;;7541:55;;;;;-1:-1:-1;;;7541:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;7541:55:0;;;;;;;;;;;;;;;7688:5;7674:19;;-1:-1:-1;;7674:19:0;;;16239:17;;;:7;:17;;;;;:26;;;25510:8;;-1:-1:-1;;;16239:26:0;;7674:19;16239:26;16231:60;;;;;-1:-1:-1;;;16231:60:0;;;;;;;;;;;;-1:-1:-1;;;16231:60:0;;;;;;;;;;;;;;;25560:21;25584:17;;;:7;:17;;;;;25648:13;;;;-1:-1:-1;;;;;25648:13:0;25634:10;:27;25612:116;;;;-1:-1:-1;;;25612:116:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25756:25;;;;:15;:25;;;;;;25747:34;;25739:67;;;;;-1:-1:-1;;;25739:67:0;;;;;;;;;;;;-1:-1:-1;;;25739:67:0;;;;;;;;;;;;;;;25837:26;:24;:26::i;:::-;25821:12;;;;-1:-1:-1;;;;;25821:12:0;;;:42;;;25817:218;;;25898:9;25888:6;:19;25880:46;;;;;-1:-1:-1;;;25880:46:0;;;;;;;;;;;;-1:-1:-1;;;25880:46:0;;;;;;;;;;;;;;;25817:218;;;25959:12;;;;:64;;-1:-1:-1;;;;;25959:12:0;25989:10;26009:4;26016:6;25959:64;:29;:64;:::i;:::-;26048:20;26070:17;26091:19;26101:8;26091:9;:19::i;:::-;26202:12;26177:22;;;:37;26047:63;;-1:-1:-1;26047:63:0;-1:-1:-1;26244:21:0;26047:63;26258:6;26244:21;:13;:21;:::i;:::-;26225:16;;;:40;26300:19;;;:34;;;26433:20;;:32;;26458:6;26433:32;:24;:32;:::i;:::-;26410:55;;26481:30;;;;;;;;26494:8;;26481:30;;;;;;;;;;26529:4;26522:11;;;;;-1:-1:-1;7854:11:0;:18;;-1:-1:-1;;7854:18:0;7868:4;7854:18;;;25371:1170;;-1:-1:-1;;25371:1170:0:o;21823:1432::-;22121:16;22061:9;22072;22083:10;22095:6;-1:-1:-1;;;;;16785:23:0;;16777:62;;;;;-1:-1:-1;;;16777:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16858:26:0;;16879:4;16858:26;;16850:68;;;;;-1:-1:-1;;;16850:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16937:23:0;;16950:10;16937:23;;16929:56;;;;;-1:-1:-1;;;16929:56:0;;;;;;;;;;;;-1:-1:-1;;;16929:56:0;;;;;;;;;;;;;;;17020:1;17004:13;:17;16996:52;;;;;-1:-1:-1;;;16996:52:0;;;;;;;;;;;;-1:-1:-1;;;16996:52:0;;;;;;;;;;;;;;;17081:12;17067:10;:26;;17059:70;;;;;-1:-1:-1;;;17059:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;17157:1;17148:6;:10;17140:38;;;;;-1:-1:-1;;;17140:38:0;;;;;;;;;;;;-1:-1:-1;;;17140:38:0;;;;;;;;;;;;;;;22177:4;22163:11;:18;22155:54;;;;;-1:-1:-1;;;22155:54:0;;;;;;;;;;;;-1:-1:-1;;;22155:54:0;;;;;;;;;;;;;;;22242:1;22228:11;:15;22220:48;;;;;-1:-1:-1;;;22220:48:0;;;;;;;;;;;;-1:-1:-1;;;22220:48:0;;;;;;;;;;;;;;;22300:6;22287:9;:19;;22279:49;;;;;-1:-1:-1;;;22279:49:0;;;;;;;;;;;;-1:-1:-1;;;22279:49:0;;;;;;;;;;;;;;;22403:12;;22392:23;;22446:480;;;;;;;;22596:9;22446:480;;;;22527:9;22446:480;;;;22565:1;22446:480;;;;22632:10;22446:480;;;;22665:6;22446:480;;;;22699:11;22446:480;;;;22732:6;22446:480;;;;22770:10;22446:480;;;;22475:26;:24;:26::i;:::-;-1:-1:-1;;;;;22446:480:0;;;;;;;;;;;;;;;;22838:10;22446:480;;;;;;;;;;;;;;;;;;;22873:4;22446:480;;;;;;;-1:-1:-1;22426:17:0;;;:7;:17;;;;;;;:500;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;22426:500:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;22426:500:0;-1:-1:-1;;;;22426:500:0;;;-1:-1:-1;;;22426:500:0;-1:-1:-1;;;;22426:500:0;;;;;;;;;;;;;;;;;;;;;;;;;22954:12;;:19;;;:16;:19;:::i;:::-;22939:12;:34;-1:-1:-1;;;;;22989:258:0;;23040:10;23017:8;22989:258;23089:26;:24;:26::i;:::-;22989:258;;;-1:-1:-1;;;;;22989:258:0;;;;;23130:9;22989:258;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21823:1432;;;;;;;;;;;:::o;9244:268::-;9302:4;-1:-1:-1;;;;;9323:21:0;;9319:66;;-1:-1:-1;9368:5:0;9361:12;;9319:66;-1:-1:-1;9450:18:0;9496:8;;;9244:268::o;8550:493::-;8835:51;;;-1:-1:-1;;;;;8835:51:0;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;8835:51:0;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;8810:87:0;;;;8775:12;;8789:17;;8810:10;;;;8835:51;8810:87;;;25:18:-1;8810:87:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;8810:87:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;8774:123:0;;;;8930:7;:57;;;;-1:-1:-1;8942:11:0;;:16;;:44;;;8973:4;8962:24;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;8962:24:0;8942:44;8908:127;;;;;-1:-1:-1;;;8908:127:0;;;;;;;;;;;;-1:-1:-1;;;8908:127:0;;;;;;;;;;;;;;;8550:493;;;;;;:::o;3224:132::-;3282:7;3309:39;3313:1;3316;3309:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;3302:46;;3224:132;;;;;:::o;913:181::-;971:7;1003:5;;;1027:6;;;;1019:46;;;;;-1:-1:-1;;;1019:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;9656:122;9728:42;9656:122;:::o;2285:471::-;2343:7;2588:6;2584:47;;-1:-1:-1;2618:1:0;2611:8;;2584:47;2655:5;;;2659:1;2655;:5;:1;2679:5;;;;;:10;2671:56;;;;-1:-1:-1;;;2671:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1369:136;1427:7;1454:43;1458:1;1461;1454:43;;;;;;;;;;;;;;;;;:3;:43::i;12110:549::-;12174:7;9951:5;12202:4;:21;;12194:55;;;;;-1:-1:-1;;;12194:55:0;;;;;;;;;;;;-1:-1:-1;;;12194:55:0;;;;;;;;;;;;;;;10003:18;12268:21;;;12260:56;;;;;-1:-1:-1;;;12260:56:0;;;;;;;;;;;;-1:-1:-1;;;12260:56:0;;;;;;;;;;;;;;;12329:13;12345:11;12352:3;12345:6;:11::i;:::-;12329:27;;12367:14;12384:16;12389:3;12394:5;12384:4;:16::i;:::-;12367:33;;12413:16;12432:24;12438:4;12444:11;12449:5;12444:4;:11::i;:::-;12432:5;:24::i;:::-;12413:43;-1:-1:-1;12473:11:0;12469:59;;12508:8;-1:-1:-1;12501:15:0;;-1:-1:-1;;12501:15:0;12469:59;12540:21;12564:40;12575:4;12581:6;10069:13;12564:10;:40::i;:::-;12540:64;;12622:29;12627:8;12637:13;12622:4;:29::i;:::-;12615:36;12110:549;-1:-1:-1;;;;;;;12110:549:0:o;9051:185::-;9165:12;;;9126;9165;;;;;;;;;-1:-1:-1;;;;;9144:7:0;;;9158:5;;9144:34;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;9144:34:0;;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;9125:53:0;;;9197:7;9189:39;;;;;-1:-1:-1;;;9189:39:0;;;;;;;;;;;;-1:-1:-1;;;9189:39:0;;;;;;;;;;;;;;;9051:185;;;:::o;8099:443::-;8345:45;;;-1:-1:-1;;;;;8345:45:0;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;8345:45:0;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;8320:81:0;;;;8285:12;;8299:17;;8320:10;;;;8345:45;8320:81;;;25:18:-1;8320:81:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;8320:81:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;8284:117:0;;;;8434:7;:57;;;;-1:-1:-1;8446:11:0;;:16;;:44;;;8477:4;8466:24;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;8466:24:0;8446:44;8412:122;;;;;-1:-1:-1;;;8412:122:0;;;;;;;;;;;;-1:-1:-1;;;8412:122:0;;;;;;;;;;;;;;;8099:443;;;;;:::o;3886:345::-;3972:7;4074:12;4067:5;4059:28;;;;-1:-1:-1;;;4059:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;4059:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4098:9;4114:1;4110;:5;;;;;;;3886:345;-1:-1:-1;;;;;3886:345:0:o;1842:192::-;1928:7;1964:12;1956:6;;;;1948:29;;;;-1:-1:-1;;;1948:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;1948:29:0;-1:-1:-1;;;2000:5:0;;;1842:192::o;10190:99::-;10240:7;9898:6;10267:7;10272:1;10267:4;:7::i;:::-;:14;;10190:99;-1:-1:-1;;10190:99:0:o;10474:191::-;10533:7;10554:9;10565;10578:14;10587:1;10590;10578:8;:14::i;:::-;10553:39;;;;10612:4;10611:5;10603:35;;;;;-1:-1:-1;;;10603:35:0;;;;;;;;;;;;-1:-1:-1;;;10603:35:0;;;;;;;;;;;;;;;-1:-1:-1;10656:1:0;10474:191;-1:-1:-1;;;10474:191:0:o;10091:91::-;9898:6;10166:8;;;10091:91::o;11646:303::-;11706:7;;11742:1;11738;:5;:21;;9898:6;11738:21;;;11751:1;11738:21;11726:33;-1:-1:-1;11782:1:0;11777:6;;;;11772:151;11785:6;;11772:151;;11820:10;11825:1;11828;11820:4;:10::i;:::-;11816:14;-1:-1:-1;11855:1:0;11851;:5;:10;11847:65;;11886:10;11891:1;11894;11886:4;:10::i;:::-;11882:14;;11847:65;11798:1;11793:6;;;;11772:151;;12667:1114;12790:7;12842:3;12790:7;;12881:20;12890:4;9898:6;12881:8;:20::i;:::-;12856:45;;-1:-1:-1;12856:45:0;-1:-1:-1;9898:6:0;;12912:12;13250:1;13233:518;13261:9;13253:4;:17;13233:518;;13292:12;9898:6;13307:1;:8;13292:23;;13331:9;13342;13355:29;13364:1;13367:16;13372:4;9898:6;13367:4;:16::i;:::-;13355:8;:29::i;:::-;13330:54;;;;13406:22;13411:4;13417:10;13422:1;13425;13417:4;:10::i;:::-;13406:4;:22::i;:::-;13399:29;;13450:16;13455:4;13461;13450;:16::i;:::-;13443:23;-1:-1:-1;13485:9:0;13481:20;;13496:5;;;;;13481:20;13522:4;13518:30;;;13539:9;;;13518:30;13567:4;13563:30;;;13584:9;;;13563:30;13612:8;13608:132;;;13647:15;13652:3;13657:4;13647;:15::i;:::-;13641:21;;13608:132;;;13709:15;13714:3;13719:4;13709;:15::i;:::-;13703:21;;13608:132;-1:-1:-1;;;13272:3:0;;13233:518;;;-1:-1:-1;13770:3:0;;12667:1114;-1:-1:-1;;;;;;;;;12667:1114:0:o;10922:306::-;10981:7;11014:5;;;11038:6;;;:21;;;11058:1;11053;11048:2;:6;;;;;;:11;11038:21;11030:50;;;;;-1:-1:-1;;;11030:50:0;;;;;;;;;;;;-1:-1:-1;;;11030:50:0;;;;;;;;;;;;;;;11110:8;11104:15;;11138:8;;;;11130:37;;;;;-1:-1:-1;;;11130:37:0;;;;;;;;;;;;-1:-1:-1;;;11130:37:0;;;;;;;;;;;;;;;11178:10;9898:6;11191:2;:9;;;10922:306;-1:-1:-1;;;;;;10922:306:0:o;10673:241::-;10763:7;10772:4;10803:1;10798;:6;10794:113;;-1:-1:-1;;10829:5:0;;;10836;10821:21;;10794:113;-1:-1:-1;;10883:5:0;;;10890:4;10794:113;10673:241;;;;;:::o;11236:382::-;11295:7;11323:6;11315:31;;;;;-1:-1:-1;;;11315:31:0;;;;;;;;;;;;-1:-1:-1;;;11315:31:0;;;;;;;;;;;;;;;9898:6;11370:8;;11397:6;;;:24;;;9898:6;11412:1;11407:2;:6;;;;;;:14;11397:24;11389:53;;;;;-1:-1:-1;;;11389:53:0;;;;;;;;;;;;-1:-1:-1;;;11389:53:0;;;;;;;;;;;;;;;11493:1;11489:5;;11483:12;;11514:8;;;;11506:37;;;;;-1:-1:-1;;;11506:37:0;;;;;;;;;;;;-1:-1:-1;;;11506:37:0;;;;;;;;;;;;;;;11571:10;11589:1;11584:2;:6;;;;10297:169;10356:7;10388:5;;;10412:6;;;;10404:35;;;;;-1:-1:-1;;;10404:35:0;;;;;;;;;;;;-1:-1:-1;;;10404:35:0;;;;;;;;;;;;;;14769:19603;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14769:19603:0;;;;;;-1:-1:-1;;;;;14769:19603:0;;;;;;-1:-1:-1;;;;;14769:19603:0;;;;;;;;;;;;;;;;;;;:::o

Swarm Source

bzzr://5e87d3ee6db25103178fda07cfdb9332ee39f260f532b3b317b3622d96ff5100

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

OVERVIEW

Exponentially decaying money stream protocol.

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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