Contract 0xcd7d16fb918511bf7269ec4f48d61d79fb26f918 4

Txn Hash Method
Block
From
To
Value [Txn Fee]
0xc6a318f028b497b36377111cd63bb112e673eb1487cc844d48e4b36e47eb85c8Swap Exact ETH F...104149752023-09-28 5:13:297 mins agoCronos ID Name utilitycrodev.cro IN  CronaSwap: Router100 CRO1.162745 5,000
0x563d73137d20de7e9ddafc3aec0b97db00dd0fc0b9a0b6c72c72fb3dec328343Swap Exact Token...104135152023-09-28 2:56:212 hrs 24 mins ago0x887fe5b666be3fc6cc101bc353a0beb290db4795 IN  CronaSwap: Router0 CRO0.5317054978430
0x95c9169392f74d82477721a4bf1fca6abd3a5c4e9ebd72b88d0425c048144c97Swap Exact Token...104133072023-09-28 2:36:502 hrs 43 mins ago0x887fe5b666be3fc6cc101bc353a0beb290db4795 IN  CronaSwap: Router0 CRO1.2758630968660
0xdc761f94feaee2407e6e3126c0b61ec558c9cf3772d5e8ed5cccb4d3a3d1a92dSwap Exact Token...104103452023-09-27 21:58:277 hrs 22 mins agoCronos ID Name fromthefuture.cro IN  CronaSwap: Router0 CRO2.6614433610740
0x02587b4deb9731c80dbc2c815de1b12694fb733fbd9fb591d7351c390290ef19Swap Exact Token...104103392023-09-27 21:57:537 hrs 22 mins agoCronos ID Name fromthefuture.cro IN  CronaSwap: Router0 CRO0.7112553324190
0x0197469c844cc4af6bf80298c6076417674816de70831398e70b237fa2a1f81dSwap Exact Token...104103332023-09-27 21:57:197 hrs 23 mins agoCronos ID Name fromthefuture.cro IN  CronaSwap: Router0 CRO0.5299905745620
0x874387a8d20911a8d9d748cd5dd936c346f35402c88c9f7910369e44f35214eaSwap Exact Token...104103292023-09-27 21:56:577 hrs 23 mins agoCronos ID Name fromthefuture.cro IN  CronaSwap: Router0 CRO0.5456699973340
0x962a8b36b299dc0c9e096d235f4e5e32126005b4638a8d438ebc07820cef44a6Swap Exact Token...104103242023-09-27 21:56:297 hrs 24 mins agoCronos ID Name fromthefuture.cro IN  CronaSwap: Router0 CRO0.5305025688220
0x93de321f5fdf0508c9df5817559dd719bf644441341eabc44017d23ae971e761Swap Exact Token...104103172023-09-27 21:55:527 hrs 24 mins agoCronos ID Name fromthefuture.cro IN  CronaSwap: Router0 CRO0.7873533907630
0xb1416b708607890ba476bff22c73c437f448bd0845aa06e8f9b2e0cb8f5de0fcSwap Tokens For ...104101452023-09-27 21:39:427 hrs 41 mins ago0x54655d6fed97b19ce714d5427b1db2c6e30437b7 IN  CronaSwap: Router0 CRO0.8977650
0x64cdd8a138562e9f46e6556b33a86e2b7d351a94415cd7161bd1260cabc6126fSwap Exact ETH F...104099462023-09-27 21:21:027 hrs 59 mins agoCronos ID Name fromthefuture.cro IN  CronaSwap: Router15 CRO0.4808180109150
0x2841ebdc1bb22e7118e4e18ed1983dc213a0b9905c97aa195c23e2f8a469b82dSwap Exact ETH F...104099382023-09-27 21:20:168 hrs agoCronos ID Name fromthefuture.cro IN  CronaSwap: Router15 CRO0.5604021052370
0xd3a77629723bbc07538c193a967f1d7109e435c64f8eac3934a4650498c0268fSwap Exact ETH F...104099332023-09-27 21:19:488 hrs agoCronos ID Name fromthefuture.cro IN  CronaSwap: Router50 CRO0.8356373396740
0x15dc097c4a1aba67bb05f01a7a170dcf7f28886239bfa02f059d3c5614583eb1Swap Exact ETH F...104099272023-09-27 21:19:148 hrs 1 min agoCronos ID Name fromthefuture.cro IN  CronaSwap: Router15 CRO0.8357351302870
0x143233a95a7d16ed3304a9ae0b07afa2c6f5a0122eca0a78122b132cc49bfd41Swap Exact ETH F...104099202023-09-27 21:18:358 hrs 2 mins agoCronos ID Name fromthefuture.cro IN  CronaSwap: Router15 CRO0.6827429374230
0x2ba6023f2f956b1dd3f8f17332f1563b1f9d8424c78905d7cbe7a233f338e19aSwap Exact ETH F...104099142023-09-27 21:18:008 hrs 2 mins agoCronos ID Name fromthefuture.cro IN  CronaSwap: Router15 CRO2.3477815717230
0x255206241b72947930bec108c88b9fa4b4039fc0ddf631907a121d116f7a27aeSwap Exact ETH F...104089302023-09-27 19:45:359 hrs 35 mins ago0x66bc3025dd6459690eb6558dc6d6312c3c125f5a IN  CronaSwap: Router20 CRO1.037850
0x6059dab8125038a619c358ad685c87751f76f4fe1d0c67042100be0358208630Swap Exact ETH F...104089172023-09-27 19:44:219 hrs 36 mins ago0x66bc3025dd6459690eb6558dc6d6312c3c125f5a IN  CronaSwap: Router50 CRO1.222190
0x162ae4daafaf02ca20c7b8ab6c9b299df8e2080070a2da5935c3433184056dd1Swap Exact Token...104088802023-09-27 19:40:519 hrs 39 mins ago0x29488e5fd6bf9b3cc98a9d06a25204947cccbe4d IN  CronaSwap: Router0 CRO0.45496719847 4,655.586579388
0x08b25cf338dc7f163b2fcf55590061107b28e8b68553b10a9625caa6ad5a1e60Swap Exact Token...104088782023-09-27 19:40:399 hrs 40 mins ago0x29488e5fd6bf9b3cc98a9d06a25204947cccbe4d IN  CronaSwap: Router0 CRO0.454510958469 4,655.586656048
0xe4f0dd3682bde2f67d8ebeae5d1cd300d6225f363f6f312a05d7c48f3b98e46eSwap Exact Token...104087592023-09-27 19:29:289 hrs 51 mins ago0x29488e5fd6bf9b3cc98a9d06a25204947cccbe4d IN  CronaSwap: Router0 CRO0.454800130402 4,655.592035978
0x4c023d5a45ed2e1d5da9df8d783f020957609b7130e43434efddccfd2e6f7038Swap Exact Token...104086622023-09-27 19:20:1610 hrs ago0xcf7477a4026dfcd7fafe935d4cb12e30074d41e7 IN  CronaSwap: Router0 CRO0.570375 5,000
0x9a03c573aa2f79d70495f88b0d754910dbdd1a178c0f59a0495fa73649c60c1dSwap Exact ETH F...104082722023-09-27 18:43:3610 hrs 37 mins agoCronos ID Name utilitycrodev.cro IN  CronaSwap: Router20 CRO1.149585 5,000
0xcb338cd1fce7b10512491fa6475a7bc2f5080bc06360922ab66f88e77120c4b2Swap Exact ETH F...104070272023-09-27 16:46:3112 hrs 34 mins ago0x21376f9ea9b75358f3ce6138edec1515998cf930 IN  CronaSwap: Router1 CRO0.57020791778 4,655.670643887
0x6a7881778a488763c0a6372fae8d2100a5f3503834bd2cb573fe6d11e9e51703Swap Exact Token...104057382023-09-27 14:45:3014 hrs 35 mins ago0x6614d26064d762922c7bc7a00337713d5169ae7c IN  CronaSwap: Router0 CRO0.57060860
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xc6a318f028b497b36377111cd63bb112e673eb1487cc844d48e4b36e47eb85c8104149752023-09-28 5:13:297 mins ago CronaSwap: Router Cronos: WCRO Token100 CRO
0xe1c65581e6c283be74f02318bbb13c14d9a1e23965c5865a63f8449dbac18344104149532023-09-28 5:11:259 mins ago CronaSwap: Router Cronos: WCRO Token4.233520262522787458 CRO
0xe1c65581e6c283be74f02318bbb13c14d9a1e23965c5865a63f8449dbac18344104149532023-09-28 5:11:259 mins ago UtilityCRO: UCRO Token CronaSwap: Router4.233520262522787458 CRO
0xe1c65581e6c283be74f02318bbb13c14d9a1e23965c5865a63f8449dbac18344104149532023-09-28 5:11:259 mins ago CronaSwap: Router Cronos: WCRO Token50.802243150273449506 CRO
0xe1c65581e6c283be74f02318bbb13c14d9a1e23965c5865a63f8449dbac18344104149532023-09-28 5:11:259 mins ago 0xd2d735889ee7b6ea97c1992cfcfb8bfb3cc22557 CronaSwap: Router50.802243150273449506 CRO
0xe1c65581e6c283be74f02318bbb13c14d9a1e23965c5865a63f8449dbac18344104149532023-09-28 5:11:259 mins ago CronaSwap: Router UtilityCRO: UCRO Token63.502803937841811883 CRO
0xe1c65581e6c283be74f02318bbb13c14d9a1e23965c5865a63f8449dbac18344104149532023-09-28 5:11:259 mins ago Cronos: WCRO Token CronaSwap: Router63.502803937841811883 CRO
0x75439cfbd0989f0038a5366b0e3736978269240c692e075feb93b87cf882bc24104138392023-09-28 3:26:481 hr 53 mins ago CronaSwap: Router Cronos: WCRO Token1.348846619776718603 CRO
0x75439cfbd0989f0038a5366b0e3736978269240c692e075feb93b87cf882bc24104138392023-09-28 3:26:481 hr 53 mins ago UtilityCRO: UCRO Token CronaSwap: Router1.348846619776718603 CRO
0x75439cfbd0989f0038a5366b0e3736978269240c692e075feb93b87cf882bc24104138392023-09-28 3:26:481 hr 53 mins ago CronaSwap: Router Cronos: WCRO Token32.372318874641246486 CRO
0x75439cfbd0989f0038a5366b0e3736978269240c692e075feb93b87cf882bc24104138392023-09-28 3:26:481 hr 53 mins ago 0xd2d735889ee7b6ea97c1992cfcfb8bfb3cc22557 CronaSwap: Router32.372318874641246486 CRO
0x75439cfbd0989f0038a5366b0e3736978269240c692e075feb93b87cf882bc24104138392023-09-28 3:26:481 hr 53 mins ago CronaSwap: Router UtilityCRO: UCRO Token45.847350056140212107 CRO
0x75439cfbd0989f0038a5366b0e3736978269240c692e075feb93b87cf882bc24104138392023-09-28 3:26:481 hr 53 mins ago Cronos: WCRO Token CronaSwap: Router45.847350056140212107 CRO
0xdc761f94feaee2407e6e3126c0b61ec558c9cf3772d5e8ed5cccb4d3a3d1a92d104103452023-09-27 21:58:277 hrs 22 mins ago CronaSwap: RouterCronos ID Name fromthefuture.cro188.816387370052908716 CRO
0xdc761f94feaee2407e6e3126c0b61ec558c9cf3772d5e8ed5cccb4d3a3d1a92d104103452023-09-27 21:58:277 hrs 22 mins ago Cronos: WCRO Token CronaSwap: Router188.816387370052908716 CRO
0x02587b4deb9731c80dbc2c815de1b12694fb733fbd9fb591d7351c390290ef19104103392023-09-27 21:57:537 hrs 22 mins ago CronaSwap: RouterCronos ID Name fromthefuture.cro21.39276631725947563 CRO
0x02587b4deb9731c80dbc2c815de1b12694fb733fbd9fb591d7351c390290ef19104103392023-09-27 21:57:537 hrs 22 mins ago Cronos: WCRO Token CronaSwap: Router21.39276631725947563 CRO
0x0197469c844cc4af6bf80298c6076417674816de70831398e70b237fa2a1f81d104103332023-09-27 21:57:197 hrs 23 mins ago CronaSwap: RouterCronos ID Name fromthefuture.cro36.618222280863528741 CRO
0x0197469c844cc4af6bf80298c6076417674816de70831398e70b237fa2a1f81d104103332023-09-27 21:57:197 hrs 23 mins ago Cronos: WCRO Token CronaSwap: Router36.618222280863528741 CRO
0x874387a8d20911a8d9d748cd5dd936c346f35402c88c9f7910369e44f35214ea104103292023-09-27 21:56:577 hrs 23 mins ago CronaSwap: RouterCronos ID Name fromthefuture.cro25.871974666822560759 CRO
0x874387a8d20911a8d9d748cd5dd936c346f35402c88c9f7910369e44f35214ea104103292023-09-27 21:56:577 hrs 23 mins ago Cronos: WCRO Token CronaSwap: Router25.871974666822560759 CRO
0x962a8b36b299dc0c9e096d235f4e5e32126005b4638a8d438ebc07820cef44a6104103242023-09-27 21:56:297 hrs 24 mins ago CronaSwap: RouterCronos ID Name fromthefuture.cro29.851099095971118588 CRO
0x962a8b36b299dc0c9e096d235f4e5e32126005b4638a8d438ebc07820cef44a6104103242023-09-27 21:56:297 hrs 24 mins ago Cronos: WCRO Token CronaSwap: Router29.851099095971118588 CRO
0x93de321f5fdf0508c9df5817559dd719bf644441341eabc44017d23ae971e761104103172023-09-27 21:55:527 hrs 24 mins ago CronaSwap: RouterCronos ID Name fromthefuture.cro14.856047161106341782 CRO
0x93de321f5fdf0508c9df5817559dd719bf644441341eabc44017d23ae971e761104103172023-09-27 21:55:527 hrs 24 mins ago Cronos: WCRO Token CronaSwap: Router14.856047161106341782 CRO
[ Download CSV Export 
Index Block
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
CronaSwapRouter

Compiler Version
v0.6.6+commit.6c089d02

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at cronoscan.com on 2022-01-08
*/

// Dependency file: contracts/interfaces/IWETH.sol

// SPDX-License-Identifier: MIT
// pragma solidity >=0.5.0;

interface IWETH {
    function deposit() external payable;
    function transfer(address to, uint value) external returns (bool);
    function withdraw(uint) external;
}


// Dependency file: contracts/interfaces/IERC20.sol

// pragma solidity >=0.5.0;

interface IERC20 {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);
}


// Dependency file: contracts/libraries/SafeMath.sol

// pragma solidity >=0.5.16;

// a library for performing overflow-safe math, courtesy of DappHub (https://github.com/dapphub/ds-math)

library SafeMath {
    function add(uint x, uint y) internal pure returns (uint z) {
        require((z = x + y) >= x, 'ds-math-add-overflow');
    }

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

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


// Dependency file: contracts/libraries/TransferHelper.sol


// pragma solidity >=0.6.0;

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

    function safeTransfer(
        address token,
        address to,
        uint256 value
    ) internal {
        // bytes4(keccak256(bytes('transfer(address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));
        require(
            success && (data.length == 0 || abi.decode(data, (bool))),
            'TransferHelper::safeTransfer: transfer failed'
        );
    }

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

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

// Dependency file: contracts/interfaces/ICronaSwapFactory.sol

// pragma solidity >=0.5.0;

interface ICronaSwapFactory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);

    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function allPairs(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);

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

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}

// Dependency file: contracts/interfaces/ICronaSwapRouter01.sol

// pragma solidity >=0.6.2;

interface ICronaSwapRouter01 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}


// Dependency file: contracts/interfaces/ICronaSwapRouter02.sol

// pragma solidity >=0.6.2;

// import 'contracts/interfaces/ICronaSwapRouter01.sol';

interface ICronaSwapRouter02 is ICronaSwapRouter01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}


// Dependency file: contracts/interfaces/ICronaSwapPair.sol

// pragma solidity >=0.5.0;

interface ICronaSwapPair {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);

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

    event Mint(address indexed sender, uint amount0, uint amount1);
    event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function price0CumulativeLast() external view returns (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);

    function mint(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;

    function initialize(address, address) external;
}


// Dependency file: contracts/libraries/CronaSwapLibrary.sol

// pragma solidity >=0.5.0;

// import "contracts/libraries/SafeMath.sol";
// import 'contracts/interfaces/ICronaSwapPair.sol';

library CronaSwapLibrary {
    using SafeMath for uint;

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

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

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

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

    // given an input amount of an asset and pair reserves, returns the maximum output amount of the other asset
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) internal pure returns (uint amountOut) {
        require(amountIn > 0, 'CronaSwapLibrary: INSUFFICIENT_INPUT_AMOUNT');
        require(reserveIn > 0 && reserveOut > 0, 'CronaSwapLibrary: INSUFFICIENT_LIQUIDITY');
        uint amountInWithFee = amountIn.mul(9975);
        uint numerator = amountInWithFee.mul(reserveOut);
        uint denominator = reserveIn.mul(10000).add(amountInWithFee);
        amountOut = numerator / denominator;
    }

    // given an output amount of an asset and pair reserves, returns a required input amount of the other asset
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) internal pure returns (uint amountIn) {
        require(amountOut > 0, 'CronaSwapLibrary: INSUFFICIENT_OUTPUT_AMOUNT');
        require(reserveIn > 0 && reserveOut > 0, 'CronaSwapLibrary: INSUFFICIENT_LIQUIDITY');
        uint numerator = reserveIn.mul(amountOut).mul(10000);
        uint denominator = reserveOut.sub(amountOut).mul(9975);
        amountIn = (numerator / denominator).add(1);
    }

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

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


// Root file: contracts/swap/CronaSwapRouter.sol

pragma solidity =0.6.6;

// import 'contracts/interfaces/IWETH.sol';
// import 'contracts/interfaces/IERC20.sol';
// import 'contracts/libraries/SafeMath.sol';
// import 'contracts/libraries/TransferHelper.sol';
// import 'contracts/interfaces/ICronaSwapFactory.sol';
// import 'contracts/interfaces/ICronaSwapRouter02.sol';
// import 'contracts/libraries/CronaSwapLibrary.sol';

contract CronaSwapRouter is ICronaSwapRouter02 {
    using SafeMath for uint;

    address public immutable override factory;
    address public immutable override WETH;

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

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

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

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

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external virtual override ensure(deadline) returns (uint amountA, uint amountB, uint liquidity) {
        (amountA, amountB) = _addLiquidity(tokenA, tokenB, amountADesired, amountBDesired, amountAMin, amountBMin);
        address pair = CronaSwapLibrary.pairFor(factory, tokenA, tokenB);
        TransferHelper.safeTransferFrom(tokenA, msg.sender, pair, amountA);
        TransferHelper.safeTransferFrom(tokenB, msg.sender, pair, amountB);
        liquidity = ICronaSwapPair(pair).mint(to);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    // **** LIBRARY FUNCTIONS ****
    function quote(uint amountA, uint reserveA, uint reserveB) public pure virtual override returns (uint amountB) {
        return CronaSwapLibrary.quote(amountA, reserveA, reserveB);
    }

    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut)
        public
        pure
        virtual
        override
        returns (uint amountOut)
    {
        return CronaSwapLibrary.getAmountOut(amountIn, reserveIn, reserveOut);
    }

    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut)
        public
        pure
        virtual
        override
        returns (uint amountIn)
    {
        return CronaSwapLibrary.getAmountIn(amountOut, reserveIn, reserveOut);
    }

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

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

Contract ABI

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

60c060405234801561001057600080fd5b50604051620047a9380380620047a98339818101604052604081101561003557600080fd5b5080516020909101516001600160601b0319606092831b8116608052911b1660a05260805160601c60a05160601c614624620001856000398061015f5280610ce45280610d1f5280610e16528061103452806113be528061152452806118eb52806119e55280611a9b5280611b695280611caf5280611d375280611f7c5280611ff752806120a652806121725280612207528061227b528061277952806129ec5280612a425280612a765280612aea5280612c8a5280612dcd5280612e55525080610ea45280610f7b52806110fa5280611133528061126e528061144c528061150252806116725280611bfc5280611d695280611ecc52806122ad528061250652806126fe5280612727528061275752806128c45280612a205280612d1d5280612e875280613718528061375b5280613a3e5280613bbd5280613fed528061409b528061411b52506146246000f3fe60806040526004361061014f5760003560e01c80638803dbee116100b6578063c45a01551161006f578063c45a015514610a10578063d06ca61f14610a25578063ded9382a14610ada578063e8e3370014610b4d578063f305d71914610bcd578063fb3bdb4114610c1357610188565b80638803dbee146107df578063ad5c464814610875578063ad615dec146108a6578063af2979eb146108dc578063b6f9de951461092f578063baa2abde146109b357610188565b80634a25d94a116101085780634a25d94a146104f05780635b0d5984146105865780635c11d795146105f9578063791ac9471461068f5780637ff36ab51461072557806385f8c259146107a957610188565b806302751cec1461018d578063054d50d4146101f957806318cbafe5146102415780631f00ca74146103275780632195995c146103dc57806338ed17391461045a57610188565b3661018857336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461018657fe5b005b600080fd5b34801561019957600080fd5b506101e0600480360360c08110156101b057600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135610c97565b6040805192835260208301919091528051918290030190f35b34801561020557600080fd5b5061022f6004803603606081101561021c57600080fd5b5080359060208101359060400135610db1565b60408051918252519081900360200190f35b34801561024d57600080fd5b506102d7600480360360a081101561026457600080fd5b813591602081013591810190606081016040820135600160201b81111561028a57600080fd5b82018360208201111561029c57600080fd5b803590602001918460208302840111600160201b831117156102bd57600080fd5b91935091506001600160a01b038135169060200135610dc6565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156103135781810151838201526020016102fb565b505050509050019250505060405180910390f35b34801561033357600080fd5b506102d76004803603604081101561034a57600080fd5b81359190810190604081016020820135600160201b81111561036b57600080fd5b82018360208201111561037d57600080fd5b803590602001918460208302840111600160201b8311171561039e57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506110f3945050505050565b3480156103e857600080fd5b506101e0600480360361016081101561040057600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c08101359060e081013515159060ff6101008201351690610120810135906101400135611129565b34801561046657600080fd5b506102d7600480360360a081101561047d57600080fd5b813591602081013591810190606081016040820135600160201b8111156104a357600080fd5b8201836020820111156104b557600080fd5b803590602001918460208302840111600160201b831117156104d657600080fd5b91935091506001600160a01b038135169060200135611223565b3480156104fc57600080fd5b506102d7600480360360a081101561051357600080fd5b813591602081013591810190606081016040820135600160201b81111561053957600080fd5b82018360208201111561054b57600080fd5b803590602001918460208302840111600160201b8311171561056c57600080fd5b91935091506001600160a01b03813516906020013561136e565b34801561059257600080fd5b5061022f60048036036101408110156105aa57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e082013516906101008101359061012001356114fa565b34801561060557600080fd5b50610186600480360360a081101561061c57600080fd5b813591602081013591810190606081016040820135600160201b81111561064257600080fd5b82018360208201111561065457600080fd5b803590602001918460208302840111600160201b8311171561067557600080fd5b91935091506001600160a01b038135169060200135611608565b34801561069b57600080fd5b50610186600480360360a08110156106b257600080fd5b813591602081013591810190606081016040820135600160201b8111156106d857600080fd5b8201836020820111156106ea57600080fd5b803590602001918460208302840111600160201b8311171561070b57600080fd5b91935091506001600160a01b03813516906020013561189d565b6102d76004803603608081101561073b57600080fd5b81359190810190604081016020820135600160201b81111561075c57600080fd5b82018360208201111561076e57600080fd5b803590602001918460208302840111600160201b8311171561078f57600080fd5b91935091506001600160a01b038135169060200135611b21565b3480156107b557600080fd5b5061022f600480360360608110156107cc57600080fd5b5080359060208101359060400135611e74565b3480156107eb57600080fd5b506102d7600480360360a081101561080257600080fd5b813591602081013591810190606081016040820135600160201b81111561082857600080fd5b82018360208201111561083a57600080fd5b803590602001918460208302840111600160201b8311171561085b57600080fd5b91935091506001600160a01b038135169060200135611e81565b34801561088157600080fd5b5061088a611f7a565b604080516001600160a01b039092168252519081900360200190f35b3480156108b257600080fd5b5061022f600480360360608110156108c957600080fd5b5080359060208101359060400135611f9e565b3480156108e857600080fd5b5061022f600480360360c08110156108ff57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135611fab565b6101866004803603608081101561094557600080fd5b81359190810190604081016020820135600160201b81111561096657600080fd5b82018360208201111561097857600080fd5b803590602001918460208302840111600160201b8311171561099957600080fd5b91935091506001600160a01b03813516906020013561212c565b3480156109bf57600080fd5b506101e0600480360360e08110156109d657600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c001356124b8565b348015610a1c57600080fd5b5061088a6126fc565b348015610a3157600080fd5b506102d760048036036040811015610a4857600080fd5b81359190810190604081016020820135600160201b811115610a6957600080fd5b820183602082011115610a7b57600080fd5b803590602001918460208302840111600160201b83111715610a9c57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550612720945050505050565b348015610ae657600080fd5b506101e06004803603610140811015610afe57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e0820135169061010081013590610120013561274d565b348015610b5957600080fd5b50610baf6004803603610100811015610b7157600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359160c0820135169060e00135612861565b60408051938452602084019290925282820152519081900360600190f35b610baf600480360360c0811015610be357600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a0013561299d565b6102d760048036036080811015610c2957600080fd5b81359190810190604081016020820135600160201b811115610c4a57600080fd5b820183602082011115610c5c57600080fd5b803590602001918460208302840111600160201b83111715610c7d57600080fd5b91935091506001600160a01b038135169060200135612c42565b6000808242811015610cde576040805162461bcd60e51b815260206004820152601860248201526000805160206144bd833981519152604482015290519081900360640190fd5b610d0d897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a6124b8565b9093509150610d1d898685612fc4565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610d8357600080fd5b505af1158015610d97573d6000803e3d6000fd5b50505050610da58583613118565b50965096945050505050565b6000610dbe848484613210565b949350505050565b60608142811015610e0c576040805162461bcd60e51b815260206004820152601860248201526000805160206144bd833981519152604482015290519081900360640190fd5b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001686866000198101818110610e4657fe5b905060200201356001600160a01b03166001600160a01b031614610e9f576040805162461bcd60e51b815260206004820152601d60248201526000805160206145a4833981519152604482015290519081900360640190fd5b610efd7f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061330092505050565b91508682600184510381518110610f1057fe5b60200260200101511015610f555760405162461bcd60e51b815260040180806020018281038252602b815260200180614439602b913960400191505060405180910390fd5b610ff386866000818110610f6557fe5b905060200201356001600160a01b031633610fd97f00000000000000000000000000000000000000000000000000000000000000008a8a6000818110610fa757fe5b905060200201356001600160a01b03168b8b6001818110610fc457fe5b905060200201356001600160a01b031661344c565b85600081518110610fe657fe5b602002602001015161350c565b61103282878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613669915050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d8360018551038151811061107157fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156110af57600080fd5b505af11580156110c3573d6000803e3d6000fd5b505050506110e884836001855103815181106110db57fe5b6020026020010151613118565b509695505050505050565b60606111207f000000000000000000000000000000000000000000000000000000000000000084846138af565b90505b92915050565b60008060006111597f00000000000000000000000000000000000000000000000000000000000000008f8f61344c565b9050600087611168578c61116c565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b1580156111e257600080fd5b505af11580156111f6573d6000803e3d6000fd5b505050506112098f8f8f8f8f8f8f6124b8565b809450819550505050509b509b9950505050505050505050565b60608142811015611269576040805162461bcd60e51b815260206004820152601860248201526000805160206144bd833981519152604482015290519081900360640190fd5b6112c77f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061330092505050565b915086826001845103815181106112da57fe5b6020026020010151101561131f5760405162461bcd60e51b815260040180806020018281038252602b815260200180614439602b913960400191505060405180910390fd5b61132f86866000818110610f6557fe5b6110e882878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613669915050565b606081428110156113b4576040805162461bcd60e51b815260206004820152601860248201526000805160206144bd833981519152604482015290519081900360640190fd5b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016868660001981018181106113ee57fe5b905060200201356001600160a01b03166001600160a01b031614611447576040805162461bcd60e51b815260206004820152601d60248201526000805160206145a4833981519152604482015290519081900360640190fd5b6114a57f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506138af92505050565b915086826000815181106114b557fe5b60200260200101511115610f555760405162461bcd60e51b81526004018080602001828103825260278152602001806145286027913960400191505060405180910390fd5b6000806115487f00000000000000000000000000000000000000000000000000000000000000008d7f000000000000000000000000000000000000000000000000000000000000000061344c565b9050600086611557578b61155b565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018b905260ff8916608482015260a4810188905260c4810187905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b1580156115d157600080fd5b505af11580156115e5573d6000803e3d6000fd5b505050506115f78d8d8d8d8d8d611fab565b9d9c50505050505050505050505050565b804281101561164c576040805162461bcd60e51b815260206004820152601860248201526000805160206144bd833981519152604482015290519081900360640190fd5b6116c18585600081811061165c57fe5b905060200201356001600160a01b0316336116bb7f00000000000000000000000000000000000000000000000000000000000000008989600081811061169e57fe5b905060200201356001600160a01b03168a8a6001818110610fc457fe5b8a61350c565b6000858560001981018181106116d357fe5b905060200201356001600160a01b03166001600160a01b03166370a08231856040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561173857600080fd5b505afa15801561174c573d6000803e3d6000fd5b505050506040513d602081101561176257600080fd5b505160408051602088810282810182019093528882529293506117a49290918991899182918501908490808284376000920191909152508892506139e7915050565b8661185682888860001981018181106117b957fe5b905060200201356001600160a01b03166001600160a01b03166370a08231886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561181e57600080fd5b505afa158015611832573d6000803e3d6000fd5b505050506040513d602081101561184857600080fd5b50519063ffffffff613cf216565b10156118935760405162461bcd60e51b815260040180806020018281038252602b815260200180614439602b913960400191505060405180910390fd5b5050505050505050565b80428110156118e1576040805162461bcd60e51b815260206004820152601860248201526000805160206144bd833981519152604482015290519081900360640190fd5b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168585600019810181811061191b57fe5b905060200201356001600160a01b03166001600160a01b031614611974576040805162461bcd60e51b815260206004820152601d60248201526000805160206145a4833981519152604482015290519081900360640190fd5b6119848585600081811061165c57fe5b6119c28585808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152503092506139e7915050565b604080516370a0823160e01b815230600482015290516000916001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916370a0823191602480820192602092909190829003018186803b158015611a2c57600080fd5b505afa158015611a40573d6000803e3d6000fd5b505050506040513d6020811015611a5657600080fd5b5051905086811015611a995760405162461bcd60e51b815260040180806020018281038252602b815260200180614439602b913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611aff57600080fd5b505af1158015611b13573d6000803e3d6000fd5b505050506118938482613118565b60608142811015611b67576040805162461bcd60e51b815260206004820152601860248201526000805160206144bd833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110611b9e57fe5b905060200201356001600160a01b03166001600160a01b031614611bf7576040805162461bcd60e51b815260206004820152601d60248201526000805160206145a4833981519152604482015290519081900360640190fd5b611c557f00000000000000000000000000000000000000000000000000000000000000003488888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061330092505050565b91508682600184510381518110611c6857fe5b60200260200101511015611cad5760405162461bcd60e51b815260040180806020018281038252602b815260200180614439602b913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db083600081518110611ce957fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015611d1c57600080fd5b505af1158015611d30573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb611d957f00000000000000000000000000000000000000000000000000000000000000008989600081811061169e57fe5b84600081518110611da257fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015611df957600080fd5b505af1158015611e0d573d6000803e3d6000fd5b505050506040513d6020811015611e2357600080fd5b5051611e2b57fe5b611e6a82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613669915050565b5095945050505050565b6000610dbe848484613d42565b60608142811015611ec7576040805162461bcd60e51b815260206004820152601860248201526000805160206144bd833981519152604482015290519081900360640190fd5b611f257f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506138af92505050565b91508682600081518110611f3557fe5b6020026020010151111561131f5760405162461bcd60e51b81526004018080602001828103825260278152602001806145286027913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081565b6000610dbe848484613e32565b60008142811015611ff1576040805162461bcd60e51b815260206004820152601860248201526000805160206144bd833981519152604482015290519081900360640190fd5b612020887f000000000000000000000000000000000000000000000000000000000000000089898930896124b8565b604080516370a0823160e01b815230600482015290519194506120a492508a9187916001600160a01b038416916370a0823191602480820192602092909190829003018186803b15801561207357600080fd5b505afa158015612087573d6000803e3d6000fd5b505050506040513d602081101561209d57600080fd5b5051612fc4565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561210a57600080fd5b505af115801561211e573d6000803e3d6000fd5b505050506110e88483613118565b8042811015612170576040805162461bcd60e51b815260206004820152601860248201526000805160206144bd833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316858560008181106121a757fe5b905060200201356001600160a01b03166001600160a01b031614612200576040805162461bcd60e51b815260206004820152601d60248201526000805160206145a4833981519152604482015290519081900360640190fd5b60003490507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561226057600080fd5b505af1158015612274573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6122d97f00000000000000000000000000000000000000000000000000000000000000008989600081811061169e57fe5b836040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561232957600080fd5b505af115801561233d573d6000803e3d6000fd5b505050506040513d602081101561235357600080fd5b505161235b57fe5b60008686600019810181811061236d57fe5b905060200201356001600160a01b03166001600160a01b03166370a08231866040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156123d257600080fd5b505afa1580156123e6573d6000803e3d6000fd5b505050506040513d60208110156123fc57600080fd5b5051604080516020898102828101820190935289825292935061243e9290918a918a9182918501908490808284376000920191909152508992506139e7915050565b87611856828989600019810181811061245357fe5b905060200201356001600160a01b03166001600160a01b03166370a08231896040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561181e57600080fd5b60008082428110156124ff576040805162461bcd60e51b815260206004820152601860248201526000805160206144bd833981519152604482015290519081900360640190fd5b600061252c7f00000000000000000000000000000000000000000000000000000000000000008c8c61344c565b604080516323b872dd60e01b81523360048201526001600160a01b03831660248201819052604482018d9052915192935090916323b872dd916064808201926020929091908290030181600087803b15801561258757600080fd5b505af115801561259b573d6000803e3d6000fd5b505050506040513d60208110156125b157600080fd5b50506040805163226bf2d160e21b81526001600160a01b03888116600483015282516000938493928616926389afcb44926024808301939282900301818787803b1580156125fe57600080fd5b505af1158015612612573d6000803e3d6000fd5b505050506040513d604081101561262857600080fd5b508051602090910151909250905060006126428e8e613ede565b509050806001600160a01b03168e6001600160a01b031614612665578183612668565b82825b90975095508a8710156126ac5760405162461bcd60e51b81526004018080602001828103825260268152602001806143b66026913960400191505060405180910390fd5b898610156126eb5760405162461bcd60e51b81526004018080602001828103825260268152602001806144dd6026913960400191505060405180910390fd5b505050505097509795505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60606111207f00000000000000000000000000000000000000000000000000000000000000008484613300565b600080600061279d7f00000000000000000000000000000000000000000000000000000000000000008e7f000000000000000000000000000000000000000000000000000000000000000061344c565b90506000876127ac578c6127b0565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b15801561282657600080fd5b505af115801561283a573d6000803e3d6000fd5b5050505061284c8e8e8e8e8e8e610c97565b909f909e509c50505050505050505050505050565b600080600083428110156128aa576040805162461bcd60e51b815260206004820152601860248201526000805160206144bd833981519152604482015290519081900360640190fd5b6128b88c8c8c8c8c8c613fbc565b909450925060006128ea7f00000000000000000000000000000000000000000000000000000000000000008e8e61344c565b90506128f88d33838861350c565b6129048c33838761350c565b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b15801561295c57600080fd5b505af1158015612970573d6000803e3d6000fd5b505050506040513d602081101561298657600080fd5b5051949d939c50939a509198505050505050505050565b600080600083428110156129e6576040805162461bcd60e51b815260206004820152601860248201526000805160206144bd833981519152604482015290519081900360640190fd5b612a148a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c613fbc565b90945092506000612a667f00000000000000000000000000000000000000000000000000000000000000008c7f000000000000000000000000000000000000000000000000000000000000000061344c565b9050612a748b33838861350c565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b158015612acf57600080fd5b505af1158015612ae3573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb82866040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612b6857600080fd5b505af1158015612b7c573d6000803e3d6000fd5b505050506040513d6020811015612b9257600080fd5b5051612b9a57fe5b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015612bf257600080fd5b505af1158015612c06573d6000803e3d6000fd5b505050506040513d6020811015612c1c57600080fd5b5051925034841015612c3457612c3433853403613118565b505096509650969350505050565b60608142811015612c88576040805162461bcd60e51b815260206004820152601860248201526000805160206144bd833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110612cbf57fe5b905060200201356001600160a01b03166001600160a01b031614612d18576040805162461bcd60e51b815260206004820152601d60248201526000805160206145a4833981519152604482015290519081900360640190fd5b612d767f0000000000000000000000000000000000000000000000000000000000000000888888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506138af92505050565b91503482600081518110612d8657fe5b60200260200101511115612dcb5760405162461bcd60e51b81526004018080602001828103825260278152602001806145286027913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db083600081518110612e0757fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015612e3a57600080fd5b505af1158015612e4e573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb612eb37f00000000000000000000000000000000000000000000000000000000000000008989600081811061169e57fe5b84600081518110612ec057fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612f1757600080fd5b505af1158015612f2b573d6000803e3d6000fd5b505050506040513d6020811015612f4157600080fd5b5051612f4957fe5b612f8882878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613669915050565b81600081518110612f9557fe5b6020026020010151341115611e6a57611e6a3383600081518110612fb557fe5b60200260200101513403613118565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b602083106130415780518252601f199092019160209182019101613022565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146130a3576040519150601f19603f3d011682016040523d82523d6000602084013e6130a8565b606091505b50915091508180156130d65750805115806130d657508080602001905160208110156130d357600080fd5b50515b6131115760405162461bcd60e51b815260040180806020018281038252602d815260200180614577602d913960400191505060405180910390fd5b5050505050565b604080516000808252602082019092526001600160a01b0384169083906040518082805190602001908083835b602083106131645780518252601f199092019160209182019101613145565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146131c6576040519150601f19603f3d011682016040523d82523d6000602084013e6131cb565b606091505b505090508061320b5760405162461bcd60e51b81526004018080602001828103825260348152602001806144646034913960400191505060405180910390fd5b505050565b60008084116132505760405162461bcd60e51b815260040180806020018281038252602b8152602001806145c4602b913960400191505060405180910390fd5b6000831180156132605750600082115b61329b5760405162461bcd60e51b815260040180806020018281038252602881526020018061454f6028913960400191505060405180910390fd5b60006132af856126f763ffffffff61423016565b905060006132c3828563ffffffff61423016565b905060006132e9836132dd8861271063ffffffff61423016565b9063ffffffff61429316565b90508082816132f457fe5b04979650505050505050565b6060600282511015613359576040805162461bcd60e51b815260206004820152601e60248201527f43726f6e61537761704c6962726172793a20494e56414c49445f504154480000604482015290519081900360640190fd5b815167ffffffffffffffff8111801561337157600080fd5b5060405190808252806020026020018201604052801561339b578160200160208202803683370190505b50905082816000815181106133ac57fe5b60200260200101818152505060005b6001835103811015613444576000806133fe878685815181106133da57fe5b60200260200101518786600101815181106133f157fe5b60200260200101516142e2565b9150915061342084848151811061341157fe5b60200260200101518383613210565b84846001018151811061342f57fe5b602090810291909101015250506001016133bb565b509392505050565b600080600061345b8585613ede565b604080516bffffffffffffffffffffffff19606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501206001600160f81b031960688401529a90941b9093166069840152607d8301989098527fc93158cffa5b575e32566e81e847754ce517f8fa988d3e25cf346d916216e06f609d808401919091528851808403909101815260bd909201909752805196019590952095945050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17815292518251600094606094938a169392918291908083835b602083106135915780518252601f199092019160209182019101613572565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146135f3576040519150601f19603f3d011682016040523d82523d6000602084013e6135f8565b606091505b5091509150818015613626575080511580613626575080806020019051602081101561362357600080fd5b50515b6136615760405162461bcd60e51b81526004018080602001828103825260318152602001806143dc6031913960400191505060405180910390fd5b505050505050565b60005b60018351038110156138a95760008084838151811061368757fe5b602002602001015185846001018151811061369e57fe5b60200260200101519150915060006136b68383613ede565b50905060008785600101815181106136ca57fe5b60200260200101519050600080836001600160a01b0316866001600160a01b0316146136f8578260006136fc565b6000835b91509150600060028a510388106137135788613754565b6137547f0000000000000000000000000000000000000000000000000000000000000000878c8b6002018151811061374757fe5b602002602001015161344c565b90506137817f0000000000000000000000000000000000000000000000000000000000000000888861344c565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f1916602001820160405280156137be576020820181803683370190505b506040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03166001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561382f578181015183820152602001613817565b50505050905090810190601f16801561385c5780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b15801561387e57600080fd5b505af1158015613892573d6000803e3d6000fd5b50506001909901985061366c975050505050505050565b50505050565b6060600282511015613908576040805162461bcd60e51b815260206004820152601e60248201527f43726f6e61537761704c6962726172793a20494e56414c49445f504154480000604482015290519081900360640190fd5b815167ffffffffffffffff8111801561392057600080fd5b5060405190808252806020026020018201604052801561394a578160200160208202803683370190505b509050828160018351038151811061395e57fe5b60209081029190910101528151600019015b8015613444576000806139a08786600186038151811061398c57fe5b60200260200101518786815181106133f157fe5b915091506139c28484815181106139b357fe5b60200260200101518383613d42565b8460018503815181106139d157fe5b6020908102919091010152505060001901613970565b60005b600183510381101561320b57600080848381518110613a0557fe5b6020026020010151858460010181518110613a1c57fe5b6020026020010151915091506000613a348383613ede565b5090506000613a647f0000000000000000000000000000000000000000000000000000000000000000858561344c565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015613aa557600080fd5b505afa158015613ab9573d6000803e3d6000fd5b505050506040513d6060811015613acf57600080fd5b5080516020909101516001600160701b0391821693501690506000806001600160a01b038a811690891614613b05578284613b08565b83835b91509150613b66828b6001600160a01b03166370a082318a6040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561181e57600080fd5b9550613b73868383613210565b945050505050600080856001600160a01b0316886001600160a01b031614613b9d57826000613ba1565b6000835b91509150600060028c51038a10613bb8578a613bec565b613bec7f0000000000000000000000000000000000000000000000000000000000000000898e8d6002018151811061374757fe5b604080516000808252602082019283905263022c0d9f60e01b835260248201878152604483018790526001600160a01b038086166064850152608060848501908152845160a48601819052969750908c169563022c0d9f958a958a958a9591949193919260c486019290918190849084905b83811015613c76578181015183820152602001613c5e565b50505050905090810190601f168015613ca35780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b158015613cc557600080fd5b505af1158015613cd9573d6000803e3d6000fd5b50506001909b019a506139ea9950505050505050505050565b80820382811115611123576040805162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b604482015290519081900360640190fd5b6000808411613d825760405162461bcd60e51b815260040180806020018281038252602c81526020018061440d602c913960400191505060405180910390fd5b600083118015613d925750600082115b613dcd5760405162461bcd60e51b815260040180806020018281038252602881526020018061454f6028913960400191505060405180910390fd5b6000613df1612710613de5868863ffffffff61423016565b9063ffffffff61423016565b90506000613e0b6126f7613de5868963ffffffff613cf216565b9050613e286001828481613e1b57fe5b049063ffffffff61429316565b9695505050505050565b6000808411613e725760405162461bcd60e51b81526004018080602001828103825260258152602001806145036025913960400191505060405180910390fd5b600083118015613e825750600082115b613ebd5760405162461bcd60e51b815260040180806020018281038252602881526020018061454f6028913960400191505060405180910390fd5b82613ece858463ffffffff61423016565b81613ed557fe5b04949350505050565b600080826001600160a01b0316846001600160a01b03161415613f325760405162461bcd60e51b81526004018080602001828103825260258152602001806144986025913960400191505060405180910390fd5b826001600160a01b0316846001600160a01b031610613f52578284613f55565b83835b90925090506001600160a01b038216613fb5576040805162461bcd60e51b815260206004820152601e60248201527f43726f6e61537761704c6962726172793a205a45524f5f414444524553530000604482015290519081900360640190fd5b9250929050565b6040805163e6a4390560e01b81526001600160a01b03888116600483015287811660248301529151600092839283927f00000000000000000000000000000000000000000000000000000000000000009092169163e6a4390591604480820192602092909190829003018186803b15801561403657600080fd5b505afa15801561404a573d6000803e3d6000fd5b505050506040513d602081101561406057600080fd5b50516001600160a01b0316141561411357604080516364e329cb60e11b81526001600160a01b038a81166004830152898116602483015291517f00000000000000000000000000000000000000000000000000000000000000009092169163c9c65396916044808201926020929091908290030181600087803b1580156140e657600080fd5b505af11580156140fa573d6000803e3d6000fd5b505050506040513d602081101561411057600080fd5b50505b6000806141417f00000000000000000000000000000000000000000000000000000000000000008b8b6142e2565b91509150816000148015614153575080155b1561416357879350869250614223565b6000614170898484613e32565b90508781116141c357858110156141b85760405162461bcd60e51b81526004018080602001828103825260268152602001806144dd6026913960400191505060405180910390fd5b889450925082614221565b60006141d0898486613e32565b9050898111156141dc57fe5b8781101561421b5760405162461bcd60e51b81526004018080602001828103825260268152602001806143b66026913960400191505060405180910390fd5b94508793505b505b5050965096945050505050565b600081158061424b5750508082028282828161424857fe5b04145b611123576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b604482015290519081900360640190fd5b80820182811015611123576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b604482015290519081900360640190fd5b60008060006142f18585613ede565b5090506142ff86868661344c565b5060008061430e88888861344c565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561434657600080fd5b505afa15801561435a573d6000803e3d6000fd5b505050506040513d606081101561437057600080fd5b5080516020909101516001600160701b0391821693501690506001600160a01b03878116908416146143a35780826143a6565b81815b9099909850965050505050505056fe43726f6e6153776170526f757465723a20494e53554646494349454e545f415f414d4f554e545472616e7366657248656c7065723a3a7472616e7366657246726f6d3a207472616e7366657246726f6d206661696c656443726f6e61537761704c6962726172793a20494e53554646494349454e545f4f55545055545f414d4f554e5443726f6e6153776170526f757465723a20494e53554646494349454e545f4f55545055545f414d4f554e545472616e7366657248656c7065723a3a736166655472616e736665724554483a20455448207472616e73666572206661696c656443726f6e61537761704c6962726172793a204944454e544943414c5f41444452455353455343726f6e6153776170526f757465723a2045585049524544000000000000000043726f6e6153776170526f757465723a20494e53554646494349454e545f425f414d4f554e5443726f6e61537761704c6962726172793a20494e53554646494349454e545f414d4f554e5443726f6e6153776170526f757465723a204558434553534956455f494e5055545f414d4f554e5443726f6e61537761704c6962726172793a20494e53554646494349454e545f4c49515549444954595472616e7366657248656c7065723a3a736166655472616e736665723a207472616e73666572206661696c656443726f6e6153776170526f757465723a20494e56414c49445f5041544800000043726f6e61537761704c6962726172793a20494e53554646494349454e545f494e5055545f414d4f554e54a2646970667358221220ba936349eca591894373028fb28c3cdd6d4d5267a60879759ebdffa85f482b6a64736f6c6343000606003300000000000000000000000073a48f8f521eb31c55c0e1274db0898de599cb110000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae23

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

00000000000000000000000073a48f8f521eb31c55c0e1274db0898de599cb110000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae23

-----Decoded View---------------
Arg [0] : _factory (address): 0x73a48f8f521eb31c55c0e1274db0898de599cb11
Arg [1] : _WETH (address): 0x5c7f8a570d578ed84e63fdfa7b1ee72deae1ae23

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000073a48f8f521eb31c55c0e1274db0898de599cb11
Arg [1] : 0000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae23


Deployed ByteCode Sourcemap

17237:18577:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17717:10;-1:-1:-1;;;;;17731:4:0;17717:18;;17710:26;;;;17237:18577;;12:1:-1;9;2:12;21873:673:0;;5:9:-1;2:2;;;27:1;24;17:12;2:2;21873:673:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;21873:673:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;34758:262;;5:9:-1;2:2;;;27:1;24;17:12;2:2;34758:262:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;34758:262:0;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;29058:850;;5:9:-1;2:2;;;27:1;24;17:12;2:2;29058:850:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;29058:850:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;29058:850:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;29058:850:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;29058:850:0;;-1:-1:-1;29058:850:0;-1:-1:-1;;;;;;29058:850:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;29058:850:0;;;;;;;;;;;;;;;;;35558:253;;5:9:-1;2:2;;;27:1;24;17:12;2:2;35558:253:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;35558:253:0;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;35558:253:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;35558:253:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;35558:253:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;35558:253:0;;-1:-1:-1;35558:253:0;;-1:-1:-1;;;;;35558:253:0:i;22554:677::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;22554:677:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;22554:677:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;26267:628::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;26267:628:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;26267:628:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;26267:628:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;26267:628:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;26267:628:0;;-1:-1:-1;26267:628:0;-1:-1:-1;;;;;;26267:628:0;;;;;;;;:::i;28222:828::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;28222:828:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;28222:828:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;28222:828:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;28222:828:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;28222:828:0;;-1:-1:-1;28222:828:0;-1:-1:-1;;;;;;28222:828:0;;;;;;;;:::i;24695:718::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;24695:718:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;24695:718:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;32095:714::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;32095:714:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;32095:714:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;32095:714:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;32095:714:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;32095:714:0;;-1:-1:-1;32095:714:0;-1:-1:-1;;;;;;32095:714:0;;;;;;;;:::i;33675:843::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;33675:843:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;33675:843:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;33675:843:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;33675:843:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;33675:843:0;;-1:-1:-1;33675:843:0;-1:-1:-1;;;;;;33675:843:0;;;;;;;;:::i;27517:697::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;27517:697:0;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;27517:697:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;27517:697:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;27517:697:0;;-1:-1:-1;27517:697:0;-1:-1:-1;;;;;;27517:697:0;;;;;;;;:::i;35028:261::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;35028:261:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;35028:261:0;;;;;;;;;;;;:::i;26903:606::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;26903:606:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;26903:606:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;26903:606:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;26903:606:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;26903:606:0;;-1:-1:-1;26903:606:0;-1:-1:-1;;;;;;26903:606:0;;;;;;;;:::i;17371:38::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;17371:38:0;;;:::i;:::-;;;;-1:-1:-1;;;;;17371:38:0;;;;;;;;;;;;;;34562:188;;5:9:-1;2:2;;;27:1;24;17:12;2:2;34562:188:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;34562:188:0;;;;;;;;;;;;:::i;23987:700::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;23987:700:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;23987:700:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;32817:850::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;32817:850:0;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;32817:850:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;32817:850:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;32817:850:0;;-1:-1:-1;32817:850:0;-1:-1:-1;;;;;;32817:850:0;;;;;;;;:::i;21000:865::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;21000:865:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;21000:865:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;17323:41::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;17323:41:0;;;:::i;35297:253::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;35297:253:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;35297:253:0;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;35297:253:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;35297:253:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;35297:253:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;35297:253:0;;-1:-1:-1;35297:253:0;;-1:-1:-1;;;;;35297:253:0:i;23239:669::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;23239:669:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;23239:669:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;19237:738::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;19237:738:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;19237:738:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;19983:974;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;19983:974:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;29916:810::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;29916:810:0;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;29916:810:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;29916:810:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;29916:810:0;;-1:-1:-1;29916:810:0;-1:-1:-1;;;;;;29916:810:0;;;;;;;;:::i;21873:673::-;22110:16;22128:14;22091:8;17480:15;17468:8;:27;;17460:64;;;;;-1:-1:-1;;;17460:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17460:64:0;;;;;;;;;;;;;;;22182:196:::1;22212:5;22232:4;22251:9;22275:14;22304:12;22339:4;22359:8;22182:15;:196::i;:::-;22155:223:::0;;-1:-1:-1;22155:223:0;-1:-1:-1;22389:51:0::1;22417:5:::0;22424:2;22155:223;22389:27:::1;:51::i;:::-;22457:4;-1:-1:-1::0;;;;;22451:20:0::1;;22472:9;22451:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;22451:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;22451:31:0;;;;22493:45;22524:2;22528:9;22493:30;:45::i;:::-;21873:673:::0;;;;;;;;;;:::o;34758:262::-;34911:14;34950:62;34980:8;34990:9;35001:10;34950:29;:62::i;:::-;34943:69;34758:262;-1:-1:-1;;;;34758:262:0:o;29058:850::-;29272:21;29244:8;17480:15;17468:8;:27;;17460:64;;;;;-1:-1:-1;;;17460:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17460:64:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;29344:4:0::1;29319:29;:4:::0;;-1:-1:-1;;29324:15:0;;29319:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;29319:21:0::1;-1:-1:-1::0;;;;;29319:29:0::1;;29311:71;;;::::0;;-1:-1:-1;;;29311:71:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;29311:71:0;;;;;;;;;;;;;::::1;;29403:55;29434:7;29443:8;29453:4;;29403:55;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;29403:30:0::1;::::0;-1:-1:-1;;;29403:55:0:i:1;:::-;29393:65;;29508:12;29477:7;29502:1;29485:7;:14;:18;29477:27;;;;;;;;;;;;;;:43;;29469:99;;;;-1:-1:-1::0;;;29469:99:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29579:141;29625:4;;29630:1;29625:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;29625:7:0::1;29634:10;29646:51;29671:7;29680:4;;29685:1;29680:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;29680:7:0::1;29689:4;;29694:1;29689:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;29689:7:0::1;29646:24;:51::i;:::-;29699:7;29707:1;29699:10;;;;;;;;;;;;;;29579:31;:141::i;:::-;29731:35;29737:7;29746:4;;29731:35;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;29760:4:0::1;::::0;-1:-1:-1;29731:5:0::1;::::0;-1:-1:-1;;29731:35:0:i:1;:::-;29783:4;-1:-1:-1::0;;;;;29777:20:0::1;;29798:7;29823:1;29806:7;:14;:18;29798:27;;;;;;;;;;;;;;29777:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;29777:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;29777:49:0;;;;29837:63;29868:2;29872:7;29897:1;29880:7;:14;:18;29872:27;;;;;;;;;;;;;;29837:30;:63::i;:::-;29058:850:::0;;;;;;;;;:::o;35558:253::-;35702:21;35748:55;35778:7;35787:9;35798:4;35748:29;:55::i;:::-;35741:62;;35558:253;;;;;:::o;22554:677::-;22860:12;22874;22899;22914:49;22939:7;22948:6;22956;22914:24;:49::i;:::-;22899:64;;22974:10;22987;:33;;23011:9;22987:33;;;-1:-1:-1;;22987:33:0;23031:80;;;-1:-1:-1;;;23031:80:0;;23059:10;23031:80;;;;23079:4;23031:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22974:46;;-1:-1:-1;;;;;;23031:27:0;;;;;:80;;;;;-1:-1:-1;;23031:80:0;;;;;;;;-1:-1:-1;23031:27:0;:80;;;2:2:-1;;;;27:1;24;17:12;2:2;23031:80:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23031:80:0;;;;23143;23159:6;23167;23175:9;23186:10;23198;23210:2;23214:8;23143:15;:80::i;:::-;23122:101;;;;;;;;22554:677;;;;;;;;;;;;;;;;:::o;26267:628::-;26491:21;26472:8;17480:15;17468:8;:27;;17460:64;;;;;-1:-1:-1;;;17460:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17460:64:0;;;;;;;;;;;;;;;26535:55:::1;26566:7;26575:8;26585:4;;26535:55;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;26535:30:0::1;::::0;-1:-1:-1;;;26535:55:0:i:1;:::-;26525:65;;26640:12;26609:7;26634:1;26617:7;:14;:18;26609:27;;;;;;;;;;;;;;:43;;26601:99;;;;-1:-1:-1::0;;;26601:99:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26711:141;26757:4;;26762:1;26757:7;;;;;;26711:141;26863:24;26869:7;26878:4;;26863:24;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;26884:2:0;;-1:-1:-1;26863:5:0::1;::::0;-1:-1:-1;;26863:24:0:i:1;28222:828::-:0;28436:21;28408:8;17480:15;17468:8;:27;;17460:64;;;;;-1:-1:-1;;;17460:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17460:64:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;28508:4:0::1;28483:29;:4:::0;;-1:-1:-1;;28488:15:0;;28483:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;28483:21:0::1;-1:-1:-1::0;;;;;28483:29:0::1;;28475:71;;;::::0;;-1:-1:-1;;;28475:71:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;28475:71:0;;;;;;;;;;;;;::::1;;28567:55;28597:7;28606:9;28617:4;;28567:55;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;28567:29:0::1;::::0;-1:-1:-1;;;28567:55:0:i:1;:::-;28557:65;;28655:11;28641:7;28649:1;28641:10;;;;;;;;;;;;;;:25;;28633:77;;;;-1:-1:-1::0;;;28633:77:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24695:718:::0;25013:14;25040:12;25055:46;25080:7;25089:5;25096:4;25055:24;:46::i;:::-;25040:61;;25112:10;25125;:33;;25149:9;25125:33;;;-1:-1:-1;;25125:33:0;25169:80;;;-1:-1:-1;;;25169:80:0;;25197:10;25169:80;;;;25217:4;25169:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25112:46;;-1:-1:-1;;;;;;25169:27:0;;;;;:80;;;;;-1:-1:-1;;25169:80:0;;;;;;;;-1:-1:-1;25169:27:0;:80;;;2:2:-1;;;;27:1;24;17:12;2:2;25169:80:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25169:80:0;;;;25272:133;25334:5;25341:9;25352:14;25368:12;25382:2;25386:8;25272:47;:133::i;:::-;25260:145;24695:718;-1:-1:-1;;;;;;;;;;;;;24695:718:0:o;32095:714::-;32329:8;17480:15;17468:8;:27;;17460:64;;;;;-1:-1:-1;;;17460:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17460:64:0;;;;;;;;;;;;;;;32350:139:::1;32396:4;;32401:1;32396:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;32396:7:0::1;32405:10;32417:51;32442:7;32451:4;;32456:1;32451:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;32451:7:0::1;32460:4;;32465:1;32460:7;;;;;;32417:51;32470:8;32350:31;:139::i;:::-;32500:18;32528:4:::0;;-1:-1:-1;;32533:15:0;;32528:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;32528:21:0::1;-1:-1:-1::0;;;;;32521:39:0::1;;32561:2;32521:43;;;;;;;;;;;;;-1:-1:-1::0;;;;;32521:43:0::1;-1:-1:-1::0;;;;;32521:43:0::1;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;32521:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;32521:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;32521:43:0;32575:44:::1;::::0;;32521:43:::1;32575:44:::0;;::::1;::::0;;;;;;;;;;;32521:43;;-1:-1:-1;32575:44:0::1;::::0;;;32610:4;;;;;;32575:44;::::1;::::0;32610:4;;32575:44;32610:4;32575:44;1:33:-1::1;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;32616:2:0;;-1:-1:-1;32575:34:0::1;::::0;-1:-1:-1;;32575:44:0:i:1;:::-;32718:12:::0;32652:62:::1;32700:13:::0;32659:4;;-1:-1:-1;;32664:15:0;;32659:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;32659:21:0::1;-1:-1:-1::0;;;;;32652:39:0::1;;32692:2;32652:43;;;;;;;;;;;;;-1:-1:-1::0;;;;;32652:43:0::1;-1:-1:-1::0;;;;;32652:43:0::1;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;32652:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;32652:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;32652:43:0;;:62:::1;:47;:62;:::i;:::-;:78;;32630:171;;;;-1:-1:-1::0;;;32630:171:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17535:1;32095:714:::0;;;;;;;:::o;33675:843::-;33942:8;17480:15;17468:8;:27;;17460:64;;;;;-1:-1:-1;;;17460:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17460:64:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;34001:4:0::1;33976:29;:4:::0;;-1:-1:-1;;33981:15:0;;33976:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;33976:21:0::1;-1:-1:-1::0;;;;;33976:29:0::1;;33968:71;;;::::0;;-1:-1:-1;;;33968:71:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;33968:71:0;;;;;;;;;;;;;::::1;;34050:139;34096:4;;34101:1;34096:7;;;;;;34050:139;34200:55;34235:4;;34200:55;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;34249:4:0::1;::::0;-1:-1:-1;34200:34:0::1;::::0;-1:-1:-1;;34200:55:0:i:1;:::-;34283:37;::::0;;-1:-1:-1;;;34283:37:0;;34314:4:::1;34283:37;::::0;::::1;::::0;;;34266:14:::1;::::0;-1:-1:-1;;;;;34290:4:0::1;34283:22;::::0;::::1;::::0;:37;;;;;::::1;::::0;;;;;;;;;:22;:37;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;34283:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;34283:37:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;34283:37:0;;-1:-1:-1;34339:25:0;;::::1;;34331:81;;;;-1:-1:-1::0;;;34331:81:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34429:4;-1:-1:-1::0;;;;;34423:20:0::1;;34444:9;34423:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;34423:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;34423:31:0;;;;34465:45;34496:2;34500:9;34465:30;:45::i;27517:697::-:0;27733:21;27705:8;17480:15;17468:8;:27;;17460:64;;;;;-1:-1:-1;;;17460:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17460:64:0;;;;;;;;;;;;;;;27791:4:::1;-1:-1:-1::0;;;;;27780:15:0::1;:4;;27785:1;27780:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;27780:7:0::1;-1:-1:-1::0;;;;;27780:15:0::1;;27772:57;;;::::0;;-1:-1:-1;;;27772:57:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;27772:57:0;;;;;;;;;;;;;::::1;;27850:56;27881:7;27890:9;27901:4;;27850:56;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;27850:30:0::1;::::0;-1:-1:-1;;;27850:56:0:i:1;:::-;27840:66;;27956:12;27925:7;27950:1;27933:7;:14;:18;27925:27;;;;;;;;;;;;;;:43;;27917:99;;;;-1:-1:-1::0;;;27917:99:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28033:4;-1:-1:-1::0;;;;;28027:19:0::1;;28054:7;28062:1;28054:10;;;;;;;;;;;;;;28027:40;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;28027:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;28027:40:0;;;;;28091:4;-1:-1:-1::0;;;;;28085:20:0::1;;28106:51;28131:7;28140:4;;28145:1;28140:7;;;;;;28106:51;28159:7;28167:1;28159:10;;;;;;;;;;;;;;28085:85;;;;;;;;;;;;;-1:-1:-1::0;;;;;28085:85:0::1;-1:-1:-1::0;;;;;28085:85:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;28085:85:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;28085:85:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;28085:85:0;28078:93:::1;;;;28182:24;28188:7;28197:4;;28182:24;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;28203:2:0;;-1:-1:-1;28182:5:0::1;::::0;-1:-1:-1;;28182:24:0:i:1;:::-;27517:697:::0;;;;;;;;:::o;35028:261::-;35181:13;35219:62;35248:9;35259;35270:10;35219:28;:62::i;26903:606::-;27127:21;27108:8;17480:15;17468:8;:27;;17460:64;;;;;-1:-1:-1;;;17460:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17460:64:0;;;;;;;;;;;;;;;27171:55:::1;27201:7;27210:9;27221:4;;27171:55;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;27171:29:0::1;::::0;-1:-1:-1;;;27171:55:0:i:1;:::-;27161:65;;27259:11;27245:7;27253:1;27245:10;;;;;;;;;;;;;;:25;;27237:77;;;;-1:-1:-1::0;;;27237:77:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17371:38:::0;;;:::o;34562:188::-;34659:12;34691:51;34714:7;34723:8;34733;34691:22;:51::i;23987:700::-;24253:14;24234:8;17480:15;17468:8;:27;;17460:64;;;;;-1:-1:-1;;;17460:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17460:64:0;;;;;;;;;;;;;;;24296:196:::1;24326:5;24346:4;24365:9;24389:14;24418:12;24453:4;24473:8;24296:15;:196::i;:::-;24542:38;::::0;;-1:-1:-1;;;24542:38:0;;24574:4:::1;24542:38;::::0;::::1;::::0;;;24280:212;;-1:-1:-1;24503:78:0::1;::::0;-1:-1:-1;24531:5:0;;24538:2;;-1:-1:-1;;;;;24542:23:0;::::1;::::0;::::1;::::0;:38;;;;;::::1;::::0;;;;;;;;;:23;:38;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;24542:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;24542:38:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;24542:38:0;24503:27:::1;:78::i;:::-;24598:4;-1:-1:-1::0;;;;;24592:20:0::1;;24613:9;24592:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;24592:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;24592:31:0;;;;24634:45;24665:2;24669:9;24634:30;:45::i;32817:850::-:0;33077:8;17480:15;17468:8;:27;;17460:64;;;;;-1:-1:-1;;;17460:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17460:64:0;;;;;;;;;;;;;;;33122:4:::1;-1:-1:-1::0;;;;;33111:15:0::1;:4;;33116:1;33111:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;33111:7:0::1;-1:-1:-1::0;;;;;33111:15:0::1;;33103:57;;;::::0;;-1:-1:-1;;;33103:57:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;33103:57:0;;;;;;;;;;;;;::::1;;33171:13;33187:9;33171:25;;33213:4;-1:-1:-1::0;;;;;33207:19:0::1;;33234:8;33207:38;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;33207:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;33207:38:0;;;;;33269:4;-1:-1:-1::0;;;;;33263:20:0::1;;33284:51;33309:7;33318:4;;33323:1;33318:7;;;;;;33284:51;33337:8;33263:83;;;;;;;;;;;;;-1:-1:-1::0;;;;;33263:83:0::1;-1:-1:-1::0;;;;;33263:83:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;33263:83:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;33263:83:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;33263:83:0;33256:91:::1;;;;33358:18;33386:4:::0;;-1:-1:-1;;33391:15:0;;33386:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;33386:21:0::1;-1:-1:-1::0;;;;;33379:39:0::1;;33419:2;33379:43;;;;;;;;;;;;;-1:-1:-1::0;;;;;33379:43:0::1;-1:-1:-1::0;;;;;33379:43:0::1;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;33379:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;33379:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;33379:43:0;33433:44:::1;::::0;;33379:43:::1;33433:44:::0;;::::1;::::0;;;;;;;;;;;33379:43;;-1:-1:-1;33433:44:0::1;::::0;;;33468:4;;;;;;33433:44;::::1;::::0;33468:4;;33433:44;33468:4;33433:44;1:33:-1::1;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;33474:2:0;;-1:-1:-1;33433:34:0::1;::::0;-1:-1:-1;;33433:44:0:i:1;:::-;33576:12:::0;33510:62:::1;33558:13:::0;33517:4;;-1:-1:-1;;33522:15:0;;33517:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;33517:21:0::1;-1:-1:-1::0;;;;;33510:39:0::1;;33550:2;33510:43;;;;;;;;;;;;;-1:-1:-1::0;;;;;33510:43:0::1;-1:-1:-1::0;;;;;33510:43:0::1;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;21000:865:0::0;21254:12;21268;21235:8;17480:15;17468:8;:27;;17460:64;;;;;-1:-1:-1;;;17460:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17460:64:0;;;;;;;;;;;;;;;21293:12:::1;21308:49;21333:7;21342:6;21350;21308:24;:49::i;:::-;21368:62;::::0;;-1:-1:-1;;;21368:62:0;;21402:10:::1;21368:62;::::0;::::1;::::0;-1:-1:-1;;;;;21368:33:0;::::1;:62:::0;;;;;;;;;;;;;;21293:64;;-1:-1:-1;21368:33:0;;::::1;::::0;:62;;;;;::::1;::::0;;;;;;;;;-1:-1:-1;21368:33:0;:62;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;21368:62:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;21368:62:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;;21498:29:0::1;::::0;;-1:-1:-1;;;21498:29:0;;-1:-1:-1;;;;;21498:29:0;;::::1;;::::0;::::1;::::0;;;21468:12:::1;::::0;;;21498:25;;::::1;::::0;::::1;::::0;:29;;;;;;;;;;;21468:12;21498:25;:29;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;21498:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;21498:29:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;21498:29:0;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;21498:29:0;-1:-1:-1;21539:14:0::1;21558:43;21586:6:::0;21594;21558:27:::1;:43::i;:::-;21538:63;;;21643:6;-1:-1:-1::0;;;;;21633:16:0::1;:6;-1:-1:-1::0;;;;;21633:16:0::1;;:58;;21674:7;21683;21633:58;;;21653:7;21662;21633:58;21612:79:::0;;-1:-1:-1;21612:79:0;-1:-1:-1;21710:21:0;;::::1;;21702:72;;;;-1:-1:-1::0;;;21702:72:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21804:10;21793:7;:21;;21785:72;;;;-1:-1:-1::0;;;21785:72:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17535:1;;;;21000:865:::0;;;;;;;;;;;:::o;17323:41::-;;;:::o;35297:253::-;35441:21;35487:55;35518:7;35527:8;35537:4;35487:30;:55::i;23239:669::-;23528:16;23546:14;23573:12;23588:46;23613:7;23622:5;23629:4;23588:24;:46::i;:::-;23573:61;;23645:10;23658;:33;;23682:9;23658:33;;;-1:-1:-1;;23658:33:0;23702:80;;;-1:-1:-1;;;23702:80:0;;23730:10;23702:80;;;;23750:4;23702:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23645:46;;-1:-1:-1;;;;;;23702:27:0;;;;;:80;;;;;-1:-1:-1;;23702:80:0;;;;;;;;-1:-1:-1;23702:27:0;:80;;;2:2:-1;;;;27:1;24;17:12;2:2;23702:80:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23702:80:0;;;;23820;23839:5;23846:9;23857:14;23873:12;23887:2;23891:8;23820:18;:80::i;:::-;23793:107;;;;-1:-1:-1;23239:669:0;-1:-1:-1;;;;;;;;;;;;;23239:669:0:o;19237:738::-;19525:12;19539;19553:14;19506:8;17480:15;17468:8;:27;;17460:64;;;;;-1:-1:-1;;;17460:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17460:64:0;;;;;;;;;;;;;;;19601:85:::1;19615:6;19623;19631:14;19647;19663:10;19675;19601:13;:85::i;:::-;19580:106:::0;;-1:-1:-1;19580:106:0;-1:-1:-1;19697:12:0::1;19712:49;19737:7;19746:6:::0;19754;19712:24:::1;:49::i;:::-;19697:64;;19772:66;19804:6;19812:10;19824:4;19830:7;19772:31;:66::i;:::-;19849;19881:6;19889:10;19901:4;19907:7;19849:31;:66::i;:::-;19953:4;-1:-1:-1::0;;;;;19938:25:0::1;;19964:2;19938:29;;;;;;;;;;;;;-1:-1:-1::0;;;;;19938:29:0::1;-1:-1:-1::0;;;;;19938:29:0::1;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;19938:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;19938:29:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;19938:29:0;19237:738;;;;-1:-1:-1;19938:29:0;;-1:-1:-1;19237:738:0;;-1:-1:-1;;;;;;;;;19237:738:0:o;19983:974::-;20236:16;20254:14;20270;20217:8;17480:15;17468:8;:27;;17460:64;;;;;-1:-1:-1;;;17460:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17460:64:0;;;;;;;;;;;;;;;20324:176:::1;20352:5;20372:4;20391:18;20424:9;20448:14;20477:12;20324:13;:176::i;:::-;20297:203:::0;;-1:-1:-1;20297:203:0;-1:-1:-1;20511:12:0::1;20526:46;20551:7;20560:5:::0;20567:4:::1;20526:24;:46::i;:::-;20511:61;;20583:69;20615:5;20622:10;20634:4;20640:11;20583:31;:69::i;:::-;20669:4;-1:-1:-1::0;;;;;20663:19:0::1;;20690:9;20663:39;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;20663:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;20663:39:0;;;;;20726:4;-1:-1:-1::0;;;;;20720:20:0::1;;20741:4;20747:9;20720:37;;;;;;;;;;;;;-1:-1:-1::0;;;;;20720:37:0::1;-1:-1:-1::0;;;;;20720:37:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;20720:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;20720:37:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;20720:37:0;20713:45:::1;;;;20796:4;-1:-1:-1::0;;;;;20781:25:0::1;;20807:2;20781:29;;;;;;;;;;;;;-1:-1:-1::0;;;;;20781:29:0::1;-1:-1:-1::0;;;;;20781:29:0::1;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;20781:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;20781:29:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;20781:29:0;;-1:-1:-1;20861:9:0::1;:21:::0;-1:-1:-1;20857:92:0::1;;;20884:65;20915:10;20939:9;20927;:21;20884:30;:65::i;:::-;17535:1;19983:974:::0;;;;;;;;;;;:::o;29916:810::-;30129:21;30101:8;17480:15;17468:8;:27;;17460:64;;;;;-1:-1:-1;;;17460:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17460:64:0;;;;;;;;;;;;;;;30187:4:::1;-1:-1:-1::0;;;;;30176:15:0::1;:4;;30181:1;30176:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;30176:7:0::1;-1:-1:-1::0;;;;;30176:15:0::1;;30168:57;;;::::0;;-1:-1:-1;;;30168:57:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;30168:57:0;;;;;;;;;;;;;::::1;;30246:55;30276:7;30285:9;30296:4;;30246:55;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;30246:29:0::1;::::0;-1:-1:-1;;;30246:55:0:i:1;:::-;30236:65;;30334:9;30320:7;30328:1;30320:10;;;;;;;;;;;;;;:23;;30312:75;;;;-1:-1:-1::0;;;30312:75:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30404:4;-1:-1:-1::0;;;;;30398:19:0::1;;30425:7;30433:1;30425:10;;;;;;;;;;;;;;30398:40;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;30398:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;30398:40:0;;;;;30462:4;-1:-1:-1::0;;;;;30456:20:0::1;;30477:51;30502:7;30511:4;;30516:1;30511:7;;;;;;30477:51;30530:7;30538:1;30530:10;;;;;;;;;;;;;;30456:85;;;;;;;;;;;;;-1:-1:-1::0;;;;;30456:85:0::1;-1:-1:-1::0;;;;;30456:85:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;30456:85:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;30456:85:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;30456:85:0;30449:93:::1;;;;30553:24;30559:7;30568:4;;30553:24;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;30574:2:0;;-1:-1:-1;30553:5:0::1;::::0;-1:-1:-1;;30553:24:0:i:1;:::-;30640:7;30648:1;30640:10;;;;;;;;;;;;;;30628:9;:22;30624:94;;;30652:66;30683:10;30707:7;30715:1;30707:10;;;;;;;;;;;;;;30695:9;:22;30652:30;:66::i;2533:449::-:0;2765:45;;;-1:-1:-1;;;;;2765:45:0;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;2765:45:0;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;2754:57:0;;;;2719:12;;2733:17;;2754:10;;;;2765:45;2754:57;;;25:18:-1;2754:57:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;2754:57:0;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;2718:93:0;;;;2844:7;:57;;;;-1:-1:-1;2856:11:0;;:16;;:44;;;2887:4;2876:24;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;2876:24:0;2856:44;2822:152;;;;-1:-1:-1;;;2822:152:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2533:449;;;;;:::o;3496:217::-;3609:12;;;3569;3609;;;;;;;;;-1:-1:-1;;;;;3587:7:0;;;3602:5;;3587:35;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;3587:35:0;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;3568:54:0;;;3641:7;3633:72;;;;-1:-1:-1;;;3633:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3496:217;;;:::o;14466:519::-;14559:14;14605:1;14594:8;:12;14586:68;;;;-1:-1:-1;;;14586:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14685:1;14673:9;:13;:31;;;;;14703:1;14690:10;:14;14673:31;14665:84;;;;-1:-1:-1;;;14665:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14760:20;14783:18;:8;14796:4;14783:18;:12;:18;:::i;:::-;14760:41;-1:-1:-1;14812:14:0;14829:31;14760:41;14849:10;14829:31;:19;:31;:::i;:::-;14812:48;-1:-1:-1;14871:16:0;14890:41;14915:15;14890:20;:9;14904:5;14890:20;:13;:20;:::i;:::-;:24;:41;:24;:41;:::i;:::-;14871:60;;14966:11;14954:9;:23;;;;;;;14466:519;-1:-1:-1;;;;;;;14466:519:0:o;15662:511::-;15763:21;15820:1;15805:4;:11;:16;;15797:59;;;;;-1:-1:-1;;;15797:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;15888:4;:11;15877:23;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;15877:23:0;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;;-1:-1;15877:23:0;;15867:33;;15924:8;15911:7;15919:1;15911:10;;;;;;;;;;;;;:21;;;;;15948:6;15943:223;15974:1;15960:4;:11;:15;15956:1;:19;15943:223;;;15998:14;16014:15;16033:42;16045:7;16054:4;16059:1;16054:7;;;;;;;;;;;;;;16063:4;16068:1;16072;16068:5;16063:11;;;;;;;;;;;;;;16033;:42::i;:::-;15997:78;;;;16107:47;16120:7;16128:1;16120:10;;;;;;;;;;;;;;16132:9;16143:10;16107:12;:47::i;:::-;16090:7;16098:1;16102;16098:5;16090:14;;;;;;;;;;;;;;;;;:64;-1:-1:-1;;15977:3:0;;15943:223;;;;15662:511;;;;;:::o;12940:478::-;13029:12;13055:14;13071;13089:26;13100:6;13108;13089:10;:26::i;:::-;13253:32;;;-1:-1:-1;;13253:32:0;;;;;;;;;;;;;;;;;;;;;;;;;22::-1;26:21;;;22:32;6:49;;13253:32:0;;;;;13243:43;;;;;;-1:-1:-1;;;;;;13156:251:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;13156:251:0;;;;;;;13146:262;;;;;;;;;12940:478;-1:-1:-1;;;;;12940:478:0:o;2990:498::-;3261:51;;;-1:-1:-1;;;;;3261:51:0;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;3261:51:0;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;3250:63:0;;;;3215:12;;3229:17;;3250:10;;;;3261:51;3250:63;;;25:18:-1;3250:63:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;3250:63:0;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;3214:99:0;;;;3346:7;:57;;;;-1:-1:-1;3358:11:0;;:16;;:44;;;3389:4;3378:24;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;3378:24:0;3358:44;3324:156;;;;-1:-1:-1;;;3324:156:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2990:498;;;;;;:::o;25524:735::-;25631:6;25626:626;25657:1;25643:4;:11;:15;25639:1;:19;25626:626;;;25681:13;25696:14;25715:4;25720:1;25715:7;;;;;;;;;;;;;;25724:4;25729:1;25733;25729:5;25724:11;;;;;;;;;;;;;;25680:56;;;;25752:14;25771:42;25799:5;25806:6;25771:27;:42::i;:::-;25751:62;;;25828:14;25845:7;25853:1;25857;25853:5;25845:14;;;;;;;;;;;;;;25828:31;;25875:15;25892;25920:6;-1:-1:-1;;;;;25911:15:0;:5;-1:-1:-1;;;;;25911:15:0;;:61;;25953:9;25969:1;25911:61;;;25935:1;25939:9;25911:61;25874:98;;;;25987:10;26018:1;26004:4;:11;:15;26000:1;:19;:82;;26079:3;26000:82;;;26022:54;26047:7;26056:6;26064:4;26069:1;26073;26069:5;26064:11;;;;;;;;;;;;;;26022:24;:54::i;:::-;25987:95;;26112:48;26137:7;26146:5;26153:6;26112:24;:48::i;:::-;-1:-1:-1;;;;;26097:69:0;;26185:10;26197;26209:2;26223:1;26213:12;;;;;;;;;;;;;;;;;;;;;;;;;21:6:-1;;108:14;26213:12:0;87:42:-1;143:17;;-1:-1;26213:12:0;;26097:143;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26097:143:0;-1:-1:-1;;;;;26097:143:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;26097:143:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;26097:143:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;25660:3:0;;;;;-1:-1:-1;25626:626:0;;-1:-1:-1;;;;;;;;25626:626:0;;;25524:735;;;:::o;16254:532::-;16355:21;16412:1;16397:4;:11;:16;;16389:59;;;;;-1:-1:-1;;;16389:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;16480:4;:11;16469:23;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;16469:23:0;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;;-1:-1;16469:23:0;;16459:33;;16533:9;16503:7;16528:1;16511:7;:14;:18;16503:27;;;;;;;;;;;;;;;;;:39;16567:11;;-1:-1:-1;;16567:15:0;16553:226;16584:5;;16553:226;;16612:14;16628:15;16647:42;16659:7;16668:4;16677:1;16673;:5;16668:11;;;;;;;;;;;;;;16681:4;16686:1;16681:7;;;;;;;16647:42;16611:78;;;;16721:46;16733:7;16741:1;16733:10;;;;;;;;;;;;;;16745:9;16756:10;16721:11;:46::i;:::-;16704:7;16716:1;16712;:5;16704:14;;;;;;;;;;;;;;;;;:63;-1:-1:-1;;;;16591:3:0;16553:226;;30873:1214;30986:6;30981:1099;31012:1;30998:4;:11;:15;30994:1;:19;30981:1099;;;31036:13;31051:14;31070:4;31075:1;31070:7;;;;;;;;;;;;;;31079:4;31084:1;31088;31084:5;31079:11;;;;;;;;;;;;;;31035:56;;;;31107:14;31126:42;31154:5;31161:6;31126:27;:42::i;:::-;31106:62;;;31183:19;31220:48;31245:7;31254:5;31261:6;31220:24;:48::i;:::-;31183:86;;31284:16;31315:17;31403:13;31418;31436:4;-1:-1:-1;;;;;31436:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;31436:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31436:18:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;31436:18:0;;;;;;;-1:-1:-1;;;;;31402:52:0;;;;-1:-1:-1;31402:52:0;;-1:-1:-1;31470:17:0;;-1:-1:-1;;;;;31511:15:0;;;;;;;:61;;31553:8;31563;31511:61;;;31530:8;31540;31511:61;31469:103;;;;31601:56;31644:12;31608:5;-1:-1:-1;;;;;31601:23:0;;31633:4;31601:38;;;;;;;;;;;;;-1:-1:-1;;;;;31601:38:0;-1:-1:-1;;;;;31601:38:0;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;31601:56:0;31587:70;;31687:71;31717:11;31730:12;31744:13;31687:29;:71::i;:::-;31672:86;;30981:1099;;;;31789:15;31806;31834:6;-1:-1:-1;;;;;31825:15:0;:5;-1:-1:-1;;;;;31825:15:0;;:67;;31870:12;31889:1;31825:67;;;31849:1;31853:12;31825:67;31788:104;;;;31907:10;31938:1;31924:4;:11;:15;31920:1;:19;:82;;31999:3;31920:82;;;31942:54;31967:7;31976:6;31984:4;31989:1;31993;31989:5;31984:11;;;;;;;31942:54;32055:12;;;32065:1;32055:12;;;;;;;;;;-1:-1:-1;;;32017:51:0;;;;;;;;;;;;;;-1:-1:-1;;;;;32017:51:0;;;;;;;;;;;;;;;;;;;;;;31907:95;;-1:-1:-1;32017:9:0;;;;;;32027:10;;32039;;31907:95;;32055:12;;32017:51;;;;;;;;32055:12;;32017:51;;;;32055:12;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;32017:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;32017:51:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;31015:3:0;;;;;-1:-1:-1;30981:1099:0;;-1:-1:-1;;;;;;;;;;30981:1099:0;1555:129;1639:5;;;1634:16;;;;1626:50;;;;;-1:-1:-1;;;1626:50:0;;;;;;;;;;;;-1:-1:-1;;;1626:50:0;;;;;;;;;;;;;;15106:474;15199:13;15245:1;15233:9;:13;15225:70;;;;-1:-1:-1;;;15225:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15326:1;15314:9;:13;:31;;;;;15344:1;15331:10;:14;15314:31;15306:84;;;;-1:-1:-1;;;15306:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15401:14;15418:35;15447:5;15418:24;:9;15432;15418:24;:13;:24;:::i;:::-;:28;:35;:28;:35;:::i;:::-;15401:52;-1:-1:-1;15464:16:0;15483:35;15513:4;15483:25;:10;15498:9;15483:25;:14;:25;:::i;:35::-;15464:54;;15540:32;15570:1;15553:11;15541:9;:23;;;;;;;15540:32;:29;:32;:::i;:::-;15529:43;15106:474;-1:-1:-1;;;;;;15106:474:0:o;14023:321::-;14105:12;14148:1;14138:7;:11;14130:61;;;;-1:-1:-1;;;14130:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14221:1;14210:8;:12;:28;;;;;14237:1;14226:8;:12;14210:28;14202:81;;;;-1:-1:-1;;;14202:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14328:8;14304:21;:7;14316:8;14304:21;:11;:21;:::i;:::-;:32;;;;;;;14023:321;-1:-1:-1;;;;14023:321:0:o;12499:349::-;12574:14;12590;12635:6;-1:-1:-1;;;;;12625:16:0;:6;-1:-1:-1;;;;;12625:16:0;;;12617:66;;;;-1:-1:-1;;;12617:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12722:6;-1:-1:-1;;;;;12713:15:0;:6;-1:-1:-1;;;;;12713:15:0;;:53;;12751:6;12759;12713:53;;;12732:6;12740;12713:53;12694:72;;-1:-1:-1;12694:72:0;-1:-1:-1;;;;;;12785:20:0;;12777:63;;;;;-1:-1:-1;;;12777:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;12499:349;;;;;:::o;17839:1390::-;18152:50;;;-1:-1:-1;;;18152:50:0;;-1:-1:-1;;;;;18152:50:0;;;;;;;;;;;;;;;;18057:12;;;;;;18170:7;18152:34;;;;;;:50;;;;;;;;;;;;;;;:34;:50;;;2:2:-1;;;;27:1;24;17:12;2:2;18152:50:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18152:50:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;18152:50:0;-1:-1:-1;;;;;18152:64:0;;18148:150;;;18233:53;;;-1:-1:-1;;;18233:53:0;;-1:-1:-1;;;;;18233:53:0;;;;;;;;;;;;;;;;18251:7;18233:37;;;;;;:53;;;;;;;;;;;;;;;-1:-1:-1;18233:37:0;:53;;;2:2:-1;;;;27:1;24;17:12;2:2;18233:53:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18233:53:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;18148:150:0;18309:13;18324;18341:53;18370:7;18379:6;18387;18341:28;:53::i;:::-;18308:86;;;;18409:8;18421:1;18409:13;:30;;;;-1:-1:-1;18426:13:0;;18409:30;18405:817;;;18478:14;;-1:-1:-1;18494:14:0;;-1:-1:-1;18405:817:0;;;18542:19;18564:58;18587:14;18603:8;18613;18564:22;:58::i;:::-;18542:80;;18659:14;18641;:32;18637:574;;18720:10;18702:14;:28;;18694:79;;;;-1:-1:-1;;;18694:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18814:14;;-1:-1:-1;18830:14:0;-1:-1:-1;18830:14:0;18637:574;;;18886:19;18908:58;18931:14;18947:8;18957;18908:22;:58::i;:::-;18886:80;;19010:14;18992;:32;;18985:40;;;;19070:10;19052:14;:28;;19044:79;;;;-1:-1:-1;;;19044:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19164:14;-1:-1:-1;19180:14:0;;-1:-1:-1;18637:574:0;18405:817;;17839:1390;;;;;;;;;;;:::o;1692:142::-;1744:6;1771;;;:30;;-1:-1:-1;;1786:5:0;;;1800:1;1795;1786:5;1795:1;1781:15;;;;;:20;1771:30;1763:63;;;;;-1:-1:-1;;;1763:63:0;;;;;;;;;;;;-1:-1:-1;;;1763:63:0;;;;;;;;;;;;;;1419:128;1503:5;;;1498:16;;;;1490:49;;;;;-1:-1:-1;;;1490:49:0;;;;;;;;;;;;-1:-1:-1;;;1490:49:0;;;;;;;;;;;;;;13476:434;13569:13;13584;13611:14;13630:26;13641:6;13649;13630:10;:26::i;:::-;13610:46;;;13667:32;13675:7;13684:6;13692;13667:7;:32::i;:::-;;13711:13;13726;13759:32;13767:7;13776:6;13784;13759:7;:32::i;:::-;-1:-1:-1;;;;;13744:60:0;;:62;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;13744:62:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;13744:62:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;13744:62:0;;;;;;;-1:-1:-1;;;;;13710:96:0;;;;-1:-1:-1;13710:96:0;;-1:-1:-1;;;;;;13840:16:0;;;;;;;:62;;13883:8;13893;13840:62;;;13860:8;13870;13840:62;13817:85;;;;-1:-1:-1;13476:434:0;-1:-1:-1;;;;;;;13476:434:0:o

Swarm Source

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