false
false
0
Contract Address Details
contract

0x7a1a6Df1138357A6Ae19d80754649a55eDc909Bf

Sponsored: ERAM, a pioneering Central Bank Blockchain. The First Banking Regulatory Blockchain, Licensed by the Central Bank.

ERAM, Central Bank Digital Currency (CBDC) (STABLE COIN)

Overview

ERAM Balance

0 ERAM

ERAM Value

$0.00

Token Holdings

Fetching tokens...

More Info

Private Name Tags

Last Balance Update

Blocks Validated

Sponsored

Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
Contract name:
FarmBooster




Optimization enabled
true
Compiler version
v0.8.9+commit.e5eed63a




Optimization runs
999999
EVM Version
default




Verified at
2024-07-20T03:44:01.659290Z

Constructor Arguments

0x00000000000000000000000054ba4075ceb2e31ed20e0cc442ea8ca0f3479ccf000000000000000000000000ab387712bead1e4c031977f69230245e3af79a8f00000000000000000000000017d138722cdafdd2c1ff61026d568b5332db02ee0000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000c350000000000000000000000000000000000000000000000000000000000000000a

Arg [0] (address) : 0x54ba4075ceb2e31ed20e0cc442ea8ca0f3479ccf
Arg [1] (address) : 0xab387712bead1e4c031977f69230245e3af79a8f
Arg [2] (address) : 0x17d138722cdafdd2c1ff61026d568b5332db02ee
Arg [3] (uint256) : 3
Arg [4] (uint256) : 50000
Arg [5] (uint256) : 10

              

contracts/FarmBooster.sol

Sol2uml
new
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;

import "./openzeppelin/access/Ownable.sol";
import "./bsc-library/contracts/IBEP20.sol";
import "./interfaces/ICakePool.sol";
import "./interfaces/IMasterChefV2.sol";
import "./libraries/IterateMapping.sol";

contract FarmBooster is Ownable {
    using IterableMapping for ItMap;

    /// @notice cake token.
    address public immutable CAKE;
    /// @notice cake pool.
    address public immutable CAKE_POOL;
    /// @notice MCV2 contract.
    address public immutable MASTER_CHEF;
    /// @notice boost proxy factory.
    address public BOOSTER_FACTORY;

    /// @notice Maximum allowed boosted pool numbers
    uint256 public MAX_BOOST_POOL;
    /// @notice limit max boost
    uint256 public cA;
    /// @notice include 1e4
    uint256 public constant MIN_CA = 1e4;
    /// @notice include 1e5
    uint256 public constant MAX_CA = 1e5;
    /// @notice cA precision
    uint256 public constant CA_PRECISION = 1e5;
    /// @notice controls difficulties
    uint256 public cB;
    /// @notice not include 0
    uint256 public constant MIN_CB = 0;
    /// @notice include 50
    uint256 public constant MAX_CB = 50;
    /// @notice MCV2 basic boost factor, none boosted user's boost factor
    uint256 public constant BOOST_PRECISION = 100 * 1e10;
    /// @notice MCV2 Hard limit for maxmium boost factor
    uint256 public constant MAX_BOOST_PRECISION = 200 * 1e10;
    /// @notice Average boost ratio precion
    uint256 public constant BOOST_RATIO_PRECISION = 1e5;
    /// @notice Cake pool BOOST_WEIGHT precision
    uint256 public constant BOOST_WEIGHT_PRECISION = 100 * 1e10; // 100%

    /// @notice The whitelist of pools allowed for farm boosting.
    mapping(uint256 => bool) public whiteList;
    /// @notice The boost proxy contract mapping(user => proxy).
    mapping(address => address) public proxyContract;
    /// @notice Info of each pool user.
    mapping(address => ItMap) public userInfo;

    event UpdateMaxBoostPool(uint256 factory);
    event UpdateBoostFactory(address factory);
    event UpdateCA(uint256 oldCA, uint256 newCA);
    event UpdateCB(uint256 oldCB, uint256 newCB);
    event Refresh(address indexed user, address proxy, uint256 pid);
    event UpdateBoostFarms(uint256 pid, bool status);
    event ActiveFarmPool(address indexed user, address proxy, uint256 pid);
    event DeactiveFarmPool(address indexed user, address proxy, uint256 pid);
    event UpdateBoostProxy(address indexed user, address proxy);
    event UpdatePoolBoostMultiplier(address indexed user, uint256 pid, uint256 oldMultiplier, uint256 newMultiplier);
    event UpdateCakePool(
        address indexed user,
        uint256 lockedAmount,
        uint256 lockedDuration,
        uint256 totalLockedAmount,
        uint256 maxLockDuration
    );

    /// @param _cake CAKE token contract address.
    /// @param _cakePool Cake Pool contract address.
    /// @param _v2 MasterChefV2 contract address.
    /// @param _max Maximum allowed boosted farm  quantity
    /// @param _cA Limit max boost
    /// @param _cB Controls difficulties
    constructor(
        address _cake,
        address _cakePool,
        address _v2,
        uint256 _max,
        uint256 _cA,
        uint256 _cB
    ) {
        require(
            _max > 0 && _cA >= MIN_CA && _cA <= MAX_CA && _cB > MIN_CB && _cB <= MAX_CB,
            "constructor: Invalid parameter"
        );
        CAKE = _cake;
        CAKE_POOL = _cakePool;
        MASTER_CHEF = _v2;
        MAX_BOOST_POOL = _max;
        cA = _cA;
        cB = _cB;
    }

    /// @notice Checks if the msg.sender is a contract or a proxy
    modifier notContract() {
        require(!_isContract(msg.sender), "contract not allowed");
        require(msg.sender == tx.origin, "proxy contract not allowed");
        _;
    }

    /// @notice Checks if the msg.sender is the FarmBooster Factory.
    modifier onlyFactory() {
        require(msg.sender == BOOSTER_FACTORY, "onlyFactory: Not factory");
        _;
    }

    /// @notice Checks if the msg.sender is the FarmBooster Proxy.
    modifier onlyProxy(address _user) {
        require(msg.sender == proxyContract[_user], "onlyProxy: Not proxy");
        _;
    }

    /// @notice Checks if the msg.sender is the cake pool.
    modifier onlyCakePool() {
        require(msg.sender == CAKE_POOL, "onlyCakePool: Not cake pool");
        _;
    }

    /// @notice set maximum allowed boosted pool numbers.
    function setMaxBoostPool(uint256 _max) external onlyOwner {
        require(_max > 0, "setMaxBoostPool: Maximum boost pool should greater than 0");
        MAX_BOOST_POOL = _max;
        emit UpdateMaxBoostPool(_max);
    }

    /// @notice set boost factory contract.
    function setBoostFactory(address _factory) external onlyOwner {
        require(_factory != address(0), "setBoostFactory: Invalid factory");
        BOOSTER_FACTORY = _factory;

        emit UpdateBoostFactory(_factory);
    }

    /// @notice Set user boost proxy contract, can only invoked by boost contract.
    /// @param _user boost user address.
    /// @param _proxy boost proxy contract.
    function setProxy(address _user, address _proxy) external onlyFactory {
        require(_proxy != address(0), "setProxy: Invalid proxy address");
        require(proxyContract[_user] == address(0), "setProxy: User has already set proxy");

        proxyContract[_user] = _proxy;

        emit UpdateBoostProxy(_user, _proxy);
    }

    /// @notice Only allow whitelisted pids for farm boosting
    /// @param _pid pool id(MasterchefV2 pool).
    /// @param _status farm pool allowed boosted or not
    function setBoosterFarms(uint256 _pid, bool _status) external onlyOwner {
        whiteList[_pid] = _status;
        emit UpdateBoostFarms(_pid, _status);
    }

    /// @notice limit max boost
    /// @param _cA max boost
    function setCA(uint256 _cA) external onlyOwner {
        require(_cA >= MIN_CA && _cA <= MAX_CA, "setCA: Invalid cA");
        uint256 temp = cA;
        cA = _cA;
        emit UpdateCA(temp, cA);
    }

    /// @notice controls difficulties
    /// @param _cB difficulties
    function setCB(uint256 _cB) external onlyOwner {
        require(_cB > MIN_CB && _cB <= MAX_CB, "setCB: Invalid cB");
        uint256 temp = cB;
        cB = _cB;
        emit UpdateCB(temp, cB);
    }

    /// @notice Cakepool operation(deposit/withdraw) automatically call this function.
    /// @param _user user address.
    /// @param _lockedAmount user locked amount in cake pool.
    /// @param _lockedDuration user locked duration in cake pool.
    /// @param _totalLockedAmount Total locked cake amount in cake pool.
    /// @param _maxLockDuration maximum locked duration in cake pool.
    function onCakePoolUpdate(
        address _user,
        uint256 _lockedAmount,
        uint256 _lockedDuration,
        uint256 _totalLockedAmount,
        uint256 _maxLockDuration
    ) external onlyCakePool {
        address proxy = proxyContract[_user];
        ItMap storage itmap = userInfo[proxy];
        uint256 avgDuration;
        bool flag;
        for (uint256 i = 0; i < itmap.keys.length; i++) {
            uint256 pid = itmap.keys[i];
            if (!flag) {
                avgDuration = avgLockDuration();
                flag = true;
            }
            _updateBoostMultiplier(_user, proxy, pid, avgDuration);
        }

        emit UpdateCakePool(_user, _lockedAmount, _lockedDuration, _totalLockedAmount, _maxLockDuration);
    }

    /// @notice Update user boost multiplier in V2 pool,only for proxy.
    /// @param _user user address.
    /// @param _pid pool id in MasterchefV2 pool.
    function updatePoolBoostMultiplier(address _user, uint256 _pid) public onlyProxy(_user) {
        // if user not actived this farm, just return.
        if (!userInfo[msg.sender].contains(_pid)) return;
        _updateBoostMultiplier(_user, msg.sender, _pid, avgLockDuration());
    }

    /// @notice Active user farm pool.
    /// @param _pid pool id(MasterchefV2 pool).
    function activate(uint256 _pid) external {
        address proxy = proxyContract[msg.sender];
        require(whiteList[_pid] && proxy != address(0), "activate: Not boosted farm pool");

        ItMap storage itmap = userInfo[proxy];
        require(itmap.keys.length < MAX_BOOST_POOL, "activate: Boosted farms reach to MAX");

        _updateBoostMultiplier(msg.sender, proxy, _pid, avgLockDuration());

        emit ActiveFarmPool(msg.sender, proxy, _pid);
    }

    /// @notice Deactive user farm pool.
    /// @param _pid pool id(MasterchefV2 pool).
    function deactive(uint256 _pid) external {
        address proxy = proxyContract[msg.sender];
        ItMap storage itmap = userInfo[proxy];
        require(itmap.contains(_pid), "deactive: None boost user");

        if (itmap.data[_pid] > BOOST_PRECISION) {
            IMasterChefV2(MASTER_CHEF).updateBoostMultiplier(proxy, _pid, BOOST_PRECISION);
        }
        itmap.remove(_pid);

        emit DeactiveFarmPool(msg.sender, proxy, _pid);
    }

    /// @notice Anyone can refesh sepecific user boost multiplier
    /// @param _user user address.
    /// @param _pid pool id(MasterchefV2 pool).
    function refresh(address _user, uint256 _pid) external notContract {
        address proxy = proxyContract[_user];
        ItMap storage itmap = userInfo[proxy];
        require(itmap.contains(_pid), "refresh: None boost user");

        _updateBoostMultiplier(_user, proxy, _pid, avgLockDuration());

        emit Refresh(_user, proxy, _pid);
    }

    /// @notice Whether user boosted specific farm pool.
    /// @param _user user address.
    /// @param _pid pool id(MasterchefV2 pool).
    function isBoostedPool(address _user, uint256 _pid) external view returns (bool) {
        return userInfo[proxyContract[_user]].contains(_pid);
    }

    /// @notice Actived farm pool list.
    /// @param _user user address.
    function activedPools(address _user) external view returns (uint256[] memory pools) {
        ItMap storage itmap = userInfo[proxyContract[_user]];
        if (itmap.keys.length == 0) return pools;

        pools = new uint256[](itmap.keys.length);
        // solidity for-loop not support multiple variables initializae by ',' separate.
        uint256 i;
        for (uint256 index = 0; index < itmap.keys.length; index++) {
            uint256 pid = itmap.keys[index];
            pools[i] = pid;
            i++;
        }
    }

    /// @notice Anyone can call this function, if you find some guys effectived multiplier is not fair
    /// for other users, just call 'refresh' function.
    /// @param _user user address.
    /// @param _pid pool id(MasterchefV2 pool).
    /// @dev If return value not in range [BOOST_PRECISION, MAX_BOOST_PRECISION]
    /// the actual effectived multiplier will be the close to side boundry value.
    function getUserMultiplier(address _user, uint256 _pid) external view returns (uint256) {
        return _boostCalculate(_user, proxyContract[_user], _pid, avgLockDuration());
    }

    /// @notice cake pool average locked duration calculator.
    function avgLockDuration() public view returns (uint256) {
        uint256 totalStakedAmount = IBEP20(CAKE).balanceOf(CAKE_POOL);

        uint256 totalLockedAmount = ICakePool(CAKE_POOL).totalLockedAmount();

        uint256 pricePerFullShare = ICakePool(CAKE_POOL).getPricePerFullShare();

        uint256 flexibleShares = ((totalStakedAmount - totalLockedAmount) * 1e18) / pricePerFullShare;
        if (flexibleShares == 0) return 0;

        uint256 originalShares = (totalLockedAmount * 1e18) / pricePerFullShare;
        if (originalShares == 0) return 0;

        uint256 boostedRatio = ((ICakePool(CAKE_POOL).totalShares() - flexibleShares) * BOOST_RATIO_PRECISION) /
            originalShares;
        if (boostedRatio <= BOOST_RATIO_PRECISION) return 0;

        uint256 boostWeight = ICakePool(CAKE_POOL).BOOST_WEIGHT();
        uint256 maxLockDuration = ICakePool(CAKE_POOL).MAX_LOCK_DURATION() * BOOST_RATIO_PRECISION;

        uint256 duration = ((boostedRatio - BOOST_RATIO_PRECISION) * 365 * BOOST_WEIGHT_PRECISION) / boostWeight;
        return duration <= maxLockDuration ? duration : maxLockDuration;
    }

    /// @param _user user address.
    /// @param _proxy proxy address corresponding to the user.
    /// @param _pid pool id.
    /// @param _duration cake pool average locked duration.
    function _updateBoostMultiplier(
        address _user,
        address _proxy,
        uint256 _pid,
        uint256 _duration
    ) internal {
        ItMap storage itmap = userInfo[_proxy];

        // Used to be boost farm pool and current is not, remove from mapping
        if (!whiteList[_pid]) {
            if (itmap.data[_pid] > BOOST_PRECISION) {
                // reset to BOOST_PRECISION
                IMasterChefV2(MASTER_CHEF).updateBoostMultiplier(_proxy, _pid, BOOST_PRECISION);
            }
            itmap.remove(_pid);
            return;
        }

        uint256 prevMultiplier = IMasterChefV2(MASTER_CHEF).getBoostMultiplier(_proxy, _pid);
        uint256 multiplier = _boostCalculate(_user, _proxy, _pid, _duration);

        if (multiplier < BOOST_PRECISION) {
            multiplier = BOOST_PRECISION;
        } else if (multiplier > MAX_BOOST_PRECISION) {
            multiplier = MAX_BOOST_PRECISION;
        }

        // Update multiplier to MCV2
        if (multiplier != prevMultiplier) {
            IMasterChefV2(MASTER_CHEF).updateBoostMultiplier(_proxy, _pid, multiplier);
        }
        itmap.insert(_pid, multiplier);

        emit UpdatePoolBoostMultiplier(_user, _pid, prevMultiplier, multiplier);
    }

    /// @param _user user address.
    /// @param _proxy proxy address corresponding to the user.
    /// @param _pid pool id(MasterchefV2 pool).
    /// @param _duration cake pool average locked duration.
    function _boostCalculate(
        address _user,
        address _proxy,
        uint256 _pid,
        uint256 _duration
    ) internal view returns (uint256) {
        if (_duration == 0) return BOOST_PRECISION;

        (uint256 lpBalance, , ) = IMasterChefV2(MASTER_CHEF).userInfo(_pid, _proxy);
        uint256 dB = (cA * lpBalance) / CA_PRECISION;
        // dB == 0 means lpBalance close to 0
        if (lpBalance == 0 || dB == 0) return BOOST_PRECISION;

        (, , , , uint256 lockStartTime, uint256 lockEndTime, , , uint256 userLockedAmount) = ICakePool(CAKE_POOL)
            .userInfo(_user);
        if (userLockedAmount == 0 || block.timestamp >= lockEndTime) return BOOST_PRECISION;

        // userLockedAmount > 0 means totalLockedAmount > 0
        uint256 totalLockedAmount = ICakePool(CAKE_POOL).totalLockedAmount();

        IBEP20 lp = IBEP20(IMasterChefV2(MASTER_CHEF).lpToken(_pid));
        uint256 userLockedDuration = (lockEndTime - lockStartTime) / (3600 * 24); // days

        uint256 aB = (((lp.balanceOf(MASTER_CHEF) * userLockedAmount * userLockedDuration) * BOOST_RATIO_PRECISION) /
            cB) / (totalLockedAmount * _duration);

        // should '*' BOOST_PRECISION
        return ((lpBalance < (dB + aB) ? lpBalance : (dB + aB)) * BOOST_PRECISION) / dB;
    }

    /// @notice Checks if address is a contract
    /// @dev It prevents contract from being targetted
    function _isContract(address addr) internal view returns (bool) {
        uint256 size;
        assembly {
            size := extcodesize(addr)
        }
        return size > 0;
    }
}
        

contracts/bsc-library/contracts/IBEP20.sol

// SPDX-License-Identifier: MIT

pragma solidity >=0.4.0;

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);
}
          

contracts/interfaces/ICakePool.sol

//SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface ICakePool {
    function userInfo(address _user)
        external
        view
        returns (
            uint256,
            uint256,
            uint256,
            uint256,
            uint256,
            uint256,
            uint256,
            bool,
            uint256
        );

    function getPricePerFullShare() external view returns (uint256);

    function totalLockedAmount() external view returns (uint256);

    function totalShares() external view returns (uint256);

    function BOOST_WEIGHT() external view returns (uint256);

    function MAX_LOCK_DURATION() external view returns (uint256);
}
          

contracts/interfaces/IMasterChefV2.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;

interface IMasterChefV2 {
    function deposit(uint256 _pid, uint256 _amount) external;

    function withdraw(uint256 _pid, uint256 _amount) external;

    function pendingCake(uint256 _pid, address _user) external view returns (uint256);

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

    function emergencyWithdraw(uint256 _pid) external;

    function lpToken(uint256 _pid) external view returns (address);

    function poolLength() external view returns (uint256 pools);

    function getBoostMultiplier(address _user, uint256 _pid) external view returns (uint256);

    function updateBoostMultiplier(
        address _user,
        uint256 _pid,
        uint256 _newMultiplier
    ) external;
}
          

contracts/libraries/IterateMapping.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;

struct ItMap {
    // pid => boost
    mapping(uint256 => uint256) data;
    // pid => index
    mapping(uint256 => uint256) indexs;
    // array of pid
    uint256[] keys;
    // never use it, just for keep compile success.
    uint256 size;
}

library IterableMapping {
    function insert(
        ItMap storage self,
        uint256 key,
        uint256 value
    ) internal {
        uint256 keyIndex = self.indexs[key];
        self.data[key] = value;
        if (keyIndex > 0) return;
        else {
            self.indexs[key] = self.keys.length + 1;
            self.keys.push(key);
            return;
        }
    }

    function remove(ItMap storage self, uint256 key) internal {
        uint256 index = self.indexs[key];
        if (index == 0) return;
        uint256 lastKey = self.keys[self.keys.length - 1];
        if (key != lastKey) {
            self.keys[index - 1] = lastKey;
            self.indexs[lastKey] = index;
        }
        delete self.data[key];
        delete self.indexs[key];
        self.keys.pop();
    }

    function contains(ItMap storage self, uint256 key) internal view returns (bool) {
        return self.indexs[key] > 0;
    }
}
          

contracts/openzeppelin/access/Ownable.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}
          

contracts/openzeppelin/utils/Context.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^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 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) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}
          

Compiler Settings

{"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata","storageLayout"],"":["ast"]}},"optimizer":{"runs":999999,"enabled":true},"libraries":{}}
              

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"_cake","internalType":"address"},{"type":"address","name":"_cakePool","internalType":"address"},{"type":"address","name":"_v2","internalType":"address"},{"type":"uint256","name":"_max","internalType":"uint256"},{"type":"uint256","name":"_cA","internalType":"uint256"},{"type":"uint256","name":"_cB","internalType":"uint256"}]},{"type":"event","name":"ActiveFarmPool","inputs":[{"type":"address","name":"user","internalType":"address","indexed":true},{"type":"address","name":"proxy","internalType":"address","indexed":false},{"type":"uint256","name":"pid","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"DeactiveFarmPool","inputs":[{"type":"address","name":"user","internalType":"address","indexed":true},{"type":"address","name":"proxy","internalType":"address","indexed":false},{"type":"uint256","name":"pid","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"Refresh","inputs":[{"type":"address","name":"user","internalType":"address","indexed":true},{"type":"address","name":"proxy","internalType":"address","indexed":false},{"type":"uint256","name":"pid","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"UpdateBoostFactory","inputs":[{"type":"address","name":"factory","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"UpdateBoostFarms","inputs":[{"type":"uint256","name":"pid","internalType":"uint256","indexed":false},{"type":"bool","name":"status","internalType":"bool","indexed":false}],"anonymous":false},{"type":"event","name":"UpdateBoostProxy","inputs":[{"type":"address","name":"user","internalType":"address","indexed":true},{"type":"address","name":"proxy","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"UpdateCA","inputs":[{"type":"uint256","name":"oldCA","internalType":"uint256","indexed":false},{"type":"uint256","name":"newCA","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"UpdateCB","inputs":[{"type":"uint256","name":"oldCB","internalType":"uint256","indexed":false},{"type":"uint256","name":"newCB","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"UpdateCakePool","inputs":[{"type":"address","name":"user","internalType":"address","indexed":true},{"type":"uint256","name":"lockedAmount","internalType":"uint256","indexed":false},{"type":"uint256","name":"lockedDuration","internalType":"uint256","indexed":false},{"type":"uint256","name":"totalLockedAmount","internalType":"uint256","indexed":false},{"type":"uint256","name":"maxLockDuration","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"UpdateMaxBoostPool","inputs":[{"type":"uint256","name":"factory","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"UpdatePoolBoostMultiplier","inputs":[{"type":"address","name":"user","internalType":"address","indexed":true},{"type":"uint256","name":"pid","internalType":"uint256","indexed":false},{"type":"uint256","name":"oldMultiplier","internalType":"uint256","indexed":false},{"type":"uint256","name":"newMultiplier","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"BOOSTER_FACTORY","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"BOOST_PRECISION","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"BOOST_RATIO_PRECISION","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"BOOST_WEIGHT_PRECISION","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"CAKE","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"CAKE_POOL","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"CA_PRECISION","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"MASTER_CHEF","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"MAX_BOOST_POOL","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"MAX_BOOST_PRECISION","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"MAX_CA","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"MAX_CB","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"MIN_CA","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"MIN_CB","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"activate","inputs":[{"type":"uint256","name":"_pid","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256[]","name":"pools","internalType":"uint256[]"}],"name":"activedPools","inputs":[{"type":"address","name":"_user","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"avgLockDuration","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"cA","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"cB","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"deactive","inputs":[{"type":"uint256","name":"_pid","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getUserMultiplier","inputs":[{"type":"address","name":"_user","internalType":"address"},{"type":"uint256","name":"_pid","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isBoostedPool","inputs":[{"type":"address","name":"_user","internalType":"address"},{"type":"uint256","name":"_pid","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"onCakePoolUpdate","inputs":[{"type":"address","name":"_user","internalType":"address"},{"type":"uint256","name":"_lockedAmount","internalType":"uint256"},{"type":"uint256","name":"_lockedDuration","internalType":"uint256"},{"type":"uint256","name":"_totalLockedAmount","internalType":"uint256"},{"type":"uint256","name":"_maxLockDuration","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"proxyContract","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"refresh","inputs":[{"type":"address","name":"_user","internalType":"address"},{"type":"uint256","name":"_pid","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setBoostFactory","inputs":[{"type":"address","name":"_factory","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setBoosterFarms","inputs":[{"type":"uint256","name":"_pid","internalType":"uint256"},{"type":"bool","name":"_status","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setCA","inputs":[{"type":"uint256","name":"_cA","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setCB","inputs":[{"type":"uint256","name":"_cB","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setMaxBoostPool","inputs":[{"type":"uint256","name":"_max","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setProxy","inputs":[{"type":"address","name":"_user","internalType":"address"},{"type":"address","name":"_proxy","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updatePoolBoostMultiplier","inputs":[{"type":"address","name":"_user","internalType":"address"},{"type":"uint256","name":"_pid","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"size","internalType":"uint256"}],"name":"userInfo","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"whiteList","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]}]
              

Contract Creation Code

0x60e06040523480156200001157600080fd5b5060405162002f1038038062002f1083398101604081905262000034916200016b565b6200003f33620000fe565b6000831180156200005257506127108210155b8015620000625750620186a08211155b80156200006f5750600081115b80156200007d575060328111155b620000ce5760405162461bcd60e51b815260206004820152601e60248201527f636f6e7374727563746f723a20496e76616c696420706172616d657465720000604482015260640160405180910390fd5b6001600160a01b0395861660805293851660a0529190931660c052600292909255600391909155600455620001d1565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80516001600160a01b03811681146200016657600080fd5b919050565b60008060008060008060c087890312156200018557600080fd5b62000190876200014e565b9550620001a0602088016200014e565b9450620001b0604088016200014e565b9350606087015192506080870151915060a087015190509295509295509295565b60805160a05160c051612c986200027860003960008181610551015281816106a301528181611ffb015281816120b7015281816121cf015281816123710152818161261501526126e0015260008181610504015281816109f901528181610aa601528181610b4801528181610c5d01528181610d3401528181610dda01528181611ba90152818161247c015261252f01526000818161035a0152610a260152612c986000f3fe608060405234801561001057600080fd5b50600436106102775760003560e01c80637644d70c11610160578063ae69d198116100d8578063cdf7b7171161008c578063e874fdaf11610071578063e874fdaf14610539578063edd8b1701461054c578063f2fde38b1461057357600080fd5b8063cdf7b717146104ff578063daa81f301461052657600080fd5b8063b7d6ee5a116100bd578063b7d6ee5a146104e3578063c61a66e0146104f6578063cc6db2da146104c457600080fd5b8063ae69d198146104c4578063b260c42a146104d057600080fd5b80638abe30031161012f5780639c1ebe63116101145780639c1ebe63146104a05780639cc1d7be146104a9578063a9d4630c146104b157600080fd5b80638abe3003146103185780638da5cb5b1461048257600080fd5b80637644d70c1461041d578063803f18dc1461043057806381057714146104665780638a8a6ee01461046f57600080fd5b80634ca6ef28116101f35780635d1554d9116101c257806369b02128116101a757806369b02128146103f55780636cbb37dd14610402578063715018a61461041557600080fd5b80635d1554d9146103cc57806366406944146103ec57600080fd5b80634ca6ef28146103555780634ffcbb39146103a15780635c475d42146103a95780635c5aaa491461031857600080fd5b806325f148731161024a5780632d015aff1161022f5780632d015aff146103185780633a1d1e8c1461032257806349b61ce01461033557600080fd5b806325f14873146102fd5780632707a8111461031057600080fd5b80630dcebf651461027c57806317adb6ee146102915780631959a002146102a45780631a13b41e146102da575b600080fd5b61028f61028a366004612876565b610586565b005b61028f61029f3660046128b1565b610761565b6102c76102b23660046128dd565b60076020526000908152604090206003015481565b6040519081526020015b60405180910390f35b6102ed6102e83660046128b1565b610832565b60405190151581526020016102d1565b61028f61030b366004612876565b61087e565b6102c76109bc565b6102c7620186a081565b61028f6103303660046128dd565b610ed8565b6103486103433660046128dd565b611050565b6040516102d191906128fa565b61037c7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102d1565b6102c7603281565b6102ed6103b7366004612876565b60056020526000908152604090205460ff1681565b60015461037c9073ffffffffffffffffffffffffffffffffffffffff1681565b6102c760025481565b6102c76501d1a94a200081565b61028f610410366004612876565b61115b565b61028f611295565b61028f61042b3660046128b1565b611322565b61037c61043e3660046128dd565b60066020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b6102c760045481565b61028f61047d36600461294c565b611507565b60005473ffffffffffffffffffffffffffffffffffffffff1661037c565b6102c760035481565b6102c7600081565b61028f6104bf36600461297c565b6115f8565b6102c764e8d4a5100081565b61028f6104de366004612876565b611836565b6102c76104f13660046128b1565b611a0d565b6102c761271081565b61037c7f000000000000000000000000000000000000000000000000000000000000000081565b61028f610534366004612876565b611a4b565b61028f6105473660046129aa565b611b91565b61037c7f000000000000000000000000000000000000000000000000000000000000000081565b61028f6105813660046128dd565b611d3b565b3360009081526006602090815260408083205473ffffffffffffffffffffffffffffffffffffffff168084526007835281842085855260018101909352922054610631576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f64656163746976653a204e6f6e6520626f6f737420757365720000000000000060448201526064015b60405180910390fd5b60008381526020829052604090205464e8d4a510001015610700576040517f041a84c900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83811660048301526024820185905264e8d4a5100060448301527f0000000000000000000000000000000000000000000000000000000000000000169063041a84c990606401600060405180830381600087803b1580156106e757600080fd5b505af11580156106fb573d6000803e3d6000fd5b505050505b61070a8184611e6b565b6040805173ffffffffffffffffffffffffffffffffffffffff841681526020810185905233917f95012b3ffd890212456f6da3513cee9eba8326003c39fcaaa1d2b5e0babe6eba91015b60405180910390a2505050565b73ffffffffffffffffffffffffffffffffffffffff82811660009081526006602052604090205483911633146107f3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f6f6e6c7950726f78793a204e6f742070726f78790000000000000000000000006044820152606401610628565b33600090815260076020908152604080832085845260010190915290205461081a57505050565b61082d8333846108286109bc565b611f4e565b505050565b73ffffffffffffffffffffffffffffffffffffffff82811660009081526006602090815260408083205490931682526007815282822084835260010190529081205415155b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146108ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610628565b600081118015610910575060328111155b610976576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f73657443423a20496e76616c69642063420000000000000000000000000000006044820152606401610628565b600480549082905560408051828152602081018490527fff6a4b972407d470846bd3a5979c60d68807653244cc8d096c4174a76486e71c91015b60405180910390a15050565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116600483015260009182917f000000000000000000000000000000000000000000000000000000000000000016906370a082319060240160206040518083038186803b158015610a6857600080fd5b505afa158015610a7c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aa091906129ee565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166305a9f2746040518163ffffffff1660e01b815260040160206040518083038186803b158015610b0a57600080fd5b505afa158015610b1e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b4291906129ee565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166377c7b8fc6040518163ffffffff1660e01b815260040160206040518083038186803b158015610bac57600080fd5b505afa158015610bc0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610be491906129ee565b9050600081610bf38486612a36565b610c0590670de0b6b3a7640000612a4d565b610c0f9190612a8a565b905080610c2157600094505050505090565b600082610c3685670de0b6b3a7640000612a4d565b610c409190612a8a565b905080610c535760009550505050505090565b600081620186a0847f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633a98ef396040518163ffffffff1660e01b815260040160206040518083038186803b158015610cc157600080fd5b505afa158015610cd5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cf991906129ee565b610d039190612a36565b610d0d9190612a4d565b610d179190612a8a565b9050620186a08111610d30576000965050505050505090565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663bc75f4b86040518163ffffffff1660e01b815260040160206040518083038186803b158015610d9857600080fd5b505afa158015610dac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dd091906129ee565b90506000620186a07f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16634f1bfc9e6040518163ffffffff1660e01b815260040160206040518083038186803b158015610e3e57600080fd5b505afa158015610e52573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e7691906129ee565b610e809190612a4d565b905060008264e8d4a51000610e98620186a087612a36565b610ea49061016d612a4d565b610eae9190612a4d565b610eb89190612a8a565b905081811115610ec85781610eca565b805b995050505050505050505090565b60005473ffffffffffffffffffffffffffffffffffffffff163314610f59576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610628565b73ffffffffffffffffffffffffffffffffffffffff8116610fd6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f736574426f6f7374466163746f72793a20496e76616c696420666163746f72796044820152606401610628565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fb9ce93c498aebed04d07c95e5f16a67e9b872b65650386f6f5df4982166a0033906020015b60405180910390a150565b73ffffffffffffffffffffffffffffffffffffffff808216600090815260066020908152604080832054909316825260079052206002810154606091906110975750919050565b600281015467ffffffffffffffff8111156110b4576110b4612ac5565b6040519080825280602002602001820160405280156110dd578160200160208202803683370190505b5091506000805b600283015481101561115357600083600201828154811061110757611107612af4565b906000526020600020015490508085848151811061112757611127612af4565b60209081029190910101528261113c81612b23565b93505050808061114b90612b23565b9150506110e4565b505050919050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146111dc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610628565b61271081101580156111f15750620186a08111155b611257576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f73657443413a20496e76616c69642063410000000000000000000000000000006044820152606401610628565b600380549082905560408051828152602081018490527f948053d58d4dfed61c0843c01f010e1a4446c65f03d475567102cc64dfe0ecd491016109b0565b60005473ffffffffffffffffffffffffffffffffffffffff163314611316576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610628565b611320600061229a565b565b333b1561138b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f636f6e7472616374206e6f7420616c6c6f7765640000000000000000000000006044820152606401610628565b3332146113f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f70726f787920636f6e7472616374206e6f7420616c6c6f7765640000000000006044820152606401610628565b73ffffffffffffffffffffffffffffffffffffffff828116600090815260066020908152604080832054909316808352600782528383208584526001810190925292909120546114a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f726566726573683a204e6f6e6520626f6f7374207573657200000000000000006044820152606401610628565b6114ae8483856108286109bc565b6040805173ffffffffffffffffffffffffffffffffffffffff8481168252602082018690528616917f6388bc5bf9da0fef8880f20ca5355e721c80037d6449b03917900238ffcca24f910160405180910390a250505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611588576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610628565b60008281526005602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168415159081179091558251858152918201527fbeef892af000af61e107ef5e9c764acbccd54157fd6c219d241750fb3eca310291016109b0565b60015473ffffffffffffffffffffffffffffffffffffffff163314611679576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f6f6e6c79466163746f72793a204e6f7420666163746f727900000000000000006044820152606401610628565b73ffffffffffffffffffffffffffffffffffffffff81166116f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f73657450726f78793a20496e76616c69642070726f78792061646472657373006044820152606401610628565b73ffffffffffffffffffffffffffffffffffffffff82811660009081526006602052604090205416156117aa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f73657450726f78793a20557365722068617320616c726561647920736574207060448201527f726f7879000000000000000000000000000000000000000000000000000000006064820152608401610628565b73ffffffffffffffffffffffffffffffffffffffff82811660008181526006602090815260409182902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169486169485179055905192835290917fdebc5d6c541ae1ed122237a2c4adfe2d109e37c5848c54fb74477c7a6d95fcf3910160405180910390a25050565b3360009081526006602090815260408083205484845260059092529091205473ffffffffffffffffffffffffffffffffffffffff9091169060ff168015611892575073ffffffffffffffffffffffffffffffffffffffff811615155b6118f8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f61637469766174653a204e6f7420626f6f73746564206661726d20706f6f6c006044820152606401610628565b73ffffffffffffffffffffffffffffffffffffffff811660009081526007602052604090206002805490820154106119b1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f61637469766174653a20426f6f73746564206661726d7320726561636820746f60448201527f204d4158000000000000000000000000000000000000000000000000000000006064820152608401610628565b6119bf3383856108286109bc565b6040805173ffffffffffffffffffffffffffffffffffffffff841681526020810185905233917f9fde6fe213b149e24765c2e8365b56107f5ccaa4cf5bf0ab8e8a51c111c4f68c9101610754565b73ffffffffffffffffffffffffffffffffffffffff80831660009081526006602052604081205490916108779185911684611a466109bc565b61230f565b60005473ffffffffffffffffffffffffffffffffffffffff163314611acc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610628565b60008111611b5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f7365744d6178426f6f7374506f6f6c3a204d6178696d756d20626f6f7374207060448201527f6f6f6c2073686f756c642067726561746572207468616e2030000000000000006064820152608401610628565b60028190556040518181527f6c83390e748eac13e3531723e6b8cd596128bcf5e7828be22cb2e7f979b5b7df90602001611045565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614611c30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f6f6e6c7943616b65506f6f6c3a204e6f742063616b6520706f6f6c00000000006044820152606401610628565b73ffffffffffffffffffffffffffffffffffffffff80861660009081526006602090815260408083205490931680835260079091529181209080805b6002840154811015611ccf576000846002018281548110611c8f57611c8f612af4565b9060005260206000200154905082611cb057611ca96109bc565b9350600192505b611cbc8b878387611f4e565b5080611cc781612b23565b915050611c6c565b5060408051898152602081018990529081018790526060810186905273ffffffffffffffffffffffffffffffffffffffff8a16907f4f25e09d2aa19c6510101d1f39a2f36e12ac77e34d234c68920ba710f6d6f1b19060800160405180910390a2505050505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611dbc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610628565b73ffffffffffffffffffffffffffffffffffffffff8116611e5f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610628565b611e688161229a565b50565b600081815260018301602052604090205480611e8657505050565b60028301805460009190611e9c90600190612a36565b81548110611eac57611eac612af4565b90600052602060002001549050808314611f03578060028501611ed0600185612a36565b81548110611ee057611ee0612af4565b600091825260208083209091019290925582815260018601909152604090208290555b6000838152602085815260408083208390556001870190915281205560028401805480611f3257611f32612b5c565b6001900381819060005260206000200160009055905550505050565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260076020908152604080832085845260059092529091205460ff166120685760008381526020829052604090205464e8d4a510001015612058576040517f041a84c900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301526024820185905264e8d4a5100060448301527f0000000000000000000000000000000000000000000000000000000000000000169063041a84c990606401600060405180830381600087803b15801561203f57600080fd5b505af1158015612053573d6000803e3d6000fd5b505050505b6120628184611e6b565b50612294565b6040517f033186e800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018590526000917f00000000000000000000000000000000000000000000000000000000000000009091169063033186e89060440160206040518083038186803b1580156120fb57600080fd5b505afa15801561210f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061213391906129ee565b905060006121438787878761230f565b905064e8d4a5100081101561215e575064e8d4a51000612175565b6501d1a94a200081111561217557506501d1a94a20005b81811461222c576040517f041a84c900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff878116600483015260248201879052604482018390527f0000000000000000000000000000000000000000000000000000000000000000169063041a84c990606401600060405180830381600087803b15801561221357600080fd5b505af1158015612227573d6000803e3d6000fd5b505050505b61223783868361280b565b604080518681526020810184905290810182905273ffffffffffffffffffffffffffffffffffffffff8816907fe50f0d49657b1a6caa28100eec500f3aab7c4cc39633ebf432f02c2dec2e0e019060600160405180910390a25050505b50505050565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600081612322575064e8d4a51000612803565b6040517f93f1a40b0000000000000000000000000000000000000000000000000000000081526004810184905273ffffffffffffffffffffffffffffffffffffffff85811660248301526000917f0000000000000000000000000000000000000000000000000000000000000000909116906393f1a40b9060440160606040518083038186803b1580156123b557600080fd5b505afa1580156123c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123ed9190612b8b565b505090506000620186a0826003546124059190612a4d565b61240f9190612a8a565b905081158061241c575080155b156124305764e8d4a5100092505050612803565b6040517f1959a00200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8881166004830152600091829182917f000000000000000000000000000000000000000000000000000000000000000090911690631959a002906024016101206040518083038186803b1580156124c157600080fd5b505afa1580156124d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124f99190612bb9565b98505050965096505050505080600014806125145750814210155b1561252b5764e8d4a5100095505050505050612803565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166305a9f2746040518163ffffffff1660e01b815260040160206040518083038186803b15801561259357600080fd5b505afa1580156125a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125cb91906129ee565b6040517f78ed5d1f000000000000000000000000000000000000000000000000000000008152600481018b905290915060009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906378ed5d1f9060240160206040518083038186803b15801561265757600080fd5b505afa15801561266b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061268f9190612c2d565b90506000620151806126a18787612a36565b6126ab9190612a8a565b905060006126b98b85612a4d565b600454620186a084888773ffffffffffffffffffffffffffffffffffffffff166370a082317f00000000000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b8152600401612737919073ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b60206040518083038186803b15801561274f57600080fd5b505afa158015612763573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061278791906129ee565b6127919190612a4d565b61279b9190612a4d565b6127a59190612a4d565b6127af9190612a8a565b6127b99190612a8a565b90508764e8d4a510006127cc8383612c4a565b8b106127e1576127dc838b612c4a565b6127e3565b8a5b6127ed9190612a4d565b6127f79190612a8a565b99505050505050505050505b949350505050565b60008281526001840160209081526040808320549186905290912082905580156128355750505050565b6002840154612845906001612c4a565b6000848152600180870160209081526040832093909355600290960180549687018155815220909301919091555050565b60006020828403121561288857600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff81168114611e6857600080fd5b600080604083850312156128c457600080fd5b82356128cf8161288f565b946020939093013593505050565b6000602082840312156128ef57600080fd5b81356108778161288f565b6020808252825182820181905260009190848201906040850190845b8181101561293257835183529284019291840191600101612916565b50909695505050505050565b8015158114611e6857600080fd5b6000806040838503121561295f57600080fd5b8235915060208301356129718161293e565b809150509250929050565b6000806040838503121561298f57600080fd5b823561299a8161288f565b915060208301356129718161288f565b600080600080600060a086880312156129c257600080fd5b85356129cd8161288f565b97602087013597506040870135966060810135965060800135945092505050565b600060208284031215612a0057600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015612a4857612a48612a07565b500390565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612a8557612a85612a07565b500290565b600082612ac0577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612b5557612b55612a07565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600080600060608486031215612ba057600080fd5b8351925060208401519150604084015190509250925092565b60008060008060008060008060006101208a8c031215612bd857600080fd5b8951985060208a0151975060408a0151965060608a0151955060808a0151945060a08a0151935060c08a0151925060e08a0151612c148161293e565b809250506101008a015190509295985092959850929598565b600060208284031215612c3f57600080fd5b81516108778161288f565b60008219821115612c5d57612c5d612a07565b50019056fea264697066735822122037437fdbbf51c04fec2d9687f2bb653f67da20419c640ee97aa67f33887dc60b64736f6c6343000809003300000000000000000000000054ba4075ceb2e31ed20e0cc442ea8ca0f3479ccf000000000000000000000000ab387712bead1e4c031977f69230245e3af79a8f00000000000000000000000017d138722cdafdd2c1ff61026d568b5332db02ee0000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000c350000000000000000000000000000000000000000000000000000000000000000a

Deployed ByteCode

0x608060405234801561001057600080fd5b50600436106102775760003560e01c80637644d70c11610160578063ae69d198116100d8578063cdf7b7171161008c578063e874fdaf11610071578063e874fdaf14610539578063edd8b1701461054c578063f2fde38b1461057357600080fd5b8063cdf7b717146104ff578063daa81f301461052657600080fd5b8063b7d6ee5a116100bd578063b7d6ee5a146104e3578063c61a66e0146104f6578063cc6db2da146104c457600080fd5b8063ae69d198146104c4578063b260c42a146104d057600080fd5b80638abe30031161012f5780639c1ebe63116101145780639c1ebe63146104a05780639cc1d7be146104a9578063a9d4630c146104b157600080fd5b80638abe3003146103185780638da5cb5b1461048257600080fd5b80637644d70c1461041d578063803f18dc1461043057806381057714146104665780638a8a6ee01461046f57600080fd5b80634ca6ef28116101f35780635d1554d9116101c257806369b02128116101a757806369b02128146103f55780636cbb37dd14610402578063715018a61461041557600080fd5b80635d1554d9146103cc57806366406944146103ec57600080fd5b80634ca6ef28146103555780634ffcbb39146103a15780635c475d42146103a95780635c5aaa491461031857600080fd5b806325f148731161024a5780632d015aff1161022f5780632d015aff146103185780633a1d1e8c1461032257806349b61ce01461033557600080fd5b806325f14873146102fd5780632707a8111461031057600080fd5b80630dcebf651461027c57806317adb6ee146102915780631959a002146102a45780631a13b41e146102da575b600080fd5b61028f61028a366004612876565b610586565b005b61028f61029f3660046128b1565b610761565b6102c76102b23660046128dd565b60076020526000908152604090206003015481565b6040519081526020015b60405180910390f35b6102ed6102e83660046128b1565b610832565b60405190151581526020016102d1565b61028f61030b366004612876565b61087e565b6102c76109bc565b6102c7620186a081565b61028f6103303660046128dd565b610ed8565b6103486103433660046128dd565b611050565b6040516102d191906128fa565b61037c7f00000000000000000000000054ba4075ceb2e31ed20e0cc442ea8ca0f3479ccf81565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102d1565b6102c7603281565b6102ed6103b7366004612876565b60056020526000908152604090205460ff1681565b60015461037c9073ffffffffffffffffffffffffffffffffffffffff1681565b6102c760025481565b6102c76501d1a94a200081565b61028f610410366004612876565b61115b565b61028f611295565b61028f61042b3660046128b1565b611322565b61037c61043e3660046128dd565b60066020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b6102c760045481565b61028f61047d36600461294c565b611507565b60005473ffffffffffffffffffffffffffffffffffffffff1661037c565b6102c760035481565b6102c7600081565b61028f6104bf36600461297c565b6115f8565b6102c764e8d4a5100081565b61028f6104de366004612876565b611836565b6102c76104f13660046128b1565b611a0d565b6102c761271081565b61037c7f000000000000000000000000ab387712bead1e4c031977f69230245e3af79a8f81565b61028f610534366004612876565b611a4b565b61028f6105473660046129aa565b611b91565b61037c7f00000000000000000000000017d138722cdafdd2c1ff61026d568b5332db02ee81565b61028f6105813660046128dd565b611d3b565b3360009081526006602090815260408083205473ffffffffffffffffffffffffffffffffffffffff168084526007835281842085855260018101909352922054610631576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f64656163746976653a204e6f6e6520626f6f737420757365720000000000000060448201526064015b60405180910390fd5b60008381526020829052604090205464e8d4a510001015610700576040517f041a84c900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83811660048301526024820185905264e8d4a5100060448301527f00000000000000000000000017d138722cdafdd2c1ff61026d568b5332db02ee169063041a84c990606401600060405180830381600087803b1580156106e757600080fd5b505af11580156106fb573d6000803e3d6000fd5b505050505b61070a8184611e6b565b6040805173ffffffffffffffffffffffffffffffffffffffff841681526020810185905233917f95012b3ffd890212456f6da3513cee9eba8326003c39fcaaa1d2b5e0babe6eba91015b60405180910390a2505050565b73ffffffffffffffffffffffffffffffffffffffff82811660009081526006602052604090205483911633146107f3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f6f6e6c7950726f78793a204e6f742070726f78790000000000000000000000006044820152606401610628565b33600090815260076020908152604080832085845260010190915290205461081a57505050565b61082d8333846108286109bc565b611f4e565b505050565b73ffffffffffffffffffffffffffffffffffffffff82811660009081526006602090815260408083205490931682526007815282822084835260010190529081205415155b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146108ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610628565b600081118015610910575060328111155b610976576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f73657443423a20496e76616c69642063420000000000000000000000000000006044820152606401610628565b600480549082905560408051828152602081018490527fff6a4b972407d470846bd3a5979c60d68807653244cc8d096c4174a76486e71c91015b60405180910390a15050565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000ab387712bead1e4c031977f69230245e3af79a8f8116600483015260009182917f00000000000000000000000054ba4075ceb2e31ed20e0cc442ea8ca0f3479ccf16906370a082319060240160206040518083038186803b158015610a6857600080fd5b505afa158015610a7c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aa091906129ee565b905060007f000000000000000000000000ab387712bead1e4c031977f69230245e3af79a8f73ffffffffffffffffffffffffffffffffffffffff166305a9f2746040518163ffffffff1660e01b815260040160206040518083038186803b158015610b0a57600080fd5b505afa158015610b1e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b4291906129ee565b905060007f000000000000000000000000ab387712bead1e4c031977f69230245e3af79a8f73ffffffffffffffffffffffffffffffffffffffff166377c7b8fc6040518163ffffffff1660e01b815260040160206040518083038186803b158015610bac57600080fd5b505afa158015610bc0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610be491906129ee565b9050600081610bf38486612a36565b610c0590670de0b6b3a7640000612a4d565b610c0f9190612a8a565b905080610c2157600094505050505090565b600082610c3685670de0b6b3a7640000612a4d565b610c409190612a8a565b905080610c535760009550505050505090565b600081620186a0847f000000000000000000000000ab387712bead1e4c031977f69230245e3af79a8f73ffffffffffffffffffffffffffffffffffffffff16633a98ef396040518163ffffffff1660e01b815260040160206040518083038186803b158015610cc157600080fd5b505afa158015610cd5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cf991906129ee565b610d039190612a36565b610d0d9190612a4d565b610d179190612a8a565b9050620186a08111610d30576000965050505050505090565b60007f000000000000000000000000ab387712bead1e4c031977f69230245e3af79a8f73ffffffffffffffffffffffffffffffffffffffff1663bc75f4b86040518163ffffffff1660e01b815260040160206040518083038186803b158015610d9857600080fd5b505afa158015610dac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dd091906129ee565b90506000620186a07f000000000000000000000000ab387712bead1e4c031977f69230245e3af79a8f73ffffffffffffffffffffffffffffffffffffffff16634f1bfc9e6040518163ffffffff1660e01b815260040160206040518083038186803b158015610e3e57600080fd5b505afa158015610e52573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e7691906129ee565b610e809190612a4d565b905060008264e8d4a51000610e98620186a087612a36565b610ea49061016d612a4d565b610eae9190612a4d565b610eb89190612a8a565b905081811115610ec85781610eca565b805b995050505050505050505090565b60005473ffffffffffffffffffffffffffffffffffffffff163314610f59576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610628565b73ffffffffffffffffffffffffffffffffffffffff8116610fd6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f736574426f6f7374466163746f72793a20496e76616c696420666163746f72796044820152606401610628565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fb9ce93c498aebed04d07c95e5f16a67e9b872b65650386f6f5df4982166a0033906020015b60405180910390a150565b73ffffffffffffffffffffffffffffffffffffffff808216600090815260066020908152604080832054909316825260079052206002810154606091906110975750919050565b600281015467ffffffffffffffff8111156110b4576110b4612ac5565b6040519080825280602002602001820160405280156110dd578160200160208202803683370190505b5091506000805b600283015481101561115357600083600201828154811061110757611107612af4565b906000526020600020015490508085848151811061112757611127612af4565b60209081029190910101528261113c81612b23565b93505050808061114b90612b23565b9150506110e4565b505050919050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146111dc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610628565b61271081101580156111f15750620186a08111155b611257576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f73657443413a20496e76616c69642063410000000000000000000000000000006044820152606401610628565b600380549082905560408051828152602081018490527f948053d58d4dfed61c0843c01f010e1a4446c65f03d475567102cc64dfe0ecd491016109b0565b60005473ffffffffffffffffffffffffffffffffffffffff163314611316576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610628565b611320600061229a565b565b333b1561138b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f636f6e7472616374206e6f7420616c6c6f7765640000000000000000000000006044820152606401610628565b3332146113f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f70726f787920636f6e7472616374206e6f7420616c6c6f7765640000000000006044820152606401610628565b73ffffffffffffffffffffffffffffffffffffffff828116600090815260066020908152604080832054909316808352600782528383208584526001810190925292909120546114a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f726566726573683a204e6f6e6520626f6f7374207573657200000000000000006044820152606401610628565b6114ae8483856108286109bc565b6040805173ffffffffffffffffffffffffffffffffffffffff8481168252602082018690528616917f6388bc5bf9da0fef8880f20ca5355e721c80037d6449b03917900238ffcca24f910160405180910390a250505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611588576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610628565b60008281526005602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168415159081179091558251858152918201527fbeef892af000af61e107ef5e9c764acbccd54157fd6c219d241750fb3eca310291016109b0565b60015473ffffffffffffffffffffffffffffffffffffffff163314611679576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f6f6e6c79466163746f72793a204e6f7420666163746f727900000000000000006044820152606401610628565b73ffffffffffffffffffffffffffffffffffffffff81166116f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f73657450726f78793a20496e76616c69642070726f78792061646472657373006044820152606401610628565b73ffffffffffffffffffffffffffffffffffffffff82811660009081526006602052604090205416156117aa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f73657450726f78793a20557365722068617320616c726561647920736574207060448201527f726f7879000000000000000000000000000000000000000000000000000000006064820152608401610628565b73ffffffffffffffffffffffffffffffffffffffff82811660008181526006602090815260409182902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169486169485179055905192835290917fdebc5d6c541ae1ed122237a2c4adfe2d109e37c5848c54fb74477c7a6d95fcf3910160405180910390a25050565b3360009081526006602090815260408083205484845260059092529091205473ffffffffffffffffffffffffffffffffffffffff9091169060ff168015611892575073ffffffffffffffffffffffffffffffffffffffff811615155b6118f8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f61637469766174653a204e6f7420626f6f73746564206661726d20706f6f6c006044820152606401610628565b73ffffffffffffffffffffffffffffffffffffffff811660009081526007602052604090206002805490820154106119b1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f61637469766174653a20426f6f73746564206661726d7320726561636820746f60448201527f204d4158000000000000000000000000000000000000000000000000000000006064820152608401610628565b6119bf3383856108286109bc565b6040805173ffffffffffffffffffffffffffffffffffffffff841681526020810185905233917f9fde6fe213b149e24765c2e8365b56107f5ccaa4cf5bf0ab8e8a51c111c4f68c9101610754565b73ffffffffffffffffffffffffffffffffffffffff80831660009081526006602052604081205490916108779185911684611a466109bc565b61230f565b60005473ffffffffffffffffffffffffffffffffffffffff163314611acc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610628565b60008111611b5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f7365744d6178426f6f7374506f6f6c3a204d6178696d756d20626f6f7374207060448201527f6f6f6c2073686f756c642067726561746572207468616e2030000000000000006064820152608401610628565b60028190556040518181527f6c83390e748eac13e3531723e6b8cd596128bcf5e7828be22cb2e7f979b5b7df90602001611045565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000ab387712bead1e4c031977f69230245e3af79a8f1614611c30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f6f6e6c7943616b65506f6f6c3a204e6f742063616b6520706f6f6c00000000006044820152606401610628565b73ffffffffffffffffffffffffffffffffffffffff80861660009081526006602090815260408083205490931680835260079091529181209080805b6002840154811015611ccf576000846002018281548110611c8f57611c8f612af4565b9060005260206000200154905082611cb057611ca96109bc565b9350600192505b611cbc8b878387611f4e565b5080611cc781612b23565b915050611c6c565b5060408051898152602081018990529081018790526060810186905273ffffffffffffffffffffffffffffffffffffffff8a16907f4f25e09d2aa19c6510101d1f39a2f36e12ac77e34d234c68920ba710f6d6f1b19060800160405180910390a2505050505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611dbc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610628565b73ffffffffffffffffffffffffffffffffffffffff8116611e5f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610628565b611e688161229a565b50565b600081815260018301602052604090205480611e8657505050565b60028301805460009190611e9c90600190612a36565b81548110611eac57611eac612af4565b90600052602060002001549050808314611f03578060028501611ed0600185612a36565b81548110611ee057611ee0612af4565b600091825260208083209091019290925582815260018601909152604090208290555b6000838152602085815260408083208390556001870190915281205560028401805480611f3257611f32612b5c565b6001900381819060005260206000200160009055905550505050565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260076020908152604080832085845260059092529091205460ff166120685760008381526020829052604090205464e8d4a510001015612058576040517f041a84c900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301526024820185905264e8d4a5100060448301527f00000000000000000000000017d138722cdafdd2c1ff61026d568b5332db02ee169063041a84c990606401600060405180830381600087803b15801561203f57600080fd5b505af1158015612053573d6000803e3d6000fd5b505050505b6120628184611e6b565b50612294565b6040517f033186e800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018590526000917f00000000000000000000000017d138722cdafdd2c1ff61026d568b5332db02ee9091169063033186e89060440160206040518083038186803b1580156120fb57600080fd5b505afa15801561210f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061213391906129ee565b905060006121438787878761230f565b905064e8d4a5100081101561215e575064e8d4a51000612175565b6501d1a94a200081111561217557506501d1a94a20005b81811461222c576040517f041a84c900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff878116600483015260248201879052604482018390527f00000000000000000000000017d138722cdafdd2c1ff61026d568b5332db02ee169063041a84c990606401600060405180830381600087803b15801561221357600080fd5b505af1158015612227573d6000803e3d6000fd5b505050505b61223783868361280b565b604080518681526020810184905290810182905273ffffffffffffffffffffffffffffffffffffffff8816907fe50f0d49657b1a6caa28100eec500f3aab7c4cc39633ebf432f02c2dec2e0e019060600160405180910390a25050505b50505050565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600081612322575064e8d4a51000612803565b6040517f93f1a40b0000000000000000000000000000000000000000000000000000000081526004810184905273ffffffffffffffffffffffffffffffffffffffff85811660248301526000917f00000000000000000000000017d138722cdafdd2c1ff61026d568b5332db02ee909116906393f1a40b9060440160606040518083038186803b1580156123b557600080fd5b505afa1580156123c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123ed9190612b8b565b505090506000620186a0826003546124059190612a4d565b61240f9190612a8a565b905081158061241c575080155b156124305764e8d4a5100092505050612803565b6040517f1959a00200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8881166004830152600091829182917f000000000000000000000000ab387712bead1e4c031977f69230245e3af79a8f90911690631959a002906024016101206040518083038186803b1580156124c157600080fd5b505afa1580156124d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124f99190612bb9565b98505050965096505050505080600014806125145750814210155b1561252b5764e8d4a5100095505050505050612803565b60007f000000000000000000000000ab387712bead1e4c031977f69230245e3af79a8f73ffffffffffffffffffffffffffffffffffffffff166305a9f2746040518163ffffffff1660e01b815260040160206040518083038186803b15801561259357600080fd5b505afa1580156125a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125cb91906129ee565b6040517f78ed5d1f000000000000000000000000000000000000000000000000000000008152600481018b905290915060009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000017d138722cdafdd2c1ff61026d568b5332db02ee16906378ed5d1f9060240160206040518083038186803b15801561265757600080fd5b505afa15801561266b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061268f9190612c2d565b90506000620151806126a18787612a36565b6126ab9190612a8a565b905060006126b98b85612a4d565b600454620186a084888773ffffffffffffffffffffffffffffffffffffffff166370a082317f00000000000000000000000017d138722cdafdd2c1ff61026d568b5332db02ee6040518263ffffffff1660e01b8152600401612737919073ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b60206040518083038186803b15801561274f57600080fd5b505afa158015612763573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061278791906129ee565b6127919190612a4d565b61279b9190612a4d565b6127a59190612a4d565b6127af9190612a8a565b6127b99190612a8a565b90508764e8d4a510006127cc8383612c4a565b8b106127e1576127dc838b612c4a565b6127e3565b8a5b6127ed9190612a4d565b6127f79190612a8a565b99505050505050505050505b949350505050565b60008281526001840160209081526040808320549186905290912082905580156128355750505050565b6002840154612845906001612c4a565b6000848152600180870160209081526040832093909355600290960180549687018155815220909301919091555050565b60006020828403121561288857600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff81168114611e6857600080fd5b600080604083850312156128c457600080fd5b82356128cf8161288f565b946020939093013593505050565b6000602082840312156128ef57600080fd5b81356108778161288f565b6020808252825182820181905260009190848201906040850190845b8181101561293257835183529284019291840191600101612916565b50909695505050505050565b8015158114611e6857600080fd5b6000806040838503121561295f57600080fd5b8235915060208301356129718161293e565b809150509250929050565b6000806040838503121561298f57600080fd5b823561299a8161288f565b915060208301356129718161288f565b600080600080600060a086880312156129c257600080fd5b85356129cd8161288f565b97602087013597506040870135966060810135965060800135945092505050565b600060208284031215612a0057600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015612a4857612a48612a07565b500390565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612a8557612a85612a07565b500290565b600082612ac0577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612b5557612b55612a07565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600080600060608486031215612ba057600080fd5b8351925060208401519150604084015190509250925092565b60008060008060008060008060006101208a8c031215612bd857600080fd5b8951985060208a0151975060408a0151965060608a0151955060808a0151945060a08a0151935060c08a0151925060e08a0151612c148161293e565b809250506101008a015190509295985092959850929598565b600060208284031215612c3f57600080fd5b81516108778161288f565b60008219821115612c5d57612c5d612a07565b50019056fea264697066735822122037437fdbbf51c04fec2d9687f2bb653f67da20419c640ee97aa67f33887dc60b64736f6c63430008090033