Contract 0xe6fe3db4c5a2e4a9ab3301201b38724e578b35ca 1

DeFi  
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x621722a3acb6e15740e706449f7114daee18869db0fab5785e89592e59330d51Swap Exact Token...35381762023-02-02 16:49:0014 mins ago0xe1fa699860444be91d366c21de8fef56e3dec77a IN  Zenlink: Regular AMM Router0 MOVR0.008011806
0x3d36ed46dccc52a24983d736056cd301dc94e88cc7907589a58eab810b02cf2aSwap Exact Token...35381752023-02-02 16:48:4214 mins ago0xe1fa699860444be91d366c21de8fef56e3dec77a IN  Zenlink: Regular AMM Router0 MOVR0.008011806
0xc51b4c763b3ff3ba18f0458ece8f1829ccbb489e24bee1de2183c58fedff48ebSwap Exact Token...35371092023-02-02 13:12:183 hrs 50 mins ago0xe1fa699860444be91d366c21de8fef56e3dec77a IN  Zenlink: Regular AMM Router0 MOVR0.00707124
0xbba37c182ef737d2a8ba4d386117ac851e7e77067f731b0478c45eff58b87406Swap Exact Token...35371022023-02-02 13:10:543 hrs 52 mins ago0xe1fa699860444be91d366c21de8fef56e3dec77a IN  Zenlink: Regular AMM Router0 MOVR0.00707124
0x9896fe3eaa3adf24a8f4b1af39cd9b8c135938f66b78791b43907b72b2a2644eSwap Exact Token...35363662023-02-02 10:40:066 hrs 23 mins ago0xe1fa699860444be91d366c21de8fef56e3dec77a IN  Zenlink: Regular AMM Router0 MOVR0.00707124
0xd4ec3dd4cbca01f872a6fed5c466d5c4fc4502579a5b0e7af62141355eb743bdSwap Exact Token...35363612023-02-02 10:39:066 hrs 24 mins ago0xe1fa699860444be91d366c21de8fef56e3dec77a IN  Zenlink: Regular AMM Router0 MOVR0.007072032
0x5c9e3cfe5e6f1aa7fd384a18a0aed79e415fcb594ed2109cb4a2db18c11983b1Swap Exact Token...35355302023-02-02 7:48:369 hrs 14 mins ago0xe1fa699860444be91d366c21de8fef56e3dec77a IN  Zenlink: Regular AMM Router0 MOVR0.00707124
0xff9ee90c29fdd20abb84fb09a0387d3655ebde5164ffee1d755bed044d485d61Swap Exact Token...35351022023-02-02 6:20:4810 hrs 42 mins ago0xe1fa699860444be91d366c21de8fef56e3dec77a IN  Zenlink: Regular AMM Router0 MOVR0.00707124
0x2ff232186f1f0fe7f999a2da2857d4988e9fd0bda9c5f2fbe753ca7bc3120d29Swap Exact Token...35350742023-02-02 6:15:0610 hrs 48 mins ago0xe1fa699860444be91d366c21de8fef56e3dec77a IN  Zenlink: Regular AMM Router0 MOVR0.00707124
0x11d7bfb6d07f381172a153ab8852ef356cb4dfaf7b8bb926068d90658713f950Swap Exact Token...35349342023-02-02 5:46:4811 hrs 16 mins ago0xe1fa699860444be91d366c21de8fef56e3dec77a IN  Zenlink: Regular AMM Router0 MOVR0.00707124
0x5f662cdad00b55a2ae101e1129877f3633fda6e421e17117936314deb2e4e617Swap Exact Token...35348782023-02-02 5:35:3011 hrs 27 mins ago0xe1fa699860444be91d366c21de8fef56e3dec77a IN  Zenlink: Regular AMM Router0 MOVR0.00707124
0x0db82ed080fe3c299d1cfed904577fecae202251e2bdf5ac314aec8ac396d5d5Swap Exact Token...35343862023-02-02 3:55:1213 hrs 8 mins ago0xe1fa699860444be91d366c21de8fef56e3dec77a IN  Zenlink: Regular AMM Router0 MOVR0.007072032
0x8c6451b15ed18811f249d81a20e3149282eafc0589485653e72a97cb4fff602eSwap Exact Token...35339542023-02-02 2:27:2414 hrs 35 mins ago0xe1fa699860444be91d366c21de8fef56e3dec77a IN  Zenlink: Regular AMM Router0 MOVR0.007072032
0xf2b6d5c73e760c4dc726e477d527f8b6c1058ba394131b68673c2a2ccedce77fSwap Exact Token...35335942023-02-02 1:14:0015 hrs 49 mins ago0xe1fa699860444be91d366c21de8fef56e3dec77a IN  Zenlink: Regular AMM Router0 MOVR0.008011806
0x8e586cc07b5e354c780235c40277acadb69024bf77a2cf114cd548405c56690aSwap Exact Token...35335932023-02-02 1:13:4815 hrs 49 mins ago0xe1fa699860444be91d366c21de8fef56e3dec77a IN  Zenlink: Regular AMM Router0 MOVR0.008011806
0x854912c1cee74a05dfdb2468f2acdde3c3f0723c49a600ddb70f25f6e024cc3dSwap Exact Token...35335912023-02-02 1:13:2415 hrs 49 mins ago0xe1fa699860444be91d366c21de8fef56e3dec77a IN  Zenlink: Regular AMM Router0 MOVR0.008011806
0x073c639e1f9b045e7b17e98ba2031ce973c2abe5858f3fb9ce307bf054dbde78Swap Exact Token...35335912023-02-02 1:13:2415 hrs 49 mins ago0xe1fa699860444be91d366c21de8fef56e3dec77a IN  Zenlink: Regular AMM Router0 MOVR0.008011806
0xebb7f46ba1d2796c6242a3f428a6e40edc8611031024411a0032dd8056ad67f2Swap Exact Token...35324972023-02-01 21:31:1819 hrs 31 mins ago0xe1fa699860444be91d366c21de8fef56e3dec77a IN  Zenlink: Regular AMM Router0 MOVR0.00707124
0xfbc692fb88e667d83f5e8cfc00abe108b10c70e2e06afaee41ac7a6744c9664eSwap Exact Token...35324942023-02-01 21:30:4219 hrs 32 mins ago0xe1fa699860444be91d366c21de8fef56e3dec77a IN  Zenlink: Regular AMM Router0 MOVR0.00707124
0x8b34f355d2b366b80854c46be8835839bad21690c3e54c922437ff7a9ecd2ea5Swap Exact Token...35324922023-02-01 21:30:1819 hrs 32 mins ago0xe1fa699860444be91d366c21de8fef56e3dec77a IN  Zenlink: Regular AMM Router0 MOVR0.00707124
0x505c7164681ba935766aa2f0fcc3481228ba577faeec74e8200d0caf4d6dbf52Swap Exact Token...35324692023-02-01 21:25:3019 hrs 37 mins ago0xe1fa699860444be91d366c21de8fef56e3dec77a IN  Zenlink: Regular AMM Router0 MOVR0.007072032
0x446854b9d828822f4f9476cb159fa4d0625d0cb7c5840fdc444be9e976bd312dSwap Exact Nativ...35286502023-02-01 8:24:061 day 8 hrs ago0xe1fa699860444be91d366c21de8fef56e3dec77a IN  Zenlink: Regular AMM Router15.3 MOVR0.007517532
0xf93da4e587670c2434956fcf8eaf6a9c43e51f3f3c9b691d656277336e6e531aSwap Exact Nativ...35286502023-02-01 8:24:061 day 8 hrs ago0xe1fa699860444be91d366c21de8fef56e3dec77a IN  Zenlink: Regular AMM Router15.3 MOVR0.007517532
0xb54d82ea81f31caf71c9df988ea3ef662563a4650dcf8c2094b8fc4fd78a3c77Swap Exact Token...35265622023-02-01 1:17:261 day 15 hrs ago0xe1fa699860444be91d366c21de8fef56e3dec77a IN  Zenlink: Regular AMM Router0 MOVR0.008011806
0xf198f6ce5b9935850e277b7c82292bdf0807602a2382e8c46cdafcaf30e1fd51Swap Exact Token...35265622023-02-01 1:17:261 day 15 hrs ago0xe1fa699860444be91d366c21de8fef56e3dec77a IN  Zenlink: Regular AMM Router0 MOVR0.008011806
[ Download CSV Export 

OVERVIEW

AMM Router contract of Zenlink.

Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x621722a3acb6e15740e706449f7114daee18869db0fab5785e89592e59330d5135381762023-02-02 16:49:0014 mins ago Zenlink: Regular AMM Router0xe1fa699860444be91d366c21de8fef56e3dec77a9.462984330711802831 MOVR
0x621722a3acb6e15740e706449f7114daee18869db0fab5785e89592e59330d5135381762023-02-02 16:49:0014 mins ago 0x98878b06940ae243284ca214f92bb71a2b032b8a Zenlink: Regular AMM Router9.462984330711802831 MOVR
0x3d36ed46dccc52a24983d736056cd301dc94e88cc7907589a58eab810b02cf2a35381752023-02-02 16:48:4214 mins ago Zenlink: Regular AMM Router0xe1fa699860444be91d366c21de8fef56e3dec77a9.518502388560685246 MOVR
0x3d36ed46dccc52a24983d736056cd301dc94e88cc7907589a58eab810b02cf2a35381752023-02-02 16:48:4214 mins ago 0x98878b06940ae243284ca214f92bb71a2b032b8a Zenlink: Regular AMM Router9.518502388560685246 MOVR
0xf2b6d5c73e760c4dc726e477d527f8b6c1058ba394131b68673c2a2ccedce77f35335942023-02-02 1:14:0015 hrs 49 mins ago Zenlink: Regular AMM Router0xe1fa699860444be91d366c21de8fef56e3dec77a9.457947814160816055 MOVR
0xf2b6d5c73e760c4dc726e477d527f8b6c1058ba394131b68673c2a2ccedce77f35335942023-02-02 1:14:0015 hrs 49 mins ago 0x98878b06940ae243284ca214f92bb71a2b032b8a Zenlink: Regular AMM Router9.457947814160816055 MOVR
0x8e586cc07b5e354c780235c40277acadb69024bf77a2cf114cd548405c56690a35335932023-02-02 1:13:4815 hrs 49 mins ago Zenlink: Regular AMM Router0xe1fa699860444be91d366c21de8fef56e3dec77a9.464040434830567661 MOVR
0x8e586cc07b5e354c780235c40277acadb69024bf77a2cf114cd548405c56690a35335932023-02-02 1:13:4815 hrs 49 mins ago 0x98878b06940ae243284ca214f92bb71a2b032b8a Zenlink: Regular AMM Router9.464040434830567661 MOVR
0x854912c1cee74a05dfdb2468f2acdde3c3f0723c49a600ddb70f25f6e024cc3d35335912023-02-02 1:13:2415 hrs 49 mins ago Zenlink: Regular AMM Router0xe1fa699860444be91d366c21de8fef56e3dec77a9.862789619011812786 MOVR
0x854912c1cee74a05dfdb2468f2acdde3c3f0723c49a600ddb70f25f6e024cc3d35335912023-02-02 1:13:2415 hrs 49 mins ago 0x98878b06940ae243284ca214f92bb71a2b032b8a Zenlink: Regular AMM Router9.862789619011812786 MOVR
0x073c639e1f9b045e7b17e98ba2031ce973c2abe5858f3fb9ce307bf054dbde7835335912023-02-02 1:13:2415 hrs 49 mins ago Zenlink: Regular AMM Router0xe1fa699860444be91d366c21de8fef56e3dec77a9.928629637071174588 MOVR
0x073c639e1f9b045e7b17e98ba2031ce973c2abe5858f3fb9ce307bf054dbde7835335912023-02-02 1:13:2415 hrs 49 mins ago 0x98878b06940ae243284ca214f92bb71a2b032b8a Zenlink: Regular AMM Router9.928629637071174588 MOVR
0x446854b9d828822f4f9476cb159fa4d0625d0cb7c5840fdc444be9e976bd312d35286502023-02-01 8:24:061 day 8 hrs ago Zenlink: Regular AMM Router 0x98878b06940ae243284ca214f92bb71a2b032b8a15.3 MOVR
0xf93da4e587670c2434956fcf8eaf6a9c43e51f3f3c9b691d656277336e6e531a35286502023-02-01 8:24:061 day 8 hrs ago Zenlink: Regular AMM Router 0x98878b06940ae243284ca214f92bb71a2b032b8a15.3 MOVR
0xb54d82ea81f31caf71c9df988ea3ef662563a4650dcf8c2094b8fc4fd78a3c7735265622023-02-01 1:17:261 day 15 hrs ago Zenlink: Regular AMM Router0xe1fa699860444be91d366c21de8fef56e3dec77a9.748322438087839249 MOVR
0xb54d82ea81f31caf71c9df988ea3ef662563a4650dcf8c2094b8fc4fd78a3c7735265622023-02-01 1:17:261 day 15 hrs ago 0x98878b06940ae243284ca214f92bb71a2b032b8a Zenlink: Regular AMM Router9.748322438087839249 MOVR
0xf198f6ce5b9935850e277b7c82292bdf0807602a2382e8c46cdafcaf30e1fd5135265622023-02-01 1:17:261 day 15 hrs ago Zenlink: Regular AMM Router0xe1fa699860444be91d366c21de8fef56e3dec77a9.810639313703825458 MOVR
0xf198f6ce5b9935850e277b7c82292bdf0807602a2382e8c46cdafcaf30e1fd5135265622023-02-01 1:17:261 day 15 hrs ago 0x98878b06940ae243284ca214f92bb71a2b032b8a Zenlink: Regular AMM Router9.810639313703825458 MOVR
0xa91c1804b23d197fbc3bcb3a4498f06347eb21ffca6bfc11c723212114d75b6335177542023-01-30 19:13:302 days 21 hrs ago Zenlink: Regular AMM Router 0x98878b06940ae243284ca214f92bb71a2b032b8a9.6 MOVR
0x96c90cca0b5549c3052102b3ccd1c40bf6c2cca53179dbe935a66b58bb3394cc35147982023-01-30 9:07:543 days 7 hrs ago Zenlink: Regular AMM Router0xe1fa699860444be91d366c21de8fef56e3dec77a14.878965457707559712 MOVR
0x96c90cca0b5549c3052102b3ccd1c40bf6c2cca53179dbe935a66b58bb3394cc35147982023-01-30 9:07:543 days 7 hrs ago 0x98878b06940ae243284ca214f92bb71a2b032b8a Zenlink: Regular AMM Router14.878965457707559712 MOVR
0xbbc9641c40b35c7bf6dfdeabbd3be7e11a22415e828e1db775ff2ec1c917a41835147972023-01-30 9:07:423 days 7 hrs ago Zenlink: Regular AMM Router0xe1fa699860444be91d366c21de8fef56e3dec77a14.931730637349270121 MOVR
0xbbc9641c40b35c7bf6dfdeabbd3be7e11a22415e828e1db775ff2ec1c917a41835147972023-01-30 9:07:423 days 7 hrs ago 0x98878b06940ae243284ca214f92bb71a2b032b8a Zenlink: Regular AMM Router14.931730637349270121 MOVR
0x88e685f4fab4a82d7141adc0ba3ef8149f59341e75ed67e2e37bd7ff3a2580e735102942023-01-29 17:46:543 days 23 hrs ago Zenlink: Regular AMM Router0xe1fa699860444be91d366c21de8fef56e3dec77a9.476533863122716823 MOVR
0x88e685f4fab4a82d7141adc0ba3ef8149f59341e75ed67e2e37bd7ff3a2580e735102942023-01-29 17:46:543 days 23 hrs ago 0x98878b06940ae243284ca214f92bb71a2b032b8a Zenlink: Regular AMM Router9.476533863122716823 MOVR
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Router

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at moonriver.moonscan.io on 2022-01-07
*/

// File: contracts/core/interfaces/IFactory.sol



pragma solidity >=0.8.0;

interface IFactory {
    event PairCreated(
        address indexed token0,
        address indexed token1,
        address pair,
        uint256
    );
    event PairCreateLocked(
        address indexed caller
    );
    event PairCreateUnlocked(
        address indexed caller
    );
    event BootstrapSetted(
        address indexed tokenA,
        address indexed tokenB,
        address indexed bootstrap
    );
    event FeetoUpdated(
        address indexed feeto
    );
    event FeeBasePointUpdated(
        uint8 basePoint
    );

    function feeto() external view returns (address);

    function feeBasePoint() external view returns (uint8);

    function lockForPairCreate() external view returns (bool);

    function getPair(address tokenA, address tokenB)
        external
        view
        returns (address pair);
    
    function getBootstrap(address tokenA, address tokenB)
        external
        view
        returns (address bootstrap);

    function allPairs(uint256) external view returns (address pair);

    function allPairsLength() external view returns (uint256);

    function createPair(address tokenA, address tokenB)
        external
        returns (address pair);
}

// File: contracts/core/interfaces/IPair.sol



pragma solidity >=0.8.0;

interface IPair {
    event Mint(address indexed sender, uint256 amount0, uint256 amount1);
    event Burn(
        address indexed sender,
        uint256 amount0,
        uint256 amount1,
        address indexed to
    );
    event Swap(
        address indexed sender,
        uint256 amount0In,
        uint256 amount1In,
        uint256 amount0Out,
        uint256 amount1Out,
        address indexed to
    );

    function MINIMUM_LIQUIDITY() external pure returns (uint256);

    function factory() external view returns (address);

    function token0() external view returns (address);

    function token1() external view returns (address);

    function getReserves()
        external
        view
        returns (uint112 reserve0, uint112 reserve1);

    function mint(address to) external returns (uint256 liquidity);

    function burn(address to)
        external
        returns (uint256 amount0, uint256 amount1);

    function swap(
        uint256 amount0Out,
        uint256 amount1Out,
        address to
    ) external;

    function initialize(address, address) external;
}

// File: contracts/libraries/Math.sol



pragma solidity >=0.8.0;

// a library for performing various math operations

library Math {
    function min(uint256 x, uint256 y) internal pure returns (uint256 z) {
        z = x < y ? x : y;
    }

    // babylonian method (https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method)
    function sqrt(uint256 y) internal pure returns (uint256 z) {
        if (y > 3) {
            z = y;
            uint256 x = y / 2 + 1;
            while (x < z) {
                z = x;
                x = (y / x + x) / 2;
            }
        } else if (y != 0) {
            z = 1;
        }
    }

    function add(uint256 x, uint256 y) internal pure returns (uint256 z) {
        require((z = x + y) >= x, "ds-math-add-overflow");
    }

    function sub(uint256 x, uint256 y) internal pure returns (uint256 z) {
        require((z = x - y) <= x, "ds-math-sub-underflow");
    }

    function mul(uint256 x, uint256 y) internal pure returns (uint256 z) {
        require(y == 0 || (z = x * y) / y == x, "ds-math-mul-overflow");
    }
}

// File: contracts/libraries/Helper.sol



pragma solidity >=0.8.0;




library Helper {
    using Math for uint256;

    function sortTokens(address tokenA, address tokenB)
        internal
        pure
        returns (address token0, address token1)
    {
        require(tokenA != tokenB, "Helper: IDENTICAL_ADDRESSES");
        (token0, token1) = tokenA < tokenB
            ? (tokenA, tokenB)
            : (tokenB, tokenA);
        require(token0 != address(0), "Helper: ZERO_ADDRESS");
    }

    function pairFor(
        address factory,
        address tokenA,
        address tokenB
    ) internal view returns (address pair) {
        return IFactory(factory).getPair(tokenA, tokenB);
    }

    function quote(
        uint256 amountA,
        uint256 reserveA,
        uint256 reserveB
    ) internal pure returns (uint256 amountB) {
        require(amountA > 0, "INSUFFICIENT_AMOUNT");
        require(reserveA > 0 && reserveB > 0, "INSUFFICIENT_LIQUIDITY");
        amountB = amountA.mul(reserveB) / reserveA;
    }

    function getReserves(
        address factory,
        address tokenA,
        address tokenB
    ) internal view returns (uint256 reserveA, uint256 reserveB) {
        (address token0, ) = sortTokens(tokenA, tokenB);
        (uint256 reserve0, uint256 reserve1) = IPair(
            pairFor(factory, tokenA, tokenB)
        ).getReserves();
        (reserveA, reserveB) = tokenA == token0
            ? (reserve0, reserve1)
            : (reserve1, reserve0);
    }

    function safeTransferFrom(
        address token,
        address from,
        address to,
        uint256 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::transferFrom: transferFrom failed"
        );
    }

    function safeTransfer(
        address token,
        address to,
        uint256 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::safeTransfer: transfer failed"
        );
    }

    function safeTransferNativeCurrency(address to, uint256 value) internal {
        (bool success, ) = to.call{value: value}(new bytes(0));
        require(
            success,
            "TransferHelper::safeTransferNativeCurrency: NativeCurrency transfer failed"
        );
    }

    // given an input amount of an asset and pair reserves, returns the maximum output amount of the other asset
    function getAmountOut(
        uint256 amountIn,
        uint256 reserveIn,
        uint256 reserveOut
    ) internal pure returns (uint256 amountOut) {
        require(amountIn > 0, "Helper: INSUFFICIENT_INPUT_AMOUNT");
        require(
            reserveIn > 0 && reserveOut > 0,
            "Helper: INSUFFICIENT_LIQUIDITY"
        );
        uint256 amountInWithFee = amountIn.mul(997);
        uint256 numerator = amountInWithFee.mul(reserveOut);
        uint256 denominator = reserveIn.mul(1000).add(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(
        uint256 amountOut,
        uint256 reserveIn,
        uint256 reserveOut
    ) internal pure returns (uint256 amountIn) {
        require(amountOut > 0, "Helper: INSUFFICIENT_OUTPUT_AMOUNT");
        require(
            reserveIn > 0 && reserveOut > 0,
            "Helper: INSUFFICIENT_LIQUIDITY"
        );
        uint256 numerator = reserveIn.mul(amountOut).mul(1000);
        uint256 denominator = reserveOut.sub(amountOut).mul(997);
        amountIn = (numerator / denominator).add(1);
    }

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

    function getAmountsIn(
        address factory,
        uint256 amountOut,
        address[] memory path
    ) internal view returns (uint256[] memory amounts) {
        require(path.length >= 2, "Helper: INVALID_PATH");
        amounts = new uint256[](path.length);
        amounts[amounts.length - 1] = amountOut;
        for (uint256 i = path.length - 1; i > 0; i--) {
            (uint256 reserveIn, uint256 reserveOut) = getReserves(
                factory,
                path[i - 1],
                path[i]
            );
            amounts[i - 1] = getAmountIn(amounts[i], reserveIn, reserveOut);
        }
    }
}

// File: contracts/periphery/interfaces/IWNativeCurrency.sol



pragma solidity >=0.8.0;

interface IWNativeCurrency {
    function deposit() external payable;

    function withdraw(uint256) external;
}

// File: contracts/periphery/interfaces/IRouter.sol



pragma solidity >=0.8.0;

interface IRouter {
    function factory() external view returns (address);

    function WNativeCurrency() external view returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    )
        external
        returns (
            uint256 amountA,
            uint256 amountB,
            uint256 liquidity
        );

    function addLiquiditySingleToken(
        address[] calldata path,
        uint256 amountIn,
        uint256 amountSwapIn,
        uint256 amountSwapOutMin,
        uint256 amountInReserveMin,
        address to,
        uint256 deadline
    )
        external
        returns (
            uint256 liquidity
        );

    function addLiquidityNativeCurrency(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountNativeCurrencyMin,
        address to,
        uint256 deadline
    )
        external
        payable
        returns (
            uint256 amountToken,
            uint256 amountNativeCurrency,
            uint256 liquidity
        );

    function addLiquiditySingleNativeCurrency(
        address[] calldata path,
        uint256 amountSwapOut,
        uint256 nativeCurrencySwapInMax,
        uint256 nativeCurrencyReserveMin,
        address to,
        uint256 deadline
    )
        external
        payable
        returns (
            uint256 amountToken,
            uint256 amountNativeCurrency,
            uint256 liquidity
        );

    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityNativeCurrency(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountNativeCurrencyMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountToken, uint256 amountNativeCurrency);

    function swapExactTokensForTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapTokensForExactTokens(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactNativeCurrencyForTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function swapTokensForExactNativeCurrency(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactTokensForNativeCurrency(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapNativeCurrencyForExactTokens(
        uint256 amountOut,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function getAmountOut(
        uint256 amountIn,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountOut);

    function getAmountIn(
        uint256 amountOut,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountIn);

    function getAmountsOut(uint256 amountIn, address[] calldata path)
        external
        view
        returns (uint256[] memory amounts);

    function getAmountsIn(uint256 amountOut, address[] calldata path)
        external
        view
        returns (uint256[] memory amounts);
}

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

// File: contracts/periphery/Router.sol



pragma solidity >=0.8.0;






contract Router is IRouter {
    using Math for uint256;

    address public override factory;
    address public override WNativeCurrency;

    constructor(address _factory, address _WNativeCurrency) {
        factory = _factory;
        WNativeCurrency = _WNativeCurrency;
    }

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

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

    function addLiquidity(
        address token0,
        address token1,
        uint256 amount0Desired,
        uint256 amount1Desired,
        uint256 amount0Min,
        uint256 amount1Min,
        address to,
        uint256 deadline
    )
        public
        override
        ensure(deadline)
        returns (
            uint256 amount0,
            uint256 amount1,
            uint256 liquidity
        )
    {
        (amount0, amount1) = _addLiquidity(
            token0,
            token1,
            amount0Desired,
            amount1Desired,
            amount0Min,
            amount1Min
        );
        address pair = Helper.pairFor(factory, token0, token1);
        Helper.safeTransferFrom(token0, msg.sender, pair, amount0);
        Helper.safeTransferFrom(token1, msg.sender, pair, amount1);
        liquidity = IPair(pair).mint(to);
    }

    function addLiquiditySingleToken(
        address[] calldata path,
        uint256 amountIn,
        uint256 amountSwapOut,
        uint256 amountSwapInMax,
        uint256 amountInReserveMin,
        address to,
        uint256 deadline
    ) external override ensure(deadline) returns (uint256 liquidity) {
        address token0 = path[0];
        address token1 = path[path.length - 1];

        uint256[] memory amounts = swapTokensForExactTokens(
            amountSwapOut,
            amountSwapInMax,
            path,
            to,
            deadline
        );

        uint256 amountInReserve = amountIn - amounts[0];
        (, , liquidity) = addLiquidity(
            token1,
            token0,
            amounts[amounts.length - 1],
            amountInReserve,
            amounts[amounts.length - 1],
            amountInReserveMin,
            to,
            deadline
        );
    }

    function addLiquidityNativeCurrency(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountNativeCurrencyMin,
        address to,
        uint256 deadline
    )
        external
        payable
        override
        ensure(deadline)
        returns (
            uint256 amountToken,
            uint256 amountNativeCurrency,
            uint256 liquidity
        )
    {
        (amountToken, amountNativeCurrency) = _addLiquidity(
            token,
            WNativeCurrency,
            amountTokenDesired,
            msg.value,
            amountTokenMin,
            amountNativeCurrencyMin
        );
        address pair = Helper.pairFor(factory, token, WNativeCurrency);
        Helper.safeTransferFrom(token, msg.sender, pair, amountToken);
        IWNativeCurrency(WNativeCurrency).deposit{
            value: amountNativeCurrency
        }();
        require(IERC20(WNativeCurrency).transfer(pair, amountNativeCurrency));
        liquidity = IPair(pair).mint(to);
        if (msg.value > amountNativeCurrency)
            Helper.safeTransferNativeCurrency(
                msg.sender,
                msg.value - amountNativeCurrency
            ); // refund dust native currency, if any
    }

    function addLiquiditySingleNativeCurrency(
        address[] memory path,
        uint256 amountSwapOut,
        uint256 nativeCurrencySwapInMax,
        uint256 nativeCurrencyReserveMin,
        address to,
        uint256 deadline
    )
        external
        payable
        override
        ensure(deadline)
        returns (
            uint256 amountToken,
            uint256 amountNativeCurrency,
            uint256 liquidity
        )
    {
        // Swap
        require(path[0] == WNativeCurrency, "Router: INVALID_PATH");
        uint256[] memory amounts = Helper.getAmountsIn(
            factory,
            amountSwapOut,
            path
        );

        require(amounts[0] <= msg.value, "Router: EXCESSIVE_INPUT_AMOUNT");
        IWNativeCurrency(WNativeCurrency).deposit{value: amounts[0]}();

        require(
            IERC20(WNativeCurrency).transfer(
                Helper.pairFor(factory, path[0], path[1]),
                amounts[0]
            )
        );

        _swap(amounts, path, to);

        require(
            amounts[0] <= nativeCurrencySwapInMax,
            "not allow bigger than nativeCurrencySwapInMax"
        );

        // Addliquidity
        address token = path[path.length - 1];
        uint256 nativeCurrencyReserve = msg.value - amounts[0];
        (amountToken, amountNativeCurrency) = _addLiquidity(
            token,
            WNativeCurrency,
            amounts[amounts.length - 1],
            nativeCurrencyReserve,
            amounts[amounts.length - 1],
            nativeCurrencyReserveMin
        );

        address pair = Helper.pairFor(factory, token, WNativeCurrency);

        Helper.safeTransferFrom(token, msg.sender, pair, amountToken);

        IWNativeCurrency(WNativeCurrency).deposit{
            value: amountNativeCurrency
        }();

        require(IERC20(WNativeCurrency).transfer(pair, amountNativeCurrency));

        liquidity = IPair(pair).mint(to);

        if (msg.value > (amountNativeCurrency + amounts[0]))
            Helper.safeTransferNativeCurrency(
                msg.sender,
                msg.value - (amountNativeCurrency + amounts[0])
            ); // refund dust native currency, if any
    }

    function _addLiquidity(
        address token0,
        address token1,
        uint256 amount0Desired,
        uint256 amount1Desired,
        uint256 amount0Min,
        uint256 amount1Min
    ) private returns (uint256 amount0, uint256 amount1) {
        if (IFactory(factory).getPair(token0, token1) == address(0)) {
            IFactory(factory).createPair(token0, token1);
        }
        (uint256 reserve0, uint256 reserve1) = Helper.getReserves(
            factory,
            token0,
            token1
        );
        if (reserve0 == 0 && reserve1 == 0) {
            (amount0, amount1) = (amount0Desired, amount1Desired);
        } else {
            uint256 amount1Optimal = Helper.quote(
                amount0Desired,
                reserve0,
                reserve1
            );
            if (amount1Optimal <= amount1Desired) {
                require(
                    amount1Optimal >= amount1Min,
                    "Router: INSUFFICIENT_1_AMOUNT"
                );
                (amount0, amount1) = (amount0Desired, amount1Optimal);
            } else {
                uint256 amount0Optimal = Helper.quote(
                    amount1Desired,
                    reserve1,
                    reserve0
                );
                require(amount0Optimal <= amount0Desired);
                require(
                    amount0Optimal >= amount0Min,
                    "Router: INSUFFICIENT_0_AMOUNT"
                );
                (amount0, amount1) = (amount0Optimal, amount1Desired);
            }
        }
    }

    function removeLiquidity(
        address token0,
        address token1,
        uint256 liquidity,
        uint256 amount0Min,
        uint256 amount1Min,
        address to,
        uint256 deadline
    )
        public
        override
        ensure(deadline)
        returns (uint256 amount0, uint256 amount1)
    {
        address pair = Helper.pairFor(factory, token0, token1);
        IERC20(pair).transferFrom(msg.sender, pair, liquidity);
        (uint256 amountA, uint256 amountB) = IPair(pair).burn(to);
        (address tokenA, ) = Helper.sortTokens(token0, token1);
        (amount0, amount1) = tokenA == token0
            ? (amountA, amountB)
            : (amountB, amountA);
        require(amount0 >= amount0Min, "Router: INSUFFICIENT_0_AMOUNT");
        require(amount1 >= amount1Min, "Router: INSUFFICIENT_1_AMOUNT");
    }

    function removeLiquidityNativeCurrency(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountNativeCurrencyMin,
        address to,
        uint256 deadline
    )
        public
        override
        ensure(deadline)
        returns (uint256 amountToken, uint256 amountNativeCurrency)
    {
        (amountToken, amountNativeCurrency) = removeLiquidity(
            token,
            WNativeCurrency,
            liquidity,
            amountTokenMin,
            amountNativeCurrencyMin,
            address(this),
            deadline
        );
        Helper.safeTransfer(token, to, amountToken);
        IWNativeCurrency(WNativeCurrency).withdraw(amountNativeCurrency);
        Helper.safeTransferNativeCurrency(to, amountNativeCurrency);
    }

    function _swap(
        uint256[] memory amounts,
        address[] memory path,
        address _to
    ) private {
        for (uint256 i; i < path.length - 1; i++) {
            (address input, address output) = (path[i], path[i + 1]);
            (address token0, ) = Helper.sortTokens(input, output);
            uint256 amountOut = amounts[i + 1];
            (uint256 amount0Out, uint256 amount1Out) = input == token0
                ? (uint256(0), amountOut)
                : (amountOut, uint256(0));
            address to = i < path.length - 2
                ? Helper.pairFor(factory, output, path[i + 2])
                : _to;
            IPair(Helper.pairFor(factory, input, output)).swap(
                amount0Out,
                amount1Out,
                to
            );
        }
    }

    function swapExactTokensForTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) public override ensure(deadline) returns (uint256[] memory amounts) {
        amounts = Helper.getAmountsOut(factory, amountIn, path);
        require(
            amounts[amounts.length - 1] >= amountOutMin,
            "Router: INSUFFICIENT_OUTPUT_AMOUNT"
        );
        Helper.safeTransferFrom(
            path[0],
            msg.sender,
            Helper.pairFor(factory, path[0], path[1]),
            amounts[0]
        );
        _swap(amounts, path, to);
    }

    function swapTokensForExactTokens(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) public override ensure(deadline) returns (uint256[] memory amounts) {
        amounts = Helper.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= amountInMax, "Router: EXCESSIVE_INPUT_AMOUNT");
        Helper.safeTransferFrom(
            path[0],
            msg.sender,
            Helper.pairFor(factory, path[0], path[1]),
            amounts[0]
        );
        _swap(amounts, path, to);
    }

    function swapExactNativeCurrencyForTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    )
        external
        payable
        override
        ensure(deadline)
        returns (uint256[] memory amounts)
    {
        require(path[0] == WNativeCurrency, "Router: INVALID_PATH");
        amounts = Helper.getAmountsOut(factory, msg.value, path);
        require(
            amounts[amounts.length - 1] >= amountOutMin,
            "Router: INSUFFICIENT_OUTPUT_AMOUNT"
        );
        IWNativeCurrency(WNativeCurrency).deposit{value: amounts[0]}();
        require(
            IERC20(WNativeCurrency).transfer(
                Helper.pairFor(factory, path[0], path[1]),
                amounts[0]
            )
        );
        _swap(amounts, path, to);
    }

    function swapTokensForExactNativeCurrency(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external override ensure(deadline) returns (uint256[] memory amounts) {
        require(
            path[path.length - 1] == WNativeCurrency,
            "Router: INVALID_PATH"
        );
        amounts = Helper.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= amountInMax, "Router: EXCESSIVE_INPUT_AMOUNT");
        Helper.safeTransferFrom(
            path[0],
            msg.sender,
            Helper.pairFor(factory, path[0], path[1]),
            amounts[0]
        );
        _swap(amounts, path, address(this));
        IWNativeCurrency(WNativeCurrency).withdraw(amounts[amounts.length - 1]);
        Helper.safeTransferNativeCurrency(to, amounts[amounts.length - 1]);
    }

    function swapExactTokensForNativeCurrency(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external override ensure(deadline) returns (uint256[] memory amounts) {
        require(
            path[path.length - 1] == WNativeCurrency,
            "Router: INVALID_PATH"
        );
        amounts = Helper.getAmountsOut(factory, amountIn, path);
        require(
            amounts[amounts.length - 1] >= amountOutMin,
            "Router: INSUFFICIENT_OUTPUT_AMOUNT"
        );
        Helper.safeTransferFrom(
            path[0],
            msg.sender,
            Helper.pairFor(factory, path[0], path[1]),
            amounts[0]
        );
        _swap(amounts, path, address(this));
        IWNativeCurrency(WNativeCurrency).withdraw(amounts[amounts.length - 1]);
        Helper.safeTransferNativeCurrency(to, amounts[amounts.length - 1]);
    }

    function swapNativeCurrencyForExactTokens(
        uint256 amountOut,
        address[] calldata path,
        address to,
        uint256 deadline
    )
        external
        payable
        override
        ensure(deadline)
        returns (uint256[] memory amounts)
    {
        require(path[0] == WNativeCurrency, "Router: INVALID_PATH");
        amounts = Helper.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= msg.value, "Router: EXCESSIVE_INPUT_AMOUNT");
        IWNativeCurrency(WNativeCurrency).deposit{value: amounts[0]}();
        require(
            IERC20(WNativeCurrency).transfer(
                Helper.pairFor(factory, path[0], path[1]),
                amounts[0]
            )
        );
        _swap(amounts, path, to);
        if (msg.value > amounts[0])
            Helper.safeTransferNativeCurrency(
                msg.sender,
                msg.value - amounts[0]
            ); // refund dust eth, if any
    }

    function getAmountOut(
        uint256 amountIn,
        uint256 reserveIn,
        uint256 reserveOut
    ) public pure override returns (uint256 amountOut) {
        return Helper.getAmountOut(amountIn, reserveIn, reserveOut);
    }

    function getAmountIn(
        uint256 amountOut,
        uint256 reserveIn,
        uint256 reserveOut
    ) public pure override returns (uint256 amountIn) {
        return Helper.getAmountOut(amountOut, reserveIn, reserveOut);
    }

    function getAmountsOut(uint256 amountIn, address[] memory path)
        public
        view
        override
        returns (uint256[] memory amounts)
    {
        return Helper.getAmountsOut(factory, amountIn, path);
    }

    function getAmountsIn(uint256 amountOut, address[] memory path)
        public
        view
        override
        returns (uint256[] memory amounts)
    {
        return Helper.getAmountsIn(factory, amountOut, path);
    }
}

Contract ABI

[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_WNativeCurrency","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"WNativeCurrency","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token0","type":"address"},{"internalType":"address","name":"token1","type":"address"},{"internalType":"uint256","name":"amount0Desired","type":"uint256"},{"internalType":"uint256","name":"amount1Desired","type":"uint256"},{"internalType":"uint256","name":"amount0Min","type":"uint256"},{"internalType":"uint256","name":"amount1Min","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidity","outputs":[{"internalType":"uint256","name":"amount0","type":"uint256"},{"internalType":"uint256","name":"amount1","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":"amountNativeCurrencyMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidityNativeCurrency","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountNativeCurrency","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"uint256","name":"amountSwapOut","type":"uint256"},{"internalType":"uint256","name":"nativeCurrencySwapInMax","type":"uint256"},{"internalType":"uint256","name":"nativeCurrencyReserveMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquiditySingleNativeCurrency","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountNativeCurrency","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountSwapOut","type":"uint256"},{"internalType":"uint256","name":"amountSwapInMax","type":"uint256"},{"internalType":"uint256","name":"amountInReserveMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquiditySingleToken","outputs":[{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"nonpayable","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":"address","name":"token0","type":"address"},{"internalType":"address","name":"token1","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amount0Min","type":"uint256"},{"internalType":"uint256","name":"amount1Min","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidity","outputs":[{"internalType":"uint256","name":"amount0","type":"uint256"},{"internalType":"uint256","name":"amount1","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":"amountNativeCurrencyMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityNativeCurrency","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountNativeCurrency","type":"uint256"}],"stateMutability":"nonpayable","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":"swapExactNativeCurrencyForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"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":"swapExactTokensForNativeCurrency","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":"swapExactTokensForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"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":"swapNativeCurrencyForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","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":"swapTokensForExactNativeCurrency","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"},{"stateMutability":"payable","type":"receive"}]

60806040523480156200001157600080fd5b506040516200353138038062003531833981016040819052620000349162000083565b600080546001600160a01b039384166001600160a01b03199182161790915560018054929093169116179055620000bb565b80516001600160a01b03811681146200007e57600080fd5b919050565b600080604083850312156200009757600080fd5b620000a28362000066565b9150620000b26020840162000066565b90509250929050565b61346680620000cb6000396000f3fe60806040526004361061010d5760003560e01c80639be7614d11610095578063cd1bd0d911610064578063cd1bd0d9146102f1578063d06ca61f14610304578063dcff1b9414610324578063e8e3370014610344578063f85b7c8b1461036457600080fd5b80639be7614d1461027e578063b1ea829214610291578063baa2abde146102b1578063c45a0155146102d157600080fd5b8063419591ed116100dc578063419591ed146101e5578063686589671461021d57806385f8c259146101305780638803dbee1461024b578063937ca0da1461026b57600080fd5b8063054d50d4146101305780631f00ca741461016357806338ed173914610190578063403bf1f2146101b057600080fd5b3661012b576001546001600160a01b0316331461012957600080fd5b005b600080fd5b34801561013c57600080fd5b5061015061014b3660046131b9565b610384565b6040519081526020015b60405180910390f35b34801561016f57600080fd5b5061018361017e3660046130db565b610399565b60405161015a9190613220565b34801561019c57600080fd5b506101836101ab366004613146565b6103bc565b3480156101bc57600080fd5b506101d06101cb366004612ebf565b610576565b6040805192835260208301919091520161015a565b3480156101f157600080fd5b50600154610205906001600160a01b031681565b6040516001600160a01b03909116815260200161015a565b61023061022b366004612fa4565b61063a565b6040805193845260208401929092529082015260600161015a565b34801561025757600080fd5b50610183610266366004613146565b610c05565b610230610279366004612ebf565b610cae565b61018361028c366004613074565b610ebd565b34801561029d57600080fd5b506101506102ac366004612f1d565b6111c8565b3480156102bd57600080fd5b506101d06102cc366004612dd1565b6112fe565b3480156102dd57600080fd5b50600054610205906001600160a01b031681565b6101836102ff366004613074565b61152f565b34801561031057600080fd5b5061018361031f3660046130db565b6117c8565b34801561033057600080fd5b5061018361033f366004613146565b6117e2565b34801561035057600080fd5b5061023061035f366004612e43565b611a0d565b34801561037057600080fd5b5061018361037f366004613146565b611b07565b6000610391848484611c16565b949350505050565b6000546060906103b3906001600160a01b03168484611d1a565b90505b92915050565b606081428110156103e85760405162461bcd60e51b81526004016103df906132c9565b60405180910390fd5b6000546040805160208089028281018201909352888252610432936001600160a01b0316928c92918b918b91829190850190849080828437600092019190915250611ea792505050565b9150868260018451610444919061338d565b81518110610454576104546133ec565b6020026020010151101561047a5760405162461bcd60e51b81526004016103df906132f2565b61052c86866000818110610490576104906133ec565b90506020020160208101906104a59190612d90565b60008054339161050c916001600160a01b0316908b908b90816104ca576104ca6133ec565b90506020020160208101906104df9190612d90565b8b8b60018181106104f2576104f26133ec565b90506020020160208101906105079190612d90565b612014565b8560008151811061051f5761051f6133ec565b6020026020010151612099565b61056b828787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508992506121d7915050565b509695505050505050565b600080824281101561059a5760405162461bcd60e51b81526004016103df906132c9565b6001546105b6908a906001600160a01b03168a8a8a308a6112fe565b90935091506105c6898685612387565b600154604051632e1a7d4d60e01b8152600481018490526001600160a01b0390911690632e1a7d4d90602401600060405180830381600087803b15801561060c57600080fd5b505af1158015610620573d6000803e3d6000fd5b5050505061062e85836124b8565b50965096945050505050565b600080600083428110156106605760405162461bcd60e51b81526004016103df906132c9565b6001548a516001600160a01b03909116908b90600090610682576106826133ec565b60200260200101516001600160a01b0316146106b05760405162461bcd60e51b81526004016103df90613264565b600080546106c8906001600160a01b03168b8d611d1a565b905034816000815181106106de576106de6133ec565b602002602001015111156107045760405162461bcd60e51b81526004016103df90613292565b60015481516001600160a01b039091169063d0e30db090839060009061072c5761072c6133ec565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561075f57600080fd5b505af1158015610773573d6000803e3d6000fd5b5050505050600160009054906101000a90046001600160a01b03166001600160a01b031663a9059cbb6107ee60008054906101000a90046001600160a01b03168e6000815181106107c6576107c66133ec565b60200260200101518f6001815181106107e1576107e16133ec565b6020026020010151612014565b83600081518110610801576108016133ec565b60200260200101516040518363ffffffff1660e01b815260040161083a9291906001600160a01b03929092168252602082015260400190565b602060405180830381600087803b15801561085457600080fd5b505af1158015610868573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061088c9190613006565b61089557600080fd5b6108a0818c896121d7565b88816000815181106108b4576108b46133ec565b602002602001015111156109205760405162461bcd60e51b815260206004820152602d60248201527f6e6f7420616c6c6f7720626967676572207468616e206e61746976654375727260448201526c0cadcc6f2a6eec2e092dc9ac2f609b1b60648201526084016103df565b60008b60018d51610931919061338d565b81518110610941576109416133ec565b60200260200101519050600082600081518110610960576109606133ec565b602002602001015134610973919061338d565b90506109e482600160009054906101000a90046001600160a01b0316856001875161099e919061338d565b815181106109ae576109ae6133ec565b60200260200101518487600189516109c6919061338d565b815181106109d6576109d66133ec565b60200260200101518f6125b3565b60008054600154939a5091985091610a0a916001600160a01b0390811691869116612014565b9050610a188333838b612099565b600160009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0886040518263ffffffff1660e01b81526004016000604051808303818588803b158015610a6857600080fd5b505af1158015610a7c573d6000803e3d6000fd5b505060015460405163a9059cbb60e01b81526001600160a01b038681166004830152602482018d9052909116935063a9059cbb92506044019050602060405180830381600087803b158015610ad057600080fd5b505af1158015610ae4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b089190613006565b610b1157600080fd5b6040516335313c2160e11b81526001600160a01b038b81166004830152821690636a62784290602401602060405180830381600087803b158015610b5457600080fd5b505af1158015610b68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b8c919061305b565b955083600081518110610ba157610ba16133ec565b602002602001015187610bb49190613334565b341115610bf457610bf43385600081518110610bd257610bd26133ec565b602002602001015189610be59190613334565b610bef903461338d565b6124b8565b505050505096509650969350505050565b60608142811015610c285760405162461bcd60e51b81526004016103df906132c9565b6000546040805160208089028281018201909352888252610c72936001600160a01b0316928c92918b918b91829190850190849080828437600092019190915250611d1a92505050565b91508682600081518110610c8857610c886133ec565b6020026020010151111561047a5760405162461bcd60e51b81526004016103df90613292565b60008060008342811015610cd45760405162461bcd60e51b81526004016103df906132c9565b600154610cef908b906001600160a01b03168b348c8c6125b3565b6000805460015493975091955091610d15916001600160a01b03908116918e9116612014565b9050610d238b338388612099565b600160009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b158015610d7357600080fd5b505af1158015610d87573d6000803e3d6000fd5b505060015460405163a9059cbb60e01b81526001600160a01b038681166004830152602482018a9052909116935063a9059cbb92506044019050602060405180830381600087803b158015610ddb57600080fd5b505af1158015610def573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e139190613006565b610e1c57600080fd5b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a62784290602401602060405180830381600087803b158015610e5f57600080fd5b505af1158015610e73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e97919061305b565b925083341115610eaf57610eaf33610bef863461338d565b505096509650969350505050565b60608142811015610ee05760405162461bcd60e51b81526004016103df906132c9565b6001546001600160a01b03168686600081610efd57610efd6133ec565b9050602002016020810190610f129190612d90565b6001600160a01b031614610f385760405162461bcd60e51b81526004016103df90613264565b6000546040805160208089028281018201909352888252610f82936001600160a01b0316928b92918b918b91829190850190849080828437600092019190915250611d1a92505050565b91503482600081518110610f9857610f986133ec565b60200260200101511115610fbe5760405162461bcd60e51b81526004016103df90613292565b60015482516001600160a01b039091169063d0e30db0908490600090610fe657610fe66133ec565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561101957600080fd5b505af115801561102d573d6000803e3d6000fd5b5050600154600080546001600160a01b03928316955063a9059cbb945061108c9350909116908a908a9081611064576110646133ec565b90506020020160208101906110799190612d90565b8a8a60018181106104f2576104f26133ec565b8460008151811061109f5761109f6133ec565b60200260200101516040518363ffffffff1660e01b81526004016110d89291906001600160a01b03929092168252602082015260400190565b602060405180830381600087803b1580156110f257600080fd5b505af1158015611106573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061112a9190613006565b61113357600080fd5b611172828787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508992506121d7915050565b81600081518110611185576111856133ec565b60200260200101513411156111be576111be33836000815181106111ab576111ab6133ec565b602002602001015134610bef919061338d565b5095945050505050565b600081428110156111eb5760405162461bcd60e51b81526004016103df906132c9565b60008a8a6000818110611200576112006133ec565b90506020020160208101906112159190612d90565b905060008b8b61122660018261338d565b818110611235576112356133ec565b905060200201602081019061124a9190612d90565b9050600061125c8a8a8f8f8b8b610c05565b9050600081600081518110611273576112736133ec565b60200260200101518c611286919061338d565b90506112e48385846001865161129c919061338d565b815181106112ac576112ac6133ec565b60200260200101518486600188516112c4919061338d565b815181106112d4576112d46133ec565b60200260200101518e8e8e611a0d565b909150905080965050505050505098975050505050505050565b60008082428110156113225760405162461bcd60e51b81526004016103df906132c9565b6000805461133a906001600160a01b03168c8c612014565b6040516323b872dd60e01b81523360048201526001600160a01b03821660248201819052604482018c90529192506323b872dd90606401602060405180830381600087803b15801561138b57600080fd5b505af115801561139f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113c39190613006565b5060405163226bf2d160e21b81526001600160a01b03878116600483015260009182918416906389afcb44906024016040805180830381600087803b15801561140b57600080fd5b505af115801561141f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114439190613122565b9150915060006114538e8e612802565b5090508d6001600160a01b0316816001600160a01b031614611476578183611479565b82825b90975095508a8710156114ce5760405162461bcd60e51b815260206004820152601d60248201527f526f757465723a20494e53554646494349454e545f305f414d4f554e5400000060448201526064016103df565b8986101561151e5760405162461bcd60e51b815260206004820152601d60248201527f526f757465723a20494e53554646494349454e545f315f414d4f554e5400000060448201526064016103df565b505050505097509795505050505050565b606081428110156115525760405162461bcd60e51b81526004016103df906132c9565b6001546001600160a01b0316868660008161156f5761156f6133ec565b90506020020160208101906115849190612d90565b6001600160a01b0316146115aa5760405162461bcd60e51b81526004016103df90613264565b60005460408051602080890282810182019093528882526115f4936001600160a01b0316923492918b918b91829190850190849080828437600092019190915250611ea792505050565b9150868260018451611606919061338d565b81518110611616576116166133ec565b6020026020010151101561163c5760405162461bcd60e51b81526004016103df906132f2565b60015482516001600160a01b039091169063d0e30db0908490600090611664576116646133ec565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561169757600080fd5b505af11580156116ab573d6000803e3d6000fd5b5050600154600080546001600160a01b03928316955063a9059cbb94506116e29350909116908a908a9081611064576110646133ec565b846000815181106116f5576116f56133ec565b60200260200101516040518363ffffffff1660e01b815260040161172e9291906001600160a01b03929092168252602082015260400190565b602060405180830381600087803b15801561174857600080fd5b505af115801561175c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117809190613006565b61178957600080fd5b6111be828787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508992506121d7915050565b6000546060906103b3906001600160a01b03168484611ea7565b606081428110156118055760405162461bcd60e51b81526004016103df906132c9565b600180546001600160a01b03169087908790611821908261338d565b818110611830576118306133ec565b90506020020160208101906118459190612d90565b6001600160a01b03161461186b5760405162461bcd60e51b81526004016103df90613264565b60005460408051602080890282810182019093528882526118b5936001600160a01b0316928c92918b918b91829190850190849080828437600092019190915250611ea792505050565b91508682600184516118c7919061338d565b815181106118d7576118d76133ec565b602002602001015110156118fd5760405162461bcd60e51b81526004016103df906132f2565b61191386866000818110610490576104906133ec565b611952828787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152503092506121d7915050565b6001805483516001600160a01b0390911691632e1a7d4d9185916119759161338d565b81518110611985576119856133ec565b60200260200101516040518263ffffffff1660e01b81526004016119ab91815260200190565b600060405180830381600087803b1580156119c557600080fd5b505af11580156119d9573d6000803e3d6000fd5b5050505061056b8483600185516119f0919061338d565b81518110611a0057611a006133ec565b60200260200101516124b8565b60008060008342811015611a335760405162461bcd60e51b81526004016103df906132c9565b611a418c8c8c8c8c8c6125b3565b6000805492965090945090611a60906001600160a01b03168e8e612014565b9050611a6e8d338388612099565b611a7a8c338387612099565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a62784290602401602060405180830381600087803b158015611abd57600080fd5b505af1158015611ad1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611af5919061305b565b92505050985098509895505050505050565b60608142811015611b2a5760405162461bcd60e51b81526004016103df906132c9565b600180546001600160a01b03169087908790611b46908261338d565b818110611b5557611b556133ec565b9050602002016020810190611b6a9190612d90565b6001600160a01b031614611b905760405162461bcd60e51b81526004016103df90613264565b6000546040805160208089028281018201909352888252611bda936001600160a01b0316928c92918b918b91829190850190849080828437600092019190915250611d1a92505050565b91508682600081518110611bf057611bf06133ec565b602002602001015111156118fd5760405162461bcd60e51b81526004016103df90613292565b6000808411611c715760405162461bcd60e51b815260206004820152602160248201527f48656c7065723a20494e53554646494349454e545f494e5055545f414d4f554e6044820152601560fa1b60648201526084016103df565b600083118015611c815750600082115b611ccd5760405162461bcd60e51b815260206004820152601e60248201527f48656c7065723a20494e53554646494349454e545f4c4951554944495459000060448201526064016103df565b6000611cdb856103e56128e3565b90506000611ce982856128e3565b90506000611d0383611cfd886103e86128e3565b9061294a565b9050611d0f818361334c565b979650505050505050565b6060600282511015611d655760405162461bcd60e51b8152602060048201526014602482015273090cad8e0cae47440929cac82989288bea082a8960631b60448201526064016103df565b815167ffffffffffffffff811115611d7f57611d7f613402565b604051908082528060200260200182016040528015611da8578160200160208202803683370190505b509050828160018351611dbb919061338d565b81518110611dcb57611dcb6133ec565b602002602001018181525050600060018351611de7919061338d565b90505b8015611e9f57600080611e3a8786611e0360018761338d565b81518110611e1357611e136133ec565b6020026020010151878681518110611e2d57611e2d6133ec565b602002602001015161299f565b91509150611e62848481518110611e5357611e536133ec565b60200260200101518383612a76565b84611e6e60018661338d565b81518110611e7e57611e7e6133ec565b60200260200101818152505050508080611e97906133a4565b915050611dea565b509392505050565b6060600282511015611ef25760405162461bcd60e51b8152602060048201526014602482015273090cad8e0cae47440929cac82989288bea082a8960631b60448201526064016103df565b815167ffffffffffffffff811115611f0c57611f0c613402565b604051908082528060200260200182016040528015611f35578160200160208202803683370190505b5090508281600081518110611f4c57611f4c6133ec565b60200260200101818152505060005b60018351611f69919061338d565b811015611e9f57600080611faf87868581518110611f8957611f896133ec565b602002602001015187866001611f9f9190613334565b81518110611e2d57611e2d6133ec565b91509150611fd7848481518110611fc857611fc86133ec565b60200260200101518383611c16565b84611fe3856001613334565b81518110611ff357611ff36133ec565b6020026020010181815250505050808061200c906133bb565b915050611f5b565b60405163e6a4390560e01b81526001600160a01b03838116600483015282811660248301526000919085169063e6a439059060440160206040518083038186803b15801561206157600080fd5b505afa158015612075573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103919190612db4565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17905291516000928392908816916120fd91906131e5565b6000604051808303816000865af19150503d806000811461213a576040519150601f19603f3d011682016040523d82523d6000602084013e61213f565b606091505b50915091508180156121695750805115806121695750808060200190518101906121699190613006565b6121cf5760405162461bcd60e51b815260206004820152603160248201527f5472616e7366657248656c7065723a3a7472616e7366657246726f6d3a207472604482015270185b9cd9995c919c9bdb4819985a5b1959607a1b60648201526084016103df565b505050505050565b60005b600183516121e8919061338d565b81101561238157600080848381518110612204576122046133ec565b60200260200101518584600161221a9190613334565b8151811061222a5761222a6133ec565b60200260200101519150915060006122428383612802565b509050600087612253866001613334565b81518110612263576122636133ec565b60200260200101519050600080836001600160a01b0316866001600160a01b03161461229157826000612295565b6000835b91509150600060028a516122a9919061338d565b88106122b557886122e2565b6000546122e2906001600160a01b0316878c6122d28c6002613334565b815181106107e1576107e16133ec565b6000549091506122fc906001600160a01b03168888612014565b6040516336cd320560e11b815260048101859052602481018490526001600160a01b0383811660448301529190911690636d9a640a90606401600060405180830381600087803b15801561234f57600080fd5b505af1158015612363573d6000803e3d6000fd5b50505050505050505050508080612379906133bb565b9150506121da565b50505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b17905291516000928392908716916123e391906131e5565b6000604051808303816000865af19150503d8060008114612420576040519150601f19603f3d011682016040523d82523d6000602084013e612425565b606091505b509150915081801561244f57508051158061244f57508080602001905181019061244f9190613006565b6124b15760405162461bcd60e51b815260206004820152602d60248201527f5472616e7366657248656c7065723a3a736166655472616e736665723a20747260448201526c185b9cd9995c8819985a5b1959609a1b60648201526084016103df565b5050505050565b604080516000808252602082019092526001600160a01b0384169083906040516124e291906131e5565b60006040518083038185875af1925050503d806000811461251f576040519150601f19603f3d011682016040523d82523d6000602084013e612524565b606091505b50509050806125ae5760405162461bcd60e51b815260206004820152604a60248201527f5472616e7366657248656c7065723a3a736166655472616e736665724e61746960448201527f766543757272656e63793a204e617469766543757272656e6379207472616e7360648201526919995c8819985a5b195960b21b608482015260a4016103df565b505050565b6000805460405163e6a4390560e01b81526001600160a01b03898116600483015288811660248301528392839291169063e6a439059060440160206040518083038186803b15801561260457600080fd5b505afa158015612618573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061263c9190612db4565b6001600160a01b031614156126d4576000546040516364e329cb60e11b81526001600160a01b038a8116600483015289811660248301529091169063c9c6539690604401602060405180830381600087803b15801561269a57600080fd5b505af11580156126ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126d29190612db4565b505b6000805481906126ee906001600160a01b03168b8b61299f565b91509150816000148015612700575080155b15612710578793508692506127f5565b600061271d898484612b75565b905087811161278157858110156127765760405162461bcd60e51b815260206004820152601d60248201527f526f757465723a20494e53554646494349454e545f315f414d4f554e5400000060448201526064016103df565b8894509250826127f3565b600061278e898486612b75565b90508981111561279d57600080fd5b878110156127ed5760405162461bcd60e51b815260206004820152601d60248201527f526f757465723a20494e53554646494349454e545f305f414d4f554e5400000060448201526064016103df565b94508793505b505b5050965096945050505050565b600080826001600160a01b0316846001600160a01b031614156128675760405162461bcd60e51b815260206004820152601b60248201527f48656c7065723a204944454e544943414c5f414444524553534553000000000060448201526064016103df565b826001600160a01b0316846001600160a01b03161061288757828461288a565b83835b90925090506001600160a01b0382166128dc5760405162461bcd60e51b815260206004820152601460248201527348656c7065723a205a45524f5f4144445245535360601b60448201526064016103df565b9250929050565b6000811580612907575082826128f9818361336e565b9250612905908361334c565b145b6103b65760405162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b60448201526064016103df565b6000826129578382613334565b91508110156103b65760405162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b60448201526064016103df565b60008060006129ae8585612802565b5090506000806129bf888888612014565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401604080518083038186803b1580156129f657600080fd5b505afa158015612a0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a2e9190613028565b6001600160701b031691506001600160701b03169150826001600160a01b0316876001600160a01b031614612a64578082612a67565b81815b90999098509650505050505050565b6000808411612ad25760405162461bcd60e51b815260206004820152602260248201527f48656c7065723a20494e53554646494349454e545f4f55545055545f414d4f55604482015261139560f21b60648201526084016103df565b600083118015612ae25750600082115b612b2e5760405162461bcd60e51b815260206004820152601e60248201527f48656c7065723a20494e53554646494349454e545f4c4951554944495459000060448201526064016103df565b6000612b466103e8612b4086886128e3565b906128e3565b90506000612b5a6103e5612b408689612c26565b9050612b6b6001611cfd838561334c565b9695505050505050565b6000808411612bbc5760405162461bcd60e51b8152602060048201526013602482015272125394d551919250d251539517d05353d55395606a1b60448201526064016103df565b600083118015612bcc5750600082115b612c115760405162461bcd60e51b8152602060048201526016602482015275494e53554646494349454e545f4c495155494449545960501b60448201526064016103df565b82612c1c85846128e3565b610391919061334c565b600082612c33838261338d565b91508111156103b65760405162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b60448201526064016103df565b8035612c8781613418565b919050565b60008083601f840112612c9e57600080fd5b50813567ffffffffffffffff811115612cb657600080fd5b6020830191508360208260051b85010111156128dc57600080fd5b600082601f830112612ce257600080fd5b8135602067ffffffffffffffff80831115612cff57612cff613402565b8260051b604051601f19603f83011681018181108482111715612d2457612d24613402565b60405284815283810192508684018288018501891015612d4357600080fd5b600092505b85831015612d6d57612d5981612c7c565b845292840192600192909201918401612d48565b50979650505050505050565b80516001600160701b0381168114612c8757600080fd5b600060208284031215612da257600080fd5b8135612dad81613418565b9392505050565b600060208284031215612dc657600080fd5b8151612dad81613418565b600080600080600080600060e0888a031215612dec57600080fd5b8735612df781613418565b96506020880135612e0781613418565b955060408801359450606088013593506080880135925060a0880135612e2c81613418565b8092505060c0880135905092959891949750929550565b600080600080600080600080610100898b031215612e6057600080fd5b8835612e6b81613418565b97506020890135612e7b81613418565b965060408901359550606089013594506080890135935060a0890135925060c0890135612ea781613418565b8092505060e089013590509295985092959890939650565b60008060008060008060c08789031215612ed857600080fd5b8635612ee381613418565b95506020870135945060408701359350606087013592506080870135612f0881613418565b8092505060a087013590509295509295509295565b60008060008060008060008060e0898b031215612f3957600080fd5b883567ffffffffffffffff811115612f5057600080fd5b612f5c8b828c01612c8c565b9099509750506020890135955060408901359450606089013593506080890135925060a0890135612f8c81613418565b8092505060c089013590509295985092959890939650565b60008060008060008060c08789031215612fbd57600080fd5b863567ffffffffffffffff811115612fd457600080fd5b612fe089828a01612cd1565b9650506020870135945060408701359350606087013592506080870135612f0881613418565b60006020828403121561301857600080fd5b81518015158114612dad57600080fd5b6000806040838503121561303b57600080fd5b61304483612d79565b915061305260208401612d79565b90509250929050565b60006020828403121561306d57600080fd5b5051919050565b60008060008060006080868803121561308c57600080fd5b85359450602086013567ffffffffffffffff8111156130aa57600080fd5b6130b688828901612c8c565b90955093505060408601356130ca81613418565b949793965091946060013592915050565b600080604083850312156130ee57600080fd5b82359150602083013567ffffffffffffffff81111561310c57600080fd5b61311885828601612cd1565b9150509250929050565b6000806040838503121561313557600080fd5b505080516020909101519092909150565b60008060008060008060a0878903121561315f57600080fd5b8635955060208701359450604087013567ffffffffffffffff81111561318457600080fd5b61319089828a01612c8c565b90955093505060608701356131a481613418565b80925050608087013590509295509295509295565b6000806000606084860312156131ce57600080fd5b505081359360208301359350604090920135919050565b6000825160005b8181101561320657602081860181015185830152016131ec565b81811115613215576000828501525b509190910192915050565b6020808252825182820181905260009190848201906040850190845b818110156132585783518352928401929184019160010161323c565b50909695505050505050565b6020808252601490820152730a4deeae8cae47440929cac82989288bea082a8960631b604082015260600190565b6020808252601e908201527f526f757465723a204558434553534956455f494e5055545f414d4f554e540000604082015260600190565b6020808252600f908201526e149bdd5d195c8e8811561412549151608a1b604082015260600190565b60208082526022908201527f526f757465723a20494e53554646494349454e545f4f55545055545f414d4f55604082015261139560f21b606082015260800190565b60008219821115613347576133476133d6565b500190565b60008261336957634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615613388576133886133d6565b500290565b60008282101561339f5761339f6133d6565b500390565b6000816133b3576133b36133d6565b506000190190565b60006000198214156133cf576133cf6133d6565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461342d57600080fd5b5056fea26469706673582212208d0347b698ede02582681341f3d0731e07e8b75877604cdd90701fe46fb5519f64736f6c63430008070033000000000000000000000000f36ae63d89983e3aea8aaad1086c3280eb01438d00000000000000000000000098878b06940ae243284ca214f92bb71a2b032b8a

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

000000000000000000000000f36ae63d89983e3aea8aaad1086c3280eb01438d00000000000000000000000098878b06940ae243284ca214f92bb71a2b032b8a

-----Decoded View---------------
Arg [0] : _factory (address): 0xf36ae63d89983e3aea8aaad1086c3280eb01438d
Arg [1] : _WNativeCurrency (address): 0x98878b06940ae243284ca214f92bb71a2b032b8a

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000f36ae63d89983e3aea8aaad1086c3280eb01438d
Arg [1] : 00000000000000000000000098878b06940ae243284ca214f92bb71a2b032b8a


Deployed ByteCode Sourcemap

16839:16263:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17324:15;;-1:-1:-1;;;;;17324:15:0;17310:10;:29;17302:38;;;;;;16839:16263;;;;;32131:240;;;;;;;;;;-1:-1:-1;32131:240:0;;;;;:::i;:::-;;:::i;:::-;;;19704:25:1;;;19692:2;19677:18;32131:240:0;;;;;;;;32867:232;;;;;;;;;;-1:-1:-1;32867:232:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;27069:669::-;;;;;;;;;;-1:-1:-1;27069:669:0;;;;;:::i;:::-;;:::i;25393:829::-;;;;;;;;;;-1:-1:-1;25393:829:0;;;;;:::i;:::-;;:::i;:::-;;;;19914:25:1;;;19970:2;19955:18;;19948:34;;;;19887:18;25393:829:0;19740:248:1;16942:39:0;;;;;;;;;;-1:-1:-1;16942:39:0;;;;-1:-1:-1;;;;;16942:39:0;;;;;;-1:-1:-1;;;;;10044:32:1;;;10026:51;;10014:2;9999:18;16942:39:0;9880:203:1;20603:2284:0;;;;;;:::i;:::-;;:::i;:::-;;;;20545:25:1;;;20601:2;20586:18;;20579:34;;;;20629:18;;;20622:34;20533:2;20518:18;20603:2284:0;20343:319:1;27746:610:0;;;;;;;;;;-1:-1:-1;27746:610:0;;;;;:::i;:::-;;:::i;19287:1308::-;;;;;;:::i;:::-;;:::i;31130:993::-;;;;;;:::i;:::-;;:::i;18339:940::-;;;;;;;;;;-1:-1:-1;18339:940:0;;;;;:::i;:::-;;:::i;24517:868::-;;;;;;;;;;-1:-1:-1;24517:868:0;;;;;:::i;:::-;;:::i;16904:31::-;;;;;;;;;;-1:-1:-1;16904:31:0;;;;-1:-1:-1;;;;;16904:31:0;;;28364:861;;;;;;:::i;:::-;;:::i;32627:232::-;;;;;;;;;;-1:-1:-1;32627:232:0;;;;;:::i;:::-;;:::i;30152:970::-;;;;;;;;;;-1:-1:-1;30152:970:0;;;;;:::i;:::-;;:::i;17434:897::-;;;;;;;;;;-1:-1:-1;17434:897:0;;;;;:::i;:::-;;:::i;29233:911::-;;;;;;;;;;-1:-1:-1;29233:911:0;;;;;:::i;:::-;;:::i;32131:240::-;32274:17;32311:52;32331:8;32341:9;32352:10;32311:19;:52::i;:::-;32304:59;32131:240;-1:-1:-1;;;;32131:240:0:o;32867:232::-;33066:7;;32997:24;;33046:45;;-1:-1:-1;;;;;33066:7:0;33075:9;33086:4;33046:19;:45::i;:::-;33039:52;;32867:232;;;;;:::o;27069:669::-;27292:24;27273:8;17201:15;17189:8;:27;;17181:55;;;;-1:-1:-1;;;17181:55:0;;;;;;;:::i;:::-;;;;;;;;;27360:7:::1;::::0;27339:45:::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;::::1;::::0;-1:-1:-1;;;;;27360:7:0::1;::::0;27369:8;;27339:45;27379:4;;;;;;27339:45;;::::1;::::0;27379:4;;27339:45;27379:4;27339:45;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;27339:20:0::1;::::0;-1:-1:-1;;;27339:45:0:i:1;:::-;27329:55;;27448:12;27417:7;27442:1;27425:7;:14;:18;;;;:::i;:::-;27417:27;;;;;;;;:::i;:::-;;;;;;;:43;;27395:127;;;;-1:-1:-1::0;;;27395:127:0::1;;;;;;;:::i;:::-;27533:162;27571:4;;27576:1;27571:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;27633;::::0;;27593:10:::1;::::0;27618:41:::1;::::0;-1:-1:-1;;;;;27633:7:0::1;::::0;27642:4;;;;:7;::::1;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;27651:4;;27656:1;27651:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;27618:14;:41::i;:::-;27674:7;27682:1;27674:10;;;;;;;;:::i;:::-;;;;;;;27533:23;:162::i;:::-;27706:24;27712:7;27721:4;;27706:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;27727:2:0;;-1:-1:-1;27706:5:0::1;::::0;-1:-1:-1;;27706:24:0:i:1;:::-;27069:669:::0;;;;;;;;;:::o;25393:829::-;25692:19;25713:28;25664:8;17201:15;17189:8;:27;;17181:55;;;;-1:-1:-1;;;17181:55:0;;;;;;;:::i;:::-;25847:15:::1;::::0;25797:218:::1;::::0;25827:5;;-1:-1:-1;;;;;25847:15:0::1;25877:9:::0;25901:14;25930:23;25976:4:::1;25996:8:::0;25797:15:::1;:218::i;:::-;25759:256:::0;;-1:-1:-1;25759:256:0;-1:-1:-1;26026:43:0::1;26046:5:::0;26053:2;25759:256;26026:19:::1;:43::i;:::-;26097:15;::::0;26080:64:::1;::::0;-1:-1:-1;;;26080:64:0;;::::1;::::0;::::1;19704:25:1::0;;;-1:-1:-1;;;;;26097:15:0;;::::1;::::0;26080:42:::1;::::0;19677:18:1;;26080:64:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;26155:59;26189:2;26193:20;26155:33;:59::i;:::-;25393:829:::0;;;;;;;;;;:::o;20603:2284::-;20960:19;20994:28;21037:17;20918:8;17201:15;17189:8;:27;;17181:55;;;;-1:-1:-1;;;17181:55:0;;;;;;;:::i;:::-;21118:15:::1;::::0;21107:7;;-1:-1:-1;;;;;21118:15:0;;::::1;::::0;21107:4;;21118:15:::1;::::0;21107:7:::1;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;21107:26:0::1;;21099:59;;;;-1:-1:-1::0;;;21099:59:0::1;;;;;;;:::i;:::-;21169:24;21230:7:::0;;21196:99:::1;::::0;-1:-1:-1;;;;;21230:7:0::1;21252:13:::0;21280:4;21196:19:::1;:99::i;:::-;21169:126;;21330:9;21316:7;21324:1;21316:10;;;;;;;;:::i;:::-;;;;;;;:23;;21308:66;;;;-1:-1:-1::0;;;21308:66:0::1;;;;;;;:::i;:::-;21402:15;::::0;21434:10;;-1:-1:-1;;;;;21402:15:0;;::::1;::::0;21385:41:::1;::::0;21434:7;;21402:15:::1;::::0;21434:10:::1;;;;:::i;:::-;;;;;;;21385:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;21489:15;;;;;;;;;-1:-1:-1::0;;;;;21489:15:0::1;-1:-1:-1::0;;;;;21482:32:0::1;;21533:41;21548:7;::::0;::::1;;;;;;-1:-1:-1::0;;;;;21548:7:0::1;21557:4;21562:1;21557:7;;;;;;;;:::i;:::-;;;;;;;21566:4;21571:1;21566:7;;;;;;;;:::i;:::-;;;;;;;21533:14;:41::i;:::-;21593:7;21601:1;21593:10;;;;;;;;:::i;:::-;;;;;;;21482:136;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;10969:32:1;;;;10951:51;;11033:2;11018:18;;11011:34;10939:2;10924:18;;10777:274;21482:136:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21460:169;;;::::0;::::1;;21642:24;21648:7;21657:4;21663:2;21642:5;:24::i;:::-;21715:23;21701:7;21709:1;21701:10;;;;;;;;:::i;:::-;;;;;;;:37;;21679:132;;;::::0;-1:-1:-1;;;21679:132:0;;16362:2:1;21679:132:0::1;::::0;::::1;16344:21:1::0;16401:2;16381:18;;;16374:30;16440:34;16420:18;;;16413:62;-1:-1:-1;;;16491:18:1;;;16484:43;16544:19;;21679:132:0::1;16160:409:1::0;21679:132:0::1;21849:13;21865:4;21884:1;21870:4;:11;:15;;;;:::i;:::-;21865:21;;;;;;;;:::i;:::-;;;;;;;21849:37;;21897:29;21941:7;21949:1;21941:10;;;;;;;;:::i;:::-;;;;;;;21929:9;:22;;;;:::i;:::-;21897:54;;22000:233;22028:5;22048:15;;;;;;;;;-1:-1:-1::0;;;;;22048:15:0::1;22078:7;22103:1;22086:7;:14;:18;;;;:::i;:::-;22078:27;;;;;;;;:::i;:::-;;;;;;;22120:21;22156:7;22181:1;22164:7;:14;:18;;;;:::i;:::-;22156:27;;;;;;;;:::i;:::-;;;;;;;22198:24;22000:13;:233::i;:::-;22246:12;22276:7:::0;;;22292:15;21962:271;;-1:-1:-1;21962:271:0;;-1:-1:-1;22246:12:0;22261:47:::1;::::0;-1:-1:-1;;;;;22276:7:0;;::::1;::::0;22285:5;;22292:15:::1;22261:14;:47::i;:::-;22246:62;;22321:61;22345:5;22352:10;22364:4;22370:11;22321:23;:61::i;:::-;22412:15;;;;;;;;;-1:-1:-1::0;;;;;22412:15:0::1;-1:-1:-1::0;;;;;22395:41:0::1;;22458:20;22395:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;22519:15:0::1;::::0;22512:60:::1;::::0;-1:-1:-1;;;22512:60:0;;-1:-1:-1;;;;;10969:32:1;;;22512:60:0::1;::::0;::::1;10951:51:1::0;11018:18;;;11011:34;;;22519:15:0;;::::1;::::0;-1:-1:-1;22512:32:0::1;::::0;-1:-1:-1;10924:18:1;;;-1:-1:-1;22512:60:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22504:69;;;::::0;::::1;;22598:20;::::0;-1:-1:-1;;;22598:20:0;;-1:-1:-1;;;;;10044:32:1;;;22598:20:0::1;::::0;::::1;10026:51:1::0;22598:16:0;::::1;::::0;::::1;::::0;9999:18:1;;22598:20:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22586:32;;22671:7;22679:1;22671:10;;;;;;;;:::i;:::-;;;;;;;22648:20;:33;;;;:::i;:::-;22635:9;:47;22631:209;;;22697:143;22749:10;22814:7;22822:1;22814:10;;;;;;;;:::i;:::-;;;;;;;22791:20;:33;;;;:::i;:::-;22778:47;::::0;:9:::1;:47;:::i;:::-;22697:33;:143::i;:::-;21071:1816;;;;20603:2284:::0;;;;;;;;;;;:::o;27746:610::-;27969:24;27950:8;17201:15;17189:8;:27;;17181:55;;;;-1:-1:-1;;;17181:55:0;;;;;;;:::i;:::-;28036:7:::1;::::0;28016:45:::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;::::1;::::0;-1:-1:-1;;;;;28036:7:0::1;::::0;28045:9;;28016:45;28056:4;;;;;;28016:45;;::::1;::::0;28056:4;;28016:45;28056:4;28016:45;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;28016:19:0::1;::::0;-1:-1:-1;;;28016:45:0:i:1;:::-;28006:55;;28094:11;28080:7;28088:1;28080:10;;;;;;;;:::i;:::-;;;;;;;:25;;28072:68;;;;-1:-1:-1::0;;;28072:68:0::1;;;;;;;:::i;19287:1308::-:0;19625:19;19659:28;19702:17;19583:8;17201:15;17189:8;:27;;17181:55;;;;-1:-1:-1;;;17181:55:0;;;;;;;:::i;:::-;19833:15:::1;::::0;19785:198:::1;::::0;19813:5;;-1:-1:-1;;;;;19833:15:0::1;19863:18:::0;19896:9:::1;19920:14:::0;19949:23;19785:13:::1;:198::i;:::-;19994:12;20024:7:::0;;;20040:15;19747:236;;-1:-1:-1;19747:236:0;;-1:-1:-1;19994:12:0;20009:47:::1;::::0;-1:-1:-1;;;;;20024:7:0;;::::1;::::0;20033:5;;20040:15:::1;20009:14;:47::i;:::-;19994:62;;20067:61;20091:5;20098:10;20110:4;20116:11;20067:23;:61::i;:::-;20156:15;;;;;;;;;-1:-1:-1::0;;;;;20156:15:0::1;-1:-1:-1::0;;;;;20139:41:0::1;;20202:20;20139:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;20261:15:0::1;::::0;20254:60:::1;::::0;-1:-1:-1;;;20254:60:0;;-1:-1:-1;;;;;10969:32:1;;;20254:60:0::1;::::0;::::1;10951:51:1::0;11018:18;;;11011:34;;;20261:15:0;;::::1;::::0;-1:-1:-1;20254:32:0::1;::::0;-1:-1:-1;10924:18:1;;;-1:-1:-1;20254:60:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20246:69;;;::::0;::::1;;20338:20;::::0;-1:-1:-1;;;20338:20:0;;-1:-1:-1;;;;;10044:32:1;;;20338:20:0::1;::::0;::::1;10026:51:1::0;20338:16:0;::::1;::::0;::::1;::::0;9999:18:1;;20338:20:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20326:32;;20385:20;20373:9;:32;20369:179;;;20420:128;20472:10;20501:32;20513:20:::0;20501:9:::1;:32;:::i;20420:128::-;19736:859;19287:1308:::0;;;;;;;;;;;:::o;31130:993::-;31386:24;31358:8;17201:15;17189:8;:27;;17181:55;;;;-1:-1:-1;;;17181:55:0;;;;;;;:::i;:::-;31447:15:::1;::::0;-1:-1:-1;;;;;31447:15:0::1;31436:4:::0;;31447:15:::1;31436:7:::0;::::1;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;31436:26:0::1;;31428:59;;;;-1:-1:-1::0;;;31428:59:0::1;;;;;;;:::i;:::-;31528:7;::::0;31508:45:::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;::::1;::::0;-1:-1:-1;;;;;31528:7:0::1;::::0;31537:9;;31508:45;31548:4;;;;;;31508:45;;::::1;::::0;31548:4;;31508:45;31548:4;31508:45;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;31508:19:0::1;::::0;-1:-1:-1;;;31508:45:0:i:1;:::-;31498:55;;31586:9;31572:7;31580:1;31572:10;;;;;;;;:::i;:::-;;;;;;;:23;;31564:66;;;;-1:-1:-1::0;;;31564:66:0::1;;;;;;;:::i;:::-;31658:15;::::0;31690:10;;-1:-1:-1;;;;;31658:15:0;;::::1;::::0;31641:41:::1;::::0;31690:7;;31658:15:::1;::::0;31690:10:::1;;;;:::i;:::-;;;;;;;31641:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;31743:15:0::1;::::0;::::1;31802:7:::0;;-1:-1:-1;;;;;31743:15:0;;::::1;::::0;-1:-1:-1;31736:32:0::1;::::0;-1:-1:-1;31787:41:0::1;::::0;-1:-1:-1;31802:7:0;;::::1;::::0;31811:4;;;;:7;::::1;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;31820:4;;31825:1;31820:7;;;;;;;:::i;31787:41::-;31847:7;31855:1;31847:10;;;;;;;;:::i;:::-;;;;;;;31736:136;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;10969:32:1;;;;10951:51;;11033:2;11018:18;;11011:34;10939:2;10924:18;;10777:274;31736:136:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31714:169;;;::::0;::::1;;31894:24;31900:7;31909:4;;31894:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;31915:2:0;;-1:-1:-1;31894:5:0::1;::::0;-1:-1:-1;;31894:24:0:i:1;:::-;31945:7;31953:1;31945:10;;;;;;;;:::i;:::-;;;;;;;31933:9;:22;31929:159;;;31970:118;32022:10;32063:7;32071:1;32063:10;;;;;;;;:::i;:::-;;;;;;;32051:9;:22;;;;:::i;31970:118::-;31130:993:::0;;;;;;;;:::o;18339:940::-;18635:17;18616:8;17201:15;17189:8;:27;;17181:55;;;;-1:-1:-1;;;17181:55:0;;;;;;;:::i;:::-;18665:14:::1;18682:4;;18687:1;18682:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;18665:24:::0;-1:-1:-1;18700:14:0::1;18717:4:::0;;18722:15:::1;18736:1;18717:4:::0;18722:15:::1;:::i;:::-;18717:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;18700:38;;18751:24;18778:152;18817:13;18845:15;18875:4;;18894:2;18911:8;18778:24;:152::i;:::-;18751:179;;18943:23;18980:7;18988:1;18980:10;;;;;;;;:::i;:::-;;;;;;;18969:8;:21;;;;:::i;:::-;18943:47;;19019:252;19046:6;19067;19088:7;19113:1;19096:7;:14;:18;;;;:::i;:::-;19088:27;;;;;;;;:::i;:::-;;;;;;;19130:15;19160:7;19185:1;19168:7;:14;:18;;;;:::i;:::-;19160:27;;;;;;;;:::i;:::-;;;;;;;19202:18;19235:2;19252:8;19019:12;:252::i;:::-;19001:270;;;;;;;;;18654:625;;;;18339:940:::0;;;;;;;;;;;:::o;24517:868::-;24811:15;24828;24783:8;17201:15;17189:8;:27;;17181:55;;;;-1:-1:-1;;;17181:55:0;;;;;;;:::i;:::-;24861:12:::1;24891:7:::0;;24876:39:::1;::::0;-1:-1:-1;;;;;24891:7:0::1;24900:6:::0;24908;24876:14:::1;:39::i;:::-;24926:54;::::0;-1:-1:-1;;;24926:54:0;;24952:10:::1;24926:54;::::0;::::1;10637:34:1::0;-1:-1:-1;;;;;24926:25:0;::::1;10687:18:1::0;;;10680:43;;;10739:18;;;10732:34;;;24861:54:0;;-1:-1:-1;24926:25:0::1;::::0;10572:18:1;;24926:54:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;25028:20:0::1;::::0;-1:-1:-1;;;25028:20:0;;-1:-1:-1;;;;;10044:32:1;;;25028:20:0::1;::::0;::::1;10026:51:1::0;24992:15:0::1;::::0;;;25028:16;::::1;::::0;::::1;::::0;9999:18:1;;25028:20:0::1;::::0;::::1;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24991:57;;;;25060:14;25080:33;25098:6;25106;25080:17;:33::i;:::-;25059:54;;;25155:6;-1:-1:-1::0;;;;;25145:16:0::1;:6;-1:-1:-1::0;;;;;25145:16:0::1;;:84;;25212:7;25221;25145:84;;;25178:7;25187;25145:84;25124:105:::0;;-1:-1:-1;25124:105:0;-1:-1:-1;25248:21:0;;::::1;;25240:63;;;::::0;-1:-1:-1;;;25240:63:0;;16776:2:1;25240:63:0::1;::::0;::::1;16758:21:1::0;16815:2;16795:18;;;16788:30;16854:31;16834:18;;;16827:59;16903:18;;25240:63:0::1;16574:353:1::0;25240:63:0::1;25333:10;25322:7;:21;;25314:63;;;::::0;-1:-1:-1;;;25314:63:0;;14069:2:1;25314:63:0::1;::::0;::::1;14051:21:1::0;14108:2;14088:18;;;14081:30;14147:31;14127:18;;;14120:59;14196:18;;25314:63:0::1;13867:353:1::0;25314:63:0::1;24850:535;;;;24517:868:::0;;;;;;;;;;;:::o;28364:861::-;28623:24;28595:8;17201:15;17189:8;:27;;17181:55;;;;-1:-1:-1;;;17181:55:0;;;;;;;:::i;:::-;28684:15:::1;::::0;-1:-1:-1;;;;;28684:15:0::1;28673:4:::0;;28684:15:::1;28673:7:::0;::::1;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;28673:26:0::1;;28665:59;;;;-1:-1:-1::0;;;28665:59:0::1;;;;;;;:::i;:::-;28766:7;::::0;28745:46:::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;::::1;::::0;-1:-1:-1;;;;;28766:7:0::1;::::0;28775:9:::1;::::0;28745:46;28786:4;;;;;;28745:46;;::::1;::::0;28786:4;;28745:46;28786:4;28745:46;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;28745:20:0::1;::::0;-1:-1:-1;;;28745:46:0:i:1;:::-;28735:56;;28855:12;28824:7;28849:1;28832:7;:14;:18;;;;:::i;:::-;28824:27;;;;;;;;:::i;:::-;;;;;;;:43;;28802:127;;;;-1:-1:-1::0;;;28802:127:0::1;;;;;;;:::i;:::-;28957:15;::::0;28989:10;;-1:-1:-1;;;;;28957:15:0;;::::1;::::0;28940:41:::1;::::0;28989:7;;28957:15:::1;::::0;28989:10:::1;;;;:::i;:::-;;;;;;;28940:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;29042:15:0::1;::::0;::::1;29101:7:::0;;-1:-1:-1;;;;;29042:15:0;;::::1;::::0;-1:-1:-1;29035:32:0::1;::::0;-1:-1:-1;29086:41:0::1;::::0;-1:-1:-1;29101:7:0;;::::1;::::0;29110:4;;;;:7;::::1;;;;:::i;29086:41::-;29146:7;29154:1;29146:10;;;;;;;;:::i;:::-;;;;;;;29035:136;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;10969:32:1;;;;10951:51;;11033:2;11018:18;;11011:34;10939:2;10924:18;;10777:274;29035:136:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29013:169;;;::::0;::::1;;29193:24;29199:7;29208:4;;29193:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;29214:2:0;;-1:-1:-1;29193:5:0::1;::::0;-1:-1:-1;;29193:24:0:i:1;32627:232::-:0;32827:7;;32757:24;;32806:45;;-1:-1:-1;;;;;32827:7:0;32836:8;32846:4;32806:20;:45::i;30152:970::-;30385:24;30366:8;17201:15;17189:8;:27;;17181:55;;;;-1:-1:-1;;;17181:55:0;;;;;;;:::i;:::-;30469:15:::1;::::0;;-1:-1:-1;;;;;30469:15:0::1;::::0;30444:4;;;;30449:15:::1;::::0;30444:4;30449:15:::1;:::i;:::-;30444:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;30444:40:0::1;;30422:110;;;;-1:-1:-1::0;;;30422:110:0::1;;;;;;;:::i;:::-;30574:7;::::0;30553:45:::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;::::1;::::0;-1:-1:-1;;;;;30574:7:0::1;::::0;30583:8;;30553:45;30593:4;;;;;;30553:45;;::::1;::::0;30593:4;;30553:45;30593:4;30553:45;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;30553:20:0::1;::::0;-1:-1:-1;;;30553:45:0:i:1;:::-;30543:55;;30662:12;30631:7;30656:1;30639:7;:14;:18;;;;:::i;:::-;30631:27;;;;;;;;:::i;:::-;;;;;;;:43;;30609:127;;;;-1:-1:-1::0;;;30609:127:0::1;;;;;;;:::i;:::-;30747:162;30785:4;;30790:1;30785:7;;;;;;;:::i;30747:162::-;30920:35;30926:7;30935:4;;30920:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;30949:4:0::1;::::0;-1:-1:-1;30920:5:0::1;::::0;-1:-1:-1;;30920:35:0:i:1;:::-;30983:15;::::0;;31017:14;;-1:-1:-1;;;;;30983:15:0;;::::1;::::0;30966:42:::1;::::0;31009:7;;31017:18:::1;::::0;::::1;:::i;:::-;31009:27;;;;;;;;:::i;:::-;;;;;;;30966:71;;;;;;;;;;;;;19704:25:1::0;;19692:2;19677:18;;19558:177;30966:71:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;31048:66;31082:2;31086:7;31111:1;31094:7;:14;:18;;;;:::i;:::-;31086:27;;;;;;;;:::i;:::-;;;;;;;31048:33;:66::i;17434:897::-:0;17777:15;17807;17837:17;17735:8;17201:15;17189:8;:27;;17181:55;;;;-1:-1:-1;;;17181:55:0;;;;;;;:::i;:::-;17903:174:::1;17931:6;17952;17973:14;18002;18031:10;18056;17903:13;:174::i;:::-;18088:12;18118:7:::0;;17882:195;;-1:-1:-1;17882:195:0;;-1:-1:-1;18088:12:0;18103:39:::1;::::0;-1:-1:-1;;;;;18118:7:0::1;18127:6:::0;18135;18103:14:::1;:39::i;:::-;18088:54;;18153:58;18177:6;18185:10;18197:4;18203:7;18153:23;:58::i;:::-;18222;18246:6;18254:10;18266:4;18272:7;18222:23;:58::i;:::-;18303:20;::::0;-1:-1:-1;;;18303:20:0;;-1:-1:-1;;;;;10044:32:1;;;18303:20:0::1;::::0;::::1;10026:51:1::0;18303:16:0;::::1;::::0;::::1;::::0;9999:18:1;;18303:20:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18291:32;;17871:460;17434:897:::0;;;;;;;;;;;;;:::o;29233:911::-;29466:24;29447:8;17201:15;17189:8;:27;;17181:55;;;;-1:-1:-1;;;17181:55:0;;;;;;;:::i;:::-;29550:15:::1;::::0;;-1:-1:-1;;;;;29550:15:0::1;::::0;29525:4;;;;29530:15:::1;::::0;29525:4;29530:15:::1;:::i;:::-;29525:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;29525:40:0::1;;29503:110;;;;-1:-1:-1::0;;;29503:110:0::1;;;;;;;:::i;:::-;29654:7;::::0;29634:45:::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;::::1;::::0;-1:-1:-1;;;;;29654:7:0::1;::::0;29663:9;;29634:45;29674:4;;;;;;29634:45;;::::1;::::0;29674:4;;29634:45;29674:4;29634:45;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;29634:19:0::1;::::0;-1:-1:-1;;;29634:45:0:i:1;:::-;29624:55;;29712:11;29698:7;29706:1;29698:10;;;;;;;;:::i;:::-;;;;;;;:25;;29690:68;;;;-1:-1:-1::0;;;29690:68:0::1;;;;;;;:::i;6694:589::-:0;6830:17;6879:1;6868:8;:12;6860:58;;;;-1:-1:-1;;;6860:58:0;;19358:2:1;6860:58:0;;;19340:21:1;19397:2;19377:18;;;19370:30;19436:34;19416:18;;;19409:62;-1:-1:-1;;;19487:18:1;;;19480:31;19528:19;;6860:58:0;19156:397:1;6860:58:0;6963:1;6951:9;:13;:31;;;;;6981:1;6968:10;:14;6951:31;6929:111;;;;-1:-1:-1;;;6929:111:0;;17951:2:1;6929:111:0;;;17933:21:1;17990:2;17970:18;;;17963:30;18029:32;18009:18;;;18002:60;18079:18;;6929:111:0;17749:354:1;6929:111:0;7051:23;7077:17;:8;7090:3;7077:12;:17::i;:::-;7051:43;-1:-1:-1;7105:17:0;7125:31;7051:43;7145:10;7125:19;:31::i;:::-;7105:51;-1:-1:-1;7167:19:0;7189:40;7213:15;7189:19;:9;7203:4;7189:13;:19::i;:::-;:23;;:40::i;:::-;7167:62;-1:-1:-1;7252:23:0;7167:62;7252:9;:23;:::i;:::-;7240:35;6694:589;-1:-1:-1;;;;;;;6694:589:0:o;8654:640::-;8792:24;8852:1;8837:4;:11;:16;;8829:49;;;;-1:-1:-1;;;8829:49:0;;18310:2:1;8829:49:0;;;18292:21:1;18349:2;18329:18;;;18322:30;-1:-1:-1;;;18368:18:1;;;18361:50;18428:18;;8829:49:0;18108:344:1;8829:49:0;8913:4;:11;8899:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8899:26:0;;8889:36;;8966:9;8936:7;8961:1;8944:7;:14;:18;;;;:::i;:::-;8936:27;;;;;;;;:::i;:::-;;;;;;:39;;;;;8991:9;9017:1;9003:4;:11;:15;;;;:::i;:::-;8991:27;;8986:301;9020:5;;8986:301;;9048:17;;9089:108;9119:7;9145:4;9150:5;9154:1;9150;:5;:::i;:::-;9145:11;;;;;;;;:::i;:::-;;;;;;;9175:4;9180:1;9175:7;;;;;;;;:::i;:::-;;;;;;;9089:11;:108::i;:::-;9047:150;;;;9229:46;9241:7;9249:1;9241:10;;;;;;;;:::i;:::-;;;;;;;9253:9;9264:10;9229:11;:46::i;:::-;9212:7;9220:5;9224:1;9220;:5;:::i;:::-;9212:14;;;;;;;;:::i;:::-;;;;;;:63;;;;;9032:255;;9027:3;;;;;:::i;:::-;;;;8986:301;;;;8654:640;;;;;:::o;8027:619::-;8165:24;8225:1;8210:4;:11;:16;;8202:49;;;;-1:-1:-1;;;8202:49:0;;18310:2:1;8202:49:0;;;18292:21:1;18349:2;18329:18;;;18322:30;-1:-1:-1;;;18368:18:1;;;18361:50;18428:18;;8202:49:0;18108:344:1;8202:49:0;8286:4;:11;8272:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8272:26:0;;8262:36;;8322:8;8309:7;8317:1;8309:10;;;;;;;;:::i;:::-;;;;;;:21;;;;;8346:9;8341:298;8375:1;8361:4;:11;:15;;;;:::i;:::-;8357:1;:19;8341:298;;;8399:17;8418:18;8440:108;8470:7;8496:4;8501:1;8496:7;;;;;;;;:::i;:::-;;;;;;;8522:4;8527:1;8531;8527:5;;;;:::i;:::-;8522:11;;;;;;;;:::i;8440:108::-;8398:150;;;;8580:47;8593:7;8601:1;8593:10;;;;;;;;:::i;:::-;;;;;;;8605:9;8616:10;8580:12;:47::i;:::-;8563:7;8571:5;:1;8575;8571:5;:::i;:::-;8563:14;;;;;;;;:::i;:::-;;;;;;:64;;;;;8383:256;;8378:3;;;;;:::i;:::-;;;;8341:298;;4237:204;4392:41;;-1:-1:-1;;;4392:41:0;;-1:-1:-1;;;;;10318:15:1;;;4392:41:0;;;10300:34:1;10370:15;;;10350:18;;;10343:43;4360:12:0;;4392:25;;;;;;10235:18:1;;4392:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;5274:522::-;5559:51;;;-1:-1:-1;;;;;10655:15:1;;;5559:51:0;;;10637:34:1;10707:15;;;10687:18;;;10680:43;10739:18;;;;10732:34;;;5559:51:0;;;;;;;;;;10572:18:1;;;;5559:51:0;;;;;;;-1:-1:-1;;;;;5559:51:0;-1:-1:-1;;;5559:51:0;;;5534:87;;-1:-1:-1;;;;5534:10:0;;;;:87;;5559:51;5534:87;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5498:123;;;;5654:7;:57;;;;-1:-1:-1;5666:11:0;;:16;;:44;;;5697:4;5686:24;;;;;;;;;;;;:::i;:::-;5632:156;;;;-1:-1:-1;;;5632:156:0;;13651:2:1;5632:156:0;;;13633:21:1;13690:2;13670:18;;;13663:30;13729:34;13709:18;;;13702:62;-1:-1:-1;;;13780:18:1;;;13773:47;13837:19;;5632:156:0;13449:413:1;5632:156:0;5408:388;;5274:522;;;;:::o;26230:831::-;26365:9;26360:694;26394:1;26380:4;:11;:15;;;;:::i;:::-;26376:1;:19;26360:694;;;26418:13;26433:14;26452:4;26457:1;26452:7;;;;;;;;:::i;:::-;;;;;;;26461:4;26466:1;26470;26466:5;;;;:::i;:::-;26461:11;;;;;;;;:::i;:::-;;;;;;;26417:56;;;;26489:14;26509:32;26527:5;26534:6;26509:17;:32::i;:::-;-1:-1:-1;26488:53:0;-1:-1:-1;26556:17:0;26576:7;26584:5;:1;26588;26584:5;:::i;:::-;26576:14;;;;;;;;:::i;:::-;;;;;;;26556:34;;26606:18;26626;26657:6;-1:-1:-1;;;;;26648:15:0;:5;-1:-1:-1;;;;;26648:15:0;;:101;;26727:9;26746:1;26648:101;;;26692:1;26696:9;26648:101;26605:144;;;;26764:10;26795:1;26781:4;:11;:15;;;;:::i;:::-;26777:1;:19;:106;;26880:3;26777:106;;;26831:7;;26816:44;;-1:-1:-1;;;;;26831:7:0;26840:6;26848:4;26853:5;:1;26857;26853:5;:::i;:::-;26848:11;;;;;;;;:::i;26816:44::-;26919:7;;26764:119;;-1:-1:-1;26904:38:0;;-1:-1:-1;;;;;26919:7:0;26928:5;26935:6;26904:14;:38::i;:::-;26898:144;;-1:-1:-1;;;26898:144:0;;;;;20195:25:1;;;20236:18;;;20229:34;;;-1:-1:-1;;;;;20299:32:1;;;20279:18;;;20272:60;26898:50:0;;;;;;;20168:18:1;;26898:144:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26402:652;;;;;;;26397:3;;;;;:::i;:::-;;;;26360:694;;;;26230:831;;;:::o;5804:473::-;6050:45;;;-1:-1:-1;;;;;10969:32:1;;;6050:45:0;;;10951:51:1;11018:18;;;;11011:34;;;6050:45:0;;;;;;;;;;10924:18:1;;;;6050:45:0;;;;;;;-1:-1:-1;;;;;6050:45:0;-1:-1:-1;;;6050:45:0;;;6025:81;;-1:-1:-1;;;;6025:10:0;;;;:81;;6050:45;6025:81;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5989:117;;;;6139:7;:57;;;;-1:-1:-1;6151:11:0;;:16;;:44;;;6182:4;6171:24;;;;;;;;;;;;:::i;:::-;6117:152;;;;-1:-1:-1;;;6117:152:0;;17537:2:1;6117:152:0;;;17519:21:1;17576:2;17556:18;;;17549:30;17615:34;17595:18;;;17588:62;-1:-1:-1;;;17666:18:1;;;17659:43;17719:19;;6117:152:0;17335:409:1;6117:152:0;5911:366;;5804:473;;;:::o;6285:287::-;6409:12;;;6369;6409;;;;;;;;;-1:-1:-1;;;;;6387:7:0;;;6402:5;;6387:35;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6368:54;;;6455:7;6433:131;;;;-1:-1:-1;;;6433:131:0;;14427:2:1;6433:131:0;;;14409:21:1;14466:2;14446:18;;;14439:30;14505:34;14485:18;;;14478:62;14576:34;14556:18;;;14549:62;-1:-1:-1;;;14627:19:1;;;14620:41;14678:19;;6433:131:0;14225:478:1;6433:131:0;6357:215;6285:287;;:::o;22895:1614::-;23116:15;23174:7;;23165:41;;-1:-1:-1;;;23165:41:0;;-1:-1:-1;;;;;10318:15:1;;;23165:41:0;;;10300:34:1;10370:15;;;10350:18;;;10343:43;23116:15:0;;;;23174:7;;;23165:25;;10235:18:1;;23165:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;23165:55:0;;23161:132;;;23246:7;;23237:44;;-1:-1:-1;;;23237:44:0;;-1:-1:-1;;;;;10318:15:1;;;23237:44:0;;;10300:34:1;10370:15;;;10350:18;;;10343:43;23246:7:0;;;;23237:28;;10235:18:1;;23237:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;23161:132;23304:16;23375:7;;23304:16;;23342:93;;-1:-1:-1;;;;;23375:7:0;23397:6;23418;23342:18;:93::i;:::-;23303:132;;;;23450:8;23462:1;23450:13;:30;;;;-1:-1:-1;23467:13:0;;23450:30;23446:1056;;;23519:14;;-1:-1:-1;23535:14:0;;-1:-1:-1;23446:1056:0;;;23583:22;23608:114;23639:14;23672:8;23699;23608:12;:114::i;:::-;23583:139;;23759:14;23741;:32;23737:754;;23842:10;23824:14;:28;;23794:131;;;;-1:-1:-1;;;23794:131:0;;14069:2:1;23794:131:0;;;14051:21:1;14108:2;14088:18;;;14081:30;14147:31;14127:18;;;14120:59;14196:18;;23794:131:0;13867:353:1;23794:131:0;23966:14;;-1:-1:-1;23982:14:0;-1:-1:-1;23982:14:0;23737:754;;;24038:22;24063:130;24098:14;24135:8;24166;24063:12;:130::i;:::-;24038:155;;24238:14;24220;:32;;24212:41;;;;;;24320:10;24302:14;:28;;24272:131;;;;-1:-1:-1;;;24272:131:0;;16776:2:1;24272:131:0;;;16758:21:1;16815:2;16795:18;;;16788:30;16854:31;16834:18;;;16827:59;16903:18;;24272:131:0;16574:353:1;24272:131:0;24444:14;-1:-1:-1;24460:14:0;;-1:-1:-1;23737:754:0;23568:934;23446:1056;23150:1359;;22895:1614;;;;;;;;;:::o;3842:387::-;3944:14;3960;4010:6;-1:-1:-1;;;;;4000:16:0;:6;-1:-1:-1;;;;;4000:16:0;;;3992:56;;;;-1:-1:-1;;;3992:56:0;;16006:2:1;3992:56:0;;;15988:21:1;16045:2;16025:18;;;16018:30;16084:29;16064:18;;;16057:57;16131:18;;3992:56:0;15804:351:1;3992:56:0;4087:6;-1:-1:-1;;;;;4078:15:0;:6;-1:-1:-1;;;;;4078:15:0;;:79;;4142:6;4150;4078:79;;;4110:6;4118;4078:79;4059:98;;-1:-1:-1;4059:98:0;-1:-1:-1;;;;;;4176:20:0;;4168:53;;;;-1:-1:-1;;;4168:53:0;;14910:2:1;4168:53:0;;;14892:21:1;14949:2;14929:18;;;14922:30;-1:-1:-1;;;14968:18:1;;;14961:50;15028:18;;4168:53:0;14708:344:1;4168:53:0;3842:387;;;;;:::o;3550:151::-;3608:9;3638:6;;;:30;;-1:-1:-1;3667:1:0;3662;3653:5;3662:1;3667;3653:5;:::i;:::-;3649:9;-1:-1:-1;3648:15:0;;3649:9;3648:15;:::i;:::-;:20;3638:30;3630:63;;;;-1:-1:-1;;;3630:63:0;;12594:2:1;3630:63:0;;;12576:21:1;12633:2;12613:18;;;12606:30;-1:-1:-1;;;12652:18:1;;;12645:50;12712:18;;3630:63:0;12392:344:1;3259:137:0;3317:9;3362:1;3352:5;3356:1;3362;3352:5;:::i;:::-;3348:9;;;3347:16;;3339:49;;;;-1:-1:-1;;;3339:49:0;;13302:2:1;3339:49:0;;;13284:21:1;13341:2;13321:18;;;13314:30;-1:-1:-1;;;13360:18:1;;;13353:50;13420:18;;3339:49:0;13100:344:1;4788:478:0;4915:16;4933;4963:14;4983:26;4994:6;5002;4983:10;:26::i;:::-;4962:47;;;5021:16;5039;5079:32;5087:7;5096:6;5104;5079:7;:32::i;:::-;-1:-1:-1;;;;;5059:75:0;;:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;5020:116:0;;;-1:-1:-1;;;;;5020:116:0;;;5180:6;-1:-1:-1;;;;;5170:16:0;:6;-1:-1:-1;;;;;5170:16:0;;:88;;5239:8;5249;5170:88;;;5203:8;5213;5170:88;5147:111;;;;-1:-1:-1;4788:478:0;-1:-1:-1;;;;;;;4788:478:0:o;7404:541::-;7540:16;7589:1;7577:9;:13;7569:60;;;;-1:-1:-1;;;7569:60:0;;15603:2:1;7569:60:0;;;15585:21:1;15642:2;15622:18;;;15615:30;15681:34;15661:18;;;15654:62;-1:-1:-1;;;15732:18:1;;;15725:32;15774:19;;7569:60:0;15401:398:1;7569:60:0;7674:1;7662:9;:13;:31;;;;;7692:1;7679:10;:14;7662:31;7640:111;;;;-1:-1:-1;;;7640:111:0;;17951:2:1;7640:111:0;;;17933:21:1;17990:2;17970:18;;;17963:30;18029:32;18009:18;;;18002:60;18079:18;;7640:111:0;17749:354:1;7640:111:0;7762:17;7782:34;7811:4;7782:24;:9;7796;7782:13;:24::i;:::-;:28;;:34::i;:::-;7762:54;-1:-1:-1;7827:19:0;7849:34;7879:3;7849:25;:10;7864:9;7849:14;:25::i;:34::-;7827:56;-1:-1:-1;7905:32:0;7935:1;7906:23;7827:56;7906:9;:23;:::i;7905:32::-;7894:43;7404:541;-1:-1:-1;;;;;;7404:541:0:o;4449:331::-;4574:15;4620:1;4610:7;:11;4602:43;;;;-1:-1:-1;;;4602:43:0;;18659:2:1;4602:43:0;;;18641:21:1;18698:2;18678:18;;;18671:30;-1:-1:-1;;;18717:18:1;;;18710:49;18776:18;;4602:43:0;18457:343:1;4602:43:0;4675:1;4664:8;:12;:28;;;;;4691:1;4680:8;:12;4664:28;4656:63;;;;-1:-1:-1;;;4656:63:0;;19007:2:1;4656:63:0;;;18989:21:1;19046:2;19026:18;;;19019:30;-1:-1:-1;;;19065:18:1;;;19058:52;19127:18;;4656:63:0;18805:346:1;4656:63:0;4764:8;4740:21;:7;4752:8;4740:11;:21::i;:::-;:32;;;;:::i;3404:138::-;3462:9;3507:1;3497:5;3501:1;3507;3497:5;:::i;:::-;3493:9;;;3492:16;;3484:50;;;;-1:-1:-1;;;3484:50:0;;11895:2:1;3484:50:0;;;11877:21:1;11934:2;11914:18;;;11907:30;-1:-1:-1;;;11953:18:1;;;11946:51;12014:18;;3484:50:0;11693:345:1;14:134;82:20;;111:31;82:20;111:31;:::i;:::-;14:134;;;:::o;153:367::-;216:8;226:6;280:3;273:4;265:6;261:17;257:27;247:55;;298:1;295;288:12;247:55;-1:-1:-1;321:20:1;;364:18;353:30;;350:50;;;396:1;393;386:12;350:50;433:4;425:6;421:17;409:29;;493:3;486:4;476:6;473:1;469:14;461:6;457:27;453:38;450:47;447:67;;;510:1;507;500:12;525:919;579:5;632:3;625:4;617:6;613:17;609:27;599:55;;650:1;647;640:12;599:55;686:6;673:20;712:4;735:18;772:2;768;765:10;762:36;;;778:18;;:::i;:::-;824:2;821:1;817:10;856:2;850:9;919:2;915:7;910:2;906;902:11;898:25;890:6;886:38;974:6;962:10;959:22;954:2;942:10;939:18;936:46;933:72;;;985:18;;:::i;:::-;1021:2;1014:22;1071:18;;;1105:15;;;;-1:-1:-1;1140:15:1;;;1174;;;1170:24;;1167:33;-1:-1:-1;1164:53:1;;;1213:1;1210;1203:12;1164:53;1235:1;1226:10;;1245:169;1259:2;1256:1;1253:9;1245:169;;;1316:23;1335:3;1316:23;:::i;:::-;1304:36;;1360:12;;;;1277:1;1270:9;;;;;1392:12;;1245:169;;;-1:-1:-1;1432:6:1;525:919;-1:-1:-1;;;;;;;525:919:1:o;1449:188::-;1528:13;;-1:-1:-1;;;;;1570:42:1;;1560:53;;1550:81;;1627:1;1624;1617:12;1642:247;1701:6;1754:2;1742:9;1733:7;1729:23;1725:32;1722:52;;;1770:1;1767;1760:12;1722:52;1809:9;1796:23;1828:31;1853:5;1828:31;:::i;:::-;1878:5;1642:247;-1:-1:-1;;;1642:247:1:o;1894:251::-;1964:6;2017:2;2005:9;1996:7;1992:23;1988:32;1985:52;;;2033:1;2030;2023:12;1985:52;2065:9;2059:16;2084:31;2109:5;2084:31;:::i;2150:805::-;2263:6;2271;2279;2287;2295;2303;2311;2364:3;2352:9;2343:7;2339:23;2335:33;2332:53;;;2381:1;2378;2371:12;2332:53;2420:9;2407:23;2439:31;2464:5;2439:31;:::i;:::-;2489:5;-1:-1:-1;2546:2:1;2531:18;;2518:32;2559:33;2518:32;2559:33;:::i;:::-;2611:7;-1:-1:-1;2665:2:1;2650:18;;2637:32;;-1:-1:-1;2716:2:1;2701:18;;2688:32;;-1:-1:-1;2767:3:1;2752:19;;2739:33;;-1:-1:-1;2824:3:1;2809:19;;2796:33;2838;2796;2838;:::i;:::-;2890:7;2880:17;;;2944:3;2933:9;2929:19;2916:33;2906:43;;2150:805;;;;;;;;;;:::o;2960:874::-;3082:6;3090;3098;3106;3114;3122;3130;3138;3191:3;3179:9;3170:7;3166:23;3162:33;3159:53;;;3208:1;3205;3198:12;3159:53;3247:9;3234:23;3266:31;3291:5;3266:31;:::i;:::-;3316:5;-1:-1:-1;3373:2:1;3358:18;;3345:32;3386:33;3345:32;3386:33;:::i;:::-;3438:7;-1:-1:-1;3492:2:1;3477:18;;3464:32;;-1:-1:-1;3543:2:1;3528:18;;3515:32;;-1:-1:-1;3594:3:1;3579:19;;3566:33;;-1:-1:-1;3646:3:1;3631:19;;3618:33;;-1:-1:-1;3703:3:1;3688:19;;3675:33;3717;3675;3717;:::i;:::-;3769:7;3759:17;;;3823:3;3812:9;3808:19;3795:33;3785:43;;2960:874;;;;;;;;;;;:::o;3839:663::-;3943:6;3951;3959;3967;3975;3983;4036:3;4024:9;4015:7;4011:23;4007:33;4004:53;;;4053:1;4050;4043:12;4004:53;4092:9;4079:23;4111:31;4136:5;4111:31;:::i;:::-;4161:5;-1:-1:-1;4213:2:1;4198:18;;4185:32;;-1:-1:-1;4264:2:1;4249:18;;4236:32;;-1:-1:-1;4315:2:1;4300:18;;4287:32;;-1:-1:-1;4371:3:1;4356:19;;4343:33;4385;4343;4385;:::i;:::-;4437:7;4427:17;;;4491:3;4480:9;4476:19;4463:33;4453:43;;3839:663;;;;;;;;:::o;4507:916::-;4647:6;4655;4663;4671;4679;4687;4695;4703;4756:3;4744:9;4735:7;4731:23;4727:33;4724:53;;;4773:1;4770;4763:12;4724:53;4813:9;4800:23;4846:18;4838:6;4835:30;4832:50;;;4878:1;4875;4868:12;4832:50;4917:70;4979:7;4970:6;4959:9;4955:22;4917:70;:::i;:::-;5006:8;;-1:-1:-1;4891:96:1;-1:-1:-1;;5088:2:1;5073:18;;5060:32;;-1:-1:-1;5139:2:1;5124:18;;5111:32;;-1:-1:-1;5190:2:1;5175:18;;5162:32;;-1:-1:-1;5241:3:1;5226:19;;5213:33;;-1:-1:-1;5296:3:1;5281:19;;5268:33;5310:31;5268:33;5310:31;:::i;:::-;5360:5;5350:15;;;5412:3;5401:9;5397:19;5384:33;5374:43;;4507:916;;;;;;;;;;;:::o;5428:758::-;5557:6;5565;5573;5581;5589;5597;5650:3;5638:9;5629:7;5625:23;5621:33;5618:53;;;5667:1;5664;5657:12;5618:53;5707:9;5694:23;5740:18;5732:6;5729:30;5726:50;;;5772:1;5769;5762:12;5726:50;5795:61;5848:7;5839:6;5828:9;5824:22;5795:61;:::i;:::-;5785:71;;;5903:2;5892:9;5888:18;5875:32;5865:42;;5954:2;5943:9;5939:18;5926:32;5916:42;;6005:2;5994:9;5990:18;5977:32;5967:42;;6059:3;6048:9;6044:19;6031:33;6073:31;6098:5;6073:31;:::i;6191:277::-;6258:6;6311:2;6299:9;6290:7;6286:23;6282:32;6279:52;;;6327:1;6324;6317:12;6279:52;6359:9;6353:16;6412:5;6405:13;6398:21;6391:5;6388:32;6378:60;;6434:1;6431;6424:12;6473:293;6552:6;6560;6613:2;6601:9;6592:7;6588:23;6584:32;6581:52;;;6629:1;6626;6619:12;6581:52;6652:40;6682:9;6652:40;:::i;:::-;6642:50;;6711:49;6756:2;6745:9;6741:18;6711:49;:::i;:::-;6701:59;;6473:293;;;;;:::o;6771:184::-;6841:6;6894:2;6882:9;6873:7;6869:23;6865:32;6862:52;;;6910:1;6907;6900:12;6862:52;-1:-1:-1;6933:16:1;;6771:184;-1:-1:-1;6771:184:1:o;6960:709::-;7073:6;7081;7089;7097;7105;7158:3;7146:9;7137:7;7133:23;7129:33;7126:53;;;7175:1;7172;7165:12;7126:53;7211:9;7198:23;7188:33;;7272:2;7261:9;7257:18;7244:32;7299:18;7291:6;7288:30;7285:50;;;7331:1;7328;7321:12;7285:50;7370:70;7432:7;7423:6;7412:9;7408:22;7370:70;:::i;:::-;7459:8;;-1:-1:-1;7344:96:1;-1:-1:-1;;7544:2:1;7529:18;;7516:32;7557:31;7516:32;7557:31;:::i;:::-;6960:709;;;;-1:-1:-1;6960:709:1;;7659:2;7644:18;7631:32;;6960:709;-1:-1:-1;;6960:709:1:o;7674:416::-;7767:6;7775;7828:2;7816:9;7807:7;7803:23;7799:32;7796:52;;;7844:1;7841;7834:12;7796:52;7880:9;7867:23;7857:33;;7941:2;7930:9;7926:18;7913:32;7968:18;7960:6;7957:30;7954:50;;;8000:1;7997;7990:12;7954:50;8023:61;8076:7;8067:6;8056:9;8052:22;8023:61;:::i;:::-;8013:71;;;7674:416;;;;;:::o;8095:245::-;8174:6;8182;8235:2;8223:9;8214:7;8210:23;8206:32;8203:52;;;8251:1;8248;8241:12;8203:52;-1:-1:-1;;8274:16:1;;8330:2;8315:18;;;8309:25;8274:16;;8309:25;;-1:-1:-1;8095:245:1:o;8345:778::-;8467:6;8475;8483;8491;8499;8507;8560:3;8548:9;8539:7;8535:23;8531:33;8528:53;;;8577:1;8574;8567:12;8528:53;8613:9;8600:23;8590:33;;8670:2;8659:9;8655:18;8642:32;8632:42;;8725:2;8714:9;8710:18;8697:32;8752:18;8744:6;8741:30;8738:50;;;8784:1;8781;8774:12;8738:50;8823:70;8885:7;8876:6;8865:9;8861:22;8823:70;:::i;:::-;8912:8;;-1:-1:-1;8797:96:1;-1:-1:-1;;8997:2:1;8982:18;;8969:32;9010:31;8969:32;9010:31;:::i;:::-;9060:5;9050:15;;;9112:3;9101:9;9097:19;9084:33;9074:43;;8345:778;;;;;;;;:::o;9128:316::-;9205:6;9213;9221;9274:2;9262:9;9253:7;9249:23;9245:32;9242:52;;;9290:1;9287;9280:12;9242:52;-1:-1:-1;;9313:23:1;;;9383:2;9368:18;;9355:32;;-1:-1:-1;9434:2:1;9419:18;;;9406:32;;9128:316;-1:-1:-1;9128:316:1:o;9449:426::-;9578:3;9616:6;9610:13;9641:1;9651:129;9665:6;9662:1;9659:13;9651:129;;;9763:4;9747:14;;;9743:25;;9737:32;9724:11;;;9717:53;9680:12;9651:129;;;9798:6;9795:1;9792:13;9789:48;;;9833:1;9824:6;9819:3;9815:16;9808:27;9789:48;-1:-1:-1;9853:16:1;;;;;9449:426;-1:-1:-1;;9449:426:1:o;11056:632::-;11227:2;11279:21;;;11349:13;;11252:18;;;11371:22;;;11198:4;;11227:2;11450:15;;;;11424:2;11409:18;;;11198:4;11493:169;11507:6;11504:1;11501:13;11493:169;;;11568:13;;11556:26;;11637:15;;;;11602:12;;;;11529:1;11522:9;11493:169;;;-1:-1:-1;11679:3:1;;11056:632;-1:-1:-1;;;;;;11056:632:1:o;12043:344::-;12245:2;12227:21;;;12284:2;12264:18;;;12257:30;-1:-1:-1;;;12318:2:1;12303:18;;12296:50;12378:2;12363:18;;12043:344::o;12741:354::-;12943:2;12925:21;;;12982:2;12962:18;;;12955:30;13021:32;13016:2;13001:18;;12994:60;13086:2;13071:18;;12741:354::o;15057:339::-;15259:2;15241:21;;;15298:2;15278:18;;;15271:30;-1:-1:-1;;;15332:2:1;15317:18;;15310:45;15387:2;15372:18;;15057:339::o;16932:398::-;17134:2;17116:21;;;17173:2;17153:18;;;17146:30;17212:34;17207:2;17192:18;;17185:62;-1:-1:-1;;;17278:2:1;17263:18;;17256:32;17320:3;17305:19;;16932:398::o;20667:128::-;20707:3;20738:1;20734:6;20731:1;20728:13;20725:39;;;20744:18;;:::i;:::-;-1:-1:-1;20780:9:1;;20667:128::o;20800:217::-;20840:1;20866;20856:132;;20910:10;20905:3;20901:20;20898:1;20891:31;20945:4;20942:1;20935:15;20973:4;20970:1;20963:15;20856:132;-1:-1:-1;21002:9:1;;20800:217::o;21022:168::-;21062:7;21128:1;21124;21120:6;21116:14;21113:1;21110:21;21105:1;21098:9;21091:17;21087:45;21084:71;;;21135:18;;:::i;:::-;-1:-1:-1;21175:9:1;;21022:168::o;21195:125::-;21235:4;21263:1;21260;21257:8;21254:34;;;21268:18;;:::i;:::-;-1:-1:-1;21305:9:1;;21195:125::o;21325:136::-;21364:3;21392:5;21382:39;;21401:18;;:::i;:::-;-1:-1:-1;;;21437:18:1;;21325:136::o;21466:135::-;21505:3;-1:-1:-1;;21526:17:1;;21523:43;;;21546:18;;:::i;:::-;-1:-1:-1;21593:1:1;21582:13;;21466:135::o;21606:127::-;21667:10;21662:3;21658:20;21655:1;21648:31;21698:4;21695:1;21688:15;21722:4;21719:1;21712:15;21738:127;21799:10;21794:3;21790:20;21787:1;21780:31;21830:4;21827:1;21820:15;21854:4;21851:1;21844:15;21870:127;21931:10;21926:3;21922:20;21919:1;21912:31;21962:4;21959:1;21952:15;21986:4;21983:1;21976:15;22002:131;-1:-1:-1;;;;;22077:31:1;;22067:42;;22057:70;;22123:1;22120;22113:12;22057:70;22002:131;:::o

Swarm Source

ipfs://8d0347b698ede02582681341f3d0731e07e8b75877604cdd90701fe46fb5519f
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.