ETH Price: $2,524.18 (+2.33%)

Contract

0xF355f5028Ac25406190053d26E4F557804b19af0
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
0x61010060171468952023-04-28 20:06:35548 days ago1682712395IN
 Create: XfaiV0Core
0 ETH0.2072761252.05765012

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
XfaiV0Core

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
Yes with 1000000 runs

Other Settings:
default evmVersion, BSL 1.1 license

Contract Source Code (Solidity Multiple files format)

File 1 of 9: XfaiV0Core.sol
// SPDX-License-Identifier: BUSL-1.1
pragma solidity ^0.8.19;

import 'Math.sol';
import 'XfaiLibrary.sol';

import 'IXfaiV0Core.sol';
import 'IXfaiFactory.sol';
import 'IXfaiPool.sol';
import 'IXfaiV0FlashLoan.sol';
import 'IERC20.sol';

/**
 * @title Xfai's Core Contract
 * @author Xfai
 * @notice XfaiV0Core manages the core AMM logic of Xfai. It does not store any pool state.
 */
contract XfaiV0Core is IXfaiV0Core {
  /**
   * @notice The factory address of Xfai
   */
  address private immutable factory;

  /**
   * @notice The INFT address of Xfai
   */
  address private immutable infinityNFT;

  /**
   * @notice The address of the xfETH token
   */
  address private immutable xfETH;

  /**
   * @notice The liquidity provider fee for swaps and burns
   */
  uint public override lpFee;

  /**
   * @notice The infinity NFT fee for swaps and burns
   */
  uint public override infinityNFTFee;

  uint private constant MAX_FEE = 100;
  uint private constant NOT_ENTERED = 1;
  uint private constant ENTERED = 2;
  uint private constant MINIMUM_LIQUIDITY = 10 ** 3;

  /**
   * @notice The code hash od XfaiPool
   * @dev keccak256(type(XfaiPool).creationCode)
   */
  bytes32 private immutable poolCodeHash;

  /**
   * @notice determines if swap/mint/burn functionality is paused or not
   */
  bool private paused;

  /**
   * @notice Mapping used to lock individual Xfai pools
   * @dev used to prevent reentrancy attacks
   */
  mapping(address => uint) private poolLock;

  modifier singleLock(address _token) {
    require(_token != xfETH, 'XfaiV0Core: INVALID_TOKEN');
    require(poolLock[_token] != ENTERED, 'XfaiV0Core: REENTRANT_CALL');
    poolLock[_token] = ENTERED;
    _;
    poolLock[_token] = NOT_ENTERED;
  }

  modifier doubleLock(address _token0, address _token1) {
    require(poolLock[_token0] != ENTERED, 'XfaiV0Core: REENTRANT_CALL');
    require(poolLock[_token1] != ENTERED, 'XfaiV0Core: REENTRANT_CALL');
    require(_token0 != _token1, 'XfaiV0Core: IDENTICAL_POOLS');
    address _xfETH = xfETH;
    if (_token0 != _xfETH) {
      poolLock[_token0] = ENTERED;
    }
    if (_token1 != _xfETH) {
      poolLock[_token1] = ENTERED;
    }
    _;
    poolLock[_token0] = NOT_ENTERED;
    poolLock[_token1] = NOT_ENTERED;
  }

  modifier pausable() {
    require(paused == false, 'XfaiV0Core: PAUSED');
    _;
  }

  modifier onlyOwner() {
    require(msg.sender == IXfaiFactory(factory).getOwner(), 'XfaiV0Core: NOT_OWNER');
    _;
  }

  /**
   * @notice Construct XfaiV0Core
   * @param _factory The factory contract address of the XfaiV0Core contract
   * @param _infinityNFT The INFT address of Xfai
   * @param _xfETH The address of the xfETH token
   * @param _lpFee The liquidity provider fee for swaps and burns
   * @param _infinityNFTFee The infinity staking / boosting fee for INFT holders
   */
  constructor(
    address _factory,
    address _infinityNFT,
    address _xfETH,
    uint _lpFee,
    uint _infinityNFTFee
  ) {
    factory = _factory;
    infinityNFT = _infinityNFT;
    xfETH = _xfETH;
    lpFee = _lpFee;
    infinityNFTFee = _infinityNFTFee;
    poolCodeHash = IXfaiFactory(_factory).poolCodeHash();
  }

  /**
   * @notice Changes the lpFee of the XfaiV0Core contract
   * @dev Only the owner of the XfaiV0Core contract can call this function
   * @param _newLpFee The new lpFee
   */
  function changeLpFee(uint _newLpFee) external override onlyOwner {
    require(_newLpFee + infinityNFTFee <= MAX_FEE, 'XfaiV0Core: FEE_EXCEEDS_LIMIT');
    lpFee = _newLpFee;
    emit LpFeeChange(_newLpFee);
  }

  /**
   * @notice Changes the infinityNFTFee of the XfaiV0Core contract
   * @dev Only the owner of the XfaiV0Core contract can call this function
   * @param _newLnftFee The new infinityNFTFee
   */
  function changeInfinityNFTFee(uint _newLnftFee) external override onlyOwner {
    require(lpFee + _newLnftFee <= MAX_FEE, 'XfaiV0Core: FEE_EXCEEDS_LIMIT');
    infinityNFTFee = _newLnftFee;
    emit InfinityNFTFeeChange(_newLnftFee);
  }

  /**
   * @notice Returns the total fee of the XfaiV0Core contract for swaps and burns
   * @dev The total fee of the XfaiV0Core represents the sum of the infinityNFTFee and lpFee
   */
  function getTotalFee() public view override returns (uint) {
    return infinityNFTFee + lpFee;
  }

  function _swap0(
    address _pool,
    address _token,
    address _to
  ) private returns (uint amountIn, uint amountOut) {
    address _xfETH = xfETH; // gas saving
    IXfaiPool pool = IXfaiPool(_pool);
    (uint reserve, uint weight) = pool.getStates();
    uint tokenBalance = IERC20(_token).balanceOf(_pool);
    amountIn = tokenBalance - reserve;
    amountOut = XfaiLibrary.getAmountOut(reserve, weight, amountIn, getTotalFee());
    pool.linkedTransfer(_token, infinityNFT, (amountIn * infinityNFTFee) / 10000); // send infinityNFTFee to the INFT contract
    pool.linkedTransfer(_xfETH, _to, amountOut); // optimistically transfer tokens
    uint xfETHBalance = IERC20(_xfETH).balanceOf(_pool);
    tokenBalance = IERC20(_token).balanceOf(_pool);
    pool.update(tokenBalance, xfETHBalance);
  }

  function _swap1(
    address _pool,
    address _token,
    address _to,
    bool _withFee
  ) private returns (uint amountIn, uint amountOut) {
    address _xfETH = xfETH; // gas saving
    IXfaiPool pool = IXfaiPool(_pool);
    (uint reserve, uint weight) = pool.getStates();
    uint xfETHBalance = IERC20(_xfETH).balanceOf(_pool);
    amountIn = xfETHBalance - weight;
    if (_withFee == true) {
      amountOut = XfaiLibrary.getAmountOut(weight, reserve, amountIn, getTotalFee());
      pool.linkedTransfer(xfETH, infinityNFT, (amountIn * infinityNFTFee) / 10000); // send infinityNFTFee to the INFT contract
    } else {
      amountOut = XfaiLibrary.getAdjustedOutput(amountIn, weight, reserve);
    }
    pool.linkedTransfer(_token, _to, amountOut); // optimistically transfer tokens
    xfETHBalance = IERC20(_xfETH).balanceOf(_pool);
    uint tokenBalance = IERC20(_token).balanceOf(_pool);
    pool.update(tokenBalance, xfETHBalance);
  }

  function _swap(
    address _token0,
    address _token1,
    address _to
  ) private returns (uint amount0In, uint amount1Out) {
    address _xfETH = xfETH; // gas saving
    address _factory = factory; // gas saving
    require(_to != _token0, 'XfaiV0Core: INVALID_TO');
    require(_to != _token1, 'XfaiV0Core: INVALID_TO');
    if (_token0 != _xfETH && _token1 != _xfETH) {
      address pool0 = XfaiLibrary.poolFor(_token0, _factory, poolCodeHash);
      address pool1 = XfaiLibrary.poolFor(_token1, _factory, poolCodeHash);
      (amount0In, ) = _swap0(pool0, _token0, pool1);
      (, amount1Out) = _swap1(pool1, _token1, _to, false);
    } else if (_token0 == _xfETH) {
      address pool1 = XfaiLibrary.poolFor(_token1, _factory, poolCodeHash);
      (amount0In, amount1Out) = _swap1(pool1, _token1, _to, true);
    } else {
      address pool0 = XfaiLibrary.poolFor(_token0, _factory, poolCodeHash);
      (amount0In, amount1Out) = _swap0(pool0, _token0, _to);
    }
  }

  /**
   * @notice Swaps one hosted ERC20 token for another hosted ERC20 token
   * @dev This low-level function should be called from a contract which performs important safety checks.
   * This function locks the pool of _token0 and _token1 to prevent reentrancy attacks.
   * @param _token0 An ERC20 token address. Token must have already a pool
   * @param _token1 An ERC20 token address. Token must have already a pool
   * @param _to The address of the recipient that receives the _amount1Out tokens
   */
  function swap(
    address _token0,
    address _token1,
    address _to
  )
    external
    override
    pausable
    doubleLock(_token0, _token1)
    returns (uint amount0In, uint amount1Out)
  {
    (amount0In, amount1Out) = _swap(_token0, _token1, _to);
    emit Swap(msg.sender, amount0In, amount1Out, _to);
  }

  /**
   * @notice Performs two-sided liquidity provisioning and mints in return liquidity tokens for a given pool. The amount of liquidity tokens minted depend on the amount of _token and xfETH provided
   * @dev This low-level function should be called from a contract which performs important safety checks.
   * This function locks the pool of _token to prevent reentrancy attacks.
   * @param _token An ERC20 token address. Token must have already a pool
   * @param _to The address of the recipient that receives the minted liquidity tokens
   * @return liquidity The amount of liquidity tokens minted
   */
  function mint(
    address _token,
    address _to
  ) external override pausable singleLock(_token) returns (uint liquidity) {
    address pool = XfaiLibrary.poolFor(_token, factory, poolCodeHash);
    (uint reserve, uint weight) = IXfaiPool(pool).getStates();
    uint tokenBalance = IERC20(_token).balanceOf(pool);
    uint xfETHBalance = IERC20(xfETH).balanceOf(pool);
    uint tokenIn = tokenBalance - reserve;
    uint weightIn = xfETHBalance - weight;
    uint _totalSupply = IERC20(pool).totalSupply();
    if (_totalSupply == 0) {
      liquidity = Math.sqrt(tokenIn * weightIn) - MINIMUM_LIQUIDITY;
      IXfaiPool(pool).mint(address(0), MINIMUM_LIQUIDITY); // permanently lock the first MINIMUM_LIQUIDITY tokens
    } else {
      liquidity = Math.min((tokenIn * _totalSupply) / reserve, (weightIn * _totalSupply) / weight);
    }
    require(liquidity > 0, 'XfaiV0Core: INSUFFICIENT_LIQUIDITY_MINTED');
    IXfaiPool(pool).mint(_to, liquidity);
    IXfaiPool(pool).update(tokenBalance, xfETHBalance);
    emit Mint(msg.sender, liquidity);
  }

  /**
   * @notice Burns existing liquidity tokens for a given pool. The amount of _token0 and _token1 returned depend on the amount of liquidity tokens burned and on the reserves & weights of pool0 and / or pool1
   * @dev This low-level function should be called from a contract which performs important safety checks.
   * This function locks the pool of _token0 and _token1 to prevent reentrancy attacks.
   * @param _token0 An ERC20 token address. Token must have already a pool
   * @param _token1 An ERC20 token address. Token must have already a pool
   * @param _to The address of the recipient that receives the redeemed liquidity
   * @return amount0Out The amount of tokens0 that one receives
   * @return amount1Out THe amount of tokens1 that one receives
   */
  function burn(
    address _token0,
    address _token1,
    address _to
  )
    external
    override
    pausable
    doubleLock(_token0, _token1)
    returns (uint amount0Out, uint amount1Out)
  {
    address _xfETH = xfETH; // gas saving
    require(_token0 != _xfETH, 'XfaiV0Core: INVALID_PRIMARY_TOKEN');
    address pool0 = XfaiLibrary.poolFor(_token0, factory, poolCodeHash);
    address pool1 = XfaiLibrary.poolFor(_token1, factory, poolCodeHash);
    uint liquidity = IERC20(pool0).balanceOf(address(this));
    uint totalSupply = IERC20(pool0).totalSupply();
    amount0Out = (liquidity * IERC20(_token0).balanceOf(pool0)) / totalSupply; // using balances ensures pro-rata distribution
    amount1Out = (liquidity * IERC20(_xfETH).balanceOf(pool0)) / totalSupply; // using balances ensures pro-rata distribution
    require(amount0Out > 0 && amount1Out > 0, 'XfaiV0Core: INSUFFICIENT_LIQUIDITY_BURNED');
    IXfaiPool(pool0).linkedTransfer(_token0, _to, amount0Out);
    if (_token1 == _xfETH) {
      IXfaiPool(pool0).linkedTransfer(_xfETH, _to, amount1Out);
      IXfaiPool(pool0).update(IERC20(_token0).balanceOf(pool0), IERC20(_xfETH).balanceOf(pool0));
    } else {
      IXfaiPool(pool0).linkedTransfer(_xfETH, pool1, amount1Out);
      IXfaiPool(pool0).update(IERC20(_token0).balanceOf(pool0), IERC20(_xfETH).balanceOf(pool0));
      (, amount1Out) = _swap1(pool1, _token1, _to, true);
    }
    IXfaiPool(pool0).burn(address(this), liquidity);
    emit Burn(msg.sender, amount0Out, amount1Out, _to);
  }

  /**
   * @notice Enables users to request flash loans from Xfai
   * @dev The recipient _to of the flash loan needs to be a smart contract that supports the IDeXFaiV0FlashLoan functions.
   * This function locks the pool of _token to prevent reentrancy attacks.
   * @param _token An ERC20 token address. Token must have already a pool
   * @param _amount The amount for the flash loan
   * @param _to The address of the recipient that receives the flash loan
   * @param _data the additional bytes data used for the flash loan
   */
  function flashLoan(
    address _token,
    uint _amount,
    address _to,
    bytes calldata _data
  ) external override pausable singleLock(_token) {
    require(_to != address(0), 'XfaiV0Core INVALID_TO');
    address pool = XfaiLibrary.poolFor(_token, factory, poolCodeHash);
    (uint reserve, ) = IXfaiPool(pool).getStates();
    require(_amount <= reserve, 'XfaiV0Core: INSUFFICIENT_OUTPUT_AMOUNT');
    uint balance = IERC20(_token).balanceOf(pool);
    IXfaiPool(pool).linkedTransfer(_token, _to, _amount); // optimistically transfer tokens
    IXfaiV0FlashLoan(_to).flashLoan(pool, _amount, _data);
    require(
      IERC20(_token).balanceOf(pool) >= balance + ((_amount * getTotalFee()) / 10000),
      'XfaiV0Core: INSUFFICIENT_AMOUNT_RETURNED'
    );
    IXfaiPool(pool).linkedTransfer(_token, infinityNFT, (_amount * infinityNFTFee) / 10000); // send lnft fee to fee collecting contract
    IXfaiPool(pool).update(IERC20(_token).balanceOf(pool), IERC20(xfETH).balanceOf(pool));
    emit FlashLoan(_to, _amount);
  }

  /**
   * @notice Force the token balance of a pool to match its reserves
   * @dev This function locks the pool of _token to prevent reentrancy attacks.
   * @param _token An ERC20 token address. Token must have already a pool
   * @param _to The recipient of the skim
   */
  function skim(address _token, address _to) external override pausable singleLock(_token) {
    address _xfETH = xfETH; // gas saving
    address pool = XfaiLibrary.poolFor(_token, factory, poolCodeHash);
    (uint reserve, uint weight) = IXfaiPool(pool).getStates();
    uint tokenBalanceDif = IERC20(_token).balanceOf(pool) - reserve;
    uint xfETHBalanceDif = IERC20(_xfETH).balanceOf(pool) - weight;
    if (tokenBalanceDif > 0) {
      IXfaiPool(pool).linkedTransfer(_token, _to, tokenBalanceDif);
    }
    if (xfETHBalanceDif > 0) {
      IXfaiPool(pool).linkedTransfer(_xfETH, _to, xfETHBalanceDif);
    }
  }

  /**
   * @notice Force the reserves of a pool to match its token balance
   * @dev This function locks the pool of _token to prevent reentrancy attacks.
   * @param _token An ERC20 token address. Token must have already a pool
   */
  function sync(address _token) external override pausable singleLock(_token) {
    address pool = XfaiLibrary.poolFor(_token, factory, poolCodeHash);
    uint tokenBalance = IERC20(_token).balanceOf(pool);
    uint xfETHBalance = IERC20(xfETH).balanceOf(pool);
    IXfaiPool(pool).update(tokenBalance, xfETHBalance);
  }

  /**
   * @notice Pause any function that can change the state of a pool within Xfai
   * @dev Only the owner of the XfaiV0Core contract can call this function
   * @param _p the boolean to determine if XfaiV0Core is paused or not
   */
  function pause(bool _p) external override onlyOwner {
    paused = _p;
    emit Paused(_p);
  }
}

File 2 of 9: IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
  /**
   * @dev Emitted when `value` tokens are moved from one account (`from`) to
   * another (`to`).
   *
   * Note that `value` may be zero.
   */
  event Transfer(address indexed from, address indexed to, uint256 value);

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

  /**
   * @dev 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 `to`.
   *
   * Returns a boolean value indicating whether the operation succeeded.
   *
   * Emits a {Transfer} event.
   */
  function transfer(address to, 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 `from` to `to` 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 from, address to, uint256 amount) external returns (bool);
}

File 3 of 9: IERC20Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;

import 'IERC20.sol';

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
  /**
   * @dev Returns the name of the token.
   */
  function name() external view returns (string memory);

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

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

File 4 of 9: IXfaiFactory.sol
// SPDX-License-Identifier: BUSL-1.1
pragma solidity ^0.8.19;

interface IXfaiFactory {
  function getPool(address _token) external view returns (address pool);

  function allPools(uint256) external view returns (address pool);

  function poolCodeHash() external pure returns (bytes32);

  function allPoolsLength() external view returns (uint);

  function createPool(address _token) external returns (address pool);

  function setXfaiCore(address _core) external;

  function getXfaiCore() external view returns (address);

  function setOwner(address _owner) external;

  function getOwner() external view returns (address);

  event ChangedOwner(address indexed owner);
  event ChangedCore(address indexed core);
  event Whitelisting(bool state);
  event PoolCreated(address indexed token, address indexed pool, uint allPoolsSize);
}

File 5 of 9: IXfaiPool.sol
// SPDX-License-Identifier: BUSL-1.1
pragma solidity ^0.8.19;

import 'IERC20Metadata.sol';

interface IXfaiPool is IERC20Metadata {
  function getXfaiCore() external view returns (address);

  function poolToken() external view returns (address);

  function initialize(address _token, address _xfaiFactory) external;

  function getStates() external view returns (uint, uint);

  function update(uint _reserveBalance, uint _weightBalance) external;

  function mint(address _to, uint _amount) external;

  function burn(address _to, uint _amount) external;

  function linkedTransfer(address _token, address _to, uint256 _value) external;

  event Sync(uint _reserve, uint _weight);
  event Write(uint _reserve, uint _weight, uint _blockTimestamp);
}

File 6 of 9: IXfaiV0Core.sol
// SPDX-License-Identifier: BUSL-1.1
pragma solidity ^0.8.19;

interface IXfaiV0Core {
  function lpFee() external view returns (uint);

  function changeLpFee(uint _newFee) external;

  function infinityNFTFee() external view returns (uint);

  function changeInfinityNFTFee(uint _newFee) external;

  function getTotalFee() external view returns (uint);

  function pause(bool _p) external;

  function swap(
    address _token0,
    address _token1,
    address _to
  ) external returns (uint input, uint output);

  function flashLoan(address _token, uint _amount, address _to, bytes calldata _data) external;

  function mint(address _token, address _to) external returns (uint liquidity);

  function burn(
    address _token0,
    address _token1,
    address _to
  ) external returns (uint amount0, uint amount1);

  function skim(address _token, address _to) external;

  function sync(address _token) external;

  event ChangedOwner(address indexed owner);
  event Mint(address indexed sender, uint liquidity);
  event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
  event Swap(address indexed sender, uint input, uint output, address indexed to);
  event FlashLoan(address indexed sender, uint amount);
  event LpFeeChange(uint newFee);
  event InfinityNFTFeeChange(uint newFee);
  event Paused(bool p);
}

File 7 of 9: IXfaiV0FlashLoan.sol
// SPDX-License-Identifier: BUSL-1.1
pragma solidity ^0.8.19;

interface IXfaiV0FlashLoan {
  function flashLoan(address sender, uint amount, bytes calldata data) external;
}

File 8 of 9: Math.sol
// SPDX-License-Identifier: GPL-3.0-or-later
pragma solidity ^0.8.19;

library Math {
  function min(uint _a, uint _b) internal pure returns (uint) {
    return _a < _b ? _a : _b;
  }

  function sqrt(uint _y) internal pure returns (uint z) {
    if (_y > 3) {
      z = _y;
      uint x = _y / 2 + 1;
      while (x < z) {
        z = x;
        x = (_y / x + x) / 2;
      }
    } else if (_y != 0) {
      z = 1;
    }
  }
}

File 9 of 9: XfaiLibrary.sol
// SPDX-License-Identifier: BUSL-1.1
pragma solidity ^0.8.19;

import 'IXfaiPool.sol';

library XfaiLibrary {
  /**
   * @notice Calculates the CREATE2 address for a pool without making any external calls
   * @param _token An ERC20 token address
   * @param _factory The factory contract of Xfai
   * @param _poolCodeHash The codehash of the Xfai pool contract
   * @return pool The deterministic pool address for a given _token
   */
  function poolFor(
    address _token,
    address _factory,
    bytes32 _poolCodeHash
  ) internal pure returns (address pool) {
    pool = address(
      uint160(
        uint256(
          keccak256(
            abi.encodePacked(
              hex'ff',
              _factory,
              keccak256(abi.encodePacked(_token)),
              _poolCodeHash // init code hash
            )
          )
        )
      )
    );
  }

  function getAdjustedOutput(uint _amountIn, uint _r, uint _w) internal pure returns (uint out) {
    out = (_amountIn * _w) / (_r + _amountIn);
  }

  function getAdjustedInput(uint _amountOut, uint _r, uint _w) internal pure returns (uint input) {
    input = ((_amountOut * _r) / (_w - _amountOut)) + 1;
  }

  function quote(uint _amountIn, uint _a, uint _b) internal pure returns (uint out) {
    out = (_amountIn * _a) / _b;
  }

  /**
   * @notice Calculates the adjusted price of an _amountIn (of a token from _pool0) in terms of the token in _pool1
   * @dev either token0 or token1 must be xfETH
   * @param _reserve0 The reserve of _token0 (can be xfETH)
   * @param _reserve1 The reserve of _token1 (can be xfETH)
   * @param _amountIn The token input amount to _pool0
   * @return output The token output between a token - xfETH interaction
   */
  function getAmountOut(
    uint _reserve0,
    uint _reserve1,
    uint _amountIn,
    uint _totalFee
  ) public pure returns (uint output) {
    require(_amountIn > 0, 'Xfai: INSUFFICIENT_AMOUNT');
    require(_reserve0 > 0, 'Xfai: INSUFFICIENT_LIQUIDITY');
    require(_reserve1 > 0, 'Xfai: INSUFFICIENT_LIQUIDITY');
    uint amountInWithFee = _amountIn * (10000 - _totalFee);
    uint numerator = amountInWithFee * _reserve1;
    output = numerator / (_reserve0 * 10000 + amountInWithFee);
  }

  /**
   * @notice Calculates the adjusted price of an _amountOut (of a token from _pool1) in terms of the token in _pool0
   * @param _reserve0 The reserve of _token0 (can be xfETH)
   * @param _reserve1 The reserve of _token1 (can be xfETH)
   * @param _amountOut The token output amount from _pool0
   * @return input The token input amount to _pool0
   */
  function getAmountIn(
    uint _reserve0,
    uint _reserve1,
    uint _amountOut,
    uint _totalFee
  ) public pure returns (uint input) {
    require(_amountOut > 0, 'Xfai: INSUFFICIENT_AMOUNT');
    require(_reserve0 > 0, 'Xfai: INSUFFICIENT_LIQUIDITY');
    require(_reserve1 > 0, 'Xfai: INSUFFICIENT_LIQUIDITY');
    uint numerator = _amountOut * _reserve0 * 10000;
    uint denominator = (_reserve1 - _amountOut) * (10000 - _totalFee);
    input = (numerator / denominator) + 1;
  }

  /**
   * @notice Calculates the adjusted price of an _amountIn (of a token from _pool0) in terms of the token in _pool1
   * @param _pool0 A pool address
   * @param _pool1 A pool address
   * @param _amountIn The token input amount to _pool0
   * @return out1 The token output amount from _pool1
   */
  function getAmountsOut(
    address _pool0,
    address _pool1,
    uint _amountIn,
    uint _totalFee
  ) public view returns (uint out1) {
    (uint r0, uint w0) = IXfaiPool(_pool0).getStates();
    (uint r1, uint w1) = IXfaiPool(_pool1).getStates();
    uint weight0Out = getAmountOut(r0, w0, _amountIn, _totalFee);
    out1 = getAdjustedOutput(weight0Out, w1, r1);
  }

  /**
   * @notice Calculates the adjusted price of an _amountOut (of a token from _pool1) in terms of the token in _pool0
   * @param _pool0 A pool address
   * @param _pool1 A pool address
   * @param _amountOut The token output amount from _pool1
   * @return inp0 The token input amount to _pool0
   */
  function getAmountsIn(
    address _pool0,
    address _pool1,
    uint _amountOut,
    uint _totalFee
  ) public view returns (uint inp0) {
    (uint r0, uint w0) = IXfaiPool(_pool0).getStates();
    (uint r1, uint w1) = IXfaiPool(_pool1).getStates();
    uint weight0Out = getAdjustedInput(_amountOut, w1, r1);
    inp0 = getAmountIn(r0, w0, weight0Out, _totalFee);
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_infinityNFT","type":"address"},{"internalType":"address","name":"_xfETH","type":"address"},{"internalType":"uint256","name":"_lpFee","type":"uint256"},{"internalType":"uint256","name":"_infinityNFTFee","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"}],"name":"ChangedOwner","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"FlashLoan","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newFee","type":"uint256"}],"name":"InfinityNFTFeeChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newFee","type":"uint256"}],"name":"LpFeeChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"liquidity","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"p","type":"bool"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"input","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"output","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"Swap","type":"event"},{"inputs":[{"internalType":"address","name":"_token0","type":"address"},{"internalType":"address","name":"_token1","type":"address"},{"internalType":"address","name":"_to","type":"address"}],"name":"burn","outputs":[{"internalType":"uint256","name":"amount0Out","type":"uint256"},{"internalType":"uint256","name":"amount1Out","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newLnftFee","type":"uint256"}],"name":"changeInfinityNFTFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newLpFee","type":"uint256"}],"name":"changeLpFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"flashLoan","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getTotalFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"infinityNFTFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_to","type":"address"}],"name":"mint","outputs":[{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_p","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_to","type":"address"}],"name":"skim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token0","type":"address"},{"internalType":"address","name":"_token1","type":"address"},{"internalType":"address","name":"_to","type":"address"}],"name":"swap","outputs":[{"internalType":"uint256","name":"amount0In","type":"uint256"},{"internalType":"uint256","name":"amount1Out","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"sync","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6101006040523480156200001257600080fd5b5060405162004945380380620049458339810160408190526200003591620000e9565b6001600160a01b03808616608081905285821660a05290841660c052600083905560018290556040805163554dcae760e01b8152905163554dcae7916004808201926020929091908290030181865afa15801562000097573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000bd919062000146565b60e05250620001609350505050565b80516001600160a01b0381168114620000e457600080fd5b919050565b600080600080600060a086880312156200010257600080fd5b6200010d86620000cc565b94506200011d60208701620000cc565b93506200012d60408701620000cc565b6060870151608090970151959894975095949392505050565b6000602082840312156200015957600080fd5b5051919050565b60805160a05160c05160e0516146bd6200028860003960008181610777015281816107c6015281816113a1015281816120920152818161254801528181612eac01528181613c5101528181613c8001528181613d080152613d500152600081816105bf01528181610687015281816111ce0152818161135a01528181611d0401528181611ee1015281816121970152818161232c01528181612b2d01528181612cfb015281816130270152818161351f0152818161373601528181613a840152613e4b0152600081816129890152818161375701526140590152600081816101ca01528181610756015281816107a501528181611380015281816116fd015281816118cd015281816120710152818161252701528181612e8b0152613aa501526146bd6000f3fe608060405234801561001057600080fd5b50600436106100d45760003560e01c8063917c060e11610081578063a58411941161005b578063a58411941461018f578063adf51de1146101a2578063ee1fe2ad146101b557600080fd5b8063917c060e146101605780639246f76a14610169578063933162121461017c57600080fd5b8063712b772f116100b2578063712b772f146101325780637ae316d014610145578063890305d31461014d57600080fd5b806302329a29146100d957806345a11cec146100ee578063704ce43e1461011b575b600080fd5b6100ec6100e736600461436e565b6101c8565b005b6101016100fc3660046143bc565b610356565b604080519283526020830191909152015b60405180910390f35b61012460005481565b604051908152602001610112565b6100ec610140366004614407565b61115e565b6101246116e5565b6100ec61015b366004614440565b6116fb565b61012460015481565b6100ec610177366004614440565b6118cb565b61010161018a3660046143bc565b611a9b565b6100ec61019d366004614459565b611e71565b6100ec6101b0366004614476565b6122bc565b6101246101c3366004614407565b612c88565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663893d20e86040518163ffffffff1660e01b8152600401602060405180830381865afa158015610233573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102579190614515565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146102f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f586661695630436f72653a204e4f545f4f574e4552000000000000000000000060448201526064015b60405180910390fd5b600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168215159081179091556040519081527f0e2fb031ee032dc02d8011dc50b816eb450cf856abd8261680dac74f72165bd2906020015b60405180910390a150565b600254600090819060ff16156103c8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f586661695630436f72653a20504155534544000000000000000000000000000060448201526064016102e7565b73ffffffffffffffffffffffffffffffffffffffff8516600090815260036020526040902054859085907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0161047a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f586661695630436f72653a205245454e5452414e545f43414c4c00000000000060448201526064016102e7565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600360205260409020547ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01610528576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f586661695630436f72653a205245454e5452414e545f43414c4c00000000000060448201526064016102e7565b8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036105bd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f586661695630436f72653a204944454e544943414c5f504f4f4c53000000000060448201526064016102e7565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff838116908216146106285773ffffffffffffffffffffffffffffffffffffffff83166000908152600360205260409020600290555b8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146106855773ffffffffffffffffffffffffffffffffffffffff82166000908152600360205260409020600290555b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff808216908a160361074e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f586661695630436f72653a20494e56414c49445f5052494d4152595f544f4b4560448201527f4e0000000000000000000000000000000000000000000000000000000000000060648201526084016102e7565b600061079b8a7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000061341c565b905060006107ea8a7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000061341c565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290915060009073ffffffffffffffffffffffffffffffffffffffff8416906370a0823190602401602060405180830381865afa15801561085a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061087e9190614532565b905060008373ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108f19190614532565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015291925082918f16906370a0823190602401602060405180830381865afa158015610962573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109869190614532565b610990908461457a565b61099a9190614591565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8681166004830152919b5082918716906370a0823190602401602060405180830381865afa158015610a0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a2f9190614532565b610a39908461457a565b610a439190614591565b985060008a118015610a555750600089115b610ae1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f586661695630436f72653a20494e53554646494349454e545f4c49515549444960448201527f54595f4255524e4544000000000000000000000000000000000000000000000060648201526084016102e7565b6040517f341ce0cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8e811660048301528c81166024830152604482018c905285169063341ce0cc90606401600060405180830381600087803b158015610b5957600080fd5b505af1158015610b6d573d6000803e3d6000fd5b505050508473ffffffffffffffffffffffffffffffffffffffff168c73ffffffffffffffffffffffffffffffffffffffff1603610de9576040517f341ce0cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301528c81166024830152604482018b905285169063341ce0cc90606401600060405180830381600087803b158015610c1c57600080fd5b505af1158015610c30573d6000803e3d6000fd5b505050508373ffffffffffffffffffffffffffffffffffffffff16632fb565e88e73ffffffffffffffffffffffffffffffffffffffff166370a08231876040518263ffffffff1660e01b8152600401610ca5919073ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b602060405180830381865afa158015610cc2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ce69190614532565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff88811660048301528916906370a0823190602401602060405180830381865afa158015610d52573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d769190614532565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815260048101929092526024820152604401600060405180830381600087803b158015610dcc57600080fd5b505af1158015610de0573d6000803e3d6000fd5b5050505061103a565b6040517f341ce0cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301528481166024830152604482018b905285169063341ce0cc90606401600060405180830381600087803b158015610e6157600080fd5b505af1158015610e75573d6000803e3d6000fd5b505050508373ffffffffffffffffffffffffffffffffffffffff16632fb565e88e73ffffffffffffffffffffffffffffffffffffffff166370a08231876040518263ffffffff1660e01b8152600401610eea919073ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b602060405180830381865afa158015610f07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f2b9190614532565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff88811660048301528916906370a0823190602401602060405180830381865afa158015610f97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fbb9190614532565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815260048101929092526024820152604401600060405180830381600087803b15801561101157600080fd5b505af1158015611025573d6000803e3d6000fd5b50505050611036838d8d6001613518565b9950505b6040517f9dc29fac0000000000000000000000000000000000000000000000000000000081523060048201526024810183905273ffffffffffffffffffffffffffffffffffffffff851690639dc29fac90604401600060405180830381600087803b1580156110a857600080fd5b505af11580156110bc573d6000803e3d6000fd5b5050604080518d8152602081018d905273ffffffffffffffffffffffffffffffffffffffff8f1693503392507fdccd412f0b1252819cb1fd330b93224ca42612892bb3f4f789976e6d81936496910160405180910390a35050505073ffffffffffffffffffffffffffffffffffffffff938416600090815260036020526040808220600190819055949095168152939093209190915550919590945092505050565b60025460ff16156111cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f586661695630436f72653a20504155534544000000000000000000000000000060448201526064016102e7565b817f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611281576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f586661695630436f72653a20494e56414c49445f544f4b454e0000000000000060448201526064016102e7565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600360205260409020547ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0161132f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f586661695630436f72653a205245454e5452414e545f43414c4c00000000000060448201526064016102e7565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600360205260408120600290557f0000000000000000000000000000000000000000000000000000000000000000906113c5857f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000061341c565b90506000808273ffffffffffffffffffffffffffffffffffffffff1663d8ab82746040518163ffffffff1660e01b81526004016040805180830381865afa158015611414573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061143891906145cc565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301529294509092506000918491908a16906370a0823190602401602060405180830381865afa1580156114b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114d49190614532565b6114de91906145f0565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301529192506000918491908816906370a0823190602401602060405180830381865afa158015611553573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115779190614532565b61158191906145f0565b9050811561161a576040517f341ce0cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a8116600483015289811660248301526044820184905286169063341ce0cc90606401600060405180830381600087803b15801561160157600080fd5b505af1158015611615573d6000803e3d6000fd5b505050505b80156116b1576040517f341ce0cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff878116600483015289811660248301526044820183905286169063341ce0cc90606401600060405180830381600087803b15801561169857600080fd5b505af11580156116ac573d6000803e3d6000fd5b505050505b50505073ffffffffffffffffffffffffffffffffffffffff9093166000908152600360205260409020600190555050505050565b600080546001546116f69190614603565b905090565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663893d20e86040518163ffffffff1660e01b8152600401602060405180830381865afa158015611766573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061178a9190614515565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461181e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f586661695630436f72653a204e4f545f4f574e4552000000000000000000000060448201526064016102e7565b60646001548261182e9190614603565b1115611896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f586661695630436f72653a204645455f455843454544535f4c494d495400000060448201526064016102e7565b60008190556040518181527f6dd92a0ab9d55ea4d1c74eccd145752cd4a8b993732f2b1ba98a9c2a674cc17a9060200161034b565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663893d20e86040518163ffffffff1660e01b8152600401602060405180830381865afa158015611936573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061195a9190614515565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146119ee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f586661695630436f72653a204e4f545f4f574e4552000000000000000000000060448201526064016102e7565b6064816000546119fe9190614603565b1115611a66576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f586661695630436f72653a204645455f455843454544535f4c494d495400000060448201526064016102e7565b60018190556040518181527f16614206cdcb6d0d0b4c49641090b66d8bb3a213d268188947929d52c18990489060200161034b565b600254600090819060ff1615611b0d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f586661695630436f72653a20504155534544000000000000000000000000000060448201526064016102e7565b73ffffffffffffffffffffffffffffffffffffffff8516600090815260036020526040902054859085907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01611bbf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f586661695630436f72653a205245454e5452414e545f43414c4c00000000000060448201526064016102e7565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600360205260409020547ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01611c6d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f586661695630436f72653a205245454e5452414e545f43414c4c00000000000060448201526064016102e7565b8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611d02576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f586661695630436f72653a204944454e544943414c5f504f4f4c53000000000060448201526064016102e7565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff83811690821614611d6d5773ffffffffffffffffffffffffffffffffffffffff83166000908152600360205260409020600290555b8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611dca5773ffffffffffffffffffffffffffffffffffffffff82166000908152600360205260409020600290555b611dd5888888613a7f565b604080518381526020810183905292975090955073ffffffffffffffffffffffffffffffffffffffff88169133917f2a9237ff5aa599ef4c5ee4b1142b53429d5755e2685fe6288b2e3320202115f5910160405180910390a35073ffffffffffffffffffffffffffffffffffffffff91821660009081526003602052604080822060019081905592909316815291909120559094909350915050565b60025460ff1615611ede576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f586661695630436f72653a20504155534544000000000000000000000000000060448201526064016102e7565b807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611f94576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f586661695630436f72653a20494e56414c49445f544f4b454e0000000000000060448201526064016102e7565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600360205260409020547ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01612042576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f586661695630436f72653a205245454e5452414e545f43414c4c00000000000060448201526064016102e7565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600360205260408120600290556120b6837f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000061341c565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff80831660048301529192506000918516906370a0823190602401602060405180830381865afa158015612128573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061214c9190614532565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301529192506000917f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa1580156121de573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122029190614532565b6040517f2fb565e8000000000000000000000000000000000000000000000000000000008152600481018490526024810182905290915073ffffffffffffffffffffffffffffffffffffffff841690632fb565e890604401600060405180830381600087803b15801561227457600080fd5b505af1158015612288573d6000803e3d6000fd5b50505073ffffffffffffffffffffffffffffffffffffffff9094166000908152600360205260409020600190555050505050565b60025460ff1615612329576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f586661695630436f72653a20504155534544000000000000000000000000000060448201526064016102e7565b847f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036123df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f586661695630436f72653a20494e56414c49445f544f4b454e0000000000000060448201526064016102e7565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600360205260409020547ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0161248d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f586661695630436f72653a205245454e5452414e545f43414c4c00000000000060448201526064016102e7565b73ffffffffffffffffffffffffffffffffffffffff808216600090815260036020526040902060029055841661251f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f586661695630436f726520494e56414c49445f544f000000000000000000000060448201526064016102e7565b600061256c877f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000061341c565b905060008173ffffffffffffffffffffffffffffffffffffffff1663d8ab82746040518163ffffffff1660e01b81526004016040805180830381865afa1580156125ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125de91906145cc565b50905080871115612671576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f586661695630436f72653a20494e53554646494349454e545f4f55545055545f60448201527f414d4f554e54000000000000000000000000000000000000000000000000000060648201526084016102e7565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152600091908a16906370a0823190602401602060405180830381865afa1580156126e1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127059190614532565b6040517f341ce0cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b811660048301528981166024830152604482018b90529192509084169063341ce0cc90606401600060405180830381600087803b15801561278157600080fd5b505af1158015612795573d6000803e3d6000fd5b50506040517fe0232b4200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a16925063e0232b4291506127f19086908c908b908b90600401614616565b600060405180830381600087803b15801561280b57600080fd5b505af115801561281f573d6000803e3d6000fd5b5050505061271061282e6116e5565b612838908a61457a565b6128429190614591565b61284c9082614603565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301528b16906370a0823190602401602060405180830381865afa1580156128b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128dc9190614532565b101561296a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f586661695630436f72653a20494e53554646494349454e545f414d4f554e545f60448201527f52455455524e454400000000000000000000000000000000000000000000000060648201526084016102e7565b8273ffffffffffffffffffffffffffffffffffffffff1663341ce0cc8a7f00000000000000000000000000000000000000000000000000000000000000006127106001548d6129b9919061457a565b6129c39190614591565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815273ffffffffffffffffffffffffffffffffffffffff93841660048201529290911660248301526044820152606401600060405180830381600087803b158015612a3757600080fd5b505af1158015612a4b573d6000803e3d6000fd5b50506040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff808716600483018190529350632fb565e892508c16906370a0823190602401602060405180830381865afa158015612ac4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ae89190614532565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff87811660048301527f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015612b74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b989190614532565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815260048101929092526024820152604401600060405180830381600087803b158015612bee57600080fd5b505af1158015612c02573d6000803e3d6000fd5b505050508673ffffffffffffffffffffffffffffffffffffffff167f134bde118562a60dcf2d8c52965f586e25cf88a371592e44b78c4aa03bcbac8489604051612c4e91815260200190565b60405180910390a250505073ffffffffffffffffffffffffffffffffffffffff166000908152600360205260409020600190555050505050565b60025460009060ff1615612cf8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f586661695630436f72653a20504155534544000000000000000000000000000060448201526064016102e7565b827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612dae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f586661695630436f72653a20494e56414c49445f544f4b454e0000000000000060448201526064016102e7565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600360205260409020547ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01612e5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f586661695630436f72653a205245454e5452414e545f43414c4c00000000000060448201526064016102e7565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260036020526040812060029055612ed0857f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000061341c565b90506000808273ffffffffffffffffffffffffffffffffffffffff1663d8ab82746040518163ffffffff1660e01b81526004016040805180830381865afa158015612f1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f4391906145cc565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301529294509092506000918916906370a0823190602401602060405180830381865afa158015612fb8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fdc9190614532565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301529192506000917f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801561306e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130929190614532565b905060006130a085846145f0565b905060006130ae85846145f0565b905060008773ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156130fd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131219190614532565b9050806000036131da576103e861314061313b848661457a565b613d92565b61314a91906145f0565b6040517f40c10f19000000000000000000000000000000000000000000000000000000008152600060048201526103e86024820152909a5073ffffffffffffffffffffffffffffffffffffffff8916906340c10f1990604401600060405180830381600087803b1580156131bd57600080fd5b505af11580156131d1573d6000803e3d6000fd5b5050505061320f565b61320c876131e8838661457a565b6131f29190614591565b876131fd848661457a565b6132079190614591565b613e02565b99505b60008a1161329f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f586661695630436f72653a20494e53554646494349454e545f4c49515549444960448201527f54595f4d494e544544000000000000000000000000000000000000000000000060648201526084016102e7565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c81166004830152602482018c90528916906340c10f1990604401600060405180830381600087803b15801561330f57600080fd5b505af1158015613323573d6000803e3d6000fd5b50506040517f2fb565e8000000000000000000000000000000000000000000000000000000008152600481018890526024810187905273ffffffffffffffffffffffffffffffffffffffff8b169250632fb565e89150604401600060405180830381600087803b15801561339657600080fd5b505af11580156133aa573d6000803e3d6000fd5b50506040518c81523392507f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885915060200160405180910390a250505073ffffffffffffffffffffffffffffffffffffffff90951660009081526003602052604090206001905550939695505050505050565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606085901b166020820152600090839060340160405160208183030381529060405280519060200120836040516020016134da939291907fff00000000000000000000000000000000000000000000000000000000000000815260609390931b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830191909152603582015260550190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190528051602090910120949350505050565b60008060007f0000000000000000000000000000000000000000000000000000000000000000905060008790506000808273ffffffffffffffffffffffffffffffffffffffff1663d8ab82746040518163ffffffff1660e01b81526004016040805180830381865afa158015613592573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135b691906145cc565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8d811660048301529294509092506000918616906370a0823190602401602060405180830381865afa15801561362b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061364f9190614532565b905061365b82826145f0565b965087151560010361382257739b300a588daa518ab7738bf5b035e4bcb93d094f6352707d8c83858a61368c6116e5565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e087901b1681526004810194909452602484019290925260448301526064820152608401602060405180830381865af41580156136f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137169190614532565b95508373ffffffffffffffffffffffffffffffffffffffff1663341ce0cc7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006127106001548c613787919061457a565b6137919190614591565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815273ffffffffffffffffffffffffffffffffffffffff93841660048201529290911660248301526044820152606401600060405180830381600087803b15801561380557600080fd5b505af1158015613819573d6000803e3d6000fd5b50505050613830565b61382d878385613e1c565b95505b6040517f341ce0cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b811660048301528a811660248301526044820188905285169063341ce0cc90606401600060405180830381600087803b1580156138a857600080fd5b505af11580156138bc573d6000803e3d6000fd5b50506040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8e81166004830152881692506370a082319150602401602060405180830381865afa15801561392c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139509190614532565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8d811660048301529192506000918c16906370a0823190602401602060405180830381865afa1580156139c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139e69190614532565b6040517f2fb565e8000000000000000000000000000000000000000000000000000000008152600481018290526024810184905290915073ffffffffffffffffffffffffffffffffffffffff861690632fb565e890604401600060405180830381600087803b158015613a5857600080fd5b505af1158015613a6c573d6000803e3d6000fd5b5050505050505050505094509492505050565b6000807f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff80881690861603613b46576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f586661695630436f72653a20494e56414c49445f544f0000000000000000000060448201526064016102e7565b8573ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603613bdb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f586661695630436f72653a20494e56414c49445f544f0000000000000000000060448201526064016102e7565b8173ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614158015613c4357508173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614155b15613ccc576000613c7588837f000000000000000000000000000000000000000000000000000000000000000061341c565b90506000613ca488847f000000000000000000000000000000000000000000000000000000000000000061341c565b9050613cb1828a83613e44565b509550613cc18189896000613518565b9550613d8892505050565b8173ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1603613d47576000613d2c87837f000000000000000000000000000000000000000000000000000000000000000061341c565b9050613d3b8188886001613518565b9095509350613d889050565b6000613d7488837f000000000000000000000000000000000000000000000000000000000000000061341c565b9050613d81818988613e44565b9095509350505b5050935093915050565b60006003821115613df35750806000613dac600283614591565b613db7906001614603565b90505b81811015613ded57905080600281613dd28186614591565b613ddc9190614603565b613de69190614591565b9050613dba565b50919050565b8115613dfd575060015b919050565b6000818310613e115781613e13565b825b90505b92915050565b6000613e288484614603565b613e32838661457a565b613e3c9190614591565b949350505050565b60008060007f0000000000000000000000000000000000000000000000000000000000000000905060008690506000808273ffffffffffffffffffffffffffffffffffffffff1663d8ab82746040518163ffffffff1660e01b81526004016040805180830381865afa158015613ebe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ee291906145cc565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c811660048301529294509092506000918a16906370a0823190602401602060405180830381865afa158015613f57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f7b9190614532565b9050613f8783826145f0565b9650739b300a588daa518ab7738bf5b035e4bcb93d094f6352707d8c84848a613fae6116e5565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e087901b1681526004810194909452602484019290925260448301526064820152608401602060405180830381865af4158015614014573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140389190614532565b95508373ffffffffffffffffffffffffffffffffffffffff1663341ce0cc8a7f00000000000000000000000000000000000000000000000000000000000000006127106001548c614089919061457a565b6140939190614591565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815273ffffffffffffffffffffffffffffffffffffffff93841660048201529290911660248301526044820152606401600060405180830381600087803b15801561410757600080fd5b505af115801561411b573d6000803e3d6000fd5b50506040517f341ce0cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff88811660048301528b81166024830152604482018a90528716925063341ce0cc9150606401600060405180830381600087803b15801561419757600080fd5b505af11580156141ab573d6000803e3d6000fd5b50506040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8d8116600483015260009350881691506370a0823190602401602060405180830381865afa15801561421e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142429190614532565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8d81166004830152919250908b16906370a0823190602401602060405180830381865afa1580156142b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142d69190614532565b6040517f2fb565e8000000000000000000000000000000000000000000000000000000008152600481018290526024810183905290925073ffffffffffffffffffffffffffffffffffffffff861690632fb565e890604401600060405180830381600087803b15801561434857600080fd5b505af115801561435c573d6000803e3d6000fd5b50505050505050505050935093915050565b60006020828403121561438057600080fd5b8135801515811461439057600080fd5b9392505050565b73ffffffffffffffffffffffffffffffffffffffff811681146143b957600080fd5b50565b6000806000606084860312156143d157600080fd5b83356143dc81614397565b925060208401356143ec81614397565b915060408401356143fc81614397565b809150509250925092565b6000806040838503121561441a57600080fd5b823561442581614397565b9150602083013561443581614397565b809150509250929050565b60006020828403121561445257600080fd5b5035919050565b60006020828403121561446b57600080fd5b813561439081614397565b60008060008060006080868803121561448e57600080fd5b853561449981614397565b94506020860135935060408601356144b081614397565b9250606086013567ffffffffffffffff808211156144cd57600080fd5b818801915088601f8301126144e157600080fd5b8135818111156144f057600080fd5b89602082850101111561450257600080fd5b9699959850939650602001949392505050565b60006020828403121561452757600080fd5b815161439081614397565b60006020828403121561454457600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082028115828204841417613e1657613e1661454b565b6000826145c7577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600080604083850312156145df57600080fd5b505080516020909101519092909150565b81810381811115613e1657613e1661454b565b80820180821115613e1657613e1661454b565b73ffffffffffffffffffffffffffffffffffffffff8516815283602082015260606040820152816060820152818360808301376000818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160101939250505056fea2646970667358221220a343c5365a1df5ea8c7852c4ff70e78c79f05192fc77bf35e978cb277010c45664736f6c634300081300330000000000000000000000000b51d00ef3df0b66766938220542185f6fdbc0b7000000000000000000000000d58bcb63b33d5f6984da687de2e5b8c61bb0c421000000000000000000000000a449845c3309ac5269dfa6b2f80eb6e73d0ae021000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000a

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106100d45760003560e01c8063917c060e11610081578063a58411941161005b578063a58411941461018f578063adf51de1146101a2578063ee1fe2ad146101b557600080fd5b8063917c060e146101605780639246f76a14610169578063933162121461017c57600080fd5b8063712b772f116100b2578063712b772f146101325780637ae316d014610145578063890305d31461014d57600080fd5b806302329a29146100d957806345a11cec146100ee578063704ce43e1461011b575b600080fd5b6100ec6100e736600461436e565b6101c8565b005b6101016100fc3660046143bc565b610356565b604080519283526020830191909152015b60405180910390f35b61012460005481565b604051908152602001610112565b6100ec610140366004614407565b61115e565b6101246116e5565b6100ec61015b366004614440565b6116fb565b61012460015481565b6100ec610177366004614440565b6118cb565b61010161018a3660046143bc565b611a9b565b6100ec61019d366004614459565b611e71565b6100ec6101b0366004614476565b6122bc565b6101246101c3366004614407565b612c88565b7f0000000000000000000000000b51d00ef3df0b66766938220542185f6fdbc0b773ffffffffffffffffffffffffffffffffffffffff1663893d20e86040518163ffffffff1660e01b8152600401602060405180830381865afa158015610233573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102579190614515565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146102f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f586661695630436f72653a204e4f545f4f574e4552000000000000000000000060448201526064015b60405180910390fd5b600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168215159081179091556040519081527f0e2fb031ee032dc02d8011dc50b816eb450cf856abd8261680dac74f72165bd2906020015b60405180910390a150565b600254600090819060ff16156103c8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f586661695630436f72653a20504155534544000000000000000000000000000060448201526064016102e7565b73ffffffffffffffffffffffffffffffffffffffff8516600090815260036020526040902054859085907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0161047a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f586661695630436f72653a205245454e5452414e545f43414c4c00000000000060448201526064016102e7565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600360205260409020547ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01610528576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f586661695630436f72653a205245454e5452414e545f43414c4c00000000000060448201526064016102e7565b8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036105bd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f586661695630436f72653a204944454e544943414c5f504f4f4c53000000000060448201526064016102e7565b7f000000000000000000000000a449845c3309ac5269dfa6b2f80eb6e73d0ae02173ffffffffffffffffffffffffffffffffffffffff838116908216146106285773ffffffffffffffffffffffffffffffffffffffff83166000908152600360205260409020600290555b8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146106855773ffffffffffffffffffffffffffffffffffffffff82166000908152600360205260409020600290555b7f000000000000000000000000a449845c3309ac5269dfa6b2f80eb6e73d0ae02173ffffffffffffffffffffffffffffffffffffffff808216908a160361074e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f586661695630436f72653a20494e56414c49445f5052494d4152595f544f4b4560448201527f4e0000000000000000000000000000000000000000000000000000000000000060648201526084016102e7565b600061079b8a7f0000000000000000000000000b51d00ef3df0b66766938220542185f6fdbc0b77f8f92f7e5e633cf0e16777f0f3dd2fc7041871898f9f7cbb26929a0be81e7923c61341c565b905060006107ea8a7f0000000000000000000000000b51d00ef3df0b66766938220542185f6fdbc0b77f8f92f7e5e633cf0e16777f0f3dd2fc7041871898f9f7cbb26929a0be81e7923c61341c565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290915060009073ffffffffffffffffffffffffffffffffffffffff8416906370a0823190602401602060405180830381865afa15801561085a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061087e9190614532565b905060008373ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108f19190614532565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015291925082918f16906370a0823190602401602060405180830381865afa158015610962573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109869190614532565b610990908461457a565b61099a9190614591565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8681166004830152919b5082918716906370a0823190602401602060405180830381865afa158015610a0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a2f9190614532565b610a39908461457a565b610a439190614591565b985060008a118015610a555750600089115b610ae1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f586661695630436f72653a20494e53554646494349454e545f4c49515549444960448201527f54595f4255524e4544000000000000000000000000000000000000000000000060648201526084016102e7565b6040517f341ce0cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8e811660048301528c81166024830152604482018c905285169063341ce0cc90606401600060405180830381600087803b158015610b5957600080fd5b505af1158015610b6d573d6000803e3d6000fd5b505050508473ffffffffffffffffffffffffffffffffffffffff168c73ffffffffffffffffffffffffffffffffffffffff1603610de9576040517f341ce0cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301528c81166024830152604482018b905285169063341ce0cc90606401600060405180830381600087803b158015610c1c57600080fd5b505af1158015610c30573d6000803e3d6000fd5b505050508373ffffffffffffffffffffffffffffffffffffffff16632fb565e88e73ffffffffffffffffffffffffffffffffffffffff166370a08231876040518263ffffffff1660e01b8152600401610ca5919073ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b602060405180830381865afa158015610cc2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ce69190614532565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff88811660048301528916906370a0823190602401602060405180830381865afa158015610d52573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d769190614532565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815260048101929092526024820152604401600060405180830381600087803b158015610dcc57600080fd5b505af1158015610de0573d6000803e3d6000fd5b5050505061103a565b6040517f341ce0cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301528481166024830152604482018b905285169063341ce0cc90606401600060405180830381600087803b158015610e6157600080fd5b505af1158015610e75573d6000803e3d6000fd5b505050508373ffffffffffffffffffffffffffffffffffffffff16632fb565e88e73ffffffffffffffffffffffffffffffffffffffff166370a08231876040518263ffffffff1660e01b8152600401610eea919073ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b602060405180830381865afa158015610f07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f2b9190614532565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff88811660048301528916906370a0823190602401602060405180830381865afa158015610f97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fbb9190614532565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815260048101929092526024820152604401600060405180830381600087803b15801561101157600080fd5b505af1158015611025573d6000803e3d6000fd5b50505050611036838d8d6001613518565b9950505b6040517f9dc29fac0000000000000000000000000000000000000000000000000000000081523060048201526024810183905273ffffffffffffffffffffffffffffffffffffffff851690639dc29fac90604401600060405180830381600087803b1580156110a857600080fd5b505af11580156110bc573d6000803e3d6000fd5b5050604080518d8152602081018d905273ffffffffffffffffffffffffffffffffffffffff8f1693503392507fdccd412f0b1252819cb1fd330b93224ca42612892bb3f4f789976e6d81936496910160405180910390a35050505073ffffffffffffffffffffffffffffffffffffffff938416600090815260036020526040808220600190819055949095168152939093209190915550919590945092505050565b60025460ff16156111cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f586661695630436f72653a20504155534544000000000000000000000000000060448201526064016102e7565b817f000000000000000000000000a449845c3309ac5269dfa6b2f80eb6e73d0ae02173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611281576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f586661695630436f72653a20494e56414c49445f544f4b454e0000000000000060448201526064016102e7565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600360205260409020547ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0161132f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f586661695630436f72653a205245454e5452414e545f43414c4c00000000000060448201526064016102e7565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600360205260408120600290557f000000000000000000000000a449845c3309ac5269dfa6b2f80eb6e73d0ae021906113c5857f0000000000000000000000000b51d00ef3df0b66766938220542185f6fdbc0b77f8f92f7e5e633cf0e16777f0f3dd2fc7041871898f9f7cbb26929a0be81e7923c61341c565b90506000808273ffffffffffffffffffffffffffffffffffffffff1663d8ab82746040518163ffffffff1660e01b81526004016040805180830381865afa158015611414573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061143891906145cc565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301529294509092506000918491908a16906370a0823190602401602060405180830381865afa1580156114b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114d49190614532565b6114de91906145f0565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301529192506000918491908816906370a0823190602401602060405180830381865afa158015611553573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115779190614532565b61158191906145f0565b9050811561161a576040517f341ce0cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a8116600483015289811660248301526044820184905286169063341ce0cc90606401600060405180830381600087803b15801561160157600080fd5b505af1158015611615573d6000803e3d6000fd5b505050505b80156116b1576040517f341ce0cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff878116600483015289811660248301526044820183905286169063341ce0cc90606401600060405180830381600087803b15801561169857600080fd5b505af11580156116ac573d6000803e3d6000fd5b505050505b50505073ffffffffffffffffffffffffffffffffffffffff9093166000908152600360205260409020600190555050505050565b600080546001546116f69190614603565b905090565b7f0000000000000000000000000b51d00ef3df0b66766938220542185f6fdbc0b773ffffffffffffffffffffffffffffffffffffffff1663893d20e86040518163ffffffff1660e01b8152600401602060405180830381865afa158015611766573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061178a9190614515565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461181e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f586661695630436f72653a204e4f545f4f574e4552000000000000000000000060448201526064016102e7565b60646001548261182e9190614603565b1115611896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f586661695630436f72653a204645455f455843454544535f4c494d495400000060448201526064016102e7565b60008190556040518181527f6dd92a0ab9d55ea4d1c74eccd145752cd4a8b993732f2b1ba98a9c2a674cc17a9060200161034b565b7f0000000000000000000000000b51d00ef3df0b66766938220542185f6fdbc0b773ffffffffffffffffffffffffffffffffffffffff1663893d20e86040518163ffffffff1660e01b8152600401602060405180830381865afa158015611936573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061195a9190614515565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146119ee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f586661695630436f72653a204e4f545f4f574e4552000000000000000000000060448201526064016102e7565b6064816000546119fe9190614603565b1115611a66576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f586661695630436f72653a204645455f455843454544535f4c494d495400000060448201526064016102e7565b60018190556040518181527f16614206cdcb6d0d0b4c49641090b66d8bb3a213d268188947929d52c18990489060200161034b565b600254600090819060ff1615611b0d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f586661695630436f72653a20504155534544000000000000000000000000000060448201526064016102e7565b73ffffffffffffffffffffffffffffffffffffffff8516600090815260036020526040902054859085907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01611bbf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f586661695630436f72653a205245454e5452414e545f43414c4c00000000000060448201526064016102e7565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600360205260409020547ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01611c6d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f586661695630436f72653a205245454e5452414e545f43414c4c00000000000060448201526064016102e7565b8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611d02576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f586661695630436f72653a204944454e544943414c5f504f4f4c53000000000060448201526064016102e7565b7f000000000000000000000000a449845c3309ac5269dfa6b2f80eb6e73d0ae02173ffffffffffffffffffffffffffffffffffffffff83811690821614611d6d5773ffffffffffffffffffffffffffffffffffffffff83166000908152600360205260409020600290555b8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611dca5773ffffffffffffffffffffffffffffffffffffffff82166000908152600360205260409020600290555b611dd5888888613a7f565b604080518381526020810183905292975090955073ffffffffffffffffffffffffffffffffffffffff88169133917f2a9237ff5aa599ef4c5ee4b1142b53429d5755e2685fe6288b2e3320202115f5910160405180910390a35073ffffffffffffffffffffffffffffffffffffffff91821660009081526003602052604080822060019081905592909316815291909120559094909350915050565b60025460ff1615611ede576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f586661695630436f72653a20504155534544000000000000000000000000000060448201526064016102e7565b807f000000000000000000000000a449845c3309ac5269dfa6b2f80eb6e73d0ae02173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611f94576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f586661695630436f72653a20494e56414c49445f544f4b454e0000000000000060448201526064016102e7565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600360205260409020547ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01612042576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f586661695630436f72653a205245454e5452414e545f43414c4c00000000000060448201526064016102e7565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600360205260408120600290556120b6837f0000000000000000000000000b51d00ef3df0b66766938220542185f6fdbc0b77f8f92f7e5e633cf0e16777f0f3dd2fc7041871898f9f7cbb26929a0be81e7923c61341c565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff80831660048301529192506000918516906370a0823190602401602060405180830381865afa158015612128573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061214c9190614532565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301529192506000917f000000000000000000000000a449845c3309ac5269dfa6b2f80eb6e73d0ae02116906370a0823190602401602060405180830381865afa1580156121de573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122029190614532565b6040517f2fb565e8000000000000000000000000000000000000000000000000000000008152600481018490526024810182905290915073ffffffffffffffffffffffffffffffffffffffff841690632fb565e890604401600060405180830381600087803b15801561227457600080fd5b505af1158015612288573d6000803e3d6000fd5b50505073ffffffffffffffffffffffffffffffffffffffff9094166000908152600360205260409020600190555050505050565b60025460ff1615612329576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f586661695630436f72653a20504155534544000000000000000000000000000060448201526064016102e7565b847f000000000000000000000000a449845c3309ac5269dfa6b2f80eb6e73d0ae02173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036123df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f586661695630436f72653a20494e56414c49445f544f4b454e0000000000000060448201526064016102e7565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600360205260409020547ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0161248d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f586661695630436f72653a205245454e5452414e545f43414c4c00000000000060448201526064016102e7565b73ffffffffffffffffffffffffffffffffffffffff808216600090815260036020526040902060029055841661251f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f586661695630436f726520494e56414c49445f544f000000000000000000000060448201526064016102e7565b600061256c877f0000000000000000000000000b51d00ef3df0b66766938220542185f6fdbc0b77f8f92f7e5e633cf0e16777f0f3dd2fc7041871898f9f7cbb26929a0be81e7923c61341c565b905060008173ffffffffffffffffffffffffffffffffffffffff1663d8ab82746040518163ffffffff1660e01b81526004016040805180830381865afa1580156125ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125de91906145cc565b50905080871115612671576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f586661695630436f72653a20494e53554646494349454e545f4f55545055545f60448201527f414d4f554e54000000000000000000000000000000000000000000000000000060648201526084016102e7565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152600091908a16906370a0823190602401602060405180830381865afa1580156126e1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127059190614532565b6040517f341ce0cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b811660048301528981166024830152604482018b90529192509084169063341ce0cc90606401600060405180830381600087803b15801561278157600080fd5b505af1158015612795573d6000803e3d6000fd5b50506040517fe0232b4200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a16925063e0232b4291506127f19086908c908b908b90600401614616565b600060405180830381600087803b15801561280b57600080fd5b505af115801561281f573d6000803e3d6000fd5b5050505061271061282e6116e5565b612838908a61457a565b6128429190614591565b61284c9082614603565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301528b16906370a0823190602401602060405180830381865afa1580156128b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128dc9190614532565b101561296a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f586661695630436f72653a20494e53554646494349454e545f414d4f554e545f60448201527f52455455524e454400000000000000000000000000000000000000000000000060648201526084016102e7565b8273ffffffffffffffffffffffffffffffffffffffff1663341ce0cc8a7f000000000000000000000000d58bcb63b33d5f6984da687de2e5b8c61bb0c4216127106001548d6129b9919061457a565b6129c39190614591565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815273ffffffffffffffffffffffffffffffffffffffff93841660048201529290911660248301526044820152606401600060405180830381600087803b158015612a3757600080fd5b505af1158015612a4b573d6000803e3d6000fd5b50506040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff808716600483018190529350632fb565e892508c16906370a0823190602401602060405180830381865afa158015612ac4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ae89190614532565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff87811660048301527f000000000000000000000000a449845c3309ac5269dfa6b2f80eb6e73d0ae02116906370a0823190602401602060405180830381865afa158015612b74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b989190614532565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815260048101929092526024820152604401600060405180830381600087803b158015612bee57600080fd5b505af1158015612c02573d6000803e3d6000fd5b505050508673ffffffffffffffffffffffffffffffffffffffff167f134bde118562a60dcf2d8c52965f586e25cf88a371592e44b78c4aa03bcbac8489604051612c4e91815260200190565b60405180910390a250505073ffffffffffffffffffffffffffffffffffffffff166000908152600360205260409020600190555050505050565b60025460009060ff1615612cf8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f586661695630436f72653a20504155534544000000000000000000000000000060448201526064016102e7565b827f000000000000000000000000a449845c3309ac5269dfa6b2f80eb6e73d0ae02173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612dae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f586661695630436f72653a20494e56414c49445f544f4b454e0000000000000060448201526064016102e7565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600360205260409020547ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01612e5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f586661695630436f72653a205245454e5452414e545f43414c4c00000000000060448201526064016102e7565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260036020526040812060029055612ed0857f0000000000000000000000000b51d00ef3df0b66766938220542185f6fdbc0b77f8f92f7e5e633cf0e16777f0f3dd2fc7041871898f9f7cbb26929a0be81e7923c61341c565b90506000808273ffffffffffffffffffffffffffffffffffffffff1663d8ab82746040518163ffffffff1660e01b81526004016040805180830381865afa158015612f1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f4391906145cc565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301529294509092506000918916906370a0823190602401602060405180830381865afa158015612fb8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fdc9190614532565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301529192506000917f000000000000000000000000a449845c3309ac5269dfa6b2f80eb6e73d0ae02116906370a0823190602401602060405180830381865afa15801561306e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130929190614532565b905060006130a085846145f0565b905060006130ae85846145f0565b905060008773ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156130fd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131219190614532565b9050806000036131da576103e861314061313b848661457a565b613d92565b61314a91906145f0565b6040517f40c10f19000000000000000000000000000000000000000000000000000000008152600060048201526103e86024820152909a5073ffffffffffffffffffffffffffffffffffffffff8916906340c10f1990604401600060405180830381600087803b1580156131bd57600080fd5b505af11580156131d1573d6000803e3d6000fd5b5050505061320f565b61320c876131e8838661457a565b6131f29190614591565b876131fd848661457a565b6132079190614591565b613e02565b99505b60008a1161329f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f586661695630436f72653a20494e53554646494349454e545f4c49515549444960448201527f54595f4d494e544544000000000000000000000000000000000000000000000060648201526084016102e7565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c81166004830152602482018c90528916906340c10f1990604401600060405180830381600087803b15801561330f57600080fd5b505af1158015613323573d6000803e3d6000fd5b50506040517f2fb565e8000000000000000000000000000000000000000000000000000000008152600481018890526024810187905273ffffffffffffffffffffffffffffffffffffffff8b169250632fb565e89150604401600060405180830381600087803b15801561339657600080fd5b505af11580156133aa573d6000803e3d6000fd5b50506040518c81523392507f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885915060200160405180910390a250505073ffffffffffffffffffffffffffffffffffffffff90951660009081526003602052604090206001905550939695505050505050565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606085901b166020820152600090839060340160405160208183030381529060405280519060200120836040516020016134da939291907fff00000000000000000000000000000000000000000000000000000000000000815260609390931b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830191909152603582015260550190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190528051602090910120949350505050565b60008060007f000000000000000000000000a449845c3309ac5269dfa6b2f80eb6e73d0ae021905060008790506000808273ffffffffffffffffffffffffffffffffffffffff1663d8ab82746040518163ffffffff1660e01b81526004016040805180830381865afa158015613592573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135b691906145cc565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8d811660048301529294509092506000918616906370a0823190602401602060405180830381865afa15801561362b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061364f9190614532565b905061365b82826145f0565b965087151560010361382257739b300a588daa518ab7738bf5b035e4bcb93d094f6352707d8c83858a61368c6116e5565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e087901b1681526004810194909452602484019290925260448301526064820152608401602060405180830381865af41580156136f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137169190614532565b95508373ffffffffffffffffffffffffffffffffffffffff1663341ce0cc7f000000000000000000000000a449845c3309ac5269dfa6b2f80eb6e73d0ae0217f000000000000000000000000d58bcb63b33d5f6984da687de2e5b8c61bb0c4216127106001548c613787919061457a565b6137919190614591565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815273ffffffffffffffffffffffffffffffffffffffff93841660048201529290911660248301526044820152606401600060405180830381600087803b15801561380557600080fd5b505af1158015613819573d6000803e3d6000fd5b50505050613830565b61382d878385613e1c565b95505b6040517f341ce0cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b811660048301528a811660248301526044820188905285169063341ce0cc90606401600060405180830381600087803b1580156138a857600080fd5b505af11580156138bc573d6000803e3d6000fd5b50506040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8e81166004830152881692506370a082319150602401602060405180830381865afa15801561392c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139509190614532565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8d811660048301529192506000918c16906370a0823190602401602060405180830381865afa1580156139c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139e69190614532565b6040517f2fb565e8000000000000000000000000000000000000000000000000000000008152600481018290526024810184905290915073ffffffffffffffffffffffffffffffffffffffff861690632fb565e890604401600060405180830381600087803b158015613a5857600080fd5b505af1158015613a6c573d6000803e3d6000fd5b5050505050505050505094509492505050565b6000807f000000000000000000000000a449845c3309ac5269dfa6b2f80eb6e73d0ae0217f0000000000000000000000000b51d00ef3df0b66766938220542185f6fdbc0b773ffffffffffffffffffffffffffffffffffffffff80881690861603613b46576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f586661695630436f72653a20494e56414c49445f544f0000000000000000000060448201526064016102e7565b8573ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603613bdb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f586661695630436f72653a20494e56414c49445f544f0000000000000000000060448201526064016102e7565b8173ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614158015613c4357508173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614155b15613ccc576000613c7588837f8f92f7e5e633cf0e16777f0f3dd2fc7041871898f9f7cbb26929a0be81e7923c61341c565b90506000613ca488847f8f92f7e5e633cf0e16777f0f3dd2fc7041871898f9f7cbb26929a0be81e7923c61341c565b9050613cb1828a83613e44565b509550613cc18189896000613518565b9550613d8892505050565b8173ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1603613d47576000613d2c87837f8f92f7e5e633cf0e16777f0f3dd2fc7041871898f9f7cbb26929a0be81e7923c61341c565b9050613d3b8188886001613518565b9095509350613d889050565b6000613d7488837f8f92f7e5e633cf0e16777f0f3dd2fc7041871898f9f7cbb26929a0be81e7923c61341c565b9050613d81818988613e44565b9095509350505b5050935093915050565b60006003821115613df35750806000613dac600283614591565b613db7906001614603565b90505b81811015613ded57905080600281613dd28186614591565b613ddc9190614603565b613de69190614591565b9050613dba565b50919050565b8115613dfd575060015b919050565b6000818310613e115781613e13565b825b90505b92915050565b6000613e288484614603565b613e32838661457a565b613e3c9190614591565b949350505050565b60008060007f000000000000000000000000a449845c3309ac5269dfa6b2f80eb6e73d0ae021905060008690506000808273ffffffffffffffffffffffffffffffffffffffff1663d8ab82746040518163ffffffff1660e01b81526004016040805180830381865afa158015613ebe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ee291906145cc565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c811660048301529294509092506000918a16906370a0823190602401602060405180830381865afa158015613f57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f7b9190614532565b9050613f8783826145f0565b9650739b300a588daa518ab7738bf5b035e4bcb93d094f6352707d8c84848a613fae6116e5565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e087901b1681526004810194909452602484019290925260448301526064820152608401602060405180830381865af4158015614014573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140389190614532565b95508373ffffffffffffffffffffffffffffffffffffffff1663341ce0cc8a7f000000000000000000000000d58bcb63b33d5f6984da687de2e5b8c61bb0c4216127106001548c614089919061457a565b6140939190614591565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815273ffffffffffffffffffffffffffffffffffffffff93841660048201529290911660248301526044820152606401600060405180830381600087803b15801561410757600080fd5b505af115801561411b573d6000803e3d6000fd5b50506040517f341ce0cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff88811660048301528b81166024830152604482018a90528716925063341ce0cc9150606401600060405180830381600087803b15801561419757600080fd5b505af11580156141ab573d6000803e3d6000fd5b50506040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8d8116600483015260009350881691506370a0823190602401602060405180830381865afa15801561421e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142429190614532565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8d81166004830152919250908b16906370a0823190602401602060405180830381865afa1580156142b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142d69190614532565b6040517f2fb565e8000000000000000000000000000000000000000000000000000000008152600481018290526024810183905290925073ffffffffffffffffffffffffffffffffffffffff861690632fb565e890604401600060405180830381600087803b15801561434857600080fd5b505af115801561435c573d6000803e3d6000fd5b50505050505050505050935093915050565b60006020828403121561438057600080fd5b8135801515811461439057600080fd5b9392505050565b73ffffffffffffffffffffffffffffffffffffffff811681146143b957600080fd5b50565b6000806000606084860312156143d157600080fd5b83356143dc81614397565b925060208401356143ec81614397565b915060408401356143fc81614397565b809150509250925092565b6000806040838503121561441a57600080fd5b823561442581614397565b9150602083013561443581614397565b809150509250929050565b60006020828403121561445257600080fd5b5035919050565b60006020828403121561446b57600080fd5b813561439081614397565b60008060008060006080868803121561448e57600080fd5b853561449981614397565b94506020860135935060408601356144b081614397565b9250606086013567ffffffffffffffff808211156144cd57600080fd5b818801915088601f8301126144e157600080fd5b8135818111156144f057600080fd5b89602082850101111561450257600080fd5b9699959850939650602001949392505050565b60006020828403121561452757600080fd5b815161439081614397565b60006020828403121561454457600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082028115828204841417613e1657613e1661454b565b6000826145c7577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600080604083850312156145df57600080fd5b505080516020909101519092909150565b81810381811115613e1657613e1661454b565b80820180821115613e1657613e1661454b565b73ffffffffffffffffffffffffffffffffffffffff8516815283602082015260606040820152816060820152818360808301376000818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160101939250505056fea2646970667358221220a343c5365a1df5ea8c7852c4ff70e78c79f05192fc77bf35e978cb277010c45664736f6c63430008130033

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

0000000000000000000000000b51d00ef3df0b66766938220542185f6fdbc0b7000000000000000000000000d58bcb63b33d5f6984da687de2e5b8c61bb0c421000000000000000000000000a449845c3309ac5269dfa6b2f80eb6e73d0ae021000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000a

-----Decoded View---------------
Arg [0] : _factory (address): 0x0b51D00eF3Df0B66766938220542185F6fDbC0B7
Arg [1] : _infinityNFT (address): 0xd58BCB63b33D5F6984DA687DE2e5B8c61bB0c421
Arg [2] : _xfETH (address): 0xa449845c3309ac5269DFA6b2F80eb6E73D0AE021
Arg [3] : _lpFee (uint256): 10
Arg [4] : _infinityNFTFee (uint256): 10

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000b51d00ef3df0b66766938220542185f6fdbc0b7
Arg [1] : 000000000000000000000000d58bcb63b33d5f6984da687de2e5b8c61bb0c421
Arg [2] : 000000000000000000000000a449845c3309ac5269dfa6b2f80eb6e73d0ae021
Arg [3] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [4] : 000000000000000000000000000000000000000000000000000000000000000a


Libraries Used


Deployed Bytecode Sourcemap

386:14830:8:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15119:95;;;;;;:::i;:::-;;:::i;:::-;;10329:1522;;;;;;:::i;:::-;;:::i;:::-;;;;1159:25:9;;;1215:2;1200:18;;1193:34;;;;1132:18;10329:1522:8;;;;;;;;772:26;;;;;;;;;1384:25:9;;;1372:2;1357:18;772:26:8;1238:177:9;13702:617:8;;;;;;:::i;:::-;;:::i;4198:99::-;;;:::i;3354:211::-;;;;;;:::i;:::-;;:::i;869:35::-;;;;;;3770:237;;;;;;:::i;:::-;;:::i;7561:317::-;;;;;;:::i;:::-;;:::i;14558:319::-;;;;;;:::i;:::-;;:::i;12391:1030::-;;;;;;:::i;:::-;;:::i;8496:1054::-;;;;;;:::i;:::-;;:::i;15119:95::-;2414:7;2401:30;;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2387:46;;:10;:46;;;2379:80;;;;;;;3649:2:9;2379:80:8;;;3631:21:9;3688:2;3668:18;;;3661:30;3727:23;3707:18;;;3700:51;3768:18;;2379:80:8;;;;;;;;;15177:6:::1;:11:::0;;;::::1;::::0;::::1;;::::0;;::::1;::::0;;;15199:10:::1;::::0;3937:41:9;;;15199:10:8::1;::::0;3925:2:9;3910:18;15199:10:8::1;;;;;;;;15119:95:::0;:::o;10329:1522::-;2298:6;;10491:15;;;;2298:6;;:15;2290:46;;;;;;;4191:2:9;2290:46:8;;;4173:21:9;4230:2;4210:18;;;4203:30;4269:20;4249:18;;;4242:48;4307:18;;2290:46:8;3989:342:9;2290:46:8;1810:17:::1;::::0;::::1;;::::0;;;:8:::1;:17;::::0;;;;;10460:7;;10469;;1810:28;;1802:67:::1;;;::::0;::::1;::::0;;4538:2:9;1802:67:8::1;::::0;::::1;4520:21:9::0;4577:2;4557:18;;;4550:30;4616:28;4596:18;;;4589:56;4662:18;;1802:67:8::1;4336:350:9::0;1802:67:8::1;1883:17;::::0;::::1;;::::0;;;:8:::1;:17;::::0;;;;;:28;;1875:67:::1;;;::::0;::::1;::::0;;4538:2:9;1875:67:8::1;::::0;::::1;4520:21:9::0;4577:2;4557:18;;;4550:30;4616:28;4596:18;;;4589:56;4662:18;;1875:67:8::1;4336:350:9::0;1875:67:8::1;1967:7;1956:18;;:7;:18;;::::0;1948:58:::1;;;::::0;::::1;::::0;;4893:2:9;1948:58:8::1;::::0;::::1;4875:21:9::0;4932:2;4912:18;;;4905:30;4971:29;4951:18;;;4944:57;5018:18;;1948:58:8::1;4691:351:9::0;1948:58:8::1;2029:5;2044:17;::::0;;::::1;::::0;;::::1;;2040:65;;2071:17;::::0;::::1;;::::0;;;:8:::1;:17;::::0;;;;1021:1:::1;2071:27:::0;;2040:65:::1;2125:6;2114:17;;:7;:17;;;2110:65;;2141:17;::::0;::::1;;::::0;;;:8:::1;:17;::::0;;;;1021:1:::1;2141:27:::0;;2110:65:::1;10550:5:::2;10583:17;::::0;;::::2;::::0;;::::2;::::0;10575:63:::2;;;::::0;::::2;::::0;;5249:2:9;10575:63:8::2;::::0;::::2;5231:21:9::0;5288:2;5268:18;;;5261:30;5327:34;5307:18;;;5300:62;5398:3;5378:18;;;5371:31;5419:19;;10575:63:8::2;5047:397:9::0;10575:63:8::2;10644:13;10660:51;10680:7;10689;10698:12;10660:19;:51::i;:::-;10644:67;;10717:13;10733:51;10753:7;10762;10771:12;10733:19;:51::i;:::-;10807:38;::::0;;;;10839:4:::2;10807:38;::::0;::::2;5595:74:9::0;10717:67:8;;-1:-1:-1;10790:14:8::2;::::0;10807:23:::2;::::0;::::2;::::0;::::2;::::0;5568:18:9;;10807:38:8::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10790:55;;10851:16;10877:5;10870:25;;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10929:32;::::0;;;;:25:::2;5613:55:9::0;;;10929:32:8::2;::::0;::::2;5595:74:9::0;10851:46:8;;-1:-1:-1;10851:46:8;;10929:25;::::2;::::0;::::2;::::0;5568:18:9;;10929:32:8::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10917:44;::::0;:9;:44:::2;:::i;:::-;10916:60;;;;:::i;:::-;11056:31;::::0;;;;:24:::2;5613:55:9::0;;;11056:31:8::2;::::0;::::2;5595:74:9::0;10903:73:8;;-1:-1:-1;11091:11:8;;11056:24;::::2;::::0;::::2;::::0;5568:18:9;;11056:31:8::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11044:43;::::0;:9;:43:::2;:::i;:::-;11043:59;;;;:::i;:::-;11030:72;;11177:1;11164:10;:14;:32;;;;;11195:1;11182:10;:14;11164:32;11156:86;;;::::0;::::2;::::0;;6712:2:9;11156:86:8::2;::::0;::::2;6694:21:9::0;6751:2;6731:18;;;6724:30;6790:34;6770:18;;;6763:62;6861:11;6841:18;;;6834:39;6890:19;;11156:86:8::2;6510:405:9::0;11156:86:8::2;11248:57;::::0;;;;:31:::2;7201:15:9::0;;;11248:57:8::2;::::0;::::2;7183:34:9::0;7253:15;;;7233:18;;;7226:43;7285:18;;;7278:34;;;11248:31:8;::::2;::::0;::::2;::::0;7095:18:9;;11248:57:8::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;11326:6;11315:17;;:7;:17;;::::0;11311:427:::2;;11342:56;::::0;;;;:31:::2;7201:15:9::0;;;11342:56:8::2;::::0;::::2;7183:34:9::0;7253:15;;;7233:18;;;7226:43;7285:18;;;7278:34;;;11342:31:8;::::2;::::0;::::2;::::0;7095:18:9;;11342:56:8::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;11416:5;11406:23;;;11437:7;11430:25;;;11456:5;11430:32;;;;;;;;;;;;;;5625:42:9::0;5613:55;;;;5595:74;;5583:2;5568:18;;5449:226;11430:32:8::2;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11464:31;::::0;;;;:24:::2;5613:55:9::0;;;11464:31:8::2;::::0;::::2;5595:74:9::0;11464:24:8;::::2;::::0;::::2;::::0;5568:18:9;;11464:31:8::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11406:90;::::0;;::::2;::::0;;;;;;::::2;::::0;::::2;1159:25:9::0;;;;1200:18;;;1193:34;1132:18;;11406:90:8::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;11311:427;;;11517:58;::::0;;;;:31:::2;7201:15:9::0;;;11517:58:8::2;::::0;::::2;7183:34:9::0;7253:15;;;7233:18;;;7226:43;7285:18;;;7278:34;;;11517:31:8;::::2;::::0;::::2;::::0;7095:18:9;;11517:58:8::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;11593:5;11583:23;;;11614:7;11607:25;;;11633:5;11607:32;;;;;;;;;;;;;;5625:42:9::0;5613:55;;;;5595:74;;5583:2;5568:18;;5449:226;11607:32:8::2;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11641:31;::::0;;;;:24:::2;5613:55:9::0;;;11641:31:8::2;::::0;::::2;5595:74:9::0;11641:24:8;::::2;::::0;::::2;::::0;5568:18:9;;11641:31:8::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11583:90;::::0;;::::2;::::0;;;;;;::::2;::::0;::::2;1159:25:9::0;;;;1200:18;;;1193:34;1132:18;;11583:90:8::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;11698:33;11705:5;11712:7;11721:3;11726:4;11698:6;:33::i;:::-;11681:50:::0;-1:-1:-1;;11311:427:8::2;11743:47;::::0;;;;11773:4:::2;11743:47;::::0;::::2;7497:74:9::0;7587:18;;;7580:34;;;11743:21:8::2;::::0;::::2;::::0;::::2;::::0;7470:18:9;;11743:47:8::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;11801:45:8::2;::::0;;1159:25:9;;;1215:2;1200:18;;1193:34;;;11801:45:8::2;::::0;::::2;::::0;-1:-1:-1;11806:10:8::2;::::0;-1:-1:-1;11801:45:8::2;::::0;1132:18:9;11801:45:8::2;;;;;;;-1:-1:-1::0;;;;2187:17:8::1;::::0;;::::1;;::::0;;;:8:::1;:17;::::0;;;;;984:1:::1;2187:31:::0;;;;2224:17;;;::::1;::::0;;;;;;:31;;;;-1:-1:-1;10329:1522:8;;;;-1:-1:-1;10329:1522:8;-1:-1:-1;;;10329:1522:8:o;13702:617::-;2298:6;;;;:15;2290:46;;;;;;;4191:2:9;2290:46:8;;;4173:21:9;4230:2;4210:18;;;4203:30;4269:20;4249:18;;;4242:48;4307:18;;2290:46:8;3989:342:9;2290:46:8;13783:6:::1;1551:5;1541:15;;:6;:15;;::::0;1533:53:::1;;;::::0;::::1;::::0;;7827:2:9;1533:53:8::1;::::0;::::1;7809:21:9::0;7866:2;7846:18;;;7839:30;7905:27;7885:18;;;7878:55;7950:18;;1533:53:8::1;7625:349:9::0;1533:53:8::1;1600:16;::::0;::::1;;::::0;;;:8:::1;:16;::::0;;;;;:27;;1592:66:::1;;;::::0;::::1;::::0;;4538:2:9;1592:66:8::1;::::0;::::1;4520:21:9::0;4577:2;4557:18;;;4550:30;4616:28;4596:18;;;4589:56;4662:18;;1592:66:8::1;4336:350:9::0;1592:66:8::1;1664:16;::::0;::::1;;::::0;;;:8:::1;:16;::::0;;;;1021:1:::1;1664:26:::0;;13814:5:::2;::::0;13854:50:::2;13874:6:::0;13882:7:::2;13891:12;13854:19;:50::i;:::-;13839:65;;13911:12;13925:11:::0;13950:4:::2;13940:25;;;:27;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13996:30;::::0;;;;:24:::2;5613:55:9::0;;;13996:30:8::2;::::0;::::2;5595:74:9::0;13910:57:8;;-1:-1:-1;13910:57:8;;-1:-1:-1;13973:20:8::2;::::0;13910:57;;13996:24;;::::2;::::0;::::2;::::0;5568:18:9;;13996:30:8::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:40;;;;:::i;:::-;14065:30;::::0;;;;:24:::2;5613:55:9::0;;;14065:30:8::2;::::0;::::2;5595:74:9::0;13973:63:8;;-1:-1:-1;14042:20:8::2;::::0;14098:6;;14065:24;;::::2;::::0;::::2;::::0;5568:18:9;;14065:30:8::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:39;;;;:::i;:::-;14042:62:::0;-1:-1:-1;14114:19:8;;14110:100:::2;;14143:60;::::0;;;;:30:::2;7201:15:9::0;;;14143:60:8::2;::::0;::::2;7183:34:9::0;7253:15;;;7233:18;;;7226:43;7285:18;;;7278:34;;;14143:30:8;::::2;::::0;::::2;::::0;7095:18:9;;14143:60:8::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;14110:100;14219:19:::0;;14215:100:::2;;14248:60;::::0;;;;:30:::2;7201:15:9::0;;;14248:60:8::2;::::0;::::2;7183:34:9::0;7253:15;;;7233:18;;;7226:43;7285:18;;;7278:34;;;14248:30:8;::::2;::::0;::::2;::::0;7095:18:9;;14248:60:8::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;14215:100;-1:-1:-1::0;;;1703:16:8::1;::::0;;::::1;;::::0;;;:8:::1;:16;::::0;;;;984:1:::1;1703:30:::0;;-1:-1:-1;;;;;13702:617:8:o;4198:99::-;4251:4;4287:5;;4270:14;;:22;;;;:::i;:::-;4263:29;;4198:99;:::o;3354:211::-;2414:7;2401:30;;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2387:46;;:10;:46;;;2379:80;;;;;;;3649:2:9;2379:80:8;;;3631:21:9;3688:2;3668:18;;;3661:30;3727:23;3707:18;;;3700:51;3768:18;;2379:80:8;3447:345:9;2379:80:8;941:3:::1;3445:14;;3433:9;:26;;;;:::i;:::-;:37;;3425:79;;;::::0;::::1;::::0;;8694:2:9;3425:79:8::1;::::0;::::1;8676:21:9::0;8733:2;8713:18;;;8706:30;8772:31;8752:18;;;8745:59;8821:18;;3425:79:8::1;8492:353:9::0;3425:79:8::1;3510:5;:17:::0;;;3538:22:::1;::::0;1384:25:9;;;3538:22:8::1;::::0;1372:2:9;1357:18;3538:22:8::1;1238:177:9::0;3770:237:8;2414:7;2401:30;;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2387:46;;:10;:46;;;2379:80;;;;;;;3649:2:9;2379:80:8;;;3631:21:9;3688:2;3668:18;;;3661:30;3727:23;3707:18;;;3700:51;3768:18;;2379:80:8;3447:345:9;2379:80:8;941:3:::1;3868:11;3860:5;;:19;;;;:::i;:::-;:30;;3852:72;;;::::0;::::1;::::0;;8694:2:9;3852:72:8::1;::::0;::::1;8676:21:9::0;8733:2;8713:18;;;8706:30;8772:31;8752:18;;;8745:59;8821:18;;3852:72:8::1;8492:353:9::0;3852:72:8::1;3930:14;:28:::0;;;3969:33:::1;::::0;1384:25:9;;;3969:33:8::1;::::0;1372:2:9;1357:18;3969:33:8::1;1238:177:9::0;7561:317:8;2298:6;;7723:14;;;;2298:6;;:15;2290:46;;;;;;;4191:2:9;2290:46:8;;;4173:21:9;4230:2;4210:18;;;4203:30;4269:20;4249:18;;;4242:48;4307:18;;2290:46:8;3989:342:9;2290:46:8;1810:17:::1;::::0;::::1;;::::0;;;:8:::1;:17;::::0;;;;;7692:7;;7701;;1810:28;;1802:67:::1;;;::::0;::::1;::::0;;4538:2:9;1802:67:8::1;::::0;::::1;4520:21:9::0;4577:2;4557:18;;;4550:30;4616:28;4596:18;;;4589:56;4662:18;;1802:67:8::1;4336:350:9::0;1802:67:8::1;1883:17;::::0;::::1;;::::0;;;:8:::1;:17;::::0;;;;;:28;;1875:67:::1;;;::::0;::::1;::::0;;4538:2:9;1875:67:8::1;::::0;::::1;4520:21:9::0;4577:2;4557:18;;;4550:30;4616:28;4596:18;;;4589:56;4662:18;;1875:67:8::1;4336:350:9::0;1875:67:8::1;1967:7;1956:18;;:7;:18;;::::0;1948:58:::1;;;::::0;::::1;::::0;;4893:2:9;1948:58:8::1;::::0;::::1;4875:21:9::0;4932:2;4912:18;;;4905:30;4971:29;4951:18;;;4944:57;5018:18;;1948:58:8::1;4691:351:9::0;1948:58:8::1;2029:5;2044:17;::::0;;::::1;::::0;;::::1;;2040:65;;2071:17;::::0;::::1;;::::0;;;:8:::1;:17;::::0;;;;1021:1:::1;2071:27:::0;;2040:65:::1;2125:6;2114:17;;:7;:17;;;2110:65;;2141:17;::::0;::::1;;::::0;;;:8:::1;:17;::::0;;;;1021:1:::1;2141:27:::0;;2110:65:::1;7790:28:::2;7796:7;7805;7814:3;7790:5;:28::i;:::-;7829:44;::::0;;1159:25:9;;;1215:2;1200:18;;1193:34;;;7764:54:8;;-1:-1:-1;7764:54:8;;-1:-1:-1;7829:44:8::2;::::0;::::2;::::0;7834:10:::2;::::0;7829:44:::2;::::0;1132:18:9;7829:44:8::2;;;;;;;-1:-1:-1::0;2187:17:8::1;::::0;;::::1;;::::0;;;:8:::1;:17;::::0;;;;;984:1:::1;2187:31:::0;;;;2224:17;;;::::1;::::0;;;;;;:31;7561:317;;;;-1:-1:-1;7561:317:8;-1:-1:-1;;7561:317:8:o;14558:319::-;2298:6;;;;:15;2290:46;;;;;;;4191:2:9;2290:46:8;;;4173:21:9;4230:2;4210:18;;;4203:30;4269:20;4249:18;;;4242:48;4307:18;;2290:46:8;3989:342:9;2290:46:8;14626:6:::1;1551:5;1541:15;;:6;:15;;::::0;1533:53:::1;;;::::0;::::1;::::0;;7827:2:9;1533:53:8::1;::::0;::::1;7809:21:9::0;7866:2;7846:18;;;7839:30;7905:27;7885:18;;;7878:55;7950:18;;1533:53:8::1;7625:349:9::0;1533:53:8::1;1600:16;::::0;::::1;;::::0;;;:8:::1;:16;::::0;;;;;:27;;1592:66:::1;;;::::0;::::1;::::0;;4538:2:9;1592:66:8::1;::::0;::::1;4520:21:9::0;4577:2;4557:18;;;4550:30;4616:28;4596:18;;;4589:56;4662:18;;1592:66:8::1;4336:350:9::0;1592:66:8::1;1664:16;::::0;::::1;;::::0;;;:8:::1;:16;::::0;;;;1021:1:::1;1664:26:::0;;14655:50:::2;14675:6:::0;14683:7:::2;14692:12;14655:19;:50::i;:::-;14731:30;::::0;;;;:24:::2;5613:55:9::0;;;14731:30:8::2;::::0;::::2;5595:74:9::0;14640:65:8;;-1:-1:-1;14711:17:8::2;::::0;14731:24;::::2;::::0;::::2;::::0;5568:18:9;;14731:30:8::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14787:29;::::0;;;;:23:::2;5613:55:9::0;;;14787:29:8::2;::::0;::::2;5595:74:9::0;14711:50:8;;-1:-1:-1;14767:17:8::2;::::0;14794:5:::2;14787:23;::::0;::::2;::::0;5568:18:9;;14787:29:8::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14822:50;::::0;;;;::::2;::::0;::::2;1159:25:9::0;;;1200:18;;;1193:34;;;14767:49:8;;-1:-1:-1;14822:22:8::2;::::0;::::2;::::0;::::2;::::0;1132:18:9;;14822:50:8::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;;1703:16:8::1;::::0;;::::1;;::::0;;;:8:::1;:16;::::0;;;;984:1:::1;1703:30:::0;;-1:-1:-1;;;;;14558:319:8:o;12391:1030::-;2298:6;;;;:15;2290:46;;;;;;;4191:2:9;2290:46:8;;;4173:21:9;4230:2;4210:18;;;4203:30;4269:20;4249:18;;;4242:48;4307:18;;2290:46:8;3989:342:9;2290:46:8;12533:6:::1;1551:5;1541:15;;:6;:15;;::::0;1533:53:::1;;;::::0;::::1;::::0;;7827:2:9;1533:53:8::1;::::0;::::1;7809:21:9::0;7866:2;7846:18;;;7839:30;7905:27;7885:18;;;7878:55;7950:18;;1533:53:8::1;7625:349:9::0;1533:53:8::1;1600:16;::::0;::::1;;::::0;;;:8:::1;:16;::::0;;;;;:27;;1592:66:::1;;;::::0;::::1;::::0;;4538:2:9;1592:66:8::1;::::0;::::1;4520:21:9::0;4577:2;4557:18;;;4550:30;4616:28;4596:18;;;4589:56;4662:18;;1592:66:8::1;4336:350:9::0;1592:66:8::1;1664:16;::::0;;::::1;;::::0;;;:8:::1;:16;::::0;;;;1021:1:::1;1664:26:::0;;12555:17;::::2;12547:51;;;::::0;::::2;::::0;;9052:2:9;12547:51:8::2;::::0;::::2;9034:21:9::0;9091:2;9071:18;;;9064:30;9130:23;9110:18;;;9103:51;9171:18;;12547:51:8::2;8850:345:9::0;12547:51:8::2;12604:12;12619:50;12639:6;12647:7;12656:12;12619:19;:50::i;:::-;12604:65;;12676:12;12704:4;12694:25;;;:27;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12675:46;;;12746:7;12735;:18;;12727:69;;;::::0;::::2;::::0;;9402:2:9;12727:69:8::2;::::0;::::2;9384:21:9::0;9441:2;9421:18;;;9414:30;9480:34;9460:18;;;9453:62;9551:8;9531:18;;;9524:36;9577:19;;12727:69:8::2;9200:402:9::0;12727:69:8::2;12817:30;::::0;;;;:24:::2;5613:55:9::0;;;12817:30:8::2;::::0;::::2;5595:74:9::0;12802:12:8::2;::::0;12817:24;;::::2;::::0;::::2;::::0;5568:18:9;;12817:30:8::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12853:52;::::0;;;;:30:::2;7201:15:9::0;;;12853:52:8::2;::::0;::::2;7183:34:9::0;7253:15;;;7233:18;;;7226:43;7285:18;;;7278:34;;;12802:45:8;;-1:-1:-1;12853:30:8;;::::2;::::0;::::2;::::0;7095:18:9;;12853:52:8::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;12945:53:8::2;::::0;;;;:31:::2;::::0;::::2;::::0;-1:-1:-1;12945:31:8::2;::::0;-1:-1:-1;12945:53:8::2;::::0;12977:4;;12983:7;;12992:5;;;;12945:53:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;13092:5;13075:13;:11;:13::i;:::-;13065:23;::::0;:7;:23:::2;:::i;:::-;13064:33;;;;:::i;:::-;13053:45;::::0;:7;:45:::2;:::i;:::-;13019:30;::::0;;;;:24:::2;5613:55:9::0;;;13019:30:8::2;::::0;::::2;5595:74:9::0;13019:24:8;::::2;::::0;::::2;::::0;5568:18:9;;13019:30:8::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:79;;13004:150;;;::::0;::::2;::::0;;10455:2:9;13004:150:8::2;::::0;::::2;10437:21:9::0;10494:2;10474:18;;;10467:30;10533:34;10513:18;;;10506:62;10604:10;10584:18;;;10577:38;10632:19;;13004:150:8::2;10253:404:9::0;13004:150:8::2;13170:4;13160:30;;;13191:6;13199:11;13241:5;13223:14;;13213:7;:24;;;;:::i;:::-;13212:34;;;;:::i;:::-;13160:87;::::0;;::::2;::::0;;;;;;7132:42:9;7201:15;;;13160:87:8::2;::::0;::::2;7183:34:9::0;7253:15;;;;7233:18;;;7226:43;7285:18;;;7278:34;7095:18;;13160:87:8::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;13320:30:8::2;::::0;;;;13297:22:::2;::::0;;::::2;13320:30;::::0;::::2;5595:74:9::0;;;13297:22:8;-1:-1:-1;13297:22:8::2;::::0;-1:-1:-1;13320:24:8;::::2;::::0;::::2;::::0;5568:18:9;;13320:30:8::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13352:29;::::0;;;;:23:::2;5613:55:9::0;;;13352:29:8::2;::::0;::::2;5595:74:9::0;13359:5:8::2;13352:23;::::0;::::2;::::0;5568:18:9;;13352:29:8::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13297:85;::::0;;::::2;::::0;;;;;;::::2;::::0;::::2;1159:25:9::0;;;;1200:18;;;1193:34;1132:18;;13297:85:8::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;13403:3;13393:23;;;13408:7;13393:23;;;;1384:25:9::0;;1372:2;1357:18;;1238:177;13393:23:8::2;;;;;;;;-1:-1:-1::0;;;1703:16:8::1;;;::::0;;;:8:::1;:16;::::0;;;;984:1:::1;1703:30:::0;;-1:-1:-1;;;;;12391:1030:8:o;8496:1054::-;2298:6;;8606:14;;2298:6;;:15;2290:46;;;;;;;4191:2:9;2290:46:8;;;4173:21:9;4230:2;4210:18;;;4203:30;4269:20;4249:18;;;4242:48;4307:18;;2290:46:8;3989:342:9;2290:46:8;8589:6:::1;1551:5;1541:15;;:6;:15;;::::0;1533:53:::1;;;::::0;::::1;::::0;;7827:2:9;1533:53:8::1;::::0;::::1;7809:21:9::0;7866:2;7846:18;;;7839:30;7905:27;7885:18;;;7878:55;7950:18;;1533:53:8::1;7625:349:9::0;1533:53:8::1;1600:16;::::0;::::1;;::::0;;;:8:::1;:16;::::0;;;;;:27;;1592:66:::1;;;::::0;::::1;::::0;;4538:2:9;1592:66:8::1;::::0;::::1;4520:21:9::0;4577:2;4557:18;;;4550:30;4616:28;4596:18;;;4589:56;4662:18;;1592:66:8::1;4336:350:9::0;1592:66:8::1;1664:16;::::0;::::1;;::::0;;;:8:::1;:16;::::0;;;;1021:1:::1;1664:26:::0;;8643:50:::2;8663:6:::0;8671:7:::2;8680:12;8643:19;:50::i;:::-;8628:65;;8700:12;8714:11:::0;8739:4:::2;8729:25;;;:27;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8782:30;::::0;;;;:24:::2;5613:55:9::0;;;8782:30:8::2;::::0;::::2;5595:74:9::0;8699:57:8;;-1:-1:-1;8699:57:8;;-1:-1:-1;8762:17:8::2;::::0;8782:24;::::2;::::0;::::2;::::0;5568:18:9;;8782:30:8::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8838:29;::::0;;;;:23:::2;5613:55:9::0;;;8838:29:8::2;::::0;::::2;5595:74:9::0;8762:50:8;;-1:-1:-1;8818:17:8::2;::::0;8845:5:::2;8838:23;::::0;::::2;::::0;5568:18:9;;8838:29:8::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8818:49:::0;-1:-1:-1;8873:12:8::2;8888:22;8903:7:::0;8888:12;:22:::2;:::i;:::-;8873:37:::0;-1:-1:-1;8916:13:8::2;8932:21;8947:6:::0;8932:12;:21:::2;:::i;:::-;8916:37;;8959:17;8986:4;8979:24;;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8959:46;;9015:12;9031:1;9015:17:::0;9011:326:::2;;1068:7;9054:29;9064:18;9074:8:::0;9064:7;:18:::2;:::i;:::-;9054:9;:29::i;:::-;:49;;;;:::i;:::-;9111:51;::::0;;;;9140:1:::2;9111:51;::::0;::::2;7497:74:9::0;1068:7:8::2;7587:18:9::0;;;7580:34;9042:61:8;;-1:-1:-1;9111:20:8::2;::::0;::::2;::::0;::::2;::::0;7470:18:9;;9111:51:8::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;9011:326;;;9250:80;9286:7:::0;9260:22:::2;9270:12:::0;9260:7;:22:::2;:::i;:::-;9259:34;;;;:::i;:::-;9323:6:::0;9296:23:::2;9307:12:::0;9296:8;:23:::2;:::i;:::-;9295:34;;;;:::i;:::-;9250:8;:80::i;:::-;9238:92;;9011:326;9362:1;9350:9;:13;9342:67;;;::::0;::::2;::::0;;10864:2:9;9342:67:8::2;::::0;::::2;10846:21:9::0;10903:2;10883:18;;;10876:30;10942:34;10922:18;;;10915:62;11013:11;10993:18;;;10986:39;11042:19;;9342:67:8::2;10662:405:9::0;9342:67:8::2;9415:36;::::0;;;;:20:::2;7515:55:9::0;;;9415:36:8::2;::::0;::::2;7497:74:9::0;7587:18;;;7580:34;;;9415:20:8;::::2;::::0;::::2;::::0;7470:18:9;;9415:36:8::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;9457:50:8::2;::::0;;;;::::2;::::0;::::2;1159:25:9::0;;;1200:18;;;1193:34;;;9457:22:8::2;::::0;::::2;::::0;-1:-1:-1;9457:22:8::2;::::0;-1:-1:-1;1132:18:9;;9457:50:8::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;9518:27:8::2;::::0;1384:25:9;;;9523:10:8::2;::::0;-1:-1:-1;9518:27:8::2;::::0;-1:-1:-1;1372:2:9;1357:18;9518:27:8::2;;;;;;;-1:-1:-1::0;;;1703:16:8::1;::::0;;::::1;;::::0;;;:8:::1;:16;::::0;;;;984:1:::1;1703:30:::0;;-1:-1:-1;8496:1054:8;;;-1:-1:-1;;;;;;8496:1054:8:o;438:430:7:-;741:24;;11234:66:9;11221:2;11217:15;;;11213:88;741:24:7;;;11201:101:9;551:12:7;;707:8;;11318:12:9;;741:24:7;;;;;;;;;;;;731:35;;;;;;782:13;652:175;;;;;;;;;11639:66:9;11627:79;;11743:2;11739:15;;;;11756:66;11735:88;11731:1;11722:11;;11715:109;11849:2;11840:12;;11833:28;;;;11886:2;11877:12;;11870:28;11923:2;11914:12;;11341:591;652:175:7;;;;;;;;;;;;;;629:210;;652:175;629:210;;;;;438:430;-1:-1:-1;;;;438:430:7:o;5111:950:8:-;5223:13;5238:14;5260;5277:5;5260:22;;5302:14;5329:5;5302:33;;5342:12;5356:11;5371:4;:14;;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5413:31;;;;;:24;5613:55:9;;;5413:31:8;;;5595:74:9;5341:46:8;;-1:-1:-1;5341:46:8;;-1:-1:-1;5393:17:8;;5413:24;;;;;5568:18:9;;5413:31:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5393:51;-1:-1:-1;5461:21:8;5476:6;5393:51;5461:21;:::i;:::-;5450:32;-1:-1:-1;5492:16:8;;;5504:4;5492:16;5488:332;;5530:11;:24;5555:6;5563:7;5572:8;5582:13;:11;:13::i;:::-;5530:66;;;;;;;;;;;;;12176:25:9;;;;12217:18;;;12210:34;;;;12260:18;;;12253:34;12303:18;;;12296:34;12148:19;;5530:66:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5518:78;;5604:4;:19;;;5624:5;5631:11;5674:5;5656:14;;5645:8;:25;;;;:::i;:::-;5644:35;;;;:::i;:::-;5604:76;;;;;;;;;;7132:42:9;7201:15;;;5604:76:8;;;7183:34:9;7253:15;;;;7233:18;;;7226:43;7285:18;;;7278:34;7095:18;;5604:76:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5488:332;;;5757:56;5787:8;5797:6;5805:7;5757:29;:56::i;:::-;5745:68;;5488:332;5825:43;;;;;:19;7201:15:9;;;5825:43:8;;;7183:34:9;7253:15;;;7233:18;;;7226:43;7285:18;;;7278:34;;;5825:19:8;;;;;7095:18:9;;5825:43:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;5923:31:8;;;;;:24;5613:55:9;;;5923:31:8;;;5595:74:9;5923:24:8;;;-1:-1:-1;5923:24:8;;-1:-1:-1;5568:18:9;;5923:31:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5980;;;;;:24;5613:55:9;;;5980:31:8;;;5595:74:9;5908:46:8;;-1:-1:-1;5960:17:8;;5980:24;;;;;5568:18:9;;5980:31:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6017:39;;;;;;;;1159:25:9;;;1200:18;;;1193:34;;;5960:51:8;;-1:-1:-1;6017:11:8;;;;;;1132:18:9;;6017:39:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5254:807;;;;;;5111:950;;;;;;;:::o;6065:980::-;6160:14;;6216:5;6260:7;6295:14;;;;;;;;6287:49;;;;;;;12543:2:9;6287:49:8;;;12525:21:9;12582:2;12562:18;;;12555:30;12621:24;12601:18;;;12594:52;12663:18;;6287:49:8;12341:346:9;6287:49:8;6357:7;6350:14;;:3;:14;;;6342:49;;;;;;;12543:2:9;6342:49:8;;;12525:21:9;12582:2;12562:18;;;12555:30;12621:24;12601:18;;;12594:52;12663:18;;6342:49:8;12341:346:9;6342:49:8;6412:6;6401:17;;:7;:17;;;;:38;;;;;6433:6;6422:17;;:7;:17;;;;6401:38;6397:644;;;6449:13;6465:52;6485:7;6494:8;6504:12;6465:19;:52::i;:::-;6449:68;;6525:13;6541:52;6561:7;6570:8;6580:12;6541:19;:52::i;:::-;6525:68;;6617:29;6624:5;6631:7;6640:5;6617:6;:29::i;:::-;-1:-1:-1;6601:45:8;-1:-1:-1;6671:34:8;6678:5;6685:7;6694:3;6699:5;6671:6;:34::i;:::-;6654:51;-1:-1:-1;6397:644:8;;-1:-1:-1;;;6397:644:8;;6733:6;6722:17;;:7;:17;;;6718:323;;6749:13;6765:52;6785:7;6794:8;6804:12;6765:19;:52::i;:::-;6749:68;;6851:33;6858:5;6865:7;6874:3;6879:4;6851:6;:33::i;:::-;6825:59;;-1:-1:-1;6825:59:8;-1:-1:-1;6718:323:8;;-1:-1:-1;6718:323:8;;6905:13;6921:52;6941:7;6950:8;6960:12;6921:19;:52::i;:::-;6905:68;;7007:27;7014:5;7021:7;7030:3;7007:6;:27::i;:::-;6981:53;;-1:-1:-1;6981:53:8;-1:-1:-1;;6718:323:8;6193:852;;6065:980;;;;;;:::o;187:238:6:-;233:6;256:1;251:2;:6;247:174;;;-1:-1:-1;271:2:6;281:6;290;295:1;271:2;290:6;:::i;:::-;:10;;299:1;290:10;:::i;:::-;281:19;;308:68;319:1;315;:5;308:68;;;336:1;-1:-1:-1;336:1:6;366;336;352:6;336:1;352:2;:6;:::i;:::-;:10;;;;:::i;:::-;351:16;;;;:::i;:::-;347:20;;308:68;;;259:123;187:238;;;:::o;247:174::-;392:7;;388:33;;-1:-1:-1;413:1:6;388:33;187:238;;;:::o;88:95::-;142:4;166:2;161;:7;:17;;176:2;161:17;;;171:2;161:17;154:24;;88:95;;;;;:::o;872:146:7:-;956:8;998:14;1003:9;998:2;:14;:::i;:::-;979;991:2;979:9;:14;:::i;:::-;978:35;;;;:::i;:::-;972:41;872:146;-1:-1:-1;;;;872:146:7:o;4301:806:8:-;4394:13;4409:14;4431;4448:5;4431:22;;4473:14;4500:5;4473:33;;4513:12;4527:11;4542:4;:14;;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4584:31;;;;;:24;5613:55:9;;;4584:31:8;;;5595:74:9;4512:46:8;;-1:-1:-1;4512:46:8;;-1:-1:-1;4564:17:8;;4584:24;;;;;5568:18:9;;4584:31:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4564:51;-1:-1:-1;4632:22:8;4647:7;4564:51;4632:22;:::i;:::-;4621:33;;4672:11;:24;4697:7;4706:6;4714:8;4724:13;:11;:13::i;:::-;4672:66;;;;;;;;;;;;;12176:25:9;;;;12217:18;;;12210:34;;;;12260:18;;;12253:34;12303:18;;;12296:34;12148:19;;4672:66:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4660:78;;4744:4;:19;;;4764:6;4772:11;4815:5;4797:14;;4786:8;:25;;;;:::i;:::-;4785:35;;;;:::i;:::-;4744:77;;;;;;;;;;7132:42:9;7201:15;;;4744:77:8;;;7183:34:9;7253:15;;;;7233:18;;;7226:43;7285:18;;;7278:34;7095:18;;4744:77:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4871:43:8;;;;;:19;7201:15:9;;;4871:43:8;;;7183:34:9;7253:15;;;7233:18;;;7226:43;7285:18;;;7278:34;;;4871:19:8;;;-1:-1:-1;4871:19:8;;-1:-1:-1;7095:18:9;;4871:43:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4974:31:8;;;;;:24;5613:55:9;;;4974:31:8;;;5595:74:9;4954:17:8;;-1:-1:-1;4974:24:8;;;-1:-1:-1;4974:24:8;;5568:18:9;;4974:31:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5026;;;;;:24;5613:55:9;;;5026:31:8;;;5595:74:9;4954:51:8;;-1:-1:-1;5026:24:8;;;;;;5568:18:9;;5026:31:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5063:39;;;;;;;;1159:25:9;;;1200:18;;;1193:34;;;5011:46:8;;-1:-1:-1;5063:11:8;;;;;;1132:18:9;;5063:39:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4425:682;;;;;;4301:806;;;;;;:::o;14:273:9:-;70:6;123:2;111:9;102:7;98:23;94:32;91:52;;;139:1;136;129:12;91:52;178:9;165:23;231:5;224:13;217:21;210:5;207:32;197:60;;253:1;250;243:12;197:60;276:5;14:273;-1:-1:-1;;;14:273:9:o;292:154::-;378:42;371:5;367:54;360:5;357:65;347:93;;436:1;433;426:12;347:93;292:154;:::o;451:529::-;528:6;536;544;597:2;585:9;576:7;572:23;568:32;565:52;;;613:1;610;603:12;565:52;652:9;639:23;671:31;696:5;671:31;:::i;:::-;721:5;-1:-1:-1;778:2:9;763:18;;750:32;791:33;750:32;791:33;:::i;:::-;843:7;-1:-1:-1;902:2:9;887:18;;874:32;915:33;874:32;915:33;:::i;:::-;967:7;957:17;;;451:529;;;;;:::o;1420:388::-;1488:6;1496;1549:2;1537:9;1528:7;1524:23;1520:32;1517:52;;;1565:1;1562;1555:12;1517:52;1604:9;1591:23;1623:31;1648:5;1623:31;:::i;:::-;1673:5;-1:-1:-1;1730:2:9;1715:18;;1702:32;1743:33;1702:32;1743:33;:::i;:::-;1795:7;1785:17;;;1420:388;;;;;:::o;1813:180::-;1872:6;1925:2;1913:9;1904:7;1900:23;1896:32;1893:52;;;1941:1;1938;1931:12;1893:52;-1:-1:-1;1964:23:9;;1813:180;-1:-1:-1;1813:180:9:o;1998:247::-;2057:6;2110:2;2098:9;2089:7;2085:23;2081:32;2078:52;;;2126:1;2123;2116:12;2078:52;2165:9;2152:23;2184:31;2209:5;2184:31;:::i;2250:936::-;2347:6;2355;2363;2371;2379;2432:3;2420:9;2411:7;2407:23;2403:33;2400:53;;;2449:1;2446;2439:12;2400:53;2488:9;2475:23;2507:31;2532:5;2507:31;:::i;:::-;2557:5;-1:-1:-1;2609:2:9;2594:18;;2581:32;;-1:-1:-1;2665:2:9;2650:18;;2637:32;2678:33;2637:32;2678:33;:::i;:::-;2730:7;-1:-1:-1;2788:2:9;2773:18;;2760:32;2811:18;2841:14;;;2838:34;;;2868:1;2865;2858:12;2838:34;2906:6;2895:9;2891:22;2881:32;;2951:7;2944:4;2940:2;2936:13;2932:27;2922:55;;2973:1;2970;2963:12;2922:55;3013:2;3000:16;3039:2;3031:6;3028:14;3025:34;;;3055:1;3052;3045:12;3025:34;3100:7;3095:2;3086:6;3082:2;3078:15;3074:24;3071:37;3068:57;;;3121:1;3118;3111:12;3068:57;2250:936;;;;-1:-1:-1;2250:936:9;;-1:-1:-1;3152:2:9;3144:11;;3174:6;2250:936;-1:-1:-1;;;2250:936:9:o;3191:251::-;3261:6;3314:2;3302:9;3293:7;3289:23;3285:32;3282:52;;;3330:1;3327;3320:12;3282:52;3362:9;3356:16;3381:31;3406:5;3381:31;:::i;5680:184::-;5750:6;5803:2;5791:9;5782:7;5778:23;5774:32;5771:52;;;5819:1;5816;5809:12;5771:52;-1:-1:-1;5842:16:9;;5680:184;-1:-1:-1;5680:184:9:o;5869:::-;5921:77;5918:1;5911:88;6018:4;6015:1;6008:15;6042:4;6039:1;6032:15;6058:168;6131:9;;;6162;;6179:15;;;6173:22;;6159:37;6149:71;;6200:18;;:::i;6231:274::-;6271:1;6297;6287:189;;6332:77;6329:1;6322:88;6433:4;6430:1;6423:15;6461:4;6458:1;6451:15;6287:189;-1:-1:-1;6490:9:9;;6231:274::o;7979:245::-;8058:6;8066;8119:2;8107:9;8098:7;8094:23;8090:32;8087:52;;;8135:1;8132;8125:12;8087:52;-1:-1:-1;;8158:16:9;;8214:2;8199:18;;;8193:25;8158:16;;8193:25;;-1:-1:-1;7979:245:9:o;8229:128::-;8296:9;;;8317:11;;;8314:37;;;8331:18;;:::i;8362:125::-;8427:9;;;8448:10;;;8445:36;;;8461:18;;:::i;9607:641::-;9832:42;9824:6;9820:55;9809:9;9802:74;9912:6;9907:2;9896:9;9892:18;9885:34;9955:2;9950;9939:9;9935:18;9928:30;9994:6;9989:2;9978:9;9974:18;9967:34;10052:6;10044;10038:3;10027:9;10023:19;10010:49;10109:1;10079:22;;;10103:3;10075:32;;;10068:43;;;;10163:2;10151:15;;;10168:66;10147:88;10132:104;10128:114;;9607:641;-1:-1:-1;;;9607:641:9:o

Swarm Source

ipfs://a343c5365a1df5ea8c7852c4ff70e78c79f05192fc77bf35e978cb277010c456

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.