ETH Price: $2,427.07 (+3.19%)

Contract

0xB0e83A8fC02351aAba4c9694D8d400bF0da3bD22

Overview

ETH Balance

0 ETH

ETH Value

$0.00
Transaction Hash
Method
Block
From
To
Swap Exact ETH F...92182882024-01-13 13:31:04244 days ago1705152664IN
0xB0e83A8f...F0da3bD22
0.0001 ETH0.000167533
Swap Exact Token...92163082024-01-13 11:41:15244 days ago1705146075IN
0xB0e83A8f...F0da3bD22
0 ETH0.000191292.09
Remove Liquidity90039002024-01-04 11:49:57253 days ago1704368997IN
0xB0e83A8f...F0da3bD22
0 ETH0.000478722.01
Remove Liquidity...86652362023-12-20 16:50:52268 days ago1703091052IN
0xB0e83A8f...F0da3bD22
0 ETH0.002131526.35
Add Liquidity ET...65454622023-10-23 12:50:20326 days ago1698065420IN
0xB0e83A8f...F0da3bD22
0.00268027 ETH0.000170250.787
Add Liquidity65424312023-10-23 11:24:40326 days ago1698060280IN
0xB0e83A8f...F0da3bD22
0 ETH0.000115570.496
Add Liquidity ET...64920832023-10-22 5:27:06327 days ago1697952426IN
0xB0e83A8f...F0da3bD22
0.00000533 ETH0.000077090.313
Add Liquidity ET...64571152023-10-21 6:42:36328 days ago1697870556IN
0xB0e83A8f...F0da3bD22
0.0000147 ETH0.000078330.309
Remove Liquidity64345792023-10-20 12:34:26329 days ago1697805266IN
0xB0e83A8f...F0da3bD22
0 ETH0.000178170.72
Remove Liquidity63738722023-10-18 11:37:06331 days ago1697629026IN
0xB0e83A8f...F0da3bD22
0 ETH0.000085030.399
Add Liquidity61746132023-10-11 14:04:19338 days ago1697033059IN
0xB0e83A8f...F0da3bD22
0 ETH0.000162990.646
Add Liquidity ET...59166602023-10-02 9:41:05347 days ago1696239665IN
0xB0e83A8f...F0da3bD22
0 ETH0.000106440.4
Add Liquidity ET...58707892023-09-30 17:12:59349 days ago1696093979IN
0xB0e83A8f...F0da3bD22
0.00005285 ETH0.000123290.533
Add Liquidity ET...58066612023-09-28 8:44:37351 days ago1695890677IN
0xB0e83A8f...F0da3bD22
0 ETH0.000143090.519
Add Liquidity ET...55488142023-09-19 8:15:56360 days ago1695111356IN
0xB0e83A8f...F0da3bD22
253 wei0.000169640.593
Add Liquidity ET...55251272023-09-18 8:11:34361 days ago1695024694IN
0xB0e83A8f...F0da3bD22
183 wei0.000090230.417
Add Liquidity ET...55249362023-09-18 8:03:12361 days ago1695024192IN
0xB0e83A8f...F0da3bD22
0.00003065 ETH0.000090620.419
Add Liquidity ET...55247452023-09-18 7:54:36361 days ago1695023676IN
0xB0e83A8f...F0da3bD22
180 wei0.000086550.4
Add Liquidity ET...55245872023-09-18 7:47:39361 days ago1695023259IN
0xB0e83A8f...F0da3bD22
264 wei0.000109560.383
Add Liquidity ET...54468672023-09-15 10:05:41364 days ago1694772341IN
0xB0e83A8f...F0da3bD22
0 ETH0.000152120.594
Add Liquidity ET...54417702023-09-15 7:28:32364 days ago1694762912IN
0xB0e83A8f...F0da3bD22
120 wei0.000119230.551
Add Liquidity ET...54416312023-09-15 7:22:55364 days ago1694762575IN
0xB0e83A8f...F0da3bD22
206 wei0.000118790.549
Add Liquidity ET...54416302023-09-15 7:22:45364 days ago1694762565IN
0xB0e83A8f...F0da3bD22
117 wei0.000157050.549
Add Liquidity ET...54408742023-09-15 6:52:56364 days ago1694760776IN
0xB0e83A8f...F0da3bD22
111 wei0.000103860.48
Add Liquidity ET...54405142023-09-15 6:36:11364 days ago1694759771IN
0xB0e83A8f...F0da3bD22
162 wei0.000188520.659
View all transactions

Latest 25 internal transactions (View All)

Parent Transaction Hash Block From To
86652362023-12-20 16:50:52268 days ago1703091052
0xB0e83A8f...F0da3bD22
0.0000098 ETH
86652362023-12-20 16:50:52268 days ago1703091052
0xB0e83A8f...F0da3bD22
0.0000098 ETH
65454622023-10-23 12:50:20326 days ago1698065420
0xB0e83A8f...F0da3bD22
0.00268027 ETH
64920832023-10-22 5:27:06327 days ago1697952426
0xB0e83A8f...F0da3bD22
0.00000533 ETH
64571152023-10-21 6:42:36328 days ago1697870556
0xB0e83A8f...F0da3bD22
0 ETH
64571152023-10-21 6:42:36328 days ago1697870556
0xB0e83A8f...F0da3bD22
0.00001469 ETH
59166602023-10-02 9:41:05347 days ago1696239665
0xB0e83A8f...F0da3bD22
0 ETH
58707892023-09-30 17:12:59349 days ago1696093979
0xB0e83A8f...F0da3bD22
0.00005285 ETH
58066612023-09-28 8:44:37351 days ago1695890677
0xB0e83A8f...F0da3bD22
0 ETH
55488142023-09-19 8:15:56360 days ago1695111356
0xB0e83A8f...F0da3bD22
253 wei
55249362023-09-18 8:03:12361 days ago1695024192
0xB0e83A8f...F0da3bD22
0.00003065 ETH
55247452023-09-18 7:54:36361 days ago1695023676
0xB0e83A8f...F0da3bD22
180 wei
55245872023-09-18 7:47:39361 days ago1695023259
0xB0e83A8f...F0da3bD22
264 wei
54468672023-09-15 10:05:41364 days ago1694772341
0xB0e83A8f...F0da3bD22
0 ETH
54417702023-09-15 7:28:32364 days ago1694762912
0xB0e83A8f...F0da3bD22
120 wei
54416312023-09-15 7:22:55364 days ago1694762575
0xB0e83A8f...F0da3bD22
206 wei
54416302023-09-15 7:22:45364 days ago1694762565
0xB0e83A8f...F0da3bD22
117 wei
54408742023-09-15 6:52:56364 days ago1694760776
0xB0e83A8f...F0da3bD22
111 wei
54405142023-09-15 6:36:11364 days ago1694759771
0xB0e83A8f...F0da3bD22
162 wei
54391462023-09-15 5:39:59364 days ago1694756399
0xB0e83A8f...F0da3bD22
123 wei
54137182023-09-14 7:17:02365 days ago1694675822
0xB0e83A8f...F0da3bD22
126 wei
54131912023-09-14 7:00:20365 days ago1694674820
0xB0e83A8f...F0da3bD22
152 wei
54123502023-09-14 6:31:42365 days ago1694673102
0xB0e83A8f...F0da3bD22
163 wei
54121972023-09-14 6:26:50365 days ago1694672810
0xB0e83A8f...F0da3bD22
115 wei
54120702023-09-14 6:23:07365 days ago1694672587
0xB0e83A8f...F0da3bD22
0.00000252 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
LeetSwapV2Router01

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU AGPLv3 license
File 1 of 9 : LeetSwapV2Router01.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity 0.8.17;

import "./interfaces/ILeetSwapV2Factory.sol";
import "./interfaces/ILeetSwapV2Pair.sol";
import "./interfaces/ILeetSwapV2Router01.sol";
import "@leetswap/interfaces/ILiquidityManageable.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";

contract LeetSwapV2Router01 is Ownable, ILeetSwapV2Router01 {
    struct Route {
        address from;
        address to;
        bool stable;
    }

    address public immutable factory;
    IWCANTO public immutable wcanto;

    uint256 internal constant MINIMUM_LIQUIDITY = 10**3;
    bytes32 immutable pairCodeHash;
    mapping(address => bool) public stablePairs;
    mapping(address => bool) public isLiquidityManageableWhitelisted;
    bool public deadlineEnabled;
    bool public liquidityManageableEnabled;
    bool public liquidityManageableWhitelistEnabled;

    error InvalidToken();
    error TransferFailed();
    error TradeExpired();
    error InsufficientOutputAmount();
    error InvalidPath();
    error InvalidAmount();
    error CantoTransferFailed();
    error IdenticalAddresses();
    error InsufficientAmount();
    error InsufficientAAmount();
    error InsufficientBAmount();
    error InsufficientLiquidity();
    error ZeroAddress();
    error DeadlineExpired();
    error ArrayLengthMismatch();
    error Unauthorized();

    modifier ensure(uint256 deadline) {
        if (deadlineEnabled && deadline < block.timestamp)
            revert DeadlineExpired();
        _;
    }

    constructor(address _factory, address _wcanto) {
        factory = _factory;
        pairCodeHash = ILeetSwapV2Factory(_factory).pairCodeHash();
        wcanto = IWCANTO(_wcanto);
        liquidityManageableEnabled = true;
        liquidityManageableWhitelistEnabled = true;
    }

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

    // **** LIQUIDITY MANAGEABLE PROTOCOL ****
    //
    // we use the following functions because we can't use modifiers due to the stack size limit
    // and the hefty amount of parameters and local variables of the Uniswap liquidity functions

    // it's safe to naively call the functions because if any of the token don't implement the interface
    // or if the router is not a liquidity manager, the call will silently fail with no harm
    function _startLiquidityManagement(address tokenA, address tokenB)
        internal
    {
        if (!liquidityManageableEnabled) return;

        if (
            !liquidityManageableWhitelistEnabled ||
            isLiquidityManageableWhitelisted[tokenA]
        ) {
            ILiquidityManageable lmTokenA = ILiquidityManageable(tokenA);
            try lmTokenA.isLiquidityManager(address(this)) returns (
                bool isLiquidityManager
            ) {
                if (isLiquidityManager)
                    lmTokenA.setLiquidityManagementPhase(true);
            } catch {}
        }

        if (
            !liquidityManageableWhitelistEnabled ||
            isLiquidityManageableWhitelisted[tokenB]
        ) {
            ILiquidityManageable lmTokenB = ILiquidityManageable(tokenB);
            try lmTokenB.isLiquidityManager(address(this)) returns (
                bool isLiquidityManager
            ) {
                if (isLiquidityManager)
                    lmTokenB.setLiquidityManagementPhase(true);
            } catch {}
        }
    }

    // if the previous 'startPhase' call failed because the router is not a LM, nothing will happen here,
    // still silently fail, whereas if it succeeded, the liquidity management phase will be set to false
    function _stopLiquidityManagement(address tokenA, address tokenB) internal {
        if (!liquidityManageableEnabled) return;

        if (
            !liquidityManageableWhitelistEnabled ||
            isLiquidityManageableWhitelisted[tokenA]
        ) {
            ILiquidityManageable lmTokenA = ILiquidityManageable(tokenA);
            try lmTokenA.isLiquidityManager(address(this)) returns (
                bool isLiquidityManager
            ) {
                if (isLiquidityManager)
                    lmTokenA.setLiquidityManagementPhase(false);
            } catch {}
        }

        if (
            !liquidityManageableWhitelistEnabled ||
            isLiquidityManageableWhitelisted[tokenB]
        ) {
            ILiquidityManageable lmTokenB = ILiquidityManageable(tokenB);
            try lmTokenB.isLiquidityManager(address(this)) returns (
                bool isLiquidityManager
            ) {
                if (isLiquidityManager)
                    lmTokenB.setLiquidityManagementPhase(false);
            } catch {}
        }
    }

    // UniswapV2 compatibility
    function WETH() external view returns (address) {
        return address(wcanto);
    }

    function sortTokens(address tokenA, address tokenB)
        public
        pure
        returns (address token0, address token1)
    {
        if (tokenA == tokenB) revert IdenticalAddresses();
        (token0, token1) = tokenA < tokenB
            ? (tokenA, tokenB)
            : (tokenB, tokenA);
        if (token0 == address(0)) revert ZeroAddress();
    }

    function _pairFor(
        address tokenA,
        address tokenB,
        bool stable
    ) internal view returns (address pair) {
        (address token0, address token1) = sortTokens(tokenA, tokenB);
        pair = address(
            uint160(
                uint256(
                    keccak256(
                        abi.encodePacked(
                            hex"ff",
                            factory,
                            keccak256(abi.encodePacked(token0, token1, stable)),
                            pairCodeHash // init code hash
                        )
                    )
                )
            )
        );
    }

    // calculates the CREATE2 address for a pair without making any external calls
    function pairFor(address tokenA, address tokenB)
        public
        view
        returns (address pair)
    {
        (address token0, address token1) = sortTokens(tokenA, tokenB);
        bool isStable = stablePairs[_pairFor(token0, token1, true)];
        pair = address(
            uint160(
                uint256(
                    keccak256(
                        abi.encodePacked(
                            hex"ff",
                            factory,
                            keccak256(
                                abi.encodePacked(token0, token1, isStable)
                            ),
                            pairCodeHash // init code hash
                        )
                    )
                )
            )
        );
    }

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

    // performs chained getAmountOut calculations on any number of pairs
    function getAmountOut(
        uint256 amountIn,
        address tokenIn,
        address tokenOut
    ) public view returns (uint256 amount) {
        address pair = pairFor(tokenIn, tokenOut);
        if (ILeetSwapV2Factory(factory).isPair(pair)) {
            amount = ILeetSwapV2Pair(pair).getAmountOut(amountIn, tokenIn);
        }
    }

    // performs chained getAmountOut calculations on any number of pairs
    function getAmountsOut(uint256 amountIn, Route[] memory routes)
        public
        view
        returns (uint256[] memory amounts)
    {
        if (routes.length < 1) revert InvalidPath();
        amounts = new uint256[](routes.length + 1);
        amounts[0] = amountIn;
        for (uint256 i = 0; i < routes.length; i++) {
            address pair = pairFor(routes[i].from, routes[i].to);
            if (ILeetSwapV2Factory(factory).isPair(pair)) {
                amounts[i + 1] = ILeetSwapV2Pair(pair).getAmountOut(
                    amounts[i],
                    routes[i].from
                );
            }
        }
    }

    // UniswapV2 compatibility
    function getAmountsOut(uint256 amountIn, address[] calldata path)
        public
        view
        returns (uint256[] memory amounts)
    {
        if (path.length < 2) revert InvalidPath();
        Route[] memory routes = _pathToRoutes(path);
        amounts = getAmountsOut(amountIn, routes);
    }

    // given some amount of an asset and pair reserves, returns an equivalent amount of the other asset
    function quoteLiquidity(
        uint256 amountA,
        uint256 reserveA,
        uint256 reserveB
    ) internal pure returns (uint256 amountB) {
        if (amountA <= 0) revert InsufficientAmount();
        if (reserveA <= 0 || reserveB <= 0) revert InsufficientLiquidity();
        amountB = (amountA * reserveB) / reserveA;
    }

    function isPair(address pair) public view returns (bool) {
        return ILeetSwapV2Factory(factory).isPair(pair);
    }

    function _pathToRoutes(address[] calldata path)
        internal
        view
        returns (Route[] memory routes)
    {
        routes = new Route[](path.length - 1);
        for (uint256 i = 0; i < path.length - 1; i++) {
            bool isStable = stablePairs[pairFor(path[i], path[i + 1])];
            routes[i] = Route(path[i], path[i + 1], isStable);
        }
    }

    // **** SWAP ****
    // requires the initial amount to have already been sent to the first pair
    function _swap(
        uint256[] memory amounts,
        Route[] memory routes,
        address _to
    ) internal virtual {
        for (uint256 i = 0; i < routes.length; i++) {
            (address token0, ) = sortTokens(routes[i].from, routes[i].to);
            uint256 amountOut = amounts[i + 1];
            (uint256 amount0Out, uint256 amount1Out) = routes[i].from == token0
                ? (uint256(0), amountOut)
                : (amountOut, uint256(0));
            address to = i < routes.length - 1
                ? pairFor(routes[i + 1].from, routes[i + 1].to)
                : _to;
            ILeetSwapV2Pair(pairFor(routes[i].from, routes[i].to)).swap(
                amount0Out,
                amount1Out,
                to,
                new bytes(0)
            );
        }
    }

    function swapExactTokensForTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external ensure(deadline) returns (uint256[] memory amounts) {
        Route[] memory routes = _pathToRoutes(path);
        amounts = getAmountsOut(amountIn, routes);
        if (amounts[amounts.length - 1] < amountOutMin) {
            revert InsufficientOutputAmount();
        }
        _safeTransferFrom(
            routes[0].from,
            msg.sender,
            pairFor(routes[0].from, routes[0].to),
            amounts[0]
        );
        _swap(amounts, routes, to);
    }

    function swapExactETHForTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable ensure(deadline) returns (uint256[] memory amounts) {
        if (path[0] != address(wcanto)) revert InvalidPath();
        Route[] memory routes = _pathToRoutes(path);
        amounts = getAmountsOut(msg.value, routes);
        if (amounts[amounts.length - 1] < amountOutMin) {
            revert InsufficientOutputAmount();
        }
        wcanto.deposit{value: amounts[0]}();
        assert(
            wcanto.transfer(pairFor(routes[0].from, routes[0].to), amounts[0])
        );
        _swap(amounts, routes, to);
    }

    function swapExactTokensForETH(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external ensure(deadline) returns (uint256[] memory amounts) {
        if (path[path.length - 1] != address(wcanto)) {
            revert InvalidPath();
        }
        Route[] memory routes = _pathToRoutes(path);
        amounts = getAmountsOut(amountIn, routes);
        if (amounts[amounts.length - 1] < amountOutMin) {
            revert InsufficientOutputAmount();
        }
        _safeTransferFrom(
            routes[0].from,
            msg.sender,
            pairFor(routes[0].from, routes[0].to),
            amounts[0]
        );
        _swap(amounts, routes, address(this));
        wcanto.withdraw(amounts[amounts.length - 1]);
        _safeTransferETH(to, amounts[amounts.length - 1]);
    }

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

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external virtual ensure(deadline) {
        _safeTransferFrom(
            path[0],
            msg.sender,
            pairFor(path[0], path[1]),
            amountIn
        );
        uint256 balanceBefore = IERC20(path[path.length - 1]).balanceOf(to);
        _swapSupportingFeeOnTransferTokens(path, to);
        if (
            IERC20(path[path.length - 1]).balanceOf(to) - balanceBefore <
            amountOutMin
        ) {
            revert InsufficientOutputAmount();
        }
    }

    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable virtual ensure(deadline) {
        if (path[0] != address(wcanto)) revert InvalidPath();
        uint256 amountIn = msg.value;
        IWCANTO(wcanto).deposit{value: amountIn}();
        assert(IWCANTO(wcanto).transfer(pairFor(path[0], path[1]), amountIn));
        uint256 balanceBefore = IERC20(path[path.length - 1]).balanceOf(to);
        _swapSupportingFeeOnTransferTokens(path, to);
        if (
            IERC20(path[path.length - 1]).balanceOf(to) - balanceBefore <
            amountOutMin
        ) {
            revert InsufficientOutputAmount();
        }
    }

    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external virtual ensure(deadline) {
        if (path[path.length - 1] != address(wcanto)) {
            revert InvalidPath();
        }
        _safeTransferFrom(
            path[0],
            msg.sender,
            pairFor(path[0], path[1]),
            amountIn
        );
        _swapSupportingFeeOnTransferTokens(path, address(this));
        uint256 amountOut = IERC20(address(wcanto)).balanceOf(address(this));
        if (amountOut < amountOutMin) {
            revert InsufficientOutputAmount();
        }
        IWCANTO(wcanto).withdraw(amountOut);
        _safeTransferETH(to, amountOut);
    }

    // **** ADD LIQUIDITY ****
    function _addLiquidity(
        address tokenA,
        address tokenB,
        bool stable,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin
    ) internal returns (uint256 amountA, uint256 amountB) {
        if (amountADesired < amountAMin || amountBDesired < amountBMin)
            revert InvalidAmount();
        // create the pair if it doesn"t exist yet
        address _pair = ILeetSwapV2Factory(factory).getPair(
            tokenA,
            tokenB,
            stable
        );
        if (_pair == address(0)) {
            _pair = ILeetSwapV2Factory(factory).createPair(
                tokenA,
                tokenB,
                stable
            );
        }
        (uint256 reserveA, uint256 reserveB) = getReserves(tokenA, tokenB);
        if (reserveA == 0 && reserveB == 0) {
            (amountA, amountB) = (amountADesired, amountBDesired);
        } else {
            uint256 amountBOptimal = quoteLiquidity(
                amountADesired,
                reserveA,
                reserveB
            );
            if (amountBOptimal <= amountBDesired) {
                if (amountBOptimal < amountBMin) {
                    revert InsufficientBAmount();
                }
                (amountA, amountB) = (amountADesired, amountBOptimal);
            } else {
                uint256 amountAOptimal = quoteLiquidity(
                    amountBDesired,
                    reserveB,
                    reserveA
                );
                assert(amountAOptimal <= amountADesired);
                if (amountAOptimal < amountAMin) {
                    revert InsufficientAAmount();
                }
                (amountA, amountB) = (amountAOptimal, amountBDesired);
            }
        }
    }

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

        address pair = pairFor(tokenA, tokenB);
        bool isStable = stablePairs[pair];
        (amountA, amountB) = _addLiquidity(
            tokenA,
            tokenB,
            isStable,
            amountADesired,
            amountBDesired,
            amountAMin,
            amountBMin
        );
        _safeTransferFrom(tokenA, msg.sender, pair, amountA);
        _safeTransferFrom(tokenB, msg.sender, pair, amountB);
        liquidity = ILeetSwapV2Pair(pair).mint(to);

        _stopLiquidityManagement(tokenA, tokenB);
    }

    function addLiquidityETH(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountCANTOMin,
        address to,
        uint256 deadline
    )
        external
        payable
        ensure(deadline)
        returns (
            uint256 amountToken,
            uint256 amountCANTO,
            uint256 liquidity
        )
    {
        _startLiquidityManagement(token, address(wcanto));

        address pair = pairFor(token, address(wcanto));
        bool isStable = stablePairs[pair];
        (amountToken, amountCANTO) = _addLiquidity(
            token,
            address(wcanto),
            isStable,
            amountTokenDesired,
            msg.value,
            amountTokenMin,
            amountCANTOMin
        );
        _safeTransferFrom(token, msg.sender, pair, amountToken);
        wcanto.deposit{value: amountCANTO}();
        assert(wcanto.transfer(pair, amountCANTO));
        liquidity = ILeetSwapV2Pair(pair).mint(to);
        // refund dust eth, if any
        if (msg.value > amountCANTO) {
            _safeTransferETH(msg.sender, msg.value - amountCANTO);
        }

        _stopLiquidityManagement(token, address(wcanto));
    }

    function _safeTransferETH(address to, uint256 value) internal {
        (bool success, ) = to.call{value: value}(new bytes(0));
        if (!success) revert CantoTransferFailed();
    }

    // **** REMOVE LIQUIDITY ****
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    ) public ensure(deadline) returns (uint256 amountA, uint256 amountB) {
        _startLiquidityManagement(tokenA, tokenB);

        address pair = pairFor(tokenA, tokenB);
        if (!ILeetSwapV2Pair(pair).transferFrom(msg.sender, pair, liquidity))
            revert TransferFailed();
        (uint256 amount0, uint256 amount1) = ILeetSwapV2Pair(pair).burn(to);
        (address token0, ) = sortTokens(tokenA, tokenB);
        (amountA, amountB) = tokenA == token0
            ? (amount0, amount1)
            : (amount1, amount0);
        if (amountA < amountAMin) {
            revert InsufficientAAmount();
        }
        if (amountB < amountBMin) {
            revert InsufficientBAmount();
        }

        _stopLiquidityManagement(tokenA, tokenB);
    }

    function removeLiquidityETH(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountCANTOMin,
        address to,
        uint256 deadline
    )
        public
        ensure(deadline)
        returns (uint256 amountToken, uint256 amountCANTO)
    {
        _startLiquidityManagement(token, address(wcanto));

        (amountToken, amountCANTO) = removeLiquidity(
            token,
            address(wcanto),
            liquidity,
            amountTokenMin,
            amountCANTOMin,
            address(this),
            deadline
        );
        _safeTransfer(token, to, amountToken);
        wcanto.withdraw(amountCANTO);
        _safeTransferETH(to, amountCANTO);

        _stopLiquidityManagement(token, address(wcanto));
    }

    // **** REMOVE LIQUIDITY (supporting fee-on-transfer tokens) ****
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountCANTOMin,
        address to,
        uint256 deadline
    ) public virtual ensure(deadline) returns (uint256 amountCANTO) {
        _startLiquidityManagement(token, address(wcanto));

        (, amountCANTO) = removeLiquidity(
            token,
            address(wcanto),
            liquidity,
            amountTokenMin,
            amountCANTOMin,
            address(this),
            deadline
        );
        _safeTransfer(token, to, IERC20(token).balanceOf(address(this)));
        wcanto.withdraw(amountCANTO);
        _safeTransferETH(to, amountCANTO);

        _stopLiquidityManagement(token, address(wcanto));
    }

    // **** LIBRARY FUNCTIONS ****
    function _safeTransfer(
        address token,
        address to,
        uint256 value
    ) internal {
        if (token.code.length == 0) revert InvalidToken();
        bool success = IERC20(token).transfer(to, value);
        if (!success) revert TransferFailed();
    }

    function _safeTransferFrom(
        address token,
        address from,
        address to,
        uint256 value
    ) internal {
        if (token.code.length == 0) revert InvalidToken();
        bool success = IERC20(token).transferFrom(from, to, value);
        if (!success) revert TransferFailed();
    }

    function setStablePair(address pair, bool stable) external onlyOwner {
        stablePairs[pair] = stable;
    }

    function setStablePairs(address[] calldata pairs, bool[] calldata stable)
        external
        onlyOwner
    {
        if (pairs.length != stable.length) revert ArrayLengthMismatch();
        for (uint256 i = 0; i < pairs.length; i++) {
            stablePairs[pairs[i]] = stable[i];
        }
    }

    function setDeadlineEnabled(bool _enabled) external onlyOwner {
        deadlineEnabled = _enabled;
    }

    function setLiquidityManageableEnabled(bool _enabled) external onlyOwner {
        liquidityManageableEnabled = _enabled;
    }

    function setLiquidityManageableWhitelistEnabled(bool _enabled)
        external
        onlyOwner
    {
        liquidityManageableWhitelistEnabled = _enabled;
    }

    function addLiquidityManageableWhitelist(address token) external onlyOwner {
        isLiquidityManageableWhitelisted[token] = true;
    }

    function removeLiquidityManageableWhitelist(address token)
        external
        onlyOwner
    {
        isLiquidityManageableWhitelisted[token] = false;
    }
}

File 2 of 9 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

File 4 of 9 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

File 5 of 9 : ILeetSwapV2Factory.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity ^0.8.0;

interface ILeetSwapV2Factory {
    function allPairsLength() external view returns (uint256);

    function isPair(address pair) external view returns (bool);

    function pairCodeHash() external pure returns (bytes32);

    function getPair(
        address tokenA,
        address token,
        bool stable
    ) external view returns (address);

    function createPair(
        address tokenA,
        address tokenB,
        bool stable
    ) external returns (address);

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

    function getInitializable()
        external
        view
        returns (
            address token0,
            address token1,
            bool stable
        );

    function protocolFeesShare() external view returns (uint256);

    function protocolFeesRecipient() external view returns (address);

    function tradingFees(address pair, address to)
        external
        view
        returns (uint256);

    function isPaused() external view returns (bool);
}

File 6 of 9 : ILeetSwapV2Pair.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity ^0.8.0;

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

    function fees() external view returns (address);

    function transferFrom(
        address src,
        address dst,
        uint256 amount
    ) external returns (bool);

    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

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

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

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

    function getReserves()
        external
        view
        returns (
            uint256 _reserve0,
            uint256 _reserve1,
            uint256 _blockTimestampLast
        );

    function getAmountOut(uint256, address) external view returns (uint256);

    function current(address tokenIn, uint256 amountIn)
        external
        view
        returns (uint256);

    function token0() external view returns (address);

    function token1() external view returns (address);

    function stable() external view returns (bool);

    function balanceOf(address) external view returns (uint256);

    //LP token pricing
    function sample(
        address tokenIn,
        uint256 amountIn,
        uint256 points,
        uint256 window
    ) external view returns (uint256[] memory);

    function quote(
        address tokenIn,
        uint256 amountIn,
        uint256 granularity
    ) external view returns (uint256);

    function claimFeesFor(address account)
        external
        returns (uint256 claimed0, uint256 claimed1);

    function claimFees() external returns (uint256 claimed0, uint256 claimed1);

    function claimableFeesFor(address account)
        external
        returns (uint256 claimed0, uint256 claimed1);

    function claimableFees()
        external
        returns (uint256 claimed0, uint256 claimed1);
}

File 7 of 9 : ILeetSwapV2Router01.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity ^0.8.0;

import "@leetswap/interfaces/IWCANTO.sol";

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

    function WETH() external view returns (address);

    function wcanto() external view returns (IWCANTO);

    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 addLiquidityETH(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    )
        external
        payable
        returns (
            uint256 amountToken,
            uint256 amountETH,
            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 removeLiquidityETH(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountToken, uint256 amountETH);

    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountCANTOMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountCANTO);

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

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

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

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;

    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable;

    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;

    function getAmountOut(
        uint256 amountIn,
        address tokenIn,
        address tokenOut
    ) external view returns (uint256 amount);

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

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

File 8 of 9 : ILiquidityManageable.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity ^0.8.0;

interface ILiquidityManageable {
    function setLiquidityManagementPhase(bool _isManagingLiquidity) external;

    function isLiquidityManager(address _addr) external returns (bool);

    function isLiquidityManagementPhase() external returns (bool);
}

File 9 of 9 : IWCANTO.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity ^0.8.0;

interface IWCANTO {
    function deposit() external payable;

    function transfer(address to, uint256 value) external returns (bool);

    function withdraw(uint256) external;
}

Settings
{
  "remappings": [
    "@leetswap/=src/",
    "@openzeppelin/=lib/openzeppelin-contracts/",
    "ds-test/=lib/forge-std/lib/ds-test/src/",
    "forge-std/=lib/forge-std/src/",
    "openzeppelin-contracts/=lib/openzeppelin-contracts/",
    "solmate/=lib/solmate/src/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "metadata": {
    "bytecodeHash": "ipfs"
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  },
  "evmVersion": "london",
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_wcanto","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ArrayLengthMismatch","type":"error"},{"inputs":[],"name":"CantoTransferFailed","type":"error"},{"inputs":[],"name":"DeadlineExpired","type":"error"},{"inputs":[],"name":"IdenticalAddresses","type":"error"},{"inputs":[],"name":"InsufficientAAmount","type":"error"},{"inputs":[],"name":"InsufficientAmount","type":"error"},{"inputs":[],"name":"InsufficientBAmount","type":"error"},{"inputs":[],"name":"InsufficientLiquidity","type":"error"},{"inputs":[],"name":"InsufficientOutputAmount","type":"error"},{"inputs":[],"name":"InvalidAmount","type":"error"},{"inputs":[],"name":"InvalidPath","type":"error"},{"inputs":[],"name":"InvalidToken","type":"error"},{"inputs":[],"name":"TradeExpired","type":"error"},{"inputs":[],"name":"TransferFailed","type":"error"},{"inputs":[],"name":"Unauthorized","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"amountADesired","type":"uint256"},{"internalType":"uint256","name":"amountBDesired","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amountTokenDesired","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountCANTOMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountCANTO","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"addLiquidityManageableWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deadlineEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct LeetSwapV2Router01.Route[]","name":"routes","type":"tuple[]"}],"name":"getAmountsOut","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":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"}],"name":"getReserves","outputs":[{"internalType":"uint256","name":"reserveA","type":"uint256"},{"internalType":"uint256","name":"reserveB","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isLiquidityManageableWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"}],"name":"isPair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityManageableEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityManageableWhitelistEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"}],"name":"pairFor","outputs":[{"internalType":"address","name":"pair","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountCANTOMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountCANTO","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":"amountCANTOMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETHSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountCANTO","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"removeLiquidityManageableWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setDeadlineEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setLiquidityManageableEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setLiquidityManageableWhitelistEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"name":"setStablePair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"pairs","type":"address[]"},{"internalType":"bool[]","name":"stable","type":"bool[]"}],"name":"setStablePairs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"}],"name":"sortTokens","outputs":[{"internalType":"address","name":"token0","type":"address"},{"internalType":"address","name":"token1","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"stablePairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETHSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wcanto","outputs":[{"internalType":"contract IWCANTO","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60e06040523480156200001157600080fd5b506040516200421938038062004219833981016040819052620000349162000144565b6200003f33620000d7565b6001600160a01b038216608081905260408051631355724960e31b81529051639aab9248916004808201926020929091908290030181865afa1580156200008a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000b091906200017c565b60c0526001600160a01b031660a052506003805462ffff0019166201010017905562000196565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80516001600160a01b03811681146200013f57600080fd5b919050565b600080604083850312156200015857600080fd5b620001638362000127565b9150620001736020840162000127565b90509250929050565b6000602082840312156200018f57600080fd5b5051919050565b60805160a05160c051613f65620002b46000396000611662015260008181610223015281816104b2015281816105e6015281816107cb015281816107f501528181610844015281816108b80152818161096501528181610ad40152818161111e01528181611202015281816112ae015281816113520152818161142c015281816114ba01528181611aa201528181611acc01528181611b8401528181611bf801528181611c5a01528181611cd801528181611d4c0152818161249e015281816124ca015281816125130152818161254f015281816125e401526126f001526000818161069f01528181610fe10152818161161a015281816117e10152818161224d0152818161344e015281816134e2015261358e0152613f656000f3fe6080604052600436106102135760003560e01c806396ed28f911610118578063b6f9de95116100a0578063d52bb6f41161006f578063d52bb6f4146106e1578063e5e31b1314610701578063e8e3370014610721578063f2fde38b1461075c578063f305d7191461077c57600080fd5b8063b6f9de951461065a578063baa2abde1461066d578063c45a01551461068d578063d06ca61f146106c157600080fd5b8063accb16e0116100e7578063accb16e01461059d578063ad0950cb146105b7578063ad5c4648146105d7578063af2979eb1461060a578063b1be2f0f1461062a57600080fd5b806396ed28f91461051d5780639881fcb41461053d578063a90f63621461055d578063ab0aaadf1461057d57600080fd5b8063590e8e781161019b578063715018a61161016a578063715018a61461046b578063791ac947146104805780637aa497d9146104a05780637ff36ab5146104ec5780638da5cb5b146104ff57600080fd5b8063590e8e78146103cd5780635c11d795146103ed5780635e1e63251461040d5780636cc1e9841461043b57600080fd5b8063283c2ee1116101e2578063283c2ee1146102fe57806338ed17391461032e57806346d886a11461034e578063520709c51461036d578063544caa561461038d57600080fd5b806302751cec14610257578063056bfae114610291578063098b0eaa146102b157806318cbafe5146102d157600080fd5b3661025257336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146102505761025061372e565b005b600080fd5b34801561026357600080fd5b50610277610272366004613759565b61078f565b604080519283526020830191909152015b60405180910390f35b34801561029d57600080fd5b506102506102ac3660046137c5565b6108e8565b3480156102bd57600080fd5b506102506102cc3660046137c5565b610903565b3480156102dd57600080fd5b506102f16102ec36600461382e565b610927565b60405161028891906138a1565b34801561030a57600080fd5b5060035461031e9062010000900460ff1681565b6040519015158152602001610288565b34801561033a57600080fd5b506102f161034936600461382e565b610bb4565b34801561035a57600080fd5b5060035461031e90610100900460ff1681565b34801561037957600080fd5b506102506103883660046138e5565b610c6a565b34801561039957600080fd5b506103ad6103a836600461391e565b610c9d565b604080516001600160a01b03938416815292909116602083015201610288565b3480156103d957600080fd5b506102506103e83660046137c5565b610d28565b3480156103f957600080fd5b5061025061040836600461382e565b610d4a565b34801561041957600080fd5b5061042d61042836600461394c565b610fb2565b604051908152602001610288565b34801561044757600080fd5b5061031e61045636600461398e565b60016020526000908152604090205460ff1681565b34801561047757600080fd5b506102506110cf565b34801561048c57600080fd5b5061025061049b36600461382e565b6110e3565b3480156104ac57600080fd5b506104d47f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610288565b6102f16104fa3660046139ab565b61131c565b34801561050b57600080fd5b506000546001600160a01b03166104d4565b34801561052957600080fd5b506104d461053836600461391e565b6115cd565b34801561054957600080fd5b506102f1610558366004613a82565b6116e8565b34801561056957600080fd5b5061025061057836600461398e565b61194d565b34801561058957600080fd5b50610250610598366004613b7d565b611976565b3480156105a957600080fd5b5060035461031e9060ff1681565b3480156105c357600080fd5b506102506105d236600461398e565b611a3c565b3480156105e357600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006104d4565b34801561061657600080fd5b5061042d610625366004613759565b611a68565b34801561063657600080fd5b5061031e61064536600461398e565b60026020526000908152604090205460ff1681565b6102506106683660046139ab565b611c27565b34801561067957600080fd5b50610277610688366004613be9565b611f4e565b34801561069957600080fd5b506104d47f000000000000000000000000000000000000000000000000000000000000000081565b3480156106cd57600080fd5b506102f16106dc366004613c5b565b612139565b3480156106ed57600080fd5b506102776106fc36600461391e565b612175565b34801561070d57600080fd5b5061031e61071c36600461398e565b61222b565b34801561072d57600080fd5b5061074161073c366004613ca7565b6122c0565b60408051938452602084019290925290820152606001610288565b34801561076857600080fd5b5061025061077736600461398e565b6123e2565b61074161078a366004613759565b612460565b6003546000908190839060ff1680156107a757504281105b156107c557604051631ab7da6b60e01b815260040160405180910390fd5b6107ef897f0000000000000000000000000000000000000000000000000000000000000000612723565b61081e897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a611f4e565b909350915061082e89868561293c565b604051632e1a7d4d60e01b8152600481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401600060405180830381600087803b15801561089057600080fd5b505af11580156108a4573d6000803e3d6000fd5b505050506108b285836129fe565b6108dc897f0000000000000000000000000000000000000000000000000000000000000000612a8c565b50965096945050505050565b6108f0612c73565b6003805460ff1916911515919091179055565b61090b612c73565b60038054911515620100000262ff000019909216919091179055565b600354606090829060ff16801561093d57504281105b1561095b57604051631ab7da6b60e01b815260040160405180910390fd5b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168686610992600182613d39565b8181106109a1576109a1613d4c565b90506020020160208101906109b6919061398e565b6001600160a01b0316146109dd576040516320db826760e01b815260040160405180910390fd5b60006109e98787612ccd565b90506109f589826116e8565b9250878360018551610a079190613d39565b81518110610a1757610a17613d4c565b60200260200101511015610a3e576040516342301c2360e01b815260040160405180910390fd5b610ac781600081518110610a5457610a54613d4c565b60200260200101516000015133610aa784600081518110610a7757610a77613d4c565b60200260200101516000015185600081518110610a9657610a96613d4c565b6020026020010151602001516115cd565b86600081518110610aba57610aba613d4c565b6020026020010151612e77565b610ad2838230612f41565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d8460018651610b109190613d39565b81518110610b2057610b20613d4c565b60200260200101516040518263ffffffff1660e01b8152600401610b4691815260200190565b600060405180830381600087803b158015610b6057600080fd5b505af1158015610b74573d6000803e3d6000fd5b50505050610ba8858460018651610b8b9190613d39565b81518110610b9b57610b9b613d4c565b60200260200101516129fe565b50509695505050505050565b600354606090829060ff168015610bca57504281105b15610be857604051631ab7da6b60e01b815260040160405180910390fd5b6000610bf48787612ccd565b9050610c0089826116e8565b9250878360018551610c129190613d39565b81518110610c2257610c22613d4c565b60200260200101511015610c49576040516342301c2360e01b815260040160405180910390fd5b610c5f81600081518110610a5457610a54613d4c565b610ba8838287612f41565b610c72612c73565b6001600160a01b03919091166000908152600160205260409020805460ff1916911515919091179055565b600080826001600160a01b0316846001600160a01b031603610cd257604051630bd969eb60e41b815260040160405180910390fd5b826001600160a01b0316846001600160a01b031610610cf2578284610cf5565b83835b90925090506001600160a01b038216610d215760405163d92e233d60e01b815260040160405180910390fd5b9250929050565b610d30612c73565b600380549115156101000261ff0019909216919091179055565b600354819060ff168015610d5d57504281105b15610d7b57604051631ab7da6b60e01b815260040160405180910390fd5b610e0085856000818110610d9157610d91613d4c565b9050602002016020810190610da6919061398e565b33610dfa88886000818110610dbd57610dbd613d4c565b9050602002016020810190610dd2919061398e565b89896001818110610de557610de5613d4c565b9050602002016020810190610538919061398e565b8a612e77565b60008585610e0f600182613d39565b818110610e1e57610e1e613d4c565b9050602002016020810190610e33919061398e565b6040516370a0823160e01b81526001600160a01b03868116600483015291909116906370a0823190602401602060405180830381865afa158015610e7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e9f9190613d62565b9050610edf868680806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250889250613148915050565b86818787610eee600182613d39565b818110610efd57610efd613d4c565b9050602002016020810190610f12919061398e565b6040516370a0823160e01b81526001600160a01b03888116600483015291909116906370a08231906024015b602060405180830381865afa158015610f5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f7f9190613d62565b610f899190613d39565b1015610fa8576040516342301c2360e01b815260040160405180910390fd5b5050505050505050565b600080610fbf84846115cd565b60405163e5e31b1360e01b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063e5e31b1390602401602060405180830381865afa15801561102a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061104e9190613d7b565b156110c7576040516378a051ad60e11b8152600481018690526001600160a01b03858116602483015282169063f140a35a90604401602060405180830381865afa1580156110a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110c49190613d62565b91505b509392505050565b6110d7612c73565b6110e160006133e9565b565b600354819060ff1680156110f657504281105b1561111457604051631ab7da6b60e01b815260040160405180910390fd5b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016858561114b600182613d39565b81811061115a5761115a613d4c565b905060200201602081019061116f919061398e565b6001600160a01b031614611196576040516320db826760e01b815260040160405180910390fd5b6111ac85856000818110610d9157610d91613d4c565b6111ea858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613148915050565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015611251573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112759190613d62565b905086811015611298576040516342301c2360e01b815260040160405180910390fd5b604051632e1a7d4d60e01b8152600481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401600060405180830381600087803b1580156112fa57600080fd5b505af115801561130e573d6000803e3d6000fd5b50505050610fa884826129fe565b600354606090829060ff16801561133257504281105b1561135057604051631ab7da6b60e01b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168686600081811061138d5761138d613d4c565b90506020020160208101906113a2919061398e565b6001600160a01b0316146113c9576040516320db826760e01b815260040160405180910390fd5b60006113d58787612ccd565b90506113e134826116e8565b92508783600185516113f39190613d39565b8151811061140357611403613d4c565b6020026020010151101561142a576040516342301c2360e01b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db08460008151811061146c5761146c613d4c565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561149f57600080fd5b505af11580156114b3573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb61151c836000815181106114fd576114fd613d4c565b60200260200101516000015184600081518110610a9657610a96613d4c565b8560008151811061152f5761152f613d4c565b60200260200101516040518363ffffffff1660e01b81526004016115689291906001600160a01b03929092168252602082015260400190565b6020604051808303816000875af1158015611587573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115ab9190613d7b565b6115b7576115b761372e565b6115c2838287612f41565b505095945050505050565b60008060006115dc8585610c9d565b915091506000600160006115f285856001613439565b6001600160a01b03168152602080820192909252604090810160002054905160ff90911692507f00000000000000000000000000000000000000000000000000000000000000009161164a9186918691869101613d98565b604051602081830303815290604052805190602001207f00000000000000000000000000000000000000000000000000000000000000006040516020016116c6939291906001600160f81b0319815260609390931b6bffffffffffffffffffffffff191660018401526015830191909152603582015260550190565b60408051601f1981840301815291905280516020909101209695505050505050565b606060018251101561170d576040516320db826760e01b815260040160405180910390fd5b815161171a906001613dcb565b67ffffffffffffffff81111561173257611732613a12565b60405190808252806020026020018201604052801561175b578160200160208202803683370190505b509050828160008151811061177257611772613d4c565b60200260200101818152505060005b82518110156119465760006117bf8483815181106117a1576117a1613d4c565b602002602001015160000151858481518110610a9657610a96613d4c565b60405163e5e31b1360e01b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063e5e31b1390602401602060405180830381865afa15801561182a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061184e9190613d7b565b1561193357806001600160a01b031663f140a35a84848151811061187457611874613d4c565b602002602001015186858151811061188e5761188e613d4c565b6020026020010151600001516040518363ffffffff1660e01b81526004016118c99291909182526001600160a01b0316602082015260400190565b602060405180830381865afa1580156118e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061190a9190613d62565b83611916846001613dcb565b8151811061192657611926613d4c565b6020026020010181815250505b508061193e81613dde565b915050611781565b5092915050565b611955612c73565b6001600160a01b03166000908152600260205260409020805460ff19169055565b61197e612c73565b82811461199e5760405163512509d360e11b815260040160405180910390fd5b60005b83811015611a35578282828181106119bb576119bb613d4c565b90506020020160208101906119d091906137c5565b600160008787858181106119e6576119e6613d4c565b90506020020160208101906119fb919061398e565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580611a2d81613dde565b9150506119a1565b5050505050565b611a44612c73565b6001600160a01b03166000908152600260205260409020805460ff19166001179055565b600354600090829060ff168015611a7e57504281105b15611a9c57604051631ab7da6b60e01b815260040160405180910390fd5b611ac6887f0000000000000000000000000000000000000000000000000000000000000000612723565b611af5887f00000000000000000000000000000000000000000000000000000000000000008989893089611f4e565b6040516370a0823160e01b8152306004820152909350611b6e9150899086906001600160a01b038316906370a0823190602401602060405180830381865afa158015611b45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b699190613d62565b61293c565b604051632e1a7d4d60e01b8152600481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401600060405180830381600087803b158015611bd057600080fd5b505af1158015611be4573d6000803e3d6000fd5b50505050611bf284836129fe565b611c1c887f0000000000000000000000000000000000000000000000000000000000000000612a8c565b509695505050505050565b600354819060ff168015611c3a57504281105b15611c5857604051631ab7da6b60e01b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685856000818110611c9557611c95613d4c565b9050602002016020810190611caa919061398e565b6001600160a01b031614611cd1576040516320db826760e01b815260040160405180910390fd5b60003490507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015611d3157600080fd5b505af1158015611d45573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb611d8f88886000818110610dbd57610dbd613d4c565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303816000875af1158015611ddc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e009190613d7b565b611e0c57611e0c61372e565b60008686611e1b600182613d39565b818110611e2a57611e2a613d4c565b9050602002016020810190611e3f919061398e565b6040516370a0823160e01b81526001600160a01b03878116600483015291909116906370a0823190602401602060405180830381865afa158015611e87573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611eab9190613d62565b9050611eeb878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613148915050565b87818888611efa600182613d39565b818110611f0957611f09613d4c565b9050602002016020810190611f1e919061398e565b6040516370a0823160e01b81526001600160a01b03898116600483015291909116906370a0823190602401610f3e565b6003546000908190839060ff168015611f6657504281105b15611f8457604051631ab7da6b60e01b815260040160405180910390fd5b611f8e8a8a612723565b6000611f9a8b8b6115cd565b6040516323b872dd60e01b81523360048201526001600160a01b03821660248201819052604482018c90529192506323b872dd906064016020604051808303816000875af1158015611ff0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120149190613d7b565b612031576040516312171d8360e31b815260040160405180910390fd5b60405163226bf2d160e21b81526001600160a01b03878116600483015260009182918416906389afcb449060240160408051808303816000875af115801561207d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120a19190613df7565b9150915060006120b18e8e610c9d565b509050806001600160a01b03168e6001600160a01b0316146120d45781836120d7565b82825b90975095508a8710156120fd57604051638dc525d160e01b815260040160405180910390fd5b8986101561211e5760405163ef71d09160e01b815260040160405180910390fd5b6121288e8e612a8c565b505050505097509795505050505050565b6060600282101561215d576040516320db826760e01b815260040160405180910390fd5b60006121698484612ccd565b90506110c485826116e8565b60008060006121848585610c9d565b50905060008061219487876115cd565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa1580156121d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121f59190613e1b565b5091509150826001600160a01b0316876001600160a01b03161461221a57808261221d565b81815b909890975095505050505050565b60405163e5e31b1360e01b81526001600160a01b0382811660048301526000917f00000000000000000000000000000000000000000000000000000000000000009091169063e5e31b1390602401602060405180830381865afa158015612296573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122ba9190613d7b565b92915050565b60035460009081908190849060ff1680156122da57504281105b156122f857604051631ab7da6b60e01b815260040160405180910390fd5b6123028c8c612723565b600061230e8d8d6115cd565b6001600160a01b03811660009081526001602052604090205490915060ff1661233c8e8e838f8f8f8f613482565b909650945061234d8e338489612e77565b6123598d338488612e77565b6040516335313c2160e11b81526001600160a01b038981166004830152831690636a627842906024016020604051808303816000875af11580156123a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123c59190613d62565b93506123d18e8e612a8c565b505050985098509895505050505050565b6123ea612c73565b6001600160a01b0381166124545760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b61245d816133e9565b50565b60035460009081908190849060ff16801561247a57504281105b1561249857604051631ab7da6b60e01b815260040160405180910390fd5b6124c28a7f0000000000000000000000000000000000000000000000000000000000000000612723565b60006124ee8b7f00000000000000000000000000000000000000000000000000000000000000006115cd565b6001600160a01b03811660009081526001602052604090205490915060ff1661253c8c7f0000000000000000000000000000000000000000000000000000000000000000838e348f8f613482565b909650945061254d8c338489612e77565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0866040518263ffffffff1660e01b81526004016000604051808303818588803b1580156125a857600080fd5b505af11580156125bc573d6000803e3d6000fd5b505060405163a9059cbb60e01b81526001600160a01b038681166004830152602482018a90527f000000000000000000000000000000000000000000000000000000000000000016935063a9059cbb925060440190506020604051808303816000875af1158015612631573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126559190613d7b565b6126615761266161372e565b6040516335313c2160e11b81526001600160a01b038981166004830152831690636a627842906024016020604051808303816000875af11580156126a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126cd9190613d62565b9350843411156126ea576126ea336126e58734613d39565b6129fe565b6127148c7f0000000000000000000000000000000000000000000000000000000000000000612a8c565b50505096509650969350505050565b600354610100900460ff16612736575050565b60035462010000900460ff16158061276657506001600160a01b03821660009081526002602052604090205460ff165b15612839576040516337e26cd160e21b815230600482015282906001600160a01b0382169063df89b344906024016020604051808303816000875af19250505080156127cf575060408051601f3d908101601f191682019092526127cc91810190613d7b565b60015b156128375780156128355760405163bd7d67e960e01b8152600160048201526001600160a01b0383169063bd7d67e990602401600060405180830381600087803b15801561281c57600080fd5b505af1158015612830573d6000803e3d6000fd5b505050505b505b505b60035462010000900460ff16158061286957506001600160a01b03811660009081526002602052604090205460ff165b15612938576040516337e26cd160e21b815230600482015281906001600160a01b0382169063df89b344906024016020604051808303816000875af19250505080156128d2575060408051601f3d908101601f191682019092526128cf91810190613d7b565b60015b156129365780156129345760405163bd7d67e960e01b8152600160048201526001600160a01b0383169063bd7d67e9906024015b600060405180830381600087803b15801561292057600080fd5b505af1158015610fa8573d6000803e3d6000fd5b505b505b5050565b826001600160a01b03163b6000036129675760405163c1ab6dc160e01b815260040160405180910390fd5b60405163a9059cbb60e01b81526001600160a01b038381166004830152602482018390526000919085169063a9059cbb906044016020604051808303816000875af11580156129ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129de9190613d7b565b905080612934576040516312171d8360e31b815260040160405180910390fd5b604080516000808252602082019092526001600160a01b038416908390604051612a289190613e6d565b60006040518083038185875af1925050503d8060008114612a65576040519150601f19603f3d011682016040523d82523d6000602084013e612a6a565b606091505b505090508061293657604051631db12dd560e21b815260040160405180910390fd5b600354610100900460ff16612a9f575050565b60035462010000900460ff161580612acf57506001600160a01b03821660009081526002602052604090205460ff165b15612ba2576040516337e26cd160e21b815230600482015282906001600160a01b0382169063df89b344906024016020604051808303816000875af1925050508015612b38575060408051601f3d908101601f19168201909252612b3591810190613d7b565b60015b15612ba0578015612b9e5760405163bd7d67e960e01b8152600060048201526001600160a01b0383169063bd7d67e990602401600060405180830381600087803b158015612b8557600080fd5b505af1158015612b99573d6000803e3d6000fd5b505050505b505b505b60035462010000900460ff161580612bd257506001600160a01b03811660009081526002602052604090205460ff165b15612938576040516337e26cd160e21b815230600482015281906001600160a01b0382169063df89b344906024016020604051808303816000875af1925050508015612c3b575060408051601f3d908101601f19168201909252612c3891810190613d7b565b60015b156129365780156129345760405163bd7d67e960e01b8152600060048201526001600160a01b0383169063bd7d67e990602401612906565b6000546001600160a01b031633146110e15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161244b565b6060612cda600183613d39565b67ffffffffffffffff811115612cf257612cf2613a12565b604051908082528060200260200182016040528015612d3d57816020015b6040805160608101825260008082526020808301829052928201528252600019909201910181612d105790505b50905060005b612d4e600184613d39565b81101561194657600060016000612da1878786818110612d7057612d70613d4c565b9050602002016020810190612d85919061398e565b8888612d92886001613dcb565b818110610de557610de5613d4c565b6001600160a01b03168152602081019190915260409081016000205481516060810190925260ff16915080868685818110612dde57612dde613d4c565b9050602002016020810190612df3919061398e565b6001600160a01b031681526020018686612e0e866001613dcb565b818110612e1d57612e1d613d4c565b9050602002016020810190612e32919061398e565b6001600160a01b03168152602001821515815250838381518110612e5857612e58613d4c565b6020026020010181905250508080612e6f90613dde565b915050612d43565b836001600160a01b03163b600003612ea25760405163c1ab6dc160e01b815260040160405180910390fd5b6040516323b872dd60e01b81526001600160a01b038481166004830152838116602483015260448201839052600091908616906323b872dd906064016020604051808303816000875af1158015612efd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f219190613d7b565b905080611a35576040516312171d8360e31b815260040160405180910390fd5b60005b8251811015612934576000612f93848381518110612f6457612f64613d4c565b602002602001015160000151858481518110612f8257612f82613d4c565b602002602001015160200151610c9d565b509050600085612fa4846001613dcb565b81518110612fb457612fb4613d4c565b60200260200101519050600080836001600160a01b0316878681518110612fdd57612fdd613d4c565b6020026020010151600001516001600160a01b031614612fff57826000613003565b6000835b915091506000600188516130179190613d39565b8610613023578661306c565b61306c88613032886001613dcb565b8151811061304257613042613d4c565b6020026020010151600001518988600161305c9190613dcb565b81518110610a9657610a96613d4c565b90506130a188878151811061308357613083613d4c565b602002602001015160000151898881518110610a9657610a96613d4c565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f1916602001820160405280156130de576020820181803683370190505b506040518563ffffffff1660e01b81526004016130fe9493929190613e89565b600060405180830381600087803b15801561311857600080fd5b505af115801561312c573d6000803e3d6000fd5b505050505050505050808061314090613dde565b915050612f44565b60005b600183516131599190613d39565b8110156129365760008084838151811061317557613175613d4c565b60200260200101518584600161318b9190613dcb565b8151811061319b5761319b613d4c565b60200260200101519150915060006131b38383610c9d565b50905060006131c284846115cd565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015613208573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061322c9190613e1b565b50915091506000866001600160a01b0316896001600160a01b031614613253578183613256565b82825b506040516370a0823160e01b81526001600160a01b03888116600483015291925082918b16906370a0823190602401602060405180830381865afa1580156132a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132c69190613d62565b6132d09190613d39565b94506132dd858a8a610fb2565b9350505050600080856001600160a01b0316886001600160a01b0316146133065782600061330a565b6000835b91509150600060028c5161331e9190613d39565b8a101561335957613352888d6133358d6002613dcb565b8151811061334557613345613d4c565b60200260200101516115cd565b905061335c565b50895b6040805160008152602081019182905263022c0d9f60e01b9091526001600160a01b0387169063022c0d9f9061339b9086908690869060248101613e89565b600060405180830381600087803b1580156133b557600080fd5b505af11580156133c9573d6000803e3d6000fd5b5050505050505050505050505080806133e190613dde565b91505061314b565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60008060006134488686610c9d565b915091507f000000000000000000000000000000000000000000000000000000000000000082828660405160200161164a93929190613d98565b6000808386108061349257508285105b156134b05760405163162908e360e11b815260040160405180910390fd5b6040516306801cc360e41b81526001600160a01b038a81166004830152898116602483015288151560448301526000917f000000000000000000000000000000000000000000000000000000000000000090911690636801cc3090606401602060405180830381865afa15801561352b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061354f9190613ed9565b90506001600160a01b0381166135fe576040516320b7f73960e21b81526001600160a01b038b811660048301528a8116602483015289151560448301527f000000000000000000000000000000000000000000000000000000000000000016906382dfdce4906064016020604051808303816000875af11580156135d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135fb9190613ed9565b90505b60008061360b8c8c612175565b9150915081600014801561361d575080155b1561362d578894508793506136b7565b600061363a8a84846136c6565b905088811161366f57868110156136645760405163ef71d09160e01b815260040160405180910390fd5b8995509350836136b5565b600061367c8a84866136c6565b90508a81111561368e5761368e61372e565b888110156136af57604051638dc525d160e01b815260040160405180910390fd5b95508894505b505b50505097509795505050505050565b60008084116136e857604051632ca2f52b60e11b815260040160405180910390fd5b8215806136f3575081155b156137115760405163bb55fd2760e01b815260040160405180910390fd5b8261371c8386613ef6565b6137269190613f0d565b949350505050565b634e487b7160e01b600052600160045260246000fd5b6001600160a01b038116811461245d57600080fd5b60008060008060008060c0878903121561377257600080fd5b863561377d81613744565b955060208701359450604087013593506060870135925060808701356137a281613744565b8092505060a087013590509295509295509295565b801515811461245d57600080fd5b6000602082840312156137d757600080fd5b81356137e2816137b7565b9392505050565b60008083601f8401126137fb57600080fd5b50813567ffffffffffffffff81111561381357600080fd5b6020830191508360208260051b8501011115610d2157600080fd5b60008060008060008060a0878903121561384757600080fd5b8635955060208701359450604087013567ffffffffffffffff81111561386c57600080fd5b61387889828a016137e9565b909550935050606087013561388c81613744565b80925050608087013590509295509295509295565b6020808252825182820181905260009190848201906040850190845b818110156138d9578351835292840192918401916001016138bd565b50909695505050505050565b600080604083850312156138f857600080fd5b823561390381613744565b91506020830135613913816137b7565b809150509250929050565b6000806040838503121561393157600080fd5b823561393c81613744565b9150602083013561391381613744565b60008060006060848603121561396157600080fd5b83359250602084013561397381613744565b9150604084013561398381613744565b809150509250925092565b6000602082840312156139a057600080fd5b81356137e281613744565b6000806000806000608086880312156139c357600080fd5b85359450602086013567ffffffffffffffff8111156139e157600080fd5b6139ed888289016137e9565b9095509350506040860135613a0181613744565b949793965091946060013592915050565b634e487b7160e01b600052604160045260246000fd5b6040516060810167ffffffffffffffff81118282101715613a4b57613a4b613a12565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715613a7a57613a7a613a12565b604052919050565b6000806040808486031215613a9657600080fd5b8335925060208085013567ffffffffffffffff80821115613ab657600080fd5b818701915087601f830112613aca57600080fd5b813581811115613adc57613adc613a12565b613aea848260051b01613a51565b8181528481019250606091820284018501918a831115613b0957600080fd5b938501935b82851015613b6c5780858c031215613b265760008081fd5b613b2e613a28565b8535613b3981613744565b815285870135613b4881613744565b8188015285880135613b59816137b7565b8189015284529384019392850192613b0e565b508096505050505050509250929050565b60008060008060408587031215613b9357600080fd5b843567ffffffffffffffff80821115613bab57600080fd5b613bb7888389016137e9565b90965094506020870135915080821115613bd057600080fd5b50613bdd878288016137e9565b95989497509550505050565b600080600080600080600060e0888a031215613c0457600080fd5b8735613c0f81613744565b96506020880135613c1f81613744565b955060408801359450606088013593506080880135925060a0880135613c4481613744565b8092505060c0880135905092959891949750929550565b600080600060408486031215613c7057600080fd5b83359250602084013567ffffffffffffffff811115613c8e57600080fd5b613c9a868287016137e9565b9497909650939450505050565b600080600080600080600080610100898b031215613cc457600080fd5b8835613ccf81613744565b97506020890135613cdf81613744565b965060408901359550606089013594506080890135935060a0890135925060c0890135613d0b81613744565b8092505060e089013590509295985092959890939650565b634e487b7160e01b600052601160045260246000fd5b818103818111156122ba576122ba613d23565b634e487b7160e01b600052603260045260246000fd5b600060208284031215613d7457600080fd5b5051919050565b600060208284031215613d8d57600080fd5b81516137e2816137b7565b6bffffffffffffffffffffffff19606094851b811682529290931b9091166014830152151560f81b602882015260290190565b808201808211156122ba576122ba613d23565b600060018201613df057613df0613d23565b5060010190565b60008060408385031215613e0a57600080fd5b505080516020909101519092909150565b600080600060608486031215613e3057600080fd5b8351925060208401519150604084015190509250925092565b60005b83811015613e64578181015183820152602001613e4c565b50506000910152565b60008251613e7f818460208701613e49565b9190910192915050565b84815283602082015260018060a01b03831660408201526080606082015260008251806080840152613ec28160a0850160208701613e49565b601f01601f19169190910160a00195945050505050565b600060208284031215613eeb57600080fd5b81516137e281613744565b80820281158282048414176122ba576122ba613d23565b600082613f2a57634e487b7160e01b600052601260045260246000fd5b50049056fea26469706673582212202e016813496ad0b4c738836e30897bee7e4d7ed2b9b7a2e06b10b1433c2e92e764736f6c63430008110033000000000000000000000000ce87e0960f4e2702f4bffe277655e993ae720e840000000000000000000000004f9a0e7fd2bf6067db6994cf12e4495df938e6e9

Deployed Bytecode

0x6080604052600436106102135760003560e01c806396ed28f911610118578063b6f9de95116100a0578063d52bb6f41161006f578063d52bb6f4146106e1578063e5e31b1314610701578063e8e3370014610721578063f2fde38b1461075c578063f305d7191461077c57600080fd5b8063b6f9de951461065a578063baa2abde1461066d578063c45a01551461068d578063d06ca61f146106c157600080fd5b8063accb16e0116100e7578063accb16e01461059d578063ad0950cb146105b7578063ad5c4648146105d7578063af2979eb1461060a578063b1be2f0f1461062a57600080fd5b806396ed28f91461051d5780639881fcb41461053d578063a90f63621461055d578063ab0aaadf1461057d57600080fd5b8063590e8e781161019b578063715018a61161016a578063715018a61461046b578063791ac947146104805780637aa497d9146104a05780637ff36ab5146104ec5780638da5cb5b146104ff57600080fd5b8063590e8e78146103cd5780635c11d795146103ed5780635e1e63251461040d5780636cc1e9841461043b57600080fd5b8063283c2ee1116101e2578063283c2ee1146102fe57806338ed17391461032e57806346d886a11461034e578063520709c51461036d578063544caa561461038d57600080fd5b806302751cec14610257578063056bfae114610291578063098b0eaa146102b157806318cbafe5146102d157600080fd5b3661025257336001600160a01b037f0000000000000000000000004f9a0e7fd2bf6067db6994cf12e4495df938e6e916146102505761025061372e565b005b600080fd5b34801561026357600080fd5b50610277610272366004613759565b61078f565b604080519283526020830191909152015b60405180910390f35b34801561029d57600080fd5b506102506102ac3660046137c5565b6108e8565b3480156102bd57600080fd5b506102506102cc3660046137c5565b610903565b3480156102dd57600080fd5b506102f16102ec36600461382e565b610927565b60405161028891906138a1565b34801561030a57600080fd5b5060035461031e9062010000900460ff1681565b6040519015158152602001610288565b34801561033a57600080fd5b506102f161034936600461382e565b610bb4565b34801561035a57600080fd5b5060035461031e90610100900460ff1681565b34801561037957600080fd5b506102506103883660046138e5565b610c6a565b34801561039957600080fd5b506103ad6103a836600461391e565b610c9d565b604080516001600160a01b03938416815292909116602083015201610288565b3480156103d957600080fd5b506102506103e83660046137c5565b610d28565b3480156103f957600080fd5b5061025061040836600461382e565b610d4a565b34801561041957600080fd5b5061042d61042836600461394c565b610fb2565b604051908152602001610288565b34801561044757600080fd5b5061031e61045636600461398e565b60016020526000908152604090205460ff1681565b34801561047757600080fd5b506102506110cf565b34801561048c57600080fd5b5061025061049b36600461382e565b6110e3565b3480156104ac57600080fd5b506104d47f0000000000000000000000004f9a0e7fd2bf6067db6994cf12e4495df938e6e981565b6040516001600160a01b039091168152602001610288565b6102f16104fa3660046139ab565b61131c565b34801561050b57600080fd5b506000546001600160a01b03166104d4565b34801561052957600080fd5b506104d461053836600461391e565b6115cd565b34801561054957600080fd5b506102f1610558366004613a82565b6116e8565b34801561056957600080fd5b5061025061057836600461398e565b61194d565b34801561058957600080fd5b50610250610598366004613b7d565b611976565b3480156105a957600080fd5b5060035461031e9060ff1681565b3480156105c357600080fd5b506102506105d236600461398e565b611a3c565b3480156105e357600080fd5b507f0000000000000000000000004f9a0e7fd2bf6067db6994cf12e4495df938e6e96104d4565b34801561061657600080fd5b5061042d610625366004613759565b611a68565b34801561063657600080fd5b5061031e61064536600461398e565b60026020526000908152604090205460ff1681565b6102506106683660046139ab565b611c27565b34801561067957600080fd5b50610277610688366004613be9565b611f4e565b34801561069957600080fd5b506104d47f000000000000000000000000ce87e0960f4e2702f4bffe277655e993ae720e8481565b3480156106cd57600080fd5b506102f16106dc366004613c5b565b612139565b3480156106ed57600080fd5b506102776106fc36600461391e565b612175565b34801561070d57600080fd5b5061031e61071c36600461398e565b61222b565b34801561072d57600080fd5b5061074161073c366004613ca7565b6122c0565b60408051938452602084019290925290820152606001610288565b34801561076857600080fd5b5061025061077736600461398e565b6123e2565b61074161078a366004613759565b612460565b6003546000908190839060ff1680156107a757504281105b156107c557604051631ab7da6b60e01b815260040160405180910390fd5b6107ef897f0000000000000000000000004f9a0e7fd2bf6067db6994cf12e4495df938e6e9612723565b61081e897f0000000000000000000000004f9a0e7fd2bf6067db6994cf12e4495df938e6e98a8a8a308a611f4e565b909350915061082e89868561293c565b604051632e1a7d4d60e01b8152600481018390527f0000000000000000000000004f9a0e7fd2bf6067db6994cf12e4495df938e6e96001600160a01b031690632e1a7d4d90602401600060405180830381600087803b15801561089057600080fd5b505af11580156108a4573d6000803e3d6000fd5b505050506108b285836129fe565b6108dc897f0000000000000000000000004f9a0e7fd2bf6067db6994cf12e4495df938e6e9612a8c565b50965096945050505050565b6108f0612c73565b6003805460ff1916911515919091179055565b61090b612c73565b60038054911515620100000262ff000019909216919091179055565b600354606090829060ff16801561093d57504281105b1561095b57604051631ab7da6b60e01b815260040160405180910390fd5b6001600160a01b037f0000000000000000000000004f9a0e7fd2bf6067db6994cf12e4495df938e6e9168686610992600182613d39565b8181106109a1576109a1613d4c565b90506020020160208101906109b6919061398e565b6001600160a01b0316146109dd576040516320db826760e01b815260040160405180910390fd5b60006109e98787612ccd565b90506109f589826116e8565b9250878360018551610a079190613d39565b81518110610a1757610a17613d4c565b60200260200101511015610a3e576040516342301c2360e01b815260040160405180910390fd5b610ac781600081518110610a5457610a54613d4c565b60200260200101516000015133610aa784600081518110610a7757610a77613d4c565b60200260200101516000015185600081518110610a9657610a96613d4c565b6020026020010151602001516115cd565b86600081518110610aba57610aba613d4c565b6020026020010151612e77565b610ad2838230612f41565b7f0000000000000000000000004f9a0e7fd2bf6067db6994cf12e4495df938e6e96001600160a01b0316632e1a7d4d8460018651610b109190613d39565b81518110610b2057610b20613d4c565b60200260200101516040518263ffffffff1660e01b8152600401610b4691815260200190565b600060405180830381600087803b158015610b6057600080fd5b505af1158015610b74573d6000803e3d6000fd5b50505050610ba8858460018651610b8b9190613d39565b81518110610b9b57610b9b613d4c565b60200260200101516129fe565b50509695505050505050565b600354606090829060ff168015610bca57504281105b15610be857604051631ab7da6b60e01b815260040160405180910390fd5b6000610bf48787612ccd565b9050610c0089826116e8565b9250878360018551610c129190613d39565b81518110610c2257610c22613d4c565b60200260200101511015610c49576040516342301c2360e01b815260040160405180910390fd5b610c5f81600081518110610a5457610a54613d4c565b610ba8838287612f41565b610c72612c73565b6001600160a01b03919091166000908152600160205260409020805460ff1916911515919091179055565b600080826001600160a01b0316846001600160a01b031603610cd257604051630bd969eb60e41b815260040160405180910390fd5b826001600160a01b0316846001600160a01b031610610cf2578284610cf5565b83835b90925090506001600160a01b038216610d215760405163d92e233d60e01b815260040160405180910390fd5b9250929050565b610d30612c73565b600380549115156101000261ff0019909216919091179055565b600354819060ff168015610d5d57504281105b15610d7b57604051631ab7da6b60e01b815260040160405180910390fd5b610e0085856000818110610d9157610d91613d4c565b9050602002016020810190610da6919061398e565b33610dfa88886000818110610dbd57610dbd613d4c565b9050602002016020810190610dd2919061398e565b89896001818110610de557610de5613d4c565b9050602002016020810190610538919061398e565b8a612e77565b60008585610e0f600182613d39565b818110610e1e57610e1e613d4c565b9050602002016020810190610e33919061398e565b6040516370a0823160e01b81526001600160a01b03868116600483015291909116906370a0823190602401602060405180830381865afa158015610e7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e9f9190613d62565b9050610edf868680806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250889250613148915050565b86818787610eee600182613d39565b818110610efd57610efd613d4c565b9050602002016020810190610f12919061398e565b6040516370a0823160e01b81526001600160a01b03888116600483015291909116906370a08231906024015b602060405180830381865afa158015610f5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f7f9190613d62565b610f899190613d39565b1015610fa8576040516342301c2360e01b815260040160405180910390fd5b5050505050505050565b600080610fbf84846115cd565b60405163e5e31b1360e01b81526001600160a01b0380831660048301529192507f000000000000000000000000ce87e0960f4e2702f4bffe277655e993ae720e849091169063e5e31b1390602401602060405180830381865afa15801561102a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061104e9190613d7b565b156110c7576040516378a051ad60e11b8152600481018690526001600160a01b03858116602483015282169063f140a35a90604401602060405180830381865afa1580156110a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110c49190613d62565b91505b509392505050565b6110d7612c73565b6110e160006133e9565b565b600354819060ff1680156110f657504281105b1561111457604051631ab7da6b60e01b815260040160405180910390fd5b6001600160a01b037f0000000000000000000000004f9a0e7fd2bf6067db6994cf12e4495df938e6e916858561114b600182613d39565b81811061115a5761115a613d4c565b905060200201602081019061116f919061398e565b6001600160a01b031614611196576040516320db826760e01b815260040160405180910390fd5b6111ac85856000818110610d9157610d91613d4c565b6111ea858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613148915050565b6040516370a0823160e01b81523060048201526000907f0000000000000000000000004f9a0e7fd2bf6067db6994cf12e4495df938e6e96001600160a01b0316906370a0823190602401602060405180830381865afa158015611251573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112759190613d62565b905086811015611298576040516342301c2360e01b815260040160405180910390fd5b604051632e1a7d4d60e01b8152600481018290527f0000000000000000000000004f9a0e7fd2bf6067db6994cf12e4495df938e6e96001600160a01b031690632e1a7d4d90602401600060405180830381600087803b1580156112fa57600080fd5b505af115801561130e573d6000803e3d6000fd5b50505050610fa884826129fe565b600354606090829060ff16801561133257504281105b1561135057604051631ab7da6b60e01b815260040160405180910390fd5b7f0000000000000000000000004f9a0e7fd2bf6067db6994cf12e4495df938e6e96001600160a01b03168686600081811061138d5761138d613d4c565b90506020020160208101906113a2919061398e565b6001600160a01b0316146113c9576040516320db826760e01b815260040160405180910390fd5b60006113d58787612ccd565b90506113e134826116e8565b92508783600185516113f39190613d39565b8151811061140357611403613d4c565b6020026020010151101561142a576040516342301c2360e01b815260040160405180910390fd5b7f0000000000000000000000004f9a0e7fd2bf6067db6994cf12e4495df938e6e96001600160a01b031663d0e30db08460008151811061146c5761146c613d4c565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561149f57600080fd5b505af11580156114b3573d6000803e3d6000fd5b50505050507f0000000000000000000000004f9a0e7fd2bf6067db6994cf12e4495df938e6e96001600160a01b031663a9059cbb61151c836000815181106114fd576114fd613d4c565b60200260200101516000015184600081518110610a9657610a96613d4c565b8560008151811061152f5761152f613d4c565b60200260200101516040518363ffffffff1660e01b81526004016115689291906001600160a01b03929092168252602082015260400190565b6020604051808303816000875af1158015611587573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115ab9190613d7b565b6115b7576115b761372e565b6115c2838287612f41565b505095945050505050565b60008060006115dc8585610c9d565b915091506000600160006115f285856001613439565b6001600160a01b03168152602080820192909252604090810160002054905160ff90911692507f000000000000000000000000ce87e0960f4e2702f4bffe277655e993ae720e849161164a9186918691869101613d98565b604051602081830303815290604052805190602001207f28086d29c039f716c897e0615045599a42ea0133fa059e92faff694d05cfcd496040516020016116c6939291906001600160f81b0319815260609390931b6bffffffffffffffffffffffff191660018401526015830191909152603582015260550190565b60408051601f1981840301815291905280516020909101209695505050505050565b606060018251101561170d576040516320db826760e01b815260040160405180910390fd5b815161171a906001613dcb565b67ffffffffffffffff81111561173257611732613a12565b60405190808252806020026020018201604052801561175b578160200160208202803683370190505b509050828160008151811061177257611772613d4c565b60200260200101818152505060005b82518110156119465760006117bf8483815181106117a1576117a1613d4c565b602002602001015160000151858481518110610a9657610a96613d4c565b60405163e5e31b1360e01b81526001600160a01b0380831660048301529192507f000000000000000000000000ce87e0960f4e2702f4bffe277655e993ae720e849091169063e5e31b1390602401602060405180830381865afa15801561182a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061184e9190613d7b565b1561193357806001600160a01b031663f140a35a84848151811061187457611874613d4c565b602002602001015186858151811061188e5761188e613d4c565b6020026020010151600001516040518363ffffffff1660e01b81526004016118c99291909182526001600160a01b0316602082015260400190565b602060405180830381865afa1580156118e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061190a9190613d62565b83611916846001613dcb565b8151811061192657611926613d4c565b6020026020010181815250505b508061193e81613dde565b915050611781565b5092915050565b611955612c73565b6001600160a01b03166000908152600260205260409020805460ff19169055565b61197e612c73565b82811461199e5760405163512509d360e11b815260040160405180910390fd5b60005b83811015611a35578282828181106119bb576119bb613d4c565b90506020020160208101906119d091906137c5565b600160008787858181106119e6576119e6613d4c565b90506020020160208101906119fb919061398e565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580611a2d81613dde565b9150506119a1565b5050505050565b611a44612c73565b6001600160a01b03166000908152600260205260409020805460ff19166001179055565b600354600090829060ff168015611a7e57504281105b15611a9c57604051631ab7da6b60e01b815260040160405180910390fd5b611ac6887f0000000000000000000000004f9a0e7fd2bf6067db6994cf12e4495df938e6e9612723565b611af5887f0000000000000000000000004f9a0e7fd2bf6067db6994cf12e4495df938e6e98989893089611f4e565b6040516370a0823160e01b8152306004820152909350611b6e9150899086906001600160a01b038316906370a0823190602401602060405180830381865afa158015611b45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b699190613d62565b61293c565b604051632e1a7d4d60e01b8152600481018390527f0000000000000000000000004f9a0e7fd2bf6067db6994cf12e4495df938e6e96001600160a01b031690632e1a7d4d90602401600060405180830381600087803b158015611bd057600080fd5b505af1158015611be4573d6000803e3d6000fd5b50505050611bf284836129fe565b611c1c887f0000000000000000000000004f9a0e7fd2bf6067db6994cf12e4495df938e6e9612a8c565b509695505050505050565b600354819060ff168015611c3a57504281105b15611c5857604051631ab7da6b60e01b815260040160405180910390fd5b7f0000000000000000000000004f9a0e7fd2bf6067db6994cf12e4495df938e6e96001600160a01b031685856000818110611c9557611c95613d4c565b9050602002016020810190611caa919061398e565b6001600160a01b031614611cd1576040516320db826760e01b815260040160405180910390fd5b60003490507f0000000000000000000000004f9a0e7fd2bf6067db6994cf12e4495df938e6e96001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015611d3157600080fd5b505af1158015611d45573d6000803e3d6000fd5b50505050507f0000000000000000000000004f9a0e7fd2bf6067db6994cf12e4495df938e6e96001600160a01b031663a9059cbb611d8f88886000818110610dbd57610dbd613d4c565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303816000875af1158015611ddc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e009190613d7b565b611e0c57611e0c61372e565b60008686611e1b600182613d39565b818110611e2a57611e2a613d4c565b9050602002016020810190611e3f919061398e565b6040516370a0823160e01b81526001600160a01b03878116600483015291909116906370a0823190602401602060405180830381865afa158015611e87573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611eab9190613d62565b9050611eeb878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613148915050565b87818888611efa600182613d39565b818110611f0957611f09613d4c565b9050602002016020810190611f1e919061398e565b6040516370a0823160e01b81526001600160a01b03898116600483015291909116906370a0823190602401610f3e565b6003546000908190839060ff168015611f6657504281105b15611f8457604051631ab7da6b60e01b815260040160405180910390fd5b611f8e8a8a612723565b6000611f9a8b8b6115cd565b6040516323b872dd60e01b81523360048201526001600160a01b03821660248201819052604482018c90529192506323b872dd906064016020604051808303816000875af1158015611ff0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120149190613d7b565b612031576040516312171d8360e31b815260040160405180910390fd5b60405163226bf2d160e21b81526001600160a01b03878116600483015260009182918416906389afcb449060240160408051808303816000875af115801561207d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120a19190613df7565b9150915060006120b18e8e610c9d565b509050806001600160a01b03168e6001600160a01b0316146120d45781836120d7565b82825b90975095508a8710156120fd57604051638dc525d160e01b815260040160405180910390fd5b8986101561211e5760405163ef71d09160e01b815260040160405180910390fd5b6121288e8e612a8c565b505050505097509795505050505050565b6060600282101561215d576040516320db826760e01b815260040160405180910390fd5b60006121698484612ccd565b90506110c485826116e8565b60008060006121848585610c9d565b50905060008061219487876115cd565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa1580156121d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121f59190613e1b565b5091509150826001600160a01b0316876001600160a01b03161461221a57808261221d565b81815b909890975095505050505050565b60405163e5e31b1360e01b81526001600160a01b0382811660048301526000917f000000000000000000000000ce87e0960f4e2702f4bffe277655e993ae720e849091169063e5e31b1390602401602060405180830381865afa158015612296573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122ba9190613d7b565b92915050565b60035460009081908190849060ff1680156122da57504281105b156122f857604051631ab7da6b60e01b815260040160405180910390fd5b6123028c8c612723565b600061230e8d8d6115cd565b6001600160a01b03811660009081526001602052604090205490915060ff1661233c8e8e838f8f8f8f613482565b909650945061234d8e338489612e77565b6123598d338488612e77565b6040516335313c2160e11b81526001600160a01b038981166004830152831690636a627842906024016020604051808303816000875af11580156123a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123c59190613d62565b93506123d18e8e612a8c565b505050985098509895505050505050565b6123ea612c73565b6001600160a01b0381166124545760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b61245d816133e9565b50565b60035460009081908190849060ff16801561247a57504281105b1561249857604051631ab7da6b60e01b815260040160405180910390fd5b6124c28a7f0000000000000000000000004f9a0e7fd2bf6067db6994cf12e4495df938e6e9612723565b60006124ee8b7f0000000000000000000000004f9a0e7fd2bf6067db6994cf12e4495df938e6e96115cd565b6001600160a01b03811660009081526001602052604090205490915060ff1661253c8c7f0000000000000000000000004f9a0e7fd2bf6067db6994cf12e4495df938e6e9838e348f8f613482565b909650945061254d8c338489612e77565b7f0000000000000000000000004f9a0e7fd2bf6067db6994cf12e4495df938e6e96001600160a01b031663d0e30db0866040518263ffffffff1660e01b81526004016000604051808303818588803b1580156125a857600080fd5b505af11580156125bc573d6000803e3d6000fd5b505060405163a9059cbb60e01b81526001600160a01b038681166004830152602482018a90527f0000000000000000000000004f9a0e7fd2bf6067db6994cf12e4495df938e6e916935063a9059cbb925060440190506020604051808303816000875af1158015612631573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126559190613d7b565b6126615761266161372e565b6040516335313c2160e11b81526001600160a01b038981166004830152831690636a627842906024016020604051808303816000875af11580156126a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126cd9190613d62565b9350843411156126ea576126ea336126e58734613d39565b6129fe565b6127148c7f0000000000000000000000004f9a0e7fd2bf6067db6994cf12e4495df938e6e9612a8c565b50505096509650969350505050565b600354610100900460ff16612736575050565b60035462010000900460ff16158061276657506001600160a01b03821660009081526002602052604090205460ff165b15612839576040516337e26cd160e21b815230600482015282906001600160a01b0382169063df89b344906024016020604051808303816000875af19250505080156127cf575060408051601f3d908101601f191682019092526127cc91810190613d7b565b60015b156128375780156128355760405163bd7d67e960e01b8152600160048201526001600160a01b0383169063bd7d67e990602401600060405180830381600087803b15801561281c57600080fd5b505af1158015612830573d6000803e3d6000fd5b505050505b505b505b60035462010000900460ff16158061286957506001600160a01b03811660009081526002602052604090205460ff165b15612938576040516337e26cd160e21b815230600482015281906001600160a01b0382169063df89b344906024016020604051808303816000875af19250505080156128d2575060408051601f3d908101601f191682019092526128cf91810190613d7b565b60015b156129365780156129345760405163bd7d67e960e01b8152600160048201526001600160a01b0383169063bd7d67e9906024015b600060405180830381600087803b15801561292057600080fd5b505af1158015610fa8573d6000803e3d6000fd5b505b505b5050565b826001600160a01b03163b6000036129675760405163c1ab6dc160e01b815260040160405180910390fd5b60405163a9059cbb60e01b81526001600160a01b038381166004830152602482018390526000919085169063a9059cbb906044016020604051808303816000875af11580156129ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129de9190613d7b565b905080612934576040516312171d8360e31b815260040160405180910390fd5b604080516000808252602082019092526001600160a01b038416908390604051612a289190613e6d565b60006040518083038185875af1925050503d8060008114612a65576040519150601f19603f3d011682016040523d82523d6000602084013e612a6a565b606091505b505090508061293657604051631db12dd560e21b815260040160405180910390fd5b600354610100900460ff16612a9f575050565b60035462010000900460ff161580612acf57506001600160a01b03821660009081526002602052604090205460ff165b15612ba2576040516337e26cd160e21b815230600482015282906001600160a01b0382169063df89b344906024016020604051808303816000875af1925050508015612b38575060408051601f3d908101601f19168201909252612b3591810190613d7b565b60015b15612ba0578015612b9e5760405163bd7d67e960e01b8152600060048201526001600160a01b0383169063bd7d67e990602401600060405180830381600087803b158015612b8557600080fd5b505af1158015612b99573d6000803e3d6000fd5b505050505b505b505b60035462010000900460ff161580612bd257506001600160a01b03811660009081526002602052604090205460ff165b15612938576040516337e26cd160e21b815230600482015281906001600160a01b0382169063df89b344906024016020604051808303816000875af1925050508015612c3b575060408051601f3d908101601f19168201909252612c3891810190613d7b565b60015b156129365780156129345760405163bd7d67e960e01b8152600060048201526001600160a01b0383169063bd7d67e990602401612906565b6000546001600160a01b031633146110e15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161244b565b6060612cda600183613d39565b67ffffffffffffffff811115612cf257612cf2613a12565b604051908082528060200260200182016040528015612d3d57816020015b6040805160608101825260008082526020808301829052928201528252600019909201910181612d105790505b50905060005b612d4e600184613d39565b81101561194657600060016000612da1878786818110612d7057612d70613d4c565b9050602002016020810190612d85919061398e565b8888612d92886001613dcb565b818110610de557610de5613d4c565b6001600160a01b03168152602081019190915260409081016000205481516060810190925260ff16915080868685818110612dde57612dde613d4c565b9050602002016020810190612df3919061398e565b6001600160a01b031681526020018686612e0e866001613dcb565b818110612e1d57612e1d613d4c565b9050602002016020810190612e32919061398e565b6001600160a01b03168152602001821515815250838381518110612e5857612e58613d4c565b6020026020010181905250508080612e6f90613dde565b915050612d43565b836001600160a01b03163b600003612ea25760405163c1ab6dc160e01b815260040160405180910390fd5b6040516323b872dd60e01b81526001600160a01b038481166004830152838116602483015260448201839052600091908616906323b872dd906064016020604051808303816000875af1158015612efd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f219190613d7b565b905080611a35576040516312171d8360e31b815260040160405180910390fd5b60005b8251811015612934576000612f93848381518110612f6457612f64613d4c565b602002602001015160000151858481518110612f8257612f82613d4c565b602002602001015160200151610c9d565b509050600085612fa4846001613dcb565b81518110612fb457612fb4613d4c565b60200260200101519050600080836001600160a01b0316878681518110612fdd57612fdd613d4c565b6020026020010151600001516001600160a01b031614612fff57826000613003565b6000835b915091506000600188516130179190613d39565b8610613023578661306c565b61306c88613032886001613dcb565b8151811061304257613042613d4c565b6020026020010151600001518988600161305c9190613dcb565b81518110610a9657610a96613d4c565b90506130a188878151811061308357613083613d4c565b602002602001015160000151898881518110610a9657610a96613d4c565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f1916602001820160405280156130de576020820181803683370190505b506040518563ffffffff1660e01b81526004016130fe9493929190613e89565b600060405180830381600087803b15801561311857600080fd5b505af115801561312c573d6000803e3d6000fd5b505050505050505050808061314090613dde565b915050612f44565b60005b600183516131599190613d39565b8110156129365760008084838151811061317557613175613d4c565b60200260200101518584600161318b9190613dcb565b8151811061319b5761319b613d4c565b60200260200101519150915060006131b38383610c9d565b50905060006131c284846115cd565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015613208573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061322c9190613e1b565b50915091506000866001600160a01b0316896001600160a01b031614613253578183613256565b82825b506040516370a0823160e01b81526001600160a01b03888116600483015291925082918b16906370a0823190602401602060405180830381865afa1580156132a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132c69190613d62565b6132d09190613d39565b94506132dd858a8a610fb2565b9350505050600080856001600160a01b0316886001600160a01b0316146133065782600061330a565b6000835b91509150600060028c5161331e9190613d39565b8a101561335957613352888d6133358d6002613dcb565b8151811061334557613345613d4c565b60200260200101516115cd565b905061335c565b50895b6040805160008152602081019182905263022c0d9f60e01b9091526001600160a01b0387169063022c0d9f9061339b9086908690869060248101613e89565b600060405180830381600087803b1580156133b557600080fd5b505af11580156133c9573d6000803e3d6000fd5b5050505050505050505050505080806133e190613dde565b91505061314b565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60008060006134488686610c9d565b915091507f000000000000000000000000ce87e0960f4e2702f4bffe277655e993ae720e8482828660405160200161164a93929190613d98565b6000808386108061349257508285105b156134b05760405163162908e360e11b815260040160405180910390fd5b6040516306801cc360e41b81526001600160a01b038a81166004830152898116602483015288151560448301526000917f000000000000000000000000ce87e0960f4e2702f4bffe277655e993ae720e8490911690636801cc3090606401602060405180830381865afa15801561352b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061354f9190613ed9565b90506001600160a01b0381166135fe576040516320b7f73960e21b81526001600160a01b038b811660048301528a8116602483015289151560448301527f000000000000000000000000ce87e0960f4e2702f4bffe277655e993ae720e8416906382dfdce4906064016020604051808303816000875af11580156135d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135fb9190613ed9565b90505b60008061360b8c8c612175565b9150915081600014801561361d575080155b1561362d578894508793506136b7565b600061363a8a84846136c6565b905088811161366f57868110156136645760405163ef71d09160e01b815260040160405180910390fd5b8995509350836136b5565b600061367c8a84866136c6565b90508a81111561368e5761368e61372e565b888110156136af57604051638dc525d160e01b815260040160405180910390fd5b95508894505b505b50505097509795505050505050565b60008084116136e857604051632ca2f52b60e11b815260040160405180910390fd5b8215806136f3575081155b156137115760405163bb55fd2760e01b815260040160405180910390fd5b8261371c8386613ef6565b6137269190613f0d565b949350505050565b634e487b7160e01b600052600160045260246000fd5b6001600160a01b038116811461245d57600080fd5b60008060008060008060c0878903121561377257600080fd5b863561377d81613744565b955060208701359450604087013593506060870135925060808701356137a281613744565b8092505060a087013590509295509295509295565b801515811461245d57600080fd5b6000602082840312156137d757600080fd5b81356137e2816137b7565b9392505050565b60008083601f8401126137fb57600080fd5b50813567ffffffffffffffff81111561381357600080fd5b6020830191508360208260051b8501011115610d2157600080fd5b60008060008060008060a0878903121561384757600080fd5b8635955060208701359450604087013567ffffffffffffffff81111561386c57600080fd5b61387889828a016137e9565b909550935050606087013561388c81613744565b80925050608087013590509295509295509295565b6020808252825182820181905260009190848201906040850190845b818110156138d9578351835292840192918401916001016138bd565b50909695505050505050565b600080604083850312156138f857600080fd5b823561390381613744565b91506020830135613913816137b7565b809150509250929050565b6000806040838503121561393157600080fd5b823561393c81613744565b9150602083013561391381613744565b60008060006060848603121561396157600080fd5b83359250602084013561397381613744565b9150604084013561398381613744565b809150509250925092565b6000602082840312156139a057600080fd5b81356137e281613744565b6000806000806000608086880312156139c357600080fd5b85359450602086013567ffffffffffffffff8111156139e157600080fd5b6139ed888289016137e9565b9095509350506040860135613a0181613744565b949793965091946060013592915050565b634e487b7160e01b600052604160045260246000fd5b6040516060810167ffffffffffffffff81118282101715613a4b57613a4b613a12565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715613a7a57613a7a613a12565b604052919050565b6000806040808486031215613a9657600080fd5b8335925060208085013567ffffffffffffffff80821115613ab657600080fd5b818701915087601f830112613aca57600080fd5b813581811115613adc57613adc613a12565b613aea848260051b01613a51565b8181528481019250606091820284018501918a831115613b0957600080fd5b938501935b82851015613b6c5780858c031215613b265760008081fd5b613b2e613a28565b8535613b3981613744565b815285870135613b4881613744565b8188015285880135613b59816137b7565b8189015284529384019392850192613b0e565b508096505050505050509250929050565b60008060008060408587031215613b9357600080fd5b843567ffffffffffffffff80821115613bab57600080fd5b613bb7888389016137e9565b90965094506020870135915080821115613bd057600080fd5b50613bdd878288016137e9565b95989497509550505050565b600080600080600080600060e0888a031215613c0457600080fd5b8735613c0f81613744565b96506020880135613c1f81613744565b955060408801359450606088013593506080880135925060a0880135613c4481613744565b8092505060c0880135905092959891949750929550565b600080600060408486031215613c7057600080fd5b83359250602084013567ffffffffffffffff811115613c8e57600080fd5b613c9a868287016137e9565b9497909650939450505050565b600080600080600080600080610100898b031215613cc457600080fd5b8835613ccf81613744565b97506020890135613cdf81613744565b965060408901359550606089013594506080890135935060a0890135925060c0890135613d0b81613744565b8092505060e089013590509295985092959890939650565b634e487b7160e01b600052601160045260246000fd5b818103818111156122ba576122ba613d23565b634e487b7160e01b600052603260045260246000fd5b600060208284031215613d7457600080fd5b5051919050565b600060208284031215613d8d57600080fd5b81516137e2816137b7565b6bffffffffffffffffffffffff19606094851b811682529290931b9091166014830152151560f81b602882015260290190565b808201808211156122ba576122ba613d23565b600060018201613df057613df0613d23565b5060010190565b60008060408385031215613e0a57600080fd5b505080516020909101519092909150565b600080600060608486031215613e3057600080fd5b8351925060208401519150604084015190509250925092565b60005b83811015613e64578181015183820152602001613e4c565b50506000910152565b60008251613e7f818460208701613e49565b9190910192915050565b84815283602082015260018060a01b03831660408201526080606082015260008251806080840152613ec28160a0850160208701613e49565b601f01601f19169190910160a00195945050505050565b600060208284031215613eeb57600080fd5b81516137e281613744565b80820281158282048414176122ba576122ba613d23565b600082613f2a57634e487b7160e01b600052601260045260246000fd5b50049056fea26469706673582212202e016813496ad0b4c738836e30897bee7e4d7ed2b9b7a2e06b10b1433c2e92e764736f6c63430008110033

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

000000000000000000000000ce87e0960f4e2702f4bffe277655e993ae720e840000000000000000000000004f9a0e7fd2bf6067db6994cf12e4495df938e6e9

-----Decoded View---------------
Arg [0] : _factory (address): 0xcE87E0960f4e2702f4bFFE277655E993Ae720e84
Arg [1] : _wcanto (address): 0x4F9A0e7FD2Bf6067db6994CF12E4495Df938E6e9

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000ce87e0960f4e2702f4bffe277655e993ae720e84
Arg [1] : 0000000000000000000000004f9a0e7fd2bf6067db6994cf12e4495df938e6e9


Deployed Bytecode Sourcemap

370:25131:3:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1911:10;-1:-1:-1;;;;;1933:6:3;1911:29;;1904:37;;;;:::i;:::-;370:25131;;;;;22050:791;;;;;;;;;;-1:-1:-1;22050:791:3;;;;;:::i;:::-;;:::i;:::-;;;;1124:25:9;;;1180:2;1165:18;;1158:34;;;;1097:18;22050:791:3;;;;;;;;24778:105;;;;;;;;;;-1:-1:-1;24778:105:3;;;;;:::i;:::-;;:::i;25022:165::-;;;;;;;;;;-1:-1:-1;25022:165:3;;;;;:::i;:::-;;:::i;12061:883::-;;;;;;;;;;-1:-1:-1;12061:883:3;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;890:47::-;;;;;;;;;;-1:-1:-1;890:47:3;;;;;;;;;;;;;;3529:14:9;;3522:22;3504:41;;3492:2;3477:18;890:47:3;3364:187:9;10696:662:3;;;;;;;;;;-1:-1:-1;10696:662:3;;;;;:::i;:::-;;:::i;846:38::-;;;;;;;;;;-1:-1:-1;846:38:3;;;;;;;;;;;24351:112;;;;;;;;;;-1:-1:-1;24351:112:3;;;;;:::i;:::-;;:::i;4950:361::-;;;;;;;;;;-1:-1:-1;4950:361:3;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;4566:15:9;;;4548:34;;4618:15;;;;4613:2;4598:18;;4591:43;4483:18;4950:361:3;4336:304:9;24889:127:3;;;;;;;;;;-1:-1:-1;24889:127:3;;;;;:::i;:::-;;:::i;14461:700::-;;;;;;;;;;-1:-1:-1;14461:700:3;;;;;:::i;:::-;;:::i;7415:342::-;;;;;;;;;;-1:-1:-1;7415:342:3;;;;;:::i;:::-;;:::i;:::-;;;5252:25:9;;;5240:2;5225:18;7415:342:3;5106:177:9;694:43:3;;;;;;;;;;-1:-1:-1;694:43:3;;;;;:::i;:::-;;;;;;;;;;;;;;;;1831:101:0;;;;;;;;;;;;;:::i;15940:811:3:-;;;;;;;;;;-1:-1:-1;15940:811:3;;;;;:::i;:::-;;:::i;563:31::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5720:32:9;;;5702:51;;5690:2;5675:18;563:31:3;5540:219:9;11364:691:3;;;;;;:::i;:::-;;:::i;1201:85:0:-;;;;;;;;;;-1:-1:-1;1247:7:0;1273:6;-1:-1:-1;;;;;1273:6:0;1201:85;;6062:771:3;;;;;;;;;;-1:-1:-1;6062:771:3;;;;;:::i;:::-;;:::i;7836:641::-;;;;;;;;;;-1:-1:-1;7836:641:3;;;;;:::i;:::-;;:::i;25337:162::-;;;;;;;;;;-1:-1:-1;25337:162:3;;;;;:::i;:::-;;:::i;24469:303::-;;;;;;;;;;-1:-1:-1;24469:303:3;;;;;:::i;:::-;;:::i;813:27::-;;;;;;;;;;-1:-1:-1;813:27:3;;;;;;;;25193:138;;;;;;;;;;-1:-1:-1;25193:138:3;;;;;:::i;:::-;;:::i;4857:87::-;;;;;;;;;;-1:-1:-1;4930:6:3;4857:87;;22917:795;;;;;;;;;;-1:-1:-1;22917:795:3;;;;;:::i;:::-;;:::i;743:64::-;;;;;;;;;;-1:-1:-1;743:64:3;;;;;:::i;:::-;;;;;;;;;;;;;;;;15167:767;;;;;;:::i;:::-;;:::i;21073:971::-;;;;;;;;;;-1:-1:-1;21073:971:3;;;;;:::i;:::-;;:::i;525:32::-;;;;;;;;;;;;;;;8514:303;;;;;;;;;;-1:-1:-1;8514:303:3;;;;;:::i;:::-;;:::i;6888:448::-;;;;;;;;;;-1:-1:-1;6888:448:3;;;;;:::i;:::-;;:::i;9269:121::-;;;;;;;;;;-1:-1:-1;9269:121:3;;;;;:::i;:::-;;:::i;18615:1001::-;;;;;;;;;;-1:-1:-1;18615:1001:3;;;;;:::i;:::-;;:::i;:::-;;;;12181:25:9;;;12237:2;12222:18;;12215:34;;;;12265:18;;;12258:34;12169:2;12154:18;18615:1001:3;11979:319:9;2081:198:0;;;;;;;;;;-1:-1:-1;2081:198:0;;;;;:::i;:::-;;:::i;19622:1220:3:-;;;;;;:::i;:::-;;:::i;22050:791::-;1474:15;;22301:19;;;;22274:8;;1474:15;;:45;;;;;1504:15;1493:8;:26;1474:45;1470:87;;;1540:17;;-1:-1:-1;;;1540:17:3;;;;;;;;;;;1470:87;22357:49:::1;22383:5;22398:6;22357:25;:49::i;:::-;22446:201;22475:5;22502:6;22523:9;22546:14;22574;22610:4;22629:8;22446:15;:201::i;:::-;22417:230:::0;;-1:-1:-1;22417:230:3;-1:-1:-1;22657:37:3::1;22671:5:::0;22678:2;22417:230;22657:13:::1;:37::i;:::-;22704:28;::::0;-1:-1:-1;;;22704:28:3;;::::1;::::0;::::1;5252:25:9::0;;;22704:6:3::1;-1:-1:-1::0;;;;;22704:15:3::1;::::0;::::1;::::0;5225:18:9;;22704:28:3::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;22742:33;22759:2;22763:11;22742:16;:33::i;:::-;22786:48;22811:5;22826:6;22786:24;:48::i;:::-;22050:791:::0;;;;;;;;;;:::o;24778:105::-;1094:13:0;:11;:13::i;:::-;24850:15:3::1;:26:::0;;-1:-1:-1;;24850:26:3::1;::::0;::::1;;::::0;;;::::1;::::0;;24778:105::o;25022:165::-;1094:13:0;:11;:13::i;:::-;25134:35:3::1;:46:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;25134:46:3;;::::1;::::0;;;::::1;::::0;;25022:165::o;12061:883::-;1474:15;;12268:24;;12249:8;;1474:15;;:45;;;;;1504:15;1493:8;:26;1474:45;1470:87;;;1540:17;;-1:-1:-1;;;1540:17:3;;;;;;;;;;;1470:87;-1:-1:-1;;;;;12341:6:3::1;12308:40;:4:::0;;12313:15:::1;12327:1;12308:4:::0;12313:15:::1;:::i;:::-;12308:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;12308:40:3::1;;12304:91;;12371:13;;-1:-1:-1::0;;;12371:13:3::1;;;;;;;;;;;12304:91;12404:21;12428:19;12442:4;;12428:13;:19::i;:::-;12404:43;;12467:31;12481:8;12491:6;12467:13;:31::i;:::-;12457:41;;12542:12;12512:7;12537:1;12520:7;:14;:18;;;;:::i;:::-;12512:27;;;;;;;;:::i;:::-;;;;;;;:42;12508:106;;;12577:26;;-1:-1:-1::0;;;12577:26:3::1;;;;;;;;;;;12508:106;12623:154;12654:6;12661:1;12654:9;;;;;;;;:::i;:::-;;;;;;;:14;;;12682:10;12706:37;12714:6;12721:1;12714:9;;;;;;;;:::i;:::-;;;;;;;:14;;;12730:6;12737:1;12730:9;;;;;;;;:::i;:::-;;;;;;;:12;;;12706:7;:37::i;:::-;12757:7;12765:1;12757:10;;;;;;;;:::i;:::-;;;;;;;12623:17;:154::i;:::-;12787:37;12793:7;12802:6;12818:4;12787:5;:37::i;:::-;12834:6;-1:-1:-1::0;;;;;12834:15:3::1;;12850:7;12875:1;12858:7;:14;:18;;;;:::i;:::-;12850:27;;;;;;;;:::i;:::-;;;;;;;12834:44;;;;;;;;;;;;;5252:25:9::0;;5240:2;5225:18;;5106:177;12834:44:3::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;12888:49;12905:2;12909:7;12934:1;12917:7;:14;:18;;;;:::i;:::-;12909:27;;;;;;;;:::i;:::-;;;;;;;12888:16;:49::i;:::-;12294:650;12061:883:::0;;;;;;;;;:::o;10696:662::-;1474:15;;10906:24;;10887:8;;1474:15;;:45;;;;;1504:15;1493:8;:26;1474:45;1470:87;;;1540:17;;-1:-1:-1;;;1540:17:3;;;;;;;;;;;1470:87;10942:21:::1;10966:19;10980:4;;10966:13;:19::i;:::-;10942:43;;11005:31;11019:8;11029:6;11005:13;:31::i;:::-;10995:41;;11080:12;11050:7;11075:1;11058:7;:14;:18;;;;:::i;:::-;11050:27;;;;;;;;:::i;:::-;;;;;;;:42;11046:106;;;11115:26;;-1:-1:-1::0;;;11115:26:3::1;;;;;;;;;;;11046:106;11161:154;11192:6;11199:1;11192:9;;;;;;;;:::i;11161:154::-;11325:26;11331:7;11340:6;11348:2;11325:5;:26::i;24351:112::-:0;1094:13:0;:11;:13::i;:::-;-1:-1:-1;;;;;24430:17:3;;;::::1;;::::0;;;:11:::1;:17;::::0;;;;:26;;-1:-1:-1;;24430:26:3::1;::::0;::::1;;::::0;;;::::1;::::0;;24351:112::o;4950:361::-;5047:14;5063;5107:6;-1:-1:-1;;;;;5097:16:3;:6;-1:-1:-1;;;;;5097:16:3;;5093:49;;5122:20;;-1:-1:-1;;;5122:20:3;;;;;;;;;;;5093:49;5180:6;-1:-1:-1;;;;;5171:15:3;:6;-1:-1:-1;;;;;5171:15:3;;:77;;5233:6;5241;5171:77;;;5202:6;5210;5171:77;5152:96;;-1:-1:-1;5152:96:3;-1:-1:-1;;;;;;5262:20:3;;5258:46;;5291:13;;-1:-1:-1;;;5291:13:3;;;;;;;;;;;5258:46;4950:361;;;;;:::o;24889:127::-;1094:13:0;:11;:13::i;:::-;24972:26:3::1;:37:::0;;;::::1;;;;-1:-1:-1::0;;24972:37:3;;::::1;::::0;;;::::1;::::0;;24889:127::o;14461:700::-;1474:15;;14689:8;;1474:15;;:45;;;;;1504:15;1493:8;:26;1474:45;1470:87;;;1540:17;;-1:-1:-1;;;1540:17:3;;;;;;;;;;;1470:87;14709:133:::1;14740:4;;14745:1;14740:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;14761:10;14785:25;14793:4;;14798:1;14793:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;14802:4;;14807:1;14802:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;14785:25::-;14824:8;14709:17;:133::i;:::-;14852:21;14883:4:::0;;14888:15:::1;14902:1;14883:4:::0;14888:15:::1;:::i;:::-;14883:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;14876:43;::::0;-1:-1:-1;;;14876:43:3;;-1:-1:-1;;;;;5720:32:9;;;14876:43:3::1;::::0;::::1;5702:51:9::0;14876:39:3;;;::::1;::::0;::::1;::::0;5675:18:9;;14876:43:3::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14852:67;;14929:44;14964:4;;14929:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;14970:2:3;;-1:-1:-1;14929:34:3::1;::::0;-1:-1:-1;;14929:44:3:i:1;:::-;15074:12:::0;15046:13;15007:4;;15012:15:::1;15026:1;15007:4:::0;15012:15:::1;:::i;:::-;15007:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;15000:43;::::0;-1:-1:-1;;;15000:43:3;;-1:-1:-1;;;;;5720:32:9;;;15000:43:3::1;::::0;::::1;5702:51:9::0;15000:39:3;;;::::1;::::0;::::1;::::0;5675:18:9;;15000:43:3::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:59;;;;:::i;:::-;:86;14983:172;;;15118:26;;-1:-1:-1::0;;;15118:26:3::1;;;;;;;;;;;14983:172;14699:462;14461:700:::0;;;;;;;:::o;7415:342::-;7541:14;7567:12;7582:26;7590:7;7599:8;7582:7;:26::i;:::-;7622:40;;-1:-1:-1;;;7622:40:3;;-1:-1:-1;;;;;5720:32:9;;;7622:40:3;;;5702:51:9;7567:41:3;;-1:-1:-1;7641:7:3;7622:34;;;;;;5675:18:9;;7622:40:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7618:133;;;7687:53;;-1:-1:-1;;;7687:53:3;;;;;13313:25:9;;;-1:-1:-1;;;;;13374:32:9;;;13354:18;;;13347:60;7687:34:3;;;;;13286:18:9;;7687:53:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7678:62;;7618:133;7557:200;7415:342;;;;;:::o;1831:101:0:-;1094:13;:11;:13::i;:::-;1895:30:::1;1922:1;1895:18;:30::i;:::-;1831:101::o:0;15940:811:3:-;1474:15;;16165:8;;1474:15;;:45;;;;;1504:15;1493:8;:26;1474:45;1470:87;;;1540:17;;-1:-1:-1;;;1540:17:3;;;;;;;;;;;1470:87;-1:-1:-1;;;;;16222:6:3::1;16189:40;:4:::0;;16194:15:::1;16208:1;16189:4:::0;16194:15:::1;:::i;:::-;16189:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;16189:40:3::1;;16185:91;;16252:13;;-1:-1:-1::0;;;16252:13:3::1;;;;;;;;;;;16185:91;16285:133;16316:4;;16321:1;16316:7;;;;;;;:::i;16285:133::-;16428:55;16463:4;;16428:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;16477:4:3::1;::::0;-1:-1:-1;16428:34:3::1;::::0;-1:-1:-1;;16428:55:3:i:1;:::-;16513:48;::::0;-1:-1:-1;;;16513:48:3;;16555:4:::1;16513:48;::::0;::::1;5702:51:9::0;16493:17:3::1;::::0;16528:6:::1;-1:-1:-1::0;;;;;16513:33:3::1;::::0;::::1;::::0;5675:18:9;;16513:48:3::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16493:68;;16587:12;16575:9;:24;16571:88;;;16622:26;;-1:-1:-1::0;;;16622:26:3::1;;;;;;;;;;;16571:88;16668:35;::::0;-1:-1:-1;;;16668:35:3;;::::1;::::0;::::1;5252:25:9::0;;;16676:6:3::1;-1:-1:-1::0;;;;;16668:24:3::1;::::0;::::1;::::0;5225:18:9;;16668:35:3::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;16713:31;16730:2;16734:9;16713:16;:31::i;11364:691::-:0;1474:15;;11553:24;;11534:8;;1474:15;;:45;;;;;1504:15;1493:8;:26;1474:45;1470:87;;;1540:17;;-1:-1:-1;;;1540:17:3;;;;;;;;;;;1470:87;11612:6:::1;-1:-1:-1::0;;;;;11593:26:3::1;:4;;11598:1;11593:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;11593:26:3::1;;11589:52;;11628:13;;-1:-1:-1::0;;;11628:13:3::1;;;;;;;;;;;11589:52;11651:21;11675:19;11689:4;;11675:13;:19::i;:::-;11651:43;;11714:32;11728:9;11739:6;11714:13;:32::i;:::-;11704:42;;11790:12;11760:7;11785:1;11768:7;:14;:18;;;;:::i;:::-;11760:27;;;;;;;;:::i;:::-;;;;;;;:42;11756:106;;;11825:26;;-1:-1:-1::0;;;11825:26:3::1;;;;;;;;;;;11756:106;11871:6;-1:-1:-1::0;;;;;11871:14:3::1;;11893:7;11901:1;11893:10;;;;;;;;:::i;:::-;;;;;;;11871:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;11936:6;-1:-1:-1::0;;;;;11936:15:3::1;;11952:37;11960:6;11967:1;11960:9;;;;;;;;:::i;:::-;;;;;;;:14;;;11976:6;11983:1;11976:9;;;;;;;;:::i;11952:37::-;11991:7;11999:1;11991:10;;;;;;;;:::i;:::-;;;;;;;11936:66;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;13610:32:9;;;;13592:51;;13674:2;13659:18;;13652:34;13580:2;13565:18;;13418:274;11936:66:3::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11916:96;;;;:::i;:::-;12022:26;12028:7;12037:6;12045:2;12022:5;:26::i;:::-;11579:476;11364:691:::0;;;;;;;;:::o;6062:771::-;6156:12;6185:14;6201;6219:26;6230:6;6238;6219:10;:26::i;:::-;6184:61;;;;6255:13;6271:11;:43;6283:30;6292:6;6300;6308:4;6283:8;:30::i;:::-;-1:-1:-1;;;;;6271:43:3;;;;;;;;;;;;;;;-1:-1:-1;6271:43:3;;6604:42;;6271:43;;;;;-1:-1:-1;6524:7:3;;6604:42;;6621:6;;6629;;6271:43;;6604:42;;:::i;:::-;;;;;;;;;;;;;6561:115;;;;;;6706:12;6441:321;;;;;;;;;-1:-1:-1;;;;;;14406:26:9;;14469:2;14465:15;;;;-1:-1:-1;;14461:53:9;14457:1;14448:11;;14441:74;14540:2;14531:12;;14524:28;;;;14577:2;14568:12;;14561:28;14614:2;14605:12;;14120:503;6441:321:3;;;;-1:-1:-1;;6441:321:3;;;;;;;;;6406:378;;6441:321;6406:378;;;;;6062:771;-1:-1:-1;;;;;;6062:771:3:o;7836:641::-;7945:24;8005:1;7989:6;:13;:17;7985:43;;;8015:13;;-1:-1:-1;;;8015:13:3;;;;;;;;;;;7985:43;8062:13;;:17;;8078:1;8062:17;:::i;:::-;8048:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8048:32:3;;8038:42;;8103:8;8090:7;8098:1;8090:10;;;;;;;;:::i;:::-;;;;;;:21;;;;;8126:9;8121:350;8145:6;:13;8141:1;:17;8121:350;;;8179:12;8194:37;8202:6;8209:1;8202:9;;;;;;;;:::i;:::-;;;;;;;:14;;;8218:6;8225:1;8218:9;;;;;;;;:::i;8194:37::-;8249:40;;-1:-1:-1;;;8249:40:3;;-1:-1:-1;;;;;5720:32:9;;;8249:40:3;;;5702:51:9;8179:52:3;;-1:-1:-1;8268:7:3;8249:34;;;;;;5675:18:9;;8249:40:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8245:216;;;8342:4;-1:-1:-1;;;;;8326:34:3;;8382:7;8390:1;8382:10;;;;;;;;:::i;:::-;;;;;;;8414:6;8421:1;8414:9;;;;;;;;:::i;:::-;;;;;;;:14;;;8326:120;;;;;;;;;;;;;;;13313:25:9;;;-1:-1:-1;;;;;13374:32:9;13369:2;13354:18;;13347:60;13301:2;13286:18;;13139:274;8326:120:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8309:7;8317:5;:1;8321;8317:5;:::i;:::-;8309:14;;;;;;;;:::i;:::-;;;;;;:137;;;;;8245:216;-1:-1:-1;8160:3:3;;;;:::i;:::-;;;;8121:350;;;;7836:641;;;;:::o;25337:162::-;1094:13:0;:11;:13::i;:::-;-1:-1:-1;;;;;25445:39:3::1;25487:5;25445:39:::0;;;:32:::1;:39;::::0;;;;:47;;-1:-1:-1;;25445:47:3::1;::::0;;25337:162::o;24469:303::-;1094:13:0;:11;:13::i;:::-;24596:29:3;;::::1;24592:63;;24634:21;;-1:-1:-1::0;;;24634:21:3::1;;;;;;;;;;;24592:63;24670:9;24665:101;24685:16:::0;;::::1;24665:101;;;24746:6;;24753:1;24746:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;24722:11;:21;24734:5;;24740:1;24734:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;24722:21:3::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;24722:21:3;:33;;-1:-1:-1;;24722:33:3::1;::::0;::::1;;::::0;;;::::1;::::0;;24703:3;::::1;::::0;::::1;:::i;:::-;;;;24665:101;;;;24469:303:::0;;;;:::o;25193:138::-;1094:13:0;:11;:13::i;:::-;-1:-1:-1;;;;;25278:39:3::1;;::::0;;;:32:::1;:39;::::0;;;;:46;;-1:-1:-1;;25278:46:3::1;25320:4;25278:46;::::0;;25193:138::o;22917:795::-;1474:15;;23181:19;;23162:8;;1474:15;;:45;;;;;1504:15;1493:8;:26;1474:45;1470:87;;;1540:17;;-1:-1:-1;;;1540:17:3;;;;;;;;;;;1470:87;23212:49:::1;23238:5;23253:6;23212:25;:49::i;:::-;23290:201;23319:5;23346:6;23367:9;23390:14;23418;23454:4;23473:8;23290:15;:201::i;:::-;23526:38;::::0;-1:-1:-1;;;23526:38:3;;23558:4:::1;23526:38;::::0;::::1;5702:51:9::0;23272:219:3;;-1:-1:-1;23501:64:3::1;::::0;-1:-1:-1;23515:5:3;;23522:2;;-1:-1:-1;;;;;23526:23:3;::::1;::::0;::::1;::::0;5675:18:9;;23526:38:3::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23501:13;:64::i;:::-;23575:28;::::0;-1:-1:-1;;;23575:28:3;;::::1;::::0;::::1;5252:25:9::0;;;23575:6:3::1;-1:-1:-1::0;;;;;23575:15:3::1;::::0;::::1;::::0;5225:18:9;;23575:28:3::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;23613:33;23630:2;23634:11;23613:16;:33::i;:::-;23657:48;23682:5;23697:6;23657:24;:48::i;:::-;22917:795:::0;;;;;;;;;:::o;15167:767::-;1474:15;;15374:8;;1474:15;;:45;;;;;1504:15;1493:8;:26;1474:45;1470:87;;;1540:17;;-1:-1:-1;;;1540:17:3;;;;;;;;;;;1470:87;15417:6:::1;-1:-1:-1::0;;;;;15398:26:3::1;:4;;15403:1;15398:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;15398:26:3::1;;15394:52;;15433:13;;-1:-1:-1::0;;;15433:13:3::1;;;;;;;;;;;15394:52;15456:16;15475:9;15456:28;;15502:6;-1:-1:-1::0;;;;;15494:23:3::1;;15525:8;15494:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;15561:6;-1:-1:-1::0;;;;;15553:24:3::1;;15578:25;15586:4;;15591:1;15586:7;;;;;;;:::i;15578:25::-;15553:61;::::0;-1:-1:-1;;;;;;15553:61:3::1;::::0;;;;;;-1:-1:-1;;;;;13610:32:9;;;15553:61:3::1;::::0;::::1;13592:51:9::0;13659:18;;;13652:34;;;13565:18;;15553:61:3::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;15546:69;;;;:::i;:::-;15625:21;15656:4:::0;;15661:15:::1;15675:1;15656:4:::0;15661:15:::1;:::i;:::-;15656:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;15649:43;::::0;-1:-1:-1;;;15649:43:3;;-1:-1:-1;;;;;5720:32:9;;;15649:43:3::1;::::0;::::1;5702:51:9::0;15649:39:3;;;::::1;::::0;::::1;::::0;5675:18:9;;15649:43:3::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;15625:67;;15702:44;15737:4;;15702:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;15743:2:3;;-1:-1:-1;15702:34:3::1;::::0;-1:-1:-1;;15702:44:3:i:1;:::-;15847:12:::0;15819:13;15780:4;;15785:15:::1;15799:1;15780:4:::0;15785:15:::1;:::i;:::-;15780:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;15773:43;::::0;-1:-1:-1;;;15773:43:3;;-1:-1:-1;;;;;5720:32:9;;;15773:43:3::1;::::0;::::1;5702:51:9::0;15773:39:3;;;::::1;::::0;::::1;::::0;5675:18:9;;15773:43:3::1;5540:219:9::0;21073:971:3;1474:15;;21314;;;;21295:8;;1474:15;;:45;;;;;1504:15;1493:8;:26;1474:45;1470:87;;;1540:17;;-1:-1:-1;;;1540:17:3;;;;;;;;;;;1470:87;21358:41:::1;21384:6;21392;21358:25;:41::i;:::-;21410:12;21425:23;21433:6;21441;21425:7;:23::i;:::-;21463:63;::::0;-1:-1:-1;;;21463:63:3;;21498:10:::1;21463:63;::::0;::::1;15138:34:9::0;-1:-1:-1;;;;;21463:34:3;::::1;15188:18:9::0;;;15181:43;;;15240:18;;;15233:34;;;21410:38:3;;-1:-1:-1;21463:34:3::1;::::0;15073:18:9;;21463:63:3::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21458:105;;21547:16;;-1:-1:-1::0;;;21547:16:3::1;;;;;;;;;;;21458:105;21610:30;::::0;-1:-1:-1;;;21610:30:3;;-1:-1:-1;;;;;5720:32:9;;;21610:30:3::1;::::0;::::1;5702:51:9::0;21574:15:3::1;::::0;;;21610:26;::::1;::::0;::::1;::::0;5675:18:9;;21610:30:3::1;::::0;::::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21573:67;;;;21651:14;21671:26;21682:6;21690;21671:10;:26::i;:::-;21650:47;;;21738:6;-1:-1:-1::0;;;;;21728:16:3::1;:6;-1:-1:-1::0;;;;;21728:16:3::1;;:82;;21793:7;21802;21728:82;;;21760:7;21769;21728:82;21707:103:::0;;-1:-1:-1;21707:103:3;-1:-1:-1;21824:20:3;;::::1;21820:79;;;21867:21;;-1:-1:-1::0;;;21867:21:3::1;;;;;;;;;;;21820:79;21922:10;21912:7;:20;21908:79;;;21955:21;;-1:-1:-1::0;;;21955:21:3::1;;;;;;;;;;;21908:79;21997:40;22022:6;22030;21997:24;:40::i;:::-;21348:696;;;;21073:971:::0;;;;;;;;;;;:::o;8514:303::-;8625:24;8683:1;8669:15;;8665:41;;;8693:13;;-1:-1:-1;;;8693:13:3;;;;;;;;;;;8665:41;8716:21;8740:19;8754:4;;8740:13;:19::i;:::-;8716:43;;8779:31;8793:8;8803:6;8779:13;:31::i;6888:448::-;6986:16;7004;7037:14;7057:26;7068:6;7076;7057:10;:26::i;:::-;7036:47;;;7094:16;7112;7163:23;7171:6;7179;7163:7;:23::i;:::-;-1:-1:-1;;;;;7134:74:3;;:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7093:117;;;;;7253:6;-1:-1:-1;;;;;7243:16:3;:6;-1:-1:-1;;;;;7243:16:3;;:86;;7310:8;7320;7243:86;;;7275:8;7285;7243:86;7220:109;;;;-1:-1:-1;6888:448:3;-1:-1:-1;;;;;;6888:448:3:o;9269:121::-;9343:40;;-1:-1:-1;;;9343:40:3;;-1:-1:-1;;;;;5720:32:9;;;9343:40:3;;;5702:51:9;9320:4:3;;9362:7;9343:34;;;;;;5675:18:9;;9343:40:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9336:47;9269:121;-1:-1:-1;;9269:121:3:o;18615:1001::-;1474:15;;18929;;;;;;18889:8;;1474:15;;:45;;;;;1504:15;1493:8;:26;1474:45;1470:87;;;1540:17;;-1:-1:-1;;;1540:17:3;;;;;;;;;;;1470:87;19029:41:::1;19055:6;19063;19029:25;:41::i;:::-;19081:12;19096:23;19104:6;19112;19096:7;:23::i;:::-;-1:-1:-1::0;;;;;19145:17:3;::::1;19129:13;19145:17:::0;;;:11:::1;:17;::::0;;;;;19081:38;;-1:-1:-1;19145:17:3::1;;19193:189;19220:6:::0;19240;19145:17;19282:14;19310;19338:10;19362;19193:13:::1;:189::i;:::-;19172:210:::0;;-1:-1:-1;19172:210:3;-1:-1:-1;19392:52:3::1;19410:6:::0;19418:10:::1;19430:4:::0;19172:210;19392:17:::1;:52::i;:::-;19454;19472:6;19480:10;19492:4;19498:7;19454:17;:52::i;:::-;19528:30;::::0;-1:-1:-1;;;19528:30:3;;-1:-1:-1;;;;;5720:32:9;;;19528:30:3::1;::::0;::::1;5702:51:9::0;19528:26:3;::::1;::::0;::::1;::::0;5675:18:9;;19528:30:3::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19516:42;;19569:40;19594:6;19602;19569:24;:40::i;:::-;19019:597;;18615:1001:::0;;;;;;;;;;;;;:::o;2081:198:0:-;1094:13;:11;:13::i;:::-;-1:-1:-1;;;;;2169:22:0;::::1;2161:73;;;::::0;-1:-1:-1;;;2161:73:0;;16041:2:9;2161:73:0::1;::::0;::::1;16023:21:9::0;16080:2;16060:18;;;16053:30;16119:34;16099:18;;;16092:62;-1:-1:-1;;;16170:18:9;;;16163:36;16216:19;;2161:73:0::1;;;;;;;;;2244:28;2263:8;2244:18;:28::i;:::-;2081:198:::0;:::o;19622:1220:3:-;1474:15;;19910:19;;;;;;19870:8;;1474:15;;:45;;;;;1504:15;1493:8;:26;1474:45;1470:87;;;1540:17;;-1:-1:-1;;;1540:17:3;;;;;;;;;;;1470:87;20018:49:::1;20044:5;20059:6;20018:25;:49::i;:::-;20078:12;20093:31;20101:5;20116:6;20093:7;:31::i;:::-;-1:-1:-1::0;;;;;20150:17:3;::::1;20134:13;20150:17:::0;;;:11:::1;:17;::::0;;;;;20078:46;;-1:-1:-1;20150:17:3::1;;20206:204;20233:5:::0;20260:6:::1;20150:17:::0;20303:18;20335:9:::1;20358:14:::0;20386;20206:13:::1;:204::i;:::-;20177:233:::0;;-1:-1:-1;20177:233:3;-1:-1:-1;20420:55:3::1;20438:5:::0;20445:10:::1;20457:4:::0;20177:233;20420:17:::1;:55::i;:::-;20485:6;-1:-1:-1::0;;;;;20485:14:3::1;;20507:11;20485:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;20538:34:3::1;::::0;-1:-1:-1;;;20538:34:3;;-1:-1:-1;;;;;13610:32:9;;;20538:34:3::1;::::0;::::1;13592:51:9::0;13659:18;;;13652:34;;;20538:6:3::1;:15;::::0;-1:-1:-1;20538:15:3::1;::::0;-1:-1:-1;13565:18:9;;;-1:-1:-1;20538:34:3::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20531:42;;;;:::i;:::-;20595:30;::::0;-1:-1:-1;;;20595:30:3;;-1:-1:-1;;;;;5720:32:9;;;20595:30:3::1;::::0;::::1;5702:51:9::0;20595:26:3;::::1;::::0;::::1;::::0;5675:18:9;;20595:30:3::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20583:42;;20686:11;20674:9;:23;20670:107;;;20713:53;20730:10;20742:23;20754:11:::0;20742:9:::1;:23;:::i;:::-;20713:16;:53::i;:::-;20787:48;20812:5;20827:6;20787:24;:48::i;:::-;20008:834;;19622:1220:::0;;;;;;;;;;;:::o;2458:1078::-;2561:26;;;;;;;2556:40;;2458:1078;;:::o;2556:40::-;2624:35;;;;;;;2623:36;;:92;;-1:-1:-1;;;;;;2675:40:3;;;;;;:32;:40;;;;;;;;2623:92;2606:457;;;2818:42;;-1:-1:-1;;;2818:42:3;;2854:4;2818:42;;;5702:51:9;2793:6:3;;-1:-1:-1;;;;;2818:27:3;;;;;5675:18:9;;2818:42:3;;;;;;;;;;;;;;;;;;;-1:-1:-1;2818:42:3;;;;;;;;-1:-1:-1;;2818:42:3;;;;;;;;;;;;:::i;:::-;;;2814:239;;;2947:18;2943:86;;;2987:42;;-1:-1:-1;;;2987:42:3;;3024:4;2987:42;;;3504:41:9;-1:-1:-1;;;;;2987:36:3;;;;;3477:18:9;;2987:42:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2943:86;2861:183;2814:239;2726:337;2606:457;3091:35;;;;;;;3090:36;;:92;;-1:-1:-1;;;;;;3142:40:3;;;;;;:32;:40;;;;;;;;3090:92;3073:457;;;3285:42;;-1:-1:-1;;;3285:42:3;;3321:4;3285:42;;;5702:51:9;3260:6:3;;-1:-1:-1;;;;;3285:27:3;;;;;5675:18:9;;3285:42:3;;;;;;;;;;;;;;;;;;;-1:-1:-1;3285:42:3;;;;;;;;-1:-1:-1;;3285:42:3;;;;;;;;;;;;:::i;:::-;;;3281:239;;;3414:18;3410:86;;;3454:42;;-1:-1:-1;;;3454:42:3;;3491:4;3454:42;;;3504:41:9;-1:-1:-1;;;;;3454:36:3;;;;;3477:18:9;;3454:42:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3410:86;3328:183;3281:239;3193:337;3073:457;2458:1078;;:::o;23753:275::-;23871:5;-1:-1:-1;;;;;23871:17:3;;23892:1;23871:22;23867:49;;23902:14;;-1:-1:-1;;;23902:14:3;;;;;;;;;;;23867:49;23941:33;;-1:-1:-1;;;23941:33:3;;-1:-1:-1;;;;;13610:32:9;;;23941:33:3;;;13592:51:9;13659:18;;;13652:34;;;23926:12:3;;23941:22;;;;;;13565:18:9;;23941:33:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23926:48;;23989:7;23984:37;;24005:16;;-1:-1:-1;;;24005:16:3;;;;;;;;;;;20848:185;20961:12;;;20921;20961;;;;;;;;;-1:-1:-1;;;;;20939:7:3;;;20954:5;;20939:35;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20920:54;;;20989:7;20984:42;;21005:21;;-1:-1:-1;;;21005:21:3;;;;;;;;;;;3753:1067;3843:26;;;;;;;3838:40;;3753:1067;;:::o;3838:40::-;3906:35;;;;;;;3905:36;;:92;;-1:-1:-1;;;;;;3957:40:3;;;;;;:32;:40;;;;;;;;3905:92;3888:458;;;4100:42;;-1:-1:-1;;;4100:42:3;;4136:4;4100:42;;;5702:51:9;4075:6:3;;-1:-1:-1;;;;;4100:27:3;;;;;5675:18:9;;4100:42:3;;;;;;;;;;;;;;;;;;;-1:-1:-1;4100:42:3;;;;;;;;-1:-1:-1;;4100:42:3;;;;;;;;;;;;:::i;:::-;;;4096:240;;;4229:18;4225:87;;;4269:43;;-1:-1:-1;;;4269:43:3;;4306:5;4269:43;;;3504:41:9;-1:-1:-1;;;;;4269:36:3;;;;;3477:18:9;;4269:43:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4225:87;4143:184;4096:240;4008:338;3888:458;4374:35;;;;;;;4373:36;;:92;;-1:-1:-1;;;;;;4425:40:3;;;;;;:32;:40;;;;;;;;4373:92;4356:458;;;4568:42;;-1:-1:-1;;;4568:42:3;;4604:4;4568:42;;;5702:51:9;4543:6:3;;-1:-1:-1;;;;;4568:27:3;;;;;5675:18:9;;4568:42:3;;;;;;;;;;;;;;;;;;;-1:-1:-1;4568:42:3;;;;;;;;-1:-1:-1;;4568:42:3;;;;;;;;;;;;:::i;:::-;;;4564:240;;;4697:18;4693:87;;;4737:43;;-1:-1:-1;;;4737:43:3;;4774:5;4737:43;;;3504:41:9;-1:-1:-1;;;;;4737:36:3;;;;;3477:18:9;;4737:43:3;3364:187:9;1359:130:0;1247:7;1273:6;-1:-1:-1;;;;;1273:6:0;719:10:2;1422:23:0;1414:68;;;;-1:-1:-1;;;1414:68:0;;16995:2:9;1414:68:0;;;16977:21:9;;;17014:18;;;17007:30;17073:34;17053:18;;;17046:62;17125:18;;1414:68:0;16793:356:9;9396:377:3;9491:21;9549:15;9563:1;9549:4;:15;:::i;:::-;9537:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;9537:28:3;;-1:-1:-1;;9537:28:3;;;;;;;;;;;;9528:37;;9580:9;9575:192;9599:15;9613:1;9599:4;:15;:::i;:::-;9595:1;:19;9575:192;;;9635:13;9651:11;:42;9663:29;9671:4;;9676:1;9671:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;9680:4;;9685:5;:1;9689;9685:5;:::i;:::-;9680:11;;;;;;;:::i;9663:29::-;-1:-1:-1;;;;;9651:42:3;;;;;;;;;;;;;;-1:-1:-1;9651:42:3;;9719:37;;;;;;;;9651:42;;;-1:-1:-1;9719:37:3;9725:4;;9730:1;9725:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;9719:37:3;;;;;9734:4;;9739:5;:1;9743;9739:5;:::i;:::-;9734:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;9719:37:3;;;;;9747:8;9719:37;;;;;9707:6;9714:1;9707:9;;;;;;;;:::i;:::-;;;;;;:49;;;;9621:146;9616:3;;;;;:::i;:::-;;;;9575:192;;24034:311;24178:5;-1:-1:-1;;;;;24178:17:3;;24199:1;24178:22;24174:49;;24209:14;;-1:-1:-1;;;24209:14:3;;;;;;;;;;;24174:49;24248:43;;-1:-1:-1;;;24248:43:3;;-1:-1:-1;;;;;15156:15:9;;;24248:43:3;;;15138:34:9;15208:15;;;15188:18;;;15181:43;15240:18;;;15233:34;;;24233:12:3;;24248:26;;;;;;15073:18:9;;24248:43:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24233:58;;24306:7;24301:37;;24322:16;;-1:-1:-1;;;24322:16:3;;;;;;;;;;;9880:810;10019:9;10014:670;10038:6;:13;10034:1;:17;10014:670;;;10073:14;10093:40;10104:6;10111:1;10104:9;;;;;;;;:::i;:::-;;;;;;;:14;;;10120:6;10127:1;10120:9;;;;;;;;:::i;:::-;;;;;;;:12;;;10093:10;:40::i;:::-;-1:-1:-1;10072:61:3;-1:-1:-1;10147:17:3;10167:7;10175:5;:1;10179;10175:5;:::i;:::-;10167:14;;;;;;;;:::i;:::-;;;;;;;10147:34;;10196:18;10216;10256:6;-1:-1:-1;;;;;10238:24:3;:6;10245:1;10238:9;;;;;;;;:::i;:::-;;;;;;;:14;;;-1:-1:-1;;;;;10238:24:3;;:108;;10324:9;10343:1;10238:108;;;10290:1;10294:9;10238:108;10195:151;;;;10360:10;10393:1;10377:6;:13;:17;;;;:::i;:::-;10373:1;:21;:107;;10477:3;10373:107;;;10413:45;10421:6;10428:5;:1;10432;10428:5;:::i;:::-;10421:13;;;;;;;;:::i;:::-;;;;;;;:18;;;10441:6;10448:1;10452;10448:5;;;;:::i;:::-;10441:13;;;;;;;;:::i;10413:45::-;10360:120;;10510:37;10518:6;10525:1;10518:9;;;;;;;;:::i;:::-;;;;;;;:14;;;10534:6;10541:1;10534:9;;;;;;;;:::i;10510:37::-;-1:-1:-1;;;;;10494:59:3;;10571:10;10599;10627:2;10657:1;10647:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10647:12:3;;10494:179;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10058:626;;;;;10053:3;;;;;:::i;:::-;;;;10014:670;;13087:1368;13221:9;13216:1233;13250:1;13236:4;:11;:15;;;;:::i;:::-;13232:1;:19;13216:1233;;;13273:13;13288:14;13307:4;13312:1;13307:7;;;;;;;;:::i;:::-;;;;;;;13316:4;13321:1;13325;13321:5;;;;:::i;:::-;13316:11;;;;;;;;:::i;:::-;;;;;;;13272:56;;;;13343:14;13363:25;13374:5;13381:6;13363:10;:25::i;:::-;13342:46;;;13402:20;13441:22;13449:5;13456:6;13441:7;:22::i;:::-;13402:62;;13478:19;13511:20;13620:16;13638;13660:4;-1:-1:-1;;;;;13660:16:3;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13619:59;;;;;13697:20;13732:6;-1:-1:-1;;;;;13723:15:3;:5;-1:-1:-1;;;;;13723:15:3;;:101;;13805:8;13815;13723:101;;;13762:8;13772;13723:101;-1:-1:-1;13876:38:3;;-1:-1:-1;;;13876:38:3;;-1:-1:-1;;;;;5720:32:9;;;13876:38:3;;;5702:51:9;13696:128:3;;-1:-1:-1;13696:128:3;;13876:23;;;;;5675:18:9;;13876:38:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:73;;;;:::i;:::-;13842:107;;13982:40;13995:11;14008:5;14015:6;13982:12;:40::i;:::-;13967:55;;13545:492;;;14051:18;14071;14102:6;-1:-1:-1;;;;;14093:15:3;:5;-1:-1:-1;;;;;14093:15:3;;:105;;14173:12;14195:1;14093:105;;;14136:1;14140:12;14093:105;14050:148;;;;14212:10;14258:1;14244:4;:11;:15;;;;:::i;:::-;14240:1;:19;14236:138;;;14284:28;14292:6;14300:4;14305:5;:1;14309;14305:5;:::i;:::-;14300:11;;;;;;;;:::i;:::-;;;;;;;14284:7;:28::i;:::-;14279:33;;14236:138;;;-1:-1:-1;14356:3:3;14236:138;14425:12;;;14435:1;14425:12;;;;;;;;;-1:-1:-1;;;14387:51:3;;;-1:-1:-1;;;;;14387:9:3;;;;;:51;;14397:10;;14409;;14421:2;;14387:51;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13258:1191;;;;;;;;;13253:3;;;;;:::i;:::-;;;;13216:1233;;2433:187:0;2506:16;2525:6;;-1:-1:-1;;;;;2541:17:0;;;-1:-1:-1;;;;;;2541:17:0;;;;;;2573:40;;2525:6;;;;;;;2573:40;;2506:16;2573:40;2496:124;2433:187;:::o;5317:656:3:-;5433:12;5458:14;5474;5492:26;5503:6;5511;5492:10;:26::i;:::-;5457:61;;;;5728:7;5792:6;5800;5808;5775:40;;;;;;;;;;:::i;16788:1821::-;17024:15;17041;17089:10;17072:14;:27;:58;;;;17120:10;17103:14;:27;17072:58;17068:98;;;17151:15;;-1:-1:-1;;;17151:15:3;;;;;;;;;;;17068:98;17243:105;;-1:-1:-1;;;17243:105:3;;-1:-1:-1;;;;;18048:15:9;;;17243:105:3;;;18030:34:9;18100:15;;;18080:18;;;18073:43;18159:14;;18152:22;18132:18;;;18125:50;17227:13:3;;17262:7;17243:35;;;;;;17965:18:9;;17243:105:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17227:121;-1:-1:-1;;;;;;17362:19:3;;17358:182;;17405:124;;-1:-1:-1;;;17405:124:3;;-1:-1:-1;;;;;18048:15:9;;;17405:124:3;;;18030:34:9;18100:15;;;18080:18;;;18073:43;18159:14;;18152:22;18132:18;;;18125:50;17424:7:3;17405:38;;;;17965:18:9;;17405:124:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17397:132;;17358:182;17550:16;17568;17588:27;17600:6;17608;17588:11;:27::i;:::-;17549:66;;;;17629:8;17641:1;17629:13;:30;;;;-1:-1:-1;17646:13:3;;17629:30;17625:978;;;17697:14;;-1:-1:-1;17713:14:3;;-1:-1:-1;17625:978:3;;;17759:22;17784:112;17816:14;17848:8;17874;17784:14;:112::i;:::-;17759:137;;17932:14;17914;:32;17910:683;;17987:10;17970:14;:27;17966:102;;;18028:21;;-1:-1:-1;;;18028:21:3;;;;;;;;;;;17966:102;18107:14;;-1:-1:-1;18123:14:3;-1:-1:-1;18123:14:3;17910:683;;;18177:22;18202:128;18238:14;18274:8;18304;18202:14;:128::i;:::-;18177:153;;18373:14;18355;:32;;18348:40;;;;:::i;:::-;18427:10;18410:14;:27;18406:102;;;18468:21;;-1:-1:-1;;;18468:21:3;;;;;;;;;;;18406:102;18547:14;-1:-1:-1;18563:14:3;;-1:-1:-1;17910:683:3;17745:858;17625:978;17058:1551;;;16788:1821;;;;;;;;;;:::o;8927:336::-;9057:15;9099:1;9088:7;:12;9084:45;;9109:20;;-1:-1:-1;;;9109:20:3;;;;;;;;;;;9084:45;9143:13;;;:30;;-1:-1:-1;9160:13:3;;9143:30;9139:66;;;9182:23;;-1:-1:-1;;;9182:23:3;;;;;;;;;;;9139:66;9248:8;9226:18;9236:8;9226:7;:18;:::i;:::-;9225:31;;;;:::i;:::-;9215:41;8927:336;-1:-1:-1;;;;8927:336:3:o;14:127:9:-;75:10;70:3;66:20;63:1;56:31;106:4;103:1;96:15;130:4;127:1;120:15;146:131;-1:-1:-1;;;;;221:31:9;;211:42;;201:70;;267:1;264;257:12;282:663;386:6;394;402;410;418;426;479:3;467:9;458:7;454:23;450:33;447:53;;;496:1;493;486:12;447:53;535:9;522:23;554:31;579:5;554:31;:::i;:::-;604:5;-1:-1:-1;656:2:9;641:18;;628:32;;-1:-1:-1;707:2:9;692:18;;679:32;;-1:-1:-1;758:2:9;743:18;;730:32;;-1:-1:-1;814:3:9;799:19;;786:33;828;786;828;:::i;:::-;880:7;870:17;;;934:3;923:9;919:19;906:33;896:43;;282:663;;;;;;;;:::o;1203:118::-;1289:5;1282:13;1275:21;1268:5;1265:32;1255:60;;1311:1;1308;1301:12;1326:241;1382:6;1435:2;1423:9;1414:7;1410:23;1406:32;1403:52;;;1451:1;1448;1441:12;1403:52;1490:9;1477:23;1509:28;1531:5;1509:28;:::i;:::-;1556:5;1326:241;-1:-1:-1;;;1326:241:9:o;1572:367::-;1635:8;1645:6;1699:3;1692:4;1684:6;1680:17;1676:27;1666:55;;1717:1;1714;1707:12;1666:55;-1:-1:-1;1740:20:9;;1783:18;1772:30;;1769:50;;;1815:1;1812;1805:12;1769:50;1852:4;1844:6;1840:17;1828:29;;1912:3;1905:4;1895:6;1892:1;1888:14;1880:6;1876:27;1872:38;1869:47;1866:67;;;1929:1;1926;1919:12;1944:778;2066:6;2074;2082;2090;2098;2106;2159:3;2147:9;2138:7;2134:23;2130:33;2127:53;;;2176:1;2173;2166:12;2127:53;2212:9;2199:23;2189:33;;2269:2;2258:9;2254:18;2241:32;2231:42;;2324:2;2313:9;2309:18;2296:32;2351:18;2343:6;2340:30;2337:50;;;2383:1;2380;2373:12;2337:50;2422:70;2484:7;2475:6;2464:9;2460:22;2422:70;:::i;:::-;2511:8;;-1:-1:-1;2396:96:9;-1:-1:-1;;2596:2:9;2581:18;;2568:32;2609:31;2568:32;2609:31;:::i;:::-;2659:5;2649:15;;;2711:3;2700:9;2696:19;2683:33;2673:43;;1944:778;;;;;;;;:::o;2727:632::-;2898:2;2950:21;;;3020:13;;2923:18;;;3042:22;;;2869:4;;2898:2;3121:15;;;;3095:2;3080:18;;;2869:4;3164:169;3178:6;3175:1;3172:13;3164:169;;;3239:13;;3227:26;;3308:15;;;;3273:12;;;;3200:1;3193:9;3164:169;;;-1:-1:-1;3350:3:9;;2727:632;-1:-1:-1;;;;;;2727:632:9:o;3556:382::-;3621:6;3629;3682:2;3670:9;3661:7;3657:23;3653:32;3650:52;;;3698:1;3695;3688:12;3650:52;3737:9;3724:23;3756:31;3781:5;3756:31;:::i;:::-;3806:5;-1:-1:-1;3863:2:9;3848:18;;3835:32;3876:30;3835:32;3876:30;:::i;:::-;3925:7;3915:17;;;3556:382;;;;;:::o;3943:388::-;4011:6;4019;4072:2;4060:9;4051:7;4047:23;4043:32;4040:52;;;4088:1;4085;4078:12;4040:52;4127:9;4114:23;4146:31;4171:5;4146:31;:::i;:::-;4196:5;-1:-1:-1;4253:2:9;4238:18;;4225:32;4266:33;4225:32;4266:33;:::i;4645:456::-;4722:6;4730;4738;4791:2;4779:9;4770:7;4766:23;4762:32;4759:52;;;4807:1;4804;4797:12;4759:52;4843:9;4830:23;4820:33;;4903:2;4892:9;4888:18;4875:32;4916:31;4941:5;4916:31;:::i;:::-;4966:5;-1:-1:-1;5023:2:9;5008:18;;4995:32;5036:33;4995:32;5036:33;:::i;:::-;5088:7;5078:17;;;4645:456;;;;;:::o;5288:247::-;5347:6;5400:2;5388:9;5379:7;5375:23;5371:32;5368:52;;;5416:1;5413;5406:12;5368:52;5455:9;5442:23;5474:31;5499:5;5474:31;:::i;5764:709::-;5877:6;5885;5893;5901;5909;5962:3;5950:9;5941:7;5937:23;5933:33;5930:53;;;5979:1;5976;5969:12;5930:53;6015:9;6002:23;5992:33;;6076:2;6065:9;6061:18;6048:32;6103:18;6095:6;6092:30;6089:50;;;6135:1;6132;6125:12;6089:50;6174:70;6236:7;6227:6;6216:9;6212:22;6174:70;:::i;:::-;6263:8;;-1:-1:-1;6148:96:9;-1:-1:-1;;6348:2:9;6333:18;;6320:32;6361:31;6320:32;6361:31;:::i;:::-;5764:709;;;;-1:-1:-1;5764:709:9;;6463:2;6448:18;6435:32;;5764:709;-1:-1:-1;;5764:709:9:o;6686:127::-;6747:10;6742:3;6738:20;6735:1;6728:31;6778:4;6775:1;6768:15;6802:4;6799:1;6792:15;6818:253;6890:2;6884:9;6932:4;6920:17;;6967:18;6952:34;;6988:22;;;6949:62;6946:88;;;7014:18;;:::i;:::-;7050:2;7043:22;6818:253;:::o;7076:275::-;7147:2;7141:9;7212:2;7193:13;;-1:-1:-1;;7189:27:9;7177:40;;7247:18;7232:34;;7268:22;;;7229:62;7226:88;;;7294:18;;:::i;:::-;7330:2;7323:22;7076:275;;-1:-1:-1;7076:275:9:o;7356:1644::-;7471:6;7479;7510:2;7553;7541:9;7532:7;7528:23;7524:32;7521:52;;;7569:1;7566;7559:12;7521:52;7605:9;7592:23;7582:33;;7634:2;7687;7676:9;7672:18;7659:32;7710:18;7751:2;7743:6;7740:14;7737:34;;;7767:1;7764;7757:12;7737:34;7805:6;7794:9;7790:22;7780:32;;7850:7;7843:4;7839:2;7835:13;7831:27;7821:55;;7872:1;7869;7862:12;7821:55;7908:2;7895:16;7930:2;7926;7923:10;7920:36;;;7936:18;;:::i;:::-;7976:36;8008:2;8003;8000:1;7996:10;7992:19;7976:36;:::i;:::-;8046:15;;;8077:12;;;;-1:-1:-1;8108:4:9;8147:11;;;8139:20;;8135:29;;;8176:19;;;8173:39;;;8208:1;8205;8198:12;8173:39;8232:11;;;;8252:718;8268:6;8263:3;8260:15;8252:718;;;8348:2;8342:3;8333:7;8329:17;8325:26;8322:116;;;8392:1;8421:2;8417;8410:14;8322:116;8464:22;;:::i;:::-;8527:3;8514:17;8544:33;8569:7;8544:33;:::i;:::-;8590:22;;8653:12;;;8640:26;8679:33;8640:26;8679:33;:::i;:::-;8732:14;;;8725:31;8797:12;;;8784:26;8823:30;8784:26;8823:30;:::i;:::-;8873:14;;;8866:31;8910:18;;8285:12;;;;8948;;;;8252:718;;;8256:3;8989:5;8979:15;;;;;;;;7356:1644;;;;;:::o;9005:770::-;9124:6;9132;9140;9148;9201:2;9189:9;9180:7;9176:23;9172:32;9169:52;;;9217:1;9214;9207:12;9169:52;9257:9;9244:23;9286:18;9327:2;9319:6;9316:14;9313:34;;;9343:1;9340;9333:12;9313:34;9382:70;9444:7;9435:6;9424:9;9420:22;9382:70;:::i;:::-;9471:8;;-1:-1:-1;9356:96:9;-1:-1:-1;9559:2:9;9544:18;;9531:32;;-1:-1:-1;9575:16:9;;;9572:36;;;9604:1;9601;9594:12;9572:36;;9643:72;9707:7;9696:8;9685:9;9681:24;9643:72;:::i;:::-;9005:770;;;;-1:-1:-1;9734:8:9;-1:-1:-1;;;;9005:770:9:o;9780:805::-;9893:6;9901;9909;9917;9925;9933;9941;9994:3;9982:9;9973:7;9969:23;9965:33;9962:53;;;10011:1;10008;10001:12;9962:53;10050:9;10037:23;10069:31;10094:5;10069:31;:::i;:::-;10119:5;-1:-1:-1;10176:2:9;10161:18;;10148:32;10189:33;10148:32;10189:33;:::i;:::-;10241:7;-1:-1:-1;10295:2:9;10280:18;;10267:32;;-1:-1:-1;10346:2:9;10331:18;;10318:32;;-1:-1:-1;10397:3:9;10382:19;;10369:33;;-1:-1:-1;10454:3:9;10439:19;;10426:33;10468;10426;10468;:::i;:::-;10520:7;10510:17;;;10574:3;10563:9;10559:19;10546:33;10536:43;;9780:805;;;;;;;;;;:::o;10590:505::-;10685:6;10693;10701;10754:2;10742:9;10733:7;10729:23;10725:32;10722:52;;;10770:1;10767;10760:12;10722:52;10806:9;10793:23;10783:33;;10867:2;10856:9;10852:18;10839:32;10894:18;10886:6;10883:30;10880:50;;;10926:1;10923;10916:12;10880:50;10965:70;11027:7;11018:6;11007:9;11003:22;10965:70;:::i;:::-;10590:505;;11054:8;;-1:-1:-1;10939:96:9;;-1:-1:-1;;;;10590:505:9:o;11100:874::-;11222:6;11230;11238;11246;11254;11262;11270;11278;11331:3;11319:9;11310:7;11306:23;11302:33;11299:53;;;11348:1;11345;11338:12;11299:53;11387:9;11374:23;11406:31;11431:5;11406:31;:::i;:::-;11456:5;-1:-1:-1;11513:2:9;11498:18;;11485:32;11526:33;11485:32;11526:33;:::i;:::-;11578:7;-1:-1:-1;11632:2:9;11617:18;;11604:32;;-1:-1:-1;11683:2:9;11668:18;;11655:32;;-1:-1:-1;11734:3:9;11719:19;;11706:33;;-1:-1:-1;11786:3:9;11771:19;;11758:33;;-1:-1:-1;11843:3:9;11828:19;;11815:33;11857;11815;11857;:::i;:::-;11909:7;11899:17;;;11963:3;11952:9;11948:19;11935:33;11925:43;;11100:874;;;;;;;;;;;:::o;12303:127::-;12364:10;12359:3;12355:20;12352:1;12345:31;12395:4;12392:1;12385:15;12419:4;12416:1;12409:15;12435:128;12502:9;;;12523:11;;;12520:37;;;12537:18;;:::i;12568:127::-;12629:10;12624:3;12620:20;12617:1;12610:31;12660:4;12657:1;12650:15;12684:4;12681:1;12674:15;12700:184;12770:6;12823:2;12811:9;12802:7;12798:23;12794:32;12791:52;;;12839:1;12836;12829:12;12791:52;-1:-1:-1;12862:16:9;;12700:184;-1:-1:-1;12700:184:9:o;12889:245::-;12956:6;13009:2;12997:9;12988:7;12984:23;12980:32;12977:52;;;13025:1;13022;13015:12;12977:52;13057:9;13051:16;13076:28;13098:5;13076:28;:::i;13697:418::-;-1:-1:-1;;13946:2:9;13942:15;;;13938:24;;13926:37;;13997:15;;;;13993:24;;;13988:2;13979:12;;13972:46;14064:14;14057:22;14052:3;14048:32;14043:2;14034:12;;14027:54;14106:2;14097:12;;13697:418::o;14628:125::-;14693:9;;;14714:10;;;14711:36;;;14727:18;;:::i;14758:135::-;14797:3;14818:17;;;14815:43;;14838:18;;:::i;:::-;-1:-1:-1;14885:1:9;14874:13;;14758:135::o;15278:245::-;15357:6;15365;15418:2;15406:9;15397:7;15393:23;15389:32;15386:52;;;15434:1;15431;15424:12;15386:52;-1:-1:-1;;15457:16:9;;15513:2;15498:18;;;15492:25;15457:16;;15492:25;;-1:-1:-1;15278:245:9:o;15528:306::-;15616:6;15624;15632;15685:2;15673:9;15664:7;15660:23;15656:32;15653:52;;;15701:1;15698;15691:12;15653:52;15730:9;15724:16;15714:26;;15780:2;15769:9;15765:18;15759:25;15749:35;;15824:2;15813:9;15809:18;15803:25;15793:35;;15528:306;;;;;:::o;16246:250::-;16331:1;16341:113;16355:6;16352:1;16349:13;16341:113;;;16431:11;;;16425:18;16412:11;;;16405:39;16377:2;16370:10;16341:113;;;-1:-1:-1;;16488:1:9;16470:16;;16463:27;16246:250::o;16501:287::-;16630:3;16668:6;16662:13;16684:66;16743:6;16738:3;16731:4;16723:6;16719:17;16684:66;:::i;:::-;16766:16;;;;;16501:287;-1:-1:-1;;16501:287:9:o;17154:637::-;17385:6;17374:9;17367:25;17428:6;17423:2;17412:9;17408:18;17401:34;17500:1;17496;17491:3;17487:11;17483:19;17475:6;17471:32;17466:2;17455:9;17451:18;17444:60;17540:3;17535:2;17524:9;17520:18;17513:31;17348:4;17573:6;17567:13;17617:6;17611:3;17600:9;17596:19;17589:35;17633:80;17706:6;17700:3;17689:9;17685:19;17680:2;17672:6;17668:15;17633:80;:::i;:::-;17774:2;17753:15;-1:-1:-1;;17749:29:9;17734:45;;;;17781:3;17730:55;;17154:637;-1:-1:-1;;;;;17154:637:9:o;18186:251::-;18256:6;18309:2;18297:9;18288:7;18284:23;18280:32;18277:52;;;18325:1;18322;18315:12;18277:52;18357:9;18351:16;18376:31;18401:5;18376:31;:::i;18442:168::-;18515:9;;;18546;;18563:15;;;18557:22;;18543:37;18533:71;;18584:18;;:::i;18615:217::-;18655:1;18681;18671:132;;18725:10;18720:3;18716:20;18713:1;18706:31;18760:4;18757:1;18750:15;18788:4;18785:1;18778:15;18671:132;-1:-1:-1;18817:9:9;;18615:217::o

Swarm Source

ipfs://2e016813496ad0b4c738836e30897bee7e4d7ed2b9b7a2e06b10b1433c2e92e7

Block Transaction Gas Used Reward
view all blocks sequenced

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

Validator Index Block Amount
View All Withdrawals

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

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