Contract 0xab4d9337c128685caee594a077bf7c145cc4cc8d

 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x9c30a002c9c347ef42dbaed0121f1fa7176da284c197115ecabfe9e10340eb5aUpdate Pool521709462023-01-10 22:37:1222 days 16 hrs ago0xc2e65149e67c2a2684169d147c89c48c7204b850 IN  0xab4d9337c128685caee594a077bf7c145cc4cc8d0 ETH0.0010709
0xd46ab481afe3e1ef71b337294ae21ec3b769a3a81ae87e1f68c2e64b5c8b6e71Update Pool519296032023-01-09 21:54:2323 days 17 hrs ago0x081ae8563229a8f145e6344e8bc799f3c635a860 IN  0xab4d9337c128685caee594a077bf7c145cc4cc8d0 ETH0.0000475
0x1b0c00a837de4e87931a71e314d9c42328fc9d8ab6962f9df911d43325a23091Transfer Ownersh...509897832023-01-05 8:54:5128 days 6 hrs ago0x19ec14906a4d84eccca29cdf6428d08ce9cacdf9 IN  0xab4d9337c128685caee594a077bf7c145cc4cc8d0 ETH0.00002496
0xc321769e3e01a9ed5159d16139ff2124dc1bacb3793765eaa965497ca296855bAdd Stake Token ...509762822023-01-05 7:47:5928 days 7 hrs ago0x19ec14906a4d84eccca29cdf6428d08ce9cacdf9 IN  0xab4d9337c128685caee594a077bf7c145cc4cc8d0 ETH0.00003537
0x0bd71e01c4f2108f3ef8f7c896f43cf32f88f2ffcee4f5f6f2f1a8b337a97524Set Stake Token ...509762352023-01-05 7:47:4528 days 7 hrs ago0x19ec14906a4d84eccca29cdf6428d08ce9cacdf9 IN  0xab4d9337c128685caee594a077bf7c145cc4cc8d0 ETH0.00003053
0x52feed08d67c99531aa9a3e9d6e9ba9aa41e97eb906dfda0940e9e6a9e588f86Add Pool509761872023-01-05 7:47:3228 days 7 hrs ago0x19ec14906a4d84eccca29cdf6428d08ce9cacdf9 IN  0xab4d9337c128685caee594a077bf7c145cc4cc8d0 ETH0.00004806
0xf5b5211e8fbfd9f7ea6ceae3d7665468d8fab35367391c9cbfdd00fa7117553fAdd Stake Token ...509757132023-01-05 7:45:1228 days 7 hrs ago0x19ec14906a4d84eccca29cdf6428d08ce9cacdf9 IN  0xab4d9337c128685caee594a077bf7c145cc4cc8d0 ETH0.00003537
0x12853ecc09a50149f2ddd5a8bd5ae2b8cb4c467cd17999c9b2da1d55c0a40852Set Stake Token ...509756752023-01-05 7:45:0028 days 7 hrs ago0x19ec14906a4d84eccca29cdf6428d08ce9cacdf9 IN  0xab4d9337c128685caee594a077bf7c145cc4cc8d0 ETH0.00003053
0x667ebd731bedc8f903df7b3ce38f16c1ebb131c582d8c36f40002e5ff13ec842Add Pool509756262023-01-05 7:44:4528 days 7 hrs ago0x19ec14906a4d84eccca29cdf6428d08ce9cacdf9 IN  0xab4d9337c128685caee594a077bf7c145cc4cc8d0 ETH0.0000476
0xae6fb10f2b3c26a71616d24f9b6ee21fe1190783550810770bb4103b19f4016aAdd Stake Token ...509755302023-01-05 7:44:2228 days 7 hrs ago0x19ec14906a4d84eccca29cdf6428d08ce9cacdf9 IN  0xab4d9337c128685caee594a077bf7c145cc4cc8d0 ETH0.00003531
0xce8ed303eb46f0f90bae3345fa51ecec369874df03b543cbf89f2d2fbc229ceeSet Ref Bps509755022023-01-05 7:44:1328 days 7 hrs ago0x19ec14906a4d84eccca29cdf6428d08ce9cacdf9 IN  0xab4d9337c128685caee594a077bf7c145cc4cc8d0 ETH0.00002986
0x620143e7329e5ccf8acfa7e7de740cbb30476b757997b3028b28f246daed217bSet Stake Token ...509754782023-01-05 7:44:0728 days 7 hrs ago0x19ec14906a4d84eccca29cdf6428d08ce9cacdf9 IN  0xab4d9337c128685caee594a077bf7c145cc4cc8d0 ETH0.00003047
0xb1126ed082c575bc81ab144505cfea6c9bd64e81d61debe09ceb798f26d5011dAdd Pool509754392023-01-05 7:43:5628 days 7 hrs ago0x19ec14906a4d84eccca29cdf6428d08ce9cacdf9 IN  0xab4d9337c128685caee594a077bf7c145cc4cc8d0 ETH0.00004709
0xd048339141084ef323ae350f434665d3fec110f39345f5e0ae1f8854b8e30adbAdd Stake Token ...509753832023-01-05 7:43:4028 days 7 hrs ago0x19ec14906a4d84eccca29cdf6428d08ce9cacdf9 IN  0xab4d9337c128685caee594a077bf7c145cc4cc8d0 ETH0.00003531
0xf905ad90e47c5d3d590ee7daaa788084fda70f71e1c4b5c076497b38cd1f0f50Set Stake Token ...509753652023-01-05 7:43:3428 days 7 hrs ago0x19ec14906a4d84eccca29cdf6428d08ce9cacdf9 IN  0xab4d9337c128685caee594a077bf7c145cc4cc8d0 ETH0.00003047
0x583cf7d3007a36dd11e050d0ef3d8911e414f4ee67cf357a31a6683122030739Add Pool509753242023-01-05 7:43:2128 days 7 hrs ago0x19ec14906a4d84eccca29cdf6428d08ce9cacdf9 IN  0xab4d9337c128685caee594a077bf7c145cc4cc8d0 ETH0.00004664
0x2f8d7e279cddbd9e692a6b92263b173e8f88ea3f9b9542d11a320d4ae771a9aeAdd Stake Token ...509752472023-01-05 7:42:5628 days 7 hrs ago0x19ec14906a4d84eccca29cdf6428d08ce9cacdf9 IN  0xab4d9337c128685caee594a077bf7c145cc4cc8d0 ETH0.00003531
0xb5947aaff5d230f91d2ae39e4393393a40c27d6d52f44a7c80118b3fc826faeaSet Stake Token ...509752162023-01-05 7:42:4828 days 7 hrs ago0x19ec14906a4d84eccca29cdf6428d08ce9cacdf9 IN  0xab4d9337c128685caee594a077bf7c145cc4cc8d0 ETH0.00003047
0xe0178b4fb0ac7e8d15b34fe2e62d987f7f49a391d93bf3f33e93b5eba5d5b7d9Add Pool509751882023-01-05 7:42:3928 days 7 hrs ago0x19ec14906a4d84eccca29cdf6428d08ce9cacdf9 IN  0xab4d9337c128685caee594a077bf7c145cc4cc8d0 ETH0.00004618
0x1b2b6cde0c44ab46a74b01887959dff221039771068393387aa2ba67b9930b5bAdd Stake Token ...509750492023-01-05 7:41:5628 days 7 hrs ago0x19ec14906a4d84eccca29cdf6428d08ce9cacdf9 IN  0xab4d9337c128685caee594a077bf7c145cc4cc8d0 ETH0.00003531
0xeb814d250a87c415b33fa398b3eccd4dac351d681801401fe8941a8550eb2eb1Set Stake Token ...509750102023-01-05 7:41:4628 days 7 hrs ago0x19ec14906a4d84eccca29cdf6428d08ce9cacdf9 IN  0xab4d9337c128685caee594a077bf7c145cc4cc8d0 ETH0.00003047
0x410168ecfef0f25c12bd9291770e30428688caee2a090e0f31ee31059d4e608eSet Pool509747962023-01-05 7:40:4528 days 7 hrs ago0x19ec14906a4d84eccca29cdf6428d08ce9cacdf9 IN  0xab4d9337c128685caee594a077bf7c145cc4cc8d0 ETH0.00003873
0x0effc8b3b9de0c52c401262ae2b2a4bb964fe16e2684fd0c83d83b2fb85dbcdfAdd Pool509747702023-01-05 7:40:3728 days 7 hrs ago0x19ec14906a4d84eccca29cdf6428d08ce9cacdf9 IN  0xab4d9337c128685caee594a077bf7c145cc4cc8d0 ETH0.00004558
0x7d06b852aba551ebc5cd2428a125bdbe5f002162429d14c1e74bae8e67d8c9f2Add Stake Token ...509746262023-01-05 7:39:5328 days 7 hrs ago0x19ec14906a4d84eccca29cdf6428d08ce9cacdf9 IN  0xab4d9337c128685caee594a077bf7c145cc4cc8d0 ETH0.00003531
0x8e7bc80756e986a68d12f0810007712703364496ff9f9607173511951cbcda19Set Stake Token ...509745952023-01-05 7:39:4528 days 7 hrs ago0x19ec14906a4d84eccca29cdf6428d08ce9cacdf9 IN  0xab4d9337c128685caee594a077bf7c145cc4cc8d0 ETH0.00003047
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x580b81d1a5c8da9d37af7620f9a4bd0450c675c4ae877b272064bc1b81617f06530763252023-01-14 18:10:0918 days 21 hrs ago 0xab4d9337c128685caee594a077bf7c145cc4cc8d 0x82af49447d8a07e3bd95bd0d56f35241523fbab10 ETH
0x580b81d1a5c8da9d37af7620f9a4bd0450c675c4ae877b272064bc1b81617f06530763252023-01-14 18:10:0918 days 21 hrs ago 0xab4d9337c128685caee594a077bf7c145cc4cc8d 0x82af49447d8a07e3bd95bd0d56f35241523fbab10 ETH
0x580b81d1a5c8da9d37af7620f9a4bd0450c675c4ae877b272064bc1b81617f06530763252023-01-14 18:10:0918 days 21 hrs ago 0xab4d9337c128685caee594a077bf7c145cc4cc8d 0xe80b6c4b3e9e66f0327e208e0421588f6c7931e90 ETH
0x580b81d1a5c8da9d37af7620f9a4bd0450c675c4ae877b272064bc1b81617f06530763252023-01-14 18:10:0918 days 21 hrs ago 0xab4d9337c128685caee594a077bf7c145cc4cc8d 0x59d7175203f0330fe163e3e5ac9dea55dd3103960 ETH
0x580b81d1a5c8da9d37af7620f9a4bd0450c675c4ae877b272064bc1b81617f06530763252023-01-14 18:10:0918 days 21 hrs ago 0xab4d9337c128685caee594a077bf7c145cc4cc8d 0x093f166e2eab47419417e34bb761650d5818e32b0 ETH
0x580b81d1a5c8da9d37af7620f9a4bd0450c675c4ae877b272064bc1b81617f06530763252023-01-14 18:10:0918 days 21 hrs ago 0xab4d9337c128685caee594a077bf7c145cc4cc8d 0x59d7175203f0330fe163e3e5ac9dea55dd3103960 ETH
0x580b81d1a5c8da9d37af7620f9a4bd0450c675c4ae877b272064bc1b81617f06530763252023-01-14 18:10:0918 days 21 hrs ago 0xab4d9337c128685caee594a077bf7c145cc4cc8d 0xd3ccbf3867ff0204730173eb4cad3c4b5fd07c690 ETH
0x580b81d1a5c8da9d37af7620f9a4bd0450c675c4ae877b272064bc1b81617f06530763252023-01-14 18:10:0918 days 21 hrs ago 0x093f166e2eab47419417e34bb761650d5818e32b 0xab4d9337c128685caee594a077bf7c145cc4cc8d0 ETH
0x580b81d1a5c8da9d37af7620f9a4bd0450c675c4ae877b272064bc1b81617f06530763252023-01-14 18:10:0918 days 21 hrs ago 0xab4d9337c128685caee594a077bf7c145cc4cc8d 0xe80b6c4b3e9e66f0327e208e0421588f6c7931e90 ETH
0x580b81d1a5c8da9d37af7620f9a4bd0450c675c4ae877b272064bc1b81617f06530763252023-01-14 18:10:0918 days 21 hrs ago 0xab4d9337c128685caee594a077bf7c145cc4cc8d 0x59d7175203f0330fe163e3e5ac9dea55dd3103960 ETH
0x580b81d1a5c8da9d37af7620f9a4bd0450c675c4ae877b272064bc1b81617f06530763252023-01-14 18:10:0918 days 21 hrs ago 0xab4d9337c128685caee594a077bf7c145cc4cc8d 0x093f166e2eab47419417e34bb761650d5818e32b0 ETH
0x580b81d1a5c8da9d37af7620f9a4bd0450c675c4ae877b272064bc1b81617f06530763252023-01-14 18:10:0918 days 21 hrs ago 0xab4d9337c128685caee594a077bf7c145cc4cc8d 0x59d7175203f0330fe163e3e5ac9dea55dd3103960 ETH
0x580b81d1a5c8da9d37af7620f9a4bd0450c675c4ae877b272064bc1b81617f06530763252023-01-14 18:10:0918 days 21 hrs ago 0xab4d9337c128685caee594a077bf7c145cc4cc8d 0xd3ccbf3867ff0204730173eb4cad3c4b5fd07c690 ETH
0x580b81d1a5c8da9d37af7620f9a4bd0450c675c4ae877b272064bc1b81617f06530763252023-01-14 18:10:0918 days 21 hrs ago 0x093f166e2eab47419417e34bb761650d5818e32b 0xab4d9337c128685caee594a077bf7c145cc4cc8d0 ETH
0x580b81d1a5c8da9d37af7620f9a4bd0450c675c4ae877b272064bc1b81617f06530763252023-01-14 18:10:0918 days 21 hrs ago 0x093f166e2eab47419417e34bb761650d5818e32b 0xab4d9337c128685caee594a077bf7c145cc4cc8d0 ETH
0xc395b5b1568eab017eef742b7cb433539c5fb69ccd991526263f2ab11cec15dd530067502023-01-14 11:41:0719 days 3 hrs ago 0xab4d9337c128685caee594a077bf7c145cc4cc8d0x8cb4da109b65bc4f3c3b029e017d2609fbd99a310 ETH
0xc395b5b1568eab017eef742b7cb433539c5fb69ccd991526263f2ab11cec15dd530067502023-01-14 11:41:0719 days 3 hrs ago 0xab4d9337c128685caee594a077bf7c145cc4cc8d 0xe80b6c4b3e9e66f0327e208e0421588f6c7931e90 ETH
0xc395b5b1568eab017eef742b7cb433539c5fb69ccd991526263f2ab11cec15dd530067502023-01-14 11:41:0719 days 3 hrs ago 0xab4d9337c128685caee594a077bf7c145cc4cc8d 0x59d7175203f0330fe163e3e5ac9dea55dd3103960 ETH
0xc395b5b1568eab017eef742b7cb433539c5fb69ccd991526263f2ab11cec15dd530067502023-01-14 11:41:0719 days 3 hrs ago 0xab4d9337c128685caee594a077bf7c145cc4cc8d 0x093f166e2eab47419417e34bb761650d5818e32b0 ETH
0xc395b5b1568eab017eef742b7cb433539c5fb69ccd991526263f2ab11cec15dd530067502023-01-14 11:41:0719 days 3 hrs ago 0xab4d9337c128685caee594a077bf7c145cc4cc8d 0x59d7175203f0330fe163e3e5ac9dea55dd3103960 ETH
0xc395b5b1568eab017eef742b7cb433539c5fb69ccd991526263f2ab11cec15dd530067502023-01-14 11:41:0719 days 3 hrs ago 0xab4d9337c128685caee594a077bf7c145cc4cc8d 0xd3ccbf3867ff0204730173eb4cad3c4b5fd07c690 ETH
0xc395b5b1568eab017eef742b7cb433539c5fb69ccd991526263f2ab11cec15dd530067502023-01-14 11:41:0719 days 3 hrs ago 0x093f166e2eab47419417e34bb761650d5818e32b 0xab4d9337c128685caee594a077bf7c145cc4cc8d0 ETH
0x2b5ce9502cdb09dcfc0260daef86a366f04c6fa22053ad1255c2adca0808db1b530066732023-01-14 11:40:4019 days 3 hrs ago 0xab4d9337c128685caee594a077bf7c145cc4cc8d0xad9ddc741003bea4914c323269fbd0eaf051b6530 ETH
0x2b5ce9502cdb09dcfc0260daef86a366f04c6fa22053ad1255c2adca0808db1b530066732023-01-14 11:40:4019 days 3 hrs ago 0xab4d9337c128685caee594a077bf7c145cc4cc8d 0xe80b6c4b3e9e66f0327e208e0421588f6c7931e90 ETH
0x2b5ce9502cdb09dcfc0260daef86a366f04c6fa22053ad1255c2adca0808db1b530066732023-01-14 11:40:4019 days 3 hrs ago 0xab4d9337c128685caee594a077bf7c145cc4cc8d 0x59d7175203f0330fe163e3e5ac9dea55dd3103960 ETH
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
MasterChef

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Arbiscan on 2023-01-05
*/

// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with GSN meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address payable) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}
pragma solidity >=0.6.0 <0.8.0;

/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using SafeMath for uint256;
    using Address for address;

    function safeTransfer(IERC20 token, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(IERC20 token, address spender, uint256 value) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        // solhint-disable-next-line max-line-length
        require((value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).add(value);
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero");
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) { // Return data is optional
            // solhint-disable-next-line max-line-length
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

pragma solidity >=0.6.2 <0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity >=0.6.0 <0.8.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].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being 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 percentage 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.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor () internal {
        _status = _NOT_ENTERED;
    }

    /**
     * @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(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

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

pragma solidity >=0.6.0 <0.8.0;
/*
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () internal {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

pragma solidity 0.6.12;

library LinkList {
  address public constant start = address(1);
  address public constant end = address(1);
  address public constant empty = address(0);

  struct List {
    uint256 llSize;
    mapping(address => address) next;
  }

  function init(List storage list) internal returns (List memory) {
    list.next[start] = end;

    return list;
  }

  function has(List storage list, address addr) internal view returns (bool) {
    return list.next[addr] != empty;
  }

  function add(List storage list, address addr) internal returns (List memory) {
    require(!has(list, addr), "LinkList::add:: addr is already in the list");
    list.next[addr] = list.next[start];
    list.next[start] = addr;
    list.llSize++;

    return list;
  }

  function remove(
    List storage list,
    address addr,
    address prevAddr
  ) internal returns (List memory) {
    require(has(list, addr), "LinkList::remove:: addr not whitelisted yet");
    require(list.next[prevAddr] == addr, "LinkList::remove:: wrong prevConsumer");
    list.next[prevAddr] = list.next[addr];
    list.next[addr] = empty;
    list.llSize--;

    return list;
  }

  function getAll(List storage list) internal view returns (address[] memory) {
    address[] memory addrs = new address[](list.llSize);
    address curr = list.next[start];
    for (uint256 i = 0; curr != end; i++) {
      addrs[i] = curr;
      curr = list.next[curr];
    }
    return addrs;
  }

  function getPreviousOf(List storage list, address addr) internal view returns (address) {
    address curr = list.next[start];
    require(curr != empty, "LinkList::getPreviousOf:: please init the linkedlist first");
    for (uint256 i = 0; curr != end; i++) {
      if (list.next[curr] == addr) return curr;
      curr = list.next[curr];
    }
    return end;
  }

  function getNextOf(List storage list, address curr) internal view returns (address) {
    return list.next[curr];
  }

  function length(List storage list) internal view returns (uint256) {
    return list.llSize;
  }
}

pragma solidity 0.6.12;

interface ISUGAR {
  // SUGAR specific functions
  function lock(address _account, uint256 _amount) external;

  function lockOf(address _account) external view returns (uint256);

  function unlock() external;

  function mint(address _to, uint256 _amount) external;

  // Generic BEP20 functions
  function totalSupply() external view returns (uint256);

  function balanceOf(address account) external view returns (uint256);

  function transfer(address recipient, uint256 amount) external returns (bool);

  function allowance(address owner, address spender) external view returns (uint256);

  function approve(address spender, uint256 amount) external returns (bool);

  function transferFrom(
    address sender,
    address recipient,
    uint256 amount
  ) external returns (bool);

  // Getter functions
  function startReleaseBlock() external view returns (uint256);

  function endReleaseBlock() external view returns (uint256);

  event Transfer(address indexed from, address indexed to, uint256 value);
  event Approval(address indexed owner, address indexed spender, uint256 value);
}

pragma solidity 0.6.12;

interface IStake {
  // Stake specific functions
  function safeSugarTransfer(address _account, uint256 _amount) external;
}

pragma solidity 0.6.12;

interface IMasterChef {
  /// @dev functions return information. no states changed.
  function poolLength() external view returns (uint256);

  function pendingSugar(address _stakeToken, address _user) external view returns (uint256);

  function userInfo(address _stakeToken, address _user)
    external
    view
    returns (
      uint256,
      uint256,
      address
    );

  function poolInfo(address _stakeToken)
    external
    view
    returns (
      uint256,
      uint256,
      uint256,
      uint256
    );

  function devAddr() external view returns (address);

  function refAddr() external view returns (address);

  function bonusMultiplier() external view returns (uint256);

  function totalAllocPoint() external view returns (uint256);

  function sugarPerBlock() external view returns (uint256);

  /// @dev configuration functions
  function addPool(
    address _stakeToken,
    uint256 _allocPoint,
    uint256 _depositFee
  ) external;

  function setPool(
    address _stakeToken,
    uint256 _allocPoint,
    uint256 _depositFee
  ) external;

  function updatePool(address _stakeToken) external;

  function removePool(address _stakeToken) external;

  /// @dev user interaction functions
  function deposit(
    address _for,
    address _stakeToken,
    uint256 _amount
  ) external;

  function withdraw(
    address _for,
    address _stakeToken,
    uint256 _amount
  ) external;

  function depositSugar(address _for, uint256 _amount) external;

  function withdrawSugar(address _for, uint256 _amount) external;

  function harvest(address _for, address _stakeToken) external;

  function harvest(address _for, address[] calldata _stakeToken) external;

  function emergencyWithdraw(address _for, address _stakeToken) external;

  function mintExtraReward(
    address _stakeToken,
    address _to,
    uint256 _amount
  ) external;

  function sugar() external returns (ISUGAR);
}

pragma solidity 0.6.12;

interface IMasterChefCallback {
  function masterChefCall(
    address stakeToken,
    address userAddr,
    uint256 unboostedReward
  ) external;
}

pragma solidity 0.6.12;

interface IReferral {
  function setMasterChef(address _masterChef) external;

  function activate(address referrer) external;

  function activateBySign(
    address referee,
    address referrer,
    uint8 v,
    bytes32 r,
    bytes32 s
  ) external;

  function isActivated(address _address) external view returns (bool);

  function updateReferralReward(address accountAddress, uint256 reward) external;

  function claimReward() external;
}

pragma solidity >=0.6.0 <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);
}

pragma solidity >=0.6.0 <0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity 0.6.12;

// MasterChef is the master of SUGAR. He can make SUGAR and he is a fair guy.
//
// Note that it's ownable and the owner wields tremendous power. The ownership
// will be transferred to a governance smart contract once SUGAR is sufficiently
// distributed and the community can show to govern itself.
//
// Have fun reading it. Hopefully it's bug-free. God bless.
contract MasterChef is IMasterChef, Ownable, ReentrancyGuard {
  using SafeMath for uint256;
  using SafeERC20 for IERC20;
  using LinkList for LinkList.List;
  using Address for address;

  // Info of each user.
  struct UserInfo {
    uint256 amount; // How many Staking tokens the user has provided.
    uint256 rewardDebt; // Reward debt. See explanation below.
    address fundedBy;
  }

  // Info of each pool.
  struct PoolInfo {
    uint256 allocPoint; // How many allocation points assigned to this pool.
    uint256 lastRewardBlock; // Last block number that SUGAR distribution occurs.
    uint256 accSugarPerShare; // Accumulated SUGAR per share, times 1e12. See below.
    uint256 depositFee;
  }

  // SUGAR token.
  ISUGAR public override sugar;
  // Stake address.
  IStake public stake;
  // Dev address.
  address public override devAddr;
  uint256 public devBps;
  // Refferal address.
  address public override refAddr;
  uint256 public refBps;
  // SUGAR per block.
  uint256 public override sugarPerBlock;
  // Bonus muliplier for early users.
  uint256 public override bonusMultiplier;

  // Pool link list.
  LinkList.List public pools;
  // Info of each pool.
  mapping(address => PoolInfo) public override poolInfo;
  // Info of each user that stakes Staking tokens.
  mapping(address => mapping(address => UserInfo)) public override userInfo;
  // Total allocation poitns. Must be the sum of all allocation points in all pools.
  uint256 public override totalAllocPoint;
  // The block number when SUGAR mining starts.
  uint256 public startBlock;

  // Does the pool allows some contracts to fund for an account.
  mapping(address => bool) public stakeTokenCallerAllowancePool;

  // list of contracts that the pool allows to fund.
  mapping(address => LinkList.List) public stakeTokenCallerContracts;

  event Deposit(address indexed funder, address indexed fundee, address indexed stakeToken, uint256 amount);
  event Withdraw(address indexed funder, address indexed fundee, address indexed stakeToken, uint256 amount);
  event EmergencyWithdraw(address indexed user, address indexed stakeToken, uint256 amount);
  event Harvest(address indexed funder, address indexed fundee, address indexed stakeToken, uint256 reward);

  event SetStakeTokenCallerAllowancePool(address indexed stakeToken, bool isAllowed);
  event AddStakeTokenCallerContract(address indexed stakeToken, address indexed caller);
  event SetSugarPerBlock(uint256 prevSugarPerBlock, uint256 currentSugarPerBlock);
  event RemoveStakeTokenCallerContract(address indexed stakeToken, address indexed caller);
  event SetRefAddress(address indexed refAddress);
  event SetDevAddress(address indexed devAddress);
  event SetRefBps(uint256 refBps);
  event SetDevBps(uint256 devBps);
  event UpdateMultiplier(uint256 bonusMultiplier);

  constructor(
    ISUGAR _sugar,
    IStake _stake,
    address _devAddr,
    address _refAddr,
    uint256 _sugarPerBlock,
    uint256 _startBlock
  ) public {
    require(
      _devAddr != address(0) && _devAddr != address(1),
      "constructor: _devAddr must not be address(0) or address(1)"
    );
    require(
      _refAddr != address(0) && _refAddr != address(1),
      "constructor: _refAddr must not be address(0) or address(1)"
    );

    bonusMultiplier = 1;
    sugar = _sugar;
    stake = _stake;
    devAddr = _devAddr;
    refAddr = _refAddr;
    sugarPerBlock = _sugarPerBlock;
    startBlock = _startBlock;
    devBps = 0;
    refBps = 0;
    pools.init();

    // add SUGAR pool
    pools.add(address(_sugar));
    poolInfo[address(_sugar)] = PoolInfo({
      allocPoint: 0,
      lastRewardBlock: startBlock,
      accSugarPerShare: 0,
      depositFee: 0
    });
    totalAllocPoint = 0;
  }

  // Only permitted funder can continue the execution
  modifier onlyPermittedTokenFunder(address _beneficiary, address _stakeToken) {
    require(_isFunder(_beneficiary, _stakeToken), "onlyPermittedTokenFunder: caller is not permitted");
    _;
  }

  // Only stake token caller contract can continue the execution (stakeTokenCaller must be a funder contract)
  modifier onlyStakeTokenCallerContract(address _stakeToken) {
    require(stakeTokenCallerContracts[_stakeToken].has(_msgSender()), "onlyStakeTokenCallerContract: bad caller");
    _;
  }

  // Set funder allowance for a stake token pool
  function setStakeTokenCallerAllowancePool(address _stakeToken, bool _isAllowed) external onlyOwner {
    stakeTokenCallerAllowancePool[_stakeToken] = _isAllowed;
    emit SetStakeTokenCallerAllowancePool(_stakeToken, _isAllowed);
  }

  // Setter function for adding stake token contract caller
  function addStakeTokenCallerContract(address _stakeToken, address _caller) external onlyOwner {
    require(
      stakeTokenCallerAllowancePool[_stakeToken],
      "addStakeTokenCallerContract: the pool doesn't allow a contract caller"
    );
    LinkList.List storage list = stakeTokenCallerContracts[_stakeToken];
    if (list.getNextOf(LinkList.start) == LinkList.empty) {
      list.init();
    }
    list.add(_caller);
    emit AddStakeTokenCallerContract(_stakeToken, _caller);
  }

  // Setter function for removing stake token contract caller
  function removeStakeTokenCallerContract(address _stakeToken, address _caller) external onlyOwner {
    require(
      stakeTokenCallerAllowancePool[_stakeToken],
      "removeStakeTokenCallerContract: the pool doesn't allow a contract caller"
    );
    LinkList.List storage list = stakeTokenCallerContracts[_stakeToken];
    list.remove(_caller, list.getPreviousOf(_caller));
    emit RemoveStakeTokenCallerContract(_stakeToken, _caller);
  }

  function setDevAddress(address _devAddr) external onlyOwner {
    require(
      _devAddr != address(0) && _devAddr != address(1),
      "setDevAddress: _devAddr must not be address(0) or address(1)"
    );
    devAddr = _devAddr;
    emit SetDevAddress(_devAddr);
  }

  function setDevBps(uint256 _devBps) external onlyOwner {
    require(_devBps <= 1000, "setDevBps::bad devBps");
    massUpdatePools();
    devBps = _devBps;
    emit SetDevBps(_devBps);
  }

  function setRefAddress(address _refAddr) external onlyOwner {
    require(
      _refAddr != address(0) && _refAddr != address(1),
      "setRefAddress: _refAddr must not be address(0) or address(1)"
    );
    refAddr = _refAddr;
    emit SetRefAddress(_refAddr);
  }

  function setRefBps(uint256 _refBps) external onlyOwner {
    require(_refBps <= 100, "setRefBps::bad refBps");
    massUpdatePools();
    refBps = _refBps;
    emit SetRefBps(_refBps);
  }

  // Set SUGAR per block.
  function setSugarPerBlock(uint256 _sugarPerBlock) external onlyOwner {
    massUpdatePools();
    uint256 prevSugarPerBlock = sugarPerBlock;
    sugarPerBlock = _sugarPerBlock;
    emit SetSugarPerBlock(prevSugarPerBlock, sugarPerBlock);
  }

  // Add a pool. Can only be called by the owner.
  function addPool(
    address _stakeToken,
    uint256 _allocPoint,
    uint256 _depositFee
  ) external override onlyOwner {
    require(
      _stakeToken != address(0) && _stakeToken != address(1),
      "addPool: _stakeToken must not be address(0) or address(1)"
    );
    require(!pools.has(_stakeToken), "addPool: _stakeToken duplicated");

    massUpdatePools();

    uint256 lastRewardBlock = block.number > startBlock ? block.number : startBlock;
    totalAllocPoint = totalAllocPoint.add(_allocPoint);
    pools.add(_stakeToken);
    poolInfo[_stakeToken] = PoolInfo({
      allocPoint: _allocPoint,
      lastRewardBlock: lastRewardBlock,
      accSugarPerShare: 0,
      depositFee: _depositFee
    });
  }

  // Update the given pool's SUGAR allocation point. Can only be called by the owner.
  function setPool(
    address _stakeToken,
    uint256 _allocPoint,
    uint256 _depositFee
  ) external override onlyOwner {
    require(
      _stakeToken != address(0) && _stakeToken != address(1),
      "setPool: _stakeToken must not be address(0) or address(1)"
    );
    require(pools.has(_stakeToken), "setPool: _stakeToken not in the list");

    massUpdatePools();

    totalAllocPoint = totalAllocPoint.sub(poolInfo[_stakeToken].allocPoint).add(_allocPoint);
    poolInfo[_stakeToken].allocPoint = _allocPoint;
    poolInfo[_stakeToken].depositFee = _depositFee;
  }

  // Remove pool. Can only be called by the owner.
  function removePool(address _stakeToken) external override onlyOwner {
    require(_stakeToken != address(sugar), "removePool: can't remove SUGAR pool");
    require(pools.has(_stakeToken), "removePool: pool not add yet");
    require(IERC20(_stakeToken).balanceOf(address(this)) == 0, "removePool: pool not empty");

    massUpdatePools();

    totalAllocPoint = totalAllocPoint.sub(poolInfo[_stakeToken].allocPoint);
    pools.remove(_stakeToken, pools.getPreviousOf(_stakeToken));
    poolInfo[_stakeToken].allocPoint = 0;
    poolInfo[_stakeToken].lastRewardBlock = 0;
    poolInfo[_stakeToken].accSugarPerShare = 0;
    poolInfo[_stakeToken].depositFee = 0;
  }

  // Return the length of poolInfo
  function poolLength() external view override returns (uint256) {
    return pools.length();
  }

  // Return reward multiplier over the given _from to _to block.
  function getMultiplier(uint256 _lastRewardBlock, uint256 _currentBlock) private view returns (uint256) {
    return _currentBlock.sub(_lastRewardBlock).mul(bonusMultiplier);
  }

  function updateMultiplier(uint256 _bonusMultiplier) public onlyOwner {
    bonusMultiplier = _bonusMultiplier;
    emit UpdateMultiplier(_bonusMultiplier);
  }

  // Validating if a msg sender is a funder
  function _isFunder(address _beneficiary, address _stakeToken) internal view returns (bool) {
    if (stakeTokenCallerAllowancePool[_stakeToken]) return stakeTokenCallerContracts[_stakeToken].has(_msgSender());
    return _beneficiary == _msgSender();
  }

  // View function to see pending SUGARs on frontend.
  function pendingSugar(address _stakeToken, address _user) external view override returns (uint256) {
    PoolInfo storage pool = poolInfo[_stakeToken];
    UserInfo storage user = userInfo[_stakeToken][_user];
    uint256 accSugarPerShare = pool.accSugarPerShare;
    uint256 totalStakeToken = IERC20(_stakeToken).balanceOf(address(this));
    if (block.number > pool.lastRewardBlock && totalStakeToken != 0) {
      uint256 multiplier = getMultiplier(pool.lastRewardBlock, block.number);
      uint256 sugarReward = multiplier.mul(sugarPerBlock).mul(pool.allocPoint).div(totalAllocPoint);
      accSugarPerShare = accSugarPerShare.add(sugarReward.mul(1e12).div(totalStakeToken));
    }
    return user.amount.mul(accSugarPerShare).div(1e12).sub(user.rewardDebt);
  }

  // Update reward variables for all pools. Be careful of gas spending!
  function massUpdatePools() public {
    address current = pools.next[LinkList.start];
    while (current != LinkList.end) {
      updatePool(current);
      current = pools.getNextOf(current);
    }
  }

  // Update reward variables of the given pool to be up-to-date.
  function updatePool(address _stakeToken) public override {
    PoolInfo storage pool = poolInfo[_stakeToken];
    if (block.number <= pool.lastRewardBlock) {
      return;
    }
    uint256 totalStakeToken = IERC20(_stakeToken).balanceOf(address(this));
    if (totalStakeToken == 0) {
      pool.lastRewardBlock = block.number;
      return;
    }
    uint256 multiplier = getMultiplier(pool.lastRewardBlock, block.number);
    uint256 sugarReward = multiplier.mul(sugarPerBlock).mul(pool.allocPoint).div(totalAllocPoint);
    sugar.mint(devAddr, sugarReward.mul(devBps).div(10000));
    sugar.mint(address(stake), sugarReward.mul(refBps).div(10000));
    sugar.mint(address(stake), sugarReward);
    pool.accSugarPerShare = pool.accSugarPerShare.add(sugarReward.mul(1e12).div(totalStakeToken));
    pool.lastRewardBlock = block.number;
  }

  // Deposit token to MasterChef for SUGAR allocation.
  function deposit(
    address _for,
    address _stakeToken,
    uint256 _amount
  ) external override onlyPermittedTokenFunder(_for, _stakeToken) nonReentrant {
    require(
      _stakeToken != address(0) && _stakeToken != address(1),
      "setPool: _stakeToken must not be address(0) or address(1)"
    );
    require(_stakeToken != address(sugar), "deposit: use depositSugar instead");
    require(pools.has(_stakeToken), "deposit: no pool");

    PoolInfo storage pool = poolInfo[_stakeToken];
    UserInfo storage user = userInfo[_stakeToken][_for];

    if (user.fundedBy != address(0)) require(user.fundedBy == _msgSender(), "deposit: only funder");

    updatePool(_stakeToken);

    if (user.amount > 0) _harvest(_for, _stakeToken);
    if (user.fundedBy == address(0)) user.fundedBy = _msgSender();
    if (_amount > 0) {
      uint256 depositFeeAmount = _amount.mul(pool.depositFee).div(10000);
      if (depositFeeAmount > 0) {
        _amount = _amount.sub(depositFeeAmount);
        IERC20(_stakeToken).safeTransferFrom(address(_msgSender()), devAddr, depositFeeAmount);
      }
      IERC20(_stakeToken).safeTransferFrom(address(_msgSender()), address(this), _amount);
      user.amount = user.amount.add(_amount);
    }
    user.rewardDebt = user.amount.mul(pool.accSugarPerShare).div(1e12);
    emit Deposit(_msgSender(), _for, _stakeToken, _amount);
  }

  // Withdraw token from MasterChef.
  function withdraw(
    address _for,
    address _stakeToken,
    uint256 _amount
  ) external override nonReentrant {
    require(
      _stakeToken != address(0) && _stakeToken != address(1),
      "setPool: _stakeToken must not be address(0) or address(1)"
    );
    require(_stakeToken != address(sugar), "withdraw: use withdrawSugar instead");
    require(pools.has(_stakeToken), "withdraw: no pool");

    PoolInfo storage pool = poolInfo[_stakeToken];
    UserInfo storage user = userInfo[_stakeToken][_for];

    require(user.fundedBy == _msgSender(), "withdraw: only funder");
    require(user.amount >= _amount, "withdraw: not good");

    updatePool(_stakeToken);
    _harvest(_for, _stakeToken);

    if (_amount > 0) {
      user.amount = user.amount.sub(_amount);
      IERC20(_stakeToken).safeTransfer(_msgSender(), _amount);
    }
    user.rewardDebt = user.amount.mul(pool.accSugarPerShare).div(1e12);
    if (user.amount == 0) user.fundedBy = address(0);
    emit Withdraw(_msgSender(), _for, _stakeToken, _amount);
  }

  // Deposit SUGAR to MasterChef.
  function depositSugar(address _for, uint256 _amount)
    external
    override
    onlyPermittedTokenFunder(_for, address(sugar))
    nonReentrant
  {
    PoolInfo storage pool = poolInfo[address(sugar)];
    UserInfo storage user = userInfo[address(sugar)][_for];

    if (user.fundedBy != address(0)) require(user.fundedBy == _msgSender(), "depositSugar: bad sof");

    updatePool(address(sugar));

    if (user.amount > 0) _harvest(_for, address(sugar));
    if (user.fundedBy == address(0)) user.fundedBy = _msgSender();
    if (_amount > 0) {
      uint256 depositFeeAmount = _amount.mul(pool.depositFee).div(10000);
      if (depositFeeAmount > 0) {
        _amount = _amount.sub(depositFeeAmount);
        IERC20(address(sugar)).safeTransferFrom(address(_msgSender()), devAddr, depositFeeAmount);
      }
      IERC20(address(sugar)).safeTransferFrom(address(_msgSender()), address(this), _amount);
      user.amount = user.amount.add(_amount);
    }
    user.rewardDebt = user.amount.mul(pool.accSugarPerShare).div(1e12);
    emit Deposit(_msgSender(), _for, address(sugar), _amount);
  }

  // Withdraw SUGAR
  function withdrawSugar(address _for, uint256 _amount) external override nonReentrant {
    PoolInfo storage pool = poolInfo[address(sugar)];
    UserInfo storage user = userInfo[address(sugar)][_for];

    require(user.fundedBy == _msgSender(), "withdrawSugar: only funder");
    require(user.amount >= _amount, "withdrawSugar: not good");

    updatePool(address(sugar));
    _harvest(_for, address(sugar));

    if (_amount > 0) {
      user.amount = user.amount.sub(_amount);
      IERC20(address(sugar)).safeTransfer(address(_msgSender()), _amount);
    }
    user.rewardDebt = user.amount.mul(pool.accSugarPerShare).div(1e12);
    if (user.amount == 0) user.fundedBy = address(0);
    emit Withdraw(_msgSender(), _for, address(sugar), user.amount);
  }

  // Harvest SUGAR earned from a specific pool.
  function harvest(address _for, address _stakeToken) external override nonReentrant {
    PoolInfo storage pool = poolInfo[_stakeToken];
    UserInfo storage user = userInfo[_stakeToken][_for];

    updatePool(_stakeToken);
    _harvest(_for, _stakeToken);

    user.rewardDebt = user.amount.mul(pool.accSugarPerShare).div(1e12);
  }

  // Harvest SUGAR earned from pools.
  function harvest(address _for, address[] calldata _stakeTokens) external override nonReentrant {
    for (uint256 i = 0; i < _stakeTokens.length; i++) {
      PoolInfo storage pool = poolInfo[_stakeTokens[i]];
      UserInfo storage user = userInfo[_stakeTokens[i]][_for];
      updatePool(_stakeTokens[i]);
      _harvest(_for, _stakeTokens[i]);
      user.rewardDebt = user.amount.mul(pool.accSugarPerShare).div(1e12);
    }
  }

  // Internal function to harvest SUGAR
  function _harvest(address _for, address _stakeToken) internal {
    PoolInfo memory pool = poolInfo[_stakeToken];
    UserInfo memory user = userInfo[_stakeToken][_for];
    require(user.fundedBy == _msgSender(), "_harvest: only funder");
    require(user.amount > 0, "_harvest: nothing to harvest");
    uint256 pending = user.amount.mul(pool.accSugarPerShare).div(1e12).sub(user.rewardDebt);
    require(pending <= sugar.balanceOf(address(stake)), "_harvest: wait what.. not enough SUGAR");
    stake.safeSugarTransfer(_for, pending);
    if (stakeTokenCallerContracts[_stakeToken].has(_msgSender())) {
      _masterChefCallee(_msgSender(), _stakeToken, _for, pending);
    }
    _referralCallee(_for, pending);
    emit Harvest(_msgSender(), _for, _stakeToken, pending);
  }

  function _referralCallee(address _for, uint256 _pending) internal {
    if (!refAddr.isContract()) {
      return;
    }
    stake.safeSugarTransfer(address(refAddr), _pending.mul(refBps).div(10000));
    (bool success, ) = refAddr.call(
      abi.encodeWithSelector(IReferral.updateReferralReward.selector, _for, _pending.mul(refBps).div(10000))
    );
    require(success, "_referralCallee:  failed to execute updateReferralReward");
  }

  // Observer function for those contract implementing onBeforeLock, execute an onBeforelock statement
  function _masterChefCallee(
    address _caller,
    address _stakeToken,
    address _for,
    uint256 _pending
  ) internal {
    if (!_caller.isContract()) {
      return;
    }
    (bool success, ) = _caller.call(
      abi.encodeWithSelector(IMasterChefCallback.masterChefCall.selector, _stakeToken, _for, _pending)
    );
    require(success, "_masterChefCallee:  failed to execute masterChefCall");
  }

  // Withdraw without caring about rewards. EMERGENCY ONLY.
  function emergencyWithdraw(address _for, address _stakeToken) external override nonReentrant {
    UserInfo storage user = userInfo[_stakeToken][_for];
    require(user.fundedBy == _msgSender(), "emergencyWithdraw: only funder");
    IERC20(_stakeToken).safeTransfer(address(_for), user.amount);

    emit EmergencyWithdraw(_for, _stakeToken, user.amount);

    user.amount = 0;
    user.rewardDebt = 0;
    user.fundedBy = address(0);
  }

  // This is a function for mining an extra amount of sugar, should be called only by stake token caller contract (boosting purposed)
  function mintExtraReward(
    address _stakeToken,
    address _to,
    uint256 _amount
  ) external override onlyStakeTokenCallerContract(_stakeToken) {
    sugar.mint(_to, _amount);
  }
}

Contract ABI

[{"inputs":[{"internalType":"contract ISUGAR","name":"_sugar","type":"address"},{"internalType":"contract IStake","name":"_stake","type":"address"},{"internalType":"address","name":"_devAddr","type":"address"},{"internalType":"address","name":"_refAddr","type":"address"},{"internalType":"uint256","name":"_sugarPerBlock","type":"uint256"},{"internalType":"uint256","name":"_startBlock","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"stakeToken","type":"address"},{"indexed":true,"internalType":"address","name":"caller","type":"address"}],"name":"AddStakeTokenCallerContract","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"funder","type":"address"},{"indexed":true,"internalType":"address","name":"fundee","type":"address"},{"indexed":true,"internalType":"address","name":"stakeToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"stakeToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"funder","type":"address"},{"indexed":true,"internalType":"address","name":"fundee","type":"address"},{"indexed":true,"internalType":"address","name":"stakeToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"Harvest","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"stakeToken","type":"address"},{"indexed":true,"internalType":"address","name":"caller","type":"address"}],"name":"RemoveStakeTokenCallerContract","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"devAddress","type":"address"}],"name":"SetDevAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"devBps","type":"uint256"}],"name":"SetDevBps","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"refAddress","type":"address"}],"name":"SetRefAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"refBps","type":"uint256"}],"name":"SetRefBps","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"stakeToken","type":"address"},{"indexed":false,"internalType":"bool","name":"isAllowed","type":"bool"}],"name":"SetStakeTokenCallerAllowancePool","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"prevSugarPerBlock","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"currentSugarPerBlock","type":"uint256"}],"name":"SetSugarPerBlock","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"bonusMultiplier","type":"uint256"}],"name":"UpdateMultiplier","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"funder","type":"address"},{"indexed":true,"internalType":"address","name":"fundee","type":"address"},{"indexed":true,"internalType":"address","name":"stakeToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[{"internalType":"address","name":"_stakeToken","type":"address"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"uint256","name":"_depositFee","type":"uint256"}],"name":"addPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_stakeToken","type":"address"},{"internalType":"address","name":"_caller","type":"address"}],"name":"addStakeTokenCallerContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"bonusMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_for","type":"address"},{"internalType":"address","name":"_stakeToken","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_for","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"depositSugar","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devBps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_for","type":"address"},{"internalType":"address","name":"_stakeToken","type":"address"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_for","type":"address"},{"internalType":"address[]","name":"_stakeTokens","type":"address[]"}],"name":"harvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_for","type":"address"},{"internalType":"address","name":"_stakeToken","type":"address"}],"name":"harvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_stakeToken","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintExtraReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_stakeToken","type":"address"},{"internalType":"address","name":"_user","type":"address"}],"name":"pendingSugar","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"poolInfo","outputs":[{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"lastRewardBlock","type":"uint256"},{"internalType":"uint256","name":"accSugarPerShare","type":"uint256"},{"internalType":"uint256","name":"depositFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pools","outputs":[{"internalType":"uint256","name":"llSize","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"refAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"refBps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_stakeToken","type":"address"}],"name":"removePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_stakeToken","type":"address"},{"internalType":"address","name":"_caller","type":"address"}],"name":"removeStakeTokenCallerContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_devAddr","type":"address"}],"name":"setDevAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_devBps","type":"uint256"}],"name":"setDevBps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_stakeToken","type":"address"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"uint256","name":"_depositFee","type":"uint256"}],"name":"setPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_refAddr","type":"address"}],"name":"setRefAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_refBps","type":"uint256"}],"name":"setRefBps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_stakeToken","type":"address"},{"internalType":"bool","name":"_isAllowed","type":"bool"}],"name":"setStakeTokenCallerAllowancePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_sugarPerBlock","type":"uint256"}],"name":"setSugarPerBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stake","outputs":[{"internalType":"contract IStake","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"stakeTokenCallerAllowancePool","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"stakeTokenCallerContracts","outputs":[{"internalType":"uint256","name":"llSize","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sugar","outputs":[{"internalType":"contract ISUGAR","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sugarPerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAllocPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_bonusMultiplier","type":"uint256"}],"name":"updateMultiplier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_stakeToken","type":"address"}],"name":"updatePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"},{"internalType":"address","name":"fundedBy","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_for","type":"address"},{"internalType":"address","name":"_stakeToken","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_for","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawSugar","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b50604051620045d8380380620045d8833981810160405260c08110156200003757600080fd5b508051602082015160408301516060840151608085015160a090950151939492939192909160006200006862000277565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600180556001600160a01b03841615801590620000d957506001600160a01b038416600114155b620001165760405162461bcd60e51b815260040180806020018281038252603a81526020018062004573603a913960400191505060405180910390fd5b6001600160a01b038316158015906200013957506001600160a01b038316600114155b620001765760405162461bcd60e51b815260040180806020018281038252603a81526020018062004539603a913960400191505060405180910390fd5b6001600955600280546001600160a01b03199081166001600160a01b0389811691909117909255600380548216888416179055600480548216878416179055600680549091169185169190911790556008829055600f81905560006005819055600755620001f1600a6200027b602090811b62002d0c17901c565b506200020d86600a620002bb60201b62002d4a1790919060201c565b5050604080516080810182526000808252600f546020808401918252838501838152606085018481526001600160a01b03909b168452600c90915293822092518355516001830155915160028201559551600390960195909555505050600e9190915550620003aa565b3390565b6200028562000397565b5060016000818152828201602090815260409182902080546001600160a01b031916909317909255805191820190529054815290565b620002c562000397565b620002d1838362000372565b156200030f5760405162461bcd60e51b815260040180806020018281038252602b815260200180620045ad602b913960400191505060405180910390fd5b50600160008181528382016020908152604080832080546001600160a01b039687168086528386208054989092166001600160a01b0319988916179091559385905280549095169092179093558354909101928390558051918201905290815290565b6001600160a01b03818116600090815260018401602052604090205416151592915050565b6040518060200160405280600081525090565b61417f80620003ba6000396000f3fe608060405234801561001057600080fd5b506004361061025e5760003560e01c806366cc1857116101465780638da5cb5b116100c3578063d0d3f18d11610087578063d0d3f18d14610781578063d0d41fe11461079e578063d9caed12146107c4578063da09c72c146107fa578063f2fde38b14610802578063fa8e15b9146108285761025e565b80638da5cb5b146107155780639a7b5f111461071d578063a0e0e13c14610769578063a8b973a114610771578063c5c51dca146107795761025e565b806378b2c1791161010a57806378b2c1791461065f578063799352cb146106675780637b46c54f1461068d5780637fb595f7146106b35780638340f549146106df5761025e565b806366cc1857146105eb57806366eed48e1461061957806369d0c5b814610621578063715018a614610629578063773b4dfe146106315761025e565b80633a4b66f1116101df57806348cd4cb1116101a357806348cd4cb11461053d5780634a0ee32c146105455780634b372dd6146105625780635ffe614614610598578063630b5ba1146105b55780636382d9ad146105bd5761025e565b80633a4b66f1146104765780633b7d09461461049a5780633dff45e9146104c05780633f98b267146104f2578063424362db1461050f5761025e565b80630f208beb116102265780630f208beb1461038b578063178a5f98146103e057806317caf6f11461040e57806317ccd7ee14610416578063363e7317146104485761025e565b80630196d0af146102635780630504f9cd1461029d578063061e26af146102cb57806307a10005146102f1578063081e3eda14610371575b600080fd5b6102896004803603602081101561027957600080fd5b50356001600160a01b0316610830565b604080519115158252519081900360200190f35b6102c9600480360360408110156102b357600080fd5b506001600160a01b038135169060200135610845565b005b6102c9600480360360208110156102e157600080fd5b50356001600160a01b0316610b0e565b6102c96004803603604081101561030757600080fd5b6001600160a01b03823516919081019060408101602082013564010000000081111561033257600080fd5b82018360208201111561034457600080fd5b8035906020019184602083028401116401000000008311171561036657600080fd5b509092509050610c17565b610379610d75565b60408051918252519081900360200190f35b6103b9600480360360408110156103a157600080fd5b506001600160a01b0381358116916020013516610d86565b6040805193845260208401929092526001600160a01b031682820152519081900360600190f35b6102c9600480360360408110156103f657600080fd5b506001600160a01b0381351690602001351515610dbb565b610379610e7d565b6102c96004803603606081101561042c57600080fd5b506001600160a01b038135169060208101359060400135610e83565b6103796004803603604081101561045e57600080fd5b506001600160a01b038135811691602001351661102d565b61047e611180565b604080516001600160a01b039092168252519081900360200190f35b6102c9600480360360208110156104b057600080fd5b50356001600160a01b031661118f565b6102c9600480360360608110156104d657600080fd5b506001600160a01b0381351690602081013590604001356113d5565b6102c96004803603602081101561050857600080fd5b5035611538565b6102c96004803603604081101561052557600080fd5b506001600160a01b038135811691602001351661162b565b610379611772565b6102c96004803603602081101561055b57600080fd5b5035611778565b6102c96004803603606081101561057857600080fd5b506001600160a01b0381358116916020810135909116906040013561186c565b6102c9600480360360208110156105ae57600080fd5b5035611944565b6102c96119e1565b6102c9600480360360408110156105d357600080fd5b506001600160a01b0381358116916020013516611a46565b6102c96004803603604081101561060157600080fd5b506001600160a01b0381358116916020013516611ba5565b610379611c59565b61047e611c5f565b6102c9611c6e565b6102c96004803603604081101561064757600080fd5b506001600160a01b0381358116916020013516611d1a565b610379611e47565b6103796004803603602081101561067d57600080fd5b50356001600160a01b0316611e4d565b6102c9600480360360208110156106a357600080fd5b50356001600160a01b0316611e5f565b6102c9600480360360408110156106c957600080fd5b506001600160a01b03813516906020013561211f565b6102c9600480360360608110156106f557600080fd5b506001600160a01b03813581169160208101359091169060400135612358565b61047e6126e5565b6107436004803603602081101561073357600080fd5b50356001600160a01b03166126f4565b604080519485526020850193909352838301919091526060830152519081900360800190f35b61047e61271b565b61037961272a565b610379612730565b6102c96004803603602081101561079757600080fd5b5035612736565b6102c9600480360360208110156107b457600080fd5b50356001600160a01b03166127e7565b6102c9600480360360608110156107da57600080fd5b506001600160a01b038135811691602081013590911690604001356128f0565b61047e612bf5565b6102c96004803603602081101561081857600080fd5b50356001600160a01b0316612c04565b610379612d06565b60106020526000908152604090205460ff1681565b60025482906001600160a01b031661085d8282612dfb565b6108985760405162461bcd60e51b8152600401808060200182810382526031815260200180613d976031913960400191505060405180910390fd5b600260015414156108de576040805162461bcd60e51b815260206004820152601f6024820152600080516020613cf5833981519152604482015290519081900360640190fd5b6002600181905580546001600160a01b039081166000908152600c60209081526040808320600d83528184208a861685529092529091209283015490929116156109865761092a612e70565b60028201546001600160a01b03908116911614610986576040805162461bcd60e51b81526020600482015260156024820152743232b837b9b4ba29bab3b0b91d103130b21039b7b360591b604482015290519081900360640190fd5b60025461099b906001600160a01b0316611e5f565b8054156109b9576002546109b99087906001600160a01b0316612e74565b60028101546001600160a01b03166109f6576109d3612e70565b6002820180546001600160a01b0319166001600160a01b03929092169190911790555b8415610a89576000610a21612710610a1b8560030154896131dc90919063ffffffff16565b9061323c565b90508015610a5a57610a3386826132a3565b9550610a5a610a40612e70565b6004546002546001600160a01b0390811692911684613300565b610a79610a65612e70565b6002546001600160a01b0316903089613300565b8154610a859087613360565b8255505b60028201548154610aa49164e8d4a5100091610a1b916131dc565b60018201556002546001600160a01b03908116908716610ac2612e70565b6001600160a01b03167f7cfff908a4b583f36430b25d75964c458d8ede8a99bd61be750e97ee1b2f3a96886040518082815260200191505060405180910390a450506001805550505050565b610b16612e70565b6001600160a01b0316610b276126e5565b6001600160a01b031614610b70576040805162461bcd60e51b81526020600482018190526024820152600080516020613e6c833981519152604482015290519081900360640190fd5b6001600160a01b03811615801590610b9257506001600160a01b038116600114155b610bcd5760405162461bcd60e51b815260040180806020018281038252603c815260200180613e8c603c913960400191505060405180910390fd5b600680546001600160a01b0319166001600160a01b0383169081179091556040517f43c33f61b2cd06a9dcb62807aef5440f6388e0b77658248697d1d9be01820a0f90600090a250565b60026001541415610c5d576040805162461bcd60e51b815260206004820152601f6024820152600080516020613cf5833981519152604482015290519081900360640190fd5b600260015560005b81811015610d6b576000600c6000858585818110610c7f57fe5b905060200201356001600160a01b03166001600160a01b03166001600160a01b0316815260200190815260200160002090506000600d6000868686818110610cc357fe5b6001600160a01b036020918202939093013583168452838101949094525060409182016000908120918a168152925290209050610d1a858585818110610d0557fe5b905060200201356001600160a01b0316611e5f565b610d3f86868686818110610d2a57fe5b905060200201356001600160a01b0316612e74565b60028201548154610d5a9164e8d4a5100091610a1b916131dc565b600191820155919091019050610c65565b5050600180555050565b6000610d81600a6133ba565b905090565b600d6020908152600092835260408084209091529082529020805460018201546002909201549091906001600160a01b031683565b610dc3612e70565b6001600160a01b0316610dd46126e5565b6001600160a01b031614610e1d576040805162461bcd60e51b81526020600482018190526024820152600080516020613e6c833981519152604482015290519081900360640190fd5b6001600160a01b038216600081815260106020908152604091829020805460ff1916851515908117909155825190815291517fa74a0b200dafba5df263e0d0c90173d62fda8752c351a8a83cdb5bd33cb4d38e9281900390910190a25050565b600e5481565b610e8b612e70565b6001600160a01b0316610e9c6126e5565b6001600160a01b031614610ee5576040805162461bcd60e51b81526020600482018190526024820152600080516020613e6c833981519152604482015290519081900360640190fd5b6001600160a01b03831615801590610f0757506001600160a01b038316600114155b610f425760405162461bcd60e51b8152600401808060200182810382526039815260200180613ec86039913960400191505060405180910390fd5b610f4d600a846133be565b15610f9f576040805162461bcd60e51b815260206004820152601f60248201527f616464506f6f6c3a205f7374616b65546f6b656e206475706c69636174656400604482015290519081900360640190fd5b610fa76119e1565b6000600f544311610fba57600f54610fbc565b435b600e54909150610fcc9084613360565b600e55610fda600a85612d4a565b506040805160808101825293845260208085019283526000858301818152606087019586526001600160a01b039097168152600c9091522092518355516001830155915160028201559051600390910155565b6001600160a01b038083166000818152600c60209081526040808320600d83528184209587168452948252808320600286015482516370a0823160e01b815230600482015292519496959194909387936370a082319260248083019392829003018186803b15801561109e57600080fd5b505afa1580156110b2573d6000803e3d6000fd5b505050506040513d60208110156110c857600080fd5b50516001850154909150431180156110df57508015155b156111455760006110f48560010154436133e3565b90506000611121600e54610a1b886000015461111b600854876131dc90919063ffffffff16565b906131dc565b905061114061113984610a1b8464e8d4a510006131dc565b8590613360565b935050505b611173836001015461116d64e8d4a51000610a1b8688600001546131dc90919063ffffffff16565b906132a3565b9450505050505b92915050565b6003546001600160a01b031681565b611197612e70565b6001600160a01b03166111a86126e5565b6001600160a01b0316146111f1576040805162461bcd60e51b81526020600482018190526024820152600080516020613e6c833981519152604482015290519081900360640190fd5b6002546001600160a01b038281169116141561123e5760405162461bcd60e51b8152600401808060200182810382526023815260200180613f996023913960400191505060405180910390fd5b611249600a826133be565b61129a576040805162461bcd60e51b815260206004820152601c60248201527f72656d6f7665506f6f6c3a20706f6f6c206e6f74206164642079657400000000604482015290519081900360640190fd5b604080516370a0823160e01b815230600482015290516001600160a01b038316916370a08231916024808301926020929190829003018186803b1580156112e057600080fd5b505afa1580156112f4573d6000803e3d6000fd5b505050506040513d602081101561130a57600080fd5b50511561135e576040805162461bcd60e51b815260206004820152601a60248201527f72656d6f7665506f6f6c3a20706f6f6c206e6f7420656d707479000000000000604482015290519081900360640190fd5b6113666119e1565b6001600160a01b0381166000908152600c6020526040902054600e5461138b916132a3565b600e556113a68161139d600a826133f7565b600a91906134c4565b506001600160a01b03166000908152600c60205260408120818155600181018290556002810182905560030155565b6113dd612e70565b6001600160a01b03166113ee6126e5565b6001600160a01b031614611437576040805162461bcd60e51b81526020600482018190526024820152600080516020613e6c833981519152604482015290519081900360640190fd5b6001600160a01b0383161580159061145957506001600160a01b038316600114155b6114945760405162461bcd60e51b81526004018080602001828103825260398152602001806140c16039913960400191505060405180910390fd5b61149f600a846133be565b6114da5760405162461bcd60e51b8152600401808060200182810382526024815260200180613cd16024913960400191505060405180910390fd5b6114e26119e1565b6001600160a01b0383166000908152600c6020526040902054600e5461151391849161150d916132a3565b90613360565b600e556001600160a01b039092166000908152600c6020526040902090815560030155565b611540612e70565b6001600160a01b03166115516126e5565b6001600160a01b03161461159a576040805162461bcd60e51b81526020600482018190526024820152600080516020613e6c833981519152604482015290519081900360640190fd5b60648111156115e8576040805162461bcd60e51b81526020600482015260156024820152747365745265664270733a3a6261642072656642707360581b604482015290519081900360640190fd5b6115f06119e1565b60078190556040805182815290517f5596a3fb1cf7d976a0d68cf433833e2abf8922c45ba5213d682555abba37c9499181900360200190a150565b611633612e70565b6001600160a01b03166116446126e5565b6001600160a01b03161461168d576040805162461bcd60e51b81526020600482018190526024820152600080516020613e6c833981519152604482015290519081900360640190fd5b6001600160a01b03821660009081526010602052604090205460ff166116e45760405162461bcd60e51b81526004018080602001828103825260458152602001806140526045913960600191505060405180910390fd5b6001600160a01b0382166000908152601160205260408120906117088260016135d3565b6001600160a01b031614156117225761172081612d0c565b505b61172c8183612d4a565b50816001600160a01b0316836001600160a01b03167f3d744029323ee9a48b6e3067d6f614fb9542fb23c76df2053f783d4244d814b960405160405180910390a3505050565b600f5481565b611780612e70565b6001600160a01b03166117916126e5565b6001600160a01b0316146117da576040805162461bcd60e51b81526020600482018190526024820152600080516020613e6c833981519152604482015290519081900360640190fd5b6103e8811115611829576040805162461bcd60e51b81526020600482015260156024820152747365744465764270733a3a6261642064657642707360581b604482015290519081900360640190fd5b6118316119e1565b60058190556040805182815290517f1e59efd4b015a26bfc328db57b6753ffa0139e8010ff1a5aa48a6471b5332c919181900360200190a150565b82611896611878612e70565b6001600160a01b0383166000908152601160205260409020906133be565b6118d15760405162461bcd60e51b8152600401808060200182810382526028815260200180613d156028913960400191505060405180910390fd5b600254604080516340c10f1960e01b81526001600160a01b03868116600483015260248201869052915191909216916340c10f1991604480830192600092919082900301818387803b15801561192657600080fd5b505af115801561193a573d6000803e3d6000fd5b5050505050505050565b61194c612e70565b6001600160a01b031661195d6126e5565b6001600160a01b0316146119a6576040805162461bcd60e51b81526020600482018190526024820152600080516020613e6c833981519152604482015290519081900360640190fd5b60098190556040805182815290517fa0be54773ac26c27d6d0e44698c6b7c95df74fcf44847d1561849a34fc48b0789181900360200190a150565b6001600052600b6020527f72c6bfb7988af3a1efa6568f02a999bc52252641c659d85961ca3d372b57d5cf546001600160a01b03165b6001600160a01b038116600114611a4357611a3181611e5f565b611a3c600a826135d3565b9050611a17565b50565b60026001541415611a8c576040805162461bcd60e51b815260206004820152601f6024820152600080516020613cf5833981519152604482015290519081900360640190fd5b60026001556001600160a01b038082166000908152600d60209081526040808320938616835292905220611abe612e70565b60028201546001600160a01b03908116911614611b22576040805162461bcd60e51b815260206004820152601e60248201527f656d657267656e637957697468647261773a206f6e6c792066756e6465720000604482015290519081900360640190fd5b8054611b3a906001600160a01b0384169085906135f6565b805460408051918252516001600160a01b0380851692908616917ff24ef89f38eadc1bde50701ad6e4d6d11a2dc24f7cf834a486991f38833285049181900360200190a36000808255600180830191909155600290910180546001600160a01b031916905580555050565b60026001541415611beb576040805162461bcd60e51b815260206004820152601f6024820152600080516020613cf5833981519152604482015290519081900360640190fd5b60026001556001600160a01b038082166000908152600c60209081526040808320600d83528184209487168452939091529020611c2783611e5f565b611c318484612e74565b60028201548154611c4c9164e8d4a5100091610a1b916131dc565b6001918201558055505050565b60085481565b6006546001600160a01b031681565b611c76612e70565b6001600160a01b0316611c876126e5565b6001600160a01b031614611cd0576040805162461bcd60e51b81526020600482018190526024820152600080516020613e6c833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b611d22612e70565b6001600160a01b0316611d336126e5565b6001600160a01b031614611d7c576040805162461bcd60e51b81526020600482018190526024820152600080516020613e6c833981519152604482015290519081900360640190fd5b6001600160a01b03821660009081526010602052604090205460ff16611dd35760405162461bcd60e51b8152600401808060200182810382526048815260200180613fbc6048913960600191505060405180910390fd5b6001600160a01b0382166000908152601160205260409020611e0182611df983826133f7565b8391906134c4565b50816001600160a01b0316836001600160a01b03167fa8c3c290cefaeb1444073366880836da0f1d35e164c7163216e5d0e2c979e5f760405160405180910390a3505050565b60055481565b60116020526000908152604090205481565b6001600160a01b0381166000908152600c6020526040902060018101544311611e885750611a43565b6000826001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611ed757600080fd5b505afa158015611eeb573d6000803e3d6000fd5b505050506040513d6020811015611f0157600080fd5b5051905080611f17575043600190910155611a43565b6000611f278360010154436133e3565b90506000611f4e600e54610a1b866000015461111b600854876131dc90919063ffffffff16565b6002546004546005549293506001600160a01b03918216926340c10f199290911690611f839061271090610a1b9087906131dc565b6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015611fc957600080fd5b505af1158015611fdd573d6000803e3d6000fd5b50506002546003546007546001600160a01b0392831694506340c10f1993509116906120129061271090610a1b9087906131dc565b6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b15801561205857600080fd5b505af115801561206c573d6000803e3d6000fd5b5050600254600354604080516340c10f1960e01b81526001600160a01b0392831660048201526024810187905290519190921693506340c10f199250604480830192600092919082900301818387803b1580156120c857600080fd5b505af11580156120dc573d6000803e3d6000fd5b5050505061210a6120ff84610a1b64e8d4a51000856131dc90919063ffffffff16565b600286015490613360565b60028501555050436001909201919091555050565b60026001541415612165576040805162461bcd60e51b815260206004820152601f6024820152600080516020613cf5833981519152604482015290519081900360640190fd5b60026001819055546001600160a01b039081166000908152600c60209081526040808320600d835281842094871684529390915290206121a3612e70565b60028201546001600160a01b03908116911614612207576040805162461bcd60e51b815260206004820152601a60248201527f776974686472617753756761723a206f6e6c792066756e646572000000000000604482015290519081900360640190fd5b805483111561225d576040805162461bcd60e51b815260206004820152601760248201527f776974686472617753756761723a206e6f7420676f6f64000000000000000000604482015290519081900360640190fd5b600254612272906001600160a01b0316611e5f565b6002546122899085906001600160a01b0316612e74565b82156122bb57805461229b90846132a3565b81556122bb6122a8612e70565b6002546001600160a01b031690856135f6565b600282015481546122d69164e8d4a5100091610a1b916131dc565b600182015580546122f4576002810180546001600160a01b03191690555b6002546001600160a01b0390811690851661230d612e70565b835460408051918252516001600160a01b0392909216917f3115d1449a7b732c986cba18244e897a450f61e1bb8d589cd2e69e6c8924f9f79181900360200190a45050600180555050565b82826123648282612dfb565b61239f5760405162461bcd60e51b8152600401808060200182810382526031815260200180613d976031913960400191505060405180910390fd5b600260015414156123e5576040805162461bcd60e51b815260206004820152601f6024820152600080516020613cf5833981519152604482015290519081900360640190fd5b60026001556001600160a01b0384161580159061240c57506001600160a01b038416600114155b6124475760405162461bcd60e51b81526004018080602001828103825260398152602001806140c16039913960400191505060405180910390fd5b6002546001600160a01b03858116911614156124945760405162461bcd60e51b8152600401808060200182810382526021815260200180613e2a6021913960400191505060405180910390fd5b61249f600a856133be565b6124e3576040805162461bcd60e51b815260206004820152601060248201526f19195c1bdcda5d0e881b9bc81c1bdbdb60821b604482015290519081900360640190fd5b6001600160a01b038085166000908152600c60209081526040808320600d83528184208a86168552909252909120600281015491929091161561258357612528612e70565b60028201546001600160a01b03908116911614612583576040805162461bcd60e51b81526020600482015260146024820152733232b837b9b4ba1d1037b7363c90333ab73232b960611b604482015290519081900360640190fd5b61258c86611e5f565b80541561259d5761259d8787612e74565b60028101546001600160a01b03166125da576125b7612e70565b6002820180546001600160a01b0319166001600160a01b03929092169190911790555b84156126625760006125ff612710610a1b8560030154896131dc90919063ffffffff16565b905080156126355761261186826132a3565b955061263561261e612e70565b6004546001600160a01b038a811692911684613300565b612652612640612e70565b6001600160a01b038916903089613300565b815461265e9087613360565b8255505b6002820154815461267d9164e8d4a5100091610a1b916131dc565b60018201556001600160a01b03808716908816612698612e70565b6001600160a01b03167f7cfff908a4b583f36430b25d75964c458d8ede8a99bd61be750e97ee1b2f3a96886040518082815260200191505060405180910390a45050600180555050505050565b6000546001600160a01b031690565b600c6020526000908152604090208054600182015460028301546003909301549192909184565b6002546001600160a01b031681565b60095481565b600a5481565b61273e612e70565b6001600160a01b031661274f6126e5565b6001600160a01b031614612798576040805162461bcd60e51b81526020600482018190526024820152600080516020613e6c833981519152604482015290519081900360640190fd5b6127a06119e1565b6008805490829055604080518281526020810184905281517ffdb01ec377cc02ae17303f4a9fcc1222ec17f21497f1be21a4b72281d12c85a7929181900390910190a15050565b6127ef612e70565b6001600160a01b03166128006126e5565b6001600160a01b031614612849576040805162461bcd60e51b81526020600482018190526024820152600080516020613e6c833981519152604482015290519081900360640190fd5b6001600160a01b0381161580159061286b57506001600160a01b038116600114155b6128a65760405162461bcd60e51b815260040180806020018281038252603c815260200180613dc8603c913960400191505060405180910390fd5b600480546001600160a01b0319166001600160a01b0383169081179091556040517ff5721dfa6ddbf8e4a2cd38b2152fff4008050b9b37de59ae1e022dde4bd5df7390600090a250565b60026001541415612936576040805162461bcd60e51b815260206004820152601f6024820152600080516020613cf5833981519152604482015290519081900360640190fd5b60026001556001600160a01b0382161580159061295d57506001600160a01b038216600114155b6129985760405162461bcd60e51b81526004018080602001828103825260398152602001806140c16039913960400191505060405180910390fd5b6002546001600160a01b03838116911614156129e55760405162461bcd60e51b815260040180806020018281038252602381526020018061402f6023913960400191505060405180910390fd5b6129f0600a836133be565b612a35576040805162461bcd60e51b81526020600482015260116024820152701dda5d1a191c985dce881b9bc81c1bdbdb607a1b604482015290519081900360640190fd5b6001600160a01b038083166000908152600c60209081526040808320600d83528184209488168452939091529020612a6b612e70565b60028201546001600160a01b03908116911614612ac7576040805162461bcd60e51b81526020600482015260156024820152743bb4ba34323930bb9d1037b7363c90333ab73232b960591b604482015290519081900360640190fd5b8054831115612b12576040805162461bcd60e51b81526020600482015260126024820152711dda5d1a191c985dce881b9bdd0819dbdbd960721b604482015290519081900360640190fd5b612b1b84611e5f565b612b258585612e74565b8215612b55578054612b3790846132a3565b8155612b55612b44612e70565b6001600160a01b03861690856135f6565b60028201548154612b709164e8d4a5100091610a1b916131dc565b60018201558054612b8e576002810180546001600160a01b03191690555b836001600160a01b0316856001600160a01b0316612baa612e70565b6001600160a01b03167f3115d1449a7b732c986cba18244e897a450f61e1bb8d589cd2e69e6c8924f9f7866040518082815260200191505060405180910390a4505060018055505050565b6004546001600160a01b031681565b612c0c612e70565b6001600160a01b0316612c1d6126e5565b6001600160a01b031614612c66576040805162461bcd60e51b81526020600482018190526024820152600080516020613e6c833981519152604482015290519081900360640190fd5b6001600160a01b038116612cab5760405162461bcd60e51b8152600401808060200182810382526026815260200180613d3d6026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60075481565b612d14613c6b565b5060016000818152828201602090815260409182902080546001600160a01b031916909317909255805191820190529054815290565b612d52613c6b565b612d5c83836133be565b15612d985760405162461bcd60e51b815260040180806020018281038252602b815260200180614004602b913960400191505060405180910390fd5b50600160008181528382016020908152604080832080546001600160a01b039687168086528386208054989092166001600160a01b0319988916179091559385905280549095169092179093558354909101928390558051918201905290815290565b6001600160a01b03811660009081526010602052604081205460ff1615612e4c57612e45612e27612e70565b6001600160a01b0384166000908152601160205260409020906133be565b905061117a565b612e54612e70565b6001600160a01b0316836001600160a01b031614905092915050565b3390565b612e7c613c7e565b506001600160a01b0381166000908152600c60209081526040918290208251608081018452815481526001820154928101929092526002810154928201929092526003909101546060820152612ed0613ca6565b506001600160a01b038083166000908152600d6020908152604080832087851684528252918290208251606081018452815481526001820154928101929092526002015490921690820152612f23612e70565b6001600160a01b031681604001516001600160a01b031614612f84576040805162461bcd60e51b81526020600482015260156024820152742fb430b93b32b9ba1d1037b7363c90333ab73232b960591b604482015290519081900360640190fd5b8051612fd7576040805162461bcd60e51b815260206004820152601c60248201527f5f686172766573743a206e6f7468696e6720746f206861727665737400000000604482015290519081900360640190fd5b6000613005826020015161116d64e8d4a51000610a1b876040015187600001516131dc90919063ffffffff16565b600254600354604080516370a0823160e01b81526001600160a01b03928316600482015290519394509116916370a0823191602480820192602092909190829003018186803b15801561305757600080fd5b505afa15801561306b573d6000803e3d6000fd5b505050506040513d602081101561308157600080fd5b50518111156130c15760405162461bcd60e51b8152600401808060200182810382526026815260200180613f016026913960400191505060405180910390fd5b6003546040805163987273e960e01b81526001600160a01b038881166004830152602482018590529151919092169163987273e991604480830192600092919082900301818387803b15801561311657600080fd5b505af115801561312a573d6000803e3d6000fd5b50505050613157613139612e70565b6001600160a01b0386166000908152601160205260409020906133be565b1561316f5761316f613167612e70565b85878461364d565b6131798582613796565b836001600160a01b0316856001600160a01b0316613195612e70565b6001600160a01b03167fd63109fd5abeceff0b6bf54fb909359dfa09a0bc2984733a6d5573dbd0c17573846040518082815260200191505060405180910390a45050505050565b6000826131eb5750600061117a565b828202828482816131f857fe5b04146132355760405162461bcd60e51b8152600401808060200182810382526021815260200180613e4b6021913960400191505060405180910390fd5b9392505050565b6000808211613292576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b81838161329b57fe5b049392505050565b6000828211156132fa576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b17905261335a90859061399d565b50505050565b600082820183811015613235576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b5490565b6001600160a01b03818116600090815260018401602052604090205416151592915050565b6009546000906132359061111b84866132a3565b6001600081815290830160205260408120546001600160a01b03168061344e5760405162461bcd60e51b815260040180806020018281038252603a815260200180613f5f603a913960400191505060405180910390fd5b60005b6001600160a01b0382166001146134b9576001600160a01b038281166000908152600187016020526040902054811690851614156134915750905061117a565b6001600160a01b03918216600090815260018087016020526040909120549092169101613451565b506001949350505050565b6134cc613c6b565b6134d684846133be565b6135115760405162461bcd60e51b815260040180806020018281038252602b81526020018061411f602b913960400191505060405180910390fd5b6001600160a01b03828116600090815260018601602052604090205481169084161461356e5760405162461bcd60e51b81526004018080602001828103825260258152602001806140fa6025913960400191505060405180910390fd5b506001600160a01b0382811660008181526001860160209081526040808320805487871685528285208054919097166001600160a01b031991821617909655939092528254909316909155845460001901808655815192830190915281529392505050565b6001600160a01b0380821660009081526001840160205260409020541692915050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261364890849061399d565b505050565b61365f846001600160a01b0316613a4e565b6136685761335a565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b0316632a7862d560e11b17815292518251600094928916939282918083835b602083106136e85780518252601f1990920191602091820191016136c9565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461374a576040519150601f19603f3d011682016040523d82523d6000602084013e61374f565b606091505b505090508061378f5760405162461bcd60e51b8152600401808060200182810382526034815260200180613d636034913960400191505060405180910390fd5b5050505050565b6006546137ab906001600160a01b0316613a4e565b6137b457613999565b6003546006546007546001600160a01b039283169263987273e99216906137e49061271090610a1b9087906131dc565b6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b15801561382a57600080fd5b505af115801561383e573d6000803e3d6000fd5b5050600654600754600093506001600160a01b03909116915063040ea03960e31b9085906138759061271090610a1b9088906131dc565b604080516001600160a01b03909316602484015260448084019290925280518084039092018252606490920182526020810180516001600160e01b03166001600160e01b031990941693909317835290518151919290918291908083835b602083106138f25780518252601f1990920191602091820191016138d3565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613954576040519150601f19603f3d011682016040523d82523d6000602084013e613959565b606091505b50509050806136485760405162461bcd60e51b8152600401808060200182810382526038815260200180613f276038913960400191505060405180910390fd5b5050565b60606139f2826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613a549092919063ffffffff16565b80519091501561364857808060200190516020811015613a1157600080fd5b50516136485760405162461bcd60e51b815260040180806020018281038252602a815260200180614097602a913960400191505060405180910390fd5b3b151590565b6060613a638484600085613a6b565b949350505050565b606082471015613aac5760405162461bcd60e51b8152600401808060200182810382526026815260200180613e046026913960400191505060405180910390fd5b613ab585613a4e565b613b06576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b60208310613b455780518252601f199092019160209182019101613b26565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613ba7576040519150601f19603f3d011682016040523d82523d6000602084013e613bac565b606091505b5091509150613bbc828286613bc7565b979650505050505050565b60608315613bd6575081613235565b825115613be65782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613c30578181015183820152602001613c18565b50505050905090810190601f168015613c5d5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b6040518060200160405280600081525090565b6040518060800160405280600081526020016000815260200160008152602001600081525090565b6040518060600160405280600081526020016000815260200160006001600160a01b03168152509056fe736574506f6f6c3a205f7374616b65546f6b656e206e6f7420696e20746865206c6973745265656e7472616e637947756172643a207265656e7472616e742063616c6c006f6e6c795374616b65546f6b656e43616c6c6572436f6e74726163743a206261642063616c6c65724f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573735f6d61737465724368656643616c6c65653a20206661696c656420746f2065786563757465206d61737465724368656643616c6c6f6e6c795065726d6974746564546f6b656e46756e6465723a2063616c6c6572206973206e6f74207065726d6974746564736574446576416464726573733a205f64657641646472206d757374206e6f742062652061646472657373283029206f722061646472657373283129416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c6465706f7369743a20757365206465706f736974537567617220696e7374656164536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572736574526566416464726573733a205f72656641646472206d757374206e6f742062652061646472657373283029206f722061646472657373283129616464506f6f6c3a205f7374616b65546f6b656e206d757374206e6f742062652061646472657373283029206f7220616464726573732831295f686172766573743a207761697420776861742e2e206e6f7420656e6f7567682053554741525f726566657272616c43616c6c65653a20206661696c656420746f206578656375746520757064617465526566657272616c5265776172644c696e6b4c6973743a3a67657450726576696f75734f663a3a20706c6561736520696e697420746865206c696e6b65646c69737420666972737472656d6f7665506f6f6c3a2063616e27742072656d6f766520535547415220706f6f6c72656d6f76655374616b65546f6b656e43616c6c6572436f6e74726163743a2074686520706f6f6c20646f65736e277420616c6c6f77206120636f6e74726163742063616c6c65724c696e6b4c6973743a3a6164643a3a206164647220697320616c726561647920696e20746865206c69737477697468647261773a20757365207769746864726177537567617220696e73746561646164645374616b65546f6b656e43616c6c6572436f6e74726163743a2074686520706f6f6c20646f65736e277420616c6c6f77206120636f6e74726163742063616c6c65725361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564736574506f6f6c3a205f7374616b65546f6b656e206d757374206e6f742062652061646472657373283029206f7220616464726573732831294c696e6b4c6973743a3a72656d6f76653a3a2077726f6e672070726576436f6e73756d65724c696e6b4c6973743a3a72656d6f76653a3a2061646472206e6f742077686974656c697374656420796574a26469706673582212204836b6baae3e9dfcfa505ce8acaaf91f0126c7f1f90d2e34a658a5bcc91a323f64736f6c634300060c0033636f6e7374727563746f723a205f72656641646472206d757374206e6f742062652061646472657373283029206f722061646472657373283129636f6e7374727563746f723a205f64657641646472206d757374206e6f742062652061646472657373283029206f7220616464726573732831294c696e6b4c6973743a3a6164643a3a206164647220697320616c726561647920696e20746865206c697374000000000000000000000000d3ccbf3867ff0204730173eb4cad3c4b5fd07c6900000000000000000000000059d7175203f0330fe163e3e5ac9dea55dd31039600000000000000000000000019ec14906a4d84eccca29cdf6428d08ce9cacdf900000000000000000000000013319b5cab59084189f20bd66b2e9e12b52c2a6a0000000000000000000000000000000000000000000000004563918244f4000000000000000000000000000000000000000000000000000000000000031735c1

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

000000000000000000000000d3ccbf3867ff0204730173eb4cad3c4b5fd07c6900000000000000000000000059d7175203f0330fe163e3e5ac9dea55dd31039600000000000000000000000019ec14906a4d84eccca29cdf6428d08ce9cacdf900000000000000000000000013319b5cab59084189f20bd66b2e9e12b52c2a6a0000000000000000000000000000000000000000000000004563918244f4000000000000000000000000000000000000000000000000000000000000031735c1

-----Decoded View---------------
Arg [0] : _sugar (address): 0xd3ccbf3867ff0204730173eb4cad3c4b5fd07c69
Arg [1] : _stake (address): 0x59d7175203f0330fe163e3e5ac9dea55dd310396
Arg [2] : _devAddr (address): 0x19ec14906a4d84eccca29cdf6428d08ce9cacdf9
Arg [3] : _refAddr (address): 0x13319b5cab59084189f20bd66b2e9e12b52c2a6a
Arg [4] : _sugarPerBlock (uint256): 5000000000000000000
Arg [5] : _startBlock (uint256): 51852737

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 000000000000000000000000d3ccbf3867ff0204730173eb4cad3c4b5fd07c69
Arg [1] : 00000000000000000000000059d7175203f0330fe163e3e5ac9dea55dd310396
Arg [2] : 00000000000000000000000019ec14906a4d84eccca29cdf6428d08ce9cacdf9
Arg [3] : 00000000000000000000000013319b5cab59084189f20bd66b2e9e12b52c2a6a
Arg [4] : 0000000000000000000000000000000000000000000000004563918244f40000
Arg [5] : 00000000000000000000000000000000000000000000000000000000031735c1


Deployed ByteCode Sourcemap

34214:20267:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35904:61;;;;;;;;;;;;;;;;-1:-1:-1;35904:61:0;-1:-1:-1;;;;;35904:61:0;;:::i;:::-;;;;;;;;;;;;;;;;;;49003:1123;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;49003:1123:0;;;;;;;;:::i;:::-;;40489:275;;;;;;;;;;;;;;;;-1:-1:-1;40489:275:0;-1:-1:-1;;;;;40489:275:0;;:::i;51367:438::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;51367:438:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51367:438:0;;-1:-1:-1;51367:438:0;-1:-1:-1;51367:438:0;:::i;43505:97::-;;;:::i;:::-;;;;;;;;;;;;;;;;35549:73;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;35549:73:0;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;-1:-1:-1;;;;;35549:73:0;;;;;;;;;;;;;;38679:236;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;38679:236:0;;;;;;;;;;:::i;35713:39::-;;;:::i;41299:741::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;41299:741:0;;;;;;;;;;;;;:::i;44390:778::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;44390:778:0;;;;;;;;;;:::i;35020:19::-;;;:::i;:::-;;;;-1:-1:-1;;;;;35020:19:0;;;;;;;;;;;;;;42784:679;;;;;;;;;;;;;;;;-1:-1:-1;42784:679:0;-1:-1:-1;;;;;42784:679:0;;:::i;42133:593::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;42133:593:0;;;;;;;;;;;;;:::i;40770:193::-;;;;;;;;;;;;;;;;-1:-1:-1;40770:193:0;;:::i;38982:499::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;38982:499:0;;;;;;;;;;:::i;35806:25::-;;;:::i;40289:194::-;;;;;;;;;;;;;;;;-1:-1:-1;40289:194:0;;:::i;54285:193::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;54285:193:0;;;;;;;;;;;;;;;;;:::i;43859:162::-;;;;;;;;;;;;;;;;-1:-1:-1;43859:162:0;;:::i;45247:208::-;;;:::i;53695:449::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;53695:449:0;;;;;;;;;;:::i;50982:340::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;50982:340:0;;;;;;;;;;:::i;35234:37::-;;;:::i;35149:31::-;;;:::i;16948:148::-;;;:::i;39550:452::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;39550:452:0;;;;;;;;;;:::i;35099:21::-;;;:::i;36026:66::-;;;;;;;;;;;;;;;;-1:-1:-1;36026:66:0;-1:-1:-1;;;;;36026:66:0;;:::i;45527:858::-;;;;;;;;;;;;;;;;-1:-1:-1;45527:858:0;-1:-1:-1;;;;;45527:858:0;;:::i;50153:774::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;50153:774:0;;;;;;;;:::i;46447:1405::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;46447:1405:0;;;;;;;;;;;;;;;;;:::i;16297:87::-;;;:::i;35439:53::-;;;;;;;;;;;;;;;;-1:-1:-1;35439:53:0;-1:-1:-1;;;;;35439:53:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34966:28;;;:::i;35315:39::-;;;:::i;35383:26::-;;;:::i;40996:246::-;;;;;;;;;;;;;;;;-1:-1:-1;40996:246:0;;:::i;40008:275::-;;;;;;;;;;;;;;;;-1:-1:-1;40008:275:0;-1:-1:-1;;;;;40008:275:0;;:::i;47896:1066::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;47896:1066:0;;;;;;;;;;;;;;;;;:::i;35063:31::-;;;:::i;17251:244::-;;;;;;;;;;;;;;;;-1:-1:-1;17251:244:0;-1:-1:-1;;;;;17251:244:0;;:::i;35185:21::-;;;:::i;35904:61::-;;;;;;;;;;;;;;;:::o;49003:1123::-;49128:5;;49114:4;;-1:-1:-1;;;;;49128:5:0;38213:36;49114:4;49128:5;38213:9;:36::i;:::-;38205:98;;;;-1:-1:-1;;;38205:98:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14293:1:::1;14899:7;;:19;;14891:63;;;::::0;;-1:-1:-1;;;14891:63:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;14891:63:0;;;;;;;;;;;;;::::1;;14293:1;15032:7;:18:::0;;;49205:5;;-1:-1:-1;;;;;49205:5:0;;::::2;49164:21;49188:24:::0;;;:8:::2;:24;::::0;;;;;;;49243:8:::2;:24:::0;;;;;:30;;::::2;::::0;;;;;;;;49286:13;;::::2;::::0;49188:24;;49243:30;49286:13:::2;:27:::0;49282:96:::2;;49340:12;:10;:12::i;:::-;49323:13;::::0;::::2;::::0;-1:-1:-1;;;;;49323:13:0;;::::2;:29:::0;::::2;;49315:63;;;::::0;;-1:-1:-1;;;49315:63:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;49315:63:0;;;;;;;;;;;;;::::2;;49406:5;::::0;49387:26:::2;::::0;-1:-1:-1;;;;;49406:5:0::2;49387:10;:26::i;:::-;49426:11:::0;;:15;49422:51:::2;;49466:5;::::0;49443:30:::2;::::0;49452:4;;-1:-1:-1;;;;;49466:5:0::2;49443:8;:30::i;:::-;49484:13;::::0;::::2;::::0;-1:-1:-1;;;;;49484:13:0::2;49480:61;;49529:12;:10;:12::i;:::-;49513:13;::::0;::::2;:28:::0;;-1:-1:-1;;;;;;49513:28:0::2;-1:-1:-1::0;;;;;49513:28:0;;;::::2;::::0;;;::::2;::::0;;49480:61:::2;49552:11:::0;;49548:436:::2;;49574:24;49601:39;49634:5;49601:28;49613:4;:15;;;49601:7;:11;;:28;;;;:::i;:::-;:32:::0;::::2;:39::i;:::-;49574:66:::0;-1:-1:-1;49653:20:0;;49649:186:::2;;49696:29;:7:::0;49708:16;49696:11:::2;:29::i;:::-;49686:39;;49736:89;49784:12;:10;:12::i;:::-;49799:7;::::0;49751:5:::2;::::0;-1:-1:-1;;;;;49751:5:0;;::::2;::::0;49736:89;49799:7:::2;49808:16:::0;49736:39:::2;:89::i;:::-;49843:86;49891:12;:10;:12::i;:::-;49858:5;::::0;-1:-1:-1;;;;;49858:5:0::2;::::0;49914:4:::2;49921:7:::0;49843:39:::2;:86::i;:::-;49952:11:::0;;:24:::2;::::0;49968:7;49952:15:::2;:24::i;:::-;49938:38:::0;;-1:-1:-1;49548:436:0::2;50024:21;::::0;::::2;::::0;50008:11;;:48:::2;::::0;50051:4:::2;::::0;50008:38:::2;::::0;:15:::2;:38::i;:48::-;49990:15;::::0;::::2;:66:::0;50104:5:::2;::::0;-1:-1:-1;;;;;50104:5:0;;::::2;::::0;50068:52;::::2;50076:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;50068:52:0::2;;50112:7;50068:52;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;14249:1:0::1;15211:22:::0;;-1:-1:-1;;;;49003:1123:0:o;40489:275::-;16528:12;:10;:12::i;:::-;-1:-1:-1;;;;;16517:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;16517:23:0;;16509:68;;;;;-1:-1:-1;;;16509:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16509:68:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;40572:22:0;::::1;::::0;;::::1;::::0;:48:::1;;-1:-1:-1::0;;;;;;40598:22:0;::::1;40618:1;40598:22;;40572:48;40556:142;;;;-1:-1:-1::0;;;40556:142:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40705:7;:18:::0;;-1:-1:-1;;;;;;40705:18:0::1;-1:-1:-1::0;;;;;40705:18:0;::::1;::::0;;::::1;::::0;;;40735:23:::1;::::0;::::1;::::0;-1:-1:-1;;40735:23:0::1;40489:275:::0;:::o;51367:438::-;14293:1;14899:7;;:19;;14891:63;;;;;-1:-1:-1;;;14891:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;14891:63:0;;;;;;;;;;;;;;;14293:1;15032:7;:18;51474:9:::1;51469:331;51489:23:::0;;::::1;51469:331;;;51528:21;51552:8;:25;51561:12;;51574:1;51561:15;;;;;;;;;;;;;-1:-1:-1::0;;;;;51561:15:0::1;-1:-1:-1::0;;;;;51552:25:0::1;-1:-1:-1::0;;;;;51552:25:0::1;;;;;;;;;;;;51528:49;;51586:21;51610:8;:25;51619:12;;51632:1;51619:15;;;;;;;-1:-1:-1::0;;;;;51619:15:0::1;::::0;;::::1;::::0;;;::::1;;::::0;::::1;51610:25:::0;;;;::::1;::::0;;;;-1:-1:-1;51610:25:0;;;;-1:-1:-1;51610:25:0;;;:31;;::::1;::::0;;;;;;;-1:-1:-1;51650:27:0::1;51661:12:::0;;51674:1;51661:15;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;51661:15:0::1;51650:10;:27::i;:::-;51686:31;51695:4;51701:12;;51714:1;51701:15;;;;;;;;;;;;;-1:-1:-1::0;;;;;51701:15:0::1;51686:8;:31::i;:::-;51760:21;::::0;::::1;::::0;51744:11;;:48:::1;::::0;51787:4:::1;::::0;51744:38:::1;::::0;:15:::1;:38::i;:48::-;51726:15;::::0;;::::1;:66:::0;51514:3;;;::::1;::::0;-1:-1:-1;51469:331:0::1;;;-1:-1:-1::0;;14249:1:0;15211:22;;-1:-1:-1;;51367:438:0:o;43505:97::-;43559:7;43582:14;:5;:12;:14::i;:::-;43575:21;;43505:97;:::o;35549:73::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;35549:73:0;;:::o;38679:236::-;16528:12;:10;:12::i;:::-;-1:-1:-1;;;;;16517:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;16517:23:0;;16509:68;;;;;-1:-1:-1;;;16509:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16509:68:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;38785:42:0;::::1;;::::0;;;:29:::1;:42;::::0;;;;;;;;:55;;-1:-1:-1;;38785:55:0::1;::::0;::::1;;::::0;;::::1;::::0;;;38852:57;;;;;;;::::1;::::0;;;;;;;;::::1;38679:236:::0;;:::o;35713:39::-;;;;:::o;41299:741::-;16528:12;:10;:12::i;:::-;-1:-1:-1;;;;;16517:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;16517:23:0;;16509:68;;;;;-1:-1:-1;;;16509:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16509:68:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;41450:25:0;::::1;::::0;;::::1;::::0;:54:::1;;-1:-1:-1::0;;;;;;41479:25:0;::::1;41502:1;41479:25;;41450:54;41434:145;;;;-1:-1:-1::0;;;41434:145:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41595:22;:5;41605:11:::0;41595:9:::1;:22::i;:::-;41594:23;41586:67;;;::::0;;-1:-1:-1;;;41586:67:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;41662:17;:15;:17::i;:::-;41688:23;41729:10;;41714:12;:25;:53;;41757:10;;41714:53;;;41742:12;41714:53;41792:15;::::0;41688:79;;-1:-1:-1;41792:32:0::1;::::0;41812:11;41792:19:::1;:32::i;:::-;41774:15;:50:::0;41831:22:::1;:5;41841:11:::0;41831:9:::1;:22::i;:::-;-1:-1:-1::0;41884:150:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;41884:150:0;;;;;;;;;;;;-1:-1:-1;;;;;41860:21:0;;::::1;::::0;;:8:::1;:21:::0;;;;:174;;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;41299:741::o;44390:778::-;-1:-1:-1;;;;;44520:21:0;;;44480:7;44520:21;;;:8;:21;;;;;;;;44572:8;:21;;;;;:28;;;;;;;;;;;44634:21;;;;44688:44;;-1:-1:-1;;;44688:44:0;;44726:4;44688:44;;;;;;44480:7;;44520:21;44572:28;;44634:21;;44480:7;;44688:29;;:44;;;;;44520:21;44688:44;;;;;44520:21;44688:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44688:44:0;44758:20;;;;44688:44;;-1:-1:-1;44743:12:0;:35;:59;;;;-1:-1:-1;44782:20:0;;;44743:59;44739:346;;;44813:18;44834:49;44848:4;:20;;;44870:12;44834:13;:49::i;:::-;44813:70;;44892:19;44914:71;44969:15;;44914:50;44948:4;:15;;;44914:29;44929:13;;44914:10;:14;;:29;;;;:::i;:::-;:33;;:50::i;:71::-;44892:93;-1:-1:-1;45013:64:0;45034:42;45060:15;45034:21;44892:93;45050:4;45034:15;:21::i;:42::-;45013:16;;:20;:64::i;:::-;44994:83;;44739:346;;;45098:64;45146:4;:15;;;45098:43;45136:4;45098:33;45114:16;45098:4;:11;;;:15;;:33;;;;:::i;:43::-;:47;;:64::i;:::-;45091:71;;;;;;44390:778;;;;;:::o;35020:19::-;;;-1:-1:-1;;;;;35020:19:0;;:::o;42784:679::-;16528:12;:10;:12::i;:::-;-1:-1:-1;;;;;16517:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;16517:23:0;;16509:68;;;;;-1:-1:-1;;;16509:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16509:68:0;;;;;;;;;;;;;;;42891:5:::1;::::0;-1:-1:-1;;;;;42868:29:0;;::::1;42891:5:::0;::::1;42868:29;;42860:77;;;;-1:-1:-1::0;;;42860:77:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42952:22;:5;42962:11:::0;42952:9:::1;:22::i;:::-;42944:63;;;::::0;;-1:-1:-1;;;42944:63:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;43022:44;::::0;;-1:-1:-1;;;43022:44:0;;43060:4:::1;43022:44;::::0;::::1;::::0;;;-1:-1:-1;;;;;43022:29:0;::::1;::::0;::::1;::::0;:44;;;;;::::1;::::0;;;;;;;;:29;:44;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;43022:44:0;:49;43014:88:::1;;;::::0;;-1:-1:-1;;;43014:88:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;43111:17;:15;:17::i;:::-;-1:-1:-1::0;;;;;43175:21:0;::::1;;::::0;;;:8:::1;:21;::::0;;;;:32;43155:15:::1;::::0;:53:::1;::::0;:19:::1;:53::i;:::-;43137:15;:71:::0;43215:59:::1;43228:11:::0;43241:32:::1;:5;43228:11:::0;43241:19:::1;:32::i;:::-;43215:5;::::0;:59;:12:::1;:59::i;:::-;-1:-1:-1::0;;;;;;43281:21:0::1;43316:1;43281:21:::0;;;:8:::1;:21;::::0;;;;:36;;;43324:37:::1;::::0;::::1;:41:::0;;;43372:38:::1;::::0;::::1;:42:::0;;;43421:32:::1;;:36:::0;42784:679::o;42133:593::-;16528:12;:10;:12::i;:::-;-1:-1:-1;;;;;16517:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;16517:23:0;;16509:68;;;;;-1:-1:-1;;;16509:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16509:68:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;42284:25:0;::::1;::::0;;::::1;::::0;:54:::1;;-1:-1:-1::0;;;;;;42313:25:0;::::1;42336:1;42313:25;;42284:54;42268:145;;;;-1:-1:-1::0;;;42268:145:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42428:22;:5;42438:11:::0;42428:9:::1;:22::i;:::-;42420:71;;;;-1:-1:-1::0;;;42420:71:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42500:17;:15;:17::i;:::-;-1:-1:-1::0;;;;;42564:21:0;::::1;;::::0;;;:8:::1;:21;::::0;;;;:32;42544:15:::1;::::0;:70:::1;::::0;42602:11;;42544:53:::1;::::0;:19:::1;:53::i;:::-;:57:::0;::::1;:70::i;:::-;42526:15;:88:::0;-1:-1:-1;;;;;42621:21:0;;::::1;;::::0;;;:8:::1;:21;::::0;;;;:46;;;42674:32:::1;;:46:::0;42133:593::o;40770:193::-;16528:12;:10;:12::i;:::-;-1:-1:-1;;;;;16517:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;16517:23:0;;16509:68;;;;;-1:-1:-1;;;16509:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16509:68:0;;;;;;;;;;;;;;;40851:3:::1;40840:7;:14;;40832:48;;;::::0;;-1:-1:-1;;;40832:48:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;40832:48:0;;;;;;;;;;;;;::::1;;40887:17;:15;:17::i;:::-;40911:6;:16:::0;;;40939:18:::1;::::0;;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;40770:193:::0;:::o;38982:499::-;16528:12;:10;:12::i;:::-;-1:-1:-1;;;;;16517:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;16517:23:0;;16509:68;;;;;-1:-1:-1;;;16509:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16509:68:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;39099:42:0;::::1;;::::0;;;:29:::1;:42;::::0;;;;;::::1;;39083:145;;;;-1:-1:-1::0;;;39083:145:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;39264:38:0;::::1;39235:26;39264:38:::0;;;:25:::1;:38;::::0;;;;;39313:30:::1;39264:38:::0;17591:1:::1;39313:14;:30::i;:::-;-1:-1:-1::0;;;;;39313:48:0::1;;39309:82;;;39372:11;:4;:9;:11::i;:::-;;39309:82;39397:17;:4:::0;39406:7;39397:8:::1;:17::i;:::-;;39467:7;-1:-1:-1::0;;;;;39426:49:0::1;39454:11;-1:-1:-1::0;;;;;39426:49:0::1;;;;;;;;;;;16588:1;38982:499:::0;;:::o;35806:25::-;;;;:::o;40289:194::-;16528:12;:10;:12::i;:::-;-1:-1:-1;;;;;16517:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;16517:23:0;;16509:68;;;;;-1:-1:-1;;;16509:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16509:68:0;;;;;;;;;;;;;;;40370:4:::1;40359:7;:15;;40351:49;;;::::0;;-1:-1:-1;;;40351:49:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;40351:49:0;;;;;;;;;;;;;::::1;;40407:17;:15;:17::i;:::-;40431:6;:16:::0;;;40459:18:::1;::::0;;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;40289:194:::0;:::o;54285:193::-;54428:11;38508:56;38551:12;:10;:12::i;:::-;-1:-1:-1;;;;;38508:38:0;;;;;;:25;:38;;;;;;:42;:56::i;:::-;38500:109;;;;-1:-1:-1;;;38500:109:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54448:5:::1;::::0;:24:::1;::::0;;-1:-1:-1;;;54448:24:0;;-1:-1:-1;;;;;54448:24:0;;::::1;;::::0;::::1;::::0;;;;;;;;;:5;;;::::1;::::0;:10:::1;::::0;:24;;;;;:5:::1;::::0;:24;;;;;;;:5;;:24;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;54285:193:::0;;;;:::o;43859:162::-;16528:12;:10;:12::i;:::-;-1:-1:-1;;;;;16517:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;16517:23:0;;16509:68;;;;;-1:-1:-1;;;16509:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16509:68:0;;;;;;;;;;;;;;;43935:15:::1;:34:::0;;;43981::::1;::::0;;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;43859:162:::0;:::o;45247:208::-;45306:10;45288:15;45306:26;:10;:26;;;;-1:-1:-1;;;;;45306:26:0;45339:111;-1:-1:-1;;;;;45346:23:0;;17636:1;45346:23;45339:111;;45380:19;45391:7;45380:10;:19::i;:::-;45418:24;:5;45434:7;45418:15;:24::i;:::-;45408:34;;45339:111;;;45247:208;:::o;53695:449::-;14293:1;14899:7;;:19;;14891:63;;;;;-1:-1:-1;;;14891:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;14891:63:0;;;;;;;;;;;;;;;14293:1;15032:7;:18;-1:-1:-1;;;;;53819:21:0;;::::1;53795;53819::::0;;;:8:::1;:21;::::0;;;;;;;:27;;::::1;::::0;;;;;;53878:12:::1;:10;:12::i;:::-;53861:13;::::0;::::1;::::0;-1:-1:-1;;;;;53861:13:0;;::::1;:29:::0;::::1;;53853:72;;;::::0;;-1:-1:-1;;;53853:72:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;53980:11:::0;;53932:60:::1;::::0;-1:-1:-1;;;;;53932:32:0;::::1;::::0;53973:4;;53932:32:::1;:60::i;:::-;54043:11:::0;;54006:49:::1;::::0;;;;;;-1:-1:-1;;;;;54006:49:0;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;;::::1;::::0;;::::1;54078:1;54064:15:::0;;;54086::::1;::::0;;::::1;:19:::0;;;;54112:13:::1;::::0;;::::1;:26:::0;;-1:-1:-1;;;;;;54112:26:0::1;::::0;;15211:22;;-1:-1:-1;;53695:449:0:o;50982:340::-;14293:1;14899:7;;:19;;14891:63;;;;;-1:-1:-1;;;14891:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;14891:63:0;;;;;;;;;;;;;;;14293:1;15032:7;:18;-1:-1:-1;;;;;51096:21:0;;::::1;51072;51096::::0;;;:8:::1;:21;::::0;;;;;;;51148:8:::1;:21:::0;;;;;:27;;::::1;::::0;;;;;;;;51184:23:::1;51105:11:::0;51184:10:::1;:23::i;:::-;51214:27;51223:4;51229:11;51214:8;:27::i;:::-;51284:21;::::0;::::1;::::0;51268:11;;:48:::1;::::0;51311:4:::1;::::0;51268:38:::1;::::0;:15:::1;:38::i;:48::-;51250:15;::::0;;::::1;:66:::0;15211:22;;-1:-1:-1;;;50982:340:0:o;35234:37::-;;;;:::o;35149:31::-;;;-1:-1:-1;;;;;35149:31:0;;:::o;16948:148::-;16528:12;:10;:12::i;:::-;-1:-1:-1;;;;;16517:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;16517:23:0;;16509:68;;;;;-1:-1:-1;;;16509:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16509:68:0;;;;;;;;;;;;;;;17055:1:::1;17039:6:::0;;17018:40:::1;::::0;-1:-1:-1;;;;;17039:6:0;;::::1;::::0;17018:40:::1;::::0;17055:1;;17018:40:::1;17086:1;17069:19:::0;;-1:-1:-1;;;;;;17069:19:0::1;::::0;;16948:148::o;39550:452::-;16528:12;:10;:12::i;:::-;-1:-1:-1;;;;;16517:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;16517:23:0;;16509:68;;;;;-1:-1:-1;;;16509:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16509:68:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;39670:42:0;::::1;;::::0;;;:29:::1;:42;::::0;;;;;::::1;;39654:148;;;;-1:-1:-1::0;;;39654:148:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;39838:38:0;::::1;39809:26;39838:38:::0;;;:25:::1;:38;::::0;;;;39883:49:::1;39895:7:::0;39904:27:::1;39838:38:::0;39895:7;39904:18:::1;:27::i;:::-;39883:4:::0;;:49;:11:::1;:49::i;:::-;;39988:7;-1:-1:-1::0;;;;;39944:52:0::1;39975:11;-1:-1:-1::0;;;;;39944:52:0::1;;;;;;;;;;;16588:1;39550:452:::0;;:::o;35099:21::-;;;;:::o;36026:66::-;;;;;;;;;;;;;:::o;45527:858::-;-1:-1:-1;;;;;45615:21:0;;45591;45615;;;:8;:21;;;;;45663:20;;;;45647:12;:36;45643:65;;45694:7;;;45643:65;45714:23;45747:11;-1:-1:-1;;;;;45740:29:0;;45778:4;45740:44;;;;;;;;;;;;;-1:-1:-1;;;;;45740:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45740:44:0;;-1:-1:-1;45795:20:0;45791:93;;-1:-1:-1;45849:12:0;45826:20;;;;:35;45870:7;;45791:93;45890:18;45911:49;45925:4;:20;;;45947:12;45911:13;:49::i;:::-;45890:70;;45967:19;45989:71;46044:15;;45989:50;46023:4;:15;;;45989:29;46004:13;;45989:10;:14;;:29;;;;:::i;:71::-;46067:5;;46078:7;;46103:6;;45967:93;;-1:-1:-1;;;;;;46067:5:0;;;;:10;;46078:7;;;;46087:34;;46115:5;;46087:23;;45967:93;;46087:15;:23::i;:34::-;46067:55;;;;;;;;;;;;;-1:-1:-1;;;;;46067:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;46129:5:0;;46148;;46172:6;;-1:-1:-1;;;;;46129:5:0;;;;-1:-1:-1;46129:10:0;;-1:-1:-1;46148:5:0;;;46156:34;;46184:5;;46156:23;;:11;;:15;:23::i;:34::-;46129:62;;;;;;;;;;;;;-1:-1:-1;;;;;46129:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;46198:5:0;;46217;;46198:39;;;-1:-1:-1;;;46198:39:0;;-1:-1:-1;;;;;46217:5:0;;;46198:39;;;;;;;;;;;;:5;;;;;-1:-1:-1;46198:10:0;;-1:-1:-1;46198:39:0;;;;;:5;;:39;;;;;;;:5;;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46268:69;46294:42;46320:15;46294:21;46310:4;46294:11;:15;;:21;;;;:::i;:42::-;46268:21;;;;;:25;:69::i;:::-;46244:21;;;:93;-1:-1:-1;;46367:12:0;46344:20;;;;:35;;;;-1:-1:-1;45527:858:0;:::o;50153:774::-;14293:1;14899:7;;:19;;14891:63;;;;;-1:-1:-1;;;14891:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;14891:63:0;;;;;;;;;;;;;;;14293:1;15032:7;:18;;;50286:5;-1:-1:-1;;;;;50286:5:0;;::::1;50245:21;50269:24:::0;;;:8:::1;:24;::::0;;;;;;;50324:8:::1;:24:::0;;;;;:30;;::::1;::::0;;;;;;;;50388:12:::1;:10;:12::i;:::-;50371:13;::::0;::::1;::::0;-1:-1:-1;;;;;50371:13:0;;::::1;:29:::0;::::1;;50363:68;;;::::0;;-1:-1:-1;;;50363:68:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;50446:11:::0;;:22;-1:-1:-1;50446:22:0::1;50438:58;;;::::0;;-1:-1:-1;;;50438:58:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;50524:5;::::0;50505:26:::1;::::0;-1:-1:-1;;;;;50524:5:0::1;50505:10;:26::i;:::-;50561:5;::::0;50538:30:::1;::::0;50547:4;;-1:-1:-1;;;;;50561:5:0::1;50538:8;:30::i;:::-;50581:11:::0;;50577:148:::1;;50617:11:::0;;:24:::1;::::0;50633:7;50617:15:::1;:24::i;:::-;50603:38:::0;;50650:67:::1;50694:12;:10;:12::i;:::-;50665:5;::::0;-1:-1:-1;;;;;50665:5:0::1;::::0;50709:7;50650:35:::1;:67::i;:::-;50765:21;::::0;::::1;::::0;50749:11;;:48:::1;::::0;50792:4:::1;::::0;50749:38:::1;::::0;:15:::1;:38::i;:48::-;50731:15;::::0;::::1;:66:::0;50808:11;;50804:48:::1;;50826:13;::::0;::::1;:26:::0;;-1:-1:-1;;;;;;50826:26:0::1;::::0;;50804:48:::1;50901:5;::::0;-1:-1:-1;;;;;50901:5:0;;::::1;::::0;50864:57;::::1;50873:12;:10;:12::i;:::-;50909:11:::0;;50864:57:::1;::::0;;;;;;-1:-1:-1;;;;;50864:57:0;;;::::1;::::0;::::1;::::0;;;;::::1;::::0;;::::1;-1:-1:-1::0;;14249:1:0;15211:22;;-1:-1:-1;;50153:774:0:o;46447:1405::-;46579:4;46585:11;38213:36;38223:12;38237:11;38213:9;:36::i;:::-;38205:98;;;;-1:-1:-1;;;38205:98:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14293:1:::1;14899:7;;:19;;14891:63;;;::::0;;-1:-1:-1;;;14891:63:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;14891:63:0;;;;;;;;;;;;;::::1;;14293:1;15032:7;:18:::0;-1:-1:-1;;;;;46634:25:0;::::2;::::0;;::::2;::::0;:54:::2;;-1:-1:-1::0;;;;;;46663:25:0;::::2;46686:1;46663:25;;46634:54;46618:145;;;;-1:-1:-1::0;;;46618:145:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46801:5;::::0;-1:-1:-1;;;;;46778:29:0;;::::2;46801:5:::0;::::2;46778:29;;46770:75;;;;-1:-1:-1::0;;;46770:75:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46860:22;:5;46870:11:::0;46860:9:::2;:22::i;:::-;46852:51;;;::::0;;-1:-1:-1;;;46852:51:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;46852:51:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;46936:21:0;;::::2;46912;46936::::0;;;:8:::2;:21;::::0;;;;;;;46988:8:::2;:21:::0;;;;;:27;;::::2;::::0;;;;;;;;47028:13:::2;::::0;::::2;::::0;46936:21;;46988:27;;47028:13:::2;:27:::0;47024:95:::2;;47082:12;:10;:12::i;:::-;47065:13;::::0;::::2;::::0;-1:-1:-1;;;;;47065:13:0;;::::2;:29:::0;::::2;;47057:62;;;::::0;;-1:-1:-1;;;47057:62:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;47057:62:0;;;;;;;;;;;;;::::2;;47128:23;47139:11;47128:10;:23::i;:::-;47164:11:::0;;:15;47160:48:::2;;47181:27;47190:4;47196:11;47181:8;:27::i;:::-;47219:13;::::0;::::2;::::0;-1:-1:-1;;;;;47219:13:0::2;47215:61;;47264:12;:10;:12::i;:::-;47248:13;::::0;::::2;:28:::0;;-1:-1:-1;;;;;;47248:28:0::2;-1:-1:-1::0;;;;;47248:28:0;;;::::2;::::0;;;::::2;::::0;;47215:61:::2;47287:11:::0;;47283:430:::2;;47309:24;47336:39;47369:5;47336:28;47348:4;:15;;;47336:7;:11;;:28;;;;:::i;:39::-;47309:66:::0;-1:-1:-1;47388:20:0;;47384:183:::2;;47431:29;:7:::0;47443:16;47431:11:::2;:29::i;:::-;47421:39;;47471:86;47516:12;:10;:12::i;:::-;47531:7;::::0;-1:-1:-1;;;;;47471:36:0;;::::2;::::0;:86;47531:7:::2;47540:16:::0;47471:36:::2;:86::i;:::-;47575:83;47620:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;47575:36:0;::::2;::::0;47643:4:::2;47650:7:::0;47575:36:::2;:83::i;:::-;47681:11:::0;;:24:::2;::::0;47697:7;47681:15:::2;:24::i;:::-;47667:38:::0;;-1:-1:-1;47283:430:0::2;47753:21;::::0;::::2;::::0;47737:11;;:48:::2;::::0;47780:4:::2;::::0;47737:38:::2;::::0;:15:::2;:38::i;:48::-;47719:15;::::0;::::2;:66:::0;-1:-1:-1;;;;;47797:49:0;;::::2;::::0;;::::2;47805:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;47797:49:0::2;;47838:7;47797:49;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;14249:1:0::1;15211:22:::0;;-1:-1:-1;;;;;46447:1405:0:o;16297:87::-;16343:7;16370:6;-1:-1:-1;;;;;16370:6:0;16297:87;:::o;35439:53::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;34966:28::-;;;-1:-1:-1;;;;;34966:28:0;;:::o;35315:39::-;;;;:::o;35383:26::-;;;;:::o;40996:246::-;16528:12;:10;:12::i;:::-;-1:-1:-1;;;;;16517:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;16517:23:0;;16509:68;;;;;-1:-1:-1;;;16509:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16509:68:0;;;;;;;;;;;;;;;41072:17:::1;:15;:17::i;:::-;41124:13;::::0;;41144:30;;;;41186:50:::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;;;;;;;;::::1;16588:1;40996:246:::0;:::o;40008:275::-;16528:12;:10;:12::i;:::-;-1:-1:-1;;;;;16517:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;16517:23:0;;16509:68;;;;;-1:-1:-1;;;16509:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16509:68:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;40091:22:0;::::1;::::0;;::::1;::::0;:48:::1;;-1:-1:-1::0;;;;;;40117:22:0;::::1;40137:1;40117:22;;40091:48;40075:142;;;;-1:-1:-1::0;;;40075:142:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40224:7;:18:::0;;-1:-1:-1;;;;;;40224:18:0::1;-1:-1:-1::0;;;;;40224:18:0;::::1;::::0;;::::1;::::0;;;40254:23:::1;::::0;::::1;::::0;-1:-1:-1;;40254:23:0::1;40008:275:::0;:::o;47896:1066::-;14293:1;14899:7;;:19;;14891:63;;;;;-1:-1:-1;;;14891:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;14891:63:0;;;;;;;;;;;;;;;14293:1;15032:7;:18;-1:-1:-1;;;;;48040:25:0;::::1;::::0;;::::1;::::0;:54:::1;;-1:-1:-1::0;;;;;;48069:25:0;::::1;48092:1;48069:25;;48040:54;48024:145;;;;-1:-1:-1::0;;;48024:145:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48207:5;::::0;-1:-1:-1;;;;;48184:29:0;;::::1;48207:5:::0;::::1;48184:29;;48176:77;;;;-1:-1:-1::0;;;48176:77:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48268:22;:5;48278:11:::0;48268:9:::1;:22::i;:::-;48260:52;;;::::0;;-1:-1:-1;;;48260:52:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;48260:52:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;48345:21:0;;::::1;48321;48345::::0;;;:8:::1;:21;::::0;;;;;;;48397:8:::1;:21:::0;;;;;:27;;::::1;::::0;;;;;;;;48458:12:::1;:10;:12::i;:::-;48441:13;::::0;::::1;::::0;-1:-1:-1;;;;;48441:13:0;;::::1;:29:::0;::::1;;48433:63;;;::::0;;-1:-1:-1;;;48433:63:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;48433:63:0;;;;;;;;;;;;;::::1;;48511:11:::0;;:22;-1:-1:-1;48511:22:0::1;48503:53;;;::::0;;-1:-1:-1;;;48503:53:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;48503:53:0;;;;;;;;;;;;;::::1;;48565:23;48576:11;48565:10;:23::i;:::-;48595:27;48604:4;48610:11;48595:8;:27::i;:::-;48635:11:::0;;48631:136:::1;;48671:11:::0;;:24:::1;::::0;48687:7;48671:15:::1;:24::i;:::-;48657:38:::0;;48704:55:::1;48737:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;48704:32:0;::::1;::::0;48751:7;48704:32:::1;:55::i;:::-;48807:21;::::0;::::1;::::0;48791:11;;:48:::1;::::0;48834:4:::1;::::0;48791:38:::1;::::0;:15:::1;:38::i;:48::-;48773:15;::::0;::::1;:66:::0;48850:11;;48846:48:::1;;48868:13;::::0;::::1;:26:::0;;-1:-1:-1;;;;;;48868:26:0::1;::::0;;48846:48:::1;48935:11;-1:-1:-1::0;;;;;48906:50:0::1;48929:4;-1:-1:-1::0;;;;;48906:50:0::1;48915:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;48906:50:0::1;;48948:7;48906:50;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;14249:1:0;15211:22;;-1:-1:-1;;;47896:1066:0:o;35063:31::-;;;-1:-1:-1;;;;;35063:31:0;;:::o;17251:244::-;16528:12;:10;:12::i;:::-;-1:-1:-1;;;;;16517:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;16517:23:0;;16509:68;;;;;-1:-1:-1;;;16509:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16509:68:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;17340:22:0;::::1;17332:73;;;;-1:-1:-1::0;;;17332:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17442:6;::::0;;17421:38:::1;::::0;-1:-1:-1;;;;;17421:38:0;;::::1;::::0;17442:6;::::1;::::0;17421:38:::1;::::0;::::1;17470:6;:17:::0;;-1:-1:-1;;;;;;17470:17:0::1;-1:-1:-1::0;;;;;17470:17:0;;;::::1;::::0;;;::::1;::::0;;17251:244::o;35185:21::-;;;;:::o;17776:119::-;17827:11;;:::i;:::-;-1:-1:-1;17636:1:0;17847:16;;;;:9;;;:16;;;;;;;;;:22;;-1:-1:-1;;;;;;17847:22:0;;;;;;;17878:11;;;;;;;;;;;;17776:119::o;18026:273::-;18090:11;;:::i;:::-;18119:15;18123:4;18129;18119:3;:15::i;:::-;18118:16;18110:72;;;;-1:-1:-1;;;18110:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18207:9:0;:16;;;;:9;;;:16;;;;;;;;;;-1:-1:-1;;;;;18189:15:0;;;;;;;;;:34;;18207:16;;;;-1:-1:-1;;;;;;18189:34:0;;;;;;;18230:16;;;;:23;;;;;;;;;;;18260:13;;;;;;;;;18282:11;;;;;;;;;;;18026:273::o;44072:257::-;-1:-1:-1;;;;;44174:42:0;;44157:4;44174:42;;;:29;:42;;;;;;;;44170:111;;;44225:56;44268:12;:10;:12::i;:::-;-1:-1:-1;;;;;44225:38:0;;;;;;:25;:38;;;;;;:42;:56::i;:::-;44218:63;;;;44170:111;44311:12;:10;:12::i;:::-;-1:-1:-1;;;;;44295:28:0;:12;-1:-1:-1;;;;;44295:28:0;;44288:35;;44072:257;;;;:::o;613:106::-;701:10;613:106;:::o;51852:790::-;51921:20;;:::i;:::-;-1:-1:-1;;;;;;51944:21:0;;;;;;:8;:21;;;;;;;;;51921:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51972:20;;:::i;:::-;-1:-1:-1;;;;;;51995:21:0;;;;;;;:8;:21;;;;;;;;:27;;;;;;;;;;;51972:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52054:12;:10;:12::i;:::-;-1:-1:-1;;;;;52037:29:0;:4;:13;;;-1:-1:-1;;;;;52037:29:0;;52029:63;;;;;-1:-1:-1;;;52029:63:0;;;;;;;;;;;;-1:-1:-1;;;52029:63:0;;;;;;;;;;;;;;;52107:11;;52099:56;;;;;-1:-1:-1;;;52099:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;52162:15;52180:69;52233:4;:15;;;52180:48;52223:4;52180:38;52196:4;:21;;;52180:4;:11;;;:15;;:38;;;;:::i;:69::-;52275:5;;52299;;52275:31;;;-1:-1:-1;;;52275:31:0;;-1:-1:-1;;;;;52299:5:0;;;52275:31;;;;;;52162:87;;-1:-1:-1;52275:5:0;;;:15;;:31;;;;;;;;;;;;;;;:5;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52275:31:0;52264:42;;;52256:93;;;;-1:-1:-1;;;52256:93:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52356:5;;:38;;;-1:-1:-1;;;52356:38:0;;-1:-1:-1;;;;;52356:38:0;;;;;;;;;;;;;;;:5;;;;;:23;;:38;;;;;:5;;:38;;;;;;;:5;;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52405:56;52448:12;:10;:12::i;:::-;-1:-1:-1;;;;;52405:38:0;;;;;;:25;:38;;;;;;:42;:56::i;:::-;52401:138;;;52472:59;52490:12;:10;:12::i;:::-;52504:11;52517:4;52523:7;52472:17;:59::i;:::-;52545:30;52561:4;52567:7;52545:15;:30::i;:::-;52615:11;-1:-1:-1;;;;;52587:49:0;52609:4;-1:-1:-1;;;;;52587:49:0;52595:12;:10;:12::i;:::-;-1:-1:-1;;;;;52587:49:0;;52628:7;52587:49;;;;;;;;;;;;;;;;;;51852:790;;;;;:::o;30028:220::-;30086:7;30110:6;30106:20;;-1:-1:-1;30125:1:0;30118:8;;30106:20;30149:5;;;30153:1;30149;:5;:1;30173:5;;;;;:10;30165:56;;;;-1:-1:-1;;;30165:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30239:1;30028:220;-1:-1:-1;;;30028:220:0:o;30726:153::-;30784:7;30816:1;30812;:5;30804:44;;;;;-1:-1:-1;;;30804:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;30870:1;30866;:5;;;;;;;30726:153;-1:-1:-1;;;30726:153:0:o;29611:158::-;29669:7;29702:1;29697;:6;;29689:49;;;;;-1:-1:-1;;;29689:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29756:5:0;;;29611:158::o;1744:205::-;1872:68;;;-1:-1:-1;;;;;1872:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1872:68:0;-1:-1:-1;;;1872:68:0;;;1845:96;;1865:5;;1845:19;:96::i;:::-;1744:205;;;;:::o;29149:179::-;29207:7;29239:5;;;29263:6;;;;29255:46;;;;;-1:-1:-1;;;29255:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;19524:98;19605:11;;19524:98::o;17901:119::-;-1:-1:-1;;;;;17990:15:0;;;17970:4;17990:15;;;:9;;;:15;;;;;;;:24;;17901:119;;;;:::o;43674:179::-;43831:15;;43768:7;;43791:56;;:35;:13;43809:16;43791:17;:35::i;19021:372::-;19131:9;19100:7;19131:16;;;:9;;;:16;;;;;;-1:-1:-1;;;;;19131:16:0;19162:13;19154:84;;;;-1:-1:-1;;;19154:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19250:9;19245:126;-1:-1:-1;;;;;19265:11:0;;17636:1;19265:11;19245:126;;-1:-1:-1;;;;;19296:15:0;;;;;;;:9;;;:15;;;;;;;;:23;;;;19292:40;;;-1:-1:-1;19328:4:0;-1:-1:-1;19321:11:0;;19292:40;-1:-1:-1;;;;;19348:15:0;;;;;;;:9;;;;:15;;;;;;;;;;;19278:3;19245:126;;;-1:-1:-1;17636:1:0;;19021:372;-1:-1:-1;;;;19021:372:0:o;18305:400::-;18410:11;;:::i;:::-;18438:15;18442:4;18448;18438:3;:15::i;:::-;18430:71;;;;-1:-1:-1;;;18430:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18516:19:0;;;;;;;:9;;;:19;;;;;;;;:27;;;;18508:77;;;;-1:-1:-1;;;18508:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;18614:15:0;;;;;;;:9;;;:15;;;;;;;;;;18592:19;;;;;;;;:37;;18614:15;;;;-1:-1:-1;;;;;;18592:37:0;;;;;;;18636:15;;;;:23;;;;;;;;18666:13;;-1:-1:-1;;18666:13:0;;;;18688:11;;;;;;;;;;18305:400;;;;;:::o;19399:119::-;-1:-1:-1;;;;;19497:15:0;;;19474:7;19497:15;;;:9;;;:15;;;;;;;19399:119;;;;:::o;1559:177::-;1669:58;;;-1:-1:-1;;;;;1669:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1669:58:0;-1:-1:-1;;;1669:58:0;;;1642:86;;1662:5;;1642:19;:86::i;:::-;1559:177;;;:::o;53206:422::-;53349:20;:7;-1:-1:-1;;;;;53349:18:0;;:20::i;:::-;53344:50;;53380:7;;53344:50;53440:96;;;-1:-1:-1;;;;;53440:96:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;53440:96:0;-1:-1:-1;;;53440:96:0;;;53419:124;;;;53401:12;;53419;;;;53440:96;53419:124;;;;53440:96;53419:124;;;;;;;;;;-1:-1:-1;;53419:124:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53400:143;;;53558:7;53550:72;;;;-1:-1:-1;;;53550:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53206:422;;;;;:::o;52648:448::-;52726:7;;:20;;-1:-1:-1;;;;;52726:7:0;:18;:20::i;:::-;52721:50;;52757:7;;52721:50;52777:5;;52809:7;;52832:6;;-1:-1:-1;;;;;52777:5:0;;;;:23;;52809:7;;52819:31;;52844:5;;52819:20;;:8;;:12;:20::i;:31::-;52777:74;;;;;;;;;;;;;-1:-1:-1;;;;;52777:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;52877:7:0;;52981:6;;52859:12;;-1:-1:-1;;;;;;52877:7:0;;;;-1:-1:-1;;;;52921:39:0;52962:4;;52968:31;;52993:5;;52968:20;;:8;;:12;:20::i;:31::-;52898:102;;;-1:-1:-1;;;;;52898:102:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;52898:102:0;-1:-1:-1;;;;;;52898:102:0;;;;;;;;;52877:130;;;;52898:102;;52877:130;;;;52898:102;52877:130;;52898:102;52877:130;;;;;;;;;;-1:-1:-1;;52877:130:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52858:149;;;53022:7;53014:76;;;;-1:-1:-1;;;53014:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52648:448;;;:::o;3864:761::-;4288:23;4314:69;4342:4;4314:69;;;;;;;;;;;;;;;;;4322:5;-1:-1:-1;;;;;4314:27:0;;;:69;;;;;:::i;:::-;4398:17;;4288:95;;-1:-1:-1;4398:21:0;4394:224;;4540:10;4529:30;;;;;;;;;;;;;;;-1:-1:-1;4529:30:0;4521:85;;;;-1:-1:-1;;;4521:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5348:422;5715:20;5754:8;;;5348:422::o;8266:195::-;8369:12;8401:52;8423:6;8431:4;8437:1;8440:12;8401:21;:52::i;:::-;8394:59;8266:195;-1:-1:-1;;;;8266:195:0:o;9318:530::-;9445:12;9503:5;9478:21;:30;;9470:81;;;;-1:-1:-1;;;9470:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9570:18;9581:6;9570:10;:18::i;:::-;9562:60;;;;;-1:-1:-1;;;9562:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;9696:12;9710:23;9737:6;-1:-1:-1;;;;;9737:11:0;9757:5;9765:4;9737:33;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;9737:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9695:75;;;;9788:52;9806:7;9815:10;9827:12;9788:17;:52::i;:::-;9781:59;9318:530;-1:-1:-1;;;;;;;9318:530:0:o;11858:742::-;11973:12;12002:7;11998:595;;;-1:-1:-1;12033:10:0;12026:17;;11998:595;12147:17;;:21;12143:439;;12410:10;12404:17;12471:15;12458:10;12454:2;12450:19;12443:44;12358:148;12553:12;12546:20;;-1:-1:-1;;;12546:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o

Metadata Hash

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