false
true
0

Contract Address Details

0x5a73F15144e797f1f2B8D168eeCEb4Dd0aEd7b20

Contract Name
MasterChefX
Creator
0x7008d2–e6e3cf at 0xb921d6–805094
Balance
0 PLS ( )
Tokens
Fetching tokens...
Transactions
5,868 Transactions
Transfers
0 Transfers
Gas Used
703,942,650
Last Balance Update
25967019
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
Contract name:
MasterChefX




Optimization enabled
false
Compiler version
v0.8.20+commit.a1b79de6




EVM Version
shanghai




Verified at
2025-06-29T09:49:46.349027Z

Contract source code

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

interface IERC20 {
    function totalSupply() external view returns (uint256);

    function name() external view returns(string memory);
    function symbol() external view returns(string memory);
    function decimals() external view returns (uint8);

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

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

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

interface IToken is IERC20 {
    function mint(address _to, uint256 _amount) external;
    function burn(uint256 _amount) external;
}

interface IOwnable {
    function acceptOwnership() external;
    function proposeNewOwner(address newOwner) external;
}

interface ISwapFactory {
    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function createPair(address tokenA, address tokenB) external returns (address pair);
}

library Address {
    function isContract(address account) internal view returns (bool) {
        uint256 size;
        assembly { size := extcodesize(account) }
        return size > 0;
    }

    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
      return functionCall(target, data, "Address: low-level call failed");
    }

    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

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

    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");
        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        if (success) {
            return returndata;
        } else {
            if (returndata.length > 0) {
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

library SafeMath {
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }
    
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

library SafeERC20 {
    using Address for address;

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

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

    function safeApprove(IERC20 token, address spender, uint256 value) internal {
        require((value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

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

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

    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

abstract contract Ownable is Context {

    address private _owner;
    address private _proposedOwner;

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

    error NotOwner();
    error NotProposedOwner();
    error SameAddress();
    error ZeroAddress();
    error NoOwnershipTransfer();

    constructor () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    function owner() public view virtual returns (address) {
        return _owner;
    }

    function proposedNewOwner() public view returns (address) {
        return _proposedOwner;
    }

    modifier onlyOwner() {
        if(_msgSender() != owner()) revert NotOwner();
        _;
    }

    modifier onlyProposedOwner() {
        if (_msgSender() != proposedNewOwner()) revert NotProposedOwner();
        _;
    }

    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    function proposeNewOwner(address newOwner) public virtual onlyOwner {
        if (newOwner == address(0)) revert ZeroAddress();
        if (newOwner == _owner) revert SameAddress();
        emit NewOwnerProposed(newOwner);
        _proposedOwner = newOwner;
    }

    function acceptOwnership() public virtual onlyProposedOwner {
        if (_proposedOwner == address(0)) revert NoOwnershipTransfer();
        emit OwnershipTransferred(_owner, _proposedOwner);
        _owner = _proposedOwner;
        _proposedOwner = address(0);
    }
}

abstract contract ReentrancyGuard {
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;
    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    modifier nonReentrant() {
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
        _status = _ENTERED;
        _;
        _status = _NOT_ENTERED;
    }
}

contract MasterChefX is Ownable, ReentrancyGuard {
    using SafeMath for uint256;
    using SafeERC20 for IERC20;

    // Modifier: isLaunched - this helps to allow for setup prior to launch
    modifier isLaunched() {
        require(setupMode == false || msg.sender == deployer, "SETUP_MODE_ENGAGED");
        _;
    }

    ///////////////////////////////
    // CONFIGURABLES & VARIABLES //
    ///////////////////////////////

    address public feeRecipient;    // Where the deposit/withdraw fees on LP Pools go

    bool public setupMode;          // Whether or not the contract is in setup mode
    
    uint256 public yieldPerSecond;  // How many YIELD per second to emit for rewards
    uint256 public totalAllocPoint; // Total allocPts between all pools

    ////////////////////////////
    // CONSTANTS & IMMUTABLES //
    ////////////////////////////

    ISwapFactory public constant PulseXV2Factory = ISwapFactory(0x29eA7545DEf87022BAdc76323F373EA1e707C523);

    IERC20 public constant gem = IERC20(ISLAND);
    IToken public constant rewards = IToken(YIELD);

    address public constant PLSX = 0x95B303987A60C71504D99Aa1b13B4DA07b0790ab;
    address public constant DAI = 0xefD766cCb38EaF1dfd701853BFCe31359239F305;
    address public constant WPLS = 0xA1077a294dDE1B09bB078844df40758a5D0f9a27;

    address public constant ISLAND = 0xDFB10795E6fE7D0Db68F9778Ba4C575a28E8Cd4c;
    address public constant YIELD = 0xfc56F3098533446b2226E9D526780cF40018D4c4;

    uint16 public constant maxFeePercentage = 500; // 5% fee on deposit/withdraw, maximum.

    uint256 public constant lockPeriod = 4 weeks;

    address public immutable deployer;
    uint256 public immutable startTime;

    ///////////////////////////////
    // DATA STRUCTURES & STORAGE //
    ///////////////////////////////

    // Info of each stake.
    struct StakeInfo {
        uint256 amount;
        uint256 stakeTime;
    }

    // Info of each user.
    struct UserInfo {
        uint256 amount;
        uint256 rewardDebt;
    }

    // Ref reward info.
    struct RewardInfo {
        uint256 pending;
        uint256 total;
    }

    // Info of each pool.
    struct PoolInfo {
        IERC20 lpToken;           // Address of LP token contract.
        uint256 allocPoint;       // How many allocation points assigned to this pool.
        uint256 lockThreshold;    // How much ISLAND must be locked to have no fees on this pool.
        uint256 lastRewardTime;   // Last time that YIELD distribution occurs.
        uint256 accYieldPerShare; // Accumulated YIELD per share, times 1e12. See below.
    }

    PoolInfo[] public poolInfo;
    
    mapping (address => StakeInfo) public stakeData;
    mapping (address => RewardInfo) public rewardData;

    mapping (address => bool) public poolExists;
    mapping (uint256 => mapping (address => UserInfo)) public userInfo;

    /////////////////////
    // CONTRACT EVENTS //
    /////////////////////

    event Claim(address indexed user, uint256 amount);
    event Stake(address indexed user, uint256 amountOut);
    event Unstake(address indexed user, uint256 amountOut);
    event Deposit(address indexed user, uint256 indexed pid, uint256 amount);
    event Withdraw(address indexed user, uint256 indexed pid, uint256 amount);
    event Exit(address indexed user, uint256 indexed pid, uint256 amount);

    event FeeCollected(address indexed recipient, uint256 amount, uint256 pid);
    event PoolAdded(uint256 indexed pid, address lpToken, uint256 allocPoint, uint256 lockThreshold);

    event updatedAllocPts(uint256 indexed pid, uint256 oldAllocPoint, uint256 newAllocPoint);
    event updatedEmissions(uint256 oldYieldPerSecond, uint256 newYieldPerSecond);
    event updatedLockThreshold(uint256 poolId, uint16 threshold);
    event updatedFeeRecipient(address oldRecipient, address newRecipient);

    event LFG_WAGMI_FAM();

    ////////////////////////////
    // CONSTRUCTOR & FALLBACK //
    ////////////////////////////

    constructor() {

        yieldPerSecond = 1e15; // Should be 0.001 YIELD per second

        deployer = msg.sender;
        feeRecipient = msg.sender;
        startTime = block.timestamp;

        setupMode = true;
    }

    ////////////////////
    // VIEW FUNCTIONS //
    ////////////////////

    // Get how many pools there are in total
    function poolLength() external view returns (uint256) {
        return poolInfo.length;
    }

    // Get reward multiplier over the given _from to _to time
    function getMultiplier(uint256 _from, uint256 _to) public view returns (uint256) {
        _from = _from > startTime ? _from : startTime;
        if (_to < startTime) {
            return 0;
        }
        return _to - _from;
    }

    // Get potential referral bonus
    function getReferralBonus(uint256 _rewards) public pure returns (uint256) {
        return ((_rewards * 300) / 10000);
    }

    // Get dynamic fee bp rate based on amount locked
    function getDynamicFeeBP(uint256 _pid, address _user) public view returns (uint16) {
        StakeInfo storage stakeInfo = stakeData[_user];
        PoolInfo storage pool = poolInfo[_pid];
        uint256 userLocked = stakeInfo.amount;
        uint256 requiredAmt = pool.lockThreshold;

        if (requiredAmt == 0 || userLocked >= requiredAmt) {
            return 0;
        }

        userLocked = SafeMath.min(userLocked, requiredAmt);
        uint256 feeBP = uint256(maxFeePercentage)
            .mul(requiredAmt.sub(userLocked))
            .div(requiredAmt);
        return uint16(feeBP);
    }

    // Calculate the fees on an amount for a particular address
    function getAmountWithFees(uint256 _pid, address _user, uint256 _amountIn) public view returns (uint256 feeAmount, uint256 amountAfterFees) {
        if (isExcludedFromFees(_pid, _user)) {
            return (0, _amountIn);
        }

        uint256 _feeAmount = (_amountIn.mul(getDynamicFeeBP(_pid, _user))).div(10000);
        uint256 _amountOut = _amountIn.sub(_feeAmount);

        return (_feeAmount, _amountOut);
    }

    // Get pending YIELD of an address in a pool
    function pendingYield(uint256 _pid, address _user) external view returns (uint256) {
        PoolInfo storage pool = poolInfo[_pid];
        UserInfo storage user = userInfo[_pid][_user];
        uint256 accYieldPerShare = pool.accYieldPerShare;
        uint256 lpSupply = pool.lpToken.balanceOf(address(this));
        if (block.timestamp > pool.lastRewardTime && lpSupply != 0) {
            uint256 multiplier = getMultiplier(pool.lastRewardTime, block.timestamp);
            uint256 yieldReward = multiplier.mul(yieldPerSecond).mul(pool.allocPoint).div(totalAllocPoint);
            accYieldPerShare = accYieldPerShare.add(yieldReward.mul(1e12).div(lpSupply));
        }
        return user.amount.mul(accYieldPerShare).div(1e12).sub(user.rewardDebt);
    }

    // Get pending referral rewards for a user
    function pendingRewards(address _user) external view returns (RewardInfo memory) {
        return rewardData[_user];
    }

    // Get staked tokens of an address
    function lockedTokens(address _user) external view returns (uint256) {
        return stakeData[_user].amount;
    }

    // Get time till unlock of staked tokens
    function timeToUnlock(address _user) external view returns (uint256 timeRemaining) {
        StakeInfo memory _stake = stakeData[_user];

        // If no stake exists, or stake amount is zero, return 0
        if (_stake.amount == 0) return 0;

        // If current time is before stake time (shouldn't happen, but safe fallback)
        if (block.timestamp < _stake.stakeTime) return 0;

        uint256 elapsedTime = block.timestamp - _stake.stakeTime;

        // If lock already expired
        if (elapsedTime >= lockPeriod) return 0;

        // Return remaining lock time
        return lockPeriod - elapsedTime;
    }

    // Check if an address is excluded from fees
    function isExcludedFromFees(uint256 _pid, address _user) public view returns (bool excluded) {
        excluded = (stakeData[_user].amount >= poolInfo[_pid].lockThreshold);
    }

    /////////////////////
    // WRITE FUNCTIONS //
    /////////////////////

    // Update a batch of the pools - mitigates gas issues if too many pools
    function updatePoolsBatch(uint256 startIdx, uint256 endIdx) external {
        require(endIdx < poolInfo.length, "End index out of bounds");
        for (uint256 pid = startIdx; pid <= endIdx; ++pid) {
            updatePool(pid);
        }
    }

    // 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.timestamp <= pool.lastRewardTime) {
            return;
        }
        
        uint256 lpSupply = pool.lpToken.balanceOf(address(this));
        
        if (lpSupply == 0) {
            pool.lastRewardTime = block.timestamp;
            return;
        }
        
        uint256 multiplier = getMultiplier(pool.lastRewardTime, block.timestamp);
        uint256 yieldReward = multiplier.mul(yieldPerSecond).mul(pool.allocPoint).div(totalAllocPoint);

        pool.accYieldPerShare = pool.accYieldPerShare.add(yieldReward.mul(1e12).div(lpSupply));
        pool.lastRewardTime = block.timestamp;
    }

    // Deposit LP tokens to MasterChef for YIELD allocation.
    function deposit(address _referrer, uint256 _pid, uint256 _amount) public isLaunched nonReentrant {
        require(_pid < poolInfo.length, "Pool does not exist");

        if (_referrer == address(0) || _referrer == msg.sender) {
            _referrer = deployer;
        }

        // Effects - update state
        PoolInfo storage pool = poolInfo[_pid];
        UserInfo storage user = userInfo[_pid][msg.sender];
        updatePool(_pid);
        
        uint256 pending = user.amount.mul(pool.accYieldPerShare).div(1e12).sub(user.rewardDebt);
        (uint256 feeAmount, uint256 amountOut) = getAmountWithFees(_pid, msg.sender, _amount);
        
        user.amount = user.amount.add(amountOut);
        user.rewardDebt = user.amount.mul(pool.accYieldPerShare).div(1e12);
        
        // Interactions - external calls
        pool.lpToken.safeTransferFrom(address(msg.sender), address(this), _amount);
        
        if (feeAmount > 0) {
            pool.lpToken.safeTransfer(address(feeRecipient), feeAmount);
            emit FeeCollected(feeRecipient, feeAmount, _pid);
        }
        
        if(pending > 0) {
            rewards.mint(msg.sender, pending);
        }

        uint256 refBonus = getReferralBonus(pending);

        if (refBonus > 0) {
            _credit(_referrer, refBonus);
        }
        
        emit Deposit(msg.sender, _pid, _amount);
    }

    // Withdraw LP tokens from MasterChef.
    function withdraw(address _referrer, uint256 _pid, uint256 _amount) public nonReentrant {  
        require(_pid < poolInfo.length, "Pool does not exist");
        
        // Checks
        PoolInfo storage pool = poolInfo[_pid];
        UserInfo storage user = userInfo[_pid][msg.sender];
        require(user.amount >= _amount, "withdraw: not good");

        if (_referrer == address(0) || _referrer == msg.sender) {
            _referrer = deployer;
        }
        
        // Effects - update state
        updatePool(_pid);
        
        uint256 pending = user.amount.mul(pool.accYieldPerShare).div(1e12).sub(user.rewardDebt);
        (uint256 feeAmount, uint256 amountOut) = getAmountWithFees(_pid, msg.sender, _amount);
        
        user.amount = user.amount.sub(_amount);
        user.rewardDebt = user.amount.mul(pool.accYieldPerShare).div(1e12);
        
        // Interactions - external calls
        pool.lpToken.safeTransfer(address(msg.sender), amountOut);
        
        if (feeAmount > 0) {
            pool.lpToken.safeTransfer(address(feeRecipient), feeAmount);
            emit FeeCollected(feeRecipient, feeAmount, _pid);
        }
        
        if(pending > 0) {
            rewards.mint(msg.sender, pending);
        }

        uint256 refBonus = getReferralBonus(pending);

        if (refBonus > 0) {
            _credit(_referrer, refBonus);
        }
        
        emit Withdraw(msg.sender, _pid, _amount);
    }

    // Stake tokens - lockPeriod starts over on deposit
    function stake(uint256 _amountIn) public isLaunched nonReentrant {
        StakeInfo storage _stake = stakeData[msg.sender];

        // Sanity Checks
        require(_amountIn > 0, "ZERO_AMOUNT_NOT_ALLOWED");

        // Increase staked balance
        _stake.amount = (_stake.amount).add(_amountIn);

        // Set the time of last stake() for caller
        _stake.stakeTime = block.timestamp;

        // Collect gem from caller
        gem.safeTransferFrom(msg.sender, address(this), _amountIn);

        // Tell the network
        emit Stake(msg.sender, _amountIn);
    }

    // Unstake tokens - only once lockPeriod has elapsed
    function unstake() public nonReentrant returns (uint256 _amountOut) {
        StakeInfo storage _stake = stakeData[msg.sender];

        // Sanity checks
        require(_stake.amount > 0, "ZERO_AMOUNT_NOT_ALLOWED");

        // Calculate lockPeriod and the time since lock
        uint256 sinceLock = (block.timestamp).sub(_stake.stakeTime);
        require(sinceLock >= lockPeriod, "NOT_READY_TO_UNSTAKE_YET");

        // Set amount out
        _amountOut = _stake.amount;

        // Update staked amount
        _stake.amount = 0;

        // Send stakedToken to the caller
        gem.safeTransfer(msg.sender, _amountOut);

        // Tell the network
        emit Unstake(msg.sender, _amountOut);
    }

    // Claim Referral Rewards
    function claimReferralRewards() public nonReentrant {

        uint256 pending = 0;
        RewardInfo memory data = rewardData[msg.sender];

        if (data.pending > 0) {
            pending = pending.add(data.pending);
            _settle(msg.sender);
        }

        rewards.mint(msg.sender, pending);

        emit Claim(msg.sender, pending);
    }

    // Withdraw without caring about rewards. EMERGENCY ONLY.
    function emergencyWithdraw(uint256 _pid) public nonReentrant {
        PoolInfo storage pool = poolInfo[_pid];
        UserInfo storage user = userInfo[_pid][msg.sender];

        uint oldUserAmount = user.amount;
        user.amount = 0;
        user.rewardDebt = 0;

        pool.lpToken.safeTransfer(address(msg.sender), oldUserAmount);
        emit Exit(msg.sender, _pid, oldUserAmount);
    }

    //////////////////////////
    // RESTRICTED FUNCTIONS //
    //////////////////////////

    // Changes YIELD token reward per second
    // Good practice to update pools without messing up the contract
    function setYieldPerSecond(uint256 _yieldPerSecond) external onlyOwner {
        uint256 oldValue = yieldPerSecond;
        require(_yieldPerSecond < oldValue, "ONLY_DECREASES");

        massUpdatePools();
        yieldPerSecond = _yieldPerSecond;

        emit updatedEmissions(oldValue, _yieldPerSecond);
    }

    // Add a new lp to the pool. Can only be called by the owner.
    function addNewPool(uint256 _lockThreshold, uint256 _allocPoint, IERC20 _lpToken) external onlyOwner {
        require(poolExists[address(_lpToken)] == false, "ALREADY_EXISTS");

        _addPool(_lpToken, _lockThreshold, _allocPoint);

        emit PoolAdded(poolInfo.length - 1, address(_lpToken), _allocPoint, _lockThreshold);
    }

    // Update the given pool's YIELD allocation point. Can only be called by the owner.
    function setPoolAllocPts(uint256 _pid, uint256 _allocPoint) external onlyOwner {

        uint256 oldAllocPoint = poolInfo[_pid].allocPoint;

        if (poolInfo[_pid].allocPoint > _allocPoint) {
            require(totalAllocPoint - (poolInfo[_pid].allocPoint - _allocPoint) > 0, "add: can't set totalAllocPoint to 0!!");
        }

        massUpdatePools();

        totalAllocPoint = (totalAllocPoint.sub(poolInfo[_pid].allocPoint)).add(_allocPoint);
        poolInfo[_pid].allocPoint = _allocPoint;

        emit updatedAllocPts(_pid, oldAllocPoint, _allocPoint);
    }

    // Set the lock threshold
    function setLockThreshold(uint256 _pid, uint16 _threshold) external onlyOwner {
        require(_threshold < gem.totalSupply(), "THRESHOLD_EXCEEDS_SUPPLY");

        poolInfo[_pid].lockThreshold = _threshold;

        emit updatedLockThreshold(_pid, _threshold);
    }

    // Accept control of the mintable token
    function control() external onlyOwner {
        IOwnable(YIELD).acceptOwnership();
    }

    // Release control of the mintable token
    function release() external onlyOwner {
        IOwnable(YIELD).proposeNewOwner(owner());
    }

    // LAUNCH THE FARM
    function launch() external onlyOwner {
        require(setupMode == true, "ONLY_IN_SETUP");

        // Get pair addresses
        address yieldWplsLP = PulseXV2Factory.getPair(YIELD, WPLS); // Get YIELD-WPLS LP address
        address yieldPlsxLP = PulseXV2Factory.getPair(YIELD, PLSX); // Get YIELD-PLSX LP address
        address yieldDaiLP = PulseXV2Factory.getPair(YIELD, DAI);   // Get YIELD-DAI LP address

        // LP Token, Lock Requirement, AllocPts, Deposit Fee, Withdraw Fee
        _addPool(IERC20(yieldWplsLP), 300e18, 1000);
        _addPool(IERC20(yieldPlsxLP), 300e18, 1000);
        _addPool(IERC20(yieldDaiLP), 300e18, 1000);

        // Liquidity Setup
        rewards.mint(msg.sender, 86.4 ether);

        // Team Rewards - one day's worth of rewards each
        rewards.mint(0x19Bb40BC1f5b6c9ADFA29Cb7DbdaBE66C2aD9151, 86.4 ether);
        rewards.mint(0x19C1BB001fAa97bD0a07AC75719F380787Ae4759, 86.4 ether);
        rewards.mint(0xc600D3e564adF666614fb81834BDfED3D75Be1E4, 86.4 ether);

        _launch();
        
        emit LFG_WAGMI_FAM();
    }

    // Set the fee recipient
    function setFeeRecipient(address newRecipient) external onlyOwner {
        require(newRecipient != address(0), "YEAH_NAH_MATE");

        address oldRecipient = feeRecipient;
        feeRecipient = newRecipient;

        emit updatedFeeRecipient(oldRecipient, newRecipient);
    }

    ////////////////////////
    // INTERNAL FUNCTIONS //
    ////////////////////////

    function _launch() internal {
        setupMode = false;
    }

    function _addPool(IERC20 _lpToken, uint256 _lockThreshold, uint256 _allocPoint) internal {
        massUpdatePools();

        uint256 lastRewardTime = block.timestamp > startTime ? block.timestamp : startTime;

        totalAllocPoint = totalAllocPoint.add(_allocPoint);

        poolInfo.push(PoolInfo({
            lpToken: _lpToken,
            allocPoint: _allocPoint,
            lastRewardTime: lastRewardTime,
            lockThreshold: _lockThreshold, 
            accYieldPerShare: 0
        }));

        poolExists[address(_lpToken)] = true;
    }

    function _credit(address _user, uint256 _amount) internal {
        rewardData[_user].pending += _amount;
        rewardData[_user].total += _amount;
    }

    function _settle(address _user) internal {
        rewardData[_user].pending = 0;
    }
}
        

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[]},{"type":"error","name":"NoOwnershipTransfer","inputs":[]},{"type":"error","name":"NotOwner","inputs":[]},{"type":"error","name":"NotProposedOwner","inputs":[]},{"type":"error","name":"SameAddress","inputs":[]},{"type":"error","name":"ZeroAddress","inputs":[]},{"type":"event","name":"Claim","inputs":[{"type":"address","name":"user","internalType":"address","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Deposit","inputs":[{"type":"address","name":"user","internalType":"address","indexed":true},{"type":"uint256","name":"pid","internalType":"uint256","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Exit","inputs":[{"type":"address","name":"user","internalType":"address","indexed":true},{"type":"uint256","name":"pid","internalType":"uint256","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"FeeCollected","inputs":[{"type":"address","name":"recipient","internalType":"address","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false},{"type":"uint256","name":"pid","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"LFG_WAGMI_FAM","inputs":[],"anonymous":false},{"type":"event","name":"NewOwnerProposed","inputs":[{"type":"address","name":"proposedNewOwner","internalType":"address","indexed":true}],"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":"PoolAdded","inputs":[{"type":"uint256","name":"pid","internalType":"uint256","indexed":true},{"type":"address","name":"lpToken","internalType":"address","indexed":false},{"type":"uint256","name":"allocPoint","internalType":"uint256","indexed":false},{"type":"uint256","name":"lockThreshold","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Stake","inputs":[{"type":"address","name":"user","internalType":"address","indexed":true},{"type":"uint256","name":"amountOut","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Unstake","inputs":[{"type":"address","name":"user","internalType":"address","indexed":true},{"type":"uint256","name":"amountOut","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Withdraw","inputs":[{"type":"address","name":"user","internalType":"address","indexed":true},{"type":"uint256","name":"pid","internalType":"uint256","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"updatedAllocPts","inputs":[{"type":"uint256","name":"pid","internalType":"uint256","indexed":true},{"type":"uint256","name":"oldAllocPoint","internalType":"uint256","indexed":false},{"type":"uint256","name":"newAllocPoint","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"updatedEmissions","inputs":[{"type":"uint256","name":"oldYieldPerSecond","internalType":"uint256","indexed":false},{"type":"uint256","name":"newYieldPerSecond","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"updatedFeeRecipient","inputs":[{"type":"address","name":"oldRecipient","internalType":"address","indexed":false},{"type":"address","name":"newRecipient","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"updatedLockThreshold","inputs":[{"type":"uint256","name":"poolId","internalType":"uint256","indexed":false},{"type":"uint16","name":"threshold","internalType":"uint16","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"DAI","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"ISLAND","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"PLSX","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract ISwapFactory"}],"name":"PulseXV2Factory","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"WPLS","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"YIELD","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"acceptOwnership","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"addNewPool","inputs":[{"type":"uint256","name":"_lockThreshold","internalType":"uint256"},{"type":"uint256","name":"_allocPoint","internalType":"uint256"},{"type":"address","name":"_lpToken","internalType":"contract IERC20"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"claimReferralRewards","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"control","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"deployer","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"deposit","inputs":[{"type":"address","name":"_referrer","internalType":"address"},{"type":"uint256","name":"_pid","internalType":"uint256"},{"type":"uint256","name":"_amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"emergencyWithdraw","inputs":[{"type":"uint256","name":"_pid","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"feeRecipient","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IERC20"}],"name":"gem","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"feeAmount","internalType":"uint256"},{"type":"uint256","name":"amountAfterFees","internalType":"uint256"}],"name":"getAmountWithFees","inputs":[{"type":"uint256","name":"_pid","internalType":"uint256"},{"type":"address","name":"_user","internalType":"address"},{"type":"uint256","name":"_amountIn","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint16","name":"","internalType":"uint16"}],"name":"getDynamicFeeBP","inputs":[{"type":"uint256","name":"_pid","internalType":"uint256"},{"type":"address","name":"_user","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getMultiplier","inputs":[{"type":"uint256","name":"_from","internalType":"uint256"},{"type":"uint256","name":"_to","internalType":"uint256"}]},{"type":"function","stateMutability":"pure","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getReferralBonus","inputs":[{"type":"uint256","name":"_rewards","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"excluded","internalType":"bool"}],"name":"isExcludedFromFees","inputs":[{"type":"uint256","name":"_pid","internalType":"uint256"},{"type":"address","name":"_user","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"launch","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"lockPeriod","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"lockedTokens","inputs":[{"type":"address","name":"_user","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"massUpdatePools","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint16","name":"","internalType":"uint16"}],"name":"maxFeePercentage","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple","name":"","internalType":"struct MasterChefX.RewardInfo","components":[{"type":"uint256","name":"pending","internalType":"uint256"},{"type":"uint256","name":"total","internalType":"uint256"}]}],"name":"pendingRewards","inputs":[{"type":"address","name":"_user","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"pendingYield","inputs":[{"type":"uint256","name":"_pid","internalType":"uint256"},{"type":"address","name":"_user","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"poolExists","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"lpToken","internalType":"contract IERC20"},{"type":"uint256","name":"allocPoint","internalType":"uint256"},{"type":"uint256","name":"lockThreshold","internalType":"uint256"},{"type":"uint256","name":"lastRewardTime","internalType":"uint256"},{"type":"uint256","name":"accYieldPerShare","internalType":"uint256"}],"name":"poolInfo","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"poolLength","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"proposeNewOwner","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"proposedNewOwner","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"release","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"pending","internalType":"uint256"},{"type":"uint256","name":"total","internalType":"uint256"}],"name":"rewardData","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IToken"}],"name":"rewards","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setFeeRecipient","inputs":[{"type":"address","name":"newRecipient","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setLockThreshold","inputs":[{"type":"uint256","name":"_pid","internalType":"uint256"},{"type":"uint16","name":"_threshold","internalType":"uint16"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setPoolAllocPts","inputs":[{"type":"uint256","name":"_pid","internalType":"uint256"},{"type":"uint256","name":"_allocPoint","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setYieldPerSecond","inputs":[{"type":"uint256","name":"_yieldPerSecond","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"setupMode","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"stake","inputs":[{"type":"uint256","name":"_amountIn","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"amount","internalType":"uint256"},{"type":"uint256","name":"stakeTime","internalType":"uint256"}],"name":"stakeData","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"startTime","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"timeRemaining","internalType":"uint256"}],"name":"timeToUnlock","inputs":[{"type":"address","name":"_user","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalAllocPoint","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"_amountOut","internalType":"uint256"}],"name":"unstake","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updatePool","inputs":[{"type":"uint256","name":"_pid","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updatePoolsBatch","inputs":[{"type":"uint256","name":"startIdx","internalType":"uint256"},{"type":"uint256","name":"endIdx","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"amount","internalType":"uint256"},{"type":"uint256","name":"rewardDebt","internalType":"uint256"}],"name":"userInfo","inputs":[{"type":"uint256","name":"","internalType":"uint256"},{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"withdraw","inputs":[{"type":"address","name":"_referrer","internalType":"address"},{"type":"uint256","name":"_pid","internalType":"uint256"},{"type":"uint256","name":"_amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"yieldPerSecond","inputs":[]}]
              

Contract Creation Code

Verify & Publish
0x60c060405234801562000010575f80fd5b505f620000226200017160201b60201c565b9050805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350600160028190555066038d7ea4c680006004819055503373ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250503360035f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055504260a081815250506001600360146101000a81548160ff02191690831515021790555062000178565b5f33905090565b60805160a05161524d620001d95f395f81816123cf015281816128bd015281816128e40152818161290e01528181613a690152613a9001525f8181611155015281816112e0015281816129ca01528181612fa00152613573015261524d5ff3fe608060405234801561000f575f80fd5b5060043610610325575f3560e01c806378e97925116101b6578063b5c5f67211610102578063d5f39488116100a0578063e0bab4c41161007a578063e0bab4c414610937578063e74b981b14610955578063ef8ef56f14610971578063fc2f3d821461098f57610325565b8063d5f39488146108f1578063d6d0883c1461090f578063d8de65871461092d57610325565b8063c50defb9116100dc578063c50defb91461086a578063c691d19114610886578063cc15f538146108b7578063cc4e2ec4146108d557610325565b8063b5c5f672146107ff578063ba05d4171461081b578063bf654aac1461084c57610325565b80638dbb1e3a1161016f578063a3cea33b11610149578063a3cea33b14610779578063a694fc3a14610797578063ad33e21d146107b3578063b1f8100d146107e357610325565b80638dbb1e3a146106fa57806393f1a40b1461072a5780639ec5a8941461075b57610325565b806378e979251461067057806379ba50971461068e5780637bd2bea7146106985780637c7de5e9146106b657806386d1a69f146106d25780638da5cb5b146106dc57610325565b806331d7a2621161027557806351eb05a61161022e5780635eb7413a116102085780635eb7413a1461060e578063630b5ba11461063e57806363dd9d7414610648578063715018a61461066657610325565b806351eb05a6146105ba5780635312ea8e146105d657806358a0a734146105f257610325565b806331d7a262146104bd5780633345d3d0146104ed5780633fd8b02f1461051d578063469048401461053b57806348e5d9f8146105595780634cf1bfe01461058a57610325565b80631526fe27116102e25780631dfa45e3116102bc5780631dfa45e3146104355780631e1c6a0714610453578063272183c9146104835780632def66201461049f57610325565b80631526fe27146103b357806317caf6f1146103e757806318952aff1461040557610325565b806301339c211461032957806305eaab4b14610333578063081e3eda1461033d5780630efe6a8b1461035b5780630fc8c4ed1461037757806313bf812614610395575b5f80fd5b6103316109bf565b005b61033b610f7e565b005b61034561112b565b6040516103529190614121565b60405180910390f35b610375600480360381019061037091906141c2565b611137565b005b61037f61166b565b60405161038c9190614221565b60405180910390f35b61039d611693565b6040516103aa9190614254565b60405180910390f35b6103cd60048036038101906103c8919061426d565b6116a6565b6040516103de9594939291906142f3565b60405180910390f35b6103ef611706565b6040516103fc9190614121565b60405180910390f35b61041f600480360381019061041a9190614344565b61170c565b60405161042c9190614254565b60405180910390f35b61043d61177b565b60405161044a9190614221565b60405180910390f35b61046d60048036038101906104689190614382565b611793565b60405161047a9190614254565b60405180910390f35b61049d6004803603810190610498919061426d565b6117b0565b005b6104a76118b7565b6040516104b49190614121565b60405180910390f35b6104d760048036038101906104d29190614382565b611a90565b6040516104e491906143e9565b60405180910390f35b61050760048036038101906105029190614382565b611afa565b6040516105149190614121565b60405180910390f35b610525611bc1565b6040516105329190614121565b60405180910390f35b610543611bc8565b6040516105509190614221565b60405180910390f35b610573600480360381019061056e9190614382565b611bed565b604051610581929190614402565b60405180910390f35b6105a4600480360381019061059f9190614344565b611c0d565b6040516105b19190614445565b60405180910390f35b6105d460048036038101906105cf919061426d565b611cfa565b005b6105f060048036038101906105eb919061426d565b611e8e565b005b61060c6004803603810190610607919061445e565b61200d565b005b61062860048036038101906106239190614382565b61220f565b6040516106359190614121565b60405180910390f35b610646612257565b005b610650612288565b60405161065d9190614221565b60405180910390f35b61066e6122a0565b005b6106786123cd565b6040516106859190614121565b60405180910390f35b6106966123f1565b005b6106a0612626565b6040516106ad919061449c565b60405180910390f35b6106d060048036038101906106cb91906144f0565b61263e565b005b6106da61279d565b005b6106e4612893565b6040516106f19190614221565b60405180910390f35b610714600480360381019061070f919061445e565b6128ba565b6040516107219190614121565b60405180910390f35b610744600480360381019061073f9190614344565b612951565b604051610752929190614402565b60405180910390f35b61076361297c565b6040516107709190614560565b60405180910390f35b610781612994565b60405161078e9190614221565b60405180910390f35b6107b160048036038101906107ac919061426d565b6129ac565b005b6107cd60048036038101906107c8919061426d565b612be5565b6040516107da9190614121565b60405180910390f35b6107fd60048036038101906107f89190614382565b612c08565b005b610819600480360381019061081491906141c2565b612dea565b005b61083560048036038101906108309190614579565b6132b7565b604051610843929190614402565b60405180910390f35b610854613331565b6040516108619190614445565b60405180910390f35b610884600480360381019061087f919061445e565b613337565b005b6108a0600480360381019061089b9190614382565b6133a9565b6040516108ae929190614402565b60405180910390f35b6108bf6133c9565b6040516108cc9190614121565b60405180910390f35b6108ef60048036038101906108ea91906145f3565b6133cf565b005b6108f9613571565b6040516109069190614221565b60405180910390f35b610917613595565b6040516109249190614651565b60405180910390f35b6109356135ad565b005b61093f613691565b60405161094c9190614221565b60405180910390f35b61096f600480360381019061096a9190614382565b6136a9565b005b61097961382c565b6040516109869190614221565b60405180910390f35b6109a960048036038101906109a49190614344565b613844565b6040516109b69190614121565b60405180910390f35b6109c7612893565b73ffffffffffffffffffffffffffffffffffffffff166109e5613a57565b73ffffffffffffffffffffffffffffffffffffffff1614610a32576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60011515600360149054906101000a900460ff16151514610a88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7f906146c4565b60405180910390fd5b5f7329ea7545def87022badc76323f373ea1e707c52373ffffffffffffffffffffffffffffffffffffffff1663e6a4390573fc56f3098533446b2226e9d526780cf40018d4c473a1077a294dde1b09bb078844df40758a5d0f9a276040518363ffffffff1660e01b8152600401610b009291906146e2565b602060405180830381865afa158015610b1b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b3f919061471d565b90505f7329ea7545def87022badc76323f373ea1e707c52373ffffffffffffffffffffffffffffffffffffffff1663e6a4390573fc56f3098533446b2226e9d526780cf40018d4c47395b303987a60c71504d99aa1b13b4da07b0790ab6040518363ffffffff1660e01b8152600401610bb99291906146e2565b602060405180830381865afa158015610bd4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bf8919061471d565b90505f7329ea7545def87022badc76323f373ea1e707c52373ffffffffffffffffffffffffffffffffffffffff1663e6a4390573fc56f3098533446b2226e9d526780cf40018d4c473efd766ccb38eaf1dfd701853bfce31359239f3056040518363ffffffff1660e01b8152600401610c729291906146e2565b602060405180830381865afa158015610c8d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cb1919061471d565b9050610cc983681043561a88293000006103e8613a5e565b610cdf82681043561a88293000006103e8613a5e565b610cf581681043561a88293000006103e8613a5e565b73fc56f3098533446b2226e9d526780cf40018d4c473ffffffffffffffffffffffffffffffffffffffff166340c10f19336804af0a763bb1c000006040518363ffffffff1660e01b8152600401610d4d929190614781565b5f604051808303815f87803b158015610d64575f80fd5b505af1158015610d76573d5f803e3d5ffd5b5050505073fc56f3098533446b2226e9d526780cf40018d4c473ffffffffffffffffffffffffffffffffffffffff166340c10f197319bb40bc1f5b6c9adfa29cb7dbdabe66c2ad91516804af0a763bb1c000006040518363ffffffff1660e01b8152600401610de6929190614781565b5f604051808303815f87803b158015610dfd575f80fd5b505af1158015610e0f573d5f803e3d5ffd5b5050505073fc56f3098533446b2226e9d526780cf40018d4c473ffffffffffffffffffffffffffffffffffffffff166340c10f197319c1bb001faa97bd0a07ac75719f380787ae47596804af0a763bb1c000006040518363ffffffff1660e01b8152600401610e7f929190614781565b5f604051808303815f87803b158015610e96575f80fd5b505af1158015610ea8573d5f803e3d5ffd5b5050505073fc56f3098533446b2226e9d526780cf40018d4c473ffffffffffffffffffffffffffffffffffffffff166340c10f1973c600d3e564adf666614fb81834bdfed3d75be1e46804af0a763bb1c000006040518363ffffffff1660e01b8152600401610f18929190614781565b5f604051808303815f87803b158015610f2f575f80fd5b505af1158015610f41573d5f803e3d5ffd5b50505050610f4d613c01565b7f452fb855fd3c6f57cc821ebea14d1467b0773817c62e449a071b1ea92ef0d3af60405160405180910390a1505050565b6002805403610fc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb9906147f2565b60405180910390fd5b600280819055505f8060085f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206040518060400160405290815f820154815260200160018201548152505090505f815f0151111561105557611049815f015183613c1d90919063ffffffff16565b915061105433613c32565b5b73fc56f3098533446b2226e9d526780cf40018d4c473ffffffffffffffffffffffffffffffffffffffff166340c10f1933846040518363ffffffff1660e01b81526004016110a4929190614810565b5f604051808303815f87803b1580156110bb575f80fd5b505af11580156110cd573d5f803e3d5ffd5b505050503373ffffffffffffffffffffffffffffffffffffffff167f47cee97cb7acd717b3c0aa1435d004cd5b3c8c57d70dbceb4e4458bbd60e39d4836040516111179190614121565b60405180910390a250506001600281905550565b5f600680549050905090565b5f1515600360149054906101000a900460ff16151514806111a357507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6111e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d990614881565b60405180910390fd5b6002805403611226576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121d906147f2565b60405180910390fd5b600280819055506006805490508210611274576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126b906148e9565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614806112d957503373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b15611302577f000000000000000000000000000000000000000000000000000000000000000092505b5f6006838154811061131757611316614907565b5b905f5260205f20906005020190505f600a5f8581526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20905061137d84611cfa565b5f6113c582600101546113b764e8d4a510006113a98760040154875f0154613c7990919063ffffffff16565b613c8e90919063ffffffff16565b613ca390919063ffffffff16565b90505f806113d48733886132b7565b915091506113ee81855f0154613c1d90919063ffffffff16565b845f018190555061142664e8d4a510006114188760040154875f0154613c7990919063ffffffff16565b613c8e90919063ffffffff16565b846001018190555061147d333088885f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613cb8909392919063ffffffff16565b5f821115611565576114f360035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683875f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613d419092919063ffffffff16565b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f108516ddcf5ba43cea6bb2cd5ff6d59ac196c1c86ccb9178332b9dd72d1ca561838960405161155c929190614402565b60405180910390a25b5f8311156115ea5773fc56f3098533446b2226e9d526780cf40018d4c473ffffffffffffffffffffffffffffffffffffffff166340c10f1933856040518363ffffffff1660e01b81526004016115bc929190614810565b5f604051808303815f87803b1580156115d3575f80fd5b505af11580156115e5573d5f803e3d5ffd5b505050505b5f6115f484612be5565b90505f811115611609576116088982613dc7565b5b873373ffffffffffffffffffffffffffffffffffffffff167f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15896040516116509190614121565b60405180910390a35050505050506001600281905550505050565b5f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600360149054906101000a900460ff1681565b600681815481106116b5575f80fd5b905f5260205f2090600502015f91509050805f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030154908060040154905085565b60055481565b5f6006838154811061172157611720614907565b5b905f5260205f2090600502016002015460075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f01541015905092915050565b73fc56f3098533446b2226e9d526780cf40018d4c481565b6009602052805f5260405f205f915054906101000a900460ff1681565b6117b8612893565b73ffffffffffffffffffffffffffffffffffffffff166117d6613a57565b73ffffffffffffffffffffffffffffffffffffffff1614611823576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f600454905080821061186b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118629061497e565b60405180910390fd5b611873612257565b816004819055507f989a45b2e873512536614a9a484c6f002cd3a63f7c726fb049f9a890e5d4e75681836040516118ab929190614402565b60405180910390a15050565b5f60028054036118fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f3906147f2565b60405180910390fd5b600280819055505f60075f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090505f815f015411611988576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197f906149e6565b60405180910390fd5b5f6119a0826001015442613ca390919063ffffffff16565b90506224ea008110156119e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119df90614a4e565b60405180910390fd5b815f015492505f825f0181905550611a35338473dfb10795e6fe7d0db68f9778ba4c575a28e8cd4c73ffffffffffffffffffffffffffffffffffffffff16613d419092919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff167f85082129d87b2fe11527cb1b3b7a520aeb5aa6913f88a3d8757fe40d1db02fdd84604051611a7b9190614121565b60405180910390a25050600160028190555090565b611a986140f1565b60085f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206040518060400160405290815f82015481526020016001820154815250509050919050565b5f8060075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206040518060400160405290815f820154815260200160018201548152505090505f815f015103611b6c575f915050611bbc565b8060200151421015611b81575f915050611bbc565b5f816020015142611b929190614a99565b90506224ea008110611ba8575f92505050611bbc565b806224ea00611bb79190614a99565b925050505b919050565b6224ea0081565b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6008602052805f5260405f205f91509050805f0154908060010154905082565b5f8060075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090505f60068581548110611c6357611c62614907565b5b905f5260205f20906005020190505f825f015490505f826002015490505f811480611c8e5750808210155b15611c9f575f945050505050611cf4565b611ca98282613e76565b91505f611ce982611cdb611cc68686613ca390919063ffffffff16565b6101f461ffff16613c7990919063ffffffff16565b613c8e90919063ffffffff16565b905080955050505050505b92915050565b5f60068281548110611d0f57611d0e614907565b5b905f5260205f209060050201905080600301544211611d2e5750611e8b565b5f815f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611d8a9190614221565b602060405180830381865afa158015611da5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611dc99190614ae0565b90505f8103611de2574282600301819055505050611e8b565b5f611df18360030154426128ba565b90505f611e33600554611e258660010154611e1760045487613c7990919063ffffffff16565b613c7990919063ffffffff16565b613c8e90919063ffffffff16565b9050611e75611e6284611e5464e8d4a5100085613c7990919063ffffffff16565b613c8e90919063ffffffff16565b8560040154613c1d90919063ffffffff16565b8460040181905550428460030181905550505050505b50565b6002805403611ed2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec9906147f2565b60405180910390fd5b600280819055505f60068281548110611eee57611eed614907565b5b905f5260205f20906005020190505f600a5f8481526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090505f815f015490505f825f01819055505f8260010181905550611fb03382855f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613d419092919063ffffffff16565b833373ffffffffffffffffffffffffffffffffffffffff167fbe0b6e5b3195df91f2e6b2b20501f84b085714f9e38073f499073c830565100983604051611ff79190614121565b60405180910390a3505050600160028190555050565b612015612893565b73ffffffffffffffffffffffffffffffffffffffff16612033613a57565b73ffffffffffffffffffffffffffffffffffffffff1614612080576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6006838154811061209557612094614907565b5b905f5260205f20906005020160010154905081600684815481106120bc576120bb614907565b5b905f5260205f209060050201600101541115612150575f82600685815481106120e8576120e7614907565b5b905f5260205f209060050201600101546121029190614a99565b60055461210f9190614a99565b1161214f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214690614b7b565b60405180910390fd5b5b612158612257565b6121a2826121946006868154811061217357612172614907565b5b905f5260205f20906005020160010154600554613ca390919063ffffffff16565b613c1d90919063ffffffff16565b60058190555081600684815481106121bd576121bc614907565b5b905f5260205f20906005020160010181905550827fab80a6685d88709a4e48d135d00c13ae6734f7563446d4ad4d132c67e9a627238284604051612202929190614402565b60405180910390a2505050565b5f60075f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f01549050919050565b5f60068054905090505f5b818110156122845761227381611cfa565b8061227d90614b99565b9050612262565b5050565b7395b303987a60c71504d99aa1b13b4da07b0790ab81565b6122a8612893565b73ffffffffffffffffffffffffffffffffffffffff166122c6613a57565b73ffffffffffffffffffffffffffffffffffffffff1614612313576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35f805f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b7f000000000000000000000000000000000000000000000000000000000000000081565b6123f961166b565b73ffffffffffffffffffffffffffffffffffffffff16612417613a57565b73ffffffffffffffffffffffffffffffffffffffff1614612464576040517f0f22ca5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff1660015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036124ea576040517fec901e9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff165f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f60015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b73dfb10795e6fe7d0db68f9778ba4c575a28e8cd4c81565b612646612893565b73ffffffffffffffffffffffffffffffffffffffff16612664613a57565b73ffffffffffffffffffffffffffffffffffffffff16146126b1576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f151560095f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16151514612740576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161273790614c2a565b60405180910390fd5b61274b818484613a5e565b600160068054905061275d9190614a99565b7fcf71df2ad8f5180eea605cc5f16399aa74e3a68b2f23a5da121923b71b2ec36d82848660405161279093929190614c48565b60405180910390a2505050565b6127a5612893565b73ffffffffffffffffffffffffffffffffffffffff166127c3613a57565b73ffffffffffffffffffffffffffffffffffffffff1614612810576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73fc56f3098533446b2226e9d526780cf40018d4c473ffffffffffffffffffffffffffffffffffffffff1663b1f8100d612848612893565b6040518263ffffffff1660e01b81526004016128649190614221565b5f604051808303815f87803b15801561287b575f80fd5b505af115801561288d573d5f803e3d5ffd5b50505050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f7f00000000000000000000000000000000000000000000000000000000000000008311612908577f000000000000000000000000000000000000000000000000000000000000000061290a565b825b92507f000000000000000000000000000000000000000000000000000000000000000082101561293c575f905061294b565b82826129489190614a99565b90505b92915050565b600a602052815f5260405f20602052805f5260405f205f9150915050805f0154908060010154905082565b73fc56f3098533446b2226e9d526780cf40018d4c481565b73dfb10795e6fe7d0db68f9778ba4c575a28e8cd4c81565b5f1515600360149054906101000a900460ff1615151480612a1857507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b612a57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a4e90614881565b60405180910390fd5b6002805403612a9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a92906147f2565b60405180910390fd5b600280819055505f60075f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090505f8211612b24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b1b906149e6565b60405180910390fd5b612b3a82825f0154613c1d90919063ffffffff16565b815f0181905550428160010181905550612b8b33308473dfb10795e6fe7d0db68f9778ba4c575a28e8cd4c73ffffffffffffffffffffffffffffffffffffffff16613cb8909392919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff167febedb8b3c678666e7f36970bc8f57abf6d8fa2e828c0da91ea5b75bf68ed101a83604051612bd19190614121565b60405180910390a250600160028190555050565b5f61271061012c83612bf79190614c7d565b612c019190614ceb565b9050919050565b612c10612893565b73ffffffffffffffffffffffffffffffffffffffff16612c2e613a57565b73ffffffffffffffffffffffffffffffffffffffff1614612c7b576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612ce0576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612d64576040517f367558c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff167fa50821a7869f90dcef86915c08ff04d916de378b5eadd9a9009e619f3b9b939060405160405180910390a28060015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6002805403612e2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e25906147f2565b60405180910390fd5b600280819055506006805490508210612e7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e73906148e9565b60405180910390fd5b5f60068381548110612e9157612e90614907565b5b905f5260205f20906005020190505f600a5f8581526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20905082815f01541015612f34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f2b90614d65565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480612f9957503373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16145b15612fc2577f000000000000000000000000000000000000000000000000000000000000000094505b612fcb84611cfa565b5f613013826001015461300564e8d4a51000612ff78760040154875f0154613c7990919063ffffffff16565b613c8e90919063ffffffff16565b613ca390919063ffffffff16565b90505f806130228733886132b7565b9150915061303c86855f0154613ca390919063ffffffff16565b845f018190555061307464e8d4a510006130668760040154875f0154613c7990919063ffffffff16565b613c8e90919063ffffffff16565b84600101819055506130c93382875f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613d419092919063ffffffff16565b5f8211156131b15761313f60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683875f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613d419092919063ffffffff16565b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f108516ddcf5ba43cea6bb2cd5ff6d59ac196c1c86ccb9178332b9dd72d1ca56183896040516131a8929190614402565b60405180910390a25b5f8311156132365773fc56f3098533446b2226e9d526780cf40018d4c473ffffffffffffffffffffffffffffffffffffffff166340c10f1933856040518363ffffffff1660e01b8152600401613208929190614810565b5f604051808303815f87803b15801561321f575f80fd5b505af1158015613231573d5f803e3d5ffd5b505050505b5f61324084612be5565b90505f811115613255576132548982613dc7565b5b873373ffffffffffffffffffffffffffffffffffffffff167ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5688960405161329c9190614121565b60405180910390a35050505050506001600281905550505050565b5f806132c3858561170c565b156132d3575f8391509150613329565b5f6133086127106132fa6132e78989611c0d565b61ffff1687613c7990919063ffffffff16565b613c8e90919063ffffffff16565b90505f61331e8286613ca390919063ffffffff16565b905081819350935050505b935093915050565b6101f481565b600680549050811061337e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161337590614dcd565b60405180910390fd5b5f8290505b8181116133a45761339381611cfa565b8061339d90614b99565b9050613383565b505050565b6007602052805f5260405f205f91509050805f0154908060010154905082565b60045481565b6133d7612893565b73ffffffffffffffffffffffffffffffffffffffff166133f5613a57565b73ffffffffffffffffffffffffffffffffffffffff1614613442576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73dfb10795e6fe7d0db68f9778ba4c575a28e8cd4c73ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561349f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906134c39190614ae0565b8161ffff1610613508576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134ff90614e35565b60405180910390fd5b8061ffff166006838154811061352157613520614907565b5b905f5260205f209060050201600201819055507f0d3990e156c26a5f3f1e69eb1940ca2e18d4e814e4cb8b9783e2472a10c7c6858282604051613565929190614e53565b60405180910390a15050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7329ea7545def87022badc76323f373ea1e707c52381565b6135b5612893565b73ffffffffffffffffffffffffffffffffffffffff166135d3613a57565b73ffffffffffffffffffffffffffffffffffffffff1614613620576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73fc56f3098533446b2226e9d526780cf40018d4c473ffffffffffffffffffffffffffffffffffffffff166379ba50976040518163ffffffff1660e01b81526004015f604051808303815f87803b158015613679575f80fd5b505af115801561368b573d5f803e3d5ffd5b50505050565b73efd766ccb38eaf1dfd701853bfce31359239f30581565b6136b1612893565b73ffffffffffffffffffffffffffffffffffffffff166136cf613a57565b73ffffffffffffffffffffffffffffffffffffffff161461371c576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361378a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161378190614ec4565b60405180910390fd5b5f60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160035f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f69cca87270f7727b8fbdfefbbb549c52795cf9b87f29eb4b52a55c11a30a38f881836040516138209291906146e2565b60405180910390a15050565b73a1077a294dde1b09bb078844df40758a5d0f9a2781565b5f806006848154811061385a57613859614907565b5b905f5260205f20906005020190505f600a5f8681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090505f826004015490505f835f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161391b9190614221565b602060405180830381865afa158015613936573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061395a9190614ae0565b905083600301544211801561396f57505f8114155b15613a08575f6139838560030154426128ba565b90505f6139c56005546139b788600101546139a960045487613c7990919063ffffffff16565b613c7990919063ffffffff16565b613c8e90919063ffffffff16565b9050613a036139f4846139e664e8d4a5100085613c7990919063ffffffff16565b613c8e90919063ffffffff16565b85613c1d90919063ffffffff16565b935050505b613a4b8360010154613a3d64e8d4a51000613a2f86885f0154613c7990919063ffffffff16565b613c8e90919063ffffffff16565b613ca390919063ffffffff16565b94505050505092915050565b5f33905090565b613a66612257565b5f7f00000000000000000000000000000000000000000000000000000000000000004211613ab4577f0000000000000000000000000000000000000000000000000000000000000000613ab6565b425b9050613acd82600554613c1d90919063ffffffff16565b60058190555060066040518060a001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018581526020018381526020015f815250908060018154018082558091505060019003905f5260205f2090600502015f909190919091505f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550602082015181600101556040820151816002015560608201518160030155608082015181600401555050600160095f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555050505050565b5f600360146101000a81548160ff021916908315150217905550565b5f8183613c2a9190614ee2565b905092915050565b5f60085f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f018190555050565b5f8183613c869190614c7d565b905092915050565b5f8183613c9b9190614ceb565b905092915050565b5f8183613cb09190614a99565b905092915050565b613d3b846323b872dd60e01b858585604051602401613cd993929190614f15565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613e8e565b50505050565b613dc28363a9059cbb60e01b8484604051602401613d60929190614810565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613e8e565b505050565b8060085f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f828254613e159190614ee2565b925050819055508060085f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206001015f828254613e6b9190614ee2565b925050819055505050565b5f818310613e845781613e86565b825b905092915050565b5f613eef826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16613f539092919063ffffffff16565b90505f81511115613f4e5780806020019051810190613f0e9190614f74565b613f4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613f449061500f565b60405180910390fd5b5b505050565b6060613f6184845f85613f6a565b90509392505050565b606082471015613faf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613fa69061509d565b60405180910390fd5b613fb88561407a565b613ff7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613fee90615105565b60405180910390fd5b5f808673ffffffffffffffffffffffffffffffffffffffff16858760405161401f919061518f565b5f6040518083038185875af1925050503d805f8114614059576040519150601f19603f3d011682016040523d82523d5f602084013e61405e565b606091505b509150915061406e82828661408b565b92505050949350505050565b5f80823b90505f8111915050919050565b6060831561409b578290506140ea565b5f835111156140ad5782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016140e191906151f7565b60405180910390fd5b9392505050565b60405180604001604052805f81526020015f81525090565b5f819050919050565b61411b81614109565b82525050565b5f6020820190506141345f830184614112565b92915050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6141678261413e565b9050919050565b6141778161415d565b8114614181575f80fd5b50565b5f813590506141928161416e565b92915050565b6141a181614109565b81146141ab575f80fd5b50565b5f813590506141bc81614198565b92915050565b5f805f606084860312156141d9576141d861413a565b5b5f6141e686828701614184565b93505060206141f7868287016141ae565b9250506040614208868287016141ae565b9150509250925092565b61421b8161415d565b82525050565b5f6020820190506142345f830184614212565b92915050565b5f8115159050919050565b61424e8161423a565b82525050565b5f6020820190506142675f830184614245565b92915050565b5f602082840312156142825761428161413a565b5b5f61428f848285016141ae565b91505092915050565b5f819050919050565b5f6142bb6142b66142b18461413e565b614298565b61413e565b9050919050565b5f6142cc826142a1565b9050919050565b5f6142dd826142c2565b9050919050565b6142ed816142d3565b82525050565b5f60a0820190506143065f8301886142e4565b6143136020830187614112565b6143206040830186614112565b61432d6060830185614112565b61433a6080830184614112565b9695505050505050565b5f806040838503121561435a5761435961413a565b5b5f614367858286016141ae565b925050602061437885828601614184565b9150509250929050565b5f602082840312156143975761439661413a565b5b5f6143a484828501614184565b91505092915050565b6143b681614109565b82525050565b604082015f8201516143d05f8501826143ad565b5060208201516143e360208501826143ad565b50505050565b5f6040820190506143fc5f8301846143bc565b92915050565b5f6040820190506144155f830185614112565b6144226020830184614112565b9392505050565b5f61ffff82169050919050565b61443f81614429565b82525050565b5f6020820190506144585f830184614436565b92915050565b5f80604083850312156144745761447361413a565b5b5f614481858286016141ae565b9250506020614492858286016141ae565b9150509250929050565b5f6020820190506144af5f8301846142e4565b92915050565b5f6144bf8261415d565b9050919050565b6144cf816144b5565b81146144d9575f80fd5b50565b5f813590506144ea816144c6565b92915050565b5f805f606084860312156145075761450661413a565b5b5f614514868287016141ae565b9350506020614525868287016141ae565b9250506040614536868287016144dc565b9150509250925092565b5f61454a826142c2565b9050919050565b61455a81614540565b82525050565b5f6020820190506145735f830184614551565b92915050565b5f805f606084860312156145905761458f61413a565b5b5f61459d868287016141ae565b93505060206145ae86828701614184565b92505060406145bf868287016141ae565b9150509250925092565b6145d281614429565b81146145dc575f80fd5b50565b5f813590506145ed816145c9565b92915050565b5f80604083850312156146095761460861413a565b5b5f614616858286016141ae565b9250506020614627858286016145df565b9150509250929050565b5f61463b826142c2565b9050919050565b61464b81614631565b82525050565b5f6020820190506146645f830184614642565b92915050565b5f82825260208201905092915050565b7f4f4e4c595f494e5f5345545550000000000000000000000000000000000000005f82015250565b5f6146ae600d8361466a565b91506146b98261467a565b602082019050919050565b5f6020820190508181035f8301526146db816146a2565b9050919050565b5f6040820190506146f55f830185614212565b6147026020830184614212565b9392505050565b5f815190506147178161416e565b92915050565b5f602082840312156147325761473161413a565b5b5f61473f84828501614709565b91505092915050565b5f819050919050565b5f61476b61476661476184614748565b614298565b614109565b9050919050565b61477b81614751565b82525050565b5f6040820190506147945f830185614212565b6147a16020830184614772565b9392505050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c005f82015250565b5f6147dc601f8361466a565b91506147e7826147a8565b602082019050919050565b5f6020820190508181035f830152614809816147d0565b9050919050565b5f6040820190506148235f830185614212565b6148306020830184614112565b9392505050565b7f53455455505f4d4f44455f454e474147454400000000000000000000000000005f82015250565b5f61486b60128361466a565b915061487682614837565b602082019050919050565b5f6020820190508181035f8301526148988161485f565b9050919050565b7f506f6f6c20646f6573206e6f74206578697374000000000000000000000000005f82015250565b5f6148d360138361466a565b91506148de8261489f565b602082019050919050565b5f6020820190508181035f830152614900816148c7565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4f4e4c595f4445435245415345530000000000000000000000000000000000005f82015250565b5f614968600e8361466a565b915061497382614934565b602082019050919050565b5f6020820190508181035f8301526149958161495c565b9050919050565b7f5a45524f5f414d4f554e545f4e4f545f414c4c4f5745440000000000000000005f82015250565b5f6149d060178361466a565b91506149db8261499c565b602082019050919050565b5f6020820190508181035f8301526149fd816149c4565b9050919050565b7f4e4f545f52454144595f544f5f554e5354414b455f59455400000000000000005f82015250565b5f614a3860188361466a565b9150614a4382614a04565b602082019050919050565b5f6020820190508181035f830152614a6581614a2c565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f614aa382614109565b9150614aae83614109565b9250828203905081811115614ac657614ac5614a6c565b5b92915050565b5f81519050614ada81614198565b92915050565b5f60208284031215614af557614af461413a565b5b5f614b0284828501614acc565b91505092915050565b7f6164643a2063616e27742073657420746f74616c416c6c6f63506f696e7420745f8201527f6f20302121000000000000000000000000000000000000000000000000000000602082015250565b5f614b6560258361466a565b9150614b7082614b0b565b604082019050919050565b5f6020820190508181035f830152614b9281614b59565b9050919050565b5f614ba382614109565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614bd557614bd4614a6c565b5b600182019050919050565b7f414c52454144595f4558495354530000000000000000000000000000000000005f82015250565b5f614c14600e8361466a565b9150614c1f82614be0565b602082019050919050565b5f6020820190508181035f830152614c4181614c08565b9050919050565b5f606082019050614c5b5f830186614212565b614c686020830185614112565b614c756040830184614112565b949350505050565b5f614c8782614109565b9150614c9283614109565b9250828202614ca081614109565b91508282048414831517614cb757614cb6614a6c565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f614cf582614109565b9150614d0083614109565b925082614d1057614d0f614cbe565b5b828204905092915050565b7f77697468647261773a206e6f7420676f6f6400000000000000000000000000005f82015250565b5f614d4f60128361466a565b9150614d5a82614d1b565b602082019050919050565b5f6020820190508181035f830152614d7c81614d43565b9050919050565b7f456e6420696e646578206f7574206f6620626f756e64730000000000000000005f82015250565b5f614db760178361466a565b9150614dc282614d83565b602082019050919050565b5f6020820190508181035f830152614de481614dab565b9050919050565b7f5448524553484f4c445f455843454544535f535550504c5900000000000000005f82015250565b5f614e1f60188361466a565b9150614e2a82614deb565b602082019050919050565b5f6020820190508181035f830152614e4c81614e13565b9050919050565b5f604082019050614e665f830185614112565b614e736020830184614436565b9392505050565b7f594541485f4e41485f4d415445000000000000000000000000000000000000005f82015250565b5f614eae600d8361466a565b9150614eb982614e7a565b602082019050919050565b5f6020820190508181035f830152614edb81614ea2565b9050919050565b5f614eec82614109565b9150614ef783614109565b9250828201905080821115614f0f57614f0e614a6c565b5b92915050565b5f606082019050614f285f830186614212565b614f356020830185614212565b614f426040830184614112565b949350505050565b614f538161423a565b8114614f5d575f80fd5b50565b5f81519050614f6e81614f4a565b92915050565b5f60208284031215614f8957614f8861413a565b5b5f614f9684828501614f60565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e5f8201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b5f614ff9602a8361466a565b915061500482614f9f565b604082019050919050565b5f6020820190508181035f83015261502681614fed565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f5f8201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b5f61508760268361466a565b91506150928261502d565b604082019050919050565b5f6020820190508181035f8301526150b48161507b565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000005f82015250565b5f6150ef601d8361466a565b91506150fa826150bb565b602082019050919050565b5f6020820190508181035f83015261511c816150e3565b9050919050565b5f81519050919050565b5f81905092915050565b5f5b83811015615154578082015181840152602081019050615139565b5f8484015250505050565b5f61516982615123565b615173818561512d565b9350615183818560208601615137565b80840191505092915050565b5f61519a828461515f565b915081905092915050565b5f81519050919050565b5f601f19601f8301169050919050565b5f6151c9826151a5565b6151d3818561466a565b93506151e3818560208601615137565b6151ec816151af565b840191505092915050565b5f6020820190508181035f83015261520f81846151bf565b90509291505056fea2646970667358221220f71a2fd8aa41e54ca35f87dbcd21782d475c5975dec4cb7b183b2b2018a58d5a64736f6c63430008140033

Deployed ByteCode

0x608060405234801561000f575f80fd5b5060043610610325575f3560e01c806378e97925116101b6578063b5c5f67211610102578063d5f39488116100a0578063e0bab4c41161007a578063e0bab4c414610937578063e74b981b14610955578063ef8ef56f14610971578063fc2f3d821461098f57610325565b8063d5f39488146108f1578063d6d0883c1461090f578063d8de65871461092d57610325565b8063c50defb9116100dc578063c50defb91461086a578063c691d19114610886578063cc15f538146108b7578063cc4e2ec4146108d557610325565b8063b5c5f672146107ff578063ba05d4171461081b578063bf654aac1461084c57610325565b80638dbb1e3a1161016f578063a3cea33b11610149578063a3cea33b14610779578063a694fc3a14610797578063ad33e21d146107b3578063b1f8100d146107e357610325565b80638dbb1e3a146106fa57806393f1a40b1461072a5780639ec5a8941461075b57610325565b806378e979251461067057806379ba50971461068e5780637bd2bea7146106985780637c7de5e9146106b657806386d1a69f146106d25780638da5cb5b146106dc57610325565b806331d7a2621161027557806351eb05a61161022e5780635eb7413a116102085780635eb7413a1461060e578063630b5ba11461063e57806363dd9d7414610648578063715018a61461066657610325565b806351eb05a6146105ba5780635312ea8e146105d657806358a0a734146105f257610325565b806331d7a262146104bd5780633345d3d0146104ed5780633fd8b02f1461051d578063469048401461053b57806348e5d9f8146105595780634cf1bfe01461058a57610325565b80631526fe27116102e25780631dfa45e3116102bc5780631dfa45e3146104355780631e1c6a0714610453578063272183c9146104835780632def66201461049f57610325565b80631526fe27146103b357806317caf6f1146103e757806318952aff1461040557610325565b806301339c211461032957806305eaab4b14610333578063081e3eda1461033d5780630efe6a8b1461035b5780630fc8c4ed1461037757806313bf812614610395575b5f80fd5b6103316109bf565b005b61033b610f7e565b005b61034561112b565b6040516103529190614121565b60405180910390f35b610375600480360381019061037091906141c2565b611137565b005b61037f61166b565b60405161038c9190614221565b60405180910390f35b61039d611693565b6040516103aa9190614254565b60405180910390f35b6103cd60048036038101906103c8919061426d565b6116a6565b6040516103de9594939291906142f3565b60405180910390f35b6103ef611706565b6040516103fc9190614121565b60405180910390f35b61041f600480360381019061041a9190614344565b61170c565b60405161042c9190614254565b60405180910390f35b61043d61177b565b60405161044a9190614221565b60405180910390f35b61046d60048036038101906104689190614382565b611793565b60405161047a9190614254565b60405180910390f35b61049d6004803603810190610498919061426d565b6117b0565b005b6104a76118b7565b6040516104b49190614121565b60405180910390f35b6104d760048036038101906104d29190614382565b611a90565b6040516104e491906143e9565b60405180910390f35b61050760048036038101906105029190614382565b611afa565b6040516105149190614121565b60405180910390f35b610525611bc1565b6040516105329190614121565b60405180910390f35b610543611bc8565b6040516105509190614221565b60405180910390f35b610573600480360381019061056e9190614382565b611bed565b604051610581929190614402565b60405180910390f35b6105a4600480360381019061059f9190614344565b611c0d565b6040516105b19190614445565b60405180910390f35b6105d460048036038101906105cf919061426d565b611cfa565b005b6105f060048036038101906105eb919061426d565b611e8e565b005b61060c6004803603810190610607919061445e565b61200d565b005b61062860048036038101906106239190614382565b61220f565b6040516106359190614121565b60405180910390f35b610646612257565b005b610650612288565b60405161065d9190614221565b60405180910390f35b61066e6122a0565b005b6106786123cd565b6040516106859190614121565b60405180910390f35b6106966123f1565b005b6106a0612626565b6040516106ad919061449c565b60405180910390f35b6106d060048036038101906106cb91906144f0565b61263e565b005b6106da61279d565b005b6106e4612893565b6040516106f19190614221565b60405180910390f35b610714600480360381019061070f919061445e565b6128ba565b6040516107219190614121565b60405180910390f35b610744600480360381019061073f9190614344565b612951565b604051610752929190614402565b60405180910390f35b61076361297c565b6040516107709190614560565b60405180910390f35b610781612994565b60405161078e9190614221565b60405180910390f35b6107b160048036038101906107ac919061426d565b6129ac565b005b6107cd60048036038101906107c8919061426d565b612be5565b6040516107da9190614121565b60405180910390f35b6107fd60048036038101906107f89190614382565b612c08565b005b610819600480360381019061081491906141c2565b612dea565b005b61083560048036038101906108309190614579565b6132b7565b604051610843929190614402565b60405180910390f35b610854613331565b6040516108619190614445565b60405180910390f35b610884600480360381019061087f919061445e565b613337565b005b6108a0600480360381019061089b9190614382565b6133a9565b6040516108ae929190614402565b60405180910390f35b6108bf6133c9565b6040516108cc9190614121565b60405180910390f35b6108ef60048036038101906108ea91906145f3565b6133cf565b005b6108f9613571565b6040516109069190614221565b60405180910390f35b610917613595565b6040516109249190614651565b60405180910390f35b6109356135ad565b005b61093f613691565b60405161094c9190614221565b60405180910390f35b61096f600480360381019061096a9190614382565b6136a9565b005b61097961382c565b6040516109869190614221565b60405180910390f35b6109a960048036038101906109a49190614344565b613844565b6040516109b69190614121565b60405180910390f35b6109c7612893565b73ffffffffffffffffffffffffffffffffffffffff166109e5613a57565b73ffffffffffffffffffffffffffffffffffffffff1614610a32576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60011515600360149054906101000a900460ff16151514610a88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7f906146c4565b60405180910390fd5b5f7329ea7545def87022badc76323f373ea1e707c52373ffffffffffffffffffffffffffffffffffffffff1663e6a4390573fc56f3098533446b2226e9d526780cf40018d4c473a1077a294dde1b09bb078844df40758a5d0f9a276040518363ffffffff1660e01b8152600401610b009291906146e2565b602060405180830381865afa158015610b1b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b3f919061471d565b90505f7329ea7545def87022badc76323f373ea1e707c52373ffffffffffffffffffffffffffffffffffffffff1663e6a4390573fc56f3098533446b2226e9d526780cf40018d4c47395b303987a60c71504d99aa1b13b4da07b0790ab6040518363ffffffff1660e01b8152600401610bb99291906146e2565b602060405180830381865afa158015610bd4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bf8919061471d565b90505f7329ea7545def87022badc76323f373ea1e707c52373ffffffffffffffffffffffffffffffffffffffff1663e6a4390573fc56f3098533446b2226e9d526780cf40018d4c473efd766ccb38eaf1dfd701853bfce31359239f3056040518363ffffffff1660e01b8152600401610c729291906146e2565b602060405180830381865afa158015610c8d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cb1919061471d565b9050610cc983681043561a88293000006103e8613a5e565b610cdf82681043561a88293000006103e8613a5e565b610cf581681043561a88293000006103e8613a5e565b73fc56f3098533446b2226e9d526780cf40018d4c473ffffffffffffffffffffffffffffffffffffffff166340c10f19336804af0a763bb1c000006040518363ffffffff1660e01b8152600401610d4d929190614781565b5f604051808303815f87803b158015610d64575f80fd5b505af1158015610d76573d5f803e3d5ffd5b5050505073fc56f3098533446b2226e9d526780cf40018d4c473ffffffffffffffffffffffffffffffffffffffff166340c10f197319bb40bc1f5b6c9adfa29cb7dbdabe66c2ad91516804af0a763bb1c000006040518363ffffffff1660e01b8152600401610de6929190614781565b5f604051808303815f87803b158015610dfd575f80fd5b505af1158015610e0f573d5f803e3d5ffd5b5050505073fc56f3098533446b2226e9d526780cf40018d4c473ffffffffffffffffffffffffffffffffffffffff166340c10f197319c1bb001faa97bd0a07ac75719f380787ae47596804af0a763bb1c000006040518363ffffffff1660e01b8152600401610e7f929190614781565b5f604051808303815f87803b158015610e96575f80fd5b505af1158015610ea8573d5f803e3d5ffd5b5050505073fc56f3098533446b2226e9d526780cf40018d4c473ffffffffffffffffffffffffffffffffffffffff166340c10f1973c600d3e564adf666614fb81834bdfed3d75be1e46804af0a763bb1c000006040518363ffffffff1660e01b8152600401610f18929190614781565b5f604051808303815f87803b158015610f2f575f80fd5b505af1158015610f41573d5f803e3d5ffd5b50505050610f4d613c01565b7f452fb855fd3c6f57cc821ebea14d1467b0773817c62e449a071b1ea92ef0d3af60405160405180910390a1505050565b6002805403610fc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb9906147f2565b60405180910390fd5b600280819055505f8060085f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206040518060400160405290815f820154815260200160018201548152505090505f815f0151111561105557611049815f015183613c1d90919063ffffffff16565b915061105433613c32565b5b73fc56f3098533446b2226e9d526780cf40018d4c473ffffffffffffffffffffffffffffffffffffffff166340c10f1933846040518363ffffffff1660e01b81526004016110a4929190614810565b5f604051808303815f87803b1580156110bb575f80fd5b505af11580156110cd573d5f803e3d5ffd5b505050503373ffffffffffffffffffffffffffffffffffffffff167f47cee97cb7acd717b3c0aa1435d004cd5b3c8c57d70dbceb4e4458bbd60e39d4836040516111179190614121565b60405180910390a250506001600281905550565b5f600680549050905090565b5f1515600360149054906101000a900460ff16151514806111a357507f0000000000000000000000007008d209d803b130db14ee6495262990b6e6e3cf73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6111e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d990614881565b60405180910390fd5b6002805403611226576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121d906147f2565b60405180910390fd5b600280819055506006805490508210611274576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126b906148e9565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614806112d957503373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b15611302577f0000000000000000000000007008d209d803b130db14ee6495262990b6e6e3cf92505b5f6006838154811061131757611316614907565b5b905f5260205f20906005020190505f600a5f8581526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20905061137d84611cfa565b5f6113c582600101546113b764e8d4a510006113a98760040154875f0154613c7990919063ffffffff16565b613c8e90919063ffffffff16565b613ca390919063ffffffff16565b90505f806113d48733886132b7565b915091506113ee81855f0154613c1d90919063ffffffff16565b845f018190555061142664e8d4a510006114188760040154875f0154613c7990919063ffffffff16565b613c8e90919063ffffffff16565b846001018190555061147d333088885f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613cb8909392919063ffffffff16565b5f821115611565576114f360035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683875f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613d419092919063ffffffff16565b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f108516ddcf5ba43cea6bb2cd5ff6d59ac196c1c86ccb9178332b9dd72d1ca561838960405161155c929190614402565b60405180910390a25b5f8311156115ea5773fc56f3098533446b2226e9d526780cf40018d4c473ffffffffffffffffffffffffffffffffffffffff166340c10f1933856040518363ffffffff1660e01b81526004016115bc929190614810565b5f604051808303815f87803b1580156115d3575f80fd5b505af11580156115e5573d5f803e3d5ffd5b505050505b5f6115f484612be5565b90505f811115611609576116088982613dc7565b5b873373ffffffffffffffffffffffffffffffffffffffff167f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15896040516116509190614121565b60405180910390a35050505050506001600281905550505050565b5f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600360149054906101000a900460ff1681565b600681815481106116b5575f80fd5b905f5260205f2090600502015f91509050805f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030154908060040154905085565b60055481565b5f6006838154811061172157611720614907565b5b905f5260205f2090600502016002015460075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f01541015905092915050565b73fc56f3098533446b2226e9d526780cf40018d4c481565b6009602052805f5260405f205f915054906101000a900460ff1681565b6117b8612893565b73ffffffffffffffffffffffffffffffffffffffff166117d6613a57565b73ffffffffffffffffffffffffffffffffffffffff1614611823576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f600454905080821061186b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118629061497e565b60405180910390fd5b611873612257565b816004819055507f989a45b2e873512536614a9a484c6f002cd3a63f7c726fb049f9a890e5d4e75681836040516118ab929190614402565b60405180910390a15050565b5f60028054036118fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f3906147f2565b60405180910390fd5b600280819055505f60075f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090505f815f015411611988576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197f906149e6565b60405180910390fd5b5f6119a0826001015442613ca390919063ffffffff16565b90506224ea008110156119e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119df90614a4e565b60405180910390fd5b815f015492505f825f0181905550611a35338473dfb10795e6fe7d0db68f9778ba4c575a28e8cd4c73ffffffffffffffffffffffffffffffffffffffff16613d419092919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff167f85082129d87b2fe11527cb1b3b7a520aeb5aa6913f88a3d8757fe40d1db02fdd84604051611a7b9190614121565b60405180910390a25050600160028190555090565b611a986140f1565b60085f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206040518060400160405290815f82015481526020016001820154815250509050919050565b5f8060075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206040518060400160405290815f820154815260200160018201548152505090505f815f015103611b6c575f915050611bbc565b8060200151421015611b81575f915050611bbc565b5f816020015142611b929190614a99565b90506224ea008110611ba8575f92505050611bbc565b806224ea00611bb79190614a99565b925050505b919050565b6224ea0081565b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6008602052805f5260405f205f91509050805f0154908060010154905082565b5f8060075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090505f60068581548110611c6357611c62614907565b5b905f5260205f20906005020190505f825f015490505f826002015490505f811480611c8e5750808210155b15611c9f575f945050505050611cf4565b611ca98282613e76565b91505f611ce982611cdb611cc68686613ca390919063ffffffff16565b6101f461ffff16613c7990919063ffffffff16565b613c8e90919063ffffffff16565b905080955050505050505b92915050565b5f60068281548110611d0f57611d0e614907565b5b905f5260205f209060050201905080600301544211611d2e5750611e8b565b5f815f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611d8a9190614221565b602060405180830381865afa158015611da5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611dc99190614ae0565b90505f8103611de2574282600301819055505050611e8b565b5f611df18360030154426128ba565b90505f611e33600554611e258660010154611e1760045487613c7990919063ffffffff16565b613c7990919063ffffffff16565b613c8e90919063ffffffff16565b9050611e75611e6284611e5464e8d4a5100085613c7990919063ffffffff16565b613c8e90919063ffffffff16565b8560040154613c1d90919063ffffffff16565b8460040181905550428460030181905550505050505b50565b6002805403611ed2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec9906147f2565b60405180910390fd5b600280819055505f60068281548110611eee57611eed614907565b5b905f5260205f20906005020190505f600a5f8481526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090505f815f015490505f825f01819055505f8260010181905550611fb03382855f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613d419092919063ffffffff16565b833373ffffffffffffffffffffffffffffffffffffffff167fbe0b6e5b3195df91f2e6b2b20501f84b085714f9e38073f499073c830565100983604051611ff79190614121565b60405180910390a3505050600160028190555050565b612015612893565b73ffffffffffffffffffffffffffffffffffffffff16612033613a57565b73ffffffffffffffffffffffffffffffffffffffff1614612080576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6006838154811061209557612094614907565b5b905f5260205f20906005020160010154905081600684815481106120bc576120bb614907565b5b905f5260205f209060050201600101541115612150575f82600685815481106120e8576120e7614907565b5b905f5260205f209060050201600101546121029190614a99565b60055461210f9190614a99565b1161214f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214690614b7b565b60405180910390fd5b5b612158612257565b6121a2826121946006868154811061217357612172614907565b5b905f5260205f20906005020160010154600554613ca390919063ffffffff16565b613c1d90919063ffffffff16565b60058190555081600684815481106121bd576121bc614907565b5b905f5260205f20906005020160010181905550827fab80a6685d88709a4e48d135d00c13ae6734f7563446d4ad4d132c67e9a627238284604051612202929190614402565b60405180910390a2505050565b5f60075f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f01549050919050565b5f60068054905090505f5b818110156122845761227381611cfa565b8061227d90614b99565b9050612262565b5050565b7395b303987a60c71504d99aa1b13b4da07b0790ab81565b6122a8612893565b73ffffffffffffffffffffffffffffffffffffffff166122c6613a57565b73ffffffffffffffffffffffffffffffffffffffff1614612313576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35f805f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b7f000000000000000000000000000000000000000000000000000000006860fc2181565b6123f961166b565b73ffffffffffffffffffffffffffffffffffffffff16612417613a57565b73ffffffffffffffffffffffffffffffffffffffff1614612464576040517f0f22ca5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff1660015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036124ea576040517fec901e9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff165f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f60015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b73dfb10795e6fe7d0db68f9778ba4c575a28e8cd4c81565b612646612893565b73ffffffffffffffffffffffffffffffffffffffff16612664613a57565b73ffffffffffffffffffffffffffffffffffffffff16146126b1576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f151560095f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16151514612740576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161273790614c2a565b60405180910390fd5b61274b818484613a5e565b600160068054905061275d9190614a99565b7fcf71df2ad8f5180eea605cc5f16399aa74e3a68b2f23a5da121923b71b2ec36d82848660405161279093929190614c48565b60405180910390a2505050565b6127a5612893565b73ffffffffffffffffffffffffffffffffffffffff166127c3613a57565b73ffffffffffffffffffffffffffffffffffffffff1614612810576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73fc56f3098533446b2226e9d526780cf40018d4c473ffffffffffffffffffffffffffffffffffffffff1663b1f8100d612848612893565b6040518263ffffffff1660e01b81526004016128649190614221565b5f604051808303815f87803b15801561287b575f80fd5b505af115801561288d573d5f803e3d5ffd5b50505050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f7f000000000000000000000000000000000000000000000000000000006860fc218311612908577f000000000000000000000000000000000000000000000000000000006860fc2161290a565b825b92507f000000000000000000000000000000000000000000000000000000006860fc2182101561293c575f905061294b565b82826129489190614a99565b90505b92915050565b600a602052815f5260405f20602052805f5260405f205f9150915050805f0154908060010154905082565b73fc56f3098533446b2226e9d526780cf40018d4c481565b73dfb10795e6fe7d0db68f9778ba4c575a28e8cd4c81565b5f1515600360149054906101000a900460ff1615151480612a1857507f0000000000000000000000007008d209d803b130db14ee6495262990b6e6e3cf73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b612a57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a4e90614881565b60405180910390fd5b6002805403612a9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a92906147f2565b60405180910390fd5b600280819055505f60075f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090505f8211612b24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b1b906149e6565b60405180910390fd5b612b3a82825f0154613c1d90919063ffffffff16565b815f0181905550428160010181905550612b8b33308473dfb10795e6fe7d0db68f9778ba4c575a28e8cd4c73ffffffffffffffffffffffffffffffffffffffff16613cb8909392919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff167febedb8b3c678666e7f36970bc8f57abf6d8fa2e828c0da91ea5b75bf68ed101a83604051612bd19190614121565b60405180910390a250600160028190555050565b5f61271061012c83612bf79190614c7d565b612c019190614ceb565b9050919050565b612c10612893565b73ffffffffffffffffffffffffffffffffffffffff16612c2e613a57565b73ffffffffffffffffffffffffffffffffffffffff1614612c7b576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612ce0576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612d64576040517f367558c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff167fa50821a7869f90dcef86915c08ff04d916de378b5eadd9a9009e619f3b9b939060405160405180910390a28060015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6002805403612e2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e25906147f2565b60405180910390fd5b600280819055506006805490508210612e7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e73906148e9565b60405180910390fd5b5f60068381548110612e9157612e90614907565b5b905f5260205f20906005020190505f600a5f8581526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20905082815f01541015612f34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f2b90614d65565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480612f9957503373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16145b15612fc2577f0000000000000000000000007008d209d803b130db14ee6495262990b6e6e3cf94505b612fcb84611cfa565b5f613013826001015461300564e8d4a51000612ff78760040154875f0154613c7990919063ffffffff16565b613c8e90919063ffffffff16565b613ca390919063ffffffff16565b90505f806130228733886132b7565b9150915061303c86855f0154613ca390919063ffffffff16565b845f018190555061307464e8d4a510006130668760040154875f0154613c7990919063ffffffff16565b613c8e90919063ffffffff16565b84600101819055506130c93382875f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613d419092919063ffffffff16565b5f8211156131b15761313f60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683875f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613d419092919063ffffffff16565b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f108516ddcf5ba43cea6bb2cd5ff6d59ac196c1c86ccb9178332b9dd72d1ca56183896040516131a8929190614402565b60405180910390a25b5f8311156132365773fc56f3098533446b2226e9d526780cf40018d4c473ffffffffffffffffffffffffffffffffffffffff166340c10f1933856040518363ffffffff1660e01b8152600401613208929190614810565b5f604051808303815f87803b15801561321f575f80fd5b505af1158015613231573d5f803e3d5ffd5b505050505b5f61324084612be5565b90505f811115613255576132548982613dc7565b5b873373ffffffffffffffffffffffffffffffffffffffff167ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5688960405161329c9190614121565b60405180910390a35050505050506001600281905550505050565b5f806132c3858561170c565b156132d3575f8391509150613329565b5f6133086127106132fa6132e78989611c0d565b61ffff1687613c7990919063ffffffff16565b613c8e90919063ffffffff16565b90505f61331e8286613ca390919063ffffffff16565b905081819350935050505b935093915050565b6101f481565b600680549050811061337e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161337590614dcd565b60405180910390fd5b5f8290505b8181116133a45761339381611cfa565b8061339d90614b99565b9050613383565b505050565b6007602052805f5260405f205f91509050805f0154908060010154905082565b60045481565b6133d7612893565b73ffffffffffffffffffffffffffffffffffffffff166133f5613a57565b73ffffffffffffffffffffffffffffffffffffffff1614613442576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73dfb10795e6fe7d0db68f9778ba4c575a28e8cd4c73ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561349f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906134c39190614ae0565b8161ffff1610613508576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134ff90614e35565b60405180910390fd5b8061ffff166006838154811061352157613520614907565b5b905f5260205f209060050201600201819055507f0d3990e156c26a5f3f1e69eb1940ca2e18d4e814e4cb8b9783e2472a10c7c6858282604051613565929190614e53565b60405180910390a15050565b7f0000000000000000000000007008d209d803b130db14ee6495262990b6e6e3cf81565b7329ea7545def87022badc76323f373ea1e707c52381565b6135b5612893565b73ffffffffffffffffffffffffffffffffffffffff166135d3613a57565b73ffffffffffffffffffffffffffffffffffffffff1614613620576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73fc56f3098533446b2226e9d526780cf40018d4c473ffffffffffffffffffffffffffffffffffffffff166379ba50976040518163ffffffff1660e01b81526004015f604051808303815f87803b158015613679575f80fd5b505af115801561368b573d5f803e3d5ffd5b50505050565b73efd766ccb38eaf1dfd701853bfce31359239f30581565b6136b1612893565b73ffffffffffffffffffffffffffffffffffffffff166136cf613a57565b73ffffffffffffffffffffffffffffffffffffffff161461371c576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361378a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161378190614ec4565b60405180910390fd5b5f60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160035f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f69cca87270f7727b8fbdfefbbb549c52795cf9b87f29eb4b52a55c11a30a38f881836040516138209291906146e2565b60405180910390a15050565b73a1077a294dde1b09bb078844df40758a5d0f9a2781565b5f806006848154811061385a57613859614907565b5b905f5260205f20906005020190505f600a5f8681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090505f826004015490505f835f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161391b9190614221565b602060405180830381865afa158015613936573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061395a9190614ae0565b905083600301544211801561396f57505f8114155b15613a08575f6139838560030154426128ba565b90505f6139c56005546139b788600101546139a960045487613c7990919063ffffffff16565b613c7990919063ffffffff16565b613c8e90919063ffffffff16565b9050613a036139f4846139e664e8d4a5100085613c7990919063ffffffff16565b613c8e90919063ffffffff16565b85613c1d90919063ffffffff16565b935050505b613a4b8360010154613a3d64e8d4a51000613a2f86885f0154613c7990919063ffffffff16565b613c8e90919063ffffffff16565b613ca390919063ffffffff16565b94505050505092915050565b5f33905090565b613a66612257565b5f7f000000000000000000000000000000000000000000000000000000006860fc214211613ab4577f000000000000000000000000000000000000000000000000000000006860fc21613ab6565b425b9050613acd82600554613c1d90919063ffffffff16565b60058190555060066040518060a001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018581526020018381526020015f815250908060018154018082558091505060019003905f5260205f2090600502015f909190919091505f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550602082015181600101556040820151816002015560608201518160030155608082015181600401555050600160095f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555050505050565b5f600360146101000a81548160ff021916908315150217905550565b5f8183613c2a9190614ee2565b905092915050565b5f60085f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f018190555050565b5f8183613c869190614c7d565b905092915050565b5f8183613c9b9190614ceb565b905092915050565b5f8183613cb09190614a99565b905092915050565b613d3b846323b872dd60e01b858585604051602401613cd993929190614f15565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613e8e565b50505050565b613dc28363a9059cbb60e01b8484604051602401613d60929190614810565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613e8e565b505050565b8060085f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f828254613e159190614ee2565b925050819055508060085f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206001015f828254613e6b9190614ee2565b925050819055505050565b5f818310613e845781613e86565b825b905092915050565b5f613eef826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16613f539092919063ffffffff16565b90505f81511115613f4e5780806020019051810190613f0e9190614f74565b613f4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613f449061500f565b60405180910390fd5b5b505050565b6060613f6184845f85613f6a565b90509392505050565b606082471015613faf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613fa69061509d565b60405180910390fd5b613fb88561407a565b613ff7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613fee90615105565b60405180910390fd5b5f808673ffffffffffffffffffffffffffffffffffffffff16858760405161401f919061518f565b5f6040518083038185875af1925050503d805f8114614059576040519150601f19603f3d011682016040523d82523d5f602084013e61405e565b606091505b509150915061406e82828661408b565b92505050949350505050565b5f80823b90505f8111915050919050565b6060831561409b578290506140ea565b5f835111156140ad5782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016140e191906151f7565b60405180910390fd5b9392505050565b60405180604001604052805f81526020015f81525090565b5f819050919050565b61411b81614109565b82525050565b5f6020820190506141345f830184614112565b92915050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6141678261413e565b9050919050565b6141778161415d565b8114614181575f80fd5b50565b5f813590506141928161416e565b92915050565b6141a181614109565b81146141ab575f80fd5b50565b5f813590506141bc81614198565b92915050565b5f805f606084860312156141d9576141d861413a565b5b5f6141e686828701614184565b93505060206141f7868287016141ae565b9250506040614208868287016141ae565b9150509250925092565b61421b8161415d565b82525050565b5f6020820190506142345f830184614212565b92915050565b5f8115159050919050565b61424e8161423a565b82525050565b5f6020820190506142675f830184614245565b92915050565b5f602082840312156142825761428161413a565b5b5f61428f848285016141ae565b91505092915050565b5f819050919050565b5f6142bb6142b66142b18461413e565b614298565b61413e565b9050919050565b5f6142cc826142a1565b9050919050565b5f6142dd826142c2565b9050919050565b6142ed816142d3565b82525050565b5f60a0820190506143065f8301886142e4565b6143136020830187614112565b6143206040830186614112565b61432d6060830185614112565b61433a6080830184614112565b9695505050505050565b5f806040838503121561435a5761435961413a565b5b5f614367858286016141ae565b925050602061437885828601614184565b9150509250929050565b5f602082840312156143975761439661413a565b5b5f6143a484828501614184565b91505092915050565b6143b681614109565b82525050565b604082015f8201516143d05f8501826143ad565b5060208201516143e360208501826143ad565b50505050565b5f6040820190506143fc5f8301846143bc565b92915050565b5f6040820190506144155f830185614112565b6144226020830184614112565b9392505050565b5f61ffff82169050919050565b61443f81614429565b82525050565b5f6020820190506144585f830184614436565b92915050565b5f80604083850312156144745761447361413a565b5b5f614481858286016141ae565b9250506020614492858286016141ae565b9150509250929050565b5f6020820190506144af5f8301846142e4565b92915050565b5f6144bf8261415d565b9050919050565b6144cf816144b5565b81146144d9575f80fd5b50565b5f813590506144ea816144c6565b92915050565b5f805f606084860312156145075761450661413a565b5b5f614514868287016141ae565b9350506020614525868287016141ae565b9250506040614536868287016144dc565b9150509250925092565b5f61454a826142c2565b9050919050565b61455a81614540565b82525050565b5f6020820190506145735f830184614551565b92915050565b5f805f606084860312156145905761458f61413a565b5b5f61459d868287016141ae565b93505060206145ae86828701614184565b92505060406145bf868287016141ae565b9150509250925092565b6145d281614429565b81146145dc575f80fd5b50565b5f813590506145ed816145c9565b92915050565b5f80604083850312156146095761460861413a565b5b5f614616858286016141ae565b9250506020614627858286016145df565b9150509250929050565b5f61463b826142c2565b9050919050565b61464b81614631565b82525050565b5f6020820190506146645f830184614642565b92915050565b5f82825260208201905092915050565b7f4f4e4c595f494e5f5345545550000000000000000000000000000000000000005f82015250565b5f6146ae600d8361466a565b91506146b98261467a565b602082019050919050565b5f6020820190508181035f8301526146db816146a2565b9050919050565b5f6040820190506146f55f830185614212565b6147026020830184614212565b9392505050565b5f815190506147178161416e565b92915050565b5f602082840312156147325761473161413a565b5b5f61473f84828501614709565b91505092915050565b5f819050919050565b5f61476b61476661476184614748565b614298565b614109565b9050919050565b61477b81614751565b82525050565b5f6040820190506147945f830185614212565b6147a16020830184614772565b9392505050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c005f82015250565b5f6147dc601f8361466a565b91506147e7826147a8565b602082019050919050565b5f6020820190508181035f830152614809816147d0565b9050919050565b5f6040820190506148235f830185614212565b6148306020830184614112565b9392505050565b7f53455455505f4d4f44455f454e474147454400000000000000000000000000005f82015250565b5f61486b60128361466a565b915061487682614837565b602082019050919050565b5f6020820190508181035f8301526148988161485f565b9050919050565b7f506f6f6c20646f6573206e6f74206578697374000000000000000000000000005f82015250565b5f6148d360138361466a565b91506148de8261489f565b602082019050919050565b5f6020820190508181035f830152614900816148c7565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4f4e4c595f4445435245415345530000000000000000000000000000000000005f82015250565b5f614968600e8361466a565b915061497382614934565b602082019050919050565b5f6020820190508181035f8301526149958161495c565b9050919050565b7f5a45524f5f414d4f554e545f4e4f545f414c4c4f5745440000000000000000005f82015250565b5f6149d060178361466a565b91506149db8261499c565b602082019050919050565b5f6020820190508181035f8301526149fd816149c4565b9050919050565b7f4e4f545f52454144595f544f5f554e5354414b455f59455400000000000000005f82015250565b5f614a3860188361466a565b9150614a4382614a04565b602082019050919050565b5f6020820190508181035f830152614a6581614a2c565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f614aa382614109565b9150614aae83614109565b9250828203905081811115614ac657614ac5614a6c565b5b92915050565b5f81519050614ada81614198565b92915050565b5f60208284031215614af557614af461413a565b5b5f614b0284828501614acc565b91505092915050565b7f6164643a2063616e27742073657420746f74616c416c6c6f63506f696e7420745f8201527f6f20302121000000000000000000000000000000000000000000000000000000602082015250565b5f614b6560258361466a565b9150614b7082614b0b565b604082019050919050565b5f6020820190508181035f830152614b9281614b59565b9050919050565b5f614ba382614109565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614bd557614bd4614a6c565b5b600182019050919050565b7f414c52454144595f4558495354530000000000000000000000000000000000005f82015250565b5f614c14600e8361466a565b9150614c1f82614be0565b602082019050919050565b5f6020820190508181035f830152614c4181614c08565b9050919050565b5f606082019050614c5b5f830186614212565b614c686020830185614112565b614c756040830184614112565b949350505050565b5f614c8782614109565b9150614c9283614109565b9250828202614ca081614109565b91508282048414831517614cb757614cb6614a6c565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f614cf582614109565b9150614d0083614109565b925082614d1057614d0f614cbe565b5b828204905092915050565b7f77697468647261773a206e6f7420676f6f6400000000000000000000000000005f82015250565b5f614d4f60128361466a565b9150614d5a82614d1b565b602082019050919050565b5f6020820190508181035f830152614d7c81614d43565b9050919050565b7f456e6420696e646578206f7574206f6620626f756e64730000000000000000005f82015250565b5f614db760178361466a565b9150614dc282614d83565b602082019050919050565b5f6020820190508181035f830152614de481614dab565b9050919050565b7f5448524553484f4c445f455843454544535f535550504c5900000000000000005f82015250565b5f614e1f60188361466a565b9150614e2a82614deb565b602082019050919050565b5f6020820190508181035f830152614e4c81614e13565b9050919050565b5f604082019050614e665f830185614112565b614e736020830184614436565b9392505050565b7f594541485f4e41485f4d415445000000000000000000000000000000000000005f82015250565b5f614eae600d8361466a565b9150614eb982614e7a565b602082019050919050565b5f6020820190508181035f830152614edb81614ea2565b9050919050565b5f614eec82614109565b9150614ef783614109565b9250828201905080821115614f0f57614f0e614a6c565b5b92915050565b5f606082019050614f285f830186614212565b614f356020830185614212565b614f426040830184614112565b949350505050565b614f538161423a565b8114614f5d575f80fd5b50565b5f81519050614f6e81614f4a565b92915050565b5f60208284031215614f8957614f8861413a565b5b5f614f9684828501614f60565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e5f8201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b5f614ff9602a8361466a565b915061500482614f9f565b604082019050919050565b5f6020820190508181035f83015261502681614fed565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f5f8201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b5f61508760268361466a565b91506150928261502d565b604082019050919050565b5f6020820190508181035f8301526150b48161507b565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000005f82015250565b5f6150ef601d8361466a565b91506150fa826150bb565b602082019050919050565b5f6020820190508181035f83015261511c816150e3565b9050919050565b5f81519050919050565b5f81905092915050565b5f5b83811015615154578082015181840152602081019050615139565b5f8484015250505050565b5f61516982615123565b615173818561512d565b9350615183818560208601615137565b80840191505092915050565b5f61519a828461515f565b915081905092915050565b5f81519050919050565b5f601f19601f8301169050919050565b5f6151c9826151a5565b6151d3818561466a565b93506151e3818560208601615137565b6151ec816151af565b840191505092915050565b5f6020820190508181035f83015261520f81846151bf565b90509291505056fea2646970667358221220f71a2fd8aa41e54ca35f87dbcd21782d475c5975dec4cb7b183b2b2018a58d5a64736f6c63430008140033