Contract 0xfc25a26d6738a82e7179931d5e418f112ae6b7fc

Scan QRCode

Contract Overview

My Name Tag
Not Available


Balance:
0 BTA

BTA Value
$0.00 (@ $0.8700/BTA)

 Latest 25 BTA-721 Token Transfer Events

Parent Txn Hash Age From To Token ID Token
No Transaction
Contract Name:
FarmAndStake

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, No License (None) license

Contract Source Code (Solidity)

pragma solidity 0.6.12;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, 'SafeMath: addition overflow');

        return c;
    }

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

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

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

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

        return c;
    }

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

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

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

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

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

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

// 
interface IBEP20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the token decimals.
     */
    function decimals() external view returns (uint8);

    /**
     * @dev Returns the token symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the token name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the bep token owner.
     */
    function getOwner() external view returns (address);

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

// 
/**
 * @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) {
        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly {
            codehash := extcodehash(account)
        }
        return (codehash != accountHash && codehash != 0x0);
    }

    /**
     * @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');
        return _functionCallWithValue(target, data, value, errorMessage);
    }

    function _functionCallWithValue(
        address target,
        bytes memory data,
        uint256 weiValue,
        string memory errorMessage
    ) private returns (bytes memory) {
        require(isContract(target), 'Address: call to non-contract');

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{value: weiValue}(data);
        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);
            }
        }
    }
}

// 
/**
 * @title SafeBEP20
 * @dev Wrappers around BEP20 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 SafeBEP20 for IBEP20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeBEP20 {
    using SafeMath for uint256;
    using Address for address;

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

    function safeTransferFrom(
        IBEP20 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
     * {IBEP20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IBEP20 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),
            'SafeBEP20: approve from non-zero to non-zero allowance'
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(
        IBEP20 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(
        IBEP20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender).sub(
            value,
            'SafeBEP20: 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(IBEP20 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, 'SafeBEP20: low-level call failed');
        if (returndata.length > 0) {
            // Return data is optional
            // solhint-disable-next-line max-line-length
            require(abi.decode(returndata, (bool)), 'SafeBEP20: BEP20 operation did not succeed');
        }
    }
}

// 
/*
 * @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.
 */
contract Context {
    // Empty internal constructor, to prevent people from mistakenly deploying
    // an instance of this contract, which should be used via inheritance.
    constructor() internal {}

    function _msgSender() internal view returns (address payable) {
        return msg.sender;
    }

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

// 
/**
 * @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.
 */
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 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 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 onlyOwner {
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     */
    function _transferOwnership(address newOwner) internal {
        require(newOwner != address(0), 'Ownable: new owner is the zero address');
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

contract FarmAndStake is Ownable {
    using SafeMath for uint256;
    using SafeBEP20 for IBEP20;

    // Info of each user.
    struct UserInfo {
        uint256 amount;     // How many LP tokens the user has provided.
        uint256 rewardDebt; // Reward debt. See explanation below.
        //
        // We do some fancy math here. Basically, any point in time, the amount of CAKEs
        // entitled to a user but is pending to be distributed is:
        //
        //   pending reward = (user.amount * pool.accCakePerShare) - user.rewardDebt
        //
        // Whenever a user deposits or withdraws LP tokens to a pool. Here's what happens:
        //   1. The pool's `accCakePerShare` (and `lastRewardBlock`) gets updated.
        //   2. User receives the pending reward sent to his/her address.
        //   3. User's `amount` gets updated.
        //   4. User's `rewardDebt` gets updated.
    }

    // Info of each pool.
    struct PoolInfo {
        IBEP20 lpToken;           // Address of LP token contract.
        uint256 allocPoint;       // How many allocation points assigned to this pool. CAKEs to distribute per block.
        uint256 lastRewardBlock;  // Last block number that CAKEs distribution occurs.
        uint256 accCakePerShare;  // Accumulated CAKEs per share, times 1e12. See below.
        uint256 adminFee;         // Admin fee for contract integration
        uint256 totalAllocPoint;  
        uint256 cakePerBlock;     // cake per pool reward
        uint256 lpSupply;
    }

    // The Reward.
    IBEP20 public rewardToken;
    // Dev address.
    address public devaddr;
    // Admin address.
    address public adminaddr;
    // Bonus muliplier for early cake makers.
    uint256 public BONUS_MULTIPLIER = 1;
    // Rate div 
    uint256 private _divRate = 10000;
    // Reward available
    uint256 public rewardAvailable;
    // Info of each pool.
    PoolInfo[] public poolInfo;
    // Info of each user that stakes LP tokens.
    mapping (uint256 => mapping (address => UserInfo)) public userInfo;
    // The block number when CAKE mining starts.
    uint256 public startBlock;

    event Deposit(address indexed user, uint256 indexed pid, uint256 amount);
    event Withdraw(address indexed user, uint256 indexed pid, uint256 amount);
    event EmergencyWithdraw(address indexed user, uint256 indexed pid, uint256 amount);
    event AdminFee(address indexed user, uint256 amount);
    event Reward(uint256 amount, uint256 timestamp);

    constructor(
        IBEP20 _rewardToken,
        IBEP20 _lpToken,
        address _devaddr,
        address _adminaddr,
        uint256 _rewardTokenPerBlock,
        uint256 _startBlock
    ) public {
        rewardToken = _rewardToken;
        devaddr = _devaddr;
        adminaddr = _adminaddr;
        startBlock = _startBlock;

        // staking pool
        poolInfo.push(PoolInfo({
            lpToken: _lpToken,
            allocPoint: 1000,
            lastRewardBlock: startBlock,
            accCakePerShare: 0,
            adminFee: 500,
            totalAllocPoint : 1000,
            cakePerBlock: _rewardTokenPerBlock,
            lpSupply: 0
        }));
    }

    function updateMultiplier(uint256 multiplierNumber) public onlyOwner {
        BONUS_MULTIPLIER = multiplierNumber;
    }

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

    function safeRewardTransfer(address _to, uint256 _amount) internal {
        if (_amount > rewardAvailable) {
            rewardAvailable = rewardAvailable.sub(rewardAvailable);
            rewardToken.transfer(_to, rewardAvailable);
        } else {
            rewardAvailable = rewardAvailable.sub(_amount);
            rewardToken.transfer(_to, _amount);
        }
    }

    // Add a new lp to the pool. Can only be called by the owner.
    // XXX DO NOT add the same LP token more than once. Rewards will be messed up if you do.
    function add(uint256 _allocPoint, IBEP20 _lpToken, bool _withUpdate, uint256 _fee, uint256 _totalAllocPoint, uint256 _cakePerBlock) public onlyOwner {
        require(_fee <= 1000, "adminFee can not more than 10%");	
        if (_withUpdate) {
            massUpdatePools();
        }
        uint256 lastRewardBlock = block.number > startBlock ? block.number : startBlock;
        poolInfo.push(PoolInfo({
            lpToken: _lpToken,
            allocPoint: _allocPoint,
            lastRewardBlock: lastRewardBlock,
            accCakePerShare: 0,
            adminFee: _fee,
            totalAllocPoint: _totalAllocPoint,
            cakePerBlock: _cakePerBlock,
            lpSupply: 0
        }));
    }

    // Update the given pool's CAKE allocation point. Can only be called by the owner.
    function set(uint256 _pid, uint256 _allocPoint,uint256 _totalAllocPoint, bool _withUpdate, uint256 _cakePerBlock) public onlyOwner {
        if (_withUpdate) {
            massUpdatePools();
        }
        uint256 prevAllocPoint = poolInfo[_pid].allocPoint;
        poolInfo[_pid].allocPoint = _allocPoint;
        poolInfo[_pid].totalAllocPoint = _totalAllocPoint;
        poolInfo[_pid].cakePerBlock = _cakePerBlock;
    }

    function setReward(uint256 _available) public onlyOwner {
        rewardAvailable = _available;
        emit Reward(_available, block.timestamp);
    }

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

    // View function to see pending CAKEs on frontend.
    function pendingCake(uint256 _pid, address _user) external view returns (uint256) {
        PoolInfo storage pool = poolInfo[_pid];
        UserInfo storage user = userInfo[_pid][_user];
        uint256 accCakePerShare = pool.accCakePerShare;
        uint256 lpSupply = pool.lpSupply;
        if (block.number > pool.lastRewardBlock && lpSupply != 0) {
            uint256 multiplier = getMultiplier(pool.lastRewardBlock, block.number);
            uint256 cakeReward = multiplier.mul(pool.cakePerBlock).mul(pool.allocPoint).div(pool.totalAllocPoint);
            accCakePerShare = accCakePerShare.add(cakeReward.mul(1e12).div(lpSupply));
        }
        return user.amount.mul(accCakePerShare).div(1e12).sub(user.rewardDebt);
    }

    // Update reward variables for all pools. Be careful of gas spending!
    function massUpdatePools() public {
        uint256 length = poolInfo.length;
        for (uint256 pid = 0; pid < length; ++pid) {
            updatePool(pid);
        }
    }

    // Update reward variables of the given pool to be up-to-date.
    function updatePool(uint256 _pid) public {
        PoolInfo storage pool = poolInfo[_pid];
        if (block.number <= pool.lastRewardBlock) {
            return;
        }
        uint256 lpSupply = pool.lpSupply;
        if (lpSupply == 0) {
            pool.lastRewardBlock = block.number;
            return;
        }
        uint256 multiplier = getMultiplier(pool.lastRewardBlock, block.number);
        uint256 cakeReward = multiplier.mul(pool.cakePerBlock).mul(pool.allocPoint).div(pool.totalAllocPoint);
        pool.accCakePerShare = pool.accCakePerShare.add(cakeReward.mul(1e12).div(lpSupply));
        pool.lastRewardBlock = block.number;
    }

    // Deposit LP tokens to MasterChef for CAKE allocation.
    function deposit(uint256 _pid, uint256 _amount) public {
        PoolInfo storage pool = poolInfo[_pid];
        UserInfo storage user = userInfo[_pid][msg.sender];
        if (_amount > 0) {
            pool.lpSupply = pool.lpSupply.add(_amount);
        }
        updatePool(_pid);
        if (user.amount > 0) {
            uint256 pending = user.amount.mul(pool.accCakePerShare).div(1e12).sub(user.rewardDebt);
            if(pending > 0) {
                uint256 claimAmount = pending;
                if(pool.adminFee > 0){
					uint256 adminAmount = pending * pool.adminFee / _divRate;
					safeRewardTransfer(adminaddr, adminAmount);
					claimAmount -= adminAmount;
					emit AdminFee(msg.sender, adminAmount);
				}
                safeRewardTransfer(msg.sender, claimAmount);
            }
        }
        if (_amount > 0) {
            pool.lpToken.safeTransferFrom(address(msg.sender), address(this), _amount);
            user.amount = user.amount.add(_amount);
        }
        user.rewardDebt = user.amount.mul(pool.accCakePerShare).div(1e12);
        emit Deposit(msg.sender, _pid, _amount);
    }

    // Withdraw LP tokens from MasterChef.
    function withdraw(uint256 _pid, uint256 _amount) public {
        PoolInfo storage pool = poolInfo[_pid];
        UserInfo storage user = userInfo[_pid][msg.sender];
        require(user.amount >= _amount, "withdraw: not good");
        if(_amount > 0) {
            pool.lpSupply = pool.lpSupply.sub(_amount);
        }
        updatePool(_pid);
        uint256 pending = user.amount.mul(pool.accCakePerShare).div(1e12).sub(user.rewardDebt);
        if(pending > 0) {
            uint256 claimAmount = pending;
            if(pool.adminFee > 0){
                uint256 adminAmount = pending * pool.adminFee / _divRate;
                safeRewardTransfer(adminaddr, adminAmount);
                claimAmount -= adminAmount;
                emit AdminFee(msg.sender, adminAmount);
            }
            safeRewardTransfer(msg.sender, claimAmount);
        }
        if(_amount > 0) {
            user.amount = user.amount.sub(_amount);
            pool.lpToken.safeTransfer(address(msg.sender), _amount);
        }
        user.rewardDebt = user.amount.mul(pool.accCakePerShare).div(1e12);
        emit Withdraw(msg.sender, _pid, _amount);
    }

    // Withdraw without caring about rewards. EMERGENCY ONLY.
    function emergencyWithdraw(uint256 _pid) public {
        PoolInfo storage pool = poolInfo[_pid];
        UserInfo storage user = userInfo[_pid][msg.sender];
        pool.lpToken.safeTransfer(address(msg.sender), user.amount);
        pool.lpSupply = pool.lpSupply.sub(user.amount);
        emit EmergencyWithdraw(msg.sender, _pid, user.amount);
        user.amount = 0;
        user.rewardDebt = 0;
    }

    // Update dev address by the previous dev.
    function dev(address _devaddr) public {
        require(msg.sender == devaddr, "dev: wut?");
        devaddr = _devaddr;
    }

    function admin(address _adminaddr) public {
        require(msg.sender == adminaddr, "admin: wut?");
        adminaddr = _adminaddr;
    }

}

Contract ABI

[{"inputs":[{"internalType":"contract IBEP20","name":"_rewardToken","type":"address"},{"internalType":"contract IBEP20","name":"_lpToken","type":"address"},{"internalType":"address","name":"_devaddr","type":"address"},{"internalType":"address","name":"_adminaddr","type":"address"},{"internalType":"uint256","name":"_rewardTokenPerBlock","type":"uint256"},{"internalType":"uint256","name":"_startBlock","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"AdminFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"Reward","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"BONUS_MULTIPLIER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"contract IBEP20","name":"_lpToken","type":"address"},{"internalType":"bool","name":"_withUpdate","type":"bool"},{"internalType":"uint256","name":"_fee","type":"uint256"},{"internalType":"uint256","name":"_totalAllocPoint","type":"uint256"},{"internalType":"uint256","name":"_cakePerBlock","type":"uint256"}],"name":"add","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_adminaddr","type":"address"}],"name":"admin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"adminaddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_devaddr","type":"address"}],"name":"dev","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devaddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_from","type":"uint256"},{"internalType":"uint256","name":"_to","type":"uint256"}],"name":"getMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"pendingCake","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"contract IBEP20","name":"lpToken","type":"address"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"lastRewardBlock","type":"uint256"},{"internalType":"uint256","name":"accCakePerShare","type":"uint256"},{"internalType":"uint256","name":"adminFee","type":"uint256"},{"internalType":"uint256","name":"totalAllocPoint","type":"uint256"},{"internalType":"uint256","name":"cakePerBlock","type":"uint256"},{"internalType":"uint256","name":"lpSupply","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardAvailable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardToken","outputs":[{"internalType":"contract IBEP20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"uint256","name":"_totalAllocPoint","type":"uint256"},{"internalType":"bool","name":"_withUpdate","type":"bool"},{"internalType":"uint256","name":"_cakePerBlock","type":"uint256"}],"name":"set","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_available","type":"uint256"}],"name":"setReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startBlock","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":"multiplierNumber","type":"uint256"}],"name":"updateMultiplier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"updatePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

0x608060405234801561001057600080fd5b50600436106101735760003560e01c8063715018a6116100de578063aa58627711610097578063e2bbb15811610071578063e2bbb1581461066a578063f2fde38b146106a2578063f7c618c1146106e6578063fca3b3041461071a57610173565b8063aa586277146105aa578063ac3d84cd14610602578063d49e77cd1461063657610173565b8063715018a6146104555780638aa285501461045f5780638d88a90e1461047d5780638da5cb5b146104c15780638dbb1e3a146104f557806393f1a40b1461054157610173565b806351eb05a61161013057806351eb05a6146103055780635312ea8e146103335780635aeac8c9146103615780635ffe6146146103d9578063630b5ba11461040757806363a846f81461041157610173565b8063081e3eda146101785780631175a1dd146101965780631526fe27146101f8578063293be45614610281578063441a3e70146102af57806348cd4cb1146102e7575b600080fd5b610180610738565b6040518082815260200191505060405180910390f35b6101e2600480360360408110156101ac57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610745565b6040518082815260200191505060405180910390f35b6102246004803603602081101561020e57600080fd5b81019080803590602001909291905050506108ce565b604051808973ffffffffffffffffffffffffffffffffffffffff1681526020018881526020018781526020018681526020018581526020018481526020018381526020018281526020019850505050505050505060405180910390f35b6102ad6004803603602081101561029757600080fd5b8101908080359060200190929190505050610943565b005b6102e5600480360360408110156102c557600080fd5b810190808035906020019092919080359060200190929190505050610a54565b005b6102ef610d85565b6040518082815260200191505060405180910390f35b6103316004803603602081101561031b57600080fd5b8101908080359060200190929190505050610d8b565b005b61035f6004803603602081101561034957600080fd5b8101908080359060200190929190505050610e8f565b005b6103d7600480360360c081101561037757600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190803590602001909291908035906020019092919080359060200190929190505050610fe4565b005b610405600480360360208110156103ef57600080fd5b810190808035906020019092919050505061125f565b005b61040f611331565b005b6104536004803603602081101561042757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061135e565b005b61045d611465565b005b6104676115eb565b6040518082815260200191505060405180910390f35b6104bf6004803603602081101561049357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506115f1565b005b6104c96116f8565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61052b6004803603604081101561050b57600080fd5b810190808035906020019092919080359060200190929190505050611721565b6040518082815260200191505060405180910390f35b61058d6004803603604081101561055757600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611752565b604051808381526020018281526020019250505060405180910390f35b610600600480360360a08110156105c057600080fd5b8101908080359060200190929190803590602001909291908035906020019092919080351515906020019092919080359060200190929190505050611783565b005b61060a6118ee565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61063e611914565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6106a06004803603604081101561068057600080fd5b81019080803590602001909291908035906020019092919050505061193a565b005b6106e4600480360360208110156106b857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611c01565b005b6106ee611cd5565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610722611cfb565b6040518082815260200191505060405180910390f35b6000600780549050905090565b6000806007848154811061075557fe5b9060005260206000209060080201905060006008600086815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000826003015490506000836007015490508360020154431180156107df575060008114155b1561087e5760006107f4856002015443611721565b9050600061083b866005015461082d886001015461081f8a6006015487611d0190919063ffffffff16565b611d0190919063ffffffff16565b611d8790919063ffffffff16565b905061087961086a8461085c64e8d4a5100085611d0190919063ffffffff16565b611d8790919063ffffffff16565b85611dd190919063ffffffff16565b935050505b6108c283600101546108b464e8d4a510006108a6868860000154611d0190919063ffffffff16565b611d8790919063ffffffff16565b611e5990919063ffffffff16565b94505050505092915050565b600781815481106108db57fe5b90600052602060002090600802016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030154908060040154908060050154908060060154908060070154905088565b61094b611ea3565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610a0b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b806006819055507f45cad8c10023de80f4c0672ff6c283b671e11aa93c92b9380cdf060d2790da528142604051808381526020018281526020019250505060405180910390a150565b600060078381548110610a6357fe5b9060005260206000209060080201905060006008600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090508281600001541015610b41576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f77697468647261773a206e6f7420676f6f64000000000000000000000000000081525060200191505060405180910390fd5b6000831115610b6a57610b61838360070154611e5990919063ffffffff16565b82600701819055505b610b7384610d8b565b6000610bbd8260010154610baf64e8d4a51000610ba187600301548760000154611d0190919063ffffffff16565b611d8790919063ffffffff16565b611e5990919063ffffffff16565b90506000811115610c7d576000819050600084600401541115610c715760006005548560040154840281610bed57fe5b049050610c1c600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682611eab565b80820391503373ffffffffffffffffffffffffffffffffffffffff167f9a660627051ef3fed07b9003be102f19ac251c27b71064c9171bcefabffd9c0d826040518082815260200191505060405180910390a2505b610c7b3382611eab565b505b6000841115610cf557610c9d848360000154611e5990919063ffffffff16565b8260000181905550610cf433858560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166120979092919063ffffffff16565b5b610d2764e8d4a51000610d1985600301548560000154611d0190919063ffffffff16565b611d8790919063ffffffff16565b8260010181905550843373ffffffffffffffffffffffffffffffffffffffff167ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b568866040518082815260200191505060405180910390a35050505050565b60095481565b600060078281548110610d9a57fe5b9060005260206000209060080201905080600201544311610dbb5750610e8c565b6000816007015490506000811415610ddd574382600201819055505050610e8c565b6000610ded836002015443611721565b90506000610e348460050154610e268660010154610e18886006015487611d0190919063ffffffff16565b611d0190919063ffffffff16565b611d8790919063ffffffff16565b9050610e76610e6384610e5564e8d4a5100085611d0190919063ffffffff16565b611d8790919063ffffffff16565b8560030154611dd190919063ffffffff16565b8460030181905550438460020181905550505050505b50565b600060078281548110610e9e57fe5b9060005260206000209060080201905060006008600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050610f553382600001548460000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166120979092919063ffffffff16565b610f7081600001548360070154611e5990919063ffffffff16565b8260070181905550823373ffffffffffffffffffffffffffffffffffffffff167fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae059583600001546040518082815260200191505060405180910390a36000816000018190555060008160010181905550505050565b610fec611ea3565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146110ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6103e8831115611124576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f61646d696e4665652063616e206e6f74206d6f7265207468616e20313025000081525060200191505060405180910390fd5b831561113357611132611331565b5b6000600954431161114657600954611148565b435b905060076040518061010001604052808873ffffffffffffffffffffffffffffffffffffffff168152602001898152602001838152602001600081526020018681526020018581526020018481526020016000815250908060018154018082558091505060019003906000526020600020906008020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e08201518160070155505050505050505050565b611267611ea3565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611327576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b8060048190555050565b6000600780549050905060005b8181101561135a5761134f81610d8b565b80600101905061133e565b5050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611421576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600b8152602001807f61646d696e3a207775743f00000000000000000000000000000000000000000081525060200191505060405180910390fd5b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61146d611ea3565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461152d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60045481565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146116b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260098152602001807f6465763a207775743f000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600061174a60045461173c8585611e5990919063ffffffff16565b611d0190919063ffffffff16565b905092915050565b6008602052816000526040600020602052806000526040600020600091509150508060000154908060010154905082565b61178b611ea3565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461184b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b811561185a57611859611331565b5b60006007868154811061186957fe5b9060005260206000209060080201600101549050846007878154811061188b57fe5b90600052602060002090600802016001018190555083600787815481106118ae57fe5b90600052602060002090600802016005018190555081600787815481106118d157fe5b906000526020600020906008020160060181905550505050505050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006007838154811061194957fe5b9060005260206000209060080201905060006008600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008311156119d6576119cd838360070154611dd190919063ffffffff16565b82600701819055505b6119df84610d8b565b600081600001541115611af8576000611a368260010154611a2864e8d4a51000611a1a87600301548760000154611d0190919063ffffffff16565b611d8790919063ffffffff16565b611e5990919063ffffffff16565b90506000811115611af6576000819050600084600401541115611aea5760006005548560040154840281611a6657fe5b049050611a95600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682611eab565b80820391503373ffffffffffffffffffffffffffffffffffffffff167f9a660627051ef3fed07b9003be102f19ac251c27b71064c9171bcefabffd9c0d826040518082815260200191505060405180910390a2505b611af43382611eab565b505b505b6000831115611b7257611b523330858560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612139909392919063ffffffff16565b611b69838260000154611dd190919063ffffffff16565b81600001819055505b611ba464e8d4a51000611b9684600301548460000154611d0190919063ffffffff16565b611d8790919063ffffffff16565b8160010181905550833373ffffffffffffffffffffffffffffffffffffffff167f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15856040518082815260200191505060405180910390a350505050565b611c09611ea3565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611cc9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b611cd2816121fa565b50565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60065481565b600080831415611d145760009050611d81565b6000828402905082848281611d2557fe5b0414611d7c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061286c6021913960400191505060405180910390fd5b809150505b92915050565b6000611dc983836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061233d565b905092915050565b600080828401905083811015611e4f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b6000611e9b83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612403565b905092915050565b600033905090565b600654811115611fa857611ecc600654600654611e5990919063ffffffff16565b600681905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb836006546040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015611f6757600080fd5b505af1158015611f7b573d6000803e3d6000fd5b505050506040513d6020811015611f9157600080fd5b810190808051906020019092919050505050612093565b611fbd81600654611e5990919063ffffffff16565b600681905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561205657600080fd5b505af115801561206a573d6000803e3d6000fd5b505050506040513d602081101561208057600080fd5b8101908080519060200190929190505050505b5050565b6121348363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506124c3565b505050565b6121f4846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506124c3565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612280576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806128466026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080831182906123e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156123ae578082015181840152602081019050612393565b50505050905090810190601f1680156123db5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816123f557fe5b049050809150509392505050565b60008383111582906124b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561247557808201518184015260208101905061245a565b50505050905090810190601f1680156124a25780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b6060612525826040518060400160405280602081526020017f5361666542455032303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166125b29092919063ffffffff16565b90506000815111156125ad5780806020019051602081101561254657600080fd5b81019080805190602001909291905050506125ac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a81526020018061281c602a913960400191505060405180910390fd5b5b505050565b60606125c184846000856125ca565b90509392505050565b60606125d5856127d0565b612647576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b602083106126975780518252602082019150602081019050602083039250612674565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146126f9576040519150601f19603f3d011682016040523d82523d6000602084013e6126fe565b606091505b509150915081156127135780925050506127c8565b6000815111156127265780518082602001fd5b836040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561278d578082015181840152602081019050612772565b50505050905090810190601f1680156127ba5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b949350505050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f915080821415801561281257506000801b8214155b9250505091905056fe5361666542455032303a204245503230206f7065726174696f6e20646964206e6f7420737563636565644f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77a2646970667358221220495ed3664e400b20263941c56e30586b199b17bff6c4672c363f16ce16e7d32b64736f6c634300060c0033

Deployed ByteCode Sourcemap

22174:10503:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25476:93;;;:::i;:::-;;;;;;;;;;;;;;;;;;;27777:734;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;24076:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27351:151;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;30729:1149;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;24277:25;;;:::i;:::-;;;;;;;;;;;;;;;;;;;28839:657;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;31946:405;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;26114:711;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;25349:121;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;28591:175;;;:::i;:::-;;32536:138;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;21451:137;;;:::i;:::-;;23894:35;;;:::i;:::-;;;;;;;;;;;;;;;;;;;32404:126;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;20828:77;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;27575:141;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;24156:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;26918:427;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;23818:24;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;23768:22;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;29562:1118;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;21737:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;23717:25;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;24014:30;;;:::i;:::-;;;;;;;;;;;;;;;;;;;25476:93;25521:7;25547:8;:15;;;;25540:22;;25476:93;:::o;27777:734::-;27850:7;27869:21;27893:8;27902:4;27893:14;;;;;;;;;;;;;;;;;;27869:38;;27917:21;27941:8;:14;27950:4;27941:14;;;;;;;;;;;:21;27956:5;27941:21;;;;;;;;;;;;;;;27917:45;;27972:23;27998:4;:20;;;27972:46;;28028:16;28047:4;:13;;;28028:32;;28089:4;:20;;;28074:12;:35;:52;;;;;28125:1;28113:8;:13;;28074:52;28070:355;;;28142:18;28163:49;28177:4;:20;;;28199:12;28163:13;:49::i;:::-;28142:70;;28226:18;28247:80;28306:4;:20;;;28247:54;28285:4;:15;;;28247:33;28262:4;:17;;;28247:10;:14;;:33;;;;:::i;:::-;:37;;:54;;;;:::i;:::-;:58;;:80;;;;:::i;:::-;28226:101;;28359:55;28379:34;28404:8;28379:20;28394:4;28379:10;:14;;:20;;;;:::i;:::-;:24;;:34;;;;:::i;:::-;28359:15;:19;;:55;;;;:::i;:::-;28341:73;;28070:355;;;28441:63;28488:4;:15;;;28441:42;28478:4;28441:32;28457:15;28441:4;:11;;;:15;;:32;;;;:::i;:::-;:36;;:42;;;;:::i;:::-;:46;;:63;;;;:::i;:::-;28434:70;;;;;;27777:734;;;;:::o;24076:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;27351:151::-;21042:12;:10;:12::i;:::-;21032:22;;:6;;;;;;;;;;:22;;;21024:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27435:10:::1;27417:15;:28;;;;27460:35;27467:10;27479:15;27460:35;;;;;;;;;;;;;;;;;;;;;;;;27351:151:::0;:::o;30729:1149::-;30795:21;30819:8;30828:4;30819:14;;;;;;;;;;;;;;;;;;30795:38;;30843:21;30867:8;:14;30876:4;30867:14;;;;;;;;;;;:26;30882:10;30867:26;;;;;;;;;;;;;;;30843:50;;30926:7;30911:4;:11;;;:22;;30903:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30979:1;30969:7;:11;30966:83;;;31012:26;31030:7;31012:4;:13;;;:17;;:26;;;;:::i;:::-;30996:4;:13;;:42;;;;30966:83;31058:16;31069:4;31058:10;:16::i;:::-;31084:15;31102:68;31154:4;:15;;;31102:47;31144:4;31102:37;31118:4;:20;;;31102:4;:11;;;:15;;:37;;;;:::i;:::-;:41;;:47;;;;:::i;:::-;:51;;:68;;;;:::i;:::-;31084:86;;31193:1;31183:7;:11;31180:410;;;31210:19;31232:7;31210:29;;31272:1;31256:4;:13;;;:17;31253:270;;;31292:19;31340:8;;31324:4;:13;;;31314:7;:23;:34;;;;;;31292:56;;31366:42;31385:9;;;;;;;;;;;31396:11;31366:18;:42::i;:::-;31441:11;31426:26;;;;31484:10;31475:33;;;31496:11;31475:33;;;;;;;;;;;;;;;;;;31253:270;;31536:43;31555:10;31567:11;31536:18;:43::i;:::-;31180:410;;31612:1;31602:7;:11;31599:148;;;31643:24;31659:7;31643:4;:11;;;:15;;:24;;;;:::i;:::-;31629:4;:11;;:38;;;;31681:55;31715:10;31728:7;31681:4;:12;;;;;;;;;;;;:25;;;;:55;;;;;:::i;:::-;31599:148;31774:47;31816:4;31774:37;31790:4;:20;;;31774:4;:11;;;:15;;:37;;;;:::i;:::-;:41;;:47;;;;:::i;:::-;31756:4;:15;;:65;;;;31857:4;31845:10;31836:35;;;31863:7;31836:35;;;;;;;;;;;;;;;;;;30729:1149;;;;;:::o;24277:25::-;;;;:::o;28839:657::-;28890:21;28914:8;28923:4;28914:14;;;;;;;;;;;;;;;;;;28890:38;;28958:4;:20;;;28942:12;:36;28938:73;;28994:7;;;28938:73;29020:16;29039:4;:13;;;29020:32;;29078:1;29066:8;:13;29062:99;;;29118:12;29095:4;:20;;:35;;;;29144:7;;;;29062:99;29170:18;29191:49;29205:4;:20;;;29227:12;29191:13;:49::i;:::-;29170:70;;29250:18;29271:80;29330:4;:20;;;29271:54;29309:4;:15;;;29271:33;29286:4;:17;;;29271:10;:14;;:33;;;;:::i;:::-;:37;;:54;;;;:::i;:::-;:58;;:80;;;;:::i;:::-;29250:101;;29384:60;29409:34;29434:8;29409:20;29424:4;29409:10;:14;;:20;;;;:::i;:::-;:24;;:34;;;;:::i;:::-;29384:4;:20;;;:24;;:60;;;;:::i;:::-;29361:4;:20;;:83;;;;29477:12;29454:4;:20;;:35;;;;28839:657;;;;;;:::o;31946:405::-;32004:21;32028:8;32037:4;32028:14;;;;;;;;;;;;;;;;;;32004:38;;32052:21;32076:8;:14;32085:4;32076:14;;;;;;;;;;;:26;32091:10;32076:26;;;;;;;;;;;;;;;32052:50;;32112:59;32146:10;32159:4;:11;;;32112:4;:12;;;;;;;;;;;;:25;;;;:59;;;;;:::i;:::-;32197:30;32215:4;:11;;;32197:4;:13;;;:17;;:30;;;;:::i;:::-;32181:4;:13;;:46;;;;32272:4;32260:10;32242:48;;;32278:4;:11;;;32242:48;;;;;;;;;;;;;;;;;;32314:1;32300:4;:11;;:15;;;;32343:1;32325:4;:15;;:19;;;;31946:405;;;:::o;26114:711::-;21042:12;:10;:12::i;:::-;21032:22;;:6;;;;;;;;;;:22;;;21024:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26289:4:::1;26281;:12;;26273:55;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;26343:11;26339:59;;;26370:17;:15;:17::i;:::-;26339:59;26407:23;26448:10;;26433:12;:25;:53;;26476:10;;26433:53;;;26461:12;26433:53;26407:79;;26496:8;26510:307;;;;;;;;26542:8;26510:307;;;;;;26576:11;26510:307;;;;26618:15;26510:307;;;;26664:1;26510:307;;;;26689:4;26510:307;;;;26724:16;26510:307;;;;26768:13;26510:307;;;;26805:1;26510:307;;::::0;26496:322:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21101:1;26114:711:::0;;;;;;:::o;25349:121::-;21042:12;:10;:12::i;:::-;21032:22;;:6;;;;;;;;;;:22;;;21024:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25447:16:::1;25428;:35;;;;25349:121:::0;:::o;28591:175::-;28635:14;28652:8;:15;;;;28635:32;;28682:11;28677:83;28705:6;28699:3;:12;28677:83;;;28734:15;28745:3;28734:10;:15::i;:::-;28713:5;;;;;28677:83;;;;28591:175;:::o;32536:138::-;32610:9;;;;;;;;;;;32596:23;;:10;:23;;;32588:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32657:10;32645:9;;:22;;;;;;;;;;;;;;;;;;32536:138;:::o;21451:137::-;21042:12;:10;:12::i;:::-;21032:22;;:6;;;;;;;;;;:22;;;21024:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21549:1:::1;21512:40;;21533:6;::::0;::::1;;;;;;;;21512:40;;;;;;;;;;;;21579:1;21562:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;21451:137::o:0;23894:35::-;;;;:::o;32404:126::-;32474:7;;;;;;;;;;;32460:21;;:10;:21;;;32452:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32515:8;32505:7;;:18;;;;;;;;;;;;;;;;;;32404:126;:::o;20828:77::-;20866:7;20892:6;;;;;;;;;;;20885:13;;20828:77;:::o;27575:141::-;27647:7;27673:36;27692:16;;27673:14;27681:5;27673:3;:7;;:14;;;;:::i;:::-;:18;;:36;;;;:::i;:::-;27666:43;;27575:141;;;;:::o;24156:66::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;26918:427::-;21042:12;:10;:12::i;:::-;21032:22;;:6;;;;;;;;;;:22;;;21024:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27063:11:::1;27059:59;;;27090:17;:15;:17::i;:::-;27059:59;27127:22;27152:8;27161:4;27152:14;;;;;;;;;;;;;;;;;;:25;;;27127:50;;27215:11;27187:8;27196:4;27187:14;;;;;;;;;;;;;;;;;;:25;;:39;;;;27269:16;27236:8;27245:4;27236:14;;;;;;;;;;;;;;;;;;:30;;:49;;;;27325:13;27295:8;27304:4;27295:14;;;;;;;;;;;;;;;;;;:27;;:43;;;;21101:1;26918:427:::0;;;;;:::o;23818:24::-;;;;;;;;;;;;;:::o;23768:22::-;;;;;;;;;;;;;:::o;29562:1118::-;29627:21;29651:8;29660:4;29651:14;;;;;;;;;;;;;;;;;;29627:38;;29675:21;29699:8;:14;29708:4;29699:14;;;;;;;;;;;:26;29714:10;29699:26;;;;;;;;;;;;;;;29675:50;;29749:1;29739:7;:11;29735:84;;;29782:26;29800:7;29782:4;:13;;;:17;;:26;;;;:::i;:::-;29766:4;:13;;:42;;;;29735:84;29828:16;29839:4;29828:10;:16::i;:::-;29872:1;29858:4;:11;;;:15;29854:519;;;29889:15;29907:68;29959:4;:15;;;29907:47;29949:4;29907:37;29923:4;:20;;;29907:4;:11;;;:15;;:37;;;;:::i;:::-;:41;;:47;;;;:::i;:::-;:51;;:68;;;;:::i;:::-;29889:86;;30002:1;29992:7;:11;29989:374;;;30023:19;30045:7;30023:29;;30089:1;30073:4;:13;;;:17;30070:218;;;30098:19;30146:8;;30130:4;:13;;;30120:7;:23;:34;;;;;;30098:56;;30161:42;30180:9;;;;;;;;;;;30191:11;30161:18;:42::i;:::-;30225:11;30210:26;;;;30257:10;30248:33;;;30269:11;30248:33;;;;;;;;;;;;;;;;;;30070:218;;30305:43;30324:10;30336:11;30305:18;:43::i;:::-;29989:374;;29854:519;;30396:1;30386:7;:11;30382:168;;;30413:74;30451:10;30472:4;30479:7;30413:4;:12;;;;;;;;;;;;:29;;;;:74;;;;;;:::i;:::-;30515:24;30531:7;30515:4;:11;;;:15;;:24;;;;:::i;:::-;30501:4;:11;;:38;;;;30382:168;30577:47;30619:4;30577:37;30593:4;:20;;;30577:4;:11;;;:15;;:37;;;;:::i;:::-;:41;;:47;;;;:::i;:::-;30559:4;:15;;:65;;;;30659:4;30647:10;30639:34;;;30665:7;30639:34;;;;;;;;;;;;;;;;;;29562:1118;;;;:::o;21737:107::-;21042:12;:10;:12::i;:::-;21032:22;;:6;;;;;;;;;;:22;;;21024:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21809:28:::1;21828:8;21809:18;:28::i;:::-;21737:107:::0;:::o;23717:25::-;;;;;;;;;;;;;:::o;24014:30::-;;;;:::o;2177:459::-;2235:7;2481:1;2476;:6;2472:45;;;2505:1;2498:8;;;;2472:45;2527:9;2543:1;2539;:5;2527:17;;2571:1;2566;2562;:5;;;;;;:10;2554:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2628:1;2621:8;;;2177:459;;;;;:::o;3098:130::-;3156:7;3182:39;3186:1;3189;3182:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;3175:46;;3098:130;;;;:::o;841:176::-;899:7;918:9;934:1;930;:5;918:17;;958:1;953;:6;;945:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1009:1;1002:8;;;841:176;;;;:::o;1288:134::-;1346:7;1372:43;1376:1;1379;1372:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;1365:50;;1288:134;;;;:::o;19518:96::-;19563:15;19597:10;19590:17;;19518:96;:::o;25575:374::-;25666:15;;25656:7;:25;25652:291;;;25715:36;25735:15;;25715;;:19;;:36;;;;:::i;:::-;25697:15;:54;;;;25765:11;;;;;;;;;;;:20;;;25786:3;25791:15;;25765:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25652:291;;;25856:28;25876:7;25856:15;;:19;;:28;;;;:::i;:::-;25838:15;:46;;;;25898:11;;;;;;;;;;;:20;;;25919:3;25924:7;25898:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25652:291;25575:374;;:::o;15571:205::-;15683:86;15703:5;15733:23;;;15758:2;15762:5;15710:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15683:19;:86::i;:::-;15571:205;;;:::o;15782:241::-;15920:96;15940:5;15970:27;;;15999:4;16005:2;16009:5;15947:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15920:19;:96::i;:::-;15782:241;;;;:::o;21945:225::-;22038:1;22018:22;;:8;:22;;;;22010:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22127:8;22098:38;;22119:6;;;;;;;;;;22098:38;;;;;;;;;;;;22155:8;22146:6;;:17;;;;;;;;;;;;;;;;;;21945:225;:::o;3710:302::-;3826:7;3857:1;3853;:5;3860:12;3845:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3883:9;3899:1;3895;:5;;;;;;3883:17;;4004:1;3997:8;;;3710:302;;;;;:::o;1713:217::-;1829:7;1861:1;1856;:6;;1864:12;1848:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1887:9;1903:1;1899;:5;1887:17;;1922:1;1915:8;;;1713:217;;;;;:::o;18039:763::-;18458:23;18484:69;18512:4;18484:69;;;;;;;;;;;;;;;;;18492:5;18484:27;;;;:69;;;;;:::i;:::-;18458:95;;18587:1;18567:10;:17;:21;18563:233;;;18719:10;18708:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18700:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18563:233;18039:763;;;:::o;12578:224::-;12711:12;12742:53;12765:6;12773:4;12779:1;12782:12;12742:22;:53::i;:::-;12735:60;;12578:224;;;;;:::o;14023:994::-;14191:12;14223:18;14234:6;14223:10;:18::i;:::-;14215:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14346:12;14360:23;14387:6;:11;;14406:8;14416:4;14387:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14345:76;;;;14435:7;14431:580;;;14465:10;14458:17;;;;;;14431:580;14596:1;14576:10;:17;:21;14572:429;;;14834:10;14828:17;14894:15;14881:10;14877:2;14873:19;14866:44;14783:145;14973:12;14966:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14023:994;;;;;;;:::o;9506:630::-;9566:4;9824:16;9850:19;9872:66;9850:88;;;;10051:7;10039:20;10027:32;;10098:11;10086:8;:23;;:42;;;;;10125:3;10113:15;;:8;:15;;10086:42;10078:51;;;;9506:630;;;:::o

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

0x0000000000000000000000004c61f09350a9e4501b6c3d8262f768ec06f0c51b000000000000000000000000d444d24d40c5d04c29b9605099235a632a55f7c000000000000000000000000076f22c7f1a5c393e17b11238d470df38fa70cec100000000000000000000000076f22c7f1a5c393e17b11238d470df38fa70cec1000000000000000000000000000000000000000000000000016345785d8a000000000000000000000000000000000000000000000000000000000000000308f3

Swarm Source

bzzr://20495ed3664e400b20263941c56e30586b199b17bff6c4672c363f16ce16e7d32b64736f6c634300060c

Read Contract

Loading

Write Contract

Loading