Contract 0xafaff19679ab6baf75ed8098227be189ba47ba0f

Txn Hash Method
Block
From
To
Value [Txn Fee]
0xeee33bcd89fce6f5610ad79abdc4fb19bca4bed66197ce4f5307accee556bb0fRedeem39068302023-03-27 5:15:0014 hrs 52 mins ago0xa950a653d9a1a4fc765cad7ba41e798ac493733c IN  0xafaff19679ab6baf75ed8098227be189ba47ba0f0 MOVR0.00026972725
0xd11daefe0303513709b88065bd7295efb65d25d9c1c9b4a41021c31fe7a8c705Claim39068262023-03-27 5:14:1214 hrs 53 mins ago0xa950a653d9a1a4fc765cad7ba41e798ac493733c IN  0xafaff19679ab6baf75ed8098227be189ba47ba0f0 MOVR0.00035080175
0x72708cb82fb3cbc0ae9c045327d7b8ae072ed6be78867ddfe0cbd4b32613c965Claim39068242023-03-27 5:13:4814 hrs 53 mins ago0xa950a653d9a1a4fc765cad7ba41e798ac493733c IN  0xafaff19679ab6baf75ed8098227be189ba47ba0f0 MOVR0.00046579
0x6b6e9c2a222736fe919edfaf543d72f906bc0ff0d648ea15fa9d137dc69a6b6cRedeem38649692023-03-21 6:49:196 days 13 hrs ago0x75bba4bcca69d18929998f3dd7e7967863f462ca IN  0xafaff19679ab6baf75ed8098227be189ba47ba0f0 MOVR0.00026964925
0xa174639d8e289a51921ea94dedc2601afd6bc8ceda46b1e6afb62d60757dfb4bClaim38649672023-03-21 6:48:546 days 13 hrs ago0x75bba4bcca69d18929998f3dd7e7967863f462ca IN  0xafaff19679ab6baf75ed8098227be189ba47ba0f0 MOVR0.00041287675
0x3b163523bbd8ae11de108710b09dc6bcc70cf16709e16d1151f0c1197294a3e7Redeem38590822023-03-20 10:55:127 days 9 hrs ago0xf0536e35d259f27d3cf7b908f644b97ce8791202 IN  0xafaff19679ab6baf75ed8098227be189ba47ba0f0 MOVR0.00050066575
0x9a4bbe7afc527bc128caeea424065011c060ca26612405f2852014bdfb5009a2Redeem38238822023-03-15 11:36:3012 days 8 hrs ago0x94a2d53a3d99968e25b241ed1667d537670e6cb9 IN  0xafaff19679ab6baf75ed8098227be189ba47ba0f0 MOVR0.000456189
0xfe1b13b470a319ee0f8fc04aa69380da02bcdc7f640e143fb4d34dd1a3201a92Claim37772342023-03-08 16:13:5419 days 3 hrs ago0x6628fcfaf1d86fad0c337f2143bc243ef4b99d04 IN  0xafaff19679ab6baf75ed8098227be189ba47ba0f0 MOVR0.000315417
0x6dec6670b5a42d6ec721dd9a41acef79c9ad018903a1ea79f87a2fb52202fdbeRedeem37752552023-03-08 9:29:1819 days 10 hrs ago0x418bc1907ba0e33343f7500ce0ffdf507e1a0aae IN  0xafaff19679ab6baf75ed8098227be189ba47ba0f0 MOVR0.000293496
0xe5dbc619ca47987b4103c5838face53c649ea192124c06d33ea5c5303c2236d1Claim37751092023-03-08 8:59:4219 days 11 hrs ago0x418bc1907ba0e33343f7500ce0ffdf507e1a0aae IN  0xafaff19679ab6baf75ed8098227be189ba47ba0f0 MOVR0.000329817
0xe6445f1bddf9f72e2c3d93bc5c47f78710a92f3a665675e899d7e6fe7828f724Claim37381132023-03-03 3:09:3624 days 16 hrs ago0x660bc2766867e1e19252ad30a413fe20d08a85c4 IN  0xafaff19679ab6baf75ed8098227be189ba47ba0f0 MOVR0.000366717
0xdf0fd612c7178a8c2d3bf30f9162775a7ea5f49e57da6b3611e147add25e28f1Redeem37379942023-03-03 2:45:1224 days 17 hrs ago0x660bc2766867e1e19252ad30a413fe20d08a85c4 IN  0xafaff19679ab6baf75ed8098227be189ba47ba0f0 MOVR0.00035334
0x35daf2a02fe9f2a06c834799960a820a3b4b52084c1694c1b2063e35a28c1b5eRedeem37219422023-02-28 19:17:4227 days 49 mins ago0x10351ad775f6125cda3d9ab899b6e676e8eda5f1 IN  0xafaff19679ab6baf75ed8098227be189ba47ba0f0 MOVR0.000293496
0xd469919f155884fc8ace0f4f277b381d2cb1b43f8ebfe2721039e2f81318c275Redeem37219412023-02-28 19:17:3027 days 50 mins ago0x10351ad775f6125cda3d9ab899b6e676e8eda5f1 IN  0xafaff19679ab6baf75ed8098227be189ba47ba0f0 MOVR0.000248943
0x491d3c63d1d908a9390e23d7c8cc2a887e581877fef21c9b7a87bce11e615f97Claim37219362023-02-28 19:16:3027 days 51 mins ago0x10351ad775f6125cda3d9ab899b6e676e8eda5f1 IN  0xafaff19679ab6baf75ed8098227be189ba47ba0f0 MOVR0.000329781
0x9b7d4d79270d3a51c9779032d9ed223c8160de8226bb460e10bb4d519f57cdb3Claim37219322023-02-28 19:15:3627 days 51 mins ago0x10351ad775f6125cda3d9ab899b6e676e8eda5f1 IN  0xafaff19679ab6baf75ed8098227be189ba47ba0f0 MOVR0.000381117
0x1c69ff904f61fecfa47f27643159d6a595e946d48468d71004702cab662edb50Redeem37217622023-02-28 18:40:2427 days 1 hr ago0x26f7678429ad78fbef8fa7f933b5f472fe74607f IN  0xafaff19679ab6baf75ed8098227be189ba47ba0f0 MOVR0.000248907
0x20bdcc4c1b23ccb3d1d58b745995d35579d6751f1dc84f3ba4516632263e9f78Claim37160722023-02-27 23:05:3027 days 21 hrs ago0x2214ed0d4d798b815d20e7404a012b89c90fbb9b IN  0xafaff19679ab6baf75ed8098227be189ba47ba0f0 MOVR0.000315417
0x16d3a665cbb78c60d1a87081921b7219b1d01c04174a72f8fc71da6d735ad41dRedeem37160672023-02-27 23:04:3027 days 21 hrs ago0x2214ed0d4d798b815d20e7404a012b89c90fbb9b IN  0xafaff19679ab6baf75ed8098227be189ba47ba0f0 MOVR0.000359943
0x6c6ce4b0c8c052c706b43f3e8d0b58dffb166c4dbcd9ba2da63eb7b8351a5dd0Redeem37002962023-02-25 16:53:1230 days 3 hrs ago0x582b07d825557d79be4f5ea051167b6c534fea1e IN  0xafaff19679ab6baf75ed8098227be189ba47ba0f0 MOVR0.000248943
0x25fcb9a9b994e32bca48744a5c30f8790024847fd75d30adf2a8487b06bf02f3Claim37002932023-02-25 16:52:3630 days 3 hrs ago0x582b07d825557d79be4f5ea051167b6c534fea1e IN  0xafaff19679ab6baf75ed8098227be189ba47ba0f0 MOVR0.000375117
0x27b36db31807f0324b7829b1a8f3c25854decd860d822d3bbc6405a900c4489aRedeem36907782023-02-24 8:31:1831 days 11 hrs ago0x340ab28ddfc8036fa28d68ac138b270340a98db5 IN  0xafaff19679ab6baf75ed8098227be189ba47ba0f0 MOVR0.000248943
0x41daeb96d28f98439f12eb8307fc76b7480f446accf0c9dc60c0ca49f49cbf66Claim36907722023-02-24 8:30:0631 days 11 hrs ago0x340ab28ddfc8036fa28d68ac138b270340a98db5 IN  0xafaff19679ab6baf75ed8098227be189ba47ba0f0 MOVR0.000375117
0x6d8c24d1e2edbee097da663a50a5e26572e7aaa95d50ae613590b1730ee311bfRedeem36833762023-02-23 7:25:1232 days 12 hrs ago0x1851cbb368c7c49b997064086da94dbad90eb9b5 IN  0xafaff19679ab6baf75ed8098227be189ba47ba0f0 MOVR0.000337443
0x9a61a79a5d7f9b06bfeac90beec5744a8e660f56ab86ef1838643dc5c6e7515eRedeem36770752023-02-22 9:58:3633 days 10 hrs ago0xddf8eb9abe01c6baf5f1308a3173a69f95fa6ce2 IN  0xafaff19679ab6baf75ed8098227be189ba47ba0f0 MOVR0.000336753
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.

Contract Source Code Verified (Exact Match)

Contract Name:
Farming

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at moonriver.moonscan.io on 2022-02-23
*/

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol



pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

// File: contracts/libraries/AdminUpgradeable.sol



pragma solidity >=0.8.0;

abstract contract AdminUpgradeable {
    address public admin;
    address public adminCandidate;

    function _initializeAdmin(address _admin) internal {
        require(admin == address(0), "admin already set");

        admin = _admin;
    }

    function candidateConfirm() external {
        require(msg.sender == adminCandidate, "not Candidate");
        emit AdminChanged(admin, adminCandidate);

        admin = adminCandidate;
        adminCandidate = address(0);
    }

    function setAdminCandidate(address _candidate) external onlyAdmin {
        adminCandidate = _candidate;
        emit Candidate(_candidate);
    }

    modifier onlyAdmin {
        require(msg.sender == admin, "not admin");
        _;
    }

    event Candidate(address indexed newAdmin);
    event AdminChanged(address indexed oldAdmin, address indexed newAdmin);
}
// File: contracts/core/interfaces/IFactory.sol



pragma solidity >=0.8.0;

interface IFactory {
    event PairCreated(
        address indexed token0,
        address indexed token1,
        address pair,
        uint256
    );
    event PairCreateLocked(
        address indexed caller
    );
    event PairCreateUnlocked(
        address indexed caller
    );
    event BootstrapSetted(
        address indexed tokenA,
        address indexed tokenB,
        address indexed bootstrap
    );
    event FeetoUpdated(
        address indexed feeto
    );
    event FeeBasePointUpdated(
        uint8 basePoint
    );

    function feeto() external view returns (address);

    function feeBasePoint() external view returns (uint8);

    function lockForPairCreate() external view returns (bool);

    function getPair(address tokenA, address tokenB)
        external
        view
        returns (address pair);
    
    function getBootstrap(address tokenA, address tokenB)
        external
        view
        returns (address bootstrap);

    function allPairs(uint256) external view returns (address pair);

    function allPairsLength() external view returns (uint256);

    function createPair(address tokenA, address tokenB)
        external
        returns (address pair);
}

// File: contracts/core/interfaces/IPair.sol



pragma solidity >=0.8.0;

interface IPair {
    event Mint(address indexed sender, uint256 amount0, uint256 amount1);
    event Burn(
        address indexed sender,
        uint256 amount0,
        uint256 amount1,
        address indexed to
    );
    event Swap(
        address indexed sender,
        uint256 amount0In,
        uint256 amount1In,
        uint256 amount0Out,
        uint256 amount1Out,
        address indexed to
    );

    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint256);

    function factory() external view returns (address);

    function token0() external view returns (address);

    function token1() external view returns (address);

    function getReserves()
        external
        view
        returns (uint112 reserve0, uint112 reserve1);

    function mint(address to) external returns (uint256 liquidity);

    function burn(address to)
        external
        returns (uint256 amount0, uint256 amount1);

    function swap(
        uint256 amount0Out,
        uint256 amount1Out,
        address to
    ) external;

    function initialize(address, address) external;
}

// File: contracts/libraries/Math.sol



pragma solidity >=0.8.0;

// a library for performing various math operations

library Math {
    function min(uint256 x, uint256 y) internal pure returns (uint256 z) {
        z = x < y ? x : y;
    }

    // babylonian method (https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method)
    function sqrt(uint256 y) internal pure returns (uint256 z) {
        if (y > 3) {
            z = y;
            uint256 x = y / 2 + 1;
            while (x < z) {
                z = x;
                x = (y / x + x) / 2;
            }
        } else if (y != 0) {
            z = 1;
        }
    }

    function add(uint256 x, uint256 y) internal pure returns (uint256 z) {
        require((z = x + y) >= x, "ds-math-add-overflow");
    }

    function sub(uint256 x, uint256 y) internal pure returns (uint256 z) {
        require((z = x - y) <= x, "ds-math-sub-underflow");
    }

    function mul(uint256 x, uint256 y) internal pure returns (uint256 z) {
        require(y == 0 || (z = x * y) / y == x, "ds-math-mul-overflow");
    }
}

// File: contracts/libraries/Helper.sol



pragma solidity >=0.8.0;




library Helper {
    using Math for uint256;

    function sortTokens(address tokenA, address tokenB)
        internal
        pure
        returns (address token0, address token1)
    {
        require(tokenA != tokenB, "Helper: IDENTICAL_ADDRESSES");
        (token0, token1) = tokenA < tokenB
            ? (tokenA, tokenB)
            : (tokenB, tokenA);
        require(token0 != address(0), "Helper: ZERO_ADDRESS");
    }

    function pairFor(
        address factory,
        address tokenA,
        address tokenB
    ) internal view returns (address pair) {
        return IFactory(factory).getPair(tokenA, tokenB);
    }

    function quote(
        uint256 amountA,
        uint256 reserveA,
        uint256 reserveB
    ) internal pure returns (uint256 amountB) {
        require(amountA > 0, "INSUFFICIENT_AMOUNT");
        require(reserveA > 0 && reserveB > 0, "INSUFFICIENT_LIQUIDITY");
        amountB = amountA.mul(reserveB) / reserveA;
    }

    function getReserves(
        address factory,
        address tokenA,
        address tokenB
    ) internal view returns (uint256 reserveA, uint256 reserveB) {
        (address token0, ) = sortTokens(tokenA, tokenB);
        (uint256 reserve0, uint256 reserve1) = IPair(
            pairFor(factory, tokenA, tokenB)
        ).getReserves();
        (reserveA, reserveB) = tokenA == token0
            ? (reserve0, reserve1)
            : (reserve1, reserve0);
    }

    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))),
            "TransferHelper::transferFrom: transferFrom failed"
        );
    }

    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))),
            "TransferHelper::safeTransfer: transfer failed"
        );
    }

    function safeTransferNativeCurrency(address to, uint256 value) internal {
        (bool success, ) = to.call{value: value}(new bytes(0));
        require(
            success,
            "TransferHelper::safeTransferNativeCurrency: NativeCurrency transfer failed"
        );
    }

    // given an input amount of an asset and pair reserves, returns the maximum output amount of the other asset
    function getAmountOut(
        uint256 amountIn,
        uint256 reserveIn,
        uint256 reserveOut
    ) internal pure returns (uint256 amountOut) {
        require(amountIn > 0, "Helper: INSUFFICIENT_INPUT_AMOUNT");
        require(
            reserveIn > 0 && reserveOut > 0,
            "Helper: INSUFFICIENT_LIQUIDITY"
        );
        uint256 amountInWithFee = amountIn.mul(997);
        uint256 numerator = amountInWithFee.mul(reserveOut);
        uint256 denominator = reserveIn.mul(1000).add(amountInWithFee);
        amountOut = numerator / denominator;
    }

    // given an output amount of an asset and pair reserves, returns a required input amount of the other asset
    function getAmountIn(
        uint256 amountOut,
        uint256 reserveIn,
        uint256 reserveOut
    ) internal pure returns (uint256 amountIn) {
        require(amountOut > 0, "Helper: INSUFFICIENT_OUTPUT_AMOUNT");
        require(
            reserveIn > 0 && reserveOut > 0,
            "Helper: INSUFFICIENT_LIQUIDITY"
        );
        uint256 numerator = reserveIn.mul(amountOut).mul(1000);
        uint256 denominator = reserveOut.sub(amountOut).mul(997);
        amountIn = (numerator / denominator).add(1);
    }

    // performs chained getAmountOut calculations on any number of pairs
    function getAmountsOut(
        address factory,
        uint256 amountIn,
        address[] memory path
    ) internal view returns (uint256[] memory amounts) {
        require(path.length >= 2, "Helper: INVALID_PATH");
        amounts = new uint256[](path.length);
        amounts[0] = amountIn;
        for (uint256 i; i < path.length - 1; i++) {
            (uint256 reserveIn, uint256 reserveOut) = getReserves(
                factory,
                path[i],
                path[i + 1]
            );
            amounts[i + 1] = getAmountOut(amounts[i], reserveIn, reserveOut);
        }
    }

    function getAmountsIn(
        address factory,
        uint256 amountOut,
        address[] memory path
    ) internal view returns (uint256[] memory amounts) {
        require(path.length >= 2, "Helper: INVALID_PATH");
        amounts = new uint256[](path.length);
        amounts[amounts.length - 1] = amountOut;
        for (uint256 i = path.length - 1; i > 0; i--) {
            (uint256 reserveIn, uint256 reserveOut) = getReserves(
                factory,
                path[i - 1],
                path[i]
            );
            amounts[i - 1] = getAmountIn(amounts[i], reserveIn, reserveOut);
        }
    }
}

// File: contracts/periphery/Farming.sol


pragma solidity >=0.8.0;





contract Farming is AdminUpgradeable {
    using Math for uint256;
    // Info of each user.
    struct UserInfo {
        uint256 amount; // How many farming tokens that user has provided.
        uint256[] rewardDebt; // Reward debt. See explanation below.
        // pending reward = (user.amount * pool.accRewardPerShare) - user.rewardDebt
        // Whenever a user stakes or redeems farming tokens to a pool. Here's what happens:
        //   1. The pool's `accRewardPerShare` (and `lastRewardBlock`) gets updated.
        //   2. User add pending reward to his/her info.
        //   3. User's `amount` gets updated.
        //   4. User's `rewardDebt` gets updated.
        uint256[] pending; // Pending rewards.
        uint256 nextClaimableBlock; // Next Block user can claim rewards.
    }
    // Info of each pool.
    struct PoolInfo {
        address farmingToken; // Address of farming token contract.
        address[] rewardTokens; // Reward tokens.
        uint256[] rewardPerBlock; // Reward tokens created per block.
        uint256[] accRewardPerShare; // Accumulated rewards per share, times 1e12.
        uint256[] remainingRewards; // remaining rewards in the pool.
        uint256 amount; // amount of farming token.
        uint256 lastRewardBlock; // Last block number that pools updated.
        uint256 startBlock; // Start block of pools.
        uint256 claimableInterval; // How many blocks of rewards can be claimed.
    }
    // Info of each pool.
    PoolInfo[] private poolInfo;
    // Info of each user that stakes farming tokens.
    mapping(uint256 => mapping(address => UserInfo)) private userInfo;

    event PoolAdded(address indexed farmingToken);
    event Charged(uint256 indexed pid, address[] rewards, uint256[] amounts);
    event WithdrawRewards(uint256 indexed pid, address[] rewards, uint256[] amounts);
    event Stake(address indexed user, uint256 indexed pid, uint256 amount);
    event Redeem(address indexed user, uint256 indexed pid, uint256 amount);
    event Claim(
        address indexed user, 
        uint256 indexed pid, 
        address[] rewards,
        uint256[] amounts
    );
    event EmergencyWithdraw(
        address indexed user,
        uint256 indexed pid,
        uint256 amount
    );

    constructor() {
        _initializeAdmin(msg.sender);
    }

    function poolLength() external view returns (uint256) {
        return poolInfo.length;
    }

    // Add a new farming token to the pool. Can only be called by the admin.
    // XXX DO NOT add the same farming token more than once. Rewards will be messed up if you do.
    function add(
        address _farmingToken,
        address[] memory _rewardTokens,
        uint256[] memory _rewardPerBlock,
        uint256 _startBlock,
        uint256 _claimableInterval
    ) external onlyAdmin {
        require(_rewardTokens.length == _rewardPerBlock.length, 'INVALID_REWARDS');
        uint256 lastRewardBlock =
            block.number > _startBlock ? block.number : _startBlock;
        uint256[] memory accRewardPerShare = new uint256[](_rewardTokens.length);
        uint256[] memory remainingRewards = new uint256[](_rewardTokens.length);
        poolInfo.push(
            PoolInfo({
                farmingToken: _farmingToken,
                rewardTokens: _rewardTokens,
                rewardPerBlock: _rewardPerBlock,
                accRewardPerShare: accRewardPerShare,
                remainingRewards: remainingRewards,
                amount: 0,
                lastRewardBlock: lastRewardBlock,
                startBlock: _startBlock,
                claimableInterval: _claimableInterval
            })
        );
        emit PoolAdded(_farmingToken);
    }

    // Update the given pool's rewardPerBlock. Can only be called by the admin.
    function set(
        uint256 _pid,
        uint256[] memory _rewardPerBlock,
        bool _withUpdate
    ) external onlyAdmin {
        if (_withUpdate) {
            updatePool(_pid);
        }
        PoolInfo storage pool = poolInfo[_pid];
        require(_rewardPerBlock.length == pool.rewardPerBlock.length, 'INVALID_REWARDS');
        pool.rewardPerBlock = _rewardPerBlock;
    }

    // Charge the given pool's rewards. Can only be called by the admin.
    function charge(
        uint256 _pid,
        uint256[] memory _amounts
    ) external onlyAdmin {
        PoolInfo storage pool = poolInfo[_pid];
        require(_amounts.length == pool.rewardTokens.length, 'INVALID_AMOUNTS');
        for (uint256 i = 0; i < _amounts.length; i++) {
            if (_amounts[i] > 0) {
                Helper.safeTransferFrom(
                    pool.rewardTokens[i], 
                    msg.sender, 
                    address(this), 
                    _amounts[i]
                );
                pool.remainingRewards[i] = pool.remainingRewards[i].add(_amounts[i]);
            }
        }
        emit Charged(_pid, pool.rewardTokens, _amounts);
    }

    // Withdraw the given pool's rewards. Can only be called by the admin.
    function withdrawRewards(
        uint256 _pid,
        uint256[] memory _amounts
    ) external onlyAdmin {
        PoolInfo storage pool = poolInfo[_pid];
        require(_amounts.length == pool.rewardTokens.length, 'INVALID_AMOUNTS');
        for (uint256 i = 0; i < _amounts.length; i++) {
            require(_amounts[i] <= pool.remainingRewards[i], 'INVALID_AMOUNT');
            if (_amounts[i] > 0) {
                Helper.safeTransfer(
                    pool.rewardTokens[i], 
                    msg.sender, 
                    _amounts[i]
                );
                pool.remainingRewards[i] = pool.remainingRewards[i].sub(_amounts[i]);
            }
        }
        emit WithdrawRewards(_pid, pool.rewardTokens, _amounts);
    }

    // View function to see the given pool's info.
    function getPoolInfo(uint256 _pid) 
        external 
        view
        returns(
            address farmingToken,
            uint256 amount,
            address[] memory rewardTokens,
            uint256[] memory rewardPerBlock,
            uint256[] memory accRewardPerShare,
            uint256 lastRewardBlock,
            uint256 startBlock,
            uint256 claimableInterval
        )
    {
        PoolInfo memory pool = poolInfo[_pid];
        farmingToken = pool.farmingToken;
        amount = pool.amount;
        rewardTokens = pool.rewardTokens;
        rewardPerBlock = pool.rewardPerBlock;
        accRewardPerShare = pool.accRewardPerShare;
        lastRewardBlock = pool.lastRewardBlock;
        startBlock = pool.startBlock;
        claimableInterval = pool.claimableInterval;
    }

    // View function to see the remaing rewards of the given pool.
    function getRemaingRewards(uint256 _pid) 
        external
        view
        returns(uint256[] memory remainingRewards)
    {
        PoolInfo memory pool = poolInfo[_pid];
        remainingRewards = pool.remainingRewards;
    }

    // View function to see the given pool's info of user.
    function getUserInfo(uint256 _pid, address _user)
        external 
        view
        returns(
            uint256 amount,
            uint256[] memory pending,
            uint256[] memory rewardDebt,
            uint256 nextClaimableBlock
        )
    {
        UserInfo memory user = userInfo[_pid][_user];
        amount = user.amount;
        pending = user.pending;
        rewardDebt= user.rewardDebt;
        nextClaimableBlock = user.nextClaimableBlock;
    }

    // View function to see pending rewards.
    function pendingRewards(uint256 _pid, address _user) 
        public 
        view 
        returns(uint256[] memory rewards, uint256 nextClaimableBlock)
    {
        PoolInfo memory pool = poolInfo[_pid];
        UserInfo memory user = userInfo[_pid][_user];
        uint256 farmingTokenSupply = pool.amount;
        rewards = user.pending;
        if (block.number >= pool.lastRewardBlock && user.pending.length > 0 && farmingTokenSupply != 0) {
            for (uint256 i = 0; i < pool.accRewardPerShare.length; i++) {
                uint256 reward = pool.rewardPerBlock[i].mul(
                    block.number.sub(pool.lastRewardBlock)
                );
                uint256 accRewardPerShare = pool.accRewardPerShare[i].add(
                    reward.mul(1e12) / farmingTokenSupply
                );
                rewards[i] = user.pending[i].add(
                    (user.amount.mul(accRewardPerShare) / 1e12).sub(user.rewardDebt[i])
                );
            }
        }
        nextClaimableBlock = user.nextClaimableBlock;
    }

    // View function to see current periods.
    function getPeriodsSinceStart(uint256 _pid) 
        public 
        view 
        returns(uint256 periods) 
    {
        PoolInfo memory pool = poolInfo[_pid];
        if (block.number <= pool.startBlock) return 0;
        uint256 blocksSinceStart = block.number.sub(pool.startBlock);
        periods = (blocksSinceStart / pool.claimableInterval).add(1);
        if (blocksSinceStart % pool.claimableInterval == 0) {
            periods = periods - 1;
        }
    }

    // Update reward variables of the given pool to be up-to-date.
    function updatePool(uint256 _pid) public {
        PoolInfo storage pool = poolInfo[_pid];
        if (block.number <= pool.lastRewardBlock) {
            return;
        }
        uint256 farmingTokenSupply = pool.amount;
        if (farmingTokenSupply == 0) {
            pool.lastRewardBlock = block.number;
            return;
        }
        for (uint256 i = 0; i < pool.accRewardPerShare.length; i++) {
            uint256 reward = pool.rewardPerBlock[i].mul(
                block.number.sub(pool.lastRewardBlock)
            );
            if (pool.remainingRewards[i] >= reward) {
                pool.remainingRewards[i] = pool.remainingRewards[i].sub(reward);
            } else {
                pool.remainingRewards[i] = 0;
            }
            pool.accRewardPerShare[i] = pool.accRewardPerShare[i].add(
                reward.mul(1e12) / farmingTokenSupply
            );
        }
        pool.lastRewardBlock = block.number;
    }

    // Stake farming tokens to the given pool.
    function stake(
        uint256 _pid,
        address _farmingToken, 
        uint256 _amount
    ) external {
        PoolInfo storage pool = poolInfo[_pid];
        UserInfo storage user = userInfo[_pid][msg.sender];
        require(pool.farmingToken == _farmingToken, 'FARMING_TOKEN_SAFETY_CHECK');
        updatePool(_pid);
        if (user.amount > 0) {
            for (uint256 i = 0; i < pool.accRewardPerShare.length; i++) {
                uint256 pending = (
                    user.amount.mul(pool.accRewardPerShare[i]) / 1e12
                ).sub(user.rewardDebt[i]);
                user.pending[i] = user.pending[i].add(pending);
            }
        }
        if (user.nextClaimableBlock == 0 && user.amount == 0) {
            if (block.number <= pool.startBlock) {
                user.nextClaimableBlock = pool.startBlock.add(pool.claimableInterval);
            } else {
                uint256 periods = getPeriodsSinceStart(_pid);
                user.nextClaimableBlock = pool.startBlock.add(
                    periods.mul(pool.claimableInterval)
                );
            }
            user.rewardDebt = new uint256[](pool.rewardTokens.length);
            user.pending = new uint256[](pool.rewardTokens.length);
        }
        Helper.safeTransferFrom(
            pool.farmingToken, 
            msg.sender, 
            address(this), 
            _amount
        );
        user.amount = user.amount.add(_amount);
        pool.amount = pool.amount.add(_amount);
        for (uint256 i = 0; i < pool.accRewardPerShare.length; i++) {
            user.rewardDebt[i] = user.amount.mul(pool.accRewardPerShare[i]) / 1e12;
        }
        emit Stake(msg.sender, _pid, _amount);
    }

    // Redeem farming tokens from the given pool.
    function redeem(
        uint256 _pid, 
        address _farmingToken, 
        uint256 _amount
    ) external {
        PoolInfo storage pool = poolInfo[_pid];
        UserInfo storage user = userInfo[_pid][msg.sender];
        require(pool.farmingToken == _farmingToken, 'FARMING_TOKEN_SAFETY_CHECK');
        require(user.amount >= _amount, 'INSUFFICIENT_AMOUNT');
        updatePool(_pid);
        for (uint256 i = 0; i < pool.accRewardPerShare.length; i++) {
            uint256 pending = (
                user.amount.mul(pool.accRewardPerShare[i]) / 1e12
            ).sub(user.rewardDebt[i]);
            user.pending[i] = user.pending[i].add(pending);
            user.rewardDebt[i] = user.amount.sub(_amount).mul(pool.accRewardPerShare[i]) / 1e12;
        }
        Helper.safeTransfer(pool.farmingToken, msg.sender, _amount);
        user.amount = user.amount.sub(_amount);
        pool.amount = pool.amount.sub(_amount);
        emit Redeem(msg.sender, _pid, _amount);
    }

    // Claim rewards when block number larger than user's nextClaimableBlock.
    function claim(uint256 _pid) external {
        PoolInfo storage pool = poolInfo[_pid];
        UserInfo storage user = userInfo[_pid][msg.sender];
        require(block.number > user.nextClaimableBlock, 'NOT_CLAIMABLE');
        (uint256[] memory rewards, ) = pendingRewards(_pid, msg.sender);
        updatePool(_pid);
        for (uint256 i = 0; i < pool.accRewardPerShare.length; i++) {
            user.pending[i] = 0;
            user.rewardDebt[i] = user.amount.mul(pool.accRewardPerShare[i]) / 1e12;
            if (rewards[i] > 0) {
                Helper.safeTransfer(pool.rewardTokens[i], msg.sender, rewards[i]);
            }
        }
        uint256 periods = getPeriodsSinceStart(_pid);
        user.nextClaimableBlock = pool.startBlock.add(
            periods.mul(pool.claimableInterval)
        );
        emit Claim(msg.sender, _pid, pool.rewardTokens, rewards);
    }

    // Withdraw without caring about rewards. EMERGENCY ONLY.
    function emergencyWithdraw(uint256 _pid) external {
        PoolInfo storage pool = poolInfo[_pid];
        UserInfo storage user = userInfo[_pid][msg.sender];
        Helper.safeTransfer(pool.farmingToken, msg.sender, user.amount);
        emit EmergencyWithdraw(msg.sender, _pid, user.amount);
        pool.amount = pool.amount.sub(user.amount);
        user.amount = 0;
        user.pending = new uint256[](pool.accRewardPerShare.length);
        user.rewardDebt = new uint256[](pool.accRewardPerShare.length);
        user.nextClaimableBlock = 0;
    }
}

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldAdmin","type":"address"},{"indexed":true,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAdmin","type":"address"}],"name":"Candidate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"rewards","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"Charged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"rewards","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"Claim","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"farmingToken","type":"address"}],"name":"PoolAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Redeem","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Stake","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"rewards","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"WithdrawRewards","type":"event"},{"inputs":[{"internalType":"address","name":"_farmingToken","type":"address"},{"internalType":"address[]","name":"_rewardTokens","type":"address[]"},{"internalType":"uint256[]","name":"_rewardPerBlock","type":"uint256[]"},{"internalType":"uint256","name":"_startBlock","type":"uint256"},{"internalType":"uint256","name":"_claimableInterval","type":"uint256"}],"name":"add","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"adminCandidate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"candidateConfirm","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"charge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"getPeriodsSinceStart","outputs":[{"internalType":"uint256","name":"periods","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"getPoolInfo","outputs":[{"internalType":"address","name":"farmingToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address[]","name":"rewardTokens","type":"address[]"},{"internalType":"uint256[]","name":"rewardPerBlock","type":"uint256[]"},{"internalType":"uint256[]","name":"accRewardPerShare","type":"uint256[]"},{"internalType":"uint256","name":"lastRewardBlock","type":"uint256"},{"internalType":"uint256","name":"startBlock","type":"uint256"},{"internalType":"uint256","name":"claimableInterval","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"getRemaingRewards","outputs":[{"internalType":"uint256[]","name":"remainingRewards","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"getUserInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256[]","name":"pending","type":"uint256[]"},{"internalType":"uint256[]","name":"rewardDebt","type":"uint256[]"},{"internalType":"uint256","name":"nextClaimableBlock","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"pendingRewards","outputs":[{"internalType":"uint256[]","name":"rewards","type":"uint256[]"},{"internalType":"uint256","name":"nextClaimableBlock","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_farmingToken","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"redeem","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256[]","name":"_rewardPerBlock","type":"uint256[]"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"set","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_candidate","type":"address"}],"name":"setAdminCandidate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_farmingToken","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"updatePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"withdrawRewards","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b506200001d3362000023565b62000097565b6000546001600160a01b031615620000755760405162461bcd60e51b815260206004820152601160248201527018591b5a5b88185b1c9958591e481cd95d607a1b604482015260640160405180910390fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b612cfa80620000a76000396000f3fe608060405234801561001057600080fd5b50600436106101215760003560e01c806351eb05a6116100ad578063a0b1f5dd11610071578063a0b1f5dd14610274578063d18df53c14610287578063d8780161146102a8578063f674fc50146102bb578063f851a440146102ce57600080fd5b806351eb05a6146102085780635312ea8e1461021b5780636e9c931c1461022e57806374ffcc1a1461024157806396de7aa01461026157600080fd5b8063379607f5116100f4578063379607f51461019c5780633accfa6c146101af5780633f023230146101da578063432daf3d146101e25780634dd1a1b7146101f557600080fd5b8063081e3eda146101265780631069f3b51461013d57806313df2cb5146101605780632f380b3514610175575b600080fd5b6002545b6040519081526020015b60405180910390f35b61015061014b36600461285f565b6102e1565b6040516101349493929190612b38565b61017361016e36600461273e565b6103f3565b005b610188610183366004612846565b6106a1565b6040516101349897969594939291906129d8565b6101736101aa366004612846565b6108c4565b6001546101c2906001600160a01b031681565b6040516001600160a01b039091168152602001610134565b610173610afb565b6101736101f03660046128c0565b610ba9565b610173610203366004612907565b610d88565b610173610216366004612846565b610e4b565b610173610229366004612846565b611003565b61017361023c36600461288b565b611175565b61025461024f366004612846565b611507565b6040516101349190612ae0565b61017361026f36600461271c565b6116e3565b6101736102823660046128c0565b611757565b61029a61029536600461285f565b61197b565b604051610134929190612af3565b6101736102b636600461288b565b611dd6565b61012a6102c9366004612846565b61200f565b6000546101c2906001600160a01b031681565b60008281526003602090815260408083206001600160a01b038516845282528083208151608081018352815481526001820180548451818702810187019095528085526060958695889586959490938584019383018282801561036357602002820191906000526020600020905b81548152602001906001019080831161034f575b50505050508152602001600282018054806020026020016040519081016040528092919081815260200182805480156103bb57602002820191906000526020600020905b8154815260200190600101908083116103a7575b5050509183525050600391909101546020918201528151604083015191830151606090930151909a9199509197509095509350505050565b6000546001600160a01b031633146104265760405162461bcd60e51b815260040161041d90612b15565b60405180910390fd5b82518451146104695760405162461bcd60e51b815260206004820152600f60248201526e494e56414c49445f5245574152445360881b604482015260640161041d565b6000824311610478578261047a565b435b90506000855167ffffffffffffffff81111561049857610498612c9d565b6040519080825280602002602001820160405280156104c1578160200160208202803683370190505b5090506000865167ffffffffffffffff8111156104e0576104e0612c9d565b604051908082528060200260200182016040528015610509578160200160208202803683370190505b5060408051610120810182526001600160a01b038b8116825260208083018c81529383018b90526060830187905260808301859052600060a0840181905260c0840189905260e084018b905261010084018a905260028054600181018255915283517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace600990920291820180546001600160a01b0319169190941617835593518051959650929491936105e3937f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf909101929101906125d9565b50604082015180516105ff91600284019160209091019061263e565b506060820151805161061b91600384019160209091019061263e565b506080820151805161063791600484019160209091019061263e565b5060a0820151600582015560c0820151600682015560e08201516007820155610100909101516008909101556040516001600160a01b038916907f73cca62ab1b520c9715bf4e6c71e3e518c754e7148f65102f43289a7df0efea690600090a25050505050505050565b600080606080606060008060008060028a815481106106c2576106c2612c87565b60009182526020918290206040805161012081018252600990930290910180546001600160a01b0316835260018101805483518187028101870190945280845293949193858301939283018282801561074457602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610726575b505050505081526020016002820180548060200260200160405190810160405280929190818152602001828054801561079c57602002820191906000526020600020905b815481526020019060010190808311610788575b50505050508152602001600382018054806020026020016040519081016040528092919081815260200182805480156107f457602002820191906000526020600020905b8154815260200190600101908083116107e0575b505050505081526020016004820180548060200260200160405190810160405280929190818152602001828054801561084c57602002820191906000526020600020905b815481526020019060010190808311610838575b505050505081526020016005820154815260200160068201548152602001600782015481526020016008820154815250509050806000015198508060a0015197508060200151965080604001519550806060015194508060c0015193508060e001519250806101000151915050919395975091939597565b6000600282815481106108d9576108d9612c87565b600091825260208083208584526003808352604080862033875290935291909320908101546009909202909201925043116109465760405162461bcd60e51b815260206004820152600d60248201526c4e4f545f434c41494d41424c4560981b604482015260640161041d565b6000610952843361197b565b50905061095e84610e4b565b60005b6003840154811015610a7b57600083600201828154811061098457610984612c87565b906000526020600020018190555064e8d4a510006109c48560030183815481106109b0576109b0612c87565b600091825260209091200154855490612259565b6109ce9190612be2565b8360010182815481106109e3576109e3612c87565b90600052602060002001819055506000828281518110610a0557610a05612c87565b60200260200101511115610a6957610a69846001018281548110610a2b57610a2b612c87565b9060005260206000200160009054906101000a90046001600160a01b031633848481518110610a5c57610a5c612c87565b60200260200101516122c6565b80610a7381612c2c565b915050610961565b506000610a878561200f565b9050610aae610aa385600801548361225990919063ffffffff16565b6007860154906123f0565b6003840155604051859033907f29efd1570858633f7fcf640ecc43b3edc6515af5b29e8e92d9dcad5209f5cd0d90610aec9060018901908790612a78565b60405180910390a35050505050565b6001546001600160a01b03163314610b455760405162461bcd60e51b815260206004820152600d60248201526c6e6f742043616e64696461746560981b604482015260640161041d565b600154600080546040516001600160a01b0393841693909116917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f91a360018054600080546001600160a01b03199081166001600160a01b03841617909155169055565b6000546001600160a01b03163314610bd35760405162461bcd60e51b815260040161041d90612b15565b600060028381548110610be857610be8612c87565b906000526020600020906009020190508060010180549050825114610c415760405162461bcd60e51b815260206004820152600f60248201526e494e56414c49445f414d4f554e545360881b604482015260640161041d565b60005b8251811015610d45576000838281518110610c6157610c61612c87565b60200260200101511115610d3357610cc6826001018281548110610c8757610c87612c87565b9060005260206000200160009054906101000a90046001600160a01b03163330868581518110610cb957610cb9612c87565b6020026020010151612445565b610d11838281518110610cdb57610cdb612c87565b6020026020010151836004018381548110610cf857610cf8612c87565b90600052602060002001546123f090919063ffffffff16565b826004018281548110610d2657610d26612c87565b6000918252602090912001555b80610d3d81612c2c565b915050610c44565b50827fa145d60156a87e91a4a98486a8d187f4e4b78f756ff02d42b63b4b2f97207d4d8260010184604051610d7b929190612a78565b60405180910390a2505050565b6000546001600160a01b03163314610db25760405162461bcd60e51b815260040161041d90612b15565b8015610dc157610dc183610e4b565b600060028481548110610dd657610dd6612c87565b906000526020600020906009020190508060020180549050835114610e2f5760405162461bcd60e51b815260206004820152600f60248201526e494e56414c49445f5245574152445360881b604482015260640161041d565b8251610e44906002830190602086019061263e565b5050505050565b600060028281548110610e6057610e60612c87565b9060005260206000209060090201905080600601544311610e7f575050565b600581015480610e9457504360069091015550565b60005b6003830154811015610ff7576000610eed610ebf85600601544361258390919063ffffffff16565b856002018481548110610ed457610ed4612c87565b906000526020600020015461225990919063ffffffff16565b905080846004018381548110610f0557610f05612c87565b906000526020600020015410610f6d57610f4781856004018481548110610f2e57610f2e612c87565b906000526020600020015461258390919063ffffffff16565b846004018381548110610f5c57610f5c612c87565b600091825260209091200155610f91565b6000846004018381548110610f8457610f84612c87565b6000918252602090912001555b610fc383610fa48364e8d4a51000612259565b610fae9190612be2565b856003018481548110610cf857610cf8612c87565b846003018381548110610fd857610fd8612c87565b6000918252602090912001555080610fef81612c2c565b915050610e97565b50504360069091015550565b60006002828154811061101857611018612c87565b60009182526020808320858452600382526040808520338087529352909320600990920290920180548254919450919261105b926001600160a01b0316916122c6565b8054604051908152839033907fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae05959060200160405180910390a3805460058301546110a491612583565b600583015560008155600382015467ffffffffffffffff8111156110ca576110ca612c9d565b6040519080825280602002602001820160405280156110f3578160200160208202803683370190505b50805161110a91600284019160209091019061263e565b50600382015467ffffffffffffffff81111561112857611128612c9d565b604051908082528060200260200182016040528015611151578160200160208202803683370190505b50805161116891600184019160209091019061263e565b5060006003909101555050565b60006002848154811061118a5761118a612c87565b600091825260208083208784526003825260408085203386529092529220600990910290910180549092506001600160a01b03908116908516146112105760405162461bcd60e51b815260206004820152601a60248201527f4641524d494e475f544f4b454e5f5341464554595f434845434b000000000000604482015260640161041d565b61121985610e4b565b8054156112e75760005b60038301548110156112e557600061129683600101838154811061124957611249612c87565b906000526020600020015464e8d4a5100061128687600301868154811061127257611272612c87565b600091825260209091200154875490612259565b6112909190612be2565b90612583565b90506112b181846002018481548110610cf857610cf8612c87565b8360020183815481106112c6576112c6612c87565b60009182526020909120015550806112dd81612c2c565b915050611223565b505b60038101541580156112f857508054155b1561141b5781600701544311611325576008820154600783015461131b916123f0565b600382015561135e565b60006113308661200f565b905061135761134c84600801548361225990919063ffffffff16565b6007850154906123f0565b6003830155505b600182015467ffffffffffffffff81111561137b5761137b612c9d565b6040519080825280602002602001820160405280156113a4578160200160208202803683370190505b5080516113bb91600184019160209091019061263e565b50600182015467ffffffffffffffff8111156113d9576113d9612c9d565b604051908082528060200260200182016040528015611402578160200160208202803683370190505b50805161141991600284019160209091019061263e565b505b8154611432906001600160a01b0316333086612445565b805461143e90846123f0565b8155600582015461144f90846123f0565b600583015560005b60038301548110156114d25764e8d4a5100061149584600301838154811061148157611481612c87565b600091825260209091200154845490612259565b61149f9190612be2565b8260010182815481106114b4576114b4612c87565b600091825260209091200155806114ca81612c2c565b915050611457565b50604051838152859033907f5af417134f72a9d41143ace85b0a26dce6f550f894f2cbc1eeee8810603d91b690602001610aec565b606060006002838154811061151e5761151e612c87565b60009182526020918290206040805161012081018252600990930290910180546001600160a01b031683526001810180548351818702810187019094528084529394919385830193928301828280156115a057602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611582575b50505050508152602001600282018054806020026020016040519081016040528092919081815260200182805480156115f857602002820191906000526020600020905b8154815260200190600101908083116115e4575b505050505081526020016003820180548060200260200160405190810160405280929190818152602001828054801561165057602002820191906000526020600020905b81548152602001906001019080831161163c575b50505050508152602001600482018054806020026020016040519081016040528092919081815260200182805480156116a857602002820191906000526020600020905b815481526020019060010190808311611694575b505050918352505060058201546020820152600682015460408201526007820154606082015260089091015460809182015201519392505050565b6000546001600160a01b0316331461170d5760405162461bcd60e51b815260040161041d90612b15565b600180546001600160a01b0319166001600160a01b0383169081179091556040517f8cc40b9abca4a505a92028908f9d913d621d18112c69412806506f02333f26b490600090a250565b6000546001600160a01b031633146117815760405162461bcd60e51b815260040161041d90612b15565b60006002838154811061179657611796612c87565b9060005260206000209060090201905080600101805490508251146117ef5760405162461bcd60e51b815260206004820152600f60248201526e494e56414c49445f414d4f554e545360881b604482015260640161041d565b60005b82518110156119455781600401818154811061181057611810612c87565b906000526020600020015483828151811061182d5761182d612c87565b602002602001015111156118745760405162461bcd60e51b815260206004820152600e60248201526d1253959053125117d05353d5539560921b604482015260640161041d565b600083828151811061188857611888612c87565b60200260200101511115611933576118df8260010182815481106118ae576118ae612c87565b9060005260206000200160009054906101000a90046001600160a01b031633858481518110610a5c57610a5c612c87565b6119118382815181106118f4576118f4612c87565b6020026020010151836004018381548110610f2e57610f2e612c87565b82600401828154811061192657611926612c87565b6000918252602090912001555b8061193d81612c2c565b9150506117f2565b50827f8a63d6747886a8cc1166e78fdd0df86a7a77fe1ee60ac1d042e6ff56c234fcc58260010184604051610d7b929190612a78565b60606000806002858154811061199357611993612c87565b60009182526020918290206040805161012081018252600990930290910180546001600160a01b03168352600181018054835181870281018701909452808452939491938583019392830182828015611a1557602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116119f7575b5050505050815260200160028201805480602002602001604051908101604052809291908181526020018280548015611a6d57602002820191906000526020600020905b815481526020019060010190808311611a59575b5050505050815260200160038201805480602002602001604051908101604052809291908181526020018280548015611ac557602002820191906000526020600020905b815481526020019060010190808311611ab1575b5050505050815260200160048201805480602002602001604051908101604052809291908181526020018280548015611b1d57602002820191906000526020600020905b815481526020019060010190808311611b09575b5050505050815260200160058201548152602001600682015481526020016007820154815260200160088201548152505090506000600360008781526020019081526020016000206000866001600160a01b03166001600160a01b031681526020019081526020016000206040518060800160405290816000820154815260200160018201805480602002602001604051908101604052809291908181526020018280548015611bec57602002820191906000526020600020905b815481526020019060010190808311611bd8575b5050505050815260200160028201805480602002602001604051908101604052809291908181526020018280548015611c4457602002820191906000526020600020905b815481526020019060010190808311611c30575b50505050508152602001600382015481525050905060008260a001519050816040015194508260c001514310158015611c8257506000826040015151115b8015611c8d57508015155b15611dc55760005b836060015151811015611dc3576000611cea611cbe8660c001514361258390919063ffffffff16565b86604001518481518110611cd457611cd4612c87565b602002602001015161225990919063ffffffff16565b90506000611d3784611d018464e8d4a51000612259565b611d0b9190612be2565b87606001518581518110611d2157611d21612c87565b60200260200101516123f090919063ffffffff16565b9050611d90611d7a86602001518581518110611d5557611d55612c87565b602002602001015164e8d4a51000611286858a6000015161225990919063ffffffff16565b86604001518581518110611d2157611d21612c87565b888481518110611da257611da2612c87565b60200260200101818152505050508080611dbb90612c2c565b915050611c95565b505b816060015193505050509250929050565b600060028481548110611deb57611deb612c87565b600091825260208083208784526003825260408085203386529092529220600990910290910180549092506001600160a01b0390811690851614611e715760405162461bcd60e51b815260206004820152601a60248201527f4641524d494e475f544f4b454e5f5341464554595f434845434b000000000000604482015260640161041d565b8054831115611eb85760405162461bcd60e51b8152602060048201526013602482015272125394d551919250d251539517d05353d55395606a1b604482015260640161041d565b611ec185610e4b565b60005b6003830154811015611fa2576000611eea83600101838154811061124957611249612c87565b9050611f0581846002018481548110610cf857610cf8612c87565b836002018381548110611f1a57611f1a612c87565b906000526020600020018190555064e8d4a51000611f64856003018481548110611f4657611f46612c87565b6000918252602090912001548554611f5e9089612583565b90612259565b611f6e9190612be2565b836001018381548110611f8357611f83612c87565b6000918252602090912001555080611f9a81612c2c565b915050611ec4565b508154611fb9906001600160a01b031633856122c6565b8054611fc59084612583565b81556005820154611fd69084612583565b6005830155604051838152859033907fe5b754fb1abb7f01b499791d0b820ae3b6af3424ac1c59768edb53f4ec31a92990602001610aec565b6000806002838154811061202557612025612c87565b60009182526020918290206040805161012081018252600990930290910180546001600160a01b031683526001810180548351818702810187019094528084529394919385830193928301828280156120a757602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612089575b50505050508152602001600282018054806020026020016040519081016040528092919081815260200182805480156120ff57602002820191906000526020600020905b8154815260200190600101908083116120eb575b505050505081526020016003820180548060200260200160405190810160405280929190818152602001828054801561215757602002820191906000526020600020905b815481526020019060010190808311612143575b50505050508152602001600482018054806020026020016040519081016040528092919081815260200182805480156121af57602002820191906000526020600020905b81548152602001906001019080831161219b575b5050505050815260200160058201548152602001600682015481526020016007820154815260200160088201548152505090508060e0015143116121f65750600092915050565b600061220f8260e001514361258390919063ffffffff16565b905061222d6001836101000151836122279190612be2565b906123f0565b9250816101000151816122409190612c47565b6122525761224f600184612c15565b92505b5050919050565b600081158061227d5750828261226f8183612bf6565b925061227b9083612be2565b145b6122c05760405162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b604482015260640161041d565b92915050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1790529151600092839290871691612322919061299d565b6000604051808303816000865af19150503d806000811461235f576040519150601f19603f3d011682016040523d82523d6000602084013e612364565b606091505b509150915081801561238e57508051158061238e57508080602001905181019061238e9190612829565b610e445760405162461bcd60e51b815260206004820152602d60248201527f5472616e7366657248656c7065723a3a736166655472616e736665723a20747260448201526c185b9cd9995c8819985a5b1959609a1b606482015260840161041d565b6000826123fd8382612bca565b91508110156122c05760405162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b604482015260640161041d565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17905291516000928392908816916124a9919061299d565b6000604051808303816000865af19150503d80600081146124e6576040519150601f19603f3d011682016040523d82523d6000602084013e6124eb565b606091505b50915091508180156125155750805115806125155750808060200190518101906125159190612829565b61257b5760405162461bcd60e51b815260206004820152603160248201527f5472616e7366657248656c7065723a3a7472616e7366657246726f6d3a207472604482015270185b9cd9995c919c9bdb4819985a5b1959607a1b606482015260840161041d565b505050505050565b6000826125908382612c15565b91508111156122c05760405162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b604482015260640161041d565b82805482825590600052602060002090810192821561262e579160200282015b8281111561262e57825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906125f9565b5061263a929150612679565b5090565b82805482825590600052602060002090810192821561262e579160200282015b8281111561262e57825182559160200191906001019061265e565b5b8082111561263a576000815560010161267a565b80356001600160a01b03811681146126a557600080fd5b919050565b600082601f8301126126bb57600080fd5b813560206126d06126cb83612ba6565b612b75565b80838252828201915082860187848660051b89010111156126f057600080fd5b60005b8581101561270f578135845292840192908401906001016126f3565b5090979650505050505050565b60006020828403121561272e57600080fd5b6127378261268e565b9392505050565b600080600080600060a0868803121561275657600080fd5b61275f8661268e565b945060208087013567ffffffffffffffff8082111561277d57600080fd5b818901915089601f83011261279157600080fd5b813561279f6126cb82612ba6565b8082825285820191508585018d878560051b88010111156127bf57600080fd5b600095505b838610156127e9576127d58161268e565b8352600195909501949186019186016127c4565b5098505050604089013592508083111561280257600080fd5b5050612810888289016126aa565b9598949750949560608101359550608001359392505050565b60006020828403121561283b57600080fd5b815161273781612cb3565b60006020828403121561285857600080fd5b5035919050565b6000806040838503121561287257600080fd5b823591506128826020840161268e565b90509250929050565b6000806000606084860312156128a057600080fd5b833592506128b06020850161268e565b9150604084013590509250925092565b600080604083850312156128d357600080fd5b82359150602083013567ffffffffffffffff8111156128f157600080fd5b6128fd858286016126aa565b9150509250929050565b60008060006060848603121561291c57600080fd5b83359250602084013567ffffffffffffffff81111561293a57600080fd5b612946868287016126aa565b925050604084013561295781612cb3565b809150509250925092565b600081518084526020808501945080840160005b8381101561299257815187529582019590820190600101612976565b509495945050505050565b6000825160005b818110156129be57602081860181015185830152016129a4565b818111156129cd576000828501525b509190910192915050565b6001600160a01b03898116825260208083018a90526101006040840181905289519084018190526000926101208501928b810192855b81811015612a2c578451841686529482019493820193600101612a0e565b50505050508281036060840152612a438189612962565b90508281036080840152612a578188612962565b60a0840196909652505060c081019290925260e09091015295945050505050565b6000604082016040835280855480835260608501915086600052602092508260002060005b82811015612ac25781546001600160a01b031684529284019260019182019101612a9d565b50505083810382850152612ad68186612962565b9695505050505050565b6020815260006127376020830184612962565b604081526000612b066040830185612962565b90508260208301529392505050565b6020808252600990820152683737ba1030b236b4b760b91b604082015260600190565b848152608060208201526000612b516080830186612962565b8281036040840152612b638186612962565b91505082606083015295945050505050565b604051601f8201601f1916810167ffffffffffffffff81118282101715612b9e57612b9e612c9d565b604052919050565b600067ffffffffffffffff821115612bc057612bc0612c9d565b5060051b60200190565b60008219821115612bdd57612bdd612c5b565b500190565b600082612bf157612bf1612c71565b500490565b6000816000190483118215151615612c1057612c10612c5b565b500290565b600082821015612c2757612c27612c5b565b500390565b6000600019821415612c4057612c40612c5b565b5060010190565b600082612c5657612c56612c71565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b8015158114612cc157600080fd5b5056fea2646970667358221220ca28770dcffaadee76633b02610b4229fe312af8e96aed21881a303bb252b0c964736f6c63430008070033

Deployed ByteCode Sourcemap

13243:14924:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15630:95;15702:8;:15;15630:95;;;13858:25:1;;;13846:2;13831:18;15630:95:0;;;;;;;;20447:487;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;15910:1127::-;;;;;;:::i;:::-;;:::i;:::-;;19235:830;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;:::i;26621:906::-;;;;;;:::i;:::-;;:::i;2991:29::-;;;;;-1:-1:-1;;;;;2991:29:0;;;;;;-1:-1:-1;;;;;5460:32:1;;;5442:51;;5430:2;5415:18;2991:29:0;5296:203:1;3183:234:0;;;:::i;17606:714::-;;;;;;:::i;:::-;;:::i;17126:398::-;;;;;;:::i;:::-;;:::i;22676:978::-;;;;;;:::i;:::-;;:::i;27598:566::-;;;;;;:::i;:::-;;:::i;23710:1758::-;;;;;;:::i;:::-;;:::i;20141:238::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;3425:149::-;;;;;;:::i;:::-;;:::i;18404:771::-;;;;;;:::i;:::-;;:::i;20988:1077::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;25527:1007::-;;;;;;:::i;:::-;;:::i;22119:481::-;;;;;;:::i;:::-;;:::i;2964:20::-;;;;;-1:-1:-1;;;;;2964:20:0;;;20447:487;20561:14;20748;;;:8;:14;;;;;;;;-1:-1:-1;;;;;20748:21:0;;;;;;;;;20725:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20590:24;;;;20561:14;;;;20725:44;20748:21;;20725:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;20725:44:0;;;-1:-1:-1;;20725:44:0;;;;;;;;;;;20789:11;;20821:12;;;;20856:15;;;;20903:23;;;;;20789:11;;20821:12;;-1:-1:-1;20856:15:0;;-1:-1:-1;20903:23:0;;-1:-1:-1;20447:487:0;-1:-1:-1;;;;20447:487:0:o;15910:1127::-;3634:5;;-1:-1:-1;;;;;3634:5:0;3620:10;:19;3612:41;;;;-1:-1:-1;;;3612:41:0;;;;;;;:::i;:::-;;;;;;;;;16175:15:::1;:22;16151:13;:20;:46;16143:74;;;::::0;-1:-1:-1;;;16143:74:0;;12542:2:1;16143:74:0::1;::::0;::::1;12524:21:1::0;12581:2;12561:18;;;12554:30;-1:-1:-1;;;12600:18:1;;;12593:45;12655:18;;16143:74:0::1;12340:339:1::0;16143:74:0::1;16228:23;16282:11;16267:12;:26;:55;;16311:11;16267:55;;;16296:12;16267:55;16228:94;;16333:34;16384:13;:20;16370:35;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;16370:35:0::1;;16333:72;;16416:33;16466:13;:20;16452:35;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;16452:35:0::1;-1:-1:-1::0;16526:452:0::1;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;16526:452:0;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16526:452:0;;;;;;;;;;;;;;;;;;;;;;;;16498:8:::1;:491:::0;;::::1;::::0;::::1;::::0;;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;;;;16498:491:0::1;::::0;;;::::1;;::::0;;;;;;16526:452;;-1:-1:-1;16526:452:0;;16498:491;;::::1;::::0;;;;;;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;16498:491:0::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;16498:491:0::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;16498:491:0::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;16498:491:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;17005:24:::1;::::0;-1:-1:-1;;;;;17005:24:0;::::1;::::0;::::1;::::0;-1:-1:-1;;17005:24:0::1;16132:905;;;15910:1127:::0;;;;;:::o;19235:830::-;19335:20;19370:14;19399:29;19443:31;19489:34;19538:23;19576:18;19609:25;19662:20;19685:8;19694:4;19685:14;;;;;;;;:::i;:::-;;;;;;;;;;19662:37;;;;;;;;19685:14;;;;;;;19662:37;;-1:-1:-1;;;;;19662:37:0;;;;;;;;;;;;;;;;;;;;;;;;;19685:14;;19662:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19662:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19725:4;:17;;;19710:32;;19762:4;:11;;;19753:20;;19799:4;:17;;;19784:32;;19844:4;:19;;;19827:36;;19894:4;:22;;;19874:42;;19945:4;:20;;;19927:38;;19989:4;:15;;;19976:28;;20035:4;:22;;;20015:42;;19651:414;19235:830;;;;;;;;;:::o;26621:906::-;26670:21;26694:8;26703:4;26694:14;;;;;;;;:::i;:::-;;;;;;;;;26743;;;:8;:14;;;;;;;26758:10;26743:26;;;;;;;;;26803:23;;;;26694:14;;;;;;;;-1:-1:-1;26788:12:0;:38;26780:64;;;;-1:-1:-1;;;26780:64:0;;10745:2:1;26780:64:0;;;10727:21:1;10784:2;10764:18;;;10757:30;-1:-1:-1;;;10803:18:1;;;10796:43;10856:18;;26780:64:0;10543:337:1;26780:64:0;26856:24;26886:32;26901:4;26907:10;26886:14;:32::i;:::-;26855:63;;;26929:16;26940:4;26929:10;:16::i;:::-;26961:9;26956:325;26980:22;;;:29;26976:33;;26956:325;;;27049:1;27031:4;:12;;27044:1;27031:15;;;;;;;;:::i;:::-;;;;;;;;:19;;;;27131:4;27086:42;27102:4;:22;;27125:1;27102:25;;;;;;;;:::i;:::-;;;;;;;;;;;27086:11;;;:15;:42::i;:::-;:49;;;;:::i;:::-;27065:4;:15;;27081:1;27065:18;;;;;;;;:::i;:::-;;;;;;;;:70;;;;27167:1;27154:7;27162:1;27154:10;;;;;;;;:::i;:::-;;;;;;;:14;27150:120;;;27189:65;27209:4;:17;;27227:1;27209:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27209:20:0;27231:10;27243:7;27251:1;27243:10;;;;;;;;:::i;:::-;;;;;;;27189:19;:65::i;:::-;27011:3;;;;:::i;:::-;;;;26956:325;;;;27291:15;27309:26;27330:4;27309:20;:26::i;:::-;27291:44;;27372:80;27406:35;27418:4;:22;;;27406:7;:11;;:35;;;;:::i;:::-;27372:15;;;;;:19;:80::i;:::-;27346:23;;;:106;27468:51;;27486:4;;27474:10;;27468:51;;;;27492:17;;;;27511:7;;27468:51;:::i;:::-;;;;;;;;26659:868;;;;26621:906;:::o;3183:234::-;3253:14;;-1:-1:-1;;;;;3253:14:0;3239:10;:28;3231:54;;;;-1:-1:-1;;;3231:54:0;;11786:2:1;3231:54:0;;;11768:21:1;11825:2;11805:18;;;11798:30;-1:-1:-1;;;11844:18:1;;;11837:43;11897:18;;3231:54:0;11584:337:1;3231:54:0;3321:14;;;3314:5;;3301:35;;-1:-1:-1;;;;;3321:14:0;;;;3314:5;;;;3301:35;;;3357:14;;;;3349:22;;-1:-1:-1;;;;;;3349:22:0;;;-1:-1:-1;;;;;3357:14:0;;3349:22;;;;3382:27;;;3183:234::o;17606:714::-;3634:5;;-1:-1:-1;;;;;3634:5:0;3620:10;:19;3612:41;;;;-1:-1:-1;;;3612:41:0;;;;;;;:::i;:::-;17718:21:::1;17742:8;17751:4;17742:14;;;;;;;;:::i;:::-;;;;;;;;;;;17718:38;;17794:4;:17;;:24;;;;17775:8;:15;:43;17767:71;;;::::0;-1:-1:-1;;;17767:71:0;;11087:2:1;17767:71:0::1;::::0;::::1;11069:21:1::0;11126:2;11106:18;;;11099:30;-1:-1:-1;;;11145:18:1;;;11138:45;11200:18;;17767:71:0::1;10885:339:1::0;17767:71:0::1;17854:9;17849:406;17873:8;:15;17869:1;:19;17849:406;;;17928:1;17914:8;17923:1;17914:11;;;;;;;;:::i;:::-;;;;;;;:15;17910:334;;;17950:191;17996:4;:17;;18014:1;17996:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;17996:20:0::1;18040:10;18082:4;18111:8;18120:1;18111:11;;;;;;;;:::i;:::-;;;;;;;17950:23;:191::i;:::-;18187:41;18216:8;18225:1;18216:11;;;;;;;;:::i;:::-;;;;;;;18187:4;:21;;18209:1;18187:24;;;;;;;;:::i;:::-;;;;;;;;;:28;;:41;;;;:::i;:::-;18160:4;:21;;18182:1;18160:24;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;:68:::0;17910:334:::1;17890:3:::0;::::1;::::0;::::1;:::i;:::-;;;;17849:406;;;;18278:4;18270:42;18284:4;:17;;18303:8;18270:42;;;;;;;:::i;:::-;;;;;;;;17707:613;17606:714:::0;;:::o;17126:398::-;3634:5;;-1:-1:-1;;;;;3634:5:0;3620:10;:19;3612:41;;;;-1:-1:-1;;;3612:41:0;;;;;;;:::i;:::-;17273:11:::1;17269:60;;;17301:16;17312:4;17301:10;:16::i;:::-;17339:21;17363:8;17372:4;17363:14;;;;;;;;:::i;:::-;;;;;;;;;;;17339:38;;17422:4;:19;;:26;;;;17396:15;:22;:52;17388:80;;;::::0;-1:-1:-1;;;17388:80:0;;12542:2:1;17388:80:0::1;::::0;::::1;12524:21:1::0;12581:2;12561:18;;;12554:30;-1:-1:-1;;;12600:18:1;;;12593:45;12655:18;;17388:80:0::1;12340:339:1::0;17388:80:0::1;17479:37:::0;;::::1;::::0;:19:::1;::::0;::::1;::::0;:37:::1;::::0;::::1;::::0;::::1;:::i;:::-;;17258:266;17126:398:::0;;;:::o;22676:978::-;22728:21;22752:8;22761:4;22752:14;;;;;;;;:::i;:::-;;;;;;;;;;;22728:38;;22797:4;:20;;;22781:12;:36;22777:75;;22834:7;22676:978;:::o;22777:75::-;22891:11;;;;22917:23;22913:112;;-1:-1:-1;22980:12:0;22957:20;;;;:35;-1:-1:-1;22676:978:0:o;22913:112::-;23040:9;23035:566;23059:22;;;:29;23055:33;;23035:566;;;23110:14;23127:98;23172:38;23189:4;:20;;;23172:12;:16;;:38;;;;:::i;:::-;23127:4;:19;;23147:1;23127:22;;;;;;;;:::i;:::-;;;;;;;;;:26;;:98;;;;:::i;:::-;23110:115;;23272:6;23244:4;:21;;23266:1;23244:24;;;;;;;;:::i;:::-;;;;;;;;;:34;23240:207;;23326:36;23355:6;23326:4;:21;;23348:1;23326:24;;;;;;;;:::i;:::-;;;;;;;;;:28;;:36;;;;:::i;:::-;23299:4;:21;;23321:1;23299:24;;;;;;;;:::i;:::-;;;;;;;;;;:63;23240:207;;;23430:1;23403:4;:21;;23425:1;23403:24;;;;;;;;:::i;:::-;;;;;;;;;;:28;23240:207;23489:100;23556:18;23537:16;:6;23548:4;23537:10;:16::i;:::-;:37;;;;:::i;:::-;23489:4;:22;;23512:1;23489:25;;;;;;;;:::i;:100::-;23461:4;:22;;23484:1;23461:25;;;;;;;;:::i;:::-;;;;;;;;;;:128;-1:-1:-1;23090:3:0;;;;:::i;:::-;;;;23035:566;;;-1:-1:-1;;23634:12:0;23611:20;;;;:35;-1:-1:-1;22676:978:0:o;27598:566::-;27659:21;27683:8;27692:4;27683:14;;;;;;;;:::i;:::-;;;;;;;;;27732;;;:8;:14;;;;;;27747:10;27732:26;;;;;;;;27683:14;;;;;;;27789:17;;27820:11;;27683:14;;-1:-1:-1;27732:26:0;;27769:63;;-1:-1:-1;;;;;27789:17:0;;27769:19;:63::i;:::-;27884:11;;27848:48;;13858:25:1;;;27878:4:0;;27866:10;;27848:48;;13846:2:1;13831:18;27848:48:0;;;;;;;27937:11;;27921;;;;:28;;:15;:28::i;:::-;27907:11;;;:42;27974:1;27960:15;;28015:22;;;:29;28001:44;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28001:44:0;-1:-1:-1;27986:59:0;;;;:12;;;;:59;;;;;;:::i;:::-;-1:-1:-1;28088:22:0;;;:29;28074:44;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28074:44:0;-1:-1:-1;28056:62:0;;;;:15;;;;:62;;;;;;:::i;:::-;-1:-1:-1;28155:1:0;28129:23;;;;:27;-1:-1:-1;;27598:566:0:o;23710:1758::-;23834:21;23858:8;23867:4;23858:14;;;;;;;;:::i;:::-;;;;;;;;;23907;;;:8;:14;;;;;;23922:10;23907:26;;;;;;;23858:14;;;;;;;23952:17;;23858:14;;-1:-1:-1;;;;;;23952:17:0;;;:34;;;;23944:73;;;;-1:-1:-1;;;23944:73:0;;11431:2:1;23944:73:0;;;11413:21:1;11470:2;11450:18;;;11443:30;11509:28;11489:18;;;11482:56;11555:18;;23944:73:0;11229:350:1;23944:73:0;24028:16;24039:4;24028:10;:16::i;:::-;24059:11;;:15;24055:340;;24096:9;24091:293;24115:22;;;:29;24111:33;;24091:293;;;24170:15;24188:115;24284:4;:15;;24300:1;24284:18;;;;;;;;:::i;:::-;;;;;;;;;24256:4;24211:42;24227:4;:22;;24250:1;24227:25;;;;;;;;:::i;:::-;;;;;;;;;;;24211:11;;;:15;:42::i;:::-;:49;;;;:::i;:::-;24188:95;;:115::i;:::-;24170:133;;24340:28;24360:7;24340:4;:12;;24353:1;24340:15;;;;;;;;:::i;:28::-;24322:4;:12;;24335:1;24322:15;;;;;;;;:::i;:::-;;;;;;;;;;:46;-1:-1:-1;24146:3:0;;;;:::i;:::-;;;;24091:293;;;;24055:340;24409:23;;;;:28;:48;;;;-1:-1:-1;24441:11:0;;:16;24409:48;24405:588;;;24494:4;:15;;;24478:12;:31;24474:367;;24576:22;;;;24556:15;;;;:43;;:19;:43::i;:::-;24530:23;;;:69;24474:367;;;24640:15;24658:26;24679:4;24658:20;:26::i;:::-;24640:44;;24729:96;24771:35;24783:4;:22;;;24771:7;:11;;:35;;;;:::i;:::-;24729:15;;;;;:19;:96::i;:::-;24703:23;;;:122;-1:-1:-1;24474:367:0;24887:17;;;:24;24873:39;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24873:39:0;-1:-1:-1;24855:57:0;;;;:15;;;;:57;;;;;;:::i;:::-;-1:-1:-1;24956:17:0;;;:24;24942:39;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24942:39:0;-1:-1:-1;24927:54:0;;;;:12;;;;:54;;;;;;:::i;:::-;;24405:588;25041:17;;25003:144;;-1:-1:-1;;;;;25041:17:0;25074:10;25108:4;25129:7;25003:23;:144::i;:::-;25172:11;;:24;;25188:7;25172:15;:24::i;:::-;25158:38;;25221:11;;;;:24;;25237:7;25221:15;:24::i;:::-;25207:11;;;:38;25261:9;25256:157;25280:22;;;:29;25276:33;;25256:157;;;25397:4;25352:42;25368:4;:22;;25391:1;25368:25;;;;;;;;:::i;:::-;;;;;;;;;;;25352:11;;;:15;:42::i;:::-;:49;;;;:::i;:::-;25331:4;:15;;25347:1;25331:18;;;;;;;;:::i;:::-;;;;;;;;;;:70;25311:3;;;;:::i;:::-;;;;25256:157;;;-1:-1:-1;25428:32:0;;13858:25:1;;;25446:4:0;;25434:10;;25428:32;;13846:2:1;13831:18;25428:32:0;13712:177:1;20141:238:0;20232:33;20283:20;20306:8;20315:4;20306:14;;;;;;;;:::i;:::-;;;;;;;;;;20283:37;;;;;;;;20306:14;;;;;;;20283:37;;-1:-1:-1;;;;;20283:37:0;;;;;;;;;;;;;;;;;;;;;;;;;20306:14;;20283:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20283:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;20283:37:0;;;-1:-1:-1;;20283:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20350:21;;;20141:238;-1:-1:-1;;;20141:238:0:o;3425:149::-;3634:5;;-1:-1:-1;;;;;3634:5:0;3620:10;:19;3612:41;;;;-1:-1:-1;;;3612:41:0;;;;;;;:::i;:::-;3502:14:::1;:27:::0;;-1:-1:-1;;;;;;3502:27:0::1;-1:-1:-1::0;;;;;3502:27:0;::::1;::::0;;::::1;::::0;;;3545:21:::1;::::0;::::1;::::0;-1:-1:-1;;3545:21:0::1;3425:149:::0;:::o;18404:771::-;3634:5;;-1:-1:-1;;;;;3634:5:0;3620:10;:19;3612:41;;;;-1:-1:-1;;;3612:41:0;;;;;;;:::i;:::-;18525:21:::1;18549:8;18558:4;18549:14;;;;;;;;:::i;:::-;;;;;;;;;;;18525:38;;18601:4;:17;;:24;;;;18582:8;:15;:43;18574:71;;;::::0;-1:-1:-1;;;18574:71:0;;11087:2:1;18574:71:0::1;::::0;::::1;11069:21:1::0;11126:2;11106:18;;;11099:30;-1:-1:-1;;;11145:18:1;;;11138:45;11200:18;;18574:71:0::1;10885:339:1::0;18574:71:0::1;18661:9;18656:446;18680:8;:15;18676:1;:19;18656:446;;;18740:4;:21;;18762:1;18740:24;;;;;;;;:::i;:::-;;;;;;;;;18725:8;18734:1;18725:11;;;;;;;;:::i;:::-;;;;;;;:39;;18717:66;;;::::0;-1:-1:-1;;;18717:66:0;;13571:2:1;18717:66:0::1;::::0;::::1;13553:21:1::0;13610:2;13590:18;;;13583:30;-1:-1:-1;;;13629:18:1;;;13622:44;13683:18;;18717:66:0::1;13369:338:1::0;18717:66:0::1;18816:1;18802:8;18811:1;18802:11;;;;;;;;:::i;:::-;;;;;;;:15;18798:293;;;18838:150;18880:4;:17;;18898:1;18880:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;18880:20:0::1;18924:10;18958:8;18967:1;18958:11;;;;;;;;:::i;18838:150::-;19034:41;19063:8;19072:1;19063:11;;;;;;;;:::i;:::-;;;;;;;19034:4;:21;;19056:1;19034:24;;;;;;;;:::i;:41::-;19007:4;:21;;19029:1;19007:24;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;:68:::0;18798:293:::1;18697:3:::0;::::1;::::0;::::1;:::i;:::-;;;;18656:446;;;;19133:4;19117:50;19139:4;:17;;19158:8;19117:50;;;;;;;:::i;20988:1077::-:0;21091:24;21117:26;21161:20;21184:8;21193:4;21184:14;;;;;;;;:::i;:::-;;;;;;;;;;21161:37;;;;;;;;21184:14;;;;;;;21161:37;;-1:-1:-1;;;;;21161:37:0;;;;;;;;;;;;;;;;;;;;;;;;;21184:14;;21161:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21161:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21209:20;21232:8;:14;21241:4;21232:14;;;;;;;;;;;:21;21247:5;-1:-1:-1;;;;;21232:21:0;-1:-1:-1;;;;;21232:21:0;;;;;;;;;;;;21209:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21264:26;21293:4;:11;;;21264:40;;21325:4;:12;;;21315:22;;21368:4;:20;;;21352:12;:36;;:63;;;;;21414:1;21392:4;:12;;;:19;:23;21352:63;:90;;;;-1:-1:-1;21419:23:0;;;21352:90;21348:655;;;21464:9;21459:533;21483:4;:22;;;:29;21479:1;:33;21459:533;;;21538:14;21555:106;21604:38;21621:4;:20;;;21604:12;:16;;:38;;;;:::i;:::-;21555:4;:19;;;21575:1;21555:22;;;;;;;;:::i;:::-;;;;;;;:26;;:106;;;;:::i;:::-;21538:123;-1:-1:-1;21680:25:0;21708:108;21779:18;21760:16;21538:123;21771:4;21760:10;:16::i;:::-;:37;;;;:::i;:::-;21708:4;:22;;;21731:1;21708:25;;;;;;;;:::i;:::-;;;;;;;:29;;:108;;;;:::i;:::-;21680:136;;21848:128;21890:67;21938:4;:15;;;21954:1;21938:18;;;;;;;;:::i;:::-;;;;;;;21928:4;21891:34;21907:17;21891:4;:11;;;:15;;:34;;;;:::i;21890:67::-;21848:4;:12;;;21861:1;21848:15;;;;;;;;:::i;:128::-;21835:7;21843:1;21835:10;;;;;;;;:::i;:::-;;;;;;:141;;;;;21519:473;;21514:3;;;;;:::i;:::-;;;;21459:533;;;;21348:655;22034:4;:23;;;22013:44;;21150:915;;;20988:1077;;;;;:::o;25527:1007::-;25653:21;25677:8;25686:4;25677:14;;;;;;;;:::i;:::-;;;;;;;;;25726;;;:8;:14;;;;;;25741:10;25726:26;;;;;;;25677:14;;;;;;;25771:17;;25677:14;;-1:-1:-1;;;;;;25771:17:0;;;:34;;;;25763:73;;;;-1:-1:-1;;;25763:73:0;;11431:2:1;25763:73:0;;;11413:21:1;11470:2;11450:18;;;11443:30;11509:28;11489:18;;;11482:56;11555:18;;25763:73:0;11229:350:1;25763:73:0;25855:11;;:22;-1:-1:-1;25855:22:0;25847:54;;;;-1:-1:-1;;;25847:54:0;;13223:2:1;25847:54:0;;;13205:21:1;13262:2;13242:18;;;13235:30;-1:-1:-1;;;13281:18:1;;;13274:49;13340:18;;25847:54:0;13021:343:1;25847:54:0;25912:16;25923:4;25912:10;:16::i;:::-;25944:9;25939:371;25963:22;;;:29;25959:33;;25939:371;;;26014:15;26032:107;26120:4;:15;;26136:1;26120:18;;;;;;;;:::i;26032:107::-;26014:125;;26172:28;26192:7;26172:4;:12;;26185:1;26172:15;;;;;;;;:::i;:28::-;26154:4;:12;;26167:1;26154:15;;;;;;;;:::i;:::-;;;;;;;;:46;;;;26294:4;26236:55;26265:4;:22;;26288:1;26265:25;;;;;;;;:::i;:::-;;;;;;;;;;;26236:11;;:24;;26252:7;26236:15;:24::i;:::-;:28;;:55::i;:::-;:62;;;;:::i;:::-;26215:4;:15;;26231:1;26215:18;;;;;;;;:::i;:::-;;;;;;;;;;:83;-1:-1:-1;25994:3:0;;;;:::i;:::-;;;;25939:371;;;-1:-1:-1;26340:17:0;;26320:59;;-1:-1:-1;;;;;26340:17:0;26359:10;26371:7;26320:19;:59::i;:::-;26404:11;;:24;;26420:7;26404:15;:24::i;:::-;26390:38;;26453:11;;;;:24;;26469:7;26453:15;:24::i;:::-;26439:11;;;:38;26493:33;;13858:25:1;;;26512:4:0;;26500:10;;26493:33;;13846:2:1;13831:18;26493:33:0;13712:177:1;22119:481:0;22213:15;22247:20;22270:8;22279:4;22270:14;;;;;;;;:::i;:::-;;;;;;;;;;22247:37;;;;;;;;22270:14;;;;;;;22247:37;;-1:-1:-1;;;;;22247:37:0;;;;;;;;;;;;;;;;;;;;;;;;;22270:14;;22247:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22247:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22315:4;:15;;;22299:12;:31;22295:45;;-1:-1:-1;22339:1:0;;22119:481;-1:-1:-1;;22119:481:0:o;22295:45::-;22351:24;22378:33;22395:4;:15;;;22378:12;:16;;:33;;;;:::i;:::-;22351:60;;22432:50;22480:1;22452:4;:22;;;22433:16;:41;;;;:::i;:::-;22432:47;;:50::i;:::-;22422:60;;22516:4;:22;;;22497:16;:41;;;;:::i;:::-;22493:100;;22570:11;22580:1;22570:7;:11;:::i;:::-;22560:21;;22493:100;22236:364;;22119:481;;;:::o;7410:151::-;7468:9;7498:6;;;:30;;-1:-1:-1;7527:1:0;7522;7513:5;7522:1;7527;7513:5;:::i;:::-;7509:9;-1:-1:-1;7508:15:0;;7509:9;7508:15;:::i;:::-;:20;7498:30;7490:63;;;;-1:-1:-1;;;7490:63:0;;9629:2:1;7490:63:0;;;9611:21:1;9668:2;9648:18;;;9641:30;-1:-1:-1;;;9687:18:1;;;9680:50;9747:18;;7490:63:0;9427:344:1;7490:63:0;7410:151;;;;:::o;9664:473::-;9910:45;;;-1:-1:-1;;;;;6076:32:1;;;9910:45:0;;;6058:51:1;6125:18;;;;6118:34;;;9910:45:0;;;;;;;;;;6031:18:1;;;;9910:45:0;;;;;;;-1:-1:-1;;;;;9910:45:0;-1:-1:-1;;;9910:45:0;;;9885:81;;-1:-1:-1;;;;9885:10:0;;;;:81;;9910:45;9885:81;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9849:117;;;;9999:7;:57;;;;-1:-1:-1;10011:11:0;;:16;;:44;;;10042:4;10031:24;;;;;;;;;;;;:::i;:::-;9977:152;;;;-1:-1:-1;;;9977:152:0;;12128:2:1;9977:152:0;;;12110:21:1;12167:2;12147:18;;;12140:30;12206:34;12186:18;;;12179:62;-1:-1:-1;;;12257:18:1;;;12250:43;12310:19;;9977:152:0;11926:409:1;7119:137:0;7177:9;7222:1;7212:5;7216:1;7222;7212:5;:::i;:::-;7208:9;;;7207:16;;7199:49;;;;-1:-1:-1;;;7199:49:0;;9978:2:1;7199:49:0;;;9960:21:1;10017:2;9997:18;;;9990:30;-1:-1:-1;;;10036:18:1;;;10029:50;10096:18;;7199:49:0;9776:344:1;9134:522:0;9419:51;;;-1:-1:-1;;;;;5762:15:1;;;9419:51:0;;;5744:34:1;5814:15;;;5794:18;;;5787:43;5846:18;;;;5839:34;;;9419:51:0;;;;;;;;;;5679:18:1;;;;9419:51:0;;;;;;;-1:-1:-1;;;;;9419:51:0;-1:-1:-1;;;9419:51:0;;;9394:87;;-1:-1:-1;;;;9394:10:0;;;;:87;;9419:51;9394:87;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9358:123;;;;9514:7;:57;;;;-1:-1:-1;9526:11:0;;:16;;:44;;;9557:4;9546:24;;;;;;;;;;;;:::i;:::-;9492:156;;;;-1:-1:-1;;;9492:156:0;;10327:2:1;9492:156:0;;;10309:21:1;10366:2;10346:18;;;10339:30;10405:34;10385:18;;;10378:62;-1:-1:-1;;;10456:18:1;;;10449:47;10513:19;;9492:156:0;10125:413:1;9492:156:0;9268:388;;9134:522;;;;:::o;7264:138::-;7322:9;7367:1;7357:5;7361:1;7367;7357:5;:::i;:::-;7353:9;;;7352:16;;7344:50;;;;-1:-1:-1;;;7344:50:0;;9279:2:1;7344:50:0;;;9261:21:1;9318:2;9298:18;;;9291:30;-1:-1:-1;;;9337:18:1;;;9330:51;9398:18;;7344:50:0;9077:345:1;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:673::-;246:5;299:3;292:4;284:6;280:17;276:27;266:55;;317:1;314;307:12;266:55;353:6;340:20;379:4;403:60;419:43;459:2;419:43;:::i;:::-;403:60;:::i;:::-;485:3;509:2;504:3;497:15;537:2;532:3;528:12;521:19;;572:2;564:6;560:15;624:3;619:2;613;610:1;606:10;598:6;594:23;590:32;587:41;584:61;;;641:1;638;631:12;584:61;663:1;673:163;687:2;684:1;681:9;673:163;;;744:17;;732:30;;782:12;;;;814;;;;705:1;698:9;673:163;;;-1:-1:-1;854:5:1;;192:673;-1:-1:-1;;;;;;;192:673:1:o;870:186::-;929:6;982:2;970:9;961:7;957:23;953:32;950:52;;;998:1;995;988:12;950:52;1021:29;1040:9;1021:29;:::i;:::-;1011:39;870:186;-1:-1:-1;;;870:186:1:o;1061:1367::-;1206:6;1214;1222;1230;1238;1291:3;1279:9;1270:7;1266:23;1262:33;1259:53;;;1308:1;1305;1298:12;1259:53;1331:29;1350:9;1331:29;:::i;:::-;1321:39;;1379:2;1432;1421:9;1417:18;1404:32;1455:18;1496:2;1488:6;1485:14;1482:34;;;1512:1;1509;1502:12;1482:34;1550:6;1539:9;1535:22;1525:32;;1595:7;1588:4;1584:2;1580:13;1576:27;1566:55;;1617:1;1614;1607:12;1566:55;1653:2;1640:16;1676:60;1692:43;1732:2;1692:43;:::i;1676:60::-;1758:3;1782:2;1777:3;1770:15;1810:2;1805:3;1801:12;1794:19;;1841:2;1837;1833:11;1889:7;1884:2;1878;1875:1;1871:10;1867:2;1863:19;1859:28;1856:41;1853:61;;;1910:1;1907;1900:12;1853:61;1932:1;1923:10;;1942:169;1956:2;1953:1;1950:9;1942:169;;;2013:23;2032:3;2013:23;:::i;:::-;2001:36;;1974:1;1967:9;;;;;2057:12;;;;2089;;1942:169;;;-1:-1:-1;2130:5:1;-1:-1:-1;;;2188:2:1;2173:18;;2160:32;;-1:-1:-1;2204:16:1;;;2201:36;;;2233:1;2230;2223:12;2201:36;;;2256:63;2311:7;2300:8;2289:9;2285:24;2256:63;:::i;:::-;1061:1367;;;;-1:-1:-1;2246:73:1;;2366:2;2351:18;;2338:32;;-1:-1:-1;2417:3:1;2402:19;2389:33;;1061:1367;-1:-1:-1;;;1061:1367:1:o;2433:245::-;2500:6;2553:2;2541:9;2532:7;2528:23;2524:32;2521:52;;;2569:1;2566;2559:12;2521:52;2601:9;2595:16;2620:28;2642:5;2620:28;:::i;2683:180::-;2742:6;2795:2;2783:9;2774:7;2770:23;2766:32;2763:52;;;2811:1;2808;2801:12;2763:52;-1:-1:-1;2834:23:1;;2683:180;-1:-1:-1;2683:180:1:o;2868:254::-;2936:6;2944;2997:2;2985:9;2976:7;2972:23;2968:32;2965:52;;;3013:1;3010;3003:12;2965:52;3049:9;3036:23;3026:33;;3078:38;3112:2;3101:9;3097:18;3078:38;:::i;:::-;3068:48;;2868:254;;;;;:::o;3127:322::-;3204:6;3212;3220;3273:2;3261:9;3252:7;3248:23;3244:32;3241:52;;;3289:1;3286;3279:12;3241:52;3325:9;3312:23;3302:33;;3354:38;3388:2;3377:9;3373:18;3354:38;:::i;:::-;3344:48;;3439:2;3428:9;3424:18;3411:32;3401:42;;3127:322;;;;;:::o;3454:416::-;3547:6;3555;3608:2;3596:9;3587:7;3583:23;3579:32;3576:52;;;3624:1;3621;3614:12;3576:52;3660:9;3647:23;3637:33;;3721:2;3710:9;3706:18;3693:32;3748:18;3740:6;3737:30;3734:50;;;3780:1;3777;3770:12;3734:50;3803:61;3856:7;3847:6;3836:9;3832:22;3803:61;:::i;:::-;3793:71;;;3454:416;;;;;:::o;3875:545::-;3974:6;3982;3990;4043:2;4031:9;4022:7;4018:23;4014:32;4011:52;;;4059:1;4056;4049:12;4011:52;4095:9;4082:23;4072:33;;4156:2;4145:9;4141:18;4128:32;4183:18;4175:6;4172:30;4169:50;;;4215:1;4212;4205:12;4169:50;4238:61;4291:7;4282:6;4271:9;4267:22;4238:61;:::i;:::-;4228:71;;;4349:2;4338:9;4334:18;4321:32;4362:28;4384:5;4362:28;:::i;:::-;4409:5;4399:15;;;3875:545;;;;;:::o;4425:435::-;4478:3;4516:5;4510:12;4543:6;4538:3;4531:19;4569:4;4598:2;4593:3;4589:12;4582:19;;4635:2;4628:5;4624:14;4656:1;4666:169;4680:6;4677:1;4674:13;4666:169;;;4741:13;;4729:26;;4775:12;;;;4810:15;;;;4702:1;4695:9;4666:169;;;-1:-1:-1;4851:3:1;;4425:435;-1:-1:-1;;;;;4425:435:1:o;4865:426::-;4994:3;5032:6;5026:13;5057:1;5067:129;5081:6;5078:1;5075:13;5067:129;;;5179:4;5163:14;;;5159:25;;5153:32;5140:11;;;5133:53;5096:12;5067:129;;;5214:6;5211:1;5208:13;5205:48;;;5249:1;5240:6;5235:3;5231:16;5224:27;5205:48;-1:-1:-1;5269:16:1;;;;;4865:426;-1:-1:-1;;4865:426:1:o;6163:1446::-;-1:-1:-1;;;;;6739:15:1;;;6721:34;;6774:2;6792:18;;;6785:34;;;6630:3;6850:2;6835:18;;6828:30;;;6907:13;;6656:18;;;6929:22;;;6601:4;;6982:3;6967:19;;;7009:15;;;;6601:4;7052:178;7066:6;7063:1;7060:13;7052:178;;;7131:13;;7127:22;;7115:35;;7170:12;;;;7205:15;;;;7088:1;7081:9;7052:178;;;7056:3;;;;;7275:9;7270:3;7266:19;7261:2;7250:9;7246:18;7239:47;7309:41;7346:3;7338:6;7309:41;:::i;:::-;7295:55;;7399:9;7391:6;7387:22;7381:3;7370:9;7366:19;7359:51;7427:44;7464:6;7456;7427:44;:::i;:::-;7502:3;7487:19;;7480:35;;;;-1:-1:-1;;7546:3:1;7531:19;;7524:35;;;;7590:3;7575:19;;;7568:35;7419:52;6163:1446;-1:-1:-1;;;;;6163:1446:1:o;7614:855::-;7831:4;7879:2;7868:9;7864:18;7909:2;7898:9;7891:21;7932:6;7967;7961:13;7998:6;7990;7983:22;8036:2;8025:9;8021:18;8014:25;;8058:6;8055:1;8048:17;8084:4;8074:14;;8124:2;8121:1;8111:16;8145:1;8155:194;8169:6;8166:1;8163:13;8155:194;;;8234:13;;-1:-1:-1;;;;;8230:39:1;8218:52;;8290:12;;;;8266:1;8325:14;;;;8184:9;8155:194;;;8159:3;;;8394:9;8389:3;8385:19;8380:2;8369:9;8365:18;8358:47;8422:41;8459:3;8451:6;8422:41;:::i;:::-;8414:49;7614:855;-1:-1:-1;;;;;;7614:855:1:o;8474:261::-;8653:2;8642:9;8635:21;8616:4;8673:56;8725:2;8714:9;8710:18;8702:6;8673:56;:::i;8740:332::-;8947:2;8936:9;8929:21;8910:4;8967:56;9019:2;9008:9;9004:18;8996:6;8967:56;:::i;:::-;8959:64;;9059:6;9054:2;9043:9;9039:18;9032:34;8740:332;;;;;:::o;12684:::-;12886:2;12868:21;;;12925:1;12905:18;;;12898:29;-1:-1:-1;;;12958:2:1;12943:18;;12936:39;13007:2;12992:18;;12684:332::o;13894:609::-;14207:6;14196:9;14189:25;14250:3;14245:2;14234:9;14230:18;14223:31;14170:4;14277:57;14329:3;14318:9;14314:19;14306:6;14277:57;:::i;:::-;14382:9;14374:6;14370:22;14365:2;14354:9;14350:18;14343:50;14410:44;14447:6;14439;14410:44;:::i;:::-;14402:52;;;14490:6;14485:2;14474:9;14470:18;14463:34;13894:609;;;;;;;:::o;14508:275::-;14579:2;14573:9;14644:2;14625:13;;-1:-1:-1;;14621:27:1;14609:40;;14679:18;14664:34;;14700:22;;;14661:62;14658:88;;;14726:18;;:::i;:::-;14762:2;14755:22;14508:275;;-1:-1:-1;14508:275:1:o;14788:183::-;14848:4;14881:18;14873:6;14870:30;14867:56;;;14903:18;;:::i;:::-;-1:-1:-1;14948:1:1;14944:14;14960:4;14940:25;;14788:183::o;14976:128::-;15016:3;15047:1;15043:6;15040:1;15037:13;15034:39;;;15053:18;;:::i;:::-;-1:-1:-1;15089:9:1;;14976:128::o;15109:120::-;15149:1;15175;15165:35;;15180:18;;:::i;:::-;-1:-1:-1;15214:9:1;;15109:120::o;15234:168::-;15274:7;15340:1;15336;15332:6;15328:14;15325:1;15322:21;15317:1;15310:9;15303:17;15299:45;15296:71;;;15347:18;;:::i;:::-;-1:-1:-1;15387:9:1;;15234:168::o;15407:125::-;15447:4;15475:1;15472;15469:8;15466:34;;;15480:18;;:::i;:::-;-1:-1:-1;15517:9:1;;15407:125::o;15537:135::-;15576:3;-1:-1:-1;;15597:17:1;;15594:43;;;15617:18;;:::i;:::-;-1:-1:-1;15664:1:1;15653:13;;15537:135::o;15677:112::-;15709:1;15735;15725:35;;15740:18;;:::i;:::-;-1:-1:-1;15774:9:1;;15677:112::o;15794:127::-;15855:10;15850:3;15846:20;15843:1;15836:31;15886:4;15883:1;15876:15;15910:4;15907:1;15900:15;15926:127;15987:10;15982:3;15978:20;15975:1;15968:31;16018:4;16015:1;16008:15;16042:4;16039:1;16032:15;16058:127;16119:10;16114:3;16110:20;16107:1;16100:31;16150:4;16147:1;16140:15;16174:4;16171:1;16164:15;16190:127;16251:10;16246:3;16242:20;16239:1;16232:31;16282:4;16279:1;16272:15;16306:4;16303:1;16296:15;16322:118;16408:5;16401:13;16394:21;16387:5;16384:32;16374:60;;16430:1;16427;16420:12;16374:60;16322:118;:::o

Swarm Source

ipfs://ca28770dcffaadee76633b02610b4229fe312af8e96aed21881a303bb252b0c9
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.