false
true
0

Contract Address Details

0x184f3FAd8618a6F458C16bae63F70C426fE784B3

Contract Name
OlympusTokenMigrator
Creator
0xf9704b–4d2a44 at 0x20ffc2–ea7d69
Balance
0 PLS ( )
Tokens
Fetching tokens...
Transactions
74,755 Transactions
Transfers
0 Transfers
Gas Used
0
Last Balance Update
26154654
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
This contract has been verified via Sourcify. View contract in Sourcify repository
Contract name:
OlympusTokenMigrator




Optimization enabled
false
Compiler version
v0.7.5+commit.eb77ed08




EVM Version
istanbul




Verified at
2026-03-30T09:55:30.234000Z

Constructor Arguments

000000000000000000000000383518188c0c6d7730d91b2c03a03c837814a89900000000000000000000000004f2694c8fcee23e8fd0dfea1d4f5bb8c352111f00000000000000000000000031f8cc382c9898b273eff4e0b7626a6987c846e8000000000000000000000000fd31c7d00ca47653c6ce64af53c1571f9c36566a000000000000000000000000ca76543cf381ebbb277be79574059e32108e3e65000000000000000000000000d9e1ce17f2641f24ae83637ab66a2cca9c378b9f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d0000000000000000000000000000000000000000000000000000000000001b580000000000000000000000001c21f8ea7e39e2ba00bc12d2968d63f4acb38b7a

Arg [0] (address) : 0x383518188c0c6d7730d91b2c03a03c837814a899
Arg [1] (address) : 0x04f2694c8fcee23e8fd0dfea1d4f5bb8c352111f
Arg [2] (address) : 0x31f8cc382c9898b273eff4e0b7626a6987c846e8
Arg [3] (address) : 0xfd31c7d00ca47653c6ce64af53c1571f9c36566a
Arg [4] (address) : 0xca76543cf381ebbb277be79574059e32108e3e65
Arg [5] (address) : 0xd9e1ce17f2641f24ae83637ab66a2cca9c378b9f
Arg [6] (address) : 0x7a250d5630b4cf539739df2c5dacb4c659f2488d
Arg [7] (uint256) : 7000
Arg [8] (address) : 0x1c21f8ea7e39e2ba00bc12d2968d63f4acb38b7a

              

gOHM_flat.sol

// SPDX-License-Identifier: AGPL-3.0-or-later

// File: libraries/SafeMath.sol


pragma solidity ^0.7.5;


// TODO(zx): Replace all instances of SafeMath with OZ implementation
library SafeMath {

    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

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

        return c;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

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

        return c;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    // Only used in the  BondingCalculator.sol
    function sqrrt(uint256 a) internal pure returns (uint c) {
        if (a > 3) {
            c = a;
            uint b = add( div( a, 2), 1 );
            while (b < c) {
                c = b;
                b = div( add( div( a, b ), b), 2 );
            }
        } else if (a != 0) {
            c = 1;
        }
    }

}
// File: interfaces/IOlympusAuthority.sol


pragma solidity =0.7.5;

interface IOlympusAuthority {
    /* ========== EVENTS ========== */
    
    event GovernorPushed(address indexed from, address indexed to, bool _effectiveImmediately);
    event GuardianPushed(address indexed from, address indexed to, bool _effectiveImmediately);    
    event PolicyPushed(address indexed from, address indexed to, bool _effectiveImmediately);    
    event VaultPushed(address indexed from, address indexed to, bool _effectiveImmediately);    

    event GovernorPulled(address indexed from, address indexed to);
    event GuardianPulled(address indexed from, address indexed to);
    event PolicyPulled(address indexed from, address indexed to);
    event VaultPulled(address indexed from, address indexed to);

    /* ========== VIEW ========== */
    
    function governor() external view returns (address);
    function guardian() external view returns (address);
    function policy() external view returns (address);
    function vault() external view returns (address);
}
// File: types/OlympusAccessControlled.sol


pragma solidity >=0.7.5;


abstract contract OlympusAccessControlled {

    /* ========== EVENTS ========== */

    event AuthorityUpdated(IOlympusAuthority indexed authority);

    string UNAUTHORIZED = "UNAUTHORIZED"; // save gas

    /* ========== STATE VARIABLES ========== */

    IOlympusAuthority public authority;


    /* ========== Constructor ========== */

    constructor(IOlympusAuthority _authority) {
        authority = _authority;
        emit AuthorityUpdated(_authority);
    }
    

    /* ========== MODIFIERS ========== */
    
    modifier onlyGovernor() {
        require(msg.sender == authority.governor(), UNAUTHORIZED);
        _;
    }
    
    modifier onlyGuardian() {
        require(msg.sender == authority.guardian(), UNAUTHORIZED);
        _;
    }
    
    modifier onlyPolicy() {
        require(msg.sender == authority.policy(), UNAUTHORIZED);
        _;
    }

    modifier onlyVault() {
        require(msg.sender == authority.vault(), UNAUTHORIZED);
        _;
    }
    
    /* ========== GOV ONLY ========== */
    
    function setAuthority(IOlympusAuthority _newAuthority) external onlyGovernor {
        authority = _newAuthority;
        emit AuthorityUpdated(_newAuthority);
    }
}

// File: interfaces/ITreasuryV1.sol


pragma solidity >=0.7.5;

interface ITreasuryV1 {
    function withdraw(uint256 amount, address token) external;
    function manage(address token, uint256 amount) external;
    function valueOf(address token, uint256 amount) external view returns (uint256);
    function excessReserves() external view returns (uint256);
}
// File: interfaces/IStakingV1.sol


pragma solidity >=0.7.5;

interface IStakingV1 {
    function unstake(uint256 _amount, bool _trigger) external;

    function index() external view returns (uint256);
}
// File: interfaces/IUniswapV2Router.sol


pragma solidity >=0.7.5;

interface IUniswapV2Router {
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);

    function addLiquidity(
        address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline
        ) external returns (uint amountA, uint amountB, uint liquidity);
        
    function removeLiquidity(
        address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline
        ) external returns (uint amountA, uint amountB);
}
// File: interfaces/IOwnable.sol


pragma solidity >=0.7.5;


interface IOwnable {
  function owner() external view returns (address);

  function renounceManagement() external;
  
  function pushManagement( address newOwner_ ) external;
  
  function pullManagement() external;
}
// File: interfaces/IStaking.sol


pragma solidity >=0.7.5;

interface IStaking {
    function stake(
        address _to,
        uint256 _amount,
        bool _rebasing,
        bool _claim
    ) external returns (uint256);

    function claim(address _recipient, bool _rebasing) external returns (uint256);

    function forfeit() external returns (uint256);

    function toggleLock() external;

    function unstake(
        address _to,
        uint256 _amount,
        bool _trigger,
        bool _rebasing
    ) external returns (uint256);

    function wrap(address _to, uint256 _amount) external returns (uint256 gBalance_);

    function unwrap(address _to, uint256 _amount) external returns (uint256 sBalance_);

    function rebase() external;

    function index() external view returns (uint256);

    function contractBalance() external view returns (uint256);

    function totalStaked() external view returns (uint256);

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

// File: interfaces/ITreasury.sol


pragma solidity >=0.7.5;

interface ITreasury {
    function deposit(
        uint256 _amount,
        address _token,
        uint256 _profit
    ) external returns (uint256);

    function withdraw(uint256 _amount, address _token) external;

    function tokenValue(address _token, uint256 _amount) external view returns (uint256 value_);

    function mint(address _recipient, uint256 _amount) external;

    function manage(address _token, uint256 _amount) external;

    function incurDebt(uint256 amount_, address token_) external;

    function repayDebtWithReserve(uint256 amount_, address token_) external;

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

// File: interfaces/IERC20.sol


pragma solidity >=0.7.5;

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

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

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

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

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

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

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

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

// File: libraries/SafeERC20.sol


pragma solidity >=0.7.5;


/// @notice Safe IERC20 and ETH transfer library that safely handles missing return values.
/// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v3-periphery/blob/main/contracts/libraries/TransferHelper.sol)
/// Taken from Solmate
library SafeERC20 {
    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 amount
    ) internal {
        (bool success, bytes memory data) = address(token).call(
            abi.encodeWithSelector(IERC20.transferFrom.selector, from, to, amount)
        );

        require(success && (data.length == 0 || abi.decode(data, (bool))), "TRANSFER_FROM_FAILED");
    }

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 amount
    ) internal {
        (bool success, bytes memory data) = address(token).call(
            abi.encodeWithSelector(IERC20.transfer.selector, to, amount)
        );

        require(success && (data.length == 0 || abi.decode(data, (bool))), "TRANSFER_FAILED");
    }

    function safeApprove(
        IERC20 token,
        address to,
        uint256 amount
    ) internal {
        (bool success, bytes memory data) = address(token).call(
            abi.encodeWithSelector(IERC20.approve.selector, to, amount)
        );

        require(success && (data.length == 0 || abi.decode(data, (bool))), "APPROVE_FAILED");
    }

    function safeTransferETH(address to, uint256 amount) internal {
        (bool success, ) = to.call{value: amount}(new bytes(0));

        require(success, "ETH_TRANSFER_FAILED");
    }
}
// File: interfaces/IgOHM.sol


pragma solidity >=0.7.5;


interface IgOHM is IERC20 {
  function mint(address _to, uint256 _amount) external;

  function burn(address _from, uint256 _amount) external;

  function index() external view returns (uint256);

  function balanceFrom(uint256 _amount) external view returns (uint256);

  function balanceTo(uint256 _amount) external view returns (uint256);

  function migrate( address _staking, address _sOHM ) external;
}

// File: interfaces/IwsOHM.sol


pragma solidity >=0.7.5;


// Old wsOHM interface
interface IwsOHM is IERC20 {
  function wrap(uint256 _amount) external returns (uint256);

  function unwrap(uint256 _amount) external returns (uint256);

  function wOHMTosOHM(uint256 _amount) external view returns (uint256);

  function sOHMTowOHM(uint256 _amount) external view returns (uint256);
}

// File: interfaces/IsOHM.sol


pragma solidity >=0.7.5;


interface IsOHM is IERC20 {
    function rebase( uint256 ohmProfit_, uint epoch_) external returns (uint256);

    function circulatingSupply() external view returns (uint256);

    function gonsForBalance( uint amount ) external view returns ( uint );

    function balanceForGons( uint gons ) external view returns ( uint );

    function index() external view returns ( uint );

    function toG(uint amount) external view returns (uint);

    function fromG(uint amount) external view returns (uint);

     function changeDebt(
        uint256 amount,
        address debtor,
        bool add
    ) external;

    function debtBalances(address _address) external view returns (uint256);
}

// File: gOHM.sol


pragma solidity 0.7.5;















contract OlympusTokenMigrator is OlympusAccessControlled {
    using SafeMath for uint256;
    using SafeERC20 for IERC20;
    using SafeERC20 for IgOHM;
    using SafeERC20 for IsOHM;
    using SafeERC20 for IwsOHM;

    /* ========== MIGRATION ========== */

    event TimelockStarted(uint256 block, uint256 end);
    event Migrated(address staking, address treasury);
    event Funded(uint256 amount);
    event Defunded(uint256 amount);

    /* ========== STATE VARIABLES ========== */

    IERC20 public immutable oldOHM;
    IsOHM public immutable oldsOHM;
    IwsOHM public immutable oldwsOHM;
    ITreasuryV1 public immutable oldTreasury;
    IStakingV1 public immutable oldStaking;

    IUniswapV2Router public immutable sushiRouter;
    IUniswapV2Router public immutable uniRouter;

    IgOHM public gOHM;
    ITreasury public newTreasury;
    IStaking public newStaking;
    IERC20 public newOHM;

    bool public ohmMigrated;
    bool public shutdown;

    uint256 public immutable timelockLength;
    uint256 public timelockEnd;

    uint256 public oldSupply;

    constructor(
        address _oldOHM,
        address _oldsOHM,
        address _oldTreasury,
        address _oldStaking,
        address _oldwsOHM,
        address _sushi,
        address _uni,
        uint256 _timelock,
        address _authority
    ) OlympusAccessControlled(IOlympusAuthority(_authority)) {
        require(_oldOHM != address(0), "Zero address: OHM");
        oldOHM = IERC20(_oldOHM);
        require(_oldsOHM != address(0), "Zero address: sOHM");
        oldsOHM = IsOHM(_oldsOHM);
        require(_oldTreasury != address(0), "Zero address: Treasury");
        oldTreasury = ITreasuryV1(_oldTreasury);
        require(_oldStaking != address(0), "Zero address: Staking");
        oldStaking = IStakingV1(_oldStaking);
        require(_oldwsOHM != address(0), "Zero address: wsOHM");
        oldwsOHM = IwsOHM(_oldwsOHM);
        require(_sushi != address(0), "Zero address: Sushi");
        sushiRouter = IUniswapV2Router(_sushi);
        require(_uni != address(0), "Zero address: Uni");
        uniRouter = IUniswapV2Router(_uni);
        timelockLength = _timelock;
    }

    /* ========== MIGRATION ========== */

    enum TYPE {
        UNSTAKED,
        STAKED,
        WRAPPED
    }

    // migrate OHMv1, sOHMv1, or wsOHM for OHMv2, sOHMv2, or gOHM
    function migrate(
        uint256 _amount,
        TYPE _from,
        TYPE _to
    ) external {
        require(!shutdown, "Shut down");

        uint256 wAmount = oldwsOHM.sOHMTowOHM(_amount);

        if (_from == TYPE.UNSTAKED) {
            require(ohmMigrated, "Only staked until migration");
            oldOHM.safeTransferFrom(msg.sender, address(this), _amount);
        } else if (_from == TYPE.STAKED) {
            oldsOHM.safeTransferFrom(msg.sender, address(this), _amount);
        } else {
            oldwsOHM.safeTransferFrom(msg.sender, address(this), _amount);
            wAmount = _amount;
        }

        if (ohmMigrated) {
            require(oldSupply >= oldOHM.totalSupply(), "OHMv1 minted");
            _send(wAmount, _to);
        } else {
            gOHM.mint(msg.sender, wAmount);
        }
    }

    // migrate all olympus tokens held
    function migrateAll(TYPE _to) external {
        require(!shutdown, "Shut down");

        uint256 ohmBal = 0;
        uint256 sOHMBal = oldsOHM.balanceOf(msg.sender);
        uint256 wsOHMBal = oldwsOHM.balanceOf(msg.sender);

        if (oldOHM.balanceOf(msg.sender) > 0 && ohmMigrated) {
            ohmBal = oldOHM.balanceOf(msg.sender);
            oldOHM.safeTransferFrom(msg.sender, address(this), ohmBal);
        }
        if (sOHMBal > 0) {
            oldsOHM.safeTransferFrom(msg.sender, address(this), sOHMBal);
        }
        if (wsOHMBal > 0) {
            oldwsOHM.safeTransferFrom(msg.sender, address(this), wsOHMBal);
        }

        uint256 wAmount = wsOHMBal.add(oldwsOHM.sOHMTowOHM(ohmBal.add(sOHMBal)));
        if (ohmMigrated) {
            require(oldSupply >= oldOHM.totalSupply(), "OHMv1 minted");
            _send(wAmount, _to);
        } else {
            gOHM.mint(msg.sender, wAmount);
        }
    }

    // send preferred token
    function _send(uint256 wAmount, TYPE _to) internal {
        if (_to == TYPE.WRAPPED) {
            gOHM.safeTransfer(msg.sender, wAmount);
        } else if (_to == TYPE.STAKED) {
            newStaking.unwrap(msg.sender, wAmount);
        } else if (_to == TYPE.UNSTAKED) {
            newStaking.unstake(msg.sender, wAmount, false, false);
        }
    }

    // bridge back to OHM, sOHM, or wsOHM
    function bridgeBack(uint256 _amount, TYPE _to) external {
        if (!ohmMigrated) {
            gOHM.burn(msg.sender, _amount);
        } else {
            gOHM.safeTransferFrom(msg.sender, address(this), _amount);
        }

        uint256 amount = oldwsOHM.wOHMTosOHM(_amount);
        // error throws if contract does not have enough of type to send
        if (_to == TYPE.UNSTAKED) {
            oldOHM.safeTransfer(msg.sender, amount);
        } else if (_to == TYPE.STAKED) {
            oldsOHM.safeTransfer(msg.sender, amount);
        } else if (_to == TYPE.WRAPPED) {
            oldwsOHM.safeTransfer(msg.sender, _amount);
        }
    }

    /* ========== OWNABLE ========== */

    // halt migrations (but not bridging back)
    function halt() external onlyPolicy {
        require(!ohmMigrated, "Migration has occurred");
        shutdown = !shutdown;
    }

    // withdraw backing of migrated OHM
    function defund(address reserve) external onlyGovernor {
        require(ohmMigrated, "Migration has not begun");
        require(timelockEnd < block.number && timelockEnd != 0, "Timelock not complete");

        oldwsOHM.unwrap(oldwsOHM.balanceOf(address(this)));

        uint256 amountToUnstake = oldsOHM.balanceOf(address(this));
        oldsOHM.approve(address(oldStaking), amountToUnstake);
        oldStaking.unstake(amountToUnstake, false);

        uint256 balance = oldOHM.balanceOf(address(this));

        if(balance > oldSupply) {
            oldSupply = 0;
        } else {
            oldSupply -= balance;
        }

        uint256 amountToWithdraw = balance.mul(1e9);
        oldOHM.approve(address(oldTreasury), amountToWithdraw);
        oldTreasury.withdraw(amountToWithdraw, reserve);
        IERC20(reserve).safeTransfer(address(newTreasury), IERC20(reserve).balanceOf(address(this)));

        emit Defunded(balance);
    }

    // start timelock to send backing to new treasury
    function startTimelock() external onlyGovernor {
        require(timelockEnd == 0, "Timelock set");
        timelockEnd = block.number.add(timelockLength);

        emit TimelockStarted(block.number, timelockEnd);
    }

    // set gOHM address
    function setgOHM(address _gOHM) external onlyGovernor {
        require(address(gOHM) == address(0), "Already set");
        require(_gOHM != address(0), "Zero address: gOHM");

        gOHM = IgOHM(_gOHM);
    }

    // call internal migrate token function
    function migrateToken(address token) external onlyGovernor {
        _migrateToken(token, false);
    }

    /**
     *   @notice Migrate LP and pair with new OHM
     */
    function migrateLP(
        address pair,
        bool sushi,
        address token,
        uint256 _minA,
        uint256 _minB
    ) external onlyGovernor {
        uint256 oldLPAmount = IERC20(pair).balanceOf(address(oldTreasury));
        oldTreasury.manage(pair, oldLPAmount);

        IUniswapV2Router router = sushiRouter;
        if (!sushi) {
            router = uniRouter;
        }

        IERC20(pair).approve(address(router), oldLPAmount);
        (uint256 amountA, uint256 amountB) = router.removeLiquidity(
            token, 
            address(oldOHM), 
            oldLPAmount,
            _minA, 
            _minB, 
            address(this), 
            block.timestamp
        );

        newTreasury.mint(address(this), amountB);

        IERC20(token).approve(address(router), amountA);
        newOHM.approve(address(router), amountB);

        router.addLiquidity(
            token, 
            address(newOHM), 
            amountA, 
            amountB, 
            amountA, 
            amountB, 
            address(newTreasury), 
            block.timestamp
        );
    }

    // Failsafe function to allow owner to withdraw funds sent directly to contract in case someone sends non-ohm tokens to the contract
    function withdrawToken(
        address tokenAddress,
        uint256 amount,
        address recipient
    ) external onlyGovernor {
        require(tokenAddress != address(0), "Token address cannot be 0x0");
        require(tokenAddress != address(gOHM), "Cannot withdraw: gOHM");
        require(tokenAddress != address(oldOHM), "Cannot withdraw: old-OHM");
        require(tokenAddress != address(oldsOHM), "Cannot withdraw: old-sOHM");
        require(tokenAddress != address(oldwsOHM), "Cannot withdraw: old-wsOHM");
        require(amount > 0, "Withdraw value must be greater than 0");
        if (recipient == address(0)) {
            recipient = msg.sender; // if no address is specified the value will will be withdrawn to Owner
        }

        IERC20 tokenContract = IERC20(tokenAddress);
        uint256 contractBalance = tokenContract.balanceOf(address(this));
        if (amount > contractBalance) {
            amount = contractBalance; // set the withdrawal amount equal to balance within the account.
        }
        // transfer the token from address of this contract
        tokenContract.safeTransfer(recipient, amount);
    }

    // migrate contracts
    function migrateContracts(
        address _newTreasury,
        address _newStaking,
        address _newOHM,
        address _newsOHM,
        address _reserve
    ) external onlyGovernor {
        require(!ohmMigrated, "Already migrated");
        ohmMigrated = true;
        shutdown = false;

        require(_newTreasury != address(0), "Zero address: Treasury");
        newTreasury = ITreasury(_newTreasury);
        require(_newStaking != address(0), "Zero address: Staking");
        newStaking = IStaking(_newStaking);
        require(_newOHM != address(0), "Zero address: OHM");
        newOHM = IERC20(_newOHM);

        oldSupply = oldOHM.totalSupply(); // log total supply at time of migration

        gOHM.migrate(_newStaking, _newsOHM); // change gOHM minter

        _migrateToken(_reserve, true); // will deposit tokens into new treasury so reserves can be accounted for

        _fund(oldsOHM.circulatingSupply()); // fund with current staked supply for token migration

        emit Migrated(_newStaking, _newTreasury);
    }

    /* ========== INTERNAL FUNCTIONS ========== */

    // fund contract with gOHM
    function _fund(uint256 _amount) internal {
        newTreasury.mint(address(this), _amount);
        newOHM.approve(address(newStaking), _amount);
        newStaking.stake(address(this), _amount, false, true); // stake and claim gOHM

        emit Funded(_amount);
    }

    /**
     *   @notice Migrate token from old treasury to new treasury
     */
    function _migrateToken(address token, bool deposit) internal {
        uint256 balance = IERC20(token).balanceOf(address(oldTreasury));

        uint256 excessReserves = oldTreasury.excessReserves();
        uint256 tokenValue = oldTreasury.valueOf(token, balance);

        if (tokenValue > excessReserves) {
            tokenValue = excessReserves;
            balance = excessReserves * 10**9;
        }

        oldTreasury.manage(token, balance);

        if (deposit) {
            IERC20(token).safeApprove(address(newTreasury), balance);
            newTreasury.deposit(balance, token, tokenValue);
        } else {
            IERC20(token).safeTransfer(address(newTreasury), balance);
        }
    }
}
        

Compiler Settings

{"remappings":[],"optimizer":{"runs":200,"enabled":false},"metadata":{"bytecodeHash":"ipfs"},"libraries":{},"evmVersion":"istanbul","compilationTarget":{"gOHM_flat.sol":"OlympusTokenMigrator"}}
              

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"_oldOHM","internalType":"address"},{"type":"address","name":"_oldsOHM","internalType":"address"},{"type":"address","name":"_oldTreasury","internalType":"address"},{"type":"address","name":"_oldStaking","internalType":"address"},{"type":"address","name":"_oldwsOHM","internalType":"address"},{"type":"address","name":"_sushi","internalType":"address"},{"type":"address","name":"_uni","internalType":"address"},{"type":"uint256","name":"_timelock","internalType":"uint256"},{"type":"address","name":"_authority","internalType":"address"}]},{"type":"event","name":"AuthorityUpdated","inputs":[{"type":"address","name":"authority","internalType":"contract IOlympusAuthority","indexed":true}],"anonymous":false},{"type":"event","name":"Defunded","inputs":[{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Funded","inputs":[{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Migrated","inputs":[{"type":"address","name":"staking","internalType":"address","indexed":false},{"type":"address","name":"treasury","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"TimelockStarted","inputs":[{"type":"uint256","name":"block","internalType":"uint256","indexed":false},{"type":"uint256","name":"end","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IOlympusAuthority"}],"name":"authority","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"bridgeBack","inputs":[{"type":"uint256","name":"_amount","internalType":"uint256"},{"type":"uint8","name":"_to","internalType":"enum OlympusTokenMigrator.TYPE"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"defund","inputs":[{"type":"address","name":"reserve","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IgOHM"}],"name":"gOHM","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"halt","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"migrate","inputs":[{"type":"uint256","name":"_amount","internalType":"uint256"},{"type":"uint8","name":"_from","internalType":"enum OlympusTokenMigrator.TYPE"},{"type":"uint8","name":"_to","internalType":"enum OlympusTokenMigrator.TYPE"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"migrateAll","inputs":[{"type":"uint8","name":"_to","internalType":"enum OlympusTokenMigrator.TYPE"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"migrateContracts","inputs":[{"type":"address","name":"_newTreasury","internalType":"address"},{"type":"address","name":"_newStaking","internalType":"address"},{"type":"address","name":"_newOHM","internalType":"address"},{"type":"address","name":"_newsOHM","internalType":"address"},{"type":"address","name":"_reserve","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"migrateLP","inputs":[{"type":"address","name":"pair","internalType":"address"},{"type":"bool","name":"sushi","internalType":"bool"},{"type":"address","name":"token","internalType":"address"},{"type":"uint256","name":"_minA","internalType":"uint256"},{"type":"uint256","name":"_minB","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"migrateToken","inputs":[{"type":"address","name":"token","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IERC20"}],"name":"newOHM","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IStaking"}],"name":"newStaking","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract ITreasury"}],"name":"newTreasury","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"ohmMigrated","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IERC20"}],"name":"oldOHM","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IStakingV1"}],"name":"oldStaking","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"oldSupply","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract ITreasuryV1"}],"name":"oldTreasury","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IsOHM"}],"name":"oldsOHM","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IwsOHM"}],"name":"oldwsOHM","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setAuthority","inputs":[{"type":"address","name":"_newAuthority","internalType":"contract IOlympusAuthority"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setgOHM","inputs":[{"type":"address","name":"_gOHM","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"shutdown","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"startTimelock","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IUniswapV2Router"}],"name":"sushiRouter","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"timelockEnd","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"timelockLength","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IUniswapV2Router"}],"name":"uniRouter","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"withdrawToken","inputs":[{"type":"address","name":"tokenAddress","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"},{"type":"address","name":"recipient","internalType":"address"}]}]
              

Contract Creation Code

0x6101806040526040518060400160405280600c81526020017f554e415554484f52495a45440000000000000000000000000000000000000000815250600090805190602001906200005292919062000786565b503480156200006057600080fd5b50604051620061b9380380620061b983398181016040526101208110156200008757600080fd5b810190808051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190805190602001909291905050508080600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167f2f658b440c35314f52658ea8a740e05b284cdc84dc9ae01e891f21b8933e7cad60405160405180910390a250600073ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff16141562000212576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f5a65726f20616464726573733a204f484d00000000000000000000000000000081525060200191505060405180910390fd5b8873ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b81525050600073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161415620002ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f5a65726f20616464726573733a20734f484d000000000000000000000000000081525060200191505060405180910390fd5b8773ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff1660601b81525050600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161415620003c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f5a65726f20616464726573733a2054726561737572790000000000000000000081525060200191505060405180910390fd5b8673ffffffffffffffffffffffffffffffffffffffff1660e08173ffffffffffffffffffffffffffffffffffffffff1660601b81525050600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161415620004a3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f5a65726f20616464726573733a205374616b696e67000000000000000000000081525060200191505060405180910390fd5b8573ffffffffffffffffffffffffffffffffffffffff166101008173ffffffffffffffffffffffffffffffffffffffff1660601b81525050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156200057f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f5a65726f20616464726573733a2077734f484d0000000000000000000000000081525060200191505060405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff1660601b81525050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156200065a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f5a65726f20616464726573733a2053757368690000000000000000000000000081525060200191505060405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff166101208173ffffffffffffffffffffffffffffffffffffffff1660601b81525050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141562000736576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f5a65726f20616464726573733a20556e6900000000000000000000000000000081525060200191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff166101408173ffffffffffffffffffffffffffffffffffffffff1660601b815250508161016081815250505050505050505050506200083c565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282620007be57600085556200080a565b82601f10620007d957805160ff19168380011785556200080a565b828001600101855582156200080a579182015b8281111562000809578251825591602001919060010190620007ec565b5b5090506200081991906200081d565b5090565b5b80821115620008385760008160009055506001016200081e565b5090565b60805160601c60a05160601c60c05160601c60e05160601c6101005160601c6101205160601c6101405160601c610160516158336200098660003980610d715280612225525080611cdc52806137e7525080611a9a52806137bf5250806118065280612fa75280613058525080612a4e528061323352806132e4528061366c52806137145280614e195280614ec35280614f6852806150495250806108f35280610b0b52806115595280611a705280611e165280611fc55280612d355280612d715280613edc52806141fa5280614247525080610ab9528061149752806117e25280611f5752806129105280612ea75280612f6b5280613e1652806141a3525080610a485280610b6c52806113d55280611ee8528061279a5280612a7252806130f052806131f752806138d85280613fa25280614082528061414c528061432b52506158336000f3fe608060405234801561001057600080fd5b50600436106101cf5760003560e01c80637a9e5e4b11610104578063d5f42869116100a2578063ec78f90b11610071578063ec78f90b146107a3578063ed44527b146107d4578063f96a600614610808578063fc0e74d11461084c576101cf565b8063d5f4286914610687578063d6fa3760146106bb578063dfd9e685146106ff578063e7a1705c14610783576101cf565b8063b29c7444116100de578063b29c744414610551578063b71a6df31461055b578063bf7e214f1461061f578063cf0ef51614610653576101cf565b80637a9e5e4b1461049e578063a0e47bf6146104e2578063abacbb2f14610516576101cf565b80634579b8b4116101715780635ed7ca5b1161014b5780635ed7ca5b1461040e57806360ca094e14610418578063694d66351461044c5780636d13582c1461046a576101cf565b80634579b8b4146103725780634ed3b35f146103a65780634edf8980146103da576101cf565b8063219a1f81116101ad578063219a1f811461026e578063245c0e991461028c5780633ccdbb28146102d05780633fc85b341461033e576101cf565b80630465f072146101d4578063058508441461021c5780630cd305851461023a575b600080fd5b61021a600480360360608110156101ea57600080fd5b8101908080359060200190929190803560ff169060200190929190803560ff16906020019092919050505061086c565b005b610224610d43565b6040518082815260200191505060405180910390f35b610242610d49565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610276610d6f565b6040518082815260200191505060405180910390f35b6102ce600480360360208110156102a257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610d93565b005b61033c600480360360608110156102e657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506110d5565b005b610346611794565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61037a6117ba565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6103ae6117e0565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6103e2611804565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610416611828565b005b610420611a6e565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610454611a92565b6040518082815260200191505060405180910390f35b610472611a98565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6104e0600480360360208110156104b457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611abc565b005b6104ea611cda565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61054f6004803603604081101561052c57600080fd5b8101908080359060200190929190803560ff169060200190929190505050611cfe565b005b610559612011565b005b61061d600480360360a081101561057157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061229c565b005b610627612a26565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61065b612a4c565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61068f612a70565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6106fd600480360360208110156106d157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612a94565b005b610781600480360360a081101561071557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001909291905050506134b5565b005b61078b613d7b565b60405180821515815260200191505060405180910390f35b6107d2600480360360208110156107b957600080fd5b81019080803560ff169060200190929190505050613d8e565b005b6107dc614503565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61084a6004803603602081101561081e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050614529565b005b6108546146ce565b60405180821515815260200191505060405180910390f35b600560159054906101000a900460ff16156108ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260098152602001807f5368757420646f776e000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166373f79c04856040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561096257600080fd5b505afa158015610976573d6000803e3d6000fd5b505050506040513d602081101561098c57600080fd5b81019080805190602001909291905050509050600060028111156109ac57fe5b8360028111156109b857fe5b1415610a9257600560149054906101000a900460ff16610a40576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4f6e6c79207374616b656420756e74696c206d6967726174696f6e000000000081525060200191505060405180910390fd5b610a8d3330867f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166146e1909392919063ffffffff16565b610b55565b60016002811115610a9f57fe5b836002811115610aab57fe5b1415610b0357610afe3330867f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166146e1909392919063ffffffff16565b610b54565b610b503330867f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166146e1909392919063ffffffff16565b8390505b5b600560149054906101000a900460ff1615610c91577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610bd057600080fd5b505afa158015610be4573d6000803e3d6000fd5b505050506040513d6020811015610bfa57600080fd5b81019080805190602001909291905050506007541015610c82576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f4f484d7631206d696e746564000000000000000000000000000000000000000081525060200191505060405180910390fd5b610c8c8183614902565b610d3d565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1933836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b158015610d2457600080fd5b505af1158015610d38573d6000803e3d6000fd5b505050505b50505050565b60075481565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b7f000000000000000000000000000000000000000000000000000000000000000081565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b158015610dfb57600080fd5b505afa158015610e0f573d6000803e3d6000fd5b505050506040513d6020811015610e2557600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614600090610f29576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818154600181600116156101000203166002900481526020019150805460018160011615610100020316600290048015610f1a5780601f10610eef57610100808354040283529160200191610f1a565b820191906000526020600020905b815481529060010190602001808311610efd57829003601f168201915b50509250505060405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610fee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600b8152602001807f416c72656164792073657400000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611091576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f5a65726f20616464726573733a20674f484d000000000000000000000000000081525060200191505060405180910390fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b15801561113d57600080fd5b505afa158015611151573d6000803e3d6000fd5b505050506040513d602081101561116757600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161460009061126b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382528381815460018160011615610100020316600290048152602001915080546001816001161561010002031660029004801561125c5780601f106112315761010080835404028352916020019161125c565b820191906000526020600020905b81548152906001019060200180831161123f57829003601f168201915b50509250505060405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561130f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f546f6b656e20616464726573732063616e6e6f7420626520307830000000000081525060200191505060405180910390fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156113d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f43616e6e6f742077697468647261773a20674f484d000000000000000000000081525060200191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611495576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f43616e6e6f742077697468647261773a206f6c642d4f484d000000000000000081525060200191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611557576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f43616e6e6f742077697468647261773a206f6c642d734f484d0000000000000081525060200191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611619576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f43616e6e6f742077697468647261773a206f6c642d77734f484d00000000000081525060200191505060405180910390fd5b60008211611672576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806157d96025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156116ab573390505b600083905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561171957600080fd5b505afa15801561172d573d6000803e3d6000fd5b505050506040513d602081101561174357600080fd5b8101908080519060200190929190505050905080841115611762578093505b61178d83858473ffffffffffffffffffffffffffffffffffffffff16614b6f9092919063ffffffff16565b5050505050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630505c8c96040518163ffffffff1660e01b815260040160206040518083038186803b15801561189057600080fd5b505afa1580156118a4573d6000803e3d6000fd5b505050506040513d60208110156118ba57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146000906119be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252838181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156119af5780601f10611984576101008083540402835291602001916119af565b820191906000526020600020905b81548152906001019060200180831161199257829003601f168201915b50509250505060405180910390fd5b50600560149054906101000a900460ff1615611a42576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f4d6967726174696f6e20686173206f636375727265640000000000000000000081525060200191505060405180910390fd5b600560159054906101000a900460ff1615600560156101000a81548160ff021916908315150217905550565b7f000000000000000000000000000000000000000000000000000000000000000081565b60065481565b7f000000000000000000000000000000000000000000000000000000000000000081565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b158015611b2457600080fd5b505afa158015611b38573d6000803e3d6000fd5b505050506040513d6020811015611b4e57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614600090611c52576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818154600181600116156101000203166002900481526020019150805460018160011615610100020316600290048015611c435780601f10611c1857610100808354040283529160200191611c43565b820191906000526020600020905b815481529060010190602001808311611c2657829003601f168201915b50509250505060405180910390fd5b5080600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167f2f658b440c35314f52658ea8a740e05b284cdc84dc9ae01e891f21b8933e7cad60405160405180910390a250565b7f000000000000000000000000000000000000000000000000000000000000000081565b600560149054906101000a900460ff16611dc257600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639dc29fac33846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b158015611da557600080fd5b505af1158015611db9573d6000803e3d6000fd5b50505050611e12565b611e11333084600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166146e1909392919063ffffffff16565b5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663554c85a3846040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015611e8557600080fd5b505afa158015611e99573d6000803e3d6000fd5b505050506040513d6020811015611eaf57600080fd5b8101908080519060200190929190505050905060006002811115611ecf57fe5b826002811115611edb57fe5b1415611f3157611f2c33827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16614b6f9092919063ffffffff16565b61200c565b60016002811115611f3e57fe5b826002811115611f4a57fe5b1415611fa057611f9b33827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16614b6f9092919063ffffffff16565b61200b565b600280811115611fac57fe5b826002811115611fb857fe5b141561200a5761200933847f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16614b6f9092919063ffffffff16565b5b5b5b505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b15801561207957600080fd5b505afa15801561208d573d6000803e3d6000fd5b505050506040513d60208110156120a357600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146000906121a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252838181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156121985780601f1061216d57610100808354040283529160200191612198565b820191906000526020600020905b81548152906001019060200180831161217b57829003601f168201915b50509250505060405180910390fd5b50600060065414612220576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f54696d656c6f636b20736574000000000000000000000000000000000000000081525060200191505060405180910390fd5b6122537f000000000000000000000000000000000000000000000000000000000000000043614d7190919063ffffffff16565b6006819055507f1f1c77590fcb154ccfac3f34adef3adfd45fa19cd5bd058297a1d6137d0229c043600654604051808381526020018281526020019250505060405180910390a1565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b15801561230457600080fd5b505afa158015612318573d6000803e3d6000fd5b505050506040513d602081101561232e57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614600090612432576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252838181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156124235780601f106123f857610100808354040283529160200191612423565b820191906000526020600020905b81548152906001019060200180831161240657829003601f168201915b50509250505060405180910390fd5b50600560149054906101000a900460ff16156124b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f416c7265616479206d696772617465640000000000000000000000000000000081525060200191505060405180910390fd5b6001600560146101000a81548160ff0219169083151502179055506000600560156101000a81548160ff021916908315150217905550600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141561258f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f5a65726f20616464726573733a2054726561737572790000000000000000000081525060200191505060405180910390fd5b84600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612673576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f5a65726f20616464726573733a205374616b696e67000000000000000000000081525060200191505060405180910390fd5b83600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612757576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f5a65726f20616464726573733a204f484d00000000000000000000000000000081525060200191505060405180910390fd5b82600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156127fe57600080fd5b505afa158015612812573d6000803e3d6000fd5b505050506040513d602081101561282857600080fd5b8101908080519060200190929190505050600781905550600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631068361f85846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff16815260200192505050600060405180830381600087803b1580156128e857600080fd5b505af11580156128fc573d6000803e3d6000fd5b5050505061290b816001614df9565b6129b47f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16639358928b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561297457600080fd5b505afa158015612988573d6000803e3d6000fd5b505050506040513d602081101561299e57600080fd5b8101908080519060200190929190505050615274565b7f844985ce6880ca51e25a6d4ecc8af37a5de880279f2081af96d0e875c42b70828486604051808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a15050505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b158015612afc57600080fd5b505afa158015612b10573d6000803e3d6000fd5b505050506040513d6020811015612b2657600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614600090612c2a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818154600181600116156101000203166002900481526020019150805460018160011615610100020316600290048015612c1b5780601f10612bf057610100808354040283529160200191612c1b565b820191906000526020600020905b815481529060010190602001808311612bfe57829003601f168201915b50509250505060405180910390fd5b50600560149054906101000a900460ff16612cad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f4d6967726174696f6e20686173206e6f7420626567756e00000000000000000081525060200191505060405180910390fd5b43600654108015612cc15750600060065414155b612d33576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f54696d656c6f636b206e6f7420636f6d706c657465000000000000000000000081525060200191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663de0e9a3e7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612df657600080fd5b505afa158015612e0a573d6000803e3d6000fd5b505050506040513d6020811015612e2057600080fd5b81019080805190602001909291905050506040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b158015612e6757600080fd5b505af1158015612e7b573d6000803e3d6000fd5b505050506040513d6020811015612e9157600080fd5b81019080805190602001909291905050505060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612f2c57600080fd5b505afa158015612f40573d6000803e3d6000fd5b505050506040513d6020811015612f5657600080fd5b810190808051906020019092919050505090507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663095ea7b37f0000000000000000000000000000000000000000000000000000000000000000836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561301a57600080fd5b505af115801561302e573d6000803e3d6000fd5b505050506040513d602081101561304457600080fd5b8101908080519060200190929190505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16639ebea88c8260006040518363ffffffff1660e01b815260040180838152602001821515815260200192505050600060405180830381600087803b1580156130d457600080fd5b505af11580156130e8573d6000803e3d6000fd5b5050505060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561317557600080fd5b505afa158015613189573d6000803e3d6000fd5b505050506040513d602081101561319f57600080fd5b810190808051906020019092919050505090506007548111156131c95760006007819055506131da565b806007600082825403925050819055505b60006131f3633b9aca008361552f90919063ffffffff16565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663095ea7b37f0000000000000000000000000000000000000000000000000000000000000000836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156132a657600080fd5b505af11580156132ba573d6000803e3d6000fd5b505050506040513d60208110156132d057600080fd5b8101908080519060200190929190505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1662f714ce82866040518363ffffffff1660e01b8152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200192505050600060405180830381600087803b15801561337257600080fd5b505af1158015613386573d6000803e3d6000fd5b50505050613478600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561341757600080fd5b505afa15801561342b573d6000803e3d6000fd5b505050506040513d602081101561344157600080fd5b81019080805190602001909291905050508673ffffffffffffffffffffffffffffffffffffffff16614b6f9092919063ffffffff16565b7faf5e14f4cc37b04db239269739bd935c4ed55328b691792af028e5570dfe61fa826040518082815260200191505060405180910390a150505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b15801561351d57600080fd5b505afa158015613531573d6000803e3d6000fd5b505050506040513d602081101561354757600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161460009061364b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382528381815460018160011615610100020316600290048152602001915080546001816001161561010002031660029004801561363c5780601f106136115761010080835404028352916020019161363c565b820191906000526020600020905b81548152906001019060200180831161361f57829003601f168201915b50509250505060405180910390fd5b5060008573ffffffffffffffffffffffffffffffffffffffff166370a082317f00000000000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156136d557600080fd5b505afa1580156136e9573d6000803e3d6000fd5b505050506040513d60208110156136ff57600080fd5b810190808051906020019092919050505090507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16630b0eee3087836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b1580156137a357600080fd5b505af11580156137b7573d6000803e3d6000fd5b5050505060007f0000000000000000000000000000000000000000000000000000000000000000905085613809577f000000000000000000000000000000000000000000000000000000000000000090505b8673ffffffffffffffffffffffffffffffffffffffff1663095ea7b382846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561387a57600080fd5b505af115801561388e573d6000803e3d6000fd5b505050506040513d60208110156138a457600080fd5b8101908080519060200190929190505050506000808273ffffffffffffffffffffffffffffffffffffffff1663baa2abde887f0000000000000000000000000000000000000000000000000000000000000000878a8a30426040518863ffffffff1660e01b8152600401808873ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1681526020018681526020018581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019750505050505050506040805180830381600087803b15801561399d57600080fd5b505af11580156139b1573d6000803e3d6000fd5b505050506040513d60408110156139c757600080fd5b81019080805190602001909291908051906020019092919050505091509150600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1930836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b158015613a7957600080fd5b505af1158015613a8d573d6000803e3d6000fd5b505050508673ffffffffffffffffffffffffffffffffffffffff1663095ea7b384846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015613b0257600080fd5b505af1158015613b16573d6000803e3d6000fd5b505050506040513d6020811015613b2c57600080fd5b810190808051906020019092919050505050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b384836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015613bd157600080fd5b505af1158015613be5573d6000803e3d6000fd5b505050506040513d6020811015613bfb57600080fd5b8101908080519060200190929190505050508273ffffffffffffffffffffffffffffffffffffffff1663e8e3370088600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685858787600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518963ffffffff1660e01b8152600401808973ffffffffffffffffffffffffffffffffffffffff1681526020018873ffffffffffffffffffffffffffffffffffffffff1681526020018781526020018681526020018581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200198505050505050505050606060405180830381600087803b158015613d1e57600080fd5b505af1158015613d32573d6000803e3d6000fd5b505050506040513d6060811015613d4857600080fd5b81019080805190602001909291908051906020019092919080519060200190929190505050505050505050505050505050565b600560149054906101000a900460ff1681565b600560159054906101000a900460ff1615613e11576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260098152602001807f5368757420646f776e000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015613e9b57600080fd5b505afa158015613eaf573d6000803e3d6000fd5b505050506040513d6020811015613ec557600080fd5b8101908080519060200190929190505050905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015613f6157600080fd5b505afa158015613f75573d6000803e3d6000fd5b505050506040513d6020811015613f8b57600080fd5b8101908080519060200190929190505050905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561402757600080fd5b505afa15801561403b573d6000803e3d6000fd5b505050506040513d602081101561405157600080fd5b810190808051906020019092919050505011801561407b5750600560149054906101000a900460ff165b15614192577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561410757600080fd5b505afa15801561411b573d6000803e3d6000fd5b505050506040513d602081101561413157600080fd5b810190808051906020019092919050505092506141913330857f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166146e1909392919063ffffffff16565b5b60008211156141e9576141e83330847f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166146e1909392919063ffffffff16565b5b60008111156142405761423f3330837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166146e1909392919063ffffffff16565b5b60006143127f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166373f79c046142948688614d7190919063ffffffff16565b6040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156142c857600080fd5b505afa1580156142dc573d6000803e3d6000fd5b505050506040513d60208110156142f257600080fd5b810190808051906020019092919050505083614d7190919063ffffffff16565b9050600560149054906101000a900460ff1615614450577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561438f57600080fd5b505afa1580156143a3573d6000803e3d6000fd5b505050506040513d60208110156143b957600080fd5b81019080805190602001909291905050506007541015614441576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f4f484d7631206d696e746564000000000000000000000000000000000000000081525060200191505060405180910390fd5b61444b8186614902565b6144fc565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1933836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b1580156144e357600080fd5b505af11580156144f7573d6000803e3d6000fd5b505050505b5050505050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b15801561459157600080fd5b505afa1580156145a5573d6000803e3d6000fd5b505050506040513d60208110156145bb57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146000906146bf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252838181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156146b05780601f10614685576101008083540402835291602001916146b0565b820191906000526020600020905b81548152906001019060200180831161469357829003601f168201915b50509250505060405180910390fd5b506146cb816000614df9565b50565b600560159054906101000a900460ff1681565b600060608573ffffffffffffffffffffffffffffffffffffffff166323b872dd60e01b868686604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040518082805190602001908083835b602083106147e157805182526020820191506020810190506020830392506147be565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114614843576040519150601f19603f3d011682016040523d82523d6000602084013e614848565b606091505b50915091508180156148885750600081511480614887575080806020019051602081101561487557600080fd5b81019080805190602001909291905050505b5b6148fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f5452414e534645525f46524f4d5f4641494c454400000000000000000000000081525060200191505060405180910390fd5b505050505050565b60028081111561490e57fe5b81600281111561491a57fe5b14156149725761496d3383600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16614b6f9092919063ffffffff16565b614b6b565b6001600281111561497f57fe5b81600281111561498b57fe5b1415614a6557600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166339f4769333846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015614a2457600080fd5b505af1158015614a38573d6000803e3d6000fd5b505050506040513d6020811015614a4e57600080fd5b810190808051906020019092919050505050614b6a565b60006002811115614a7257fe5b816002811115614a7e57fe5b1415614b6957600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663990966d533846000806040518563ffffffff1660e01b8152600401808573ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183151581526020018215158152602001945050505050602060405180830381600087803b158015614b2c57600080fd5b505af1158015614b40573d6000803e3d6000fd5b505050506040513d6020811015614b5657600080fd5b8101908080519060200190929190505050505b5b5b5050565b600060608473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb60e01b8585604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040518082805190602001908083835b60208310614c515780518252602082019150602081019050602083039250614c2e565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114614cb3576040519150601f19603f3d011682016040523d82523d6000602084013e614cb8565b606091505b5091509150818015614cf85750600081511480614cf75750808060200190516020811015614ce557600080fd5b81019080805190602001909291905050505b5b614d6a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f5452414e534645525f4641494c4544000000000000000000000000000000000081525060200191505060405180910390fd5b5050505050565b600080828401905083811015614def576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b60008273ffffffffffffffffffffffffffffffffffffffff166370a082317f00000000000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015614e8257600080fd5b505afa158015614e96573d6000803e3d6000fd5b505050506040513d6020811015614eac57600080fd5b8101908080519060200190929190505050905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16630c3513a86040518163ffffffff1660e01b815260040160206040518083038186803b158015614f2757600080fd5b505afa158015614f3b573d6000803e3d6000fd5b505050506040513d6020811015614f5157600080fd5b8101908080519060200190929190505050905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16631eec5a9a86856040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060206040518083038186803b158015614ff557600080fd5b505afa158015615009573d6000803e3d6000fd5b505050506040513d602081101561501f57600080fd5b810190808051906020019092919050505090508181111561504757819050633b9aca00820292505b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16630b0eee3086856040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b1580156150d857600080fd5b505af11580156150ec573d6000803e3d6000fd5b50505050831561521f57615143600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16848773ffffffffffffffffffffffffffffffffffffffff166155b59092919063ffffffff16565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bc157ac18487846040518463ffffffff1660e01b8152600401808481526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b1580156151de57600080fd5b505af11580156151f2573d6000803e3d6000fd5b505050506040513d602081101561520857600080fd5b81019080805190602001909291905050505061526d565b61526c600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16848773ffffffffffffffffffffffffffffffffffffffff16614b6f9092919063ffffffff16565b5b5050505050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1930836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b15801561530757600080fd5b505af115801561531b573d6000803e3d6000fd5b50505050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156153d457600080fd5b505af11580156153e8573d6000803e3d6000fd5b505050506040513d60208110156153fe57600080fd5b810190808051906020019092919050505050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d866c9d83083600060016040518563ffffffff1660e01b8152600401808573ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183151581526020018215158152602001945050505050602060405180830381600087803b1580156154b957600080fd5b505af11580156154cd573d6000803e3d6000fd5b505050506040513d60208110156154e357600080fd5b8101908080519060200190929190505050507fc4c14883ae9fd8e26d5d59e3485ed29fd126d781d7e498a4ca5c54c8268e4936816040518082815260200191505060405180910390a150565b60008083141561554257600090506155af565b600082840290508284828161555357fe5b04146155aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806157b86021913960400191505060405180910390fd5b809150505b92915050565b600060608473ffffffffffffffffffffffffffffffffffffffff1663095ea7b360e01b8585604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040518082805190602001908083835b602083106156975780518252602082019150602081019050602083039250615674565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146156f9576040519150601f19603f3d011682016040523d82523d6000602084013e6156fe565b606091505b509150915081801561573e575060008151148061573d575080806020019051602081101561572b57600080fd5b81019080805190602001909291905050505b5b6157b0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f415050524f56455f4641494c454400000000000000000000000000000000000081525060200191505060405180910390fd5b505050505056fe536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7757697468647261772076616c7565206d7573742062652067726561746572207468616e2030a2646970667358221220b09b2af2a491d817278550a9f835a52946dfb113bad0ba1275e3732207f35e6d64736f6c63430007050033000000000000000000000000383518188c0c6d7730d91b2c03a03c837814a89900000000000000000000000004f2694c8fcee23e8fd0dfea1d4f5bb8c352111f00000000000000000000000031f8cc382c9898b273eff4e0b7626a6987c846e8000000000000000000000000fd31c7d00ca47653c6ce64af53c1571f9c36566a000000000000000000000000ca76543cf381ebbb277be79574059e32108e3e65000000000000000000000000d9e1ce17f2641f24ae83637ab66a2cca9c378b9f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d0000000000000000000000000000000000000000000000000000000000001b580000000000000000000000001c21f8ea7e39e2ba00bc12d2968d63f4acb38b7a

Deployed ByteCode

0x608060405234801561001057600080fd5b50600436106101cf5760003560e01c80637a9e5e4b11610104578063d5f42869116100a2578063ec78f90b11610071578063ec78f90b146107a3578063ed44527b146107d4578063f96a600614610808578063fc0e74d11461084c576101cf565b8063d5f4286914610687578063d6fa3760146106bb578063dfd9e685146106ff578063e7a1705c14610783576101cf565b8063b29c7444116100de578063b29c744414610551578063b71a6df31461055b578063bf7e214f1461061f578063cf0ef51614610653576101cf565b80637a9e5e4b1461049e578063a0e47bf6146104e2578063abacbb2f14610516576101cf565b80634579b8b4116101715780635ed7ca5b1161014b5780635ed7ca5b1461040e57806360ca094e14610418578063694d66351461044c5780636d13582c1461046a576101cf565b80634579b8b4146103725780634ed3b35f146103a65780634edf8980146103da576101cf565b8063219a1f81116101ad578063219a1f811461026e578063245c0e991461028c5780633ccdbb28146102d05780633fc85b341461033e576101cf565b80630465f072146101d4578063058508441461021c5780630cd305851461023a575b600080fd5b61021a600480360360608110156101ea57600080fd5b8101908080359060200190929190803560ff169060200190929190803560ff16906020019092919050505061086c565b005b610224610d43565b6040518082815260200191505060405180910390f35b610242610d49565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610276610d6f565b6040518082815260200191505060405180910390f35b6102ce600480360360208110156102a257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610d93565b005b61033c600480360360608110156102e657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506110d5565b005b610346611794565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61037a6117ba565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6103ae6117e0565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6103e2611804565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610416611828565b005b610420611a6e565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610454611a92565b6040518082815260200191505060405180910390f35b610472611a98565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6104e0600480360360208110156104b457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611abc565b005b6104ea611cda565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61054f6004803603604081101561052c57600080fd5b8101908080359060200190929190803560ff169060200190929190505050611cfe565b005b610559612011565b005b61061d600480360360a081101561057157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061229c565b005b610627612a26565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61065b612a4c565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61068f612a70565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6106fd600480360360208110156106d157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612a94565b005b610781600480360360a081101561071557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001909291905050506134b5565b005b61078b613d7b565b60405180821515815260200191505060405180910390f35b6107d2600480360360208110156107b957600080fd5b81019080803560ff169060200190929190505050613d8e565b005b6107dc614503565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61084a6004803603602081101561081e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050614529565b005b6108546146ce565b60405180821515815260200191505060405180910390f35b600560159054906101000a900460ff16156108ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260098152602001807f5368757420646f776e000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60007f000000000000000000000000ca76543cf381ebbb277be79574059e32108e3e6573ffffffffffffffffffffffffffffffffffffffff166373f79c04856040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561096257600080fd5b505afa158015610976573d6000803e3d6000fd5b505050506040513d602081101561098c57600080fd5b81019080805190602001909291905050509050600060028111156109ac57fe5b8360028111156109b857fe5b1415610a9257600560149054906101000a900460ff16610a40576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4f6e6c79207374616b656420756e74696c206d6967726174696f6e000000000081525060200191505060405180910390fd5b610a8d3330867f000000000000000000000000383518188c0c6d7730d91b2c03a03c837814a89973ffffffffffffffffffffffffffffffffffffffff166146e1909392919063ffffffff16565b610b55565b60016002811115610a9f57fe5b836002811115610aab57fe5b1415610b0357610afe3330867f00000000000000000000000004f2694c8fcee23e8fd0dfea1d4f5bb8c352111f73ffffffffffffffffffffffffffffffffffffffff166146e1909392919063ffffffff16565b610b54565b610b503330867f000000000000000000000000ca76543cf381ebbb277be79574059e32108e3e6573ffffffffffffffffffffffffffffffffffffffff166146e1909392919063ffffffff16565b8390505b5b600560149054906101000a900460ff1615610c91577f000000000000000000000000383518188c0c6d7730d91b2c03a03c837814a89973ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610bd057600080fd5b505afa158015610be4573d6000803e3d6000fd5b505050506040513d6020811015610bfa57600080fd5b81019080805190602001909291905050506007541015610c82576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f4f484d7631206d696e746564000000000000000000000000000000000000000081525060200191505060405180910390fd5b610c8c8183614902565b610d3d565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1933836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b158015610d2457600080fd5b505af1158015610d38573d6000803e3d6000fd5b505050505b50505050565b60075481565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b7f0000000000000000000000000000000000000000000000000000000000001b5881565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b158015610dfb57600080fd5b505afa158015610e0f573d6000803e3d6000fd5b505050506040513d6020811015610e2557600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614600090610f29576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818154600181600116156101000203166002900481526020019150805460018160011615610100020316600290048015610f1a5780601f10610eef57610100808354040283529160200191610f1a565b820191906000526020600020905b815481529060010190602001808311610efd57829003601f168201915b50509250505060405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610fee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600b8152602001807f416c72656164792073657400000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611091576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f5a65726f20616464726573733a20674f484d000000000000000000000000000081525060200191505060405180910390fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b15801561113d57600080fd5b505afa158015611151573d6000803e3d6000fd5b505050506040513d602081101561116757600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161460009061126b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382528381815460018160011615610100020316600290048152602001915080546001816001161561010002031660029004801561125c5780601f106112315761010080835404028352916020019161125c565b820191906000526020600020905b81548152906001019060200180831161123f57829003601f168201915b50509250505060405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561130f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f546f6b656e20616464726573732063616e6e6f7420626520307830000000000081525060200191505060405180910390fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156113d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f43616e6e6f742077697468647261773a20674f484d000000000000000000000081525060200191505060405180910390fd5b7f000000000000000000000000383518188c0c6d7730d91b2c03a03c837814a89973ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611495576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f43616e6e6f742077697468647261773a206f6c642d4f484d000000000000000081525060200191505060405180910390fd5b7f00000000000000000000000004f2694c8fcee23e8fd0dfea1d4f5bb8c352111f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611557576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f43616e6e6f742077697468647261773a206f6c642d734f484d0000000000000081525060200191505060405180910390fd5b7f000000000000000000000000ca76543cf381ebbb277be79574059e32108e3e6573ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611619576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f43616e6e6f742077697468647261773a206f6c642d77734f484d00000000000081525060200191505060405180910390fd5b60008211611672576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806157d96025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156116ab573390505b600083905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561171957600080fd5b505afa15801561172d573d6000803e3d6000fd5b505050506040513d602081101561174357600080fd5b8101908080519060200190929190505050905080841115611762578093505b61178d83858473ffffffffffffffffffffffffffffffffffffffff16614b6f9092919063ffffffff16565b5050505050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b7f00000000000000000000000004f2694c8fcee23e8fd0dfea1d4f5bb8c352111f81565b7f000000000000000000000000fd31c7d00ca47653c6ce64af53c1571f9c36566a81565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630505c8c96040518163ffffffff1660e01b815260040160206040518083038186803b15801561189057600080fd5b505afa1580156118a4573d6000803e3d6000fd5b505050506040513d60208110156118ba57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146000906119be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252838181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156119af5780601f10611984576101008083540402835291602001916119af565b820191906000526020600020905b81548152906001019060200180831161199257829003601f168201915b50509250505060405180910390fd5b50600560149054906101000a900460ff1615611a42576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f4d6967726174696f6e20686173206f636375727265640000000000000000000081525060200191505060405180910390fd5b600560159054906101000a900460ff1615600560156101000a81548160ff021916908315150217905550565b7f000000000000000000000000ca76543cf381ebbb277be79574059e32108e3e6581565b60065481565b7f000000000000000000000000d9e1ce17f2641f24ae83637ab66a2cca9c378b9f81565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b158015611b2457600080fd5b505afa158015611b38573d6000803e3d6000fd5b505050506040513d6020811015611b4e57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614600090611c52576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818154600181600116156101000203166002900481526020019150805460018160011615610100020316600290048015611c435780601f10611c1857610100808354040283529160200191611c43565b820191906000526020600020905b815481529060010190602001808311611c2657829003601f168201915b50509250505060405180910390fd5b5080600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167f2f658b440c35314f52658ea8a740e05b284cdc84dc9ae01e891f21b8933e7cad60405160405180910390a250565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b600560149054906101000a900460ff16611dc257600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639dc29fac33846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b158015611da557600080fd5b505af1158015611db9573d6000803e3d6000fd5b50505050611e12565b611e11333084600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166146e1909392919063ffffffff16565b5b60007f000000000000000000000000ca76543cf381ebbb277be79574059e32108e3e6573ffffffffffffffffffffffffffffffffffffffff1663554c85a3846040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015611e8557600080fd5b505afa158015611e99573d6000803e3d6000fd5b505050506040513d6020811015611eaf57600080fd5b8101908080519060200190929190505050905060006002811115611ecf57fe5b826002811115611edb57fe5b1415611f3157611f2c33827f000000000000000000000000383518188c0c6d7730d91b2c03a03c837814a89973ffffffffffffffffffffffffffffffffffffffff16614b6f9092919063ffffffff16565b61200c565b60016002811115611f3e57fe5b826002811115611f4a57fe5b1415611fa057611f9b33827f00000000000000000000000004f2694c8fcee23e8fd0dfea1d4f5bb8c352111f73ffffffffffffffffffffffffffffffffffffffff16614b6f9092919063ffffffff16565b61200b565b600280811115611fac57fe5b826002811115611fb857fe5b141561200a5761200933847f000000000000000000000000ca76543cf381ebbb277be79574059e32108e3e6573ffffffffffffffffffffffffffffffffffffffff16614b6f9092919063ffffffff16565b5b5b5b505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b15801561207957600080fd5b505afa15801561208d573d6000803e3d6000fd5b505050506040513d60208110156120a357600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146000906121a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252838181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156121985780601f1061216d57610100808354040283529160200191612198565b820191906000526020600020905b81548152906001019060200180831161217b57829003601f168201915b50509250505060405180910390fd5b50600060065414612220576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f54696d656c6f636b20736574000000000000000000000000000000000000000081525060200191505060405180910390fd5b6122537f0000000000000000000000000000000000000000000000000000000000001b5843614d7190919063ffffffff16565b6006819055507f1f1c77590fcb154ccfac3f34adef3adfd45fa19cd5bd058297a1d6137d0229c043600654604051808381526020018281526020019250505060405180910390a1565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b15801561230457600080fd5b505afa158015612318573d6000803e3d6000fd5b505050506040513d602081101561232e57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614600090612432576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252838181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156124235780601f106123f857610100808354040283529160200191612423565b820191906000526020600020905b81548152906001019060200180831161240657829003601f168201915b50509250505060405180910390fd5b50600560149054906101000a900460ff16156124b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f416c7265616479206d696772617465640000000000000000000000000000000081525060200191505060405180910390fd5b6001600560146101000a81548160ff0219169083151502179055506000600560156101000a81548160ff021916908315150217905550600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141561258f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f5a65726f20616464726573733a2054726561737572790000000000000000000081525060200191505060405180910390fd5b84600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612673576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f5a65726f20616464726573733a205374616b696e67000000000000000000000081525060200191505060405180910390fd5b83600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612757576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f5a65726f20616464726573733a204f484d00000000000000000000000000000081525060200191505060405180910390fd5b82600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f000000000000000000000000383518188c0c6d7730d91b2c03a03c837814a89973ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156127fe57600080fd5b505afa158015612812573d6000803e3d6000fd5b505050506040513d602081101561282857600080fd5b8101908080519060200190929190505050600781905550600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631068361f85846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff16815260200192505050600060405180830381600087803b1580156128e857600080fd5b505af11580156128fc573d6000803e3d6000fd5b5050505061290b816001614df9565b6129b47f00000000000000000000000004f2694c8fcee23e8fd0dfea1d4f5bb8c352111f73ffffffffffffffffffffffffffffffffffffffff16639358928b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561297457600080fd5b505afa158015612988573d6000803e3d6000fd5b505050506040513d602081101561299e57600080fd5b8101908080519060200190929190505050615274565b7f844985ce6880ca51e25a6d4ecc8af37a5de880279f2081af96d0e875c42b70828486604051808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a15050505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b7f00000000000000000000000031f8cc382c9898b273eff4e0b7626a6987c846e881565b7f000000000000000000000000383518188c0c6d7730d91b2c03a03c837814a89981565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b158015612afc57600080fd5b505afa158015612b10573d6000803e3d6000fd5b505050506040513d6020811015612b2657600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614600090612c2a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818154600181600116156101000203166002900481526020019150805460018160011615610100020316600290048015612c1b5780601f10612bf057610100808354040283529160200191612c1b565b820191906000526020600020905b815481529060010190602001808311612bfe57829003601f168201915b50509250505060405180910390fd5b50600560149054906101000a900460ff16612cad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f4d6967726174696f6e20686173206e6f7420626567756e00000000000000000081525060200191505060405180910390fd5b43600654108015612cc15750600060065414155b612d33576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f54696d656c6f636b206e6f7420636f6d706c657465000000000000000000000081525060200191505060405180910390fd5b7f000000000000000000000000ca76543cf381ebbb277be79574059e32108e3e6573ffffffffffffffffffffffffffffffffffffffff1663de0e9a3e7f000000000000000000000000ca76543cf381ebbb277be79574059e32108e3e6573ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612df657600080fd5b505afa158015612e0a573d6000803e3d6000fd5b505050506040513d6020811015612e2057600080fd5b81019080805190602001909291905050506040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b158015612e6757600080fd5b505af1158015612e7b573d6000803e3d6000fd5b505050506040513d6020811015612e9157600080fd5b81019080805190602001909291905050505060007f00000000000000000000000004f2694c8fcee23e8fd0dfea1d4f5bb8c352111f73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612f2c57600080fd5b505afa158015612f40573d6000803e3d6000fd5b505050506040513d6020811015612f5657600080fd5b810190808051906020019092919050505090507f00000000000000000000000004f2694c8fcee23e8fd0dfea1d4f5bb8c352111f73ffffffffffffffffffffffffffffffffffffffff1663095ea7b37f000000000000000000000000fd31c7d00ca47653c6ce64af53c1571f9c36566a836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561301a57600080fd5b505af115801561302e573d6000803e3d6000fd5b505050506040513d602081101561304457600080fd5b8101908080519060200190929190505050507f000000000000000000000000fd31c7d00ca47653c6ce64af53c1571f9c36566a73ffffffffffffffffffffffffffffffffffffffff16639ebea88c8260006040518363ffffffff1660e01b815260040180838152602001821515815260200192505050600060405180830381600087803b1580156130d457600080fd5b505af11580156130e8573d6000803e3d6000fd5b5050505060007f000000000000000000000000383518188c0c6d7730d91b2c03a03c837814a89973ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561317557600080fd5b505afa158015613189573d6000803e3d6000fd5b505050506040513d602081101561319f57600080fd5b810190808051906020019092919050505090506007548111156131c95760006007819055506131da565b806007600082825403925050819055505b60006131f3633b9aca008361552f90919063ffffffff16565b90507f000000000000000000000000383518188c0c6d7730d91b2c03a03c837814a89973ffffffffffffffffffffffffffffffffffffffff1663095ea7b37f00000000000000000000000031f8cc382c9898b273eff4e0b7626a6987c846e8836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156132a657600080fd5b505af11580156132ba573d6000803e3d6000fd5b505050506040513d60208110156132d057600080fd5b8101908080519060200190929190505050507f00000000000000000000000031f8cc382c9898b273eff4e0b7626a6987c846e873ffffffffffffffffffffffffffffffffffffffff1662f714ce82866040518363ffffffff1660e01b8152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200192505050600060405180830381600087803b15801561337257600080fd5b505af1158015613386573d6000803e3d6000fd5b50505050613478600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561341757600080fd5b505afa15801561342b573d6000803e3d6000fd5b505050506040513d602081101561344157600080fd5b81019080805190602001909291905050508673ffffffffffffffffffffffffffffffffffffffff16614b6f9092919063ffffffff16565b7faf5e14f4cc37b04db239269739bd935c4ed55328b691792af028e5570dfe61fa826040518082815260200191505060405180910390a150505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b15801561351d57600080fd5b505afa158015613531573d6000803e3d6000fd5b505050506040513d602081101561354757600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161460009061364b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382528381815460018160011615610100020316600290048152602001915080546001816001161561010002031660029004801561363c5780601f106136115761010080835404028352916020019161363c565b820191906000526020600020905b81548152906001019060200180831161361f57829003601f168201915b50509250505060405180910390fd5b5060008573ffffffffffffffffffffffffffffffffffffffff166370a082317f00000000000000000000000031f8cc382c9898b273eff4e0b7626a6987c846e86040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156136d557600080fd5b505afa1580156136e9573d6000803e3d6000fd5b505050506040513d60208110156136ff57600080fd5b810190808051906020019092919050505090507f00000000000000000000000031f8cc382c9898b273eff4e0b7626a6987c846e873ffffffffffffffffffffffffffffffffffffffff16630b0eee3087836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b1580156137a357600080fd5b505af11580156137b7573d6000803e3d6000fd5b5050505060007f000000000000000000000000d9e1ce17f2641f24ae83637ab66a2cca9c378b9f905085613809577f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d90505b8673ffffffffffffffffffffffffffffffffffffffff1663095ea7b382846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561387a57600080fd5b505af115801561388e573d6000803e3d6000fd5b505050506040513d60208110156138a457600080fd5b8101908080519060200190929190505050506000808273ffffffffffffffffffffffffffffffffffffffff1663baa2abde887f000000000000000000000000383518188c0c6d7730d91b2c03a03c837814a899878a8a30426040518863ffffffff1660e01b8152600401808873ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1681526020018681526020018581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019750505050505050506040805180830381600087803b15801561399d57600080fd5b505af11580156139b1573d6000803e3d6000fd5b505050506040513d60408110156139c757600080fd5b81019080805190602001909291908051906020019092919050505091509150600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1930836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b158015613a7957600080fd5b505af1158015613a8d573d6000803e3d6000fd5b505050508673ffffffffffffffffffffffffffffffffffffffff1663095ea7b384846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015613b0257600080fd5b505af1158015613b16573d6000803e3d6000fd5b505050506040513d6020811015613b2c57600080fd5b810190808051906020019092919050505050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b384836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015613bd157600080fd5b505af1158015613be5573d6000803e3d6000fd5b505050506040513d6020811015613bfb57600080fd5b8101908080519060200190929190505050508273ffffffffffffffffffffffffffffffffffffffff1663e8e3370088600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685858787600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518963ffffffff1660e01b8152600401808973ffffffffffffffffffffffffffffffffffffffff1681526020018873ffffffffffffffffffffffffffffffffffffffff1681526020018781526020018681526020018581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200198505050505050505050606060405180830381600087803b158015613d1e57600080fd5b505af1158015613d32573d6000803e3d6000fd5b505050506040513d6060811015613d4857600080fd5b81019080805190602001909291908051906020019092919080519060200190929190505050505050505050505050505050565b600560149054906101000a900460ff1681565b600560159054906101000a900460ff1615613e11576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260098152602001807f5368757420646f776e000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6000807f00000000000000000000000004f2694c8fcee23e8fd0dfea1d4f5bb8c352111f73ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015613e9b57600080fd5b505afa158015613eaf573d6000803e3d6000fd5b505050506040513d6020811015613ec557600080fd5b8101908080519060200190929190505050905060007f000000000000000000000000ca76543cf381ebbb277be79574059e32108e3e6573ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015613f6157600080fd5b505afa158015613f75573d6000803e3d6000fd5b505050506040513d6020811015613f8b57600080fd5b8101908080519060200190929190505050905060007f000000000000000000000000383518188c0c6d7730d91b2c03a03c837814a89973ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561402757600080fd5b505afa15801561403b573d6000803e3d6000fd5b505050506040513d602081101561405157600080fd5b810190808051906020019092919050505011801561407b5750600560149054906101000a900460ff165b15614192577f000000000000000000000000383518188c0c6d7730d91b2c03a03c837814a89973ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561410757600080fd5b505afa15801561411b573d6000803e3d6000fd5b505050506040513d602081101561413157600080fd5b810190808051906020019092919050505092506141913330857f000000000000000000000000383518188c0c6d7730d91b2c03a03c837814a89973ffffffffffffffffffffffffffffffffffffffff166146e1909392919063ffffffff16565b5b60008211156141e9576141e83330847f00000000000000000000000004f2694c8fcee23e8fd0dfea1d4f5bb8c352111f73ffffffffffffffffffffffffffffffffffffffff166146e1909392919063ffffffff16565b5b60008111156142405761423f3330837f000000000000000000000000ca76543cf381ebbb277be79574059e32108e3e6573ffffffffffffffffffffffffffffffffffffffff166146e1909392919063ffffffff16565b5b60006143127f000000000000000000000000ca76543cf381ebbb277be79574059e32108e3e6573ffffffffffffffffffffffffffffffffffffffff166373f79c046142948688614d7190919063ffffffff16565b6040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156142c857600080fd5b505afa1580156142dc573d6000803e3d6000fd5b505050506040513d60208110156142f257600080fd5b810190808051906020019092919050505083614d7190919063ffffffff16565b9050600560149054906101000a900460ff1615614450577f000000000000000000000000383518188c0c6d7730d91b2c03a03c837814a89973ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561438f57600080fd5b505afa1580156143a3573d6000803e3d6000fd5b505050506040513d60208110156143b957600080fd5b81019080805190602001909291905050506007541015614441576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f4f484d7631206d696e746564000000000000000000000000000000000000000081525060200191505060405180910390fd5b61444b8186614902565b6144fc565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1933836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b1580156144e357600080fd5b505af11580156144f7573d6000803e3d6000fd5b505050505b5050505050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b15801561459157600080fd5b505afa1580156145a5573d6000803e3d6000fd5b505050506040513d60208110156145bb57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146000906146bf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252838181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156146b05780601f10614685576101008083540402835291602001916146b0565b820191906000526020600020905b81548152906001019060200180831161469357829003601f168201915b50509250505060405180910390fd5b506146cb816000614df9565b50565b600560159054906101000a900460ff1681565b600060608573ffffffffffffffffffffffffffffffffffffffff166323b872dd60e01b868686604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040518082805190602001908083835b602083106147e157805182526020820191506020810190506020830392506147be565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114614843576040519150601f19603f3d011682016040523d82523d6000602084013e614848565b606091505b50915091508180156148885750600081511480614887575080806020019051602081101561487557600080fd5b81019080805190602001909291905050505b5b6148fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f5452414e534645525f46524f4d5f4641494c454400000000000000000000000081525060200191505060405180910390fd5b505050505050565b60028081111561490e57fe5b81600281111561491a57fe5b14156149725761496d3383600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16614b6f9092919063ffffffff16565b614b6b565b6001600281111561497f57fe5b81600281111561498b57fe5b1415614a6557600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166339f4769333846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015614a2457600080fd5b505af1158015614a38573d6000803e3d6000fd5b505050506040513d6020811015614a4e57600080fd5b810190808051906020019092919050505050614b6a565b60006002811115614a7257fe5b816002811115614a7e57fe5b1415614b6957600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663990966d533846000806040518563ffffffff1660e01b8152600401808573ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183151581526020018215158152602001945050505050602060405180830381600087803b158015614b2c57600080fd5b505af1158015614b40573d6000803e3d6000fd5b505050506040513d6020811015614b5657600080fd5b8101908080519060200190929190505050505b5b5b5050565b600060608473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb60e01b8585604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040518082805190602001908083835b60208310614c515780518252602082019150602081019050602083039250614c2e565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114614cb3576040519150601f19603f3d011682016040523d82523d6000602084013e614cb8565b606091505b5091509150818015614cf85750600081511480614cf75750808060200190516020811015614ce557600080fd5b81019080805190602001909291905050505b5b614d6a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f5452414e534645525f4641494c4544000000000000000000000000000000000081525060200191505060405180910390fd5b5050505050565b600080828401905083811015614def576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b60008273ffffffffffffffffffffffffffffffffffffffff166370a082317f00000000000000000000000031f8cc382c9898b273eff4e0b7626a6987c846e86040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015614e8257600080fd5b505afa158015614e96573d6000803e3d6000fd5b505050506040513d6020811015614eac57600080fd5b8101908080519060200190929190505050905060007f00000000000000000000000031f8cc382c9898b273eff4e0b7626a6987c846e873ffffffffffffffffffffffffffffffffffffffff16630c3513a86040518163ffffffff1660e01b815260040160206040518083038186803b158015614f2757600080fd5b505afa158015614f3b573d6000803e3d6000fd5b505050506040513d6020811015614f5157600080fd5b8101908080519060200190929190505050905060007f00000000000000000000000031f8cc382c9898b273eff4e0b7626a6987c846e873ffffffffffffffffffffffffffffffffffffffff16631eec5a9a86856040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060206040518083038186803b158015614ff557600080fd5b505afa158015615009573d6000803e3d6000fd5b505050506040513d602081101561501f57600080fd5b810190808051906020019092919050505090508181111561504757819050633b9aca00820292505b7f00000000000000000000000031f8cc382c9898b273eff4e0b7626a6987c846e873ffffffffffffffffffffffffffffffffffffffff16630b0eee3086856040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b1580156150d857600080fd5b505af11580156150ec573d6000803e3d6000fd5b50505050831561521f57615143600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16848773ffffffffffffffffffffffffffffffffffffffff166155b59092919063ffffffff16565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bc157ac18487846040518463ffffffff1660e01b8152600401808481526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b1580156151de57600080fd5b505af11580156151f2573d6000803e3d6000fd5b505050506040513d602081101561520857600080fd5b81019080805190602001909291905050505061526d565b61526c600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16848773ffffffffffffffffffffffffffffffffffffffff16614b6f9092919063ffffffff16565b5b5050505050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1930836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b15801561530757600080fd5b505af115801561531b573d6000803e3d6000fd5b50505050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156153d457600080fd5b505af11580156153e8573d6000803e3d6000fd5b505050506040513d60208110156153fe57600080fd5b810190808051906020019092919050505050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d866c9d83083600060016040518563ffffffff1660e01b8152600401808573ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183151581526020018215158152602001945050505050602060405180830381600087803b1580156154b957600080fd5b505af11580156154cd573d6000803e3d6000fd5b505050506040513d60208110156154e357600080fd5b8101908080519060200190929190505050507fc4c14883ae9fd8e26d5d59e3485ed29fd126d781d7e498a4ca5c54c8268e4936816040518082815260200191505060405180910390a150565b60008083141561554257600090506155af565b600082840290508284828161555357fe5b04146155aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806157b86021913960400191505060405180910390fd5b809150505b92915050565b600060608473ffffffffffffffffffffffffffffffffffffffff1663095ea7b360e01b8585604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040518082805190602001908083835b602083106156975780518252602082019150602081019050602083039250615674565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146156f9576040519150601f19603f3d011682016040523d82523d6000602084013e6156fe565b606091505b509150915081801561573e575060008151148061573d575080806020019051602081101561572b57600080fd5b81019080805190602001909291905050505b5b6157b0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f415050524f56455f4641494c454400000000000000000000000000000000000081525060200191505060405180910390fd5b505050505056fe536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7757697468647261772076616c7565206d7573742062652067726561746572207468616e2030a2646970667358221220b09b2af2a491d817278550a9f835a52946dfb113bad0ba1275e3732207f35e6d64736f6c63430007050033