ETH Price: $2,091.63 (-0.22%)

Contract

0x6b5422D584943BC8Cd0E10e239d624c6fE90fbB8
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Multicall244290962026-02-10 21:36:4731 days ago1770759407IN
0x6b5422D5...6fE90fbB8
0 ETH0.000551572.07655177
Multicall242704802026-01-19 18:01:4753 days ago1768845707IN
0x6b5422D5...6fE90fbB8
0 ETH0.000551462.07620725
Multicall242704332026-01-19 17:52:1153 days ago1768845131IN
0x6b5422D5...6fE90fbB8
0 ETH0.000558092.10116307
Multicall242570412026-01-17 21:05:2355 days ago1768683923IN
0x6b5422D5...6fE90fbB8
0 ETH0.000009030.03233039
Multicall242368382026-01-15 1:30:3558 days ago1768440635IN
0x6b5422D5...6fE90fbB8
0 ETH0.000551622.07679336
Multicall241797422026-01-07 2:13:1166 days ago1767751991IN
0x6b5422D5...6fE90fbB8
0 ETH0.000038830.13889841
Multicall241797372026-01-07 2:12:1166 days ago1767751931IN
0x6b5422D5...6fE90fbB8
0 ETH0.00004030.14412441
Multicall241797252026-01-07 2:09:4766 days ago1767751787IN
0x6b5422D5...6fE90fbB8
0 ETH0.000042610.14528277
Multicall240343612025-12-17 19:16:3586 days ago1765998995IN
0x6b5422D5...6fE90fbB8
0.003924 ETH0.000361592.22300998
Multicall240331722025-12-17 15:17:3586 days ago1765984655IN
0x6b5422D5...6fE90fbB8
0.0157 ETH0.000498462.77300533
Multicall240331002025-12-17 15:02:5986 days ago1765983779IN
0x6b5422D5...6fE90fbB8
0.0059 ETH0.000432032.65592872
Multicall240274502025-12-16 20:07:1187 days ago1765915631IN
0x6b5422D5...6fE90fbB8
0.0097645 ETH0.000331622.03866683
Multicall239496692025-12-05 22:24:1198 days ago1764973451IN
0x6b5422D5...6fE90fbB8
0 ETH0.000042090.1435
Multicall239496652025-12-05 22:23:1198 days ago1764973391IN
0x6b5422D5...6fE90fbB8
0 ETH0.000040120.1435
Multicall239496612025-12-05 22:22:1198 days ago1764973331IN
0x6b5422D5...6fE90fbB8
0 ETH0.000040120.1435
Multicall239496572025-12-05 22:21:2398 days ago1764973283IN
0x6b5422D5...6fE90fbB8
0 ETH0.000040120.1435
Multicall239496412025-12-05 22:18:1198 days ago1764973091IN
0x6b5422D5...6fE90fbB8
0 ETH0.000040120.1435
Multicall239496332025-12-05 22:16:2398 days ago1764972983IN
0x6b5422D5...6fE90fbB8
0 ETH0.000040090.1435
Multicall239496242025-12-05 22:14:3598 days ago1764972875IN
0x6b5422D5...6fE90fbB8
0 ETH0.000038110.1435
Multicall239487672025-12-05 19:19:1198 days ago1764962351IN
0x6b5422D5...6fE90fbB8
0 ETH0.000257630.92212528
Multicall239349652025-12-03 19:22:11100 days ago1764789731IN
0x6b5422D5...6fE90fbB8
0 ETH0.000040090.1435
Multicall238472592025-11-21 12:02:59112 days ago1763726579IN
0x6b5422D5...6fE90fbB8
0 ETH0.000907183.41520343
Multicall238344402025-11-19 16:54:35114 days ago1763571275IN
0x6b5422D5...6fE90fbB8
0 ETH0.000861733.24433086
Multicall238300582025-11-19 2:07:47115 days ago1763518067IN
0x6b5422D5...6fE90fbB8
0 ETH0.000038140.13651429
Multicall238239622025-11-18 5:35:47116 days ago1763444147IN
0x6b5422D5...6fE90fbB8
0 ETH0.000622172.22709585
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Method Block
From
To
Transfer245947682026-03-06 0:12:238 days ago1772755943
0x6b5422D5...6fE90fbB8
0.00006569 ETH
Transfer245947682026-03-06 0:12:238 days ago1772755943
0x6b5422D5...6fE90fbB8
0.00006569 ETH
Transfer244290962026-02-10 21:36:4731 days ago1770759407
0x6b5422D5...6fE90fbB8
0.09973279 ETH
Transfer244290962026-02-10 21:36:4731 days ago1770759407
0x6b5422D5...6fE90fbB8
0.09973279 ETH
Transfer244290962026-02-10 21:36:4731 days ago1770759407
0x6b5422D5...6fE90fbB8
0.00311175 ETH
Transfer244290962026-02-10 21:36:4731 days ago1770759407
0x6b5422D5...6fE90fbB8
0.00311175 ETH
Transfer242859172026-01-21 21:41:1151 days ago1769031671
0x6b5422D5...6fE90fbB8
0.00002235 ETH
Transfer242859172026-01-21 21:41:1151 days ago1769031671
0x6b5422D5...6fE90fbB8
0.00002235 ETH
Transfer242836272026-01-21 14:00:5951 days ago1769004059
0x6b5422D5...6fE90fbB8
0.00027197 ETH
Transfer242836272026-01-21 14:00:5951 days ago1769004059
0x6b5422D5...6fE90fbB8
0.00027197 ETH
Transfer242704802026-01-19 18:01:4753 days ago1768845707
0x6b5422D5...6fE90fbB8
0.04855265 ETH
Transfer242704802026-01-19 18:01:4753 days ago1768845707
0x6b5422D5...6fE90fbB8
0.04855265 ETH
Transfer242704802026-01-19 18:01:4753 days ago1768845707
0x6b5422D5...6fE90fbB8
0.00150802 ETH
Transfer242704802026-01-19 18:01:4753 days ago1768845707
0x6b5422D5...6fE90fbB8
0.00150802 ETH
Transfer242704332026-01-19 17:52:1153 days ago1768845131
0x6b5422D5...6fE90fbB8
0.04762553 ETH
Transfer242704332026-01-19 17:52:1153 days ago1768845131
0x6b5422D5...6fE90fbB8
0.04762553 ETH
Transfer242704332026-01-19 17:52:1153 days ago1768845131
0x6b5422D5...6fE90fbB8
0.00147908 ETH
Transfer242704332026-01-19 17:52:1153 days ago1768845131
0x6b5422D5...6fE90fbB8
0.00147908 ETH
Transfer242570412026-01-17 21:05:2355 days ago1768683923
0x6b5422D5...6fE90fbB8
0.00015153 ETH
Transfer242570412026-01-17 21:05:2355 days ago1768683923
0x6b5422D5...6fE90fbB8
0.00015153 ETH
Transfer242570412026-01-17 21:05:2355 days ago1768683923
0x6b5422D5...6fE90fbB8
0.00000468 ETH
Transfer242570412026-01-17 21:05:2355 days ago1768683923
0x6b5422D5...6fE90fbB8
0.00000468 ETH
Transfer242368382026-01-15 1:30:3558 days ago1768440635
0x6b5422D5...6fE90fbB8
0.04672473 ETH
Transfer242368382026-01-15 1:30:3558 days ago1768440635
0x6b5422D5...6fE90fbB8
0.04672473 ETH
Transfer242368382026-01-15 1:30:3558 days ago1768440635
0x6b5422D5...6fE90fbB8
0.00145096 ETH
View All Internal Transactions
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
XchangeRouterV3

Compiler Version
v0.8.25+commit.b61c2a91

Optimization Enabled:
Yes with 800 runs

Other Settings:
paris EvmVersion
File 1 of 1 : XchangeRouterV3.sol
// SPDX-License-Identifier: GPL-3.0
pragma solidity =0.8.25;

/*

 /$$   /$$ /$$$$$$$$       /$$$$$$$$ /$$
| $$  / $$|_____ $$/      | $$_____/|__/
|  $$/ $$/     /$$/       | $$       /$$ /$$$$$$$   /$$$$$$  /$$$$$$$   /$$$$$$$  /$$$$$$
 \  $$$$/     /$$/        | $$$$$   | $$| $$__  $$ |____  $$| $$__  $$ /$$_____/ /$$__  $$
  >$$  $$    /$$/         | $$__/   | $$| $$  \ $$  /$$$$$$$| $$  \ $$| $$      | $$$$$$$$
 /$$/\  $$  /$$/          | $$      | $$| $$  | $$ /$$__  $$| $$  | $$| $$      | $$_____/
| $$  \ $$ /$$/           | $$      | $$| $$  | $$|  $$$$$$$| $$  | $$|  $$$$$$$|  $$$$$$$
|__/  |__/|__/            |__/      |__/|__/  |__/ \_______/|__/  |__/ \_______/ \_______/

Contract: Uniswapv2 Fork - XchangeRouterV3

In addition to the standard Uniswap V2 Router, this contract includes functionality to remove liquidity in a failsafe manner to permit liquidation of fee liquidity in all cases.

XchangeRouterV2 contains a bugfix compared to XchangeRouter related to calculations of amount in.

XchangeRouterV3 includes the multicall functionality.

The authority to call that function is assigned via the Xchange Factory.

This contract will NOT be renounced, however it has no functions which affect the contract. The contract is "owned" solely as a formality.

*/

abstract contract Ownable {
    address private _owner;

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

    constructor(address owner_) {
        _transferOwnership(owner_);
    }

    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    function _checkOwner() internal view virtual {
        require(owner() == msg.sender, "Ownable: caller is not the owner");
    }

    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

interface IMulticall {
    function multicall(bytes[] calldata data) external payable returns (bytes[] memory results);
}

interface IMulticallExtended is IMulticall {
    function multicall(uint256 deadline, bytes[] calldata data) external payable returns (bytes[] memory results);

    function multicall(
        bytes32 previousBlockhash,
        bytes[] calldata data
    ) external payable returns (bytes[] memory results);
}

interface IPeripheryPayments {
    function unwrapWETH9(uint256 amountMinimum, address recipient) external payable;
    function refundETH() external payable;
    function sweepToken(address token, uint256 amountMinimum, address recipient) external payable;
}

interface IPeripheryPaymentsExtended is IPeripheryPayments {
    function unwrapWETH9(uint256 amountMinimum) external payable;
    function wrapETH(uint256 value) external payable;
    function sweepToken(address token, uint256 amountMinimum) external payable;
    function pull(address token, uint256 value) external payable;
}

interface IXchangeFactory {
    function isFailsafeLiquidator(address) external view returns (bool);
    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function createPair(address tokenA, address tokenB) external returns (address pair);
}
interface IXchangePair {
    function transferFrom(address from, address to, uint value) external returns (bool);
    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function mint(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function mustBurn(address to, uint256 gasAmount) external returns (uint256 amount0, uint256 amount1);
}

interface IXchangeRouter {
    function factory() external view returns (address);
    function WETH() external view returns (address);
    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function mustRemoveLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        uint gasAmount
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable returns (uint[] memory amounts);
    function swapTokensForExactETH(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactTokensForETH(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapETHForExactTokens(
        uint amountOut,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable returns (uint[] memory amounts);
    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint amountETH);
    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}

interface IERC20 {
    function balanceOf(address owner) external view returns (uint);
    function transfer(address to, uint256 value) external returns (bool);
    function approve(address spender, uint256 value) external returns (bool);
}
interface IWETH {
    function deposit() external payable;
    function transfer(address to, uint value) external returns (bool);
    function withdraw(uint) external;
}
interface IWETH9 is IERC20 {
    function deposit() external payable;
    function withdraw(uint256) external;
}
interface IPeripheryImmutableState {
    function factory() external view returns (address);
    function WETH9() external view returns (address);
}
interface IXchangeDiscountAuthority {
    function fee(address) external view returns (uint256);
}

abstract contract Multicall is IMulticall {
    /// @inheritdoc IMulticall
    function multicall(bytes[] calldata data) public payable override returns (bytes[] memory results) {
        results = new bytes[](data.length);
        for (uint256 i = 0; i < data.length; i++) {
            (bool success, bytes memory result) = address(this).delegatecall(data[i]);

            if (!success) {
                if (result.length < 68) revert();
                assembly {
                    result := add(result, 0x04)
                }
                revert(abi.decode(result, (string)));
            }

            results[i] = result;
        }
    }
}

abstract contract BlockTimestamp {
    function _blockTimestamp() internal view virtual returns (uint256) {
        return block.timestamp;
    }
}

abstract contract PeripheryValidation is BlockTimestamp {
    modifier checkDeadline(uint256 deadline) {
        require(_blockTimestamp() <= deadline, "Transaction too old");
        _;
    }
}

abstract contract PeripheryValidationExtended is PeripheryValidation {
    modifier checkPreviousBlockhash(bytes32 previousBlockhash) {
        require(blockhash(block.number - 1) == previousBlockhash, "Blockhash");
        _;
    }
}

abstract contract MulticallExtended is IMulticallExtended, Multicall, PeripheryValidationExtended {
    function multicall(
        uint256 deadline,
        bytes[] calldata data
    ) external payable override checkDeadline(deadline) returns (bytes[] memory) {
        return multicall(data);
    }

    function multicall(
        bytes32 previousBlockhash,
        bytes[] calldata data
    ) external payable override checkPreviousBlockhash(previousBlockhash) returns (bytes[] memory) {
        return multicall(data);
    }
}

abstract contract PeripheryImmutableState is IPeripheryImmutableState {
    address public immutable override factory;
    address public immutable override WETH9;

    constructor(address _factory, address _WETH9) {
        factory = _factory;
        WETH9 = _WETH9;
    }
}

abstract contract PeripheryPayments is IPeripheryPayments, PeripheryImmutableState {
    receive() external payable {
        require(msg.sender == WETH9, "Not WETH9");
    }

    function unwrapWETH9(uint256 amountMinimum, address recipient) public payable override {
        uint256 balanceWETH9 = IWETH9(WETH9).balanceOf(address(this));
        require(balanceWETH9 >= amountMinimum, "Insufficient WETH9");
        if (balanceWETH9 > 0) {
            IWETH9(WETH9).withdraw(balanceWETH9);
            TransferHelper.safeTransferETH(recipient, balanceWETH9);
        }
    }

    function sweepToken(address token, uint256 amountMinimum, address recipient) public payable override {
        uint256 balanceToken = IERC20(token).balanceOf(address(this));
        require(balanceToken >= amountMinimum, "Insufficient token");
        if (balanceToken > 0) {
            TransferHelper.safeTransfer(token, recipient, balanceToken);
        }
    }

    function refundETH() external payable override {
        if (address(this).balance > 0) TransferHelper.safeTransferETH(msg.sender, address(this).balance);
    }

    function pay(address token, address payer, address recipient, uint256 value) internal {
        if (token == WETH9 && address(this).balance >= value) {
            // pay with WETH9
            IWETH9(WETH9).deposit{ value: value }(); // wrap only what is needed to pay
            IWETH9(WETH9).transfer(recipient, value);
        } else if (payer == address(this)) {
            // pay with tokens already in the contract (for the exact input multihop case)
            TransferHelper.safeTransfer(token, recipient, value);
        } else {
            // pull payment
            TransferHelper.safeTransferFrom(token, payer, recipient, value);
        }
    }
}

contract XchangeRouterV3 is IXchangeRouter, Ownable, MulticallExtended {
    address public immutable override factory;
    address public immutable override WETH;

    modifier ensure(uint deadline) {
        require(deadline >= block.timestamp, "Xchange: EXPIRED");
        _;
    }

    constructor(address _factory, address _WETH, address _owner) Ownable(_owner) {
        factory = _factory;
        WETH = _WETH;
    }

    receive() external payable {
        require(msg.sender == WETH);
        // only accept ETH via fallback from the WETH contract
    }

    function quote(uint amountA, uint reserveA, uint reserveB) public pure virtual override returns (uint amountB) {
        return XchangeLibrary.quote(amountA, reserveA, reserveB);
    }

    function getAmountOut(
        uint amountIn,
        uint reserveIn,
        uint reserveOut
    ) public pure virtual override returns (uint amountOut) {
        return XchangeLibrary.getAmountOut(amountIn, reserveIn, reserveOut, 20);
    }
    function getAmountIn(
        uint amountOut,
        uint reserveIn,
        uint reserveOut
    ) public pure virtual override returns (uint amountIn) {
        return XchangeLibrary.getAmountIn(amountOut, reserveIn, reserveOut, 20);
    }
    function getAmountsOut(
        uint amountIn,
        address[] memory path
    ) public view virtual override returns (uint[] memory amounts) {
        return XchangeLibrary.getAmountsOut(factory, amountIn, 20, path);
    }
    function getAmountsIn(
        uint amountOut,
        address[] memory path
    ) public view virtual override returns (uint[] memory amounts) {
        return XchangeLibrary.getAmountsIn(factory, amountOut, 20, path);
    }
    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external virtual override ensure(deadline) returns (uint amountA, uint amountB, uint liquidity) {
        (amountA, amountB) = _addLiquidity(tokenA, tokenB, amountADesired, amountBDesired, amountAMin, amountBMin);
        address pair = XchangeLibrary.pairFor(factory, tokenA, tokenB);
        TransferHelper.safeTransferFrom(tokenA, msg.sender, pair, amountA);
        TransferHelper.safeTransferFrom(tokenB, msg.sender, pair, amountB);
        liquidity = IXchangePair(pair).mint(to);
    }

    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable virtual override ensure(deadline) returns (uint amountToken, uint amountETH, uint liquidity) {
        (amountToken, amountETH) = _addLiquidity(
            token,
            WETH,
            amountTokenDesired,
            msg.value,
            amountTokenMin,
            amountETHMin
        );
        address pair = XchangeLibrary.pairFor(factory, token, WETH);
        TransferHelper.safeTransferFrom(token, msg.sender, pair, amountToken);
        IWETH(WETH).deposit{ value: amountETH }();
        assert(IWETH(WETH).transfer(pair, amountETH));
        liquidity = IXchangePair(pair).mint(to);
        // refund dust eth, if any
        if (msg.value > amountETH) TransferHelper.safeTransferETH(msg.sender, msg.value - amountETH);
    }

    // **** REMOVE LIQUIDITY ****
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) public virtual override ensure(deadline) returns (uint amountA, uint amountB) {
        address pair = XchangeLibrary.pairFor(factory, tokenA, tokenB);
        IXchangePair(pair).transferFrom(msg.sender, pair, liquidity);
        // send liquidity to pair
        (uint amount0, uint amount1) = IXchangePair(pair).burn(to);
        (address token0, ) = XchangeLibrary.sortTokens(tokenA, tokenB);
        (amountA, amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0);
        require(amountA >= amountAMin, "Xchange: INSUFFICIENT_A_AMOUNT");
        require(amountB >= amountBMin, "Xchange: INSUFFICIENT_B_AMOUNT");
    }

    function mustRemoveLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        uint gasAmount
    ) public virtual override ensure(deadline) returns (uint amountA, uint amountB) {
        require(IXchangeFactory(factory).isFailsafeLiquidator(msg.sender));
        address pair = XchangeLibrary.pairFor(factory, tokenA, tokenB);

        // send liquidity to pair
        IXchangePair(pair).transferFrom(msg.sender, pair, liquidity);

        // call the modified "mustBurn" function to ensure no token behavior can
        // prevent this call from succeeding
        (uint amount0, uint amount1) = IXchangePair(pair).mustBurn(to, gasAmount);
        (address token0, ) = XchangeLibrary.sortTokens(tokenA, tokenB);
        (amountA, amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0);
        require(amountA >= amountAMin, "Xchange: INSUFFICIENT_A_AMOUNT");
        require(amountB >= amountBMin, "Xchange: INSUFFICIENT_B_AMOUNT");
    }

    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) public virtual override ensure(deadline) returns (uint amountToken, uint amountETH) {
        (amountToken, amountETH) = removeLiquidity(
            token,
            WETH,
            liquidity,
            amountTokenMin,
            amountETHMin,
            address(this),
            deadline
        );
        TransferHelper.safeTransfer(token, to, amountToken);
        IWETH(WETH).withdraw(amountETH);
        TransferHelper.safeTransferETH(to, amountETH);
    }

    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external virtual override returns (uint amountA, uint amountB) {
        address pair = XchangeLibrary.pairFor(factory, tokenA, tokenB);
        uint value = approveMax ? type(uint256).max : liquidity;
        IXchangePair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        (amountA, amountB) = removeLiquidity(tokenA, tokenB, liquidity, amountAMin, amountBMin, to, deadline);
    }

    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external virtual override returns (uint amountToken, uint amountETH) {
        address pair = XchangeLibrary.pairFor(factory, token, WETH);
        uint value = approveMax ? type(uint256).max : liquidity;
        IXchangePair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        (amountToken, amountETH) = removeLiquidityETH(token, liquidity, amountTokenMin, amountETHMin, to, deadline);
    }

    // **** REMOVE LIQUIDITY (supporting fee-on-transfer tokens) ****
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) public virtual override ensure(deadline) returns (uint amountETH) {
        (, amountETH) = removeLiquidity(token, WETH, liquidity, amountTokenMin, amountETHMin, address(this), deadline);
        TransferHelper.safeTransfer(token, to, IERC20(token).balanceOf(address(this)));
        IWETH(WETH).withdraw(amountETH);
        TransferHelper.safeTransferETH(to, amountETH);
    }

    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external virtual override returns (uint amountETH) {
        address pair = XchangeLibrary.pairFor(factory, token, WETH);
        uint value = approveMax ? type(uint256).max : liquidity;
        IXchangePair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        amountETH = removeLiquidityETHSupportingFeeOnTransferTokens(
            token,
            liquidity,
            amountTokenMin,
            amountETHMin,
            to,
            deadline
        );
    }

    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external virtual override ensure(deadline) returns (uint[] memory amounts) {
        amounts = XchangeLibrary.getAmountsOut(factory, amountIn, 20, path);
        require(amounts[amounts.length - 1] >= amountOutMin, "Xchange: INSUFFICIENT_OUTPUT_AMOUNT");
        TransferHelper.safeTransferFrom(
            path[0],
            msg.sender,
            XchangeLibrary.pairFor(factory, path[0], path[1]),
            amounts[0]
        );
        _swap(amounts, path, to);
    }

    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external virtual override ensure(deadline) returns (uint[] memory amounts) {
        amounts = XchangeLibrary.getAmountsIn(factory, amountOut, 20, path);
        require(amounts[0] <= amountInMax, "Xchange: EXCESSIVE_INPUT_AMOUNT");
        TransferHelper.safeTransferFrom(
            path[0],
            msg.sender,
            XchangeLibrary.pairFor(factory, path[0], path[1]),
            amounts[0]
        );
        _swap(amounts, path, to);
    }

    function swapExactETHForTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable virtual override ensure(deadline) returns (uint[] memory amounts) {
        require(path[0] == WETH, "Xchange: INVALID_PATH");
        amounts = XchangeLibrary.getAmountsOut(factory, msg.value, 20, path);
        require(amounts[amounts.length - 1] >= amountOutMin, "Xchange: INSUFFICIENT_OUTPUT_AMOUNT");
        IWETH(WETH).deposit{ value: amounts[0] }();
        assert(IWETH(WETH).transfer(XchangeLibrary.pairFor(factory, path[0], path[1]), amounts[0]));
        _swap(amounts, path, to);
    }

    function swapTokensForExactETH(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external virtual override ensure(deadline) returns (uint[] memory amounts) {
        require(path[path.length - 1] == WETH, "Xchange: INVALID_PATH");
        amounts = XchangeLibrary.getAmountsIn(factory, amountOut, 20, path);
        require(amounts[0] <= amountInMax, "Xchange: EXCESSIVE_INPUT_AMOUNT");
        TransferHelper.safeTransferFrom(
            path[0],
            msg.sender,
            XchangeLibrary.pairFor(factory, path[0], path[1]),
            amounts[0]
        );
        _swap(amounts, path, address(this));
        IWETH(WETH).withdraw(amounts[amounts.length - 1]);
        TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]);
    }

    function swapExactTokensForETH(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external virtual override ensure(deadline) returns (uint[] memory amounts) {
        require(path[path.length - 1] == WETH, "Xchange: INVALID_PATH");
        amounts = XchangeLibrary.getAmountsOut(factory, amountIn, 20, path);
        require(amounts[amounts.length - 1] >= amountOutMin, "Xchange: INSUFFICIENT_OUTPUT_AMOUNT");
        TransferHelper.safeTransferFrom(
            path[0],
            msg.sender,
            XchangeLibrary.pairFor(factory, path[0], path[1]),
            amounts[0]
        );
        _swap(amounts, path, address(this));
        IWETH(WETH).withdraw(amounts[amounts.length - 1]);
        TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]);
    }

    function swapETHForExactTokens(
        uint amountOut,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable virtual override ensure(deadline) returns (uint[] memory amounts) {
        require(path[0] == WETH, "Xchange: INVALID_PATH");
        amounts = XchangeLibrary.getAmountsIn(factory, amountOut, 20, path);
        require(amounts[0] <= msg.value, "Xchange: EXCESSIVE_INPUT_AMOUNT");
        IWETH(WETH).deposit{ value: amounts[0] }();
        assert(IWETH(WETH).transfer(XchangeLibrary.pairFor(factory, path[0], path[1]), amounts[0]));
        _swap(amounts, path, to);
        // refund dust eth, if any
        if (msg.value > amounts[0]) TransferHelper.safeTransferETH(msg.sender, msg.value - amounts[0]);
    }

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external virtual override ensure(deadline) {
        TransferHelper.safeTransferFrom(
            path[0],
            msg.sender,
            XchangeLibrary.pairFor(factory, path[0], path[1]),
            amountIn
        );
        uint balanceBefore = IERC20(path[path.length - 1]).balanceOf(to);
        _swapSupportingFeeOnTransferTokens(path, to);
        require(
            IERC20(path[path.length - 1]).balanceOf(to) - balanceBefore >= amountOutMin,
            "Xchange: INSUFFICIENT_OUTPUT_AMOUNT"
        );
    }

    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable virtual override ensure(deadline) {
        require(path[0] == WETH, "Xchange: INVALID_PATH");
        uint amountIn = msg.value;
        IWETH(WETH).deposit{ value: amountIn }();
        assert(IWETH(WETH).transfer(XchangeLibrary.pairFor(factory, path[0], path[1]), amountIn));
        uint balanceBefore = IERC20(path[path.length - 1]).balanceOf(to);
        _swapSupportingFeeOnTransferTokens(path, to);
        require(
            IERC20(path[path.length - 1]).balanceOf(to) - balanceBefore >= amountOutMin,
            "Xchange: INSUFFICIENT_OUTPUT_AMOUNT"
        );
    }

    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external virtual override ensure(deadline) {
        require(path[path.length - 1] == WETH, "Xchange: INVALID_PATH");
        TransferHelper.safeTransferFrom(
            path[0],
            msg.sender,
            XchangeLibrary.pairFor(factory, path[0], path[1]),
            amountIn
        );
        _swapSupportingFeeOnTransferTokens(path, address(this));
        uint amountOut = IERC20(WETH).balanceOf(address(this));
        require(amountOut >= amountOutMin, "Xchange: INSUFFICIENT_OUTPUT_AMOUNT");
        IWETH(WETH).withdraw(amountOut);
        TransferHelper.safeTransferETH(to, amountOut);
    }

    // **** ADD LIQUIDITY ****
    function _addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin
    ) internal virtual returns (uint amountA, uint amountB) {
        // create the pair if it doesn't exist yet
        if (IXchangeFactory(factory).getPair(tokenA, tokenB) == address(0)) {
            IXchangeFactory(factory).createPair(tokenA, tokenB);
        }
        (uint reserveA, uint reserveB) = XchangeLibrary.getReserves(factory, tokenA, tokenB);
        if (reserveA == 0 && reserveB == 0) {
            (amountA, amountB) = (amountADesired, amountBDesired);
        } else {
            uint amountBOptimal = XchangeLibrary.quote(amountADesired, reserveA, reserveB);
            if (amountBOptimal <= amountBDesired) {
                require(amountBOptimal >= amountBMin, "Xchange: INSUFFICIENT_B_AMOUNT");
                (amountA, amountB) = (amountADesired, amountBOptimal);
            } else {
                uint amountAOptimal = XchangeLibrary.quote(amountBDesired, reserveB, reserveA);
                assert(amountAOptimal <= amountADesired);
                require(amountAOptimal >= amountAMin, "Xchange: INSUFFICIENT_A_AMOUNT");
                (amountA, amountB) = (amountAOptimal, amountBDesired);
            }
        }
    }

    // **** SWAP ****
    // requires the initial amount to have already been sent to the first pair
    function _swap(uint[] memory amounts, address[] memory path, address _to) internal virtual {
        for (uint i; i < path.length - 1; i++) {
            (address input, address output) = (path[i], path[i + 1]);
            (address token0, ) = XchangeLibrary.sortTokens(input, output);
            uint amountOut = amounts[i + 1];
            (uint amount0Out, uint amount1Out) = input == token0 ? (uint(0), amountOut) : (amountOut, uint(0));
            address to = i < path.length - 2 ? XchangeLibrary.pairFor(factory, output, path[i + 2]) : _to;
            IXchangePair(XchangeLibrary.pairFor(factory, input, output)).swap(amount0Out, amount1Out, to, new bytes(0));
        }
    }

    // **** SWAP (supporting fee-on-transfer tokens) ****
    // requires the initial amount to have already been sent to the first pair
    function _swapSupportingFeeOnTransferTokens(address[] memory path, address _to) internal virtual {
        for (uint i; i < path.length - 1; i++) {
            (address input, address output) = (path[i], path[i + 1]);
            (address token0, ) = XchangeLibrary.sortTokens(input, output);
            IXchangePair pair = IXchangePair(XchangeLibrary.pairFor(factory, input, output));
            uint amountInput;
            uint amountOutput;
            {
                // scope to avoid stack too deep errors
                (uint reserve0, uint reserve1, ) = pair.getReserves();
                (uint reserveInput, uint reserveOutput) = input == token0 ? (reserve0, reserve1) : (reserve1, reserve0);
                amountInput = IERC20(input).balanceOf(address(pair)) - reserveInput;
                amountOutput = XchangeLibrary.getAmountOut(amountInput, reserveInput, reserveOutput, 20);
            }
            (uint amount0Out, uint amount1Out) = input == token0 ? (uint(0), amountOutput) : (amountOutput, uint(0));
            address to = i < path.length - 2 ? XchangeLibrary.pairFor(factory, output, path[i + 2]) : _to;
            pair.swap(amount0Out, amount1Out, to, new bytes(0));
        }
    }
}

library XchangeLibrary {
    // returns sorted token addresses, used to handle return values from pairs sorted in this order
    function sortTokens(address tokenA, address tokenB) internal pure returns (address token0, address token1) {
        require(tokenA != tokenB, "XchangeLibrary: IDENTICAL_ADDRESSES");
        (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
        require(token0 != address(0), "XchangeLibrary: ZERO_ADDRESS");
    }

    // calculates the CREATE2 address for a pair without making any external calls
    function pairFor(address factory, address tokenA, address tokenB) internal pure returns (address pair) {
        (address token0, address token1) = sortTokens(tokenA, tokenB);
        pair = address(
            uint160(
                uint(
                    keccak256(
                        abi.encodePacked(
                            hex"ff",
                            factory,
                            keccak256(abi.encodePacked(token0, token1)),
                            hex"d75846df8bac2f946ea9ee78caa53b6812e7514197698275b8322d75e1543193" // init code hash
                        )
                    )
                )
            )
        );
    }

    // fetches and sorts the reserves for a pair
    function getReserves(
        address factory,
        address tokenA,
        address tokenB
    ) internal view returns (uint reserveA, uint reserveB) {
        (address token0, ) = sortTokens(tokenA, tokenB);
        (uint reserve0, uint reserve1, ) = IXchangePair(pairFor(factory, tokenA, tokenB)).getReserves();
        (reserveA, reserveB) = tokenA == token0 ? (reserve0, reserve1) : (reserve1, reserve0);
    }

    // given some amount of an asset and pair reserves, returns an equivalent amount of the other asset
    function quote(uint amountA, uint reserveA, uint reserveB) internal pure returns (uint amountB) {
        require(amountA > 0, "XchangeLibrary: INSUFFICIENT_AMOUNT");
        require(reserveA > 0 && reserveB > 0, "XchangeLibrary: INSUFFICIENT_LIQUIDITY");
        amountB = (amountA * reserveB) / reserveA;
    }

    // given an input amount of an asset and pair reserves, returns the maximum output amount of the other asset
    function getAmountOut(
        uint amountIn,
        uint reserveIn,
        uint reserveOut,
        uint feeAmount
    ) internal pure returns (uint amountOut) {
        require(amountIn > 0, "XchangeLibrary: INSUFFICIENT_INPUT_AMOUNT");
        require(reserveIn > 0 && reserveOut > 0, "XchangeLibrary: INSUFFICIENT_LIQUIDITY");
        require(feeAmount <= 20, "XchangeLibrary: EXCESSIVE_FEE");
        uint amountInWithFee = amountIn * (10000 - feeAmount);
        uint numerator = amountInWithFee * reserveOut;
        uint denominator = (reserveIn * 10000) + amountInWithFee;
        amountOut = numerator / denominator;
    }

    // given an output amount of an asset and pair reserves, returns a required input amount of the other asset
    function getAmountIn(
        uint amountOut,
        uint reserveIn,
        uint reserveOut,
        uint feeAmount
    ) internal pure returns (uint amountIn) {
        require(amountOut > 0, "XchangeLibrary: INSUFFICIENT_OUTPUT_AMOUNT");
        require(reserveIn > 0 && reserveOut > 0, "XchangeLibrary: INSUFFICIENT_LIQUIDITY");
        require(feeAmount <= 20, "XchangeLibrary: EXCESSIVE_FEE");
        uint numerator = reserveIn * amountOut * 10000;
        uint denominator = (reserveOut - amountOut) * (10000 - feeAmount);
        amountIn = (numerator / denominator) + 1;
    }

    // performs chained getAmountOut calculations on any number of pairs
    function getAmountsOut(
        address factory,
        uint amountIn,
        uint feeAmount,
        address[] memory path
    ) internal view returns (uint[] memory amounts) {
        require(path.length >= 2, "XchangeLibrary: INVALID_PATH");
        amounts = new uint[](path.length);
        amounts[0] = amountIn;
        for (uint i; i < path.length - 1; i++) {
            (uint reserveIn, uint reserveOut) = getReserves(factory, path[i], path[i + 1]);
            amounts[i + 1] = getAmountOut(amounts[i], reserveIn, reserveOut, feeAmount);
        }
    }

    // performs chained getAmountIn calculations on any number of pairs
    function getAmountsIn(
        address factory,
        uint amountOut,
        uint feeAmount,
        address[] memory path
    ) internal view returns (uint[] memory amounts) {
        require(path.length >= 2, "XchangeLibrary: INVALID_PATH");
        amounts = new uint[](path.length);
        amounts[amounts.length - 1] = amountOut;
        for (uint i = path.length - 1; i > 0; i--) {
            (uint reserveIn, uint reserveOut) = getReserves(factory, path[i - 1], path[i]);
            amounts[i - 1] = getAmountIn(amounts[i], reserveIn, reserveOut, feeAmount);
        }
    }
}

// helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false
library TransferHelper {
    function safeTransfer(address token, address to, uint value) internal {
        // bytes4(keccak256(bytes('transfer(address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), "TransferHelper: TRANSFER_FAILED");
    }

    function safeTransferFrom(address token, address from, address to, uint value) internal {
        // bytes4(keccak256(bytes('transferFrom(address,address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), "TransferHelper: TRANSFER_FROM_FAILED");
    }

    function safeApprove(address token, address to, uint256 value) internal {
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20.approve.selector, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), "SA");
    }

    function safeTransferETH(address to, uint value) internal {
        (bool success, ) = to.call{ value: value }(new bytes(0));
        require(success, "TransferHelper: ETH_TRANSFER_FAILED");
    }
}

Settings
{
  "evmVersion": "paris",
  "optimizer": {
    "enabled": true,
    "runs": 800
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "metadata": {
    "useLiteralContent": true
  }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_WETH","type":"address"},{"internalType":"address","name":"_owner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"amountADesired","type":"uint256"},{"internalType":"uint256","name":"amountBDesired","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amountTokenDesired","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountIn","outputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsIn","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsOut","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"previousBlockhash","type":"bytes32"},{"internalType":"bytes[]","name":"data","type":"bytes[]"}],"name":"multicall","outputs":[{"internalType":"bytes[]","name":"","type":"bytes[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bytes[]","name":"data","type":"bytes[]"}],"name":"multicall","outputs":[{"internalType":"bytes[]","name":"","type":"bytes[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes[]","name":"data","type":"bytes[]"}],"name":"multicall","outputs":[{"internalType":"bytes[]","name":"results","type":"bytes[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint256","name":"gasAmount","type":"uint256"}],"name":"mustRemoveLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"reserveA","type":"uint256"},{"internalType":"uint256","name":"reserveB","type":"uint256"}],"name":"quote","outputs":[{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETHSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityETHWithPermit","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityETHWithPermitSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityWithPermit","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapETHForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETHSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c060405234801561001057600080fd5b5060405161528a38038061528a83398101604081905261002f916100be565b8061003981610052565b50506001600160a01b039182166080521660a052610101565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80516001600160a01b03811681146100b957600080fd5b919050565b6000806000606084860312156100d357600080fd5b6100dc846100a2565b92506100ea602085016100a2565b91506100f8604085016100a2565b90509250925092565b60805160a051614fea6102a0600039600081816101ec0152818161048401528181610680015281816106cf015281816107b001528181610a3901528181610e820152818161106a0152818161146b015281816115760152818161165d01528181611713015281816118970152818161192501528181611d3401528181611dec01528181611ea001528181611f4501528181611fb90152818161249a0152818161277b015281816127d1015281816128050152818161289a01528181612cda01528181612e460152612ed401526000818161052b015281816108540152818161096401528181610b1f01528181610bca01528181610cfe01528181610f2601528181611048015281816111bc015281816117b60152818161195701528181611ac701528181611feb015281816122420152818161244601528181612478015281816125de015281816127af01528181612a0a01528181612a8d01528181612d7d01528181612f0601528181613882015281816138d201528181613b9701528181613d50015281816142670152818161430901526143800152614fea6000f3fe6080604052600436106101dc5760003560e01c80638803dbee11610102578063c45a015511610095578063f2fde38b11610064578063f2fde38b146105c8578063f305d719146105e8578063f84b6a4c146105fb578063fb3bdb411461061b57600080fd5b8063c45a015514610519578063d06ca61f1461054d578063ded9382a1461056d578063e8e337001461058d57600080fd5b8063ad615dec116100d1578063ad615dec146104a6578063af2979eb146104c6578063b6f9de95146104e6578063baa2abde146104f957600080fd5b80638803dbee1461040d5780638da5cb5b1461042d578063ac9650d81461045f578063ad5c46481461047257600080fd5b80634a25d94a1161017a578063715018a611610149578063715018a6146103a5578063791ac947146103ba5780637ff36ab5146103da57806385f8c259146103ed57600080fd5b80634a25d94a146103325780635ae401dc146103525780635b0d5984146103655780635c11d7951461038557600080fd5b80631f00ca74116101b65780631f00ca74146102b25780631f0464d1146102d25780632195995c146102f257806338ed17391461031257600080fd5b806302751cec1461021d578063054d50d41461025757806318cbafe51461028557600080fd5b3661021857336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461021657600080fd5b005b600080fd5b34801561022957600080fd5b5061023d6102383660046145aa565b61062e565b604080519283526020830191909152015b60405180910390f35b34801561026357600080fd5b50610277610272366004614608565b610749565b60405190815260200161024e565b34801561029157600080fd5b506102a56102a0366004614679565b610760565b60405161024e91906146ec565b3480156102be57600080fd5b506102a56102cd366004614777565b610b18565b6102e56102e0366004614835565b610b50565b60405161024e91906148d1565b3480156102fe57600080fd5b5061023d61030d366004614959565b610bc0565b34801561031e57600080fd5b506102a561032d366004614679565b610cb3565b34801561033e57600080fd5b506102a561034d366004614679565b610e32565b6102e5610360366004614835565b610fed565b34801561037157600080fd5b50610277610380366004614a03565b611040565b34801561039157600080fd5b506102166103a0366004614679565b611147565b3480156103b157600080fd5b50610216611409565b3480156103c657600080fd5b506102166103d5366004614679565b61141d565b6102a56103e8366004614a99565b6116cb565b3480156103f957600080fd5b50610277610408366004614608565b611a6d565b34801561041957600080fd5b506102a5610428366004614679565b611a7c565b34801561043957600080fd5b506000546001600160a01b03165b6040516001600160a01b03909116815260200161024e565b6102e561046d366004614b00565b611b8e565b34801561047e57600080fd5b506104477f000000000000000000000000000000000000000000000000000000000000000081565b3480156104b257600080fd5b506102776104c1366004614608565b611cdb565b3480156104d257600080fd5b506102776104e13660046145aa565b611ce8565b6102166104f4366004614a99565b611e5a565b34801561050557600080fd5b5061023d610514366004614b42565b6121f4565b34801561052557600080fd5b506104477f000000000000000000000000000000000000000000000000000000000000000081565b34801561055957600080fd5b506102a5610568366004614777565b61243f565b34801561057957600080fd5b5061023d610588366004614a03565b61246e565b34801561059957600080fd5b506105ad6105a8366004614bb4565b61257b565b6040805193845260208401929092529082015260600161024e565b3480156105d457600080fd5b506102166105e3366004614c30565b61269c565b6105ad6105f63660046145aa565b61272c565b34801561060757600080fd5b5061023d610616366004614c54565b6129ae565b6102a5610629366004614a99565b612c92565b600080824281101561067a5760405162461bcd60e51b815260206004820152601060248201526f1618da185b99d94e881156141254915160821b60448201526064015b60405180910390fd5b6106a9897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a6121f4565b90935091506106b989868561305e565b604051632e1a7d4d60e01b8152600481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401600060405180830381600087803b15801561071b57600080fd5b505af115801561072f573d6000803e3d6000fd5b5050505061073d858361318e565b50965096945050505050565b6000610758848484601461325c565b949350505050565b606081428110156107a65760405162461bcd60e51b815260206004820152601060248201526f1618da185b99d94e881156141254915160821b6044820152606401610671565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001686866107dd600182614ce4565b8181106107ec576107ec614cf7565b90506020020160208101906108019190614c30565b6001600160a01b03161461084f5760405162461bcd60e51b81526020600482015260156024820152740b0c6d0c2dcceca7440929cac82989288bea082a89605b1b6044820152606401610671565b6108af7f00000000000000000000000000000000000000000000000000000000000000008960148989808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506133e892505050565b91508682600184516108c19190614ce4565b815181106108d1576108d1614cf7565b602002602001015110156109335760405162461bcd60e51b815260206004820152602360248201527f586368616e67653a20494e53554646494349454e545f4f55545055545f414d4f60448201526215539560ea1b6064820152608401610671565b6109f88686600081811061094957610949614cf7565b905060200201602081019061095e9190614c30565b336109d87f00000000000000000000000000000000000000000000000000000000000000008a8a600081811061099657610996614cf7565b90506020020160208101906109ab9190614c30565b8b8b60018181106109be576109be614cf7565b90506020020160208101906109d39190614c30565b613569565b856000815181106109eb576109eb614cf7565b602002602001015161365a565b610a378287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525030925061379f915050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d8360018551610a759190614ce4565b81518110610a8557610a85614cf7565b60200260200101516040518263ffffffff1660e01b8152600401610aab91815260200190565b600060405180830381600087803b158015610ac557600080fd5b505af1158015610ad9573d6000803e3d6000fd5b50505050610b0d848360018551610af09190614ce4565b81518110610b0057610b00614cf7565b602002602001015161318e565b509695505050505050565b6060610b477f0000000000000000000000000000000000000000000000000000000000000000846014856139a0565b90505b92915050565b60608380610b5f600143614ce4565b4014610bad5760405162461bcd60e51b815260206004820152600960248201527f426c6f636b6861736800000000000000000000000000000000000000000000006044820152606401610671565b610bb78484611b8e565b95945050505050565b6000806000610bf07f00000000000000000000000000000000000000000000000000000000000000008f8f613569565b9050600087610bff578c610c03565b6000195b60405163d505accf60e01b815233600482015230602482015260448101829052606481018b905260ff8916608482015260a4810188905260c481018790529091506001600160a01b0383169063d505accf9060e401600060405180830381600087803b158015610c7257600080fd5b505af1158015610c86573d6000803e3d6000fd5b50505050610c998f8f8f8f8f8f8f6121f4565b809450819550505050509b509b9950505050505050505050565b60608142811015610cf95760405162461bcd60e51b815260206004820152601060248201526f1618da185b99d94e881156141254915160821b6044820152606401610671565b610d597f00000000000000000000000000000000000000000000000000000000000000008960148989808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506133e892505050565b9150868260018451610d6b9190614ce4565b81518110610d7b57610d7b614cf7565b60200260200101511015610ddd5760405162461bcd60e51b815260206004820152602360248201527f586368616e67653a20494e53554646494349454e545f4f55545055545f414d4f60448201526215539560ea1b6064820152608401610671565b610df38686600081811061094957610949614cf7565b610b0d8287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525089925061379f915050565b60608142811015610e785760405162461bcd60e51b815260206004820152601060248201526f1618da185b99d94e881156141254915160821b6044820152606401610671565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168686610eaf600182614ce4565b818110610ebe57610ebe614cf7565b9050602002016020810190610ed39190614c30565b6001600160a01b031614610f215760405162461bcd60e51b81526020600482015260156024820152740b0c6d0c2dcceca7440929cac82989288bea082a89605b1b6044820152606401610671565b610f817f00000000000000000000000000000000000000000000000000000000000000008960148989808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506139a092505050565b91508682600081518110610f9757610f97614cf7565b602002602001015111156109335760405162461bcd60e51b815260206004820152601f60248201527f586368616e67653a204558434553534956455f494e5055545f414d4f554e54006044820152606401610671565b60608380421115610bad5760405162461bcd60e51b815260206004820152601360248201527f5472616e73616374696f6e20746f6f206f6c64000000000000000000000000006044820152606401610671565b60008061108e7f00000000000000000000000000000000000000000000000000000000000000008d7f0000000000000000000000000000000000000000000000000000000000000000613569565b905060008661109d578b6110a1565b6000195b60405163d505accf60e01b815233600482015230602482015260448101829052606481018a905260ff8816608482015260a4810187905260c481018690529091506001600160a01b0383169063d505accf9060e401600060405180830381600087803b15801561111057600080fd5b505af1158015611124573d6000803e3d6000fd5b505050506111368d8d8d8d8d8d611ce8565b9d9c50505050505050505050505050565b804281101561118b5760405162461bcd60e51b815260206004820152601060248201526f1618da185b99d94e881156141254915160821b6044820152606401610671565b61121c858560008181106111a1576111a1614cf7565b90506020020160208101906111b69190614c30565b336112167f0000000000000000000000000000000000000000000000000000000000000000898960008181106111ee576111ee614cf7565b90506020020160208101906112039190614c30565b8a8a60018181106109be576109be614cf7565b8a61365a565b6000858561122b600182614ce4565b81811061123a5761123a614cf7565b905060200201602081019061124f9190614c30565b6040516370a0823160e01b81526001600160a01b03868116600483015291909116906370a0823190602401602060405180830381865afa158015611297573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112bb9190614d0d565b90506112fb868680806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250889250613b22915050565b8681878761130a600182614ce4565b81811061131957611319614cf7565b905060200201602081019061132e9190614c30565b6040516370a0823160e01b81526001600160a01b03888116600483015291909116906370a08231906024015b602060405180830381865afa158015611377573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061139b9190614d0d565b6113a59190614ce4565b10156113ff5760405162461bcd60e51b815260206004820152602360248201527f586368616e67653a20494e53554646494349454e545f4f55545055545f414d4f60448201526215539560ea1b6064820152608401610671565b5050505050505050565b611411613e05565b61141b6000613e6e565b565b80428110156114615760405162461bcd60e51b815260206004820152601060248201526f1618da185b99d94e881156141254915160821b6044820152606401610671565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168585611498600182614ce4565b8181106114a7576114a7614cf7565b90506020020160208101906114bc9190614c30565b6001600160a01b03161461150a5760405162461bcd60e51b81526020600482015260156024820152740b0c6d0c2dcceca7440929cac82989288bea082a89605b1b6044820152606401610671565b611520858560008181106111a1576111a1614cf7565b61155e858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613b22915050565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa1580156115c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115e99190614d0d565b9050868110156116475760405162461bcd60e51b815260206004820152602360248201527f586368616e67653a20494e53554646494349454e545f4f55545055545f414d4f60448201526215539560ea1b6064820152608401610671565b604051632e1a7d4d60e01b8152600481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401600060405180830381600087803b1580156116a957600080fd5b505af11580156116bd573d6000803e3d6000fd5b505050506113ff848261318e565b606081428110156117115760405162461bcd60e51b815260206004820152601060248201526f1618da185b99d94e881156141254915160821b6044820152606401610671565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168686600081811061174e5761174e614cf7565b90506020020160208101906117639190614c30565b6001600160a01b0316146117b15760405162461bcd60e51b81526020600482015260156024820152740b0c6d0c2dcceca7440929cac82989288bea082a89605b1b6044820152606401610671565b6118117f00000000000000000000000000000000000000000000000000000000000000003460148989808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506133e892505050565b91508682600184516118239190614ce4565b8151811061183357611833614cf7565b602002602001015110156118955760405162461bcd60e51b815260206004820152602360248201527f586368616e67653a20494e53554646494349454e545f4f55545055545f414d4f60448201526215539560ea1b6064820152608401610671565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0836000815181106118d7576118d7614cf7565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561190a57600080fd5b505af115801561191e573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6119897f0000000000000000000000000000000000000000000000000000000000000000898960008181106111ee576111ee614cf7565b8460008151811061199c5761199c614cf7565b60200260200101516040518363ffffffff1660e01b81526004016119d59291906001600160a01b03929092168252602082015260400190565b6020604051808303816000875af11580156119f4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a189190614d26565b611a2457611a24614d43565b611a638287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525089925061379f915050565b5095945050505050565b60006107588484846014613ed6565b60608142811015611ac25760405162461bcd60e51b815260206004820152601060248201526f1618da185b99d94e881156141254915160821b6044820152606401610671565b611b227f00000000000000000000000000000000000000000000000000000000000000008960148989808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506139a092505050565b91508682600081518110611b3857611b38614cf7565b60200260200101511115610ddd5760405162461bcd60e51b815260206004820152601f60248201527f586368616e67653a204558434553534956455f494e5055545f414d4f554e54006044820152606401610671565b60608167ffffffffffffffff811115611ba957611ba9614730565b604051908082528060200260200182016040528015611bdc57816020015b6060815260200190600190039081611bc75790505b50905060005b82811015611cd45760008030868685818110611c0057611c00614cf7565b9050602002810190611c129190614d59565b604051611c20929190614da0565b600060405180830381855af49150503d8060008114611c5b576040519150601f19603f3d011682016040523d82523d6000602084013e611c60565b606091505b509150915081611cac57604481511015611c7957600080fd5b60048101905080806020019051810190611c939190614db0565b60405162461bcd60e51b81526004016106719190614e3b565b80848481518110611cbf57611cbf614cf7565b60209081029190910101525050600101611be2565b5092915050565b6000610758848484614067565b60008142811015611d2e5760405162461bcd60e51b815260206004820152601060248201526f1618da185b99d94e881156141254915160821b6044820152606401610671565b611d5d887f000000000000000000000000000000000000000000000000000000000000000089898930896121f4565b6040516370a0823160e01b8152306004820152909350611dd69150899086906001600160a01b038316906370a0823190602401602060405180830381865afa158015611dad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dd19190614d0d565b61305e565b604051632e1a7d4d60e01b8152600481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401600060405180830381600087803b158015611e3857600080fd5b505af1158015611e4c573d6000803e3d6000fd5b50505050610b0d848361318e565b8042811015611e9e5760405162461bcd60e51b815260206004820152601060248201526f1618da185b99d94e881156141254915160821b6044820152606401610671565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685856000818110611edb57611edb614cf7565b9050602002016020810190611ef09190614c30565b6001600160a01b031614611f3e5760405162461bcd60e51b81526020600482015260156024820152740b0c6d0c2dcceca7440929cac82989288bea082a89605b1b6044820152606401610671565b60003490507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015611f9e57600080fd5b505af1158015611fb2573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb61201d7f0000000000000000000000000000000000000000000000000000000000000000898960008181106111ee576111ee614cf7565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303816000875af1158015612082573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120a69190614d26565b6120b2576120b2614d43565b600086866120c1600182614ce4565b8181106120d0576120d0614cf7565b90506020020160208101906120e59190614c30565b6040516370a0823160e01b81526001600160a01b03878116600483015291909116906370a0823190602401602060405180830381865afa15801561212d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121519190614d0d565b9050612191878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613b22915050565b878188886121a0600182614ce4565b8181106121af576121af614cf7565b90506020020160208101906121c49190614c30565b6040516370a0823160e01b81526001600160a01b03898116600483015291909116906370a082319060240161135a565b600080824281101561223b5760405162461bcd60e51b815260206004820152601060248201526f1618da185b99d94e881156141254915160821b6044820152606401610671565b60006122687f00000000000000000000000000000000000000000000000000000000000000008c8c613569565b6040516323b872dd60e01b81523360048201526001600160a01b03821660248201819052604482018c90529192506323b872dd906064016020604051808303816000875af11580156122be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122e29190614d26565b5060405163226bf2d160e21b81526001600160a01b03878116600483015260009182918416906389afcb449060240160408051808303816000875af115801561232f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123539190614e4e565b9150915060006123638e8e614144565b509050806001600160a01b03168e6001600160a01b031614612386578183612389565b82825b90975095508a8710156123de5760405162461bcd60e51b815260206004820152601e60248201527f586368616e67653a20494e53554646494349454e545f415f414d4f554e5400006044820152606401610671565b8986101561242e5760405162461bcd60e51b815260206004820152601e60248201527f586368616e67653a20494e53554646494349454e545f425f414d4f554e5400006044820152606401610671565b505050505097509795505050505050565b6060610b477f0000000000000000000000000000000000000000000000000000000000000000846014856133e8565b60008060006124be7f00000000000000000000000000000000000000000000000000000000000000008e7f0000000000000000000000000000000000000000000000000000000000000000613569565b90506000876124cd578c6124d1565b6000195b60405163d505accf60e01b815233600482015230602482015260448101829052606481018b905260ff8916608482015260a4810188905260c481018790529091506001600160a01b0383169063d505accf9060e401600060405180830381600087803b15801561254057600080fd5b505af1158015612554573d6000803e3d6000fd5b505050506125668e8e8e8e8e8e61062e565b909f909e509c50505050505050505050505050565b600080600083428110156125c45760405162461bcd60e51b815260206004820152601060248201526f1618da185b99d94e881156141254915160821b6044820152606401610671565b6125d28c8c8c8c8c8c614239565b909450925060006126047f00000000000000000000000000000000000000000000000000000000000000008e8e613569565b90506126128d33838861365a565b61261e8c33838761365a565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a627842906024016020604051808303816000875af1158015612666573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061268a9190614d0d565b92505050985098509895505050505050565b6126a4613e05565b6001600160a01b0381166127205760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610671565b61272981613e6e565b50565b600080600083428110156127755760405162461bcd60e51b815260206004820152601060248201526f1618da185b99d94e881156141254915160821b6044820152606401610671565b6127a38a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c614239565b909450925060006127f57f00000000000000000000000000000000000000000000000000000000000000008c7f0000000000000000000000000000000000000000000000000000000000000000613569565b90506128038b33838861365a565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b15801561285e57600080fd5b505af1158015612872573d6000803e3d6000fd5b505060405163a9059cbb60e01b81526001600160a01b038581166004830152602482018990527f000000000000000000000000000000000000000000000000000000000000000016935063a9059cbb925060440190506020604051808303816000875af11580156128e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061290b9190614d26565b61291757612917614d43565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a627842906024016020604051808303816000875af115801561295f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129839190614d0d565b9250833411156129a0576129a03361299b8634614ce4565b61318e565b505096509650969350505050565b60008083428110156129f55760405162461bcd60e51b815260206004820152601060248201526f1618da185b99d94e881156141254915160821b6044820152606401610671565b604051632eb8193d60e21b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063bae064f490602401602060405180830381865afa158015612a59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a7d9190614d26565b612a8657600080fd5b6000612ab37f00000000000000000000000000000000000000000000000000000000000000008d8d613569565b6040516323b872dd60e01b81523360048201526001600160a01b03821660248201819052604482018d90529192506323b872dd906064016020604051808303816000875af1158015612b09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b2d9190614d26565b5060405163023d845560e21b81526001600160a01b0388811660048301526024820187905260009182918416906308f611549060440160408051808303816000875af1158015612b81573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ba59190614e4e565b915091506000612bb58f8f614144565b509050806001600160a01b03168f6001600160a01b031614612bd8578183612bdb565b82825b90975095508b871015612c305760405162461bcd60e51b815260206004820152601e60248201527f586368616e67653a20494e53554646494349454e545f415f414d4f554e5400006044820152606401610671565b8a861015612c805760405162461bcd60e51b815260206004820152601e60248201527f586368616e67653a20494e53554646494349454e545f425f414d4f554e5400006044820152606401610671565b50505050509850989650505050505050565b60608142811015612cd85760405162461bcd60e51b815260206004820152601060248201526f1618da185b99d94e881156141254915160821b6044820152606401610671565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110612d1557612d15614cf7565b9050602002016020810190612d2a9190614c30565b6001600160a01b031614612d785760405162461bcd60e51b81526020600482015260156024820152740b0c6d0c2dcceca7440929cac82989288bea082a89605b1b6044820152606401610671565b612dd87f00000000000000000000000000000000000000000000000000000000000000008860148989808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506139a092505050565b91503482600081518110612dee57612dee614cf7565b60200260200101511115612e445760405162461bcd60e51b815260206004820152601f60248201527f586368616e67653a204558434553534956455f494e5055545f414d4f554e54006044820152606401610671565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db083600081518110612e8657612e86614cf7565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015612eb957600080fd5b505af1158015612ecd573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb612f387f0000000000000000000000000000000000000000000000000000000000000000898960008181106111ee576111ee614cf7565b84600081518110612f4b57612f4b614cf7565b60200260200101516040518363ffffffff1660e01b8152600401612f849291906001600160a01b03929092168252602082015260400190565b6020604051808303816000875af1158015612fa3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fc79190614d26565b612fd357612fd3614d43565b6130128287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525089925061379f915050565b8160008151811061302557613025614cf7565b6020026020010151341115611a6357611a63338360008151811061304b5761304b614cf7565b60200260200101513461299b9190614ce4565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1663a9059cbb60e01b17905291516000928392908716916130cf9190614e72565b6000604051808303816000865af19150503d806000811461310c576040519150601f19603f3d011682016040523d82523d6000602084013e613111565b606091505b509150915081801561313b57508051158061313b57508080602001905181019061313b9190614d26565b6131875760405162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c4544006044820152606401610671565b5050505050565b604080516000808252602082019092526001600160a01b0384169083906040516131b89190614e72565b60006040518083038185875af1925050503d80600081146131f5576040519150601f19603f3d011682016040523d82523d6000602084013e6131fa565b606091505b50509050806132575760405162461bcd60e51b815260206004820152602360248201527f5472616e7366657248656c7065723a204554485f5452414e534645525f46414960448201526213115160ea1b6064820152608401610671565b505050565b60008085116132d35760405162461bcd60e51b815260206004820152602960248201527f586368616e67654c6962726172793a20494e53554646494349454e545f494e5060448201527f55545f414d4f554e5400000000000000000000000000000000000000000000006064820152608401610671565b6000841180156132e35750600083115b61333e5760405162461bcd60e51b815260206004820152602660248201527f586368616e67654c6962726172793a20494e53554646494349454e545f4c495160448201526555494449545960d01b6064820152608401610671565b601482111561338f5760405162461bcd60e51b815260206004820152601d60248201527f586368616e67654c6962726172793a204558434553534956455f4645450000006044820152606401610671565b600061339d83612710614ce4565b6133a79087614e8e565b905060006133b58583614e8e565b90506000826133c688612710614e8e565b6133d09190614ea5565b90506133dc8183614eb8565b98975050505050505050565b606060028251101561343c5760405162461bcd60e51b815260206004820152601c60248201527f586368616e67654c6962726172793a20494e56414c49445f50415448000000006044820152606401610671565b815167ffffffffffffffff81111561345657613456614730565b60405190808252806020026020018201604052801561347f578160200160208202803683370190505b509050838160008151811061349657613496614cf7565b60200260200101818152505060005b600183516134b39190614ce4565b81101561356057600080613506888685815181106134d3576134d3614cf7565b6020026020010151878660016134e99190614ea5565b815181106134f9576134f9614cf7565b60200260200101516144bd565b9150915061352f84848151811061351f5761351f614cf7565b602002602001015183838961325c565b8461353b856001614ea5565b8151811061354b5761354b614cf7565b602090810291909101015250506001016134a5565b50949350505050565b60008060006135788585614144565b6040516bffffffffffffffffffffffff19606084811b8216602084015283901b16603482015291935091508690604801604051602081830303815290604052805190602001206040516020016136389291907fff00000000000000000000000000000000000000000000000000000000000000815260609290921b6bffffffffffffffffffffffff1916600183015260158201527fd75846df8bac2f946ea9ee78caa53b6812e7514197698275b8322d75e1543193603582015260550190565b60408051601f1981840301815291905280516020909101209695505050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166323b872dd60e01b17905291516000928392908816916136d39190614e72565b6000604051808303816000865af19150503d8060008114613710576040519150601f19603f3d011682016040523d82523d6000602084013e613715565b606091505b509150915081801561373f57508051158061373f57508080602001905181019061373f9190614d26565b6137975760405162461bcd60e51b8152602060048201526024808201527f5472616e7366657248656c7065723a205452414e534645525f46524f4d5f46416044820152631253115160e21b6064820152608401610671565b505050505050565b60005b600183516137b09190614ce4565b81101561399a576000808483815181106137cc576137cc614cf7565b6020026020010151858460016137e29190614ea5565b815181106137f2576137f2614cf7565b602002602001015191509150600061380a8383614144565b50905060008761381b866001614ea5565b8151811061382b5761382b614cf7565b60200260200101519050600080836001600160a01b0316866001600160a01b0316146138595782600061385d565b6000835b91509150600060028a516138719190614ce4565b881061387d57886138cb565b6138cb7f0000000000000000000000000000000000000000000000000000000000000000878c6138ae8c6002614ea5565b815181106138be576138be614cf7565b6020026020010151613569565b90506138f87f00000000000000000000000000000000000000000000000000000000000000008888613569565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f191660200182016040528015613935576020820181803683370190505b506040518563ffffffff1660e01b81526004016139559493929190614eda565b600060405180830381600087803b15801561396f57600080fd5b505af1158015613983573d6000803e3d6000fd5b5050600190990198506137a2975050505050505050565b50505050565b60606002825110156139f45760405162461bcd60e51b815260206004820152601c60248201527f586368616e67654c6962726172793a20494e56414c49445f50415448000000006044820152606401610671565b815167ffffffffffffffff811115613a0e57613a0e614730565b604051908082528060200260200182016040528015613a37578160200160208202803683370190505b509050838160018351613a4a9190614ce4565b81518110613a5a57613a5a614cf7565b602002602001018181525050600060018351613a769190614ce4565b90505b801561356057600080613abc8886613a92600187614ce4565b81518110613aa257613aa2614cf7565b60200260200101518786815181106134f9576134f9614cf7565b91509150613ae5848481518110613ad557613ad5614cf7565b6020026020010151838389613ed6565b84613af1600186614ce4565b81518110613b0157613b01614cf7565b60200260200101818152505050508080613b1a90614f12565b915050613a79565b60005b60018351613b339190614ce4565b81101561325757600080848381518110613b4f57613b4f614cf7565b602002602001015185846001613b659190614ea5565b81518110613b7557613b75614cf7565b6020026020010151915091506000613b8d8383614144565b5090506000613bbd7f00000000000000000000000000000000000000000000000000000000000000008585613569565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015613c03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c279190614f47565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff169150600080876001600160a01b03168a6001600160a01b031614613c6f578284613c72565b83835b6040516370a0823160e01b81526001600160a01b038a8116600483015292945090925083918c16906370a0823190602401602060405180830381865afa158015613cc0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ce49190614d0d565b613cee9190614ce4565b9550613cfd868383601461325c565b945050505050600080856001600160a01b0316886001600160a01b031614613d2757826000613d2b565b6000835b91509150600060028c51613d3f9190614ce4565b8a10613d4b578a613d7c565b613d7c7f0000000000000000000000000000000000000000000000000000000000000000898e6138ae8e6002614ea5565b6040805160008152602081019182905263022c0d9f60e01b9091529091506001600160a01b0387169063022c0d9f90613dbe9086908690869060248101614eda565b600060405180830381600087803b158015613dd857600080fd5b505af1158015613dec573d6000803e3d6000fd5b50506001909b019a50613b259950505050505050505050565b33613e186000546001600160a01b031690565b6001600160a01b03161461141b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610671565b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000808511613f4d5760405162461bcd60e51b815260206004820152602a60248201527f586368616e67654c6962726172793a20494e53554646494349454e545f4f555460448201527f5055545f414d4f554e54000000000000000000000000000000000000000000006064820152608401610671565b600084118015613f5d5750600083115b613fb85760405162461bcd60e51b815260206004820152602660248201527f586368616e67654c6962726172793a20494e53554646494349454e545f4c495160448201526555494449545960d01b6064820152608401610671565b60148211156140095760405162461bcd60e51b815260206004820152601d60248201527f586368616e67654c6962726172793a204558434553534956455f4645450000006044820152606401610671565b60006140158686614e8e565b61402190612710614e8e565b9050600061403184612710614ce4565b61403b8887614ce4565b6140459190614e8e565b90506140518183614eb8565b61405c906001614ea5565b979650505050505050565b60008084116140c45760405162461bcd60e51b815260206004820152602360248201527f586368616e67654c6962726172793a20494e53554646494349454e545f414d4f60448201526215539560ea1b6064820152608401610671565b6000831180156140d45750600082115b61412f5760405162461bcd60e51b815260206004820152602660248201527f586368616e67654c6962726172793a20494e53554646494349454e545f4c495160448201526555494449545960d01b6064820152608401610671565b8261413a8386614e8e565b6107589190614eb8565b600080826001600160a01b0316846001600160a01b0316036141b45760405162461bcd60e51b815260206004820152602360248201527f586368616e67654c6962726172793a204944454e544943414c5f41444452455360448201526253455360e81b6064820152608401610671565b826001600160a01b0316846001600160a01b0316106141d45782846141d7565b83835b90925090506001600160a01b0382166142325760405162461bcd60e51b815260206004820152601c60248201527f586368616e67654c6962726172793a205a45524f5f41444452455353000000006044820152606401610671565b9250929050565b60405163e6a4390560e01b81526001600160a01b0387811660048301528681166024830152600091829182917f00000000000000000000000000000000000000000000000000000000000000009091169063e6a4390590604401602060405180830381865afa1580156142b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142d49190614f97565b6001600160a01b031603614378576040516364e329cb60e11b81526001600160a01b03898116600483015288811660248301527f0000000000000000000000000000000000000000000000000000000000000000169063c9c65396906044016020604051808303816000875af1158015614352573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906143769190614f97565b505b6000806143a67f00000000000000000000000000000000000000000000000000000000000000008b8b6144bd565b915091508160001480156143b8575080155b156143c8578793508692506144b0565b60006143d5898484614067565b9050878111614439578581101561442e5760405162461bcd60e51b815260206004820152601e60248201527f586368616e67653a20494e53554646494349454e545f425f414d4f554e5400006044820152606401610671565b8894509250826144ae565b6000614446898486614067565b90508981111561445857614458614d43565b878110156144a85760405162461bcd60e51b815260206004820152601e60248201527f586368616e67653a20494e53554646494349454e545f415f414d4f554e5400006044820152606401610671565b94508793505b505b5050965096945050505050565b60008060006144cc8585614144565b5090506000806144dd888888613569565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa15801561451a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061453e9190614f47565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff169150826001600160a01b0316876001600160a01b031614614583578082614586565b81815b90999098509650505050505050565b6001600160a01b038116811461272957600080fd5b60008060008060008060c087890312156145c357600080fd5b86356145ce81614595565b955060208701359450604087013593506060870135925060808701356145f381614595565b8092505060a087013590509295509295509295565b60008060006060848603121561461d57600080fd5b505081359360208301359350604090920135919050565b60008083601f84011261464657600080fd5b50813567ffffffffffffffff81111561465e57600080fd5b6020830191508360208260051b850101111561423257600080fd5b60008060008060008060a0878903121561469257600080fd5b8635955060208701359450604087013567ffffffffffffffff8111156146b757600080fd5b6146c389828a01614634565b90955093505060608701356146d781614595565b80925050608087013590509295509295509295565b6020808252825182820181905260009190848201906040850190845b8181101561472457835183529284019291840191600101614708565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561476f5761476f614730565b604052919050565b6000806040838503121561478a57600080fd5b8235915060208084013567ffffffffffffffff808211156147aa57600080fd5b818601915086601f8301126147be57600080fd5b8135818111156147d0576147d0614730565b8060051b91506147e1848301614746565b81815291830184019184810190898411156147fb57600080fd5b938501935b83851015614825578435925061481583614595565b8282529385019390850190614800565b8096505050505050509250929050565b60008060006040848603121561484a57600080fd5b83359250602084013567ffffffffffffffff81111561486857600080fd5b61487486828701614634565b9497909650939450505050565b60005b8381101561489c578181015183820152602001614884565b50506000910152565b600081518084526148bd816020860160208601614881565b601f01601f19169290920160200192915050565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b8281101561492857603f198886030184526149168583516148a5565b945092850192908501906001016148fa565b5092979650505050505050565b801515811461272957600080fd5b803560ff8116811461495457600080fd5b919050565b60008060008060008060008060008060006101608c8e03121561497b57600080fd5b8b3561498681614595565b9a5060208c013561499681614595565b995060408c0135985060608c0135975060808c0135965060a08c01356149bb81614595565b955060c08c0135945060e08c01356149d281614935565b93506149e16101008d01614943565b92506101208c013591506101408c013590509295989b509295989b9093969950565b6000806000806000806000806000806101408b8d031215614a2357600080fd5b8a35614a2e81614595565b995060208b0135985060408b0135975060608b0135965060808b0135614a5381614595565b955060a08b0135945060c08b0135614a6a81614935565b9350614a7860e08c01614943565b92506101008b013591506101208b013590509295989b9194979a5092959850565b600080600080600060808688031215614ab157600080fd5b85359450602086013567ffffffffffffffff811115614acf57600080fd5b614adb88828901614634565b9095509350506040860135614aef81614595565b949793965091946060013592915050565b60008060208385031215614b1357600080fd5b823567ffffffffffffffff811115614b2a57600080fd5b614b3685828601614634565b90969095509350505050565b600080600080600080600060e0888a031215614b5d57600080fd5b8735614b6881614595565b96506020880135614b7881614595565b955060408801359450606088013593506080880135925060a0880135614b9d81614595565b8092505060c0880135905092959891949750929550565b600080600080600080600080610100898b031215614bd157600080fd5b8835614bdc81614595565b97506020890135614bec81614595565b965060408901359550606089013594506080890135935060a0890135925060c0890135614c1881614595565b8092505060e089013590509295985092959890939650565b600060208284031215614c4257600080fd5b8135614c4d81614595565b9392505050565b600080600080600080600080610100898b031215614c7157600080fd5b8835614c7c81614595565b97506020890135614c8c81614595565b965060408901359550606089013594506080890135935060a0890135614cb181614595565b979a969950949793969295929450505060c08201359160e0013590565b634e487b7160e01b600052601160045260246000fd5b81810381811115610b4a57610b4a614cce565b634e487b7160e01b600052603260045260246000fd5b600060208284031215614d1f57600080fd5b5051919050565b600060208284031215614d3857600080fd5b8151614c4d81614935565b634e487b7160e01b600052600160045260246000fd5b6000808335601e19843603018112614d7057600080fd5b83018035915067ffffffffffffffff821115614d8b57600080fd5b60200191503681900382131561423257600080fd5b8183823760009101908152919050565b600060208284031215614dc257600080fd5b815167ffffffffffffffff80821115614dda57600080fd5b818401915084601f830112614dee57600080fd5b815181811115614e0057614e00614730565b614e13601f8201601f1916602001614746565b9150808252856020828501011115614e2a57600080fd5b613560816020840160208601614881565b602081526000610b4760208301846148a5565b60008060408385031215614e6157600080fd5b505080516020909101519092909150565b60008251614e84818460208701614881565b9190910192915050565b8082028115828204841417610b4a57610b4a614cce565b80820180821115610b4a57610b4a614cce565b600082614ed557634e487b7160e01b600052601260045260246000fd5b500490565b8481528360208201526001600160a01b0383166040820152608060608201526000614f0860808301846148a5565b9695505050505050565b600081614f2157614f21614cce565b506000190190565b80516dffffffffffffffffffffffffffff8116811461495457600080fd5b600080600060608486031215614f5c57600080fd5b614f6584614f29565b9250614f7360208501614f29565b9150604084015163ffffffff81168114614f8c57600080fd5b809150509250925092565b600060208284031215614fa957600080fd5b8151614c4d8161459556fea2646970667358221220d23ee3d8868e7b0bfdaba3641ca226722f56cc412625496b8fe1db314b7f995664736f6c634300081900330000000000000000000000008b76c05676d205563ffc1cbd11c0a6e3d83929c5000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000f7c5c8bdd689767e039c631ad42482128bd54ba3

Deployed Bytecode

0x6080604052600436106101dc5760003560e01c80638803dbee11610102578063c45a015511610095578063f2fde38b11610064578063f2fde38b146105c8578063f305d719146105e8578063f84b6a4c146105fb578063fb3bdb411461061b57600080fd5b8063c45a015514610519578063d06ca61f1461054d578063ded9382a1461056d578063e8e337001461058d57600080fd5b8063ad615dec116100d1578063ad615dec146104a6578063af2979eb146104c6578063b6f9de95146104e6578063baa2abde146104f957600080fd5b80638803dbee1461040d5780638da5cb5b1461042d578063ac9650d81461045f578063ad5c46481461047257600080fd5b80634a25d94a1161017a578063715018a611610149578063715018a6146103a5578063791ac947146103ba5780637ff36ab5146103da57806385f8c259146103ed57600080fd5b80634a25d94a146103325780635ae401dc146103525780635b0d5984146103655780635c11d7951461038557600080fd5b80631f00ca74116101b65780631f00ca74146102b25780631f0464d1146102d25780632195995c146102f257806338ed17391461031257600080fd5b806302751cec1461021d578063054d50d41461025757806318cbafe51461028557600080fd5b3661021857336001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2161461021657600080fd5b005b600080fd5b34801561022957600080fd5b5061023d6102383660046145aa565b61062e565b604080519283526020830191909152015b60405180910390f35b34801561026357600080fd5b50610277610272366004614608565b610749565b60405190815260200161024e565b34801561029157600080fd5b506102a56102a0366004614679565b610760565b60405161024e91906146ec565b3480156102be57600080fd5b506102a56102cd366004614777565b610b18565b6102e56102e0366004614835565b610b50565b60405161024e91906148d1565b3480156102fe57600080fd5b5061023d61030d366004614959565b610bc0565b34801561031e57600080fd5b506102a561032d366004614679565b610cb3565b34801561033e57600080fd5b506102a561034d366004614679565b610e32565b6102e5610360366004614835565b610fed565b34801561037157600080fd5b50610277610380366004614a03565b611040565b34801561039157600080fd5b506102166103a0366004614679565b611147565b3480156103b157600080fd5b50610216611409565b3480156103c657600080fd5b506102166103d5366004614679565b61141d565b6102a56103e8366004614a99565b6116cb565b3480156103f957600080fd5b50610277610408366004614608565b611a6d565b34801561041957600080fd5b506102a5610428366004614679565b611a7c565b34801561043957600080fd5b506000546001600160a01b03165b6040516001600160a01b03909116815260200161024e565b6102e561046d366004614b00565b611b8e565b34801561047e57600080fd5b506104477f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b3480156104b257600080fd5b506102776104c1366004614608565b611cdb565b3480156104d257600080fd5b506102776104e13660046145aa565b611ce8565b6102166104f4366004614a99565b611e5a565b34801561050557600080fd5b5061023d610514366004614b42565b6121f4565b34801561052557600080fd5b506104477f0000000000000000000000008b76c05676d205563ffc1cbd11c0a6e3d83929c581565b34801561055957600080fd5b506102a5610568366004614777565b61243f565b34801561057957600080fd5b5061023d610588366004614a03565b61246e565b34801561059957600080fd5b506105ad6105a8366004614bb4565b61257b565b6040805193845260208401929092529082015260600161024e565b3480156105d457600080fd5b506102166105e3366004614c30565b61269c565b6105ad6105f63660046145aa565b61272c565b34801561060757600080fd5b5061023d610616366004614c54565b6129ae565b6102a5610629366004614a99565b612c92565b600080824281101561067a5760405162461bcd60e51b815260206004820152601060248201526f1618da185b99d94e881156141254915160821b60448201526064015b60405180910390fd5b6106a9897f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28a8a8a308a6121f4565b90935091506106b989868561305e565b604051632e1a7d4d60e01b8152600481018390527f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031690632e1a7d4d90602401600060405180830381600087803b15801561071b57600080fd5b505af115801561072f573d6000803e3d6000fd5b5050505061073d858361318e565b50965096945050505050565b6000610758848484601461325c565b949350505050565b606081428110156107a65760405162461bcd60e51b815260206004820152601060248201526f1618da185b99d94e881156141254915160821b6044820152606401610671565b6001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc21686866107dd600182614ce4565b8181106107ec576107ec614cf7565b90506020020160208101906108019190614c30565b6001600160a01b03161461084f5760405162461bcd60e51b81526020600482015260156024820152740b0c6d0c2dcceca7440929cac82989288bea082a89605b1b6044820152606401610671565b6108af7f0000000000000000000000008b76c05676d205563ffc1cbd11c0a6e3d83929c58960148989808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506133e892505050565b91508682600184516108c19190614ce4565b815181106108d1576108d1614cf7565b602002602001015110156109335760405162461bcd60e51b815260206004820152602360248201527f586368616e67653a20494e53554646494349454e545f4f55545055545f414d4f60448201526215539560ea1b6064820152608401610671565b6109f88686600081811061094957610949614cf7565b905060200201602081019061095e9190614c30565b336109d87f0000000000000000000000008b76c05676d205563ffc1cbd11c0a6e3d83929c58a8a600081811061099657610996614cf7565b90506020020160208101906109ab9190614c30565b8b8b60018181106109be576109be614cf7565b90506020020160208101906109d39190614c30565b613569565b856000815181106109eb576109eb614cf7565b602002602001015161365a565b610a378287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525030925061379f915050565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b0316632e1a7d4d8360018551610a759190614ce4565b81518110610a8557610a85614cf7565b60200260200101516040518263ffffffff1660e01b8152600401610aab91815260200190565b600060405180830381600087803b158015610ac557600080fd5b505af1158015610ad9573d6000803e3d6000fd5b50505050610b0d848360018551610af09190614ce4565b81518110610b0057610b00614cf7565b602002602001015161318e565b509695505050505050565b6060610b477f0000000000000000000000008b76c05676d205563ffc1cbd11c0a6e3d83929c5846014856139a0565b90505b92915050565b60608380610b5f600143614ce4565b4014610bad5760405162461bcd60e51b815260206004820152600960248201527f426c6f636b6861736800000000000000000000000000000000000000000000006044820152606401610671565b610bb78484611b8e565b95945050505050565b6000806000610bf07f0000000000000000000000008b76c05676d205563ffc1cbd11c0a6e3d83929c58f8f613569565b9050600087610bff578c610c03565b6000195b60405163d505accf60e01b815233600482015230602482015260448101829052606481018b905260ff8916608482015260a4810188905260c481018790529091506001600160a01b0383169063d505accf9060e401600060405180830381600087803b158015610c7257600080fd5b505af1158015610c86573d6000803e3d6000fd5b50505050610c998f8f8f8f8f8f8f6121f4565b809450819550505050509b509b9950505050505050505050565b60608142811015610cf95760405162461bcd60e51b815260206004820152601060248201526f1618da185b99d94e881156141254915160821b6044820152606401610671565b610d597f0000000000000000000000008b76c05676d205563ffc1cbd11c0a6e3d83929c58960148989808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506133e892505050565b9150868260018451610d6b9190614ce4565b81518110610d7b57610d7b614cf7565b60200260200101511015610ddd5760405162461bcd60e51b815260206004820152602360248201527f586368616e67653a20494e53554646494349454e545f4f55545055545f414d4f60448201526215539560ea1b6064820152608401610671565b610df38686600081811061094957610949614cf7565b610b0d8287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525089925061379f915050565b60608142811015610e785760405162461bcd60e51b815260206004820152601060248201526f1618da185b99d94e881156141254915160821b6044820152606401610671565b6001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2168686610eaf600182614ce4565b818110610ebe57610ebe614cf7565b9050602002016020810190610ed39190614c30565b6001600160a01b031614610f215760405162461bcd60e51b81526020600482015260156024820152740b0c6d0c2dcceca7440929cac82989288bea082a89605b1b6044820152606401610671565b610f817f0000000000000000000000008b76c05676d205563ffc1cbd11c0a6e3d83929c58960148989808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506139a092505050565b91508682600081518110610f9757610f97614cf7565b602002602001015111156109335760405162461bcd60e51b815260206004820152601f60248201527f586368616e67653a204558434553534956455f494e5055545f414d4f554e54006044820152606401610671565b60608380421115610bad5760405162461bcd60e51b815260206004820152601360248201527f5472616e73616374696f6e20746f6f206f6c64000000000000000000000000006044820152606401610671565b60008061108e7f0000000000000000000000008b76c05676d205563ffc1cbd11c0a6e3d83929c58d7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2613569565b905060008661109d578b6110a1565b6000195b60405163d505accf60e01b815233600482015230602482015260448101829052606481018a905260ff8816608482015260a4810187905260c481018690529091506001600160a01b0383169063d505accf9060e401600060405180830381600087803b15801561111057600080fd5b505af1158015611124573d6000803e3d6000fd5b505050506111368d8d8d8d8d8d611ce8565b9d9c50505050505050505050505050565b804281101561118b5760405162461bcd60e51b815260206004820152601060248201526f1618da185b99d94e881156141254915160821b6044820152606401610671565b61121c858560008181106111a1576111a1614cf7565b90506020020160208101906111b69190614c30565b336112167f0000000000000000000000008b76c05676d205563ffc1cbd11c0a6e3d83929c5898960008181106111ee576111ee614cf7565b90506020020160208101906112039190614c30565b8a8a60018181106109be576109be614cf7565b8a61365a565b6000858561122b600182614ce4565b81811061123a5761123a614cf7565b905060200201602081019061124f9190614c30565b6040516370a0823160e01b81526001600160a01b03868116600483015291909116906370a0823190602401602060405180830381865afa158015611297573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112bb9190614d0d565b90506112fb868680806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250889250613b22915050565b8681878761130a600182614ce4565b81811061131957611319614cf7565b905060200201602081019061132e9190614c30565b6040516370a0823160e01b81526001600160a01b03888116600483015291909116906370a08231906024015b602060405180830381865afa158015611377573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061139b9190614d0d565b6113a59190614ce4565b10156113ff5760405162461bcd60e51b815260206004820152602360248201527f586368616e67653a20494e53554646494349454e545f4f55545055545f414d4f60448201526215539560ea1b6064820152608401610671565b5050505050505050565b611411613e05565b61141b6000613e6e565b565b80428110156114615760405162461bcd60e51b815260206004820152601060248201526f1618da185b99d94e881156141254915160821b6044820152606401610671565b6001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2168585611498600182614ce4565b8181106114a7576114a7614cf7565b90506020020160208101906114bc9190614c30565b6001600160a01b03161461150a5760405162461bcd60e51b81526020600482015260156024820152740b0c6d0c2dcceca7440929cac82989288bea082a89605b1b6044820152606401610671565b611520858560008181106111a1576111a1614cf7565b61155e858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613b22915050565b6040516370a0823160e01b81523060048201526000907f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b0316906370a0823190602401602060405180830381865afa1580156115c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115e99190614d0d565b9050868110156116475760405162461bcd60e51b815260206004820152602360248201527f586368616e67653a20494e53554646494349454e545f4f55545055545f414d4f60448201526215539560ea1b6064820152608401610671565b604051632e1a7d4d60e01b8152600481018290527f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031690632e1a7d4d90602401600060405180830381600087803b1580156116a957600080fd5b505af11580156116bd573d6000803e3d6000fd5b505050506113ff848261318e565b606081428110156117115760405162461bcd60e51b815260206004820152601060248201526f1618da185b99d94e881156141254915160821b6044820152606401610671565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b03168686600081811061174e5761174e614cf7565b90506020020160208101906117639190614c30565b6001600160a01b0316146117b15760405162461bcd60e51b81526020600482015260156024820152740b0c6d0c2dcceca7440929cac82989288bea082a89605b1b6044820152606401610671565b6118117f0000000000000000000000008b76c05676d205563ffc1cbd11c0a6e3d83929c53460148989808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506133e892505050565b91508682600184516118239190614ce4565b8151811061183357611833614cf7565b602002602001015110156118955760405162461bcd60e51b815260206004820152602360248201527f586368616e67653a20494e53554646494349454e545f4f55545055545f414d4f60448201526215539560ea1b6064820152608401610671565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0836000815181106118d7576118d7614cf7565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561190a57600080fd5b505af115801561191e573d6000803e3d6000fd5b50505050507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663a9059cbb6119897f0000000000000000000000008b76c05676d205563ffc1cbd11c0a6e3d83929c5898960008181106111ee576111ee614cf7565b8460008151811061199c5761199c614cf7565b60200260200101516040518363ffffffff1660e01b81526004016119d59291906001600160a01b03929092168252602082015260400190565b6020604051808303816000875af11580156119f4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a189190614d26565b611a2457611a24614d43565b611a638287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525089925061379f915050565b5095945050505050565b60006107588484846014613ed6565b60608142811015611ac25760405162461bcd60e51b815260206004820152601060248201526f1618da185b99d94e881156141254915160821b6044820152606401610671565b611b227f0000000000000000000000008b76c05676d205563ffc1cbd11c0a6e3d83929c58960148989808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506139a092505050565b91508682600081518110611b3857611b38614cf7565b60200260200101511115610ddd5760405162461bcd60e51b815260206004820152601f60248201527f586368616e67653a204558434553534956455f494e5055545f414d4f554e54006044820152606401610671565b60608167ffffffffffffffff811115611ba957611ba9614730565b604051908082528060200260200182016040528015611bdc57816020015b6060815260200190600190039081611bc75790505b50905060005b82811015611cd45760008030868685818110611c0057611c00614cf7565b9050602002810190611c129190614d59565b604051611c20929190614da0565b600060405180830381855af49150503d8060008114611c5b576040519150601f19603f3d011682016040523d82523d6000602084013e611c60565b606091505b509150915081611cac57604481511015611c7957600080fd5b60048101905080806020019051810190611c939190614db0565b60405162461bcd60e51b81526004016106719190614e3b565b80848481518110611cbf57611cbf614cf7565b60209081029190910101525050600101611be2565b5092915050565b6000610758848484614067565b60008142811015611d2e5760405162461bcd60e51b815260206004820152601060248201526f1618da185b99d94e881156141254915160821b6044820152606401610671565b611d5d887f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc289898930896121f4565b6040516370a0823160e01b8152306004820152909350611dd69150899086906001600160a01b038316906370a0823190602401602060405180830381865afa158015611dad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dd19190614d0d565b61305e565b604051632e1a7d4d60e01b8152600481018390527f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031690632e1a7d4d90602401600060405180830381600087803b158015611e3857600080fd5b505af1158015611e4c573d6000803e3d6000fd5b50505050610b0d848361318e565b8042811015611e9e5760405162461bcd60e51b815260206004820152601060248201526f1618da185b99d94e881156141254915160821b6044820152606401610671565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031685856000818110611edb57611edb614cf7565b9050602002016020810190611ef09190614c30565b6001600160a01b031614611f3e5760405162461bcd60e51b81526020600482015260156024820152740b0c6d0c2dcceca7440929cac82989288bea082a89605b1b6044820152606401610671565b60003490507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015611f9e57600080fd5b505af1158015611fb2573d6000803e3d6000fd5b50505050507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663a9059cbb61201d7f0000000000000000000000008b76c05676d205563ffc1cbd11c0a6e3d83929c5898960008181106111ee576111ee614cf7565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303816000875af1158015612082573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120a69190614d26565b6120b2576120b2614d43565b600086866120c1600182614ce4565b8181106120d0576120d0614cf7565b90506020020160208101906120e59190614c30565b6040516370a0823160e01b81526001600160a01b03878116600483015291909116906370a0823190602401602060405180830381865afa15801561212d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121519190614d0d565b9050612191878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613b22915050565b878188886121a0600182614ce4565b8181106121af576121af614cf7565b90506020020160208101906121c49190614c30565b6040516370a0823160e01b81526001600160a01b03898116600483015291909116906370a082319060240161135a565b600080824281101561223b5760405162461bcd60e51b815260206004820152601060248201526f1618da185b99d94e881156141254915160821b6044820152606401610671565b60006122687f0000000000000000000000008b76c05676d205563ffc1cbd11c0a6e3d83929c58c8c613569565b6040516323b872dd60e01b81523360048201526001600160a01b03821660248201819052604482018c90529192506323b872dd906064016020604051808303816000875af11580156122be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122e29190614d26565b5060405163226bf2d160e21b81526001600160a01b03878116600483015260009182918416906389afcb449060240160408051808303816000875af115801561232f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123539190614e4e565b9150915060006123638e8e614144565b509050806001600160a01b03168e6001600160a01b031614612386578183612389565b82825b90975095508a8710156123de5760405162461bcd60e51b815260206004820152601e60248201527f586368616e67653a20494e53554646494349454e545f415f414d4f554e5400006044820152606401610671565b8986101561242e5760405162461bcd60e51b815260206004820152601e60248201527f586368616e67653a20494e53554646494349454e545f425f414d4f554e5400006044820152606401610671565b505050505097509795505050505050565b6060610b477f0000000000000000000000008b76c05676d205563ffc1cbd11c0a6e3d83929c5846014856133e8565b60008060006124be7f0000000000000000000000008b76c05676d205563ffc1cbd11c0a6e3d83929c58e7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2613569565b90506000876124cd578c6124d1565b6000195b60405163d505accf60e01b815233600482015230602482015260448101829052606481018b905260ff8916608482015260a4810188905260c481018790529091506001600160a01b0383169063d505accf9060e401600060405180830381600087803b15801561254057600080fd5b505af1158015612554573d6000803e3d6000fd5b505050506125668e8e8e8e8e8e61062e565b909f909e509c50505050505050505050505050565b600080600083428110156125c45760405162461bcd60e51b815260206004820152601060248201526f1618da185b99d94e881156141254915160821b6044820152606401610671565b6125d28c8c8c8c8c8c614239565b909450925060006126047f0000000000000000000000008b76c05676d205563ffc1cbd11c0a6e3d83929c58e8e613569565b90506126128d33838861365a565b61261e8c33838761365a565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a627842906024016020604051808303816000875af1158015612666573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061268a9190614d0d565b92505050985098509895505050505050565b6126a4613e05565b6001600160a01b0381166127205760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610671565b61272981613e6e565b50565b600080600083428110156127755760405162461bcd60e51b815260206004820152601060248201526f1618da185b99d94e881156141254915160821b6044820152606401610671565b6127a38a7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28b348c8c614239565b909450925060006127f57f0000000000000000000000008b76c05676d205563ffc1cbd11c0a6e3d83929c58c7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2613569565b90506128038b33838861365a565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b15801561285e57600080fd5b505af1158015612872573d6000803e3d6000fd5b505060405163a9059cbb60e01b81526001600160a01b038581166004830152602482018990527f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc216935063a9059cbb925060440190506020604051808303816000875af11580156128e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061290b9190614d26565b61291757612917614d43565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a627842906024016020604051808303816000875af115801561295f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129839190614d0d565b9250833411156129a0576129a03361299b8634614ce4565b61318e565b505096509650969350505050565b60008083428110156129f55760405162461bcd60e51b815260206004820152601060248201526f1618da185b99d94e881156141254915160821b6044820152606401610671565b604051632eb8193d60e21b81523360048201527f0000000000000000000000008b76c05676d205563ffc1cbd11c0a6e3d83929c56001600160a01b03169063bae064f490602401602060405180830381865afa158015612a59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a7d9190614d26565b612a8657600080fd5b6000612ab37f0000000000000000000000008b76c05676d205563ffc1cbd11c0a6e3d83929c58d8d613569565b6040516323b872dd60e01b81523360048201526001600160a01b03821660248201819052604482018d90529192506323b872dd906064016020604051808303816000875af1158015612b09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b2d9190614d26565b5060405163023d845560e21b81526001600160a01b0388811660048301526024820187905260009182918416906308f611549060440160408051808303816000875af1158015612b81573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ba59190614e4e565b915091506000612bb58f8f614144565b509050806001600160a01b03168f6001600160a01b031614612bd8578183612bdb565b82825b90975095508b871015612c305760405162461bcd60e51b815260206004820152601e60248201527f586368616e67653a20494e53554646494349454e545f415f414d4f554e5400006044820152606401610671565b8a861015612c805760405162461bcd60e51b815260206004820152601e60248201527f586368616e67653a20494e53554646494349454e545f425f414d4f554e5400006044820152606401610671565b50505050509850989650505050505050565b60608142811015612cd85760405162461bcd60e51b815260206004820152601060248201526f1618da185b99d94e881156141254915160821b6044820152606401610671565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031686866000818110612d1557612d15614cf7565b9050602002016020810190612d2a9190614c30565b6001600160a01b031614612d785760405162461bcd60e51b81526020600482015260156024820152740b0c6d0c2dcceca7440929cac82989288bea082a89605b1b6044820152606401610671565b612dd87f0000000000000000000000008b76c05676d205563ffc1cbd11c0a6e3d83929c58860148989808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506139a092505050565b91503482600081518110612dee57612dee614cf7565b60200260200101511115612e445760405162461bcd60e51b815260206004820152601f60248201527f586368616e67653a204558434553534956455f494e5055545f414d4f554e54006044820152606401610671565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db083600081518110612e8657612e86614cf7565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015612eb957600080fd5b505af1158015612ecd573d6000803e3d6000fd5b50505050507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663a9059cbb612f387f0000000000000000000000008b76c05676d205563ffc1cbd11c0a6e3d83929c5898960008181106111ee576111ee614cf7565b84600081518110612f4b57612f4b614cf7565b60200260200101516040518363ffffffff1660e01b8152600401612f849291906001600160a01b03929092168252602082015260400190565b6020604051808303816000875af1158015612fa3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fc79190614d26565b612fd357612fd3614d43565b6130128287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525089925061379f915050565b8160008151811061302557613025614cf7565b6020026020010151341115611a6357611a63338360008151811061304b5761304b614cf7565b60200260200101513461299b9190614ce4565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1663a9059cbb60e01b17905291516000928392908716916130cf9190614e72565b6000604051808303816000865af19150503d806000811461310c576040519150601f19603f3d011682016040523d82523d6000602084013e613111565b606091505b509150915081801561313b57508051158061313b57508080602001905181019061313b9190614d26565b6131875760405162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c4544006044820152606401610671565b5050505050565b604080516000808252602082019092526001600160a01b0384169083906040516131b89190614e72565b60006040518083038185875af1925050503d80600081146131f5576040519150601f19603f3d011682016040523d82523d6000602084013e6131fa565b606091505b50509050806132575760405162461bcd60e51b815260206004820152602360248201527f5472616e7366657248656c7065723a204554485f5452414e534645525f46414960448201526213115160ea1b6064820152608401610671565b505050565b60008085116132d35760405162461bcd60e51b815260206004820152602960248201527f586368616e67654c6962726172793a20494e53554646494349454e545f494e5060448201527f55545f414d4f554e5400000000000000000000000000000000000000000000006064820152608401610671565b6000841180156132e35750600083115b61333e5760405162461bcd60e51b815260206004820152602660248201527f586368616e67654c6962726172793a20494e53554646494349454e545f4c495160448201526555494449545960d01b6064820152608401610671565b601482111561338f5760405162461bcd60e51b815260206004820152601d60248201527f586368616e67654c6962726172793a204558434553534956455f4645450000006044820152606401610671565b600061339d83612710614ce4565b6133a79087614e8e565b905060006133b58583614e8e565b90506000826133c688612710614e8e565b6133d09190614ea5565b90506133dc8183614eb8565b98975050505050505050565b606060028251101561343c5760405162461bcd60e51b815260206004820152601c60248201527f586368616e67654c6962726172793a20494e56414c49445f50415448000000006044820152606401610671565b815167ffffffffffffffff81111561345657613456614730565b60405190808252806020026020018201604052801561347f578160200160208202803683370190505b509050838160008151811061349657613496614cf7565b60200260200101818152505060005b600183516134b39190614ce4565b81101561356057600080613506888685815181106134d3576134d3614cf7565b6020026020010151878660016134e99190614ea5565b815181106134f9576134f9614cf7565b60200260200101516144bd565b9150915061352f84848151811061351f5761351f614cf7565b602002602001015183838961325c565b8461353b856001614ea5565b8151811061354b5761354b614cf7565b602090810291909101015250506001016134a5565b50949350505050565b60008060006135788585614144565b6040516bffffffffffffffffffffffff19606084811b8216602084015283901b16603482015291935091508690604801604051602081830303815290604052805190602001206040516020016136389291907fff00000000000000000000000000000000000000000000000000000000000000815260609290921b6bffffffffffffffffffffffff1916600183015260158201527fd75846df8bac2f946ea9ee78caa53b6812e7514197698275b8322d75e1543193603582015260550190565b60408051601f1981840301815291905280516020909101209695505050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166323b872dd60e01b17905291516000928392908816916136d39190614e72565b6000604051808303816000865af19150503d8060008114613710576040519150601f19603f3d011682016040523d82523d6000602084013e613715565b606091505b509150915081801561373f57508051158061373f57508080602001905181019061373f9190614d26565b6137975760405162461bcd60e51b8152602060048201526024808201527f5472616e7366657248656c7065723a205452414e534645525f46524f4d5f46416044820152631253115160e21b6064820152608401610671565b505050505050565b60005b600183516137b09190614ce4565b81101561399a576000808483815181106137cc576137cc614cf7565b6020026020010151858460016137e29190614ea5565b815181106137f2576137f2614cf7565b602002602001015191509150600061380a8383614144565b50905060008761381b866001614ea5565b8151811061382b5761382b614cf7565b60200260200101519050600080836001600160a01b0316866001600160a01b0316146138595782600061385d565b6000835b91509150600060028a516138719190614ce4565b881061387d57886138cb565b6138cb7f0000000000000000000000008b76c05676d205563ffc1cbd11c0a6e3d83929c5878c6138ae8c6002614ea5565b815181106138be576138be614cf7565b6020026020010151613569565b90506138f87f0000000000000000000000008b76c05676d205563ffc1cbd11c0a6e3d83929c58888613569565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f191660200182016040528015613935576020820181803683370190505b506040518563ffffffff1660e01b81526004016139559493929190614eda565b600060405180830381600087803b15801561396f57600080fd5b505af1158015613983573d6000803e3d6000fd5b5050600190990198506137a2975050505050505050565b50505050565b60606002825110156139f45760405162461bcd60e51b815260206004820152601c60248201527f586368616e67654c6962726172793a20494e56414c49445f50415448000000006044820152606401610671565b815167ffffffffffffffff811115613a0e57613a0e614730565b604051908082528060200260200182016040528015613a37578160200160208202803683370190505b509050838160018351613a4a9190614ce4565b81518110613a5a57613a5a614cf7565b602002602001018181525050600060018351613a769190614ce4565b90505b801561356057600080613abc8886613a92600187614ce4565b81518110613aa257613aa2614cf7565b60200260200101518786815181106134f9576134f9614cf7565b91509150613ae5848481518110613ad557613ad5614cf7565b6020026020010151838389613ed6565b84613af1600186614ce4565b81518110613b0157613b01614cf7565b60200260200101818152505050508080613b1a90614f12565b915050613a79565b60005b60018351613b339190614ce4565b81101561325757600080848381518110613b4f57613b4f614cf7565b602002602001015185846001613b659190614ea5565b81518110613b7557613b75614cf7565b6020026020010151915091506000613b8d8383614144565b5090506000613bbd7f0000000000000000000000008b76c05676d205563ffc1cbd11c0a6e3d83929c58585613569565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015613c03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c279190614f47565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff169150600080876001600160a01b03168a6001600160a01b031614613c6f578284613c72565b83835b6040516370a0823160e01b81526001600160a01b038a8116600483015292945090925083918c16906370a0823190602401602060405180830381865afa158015613cc0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ce49190614d0d565b613cee9190614ce4565b9550613cfd868383601461325c565b945050505050600080856001600160a01b0316886001600160a01b031614613d2757826000613d2b565b6000835b91509150600060028c51613d3f9190614ce4565b8a10613d4b578a613d7c565b613d7c7f0000000000000000000000008b76c05676d205563ffc1cbd11c0a6e3d83929c5898e6138ae8e6002614ea5565b6040805160008152602081019182905263022c0d9f60e01b9091529091506001600160a01b0387169063022c0d9f90613dbe9086908690869060248101614eda565b600060405180830381600087803b158015613dd857600080fd5b505af1158015613dec573d6000803e3d6000fd5b50506001909b019a50613b259950505050505050505050565b33613e186000546001600160a01b031690565b6001600160a01b03161461141b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610671565b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000808511613f4d5760405162461bcd60e51b815260206004820152602a60248201527f586368616e67654c6962726172793a20494e53554646494349454e545f4f555460448201527f5055545f414d4f554e54000000000000000000000000000000000000000000006064820152608401610671565b600084118015613f5d5750600083115b613fb85760405162461bcd60e51b815260206004820152602660248201527f586368616e67654c6962726172793a20494e53554646494349454e545f4c495160448201526555494449545960d01b6064820152608401610671565b60148211156140095760405162461bcd60e51b815260206004820152601d60248201527f586368616e67654c6962726172793a204558434553534956455f4645450000006044820152606401610671565b60006140158686614e8e565b61402190612710614e8e565b9050600061403184612710614ce4565b61403b8887614ce4565b6140459190614e8e565b90506140518183614eb8565b61405c906001614ea5565b979650505050505050565b60008084116140c45760405162461bcd60e51b815260206004820152602360248201527f586368616e67654c6962726172793a20494e53554646494349454e545f414d4f60448201526215539560ea1b6064820152608401610671565b6000831180156140d45750600082115b61412f5760405162461bcd60e51b815260206004820152602660248201527f586368616e67654c6962726172793a20494e53554646494349454e545f4c495160448201526555494449545960d01b6064820152608401610671565b8261413a8386614e8e565b6107589190614eb8565b600080826001600160a01b0316846001600160a01b0316036141b45760405162461bcd60e51b815260206004820152602360248201527f586368616e67654c6962726172793a204944454e544943414c5f41444452455360448201526253455360e81b6064820152608401610671565b826001600160a01b0316846001600160a01b0316106141d45782846141d7565b83835b90925090506001600160a01b0382166142325760405162461bcd60e51b815260206004820152601c60248201527f586368616e67654c6962726172793a205a45524f5f41444452455353000000006044820152606401610671565b9250929050565b60405163e6a4390560e01b81526001600160a01b0387811660048301528681166024830152600091829182917f0000000000000000000000008b76c05676d205563ffc1cbd11c0a6e3d83929c59091169063e6a4390590604401602060405180830381865afa1580156142b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142d49190614f97565b6001600160a01b031603614378576040516364e329cb60e11b81526001600160a01b03898116600483015288811660248301527f0000000000000000000000008b76c05676d205563ffc1cbd11c0a6e3d83929c5169063c9c65396906044016020604051808303816000875af1158015614352573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906143769190614f97565b505b6000806143a67f0000000000000000000000008b76c05676d205563ffc1cbd11c0a6e3d83929c58b8b6144bd565b915091508160001480156143b8575080155b156143c8578793508692506144b0565b60006143d5898484614067565b9050878111614439578581101561442e5760405162461bcd60e51b815260206004820152601e60248201527f586368616e67653a20494e53554646494349454e545f425f414d4f554e5400006044820152606401610671565b8894509250826144ae565b6000614446898486614067565b90508981111561445857614458614d43565b878110156144a85760405162461bcd60e51b815260206004820152601e60248201527f586368616e67653a20494e53554646494349454e545f415f414d4f554e5400006044820152606401610671565b94508793505b505b5050965096945050505050565b60008060006144cc8585614144565b5090506000806144dd888888613569565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa15801561451a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061453e9190614f47565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff169150826001600160a01b0316876001600160a01b031614614583578082614586565b81815b90999098509650505050505050565b6001600160a01b038116811461272957600080fd5b60008060008060008060c087890312156145c357600080fd5b86356145ce81614595565b955060208701359450604087013593506060870135925060808701356145f381614595565b8092505060a087013590509295509295509295565b60008060006060848603121561461d57600080fd5b505081359360208301359350604090920135919050565b60008083601f84011261464657600080fd5b50813567ffffffffffffffff81111561465e57600080fd5b6020830191508360208260051b850101111561423257600080fd5b60008060008060008060a0878903121561469257600080fd5b8635955060208701359450604087013567ffffffffffffffff8111156146b757600080fd5b6146c389828a01614634565b90955093505060608701356146d781614595565b80925050608087013590509295509295509295565b6020808252825182820181905260009190848201906040850190845b8181101561472457835183529284019291840191600101614708565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561476f5761476f614730565b604052919050565b6000806040838503121561478a57600080fd5b8235915060208084013567ffffffffffffffff808211156147aa57600080fd5b818601915086601f8301126147be57600080fd5b8135818111156147d0576147d0614730565b8060051b91506147e1848301614746565b81815291830184019184810190898411156147fb57600080fd5b938501935b83851015614825578435925061481583614595565b8282529385019390850190614800565b8096505050505050509250929050565b60008060006040848603121561484a57600080fd5b83359250602084013567ffffffffffffffff81111561486857600080fd5b61487486828701614634565b9497909650939450505050565b60005b8381101561489c578181015183820152602001614884565b50506000910152565b600081518084526148bd816020860160208601614881565b601f01601f19169290920160200192915050565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b8281101561492857603f198886030184526149168583516148a5565b945092850192908501906001016148fa565b5092979650505050505050565b801515811461272957600080fd5b803560ff8116811461495457600080fd5b919050565b60008060008060008060008060008060006101608c8e03121561497b57600080fd5b8b3561498681614595565b9a5060208c013561499681614595565b995060408c0135985060608c0135975060808c0135965060a08c01356149bb81614595565b955060c08c0135945060e08c01356149d281614935565b93506149e16101008d01614943565b92506101208c013591506101408c013590509295989b509295989b9093969950565b6000806000806000806000806000806101408b8d031215614a2357600080fd5b8a35614a2e81614595565b995060208b0135985060408b0135975060608b0135965060808b0135614a5381614595565b955060a08b0135945060c08b0135614a6a81614935565b9350614a7860e08c01614943565b92506101008b013591506101208b013590509295989b9194979a5092959850565b600080600080600060808688031215614ab157600080fd5b85359450602086013567ffffffffffffffff811115614acf57600080fd5b614adb88828901614634565b9095509350506040860135614aef81614595565b949793965091946060013592915050565b60008060208385031215614b1357600080fd5b823567ffffffffffffffff811115614b2a57600080fd5b614b3685828601614634565b90969095509350505050565b600080600080600080600060e0888a031215614b5d57600080fd5b8735614b6881614595565b96506020880135614b7881614595565b955060408801359450606088013593506080880135925060a0880135614b9d81614595565b8092505060c0880135905092959891949750929550565b600080600080600080600080610100898b031215614bd157600080fd5b8835614bdc81614595565b97506020890135614bec81614595565b965060408901359550606089013594506080890135935060a0890135925060c0890135614c1881614595565b8092505060e089013590509295985092959890939650565b600060208284031215614c4257600080fd5b8135614c4d81614595565b9392505050565b600080600080600080600080610100898b031215614c7157600080fd5b8835614c7c81614595565b97506020890135614c8c81614595565b965060408901359550606089013594506080890135935060a0890135614cb181614595565b979a969950949793969295929450505060c08201359160e0013590565b634e487b7160e01b600052601160045260246000fd5b81810381811115610b4a57610b4a614cce565b634e487b7160e01b600052603260045260246000fd5b600060208284031215614d1f57600080fd5b5051919050565b600060208284031215614d3857600080fd5b8151614c4d81614935565b634e487b7160e01b600052600160045260246000fd5b6000808335601e19843603018112614d7057600080fd5b83018035915067ffffffffffffffff821115614d8b57600080fd5b60200191503681900382131561423257600080fd5b8183823760009101908152919050565b600060208284031215614dc257600080fd5b815167ffffffffffffffff80821115614dda57600080fd5b818401915084601f830112614dee57600080fd5b815181811115614e0057614e00614730565b614e13601f8201601f1916602001614746565b9150808252856020828501011115614e2a57600080fd5b613560816020840160208601614881565b602081526000610b4760208301846148a5565b60008060408385031215614e6157600080fd5b505080516020909101519092909150565b60008251614e84818460208701614881565b9190910192915050565b8082028115828204841417610b4a57610b4a614cce565b80820180821115610b4a57610b4a614cce565b600082614ed557634e487b7160e01b600052601260045260246000fd5b500490565b8481528360208201526001600160a01b0383166040820152608060608201526000614f0860808301846148a5565b9695505050505050565b600081614f2157614f21614cce565b506000190190565b80516dffffffffffffffffffffffffffff8116811461495457600080fd5b600080600060608486031215614f5c57600080fd5b614f6584614f29565b9250614f7360208501614f29565b9150604084015163ffffffff81168114614f8c57600080fd5b809150509250925092565b600060208284031215614fa957600080fd5b8151614c4d8161459556fea2646970667358221220d23ee3d8868e7b0bfdaba3641ca226722f56cc412625496b8fe1db314b7f995664736f6c63430008190033

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

0000000000000000000000008b76c05676d205563ffc1cbd11c0a6e3d83929c5000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000f7c5c8bdd689767e039c631ad42482128bd54ba3

-----Decoded View---------------
Arg [0] : _factory (address): 0x8B76C05676D205563ffC1cbd11c0A6e3d83929c5
Arg [1] : _WETH (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
Arg [2] : _owner (address): 0xf7c5c8Bdd689767e039c631Ad42482128BD54Ba3

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000008b76c05676d205563ffc1cbd11c0a6e3d83929c5
Arg [1] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Arg [2] : 000000000000000000000000f7c5c8bdd689767e039c631ad42482128bd54ba3


Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ 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.