Contract 0xC0788A3aD43d79aa53B09c2EaCc313A787d1d607 5

DeFi  
 
 
Txn Hash
Method
Block
From
To
Value [Txn Fee]
0xa6d9bbd4632f69028a18fdbc1c4372dd6b0990f4afd0fb72dd2f6db900c2fd40Swap Exact Token...408354032023-03-27 19:15:186 mins ago0x9a7a7d7e8944b8ffb55a874456688328b2f69e9f IN  ApeSwap: Ape Router V20 MATIC0.0130963995104.7
0x6e403705f5ea706a30b63a9591f3a407979889f094ffd402c4cf7374b1a60d28Swap Exact Token...408351362023-03-27 19:04:4817 mins ago0x9a7a7d7e8944b8ffb55a874456688328b2f69e9f IN  ApeSwap: Ape Router V20 MATIC0.0235614924188.4
0xb72a1f2edcbc3a60982d2aaae1a088ed7de19bcd2cc8d6f09b1bf92c07e8e400Add Liquidity ET...408350912023-03-27 19:02:4819 mins ago0x6f39997db2d835f55a7c860eb82905da0472944c IN  ApeSwap: Ape Router V24.972712116099989 MATIC0.030712790096 175.743681848
0xeff994ecad88478a5fad45f1bf33a8b33c4054d1fb4936a166b768afe3224ba1Swap Exact Token...408350682023-03-27 19:01:5020 mins ago0xe59150cc54b28d55b9b1df175a3bdff10a29d1ba IN  ApeSwap: Ape Router V20 MATIC0.020962418341 166.138969527
0x400c9c1b24f5078e427c21d4aac74e8b34e538c2afb7fd78fd08063e5b2a7449Swap Exact ETH F...408348522023-03-27 18:53:4028 mins ago0x6f39997db2d835f55a7c860eb82905da0472944c IN  ApeSwap: Ape Router V25 MATIC0.018070799514 101.301668932
0x1e1f786314e97194d8c73bef9fe6810ae8ea4c74fc0b23cfcc395b65c94bbecaSwap Tokens For ...408348192023-03-27 18:52:3029 mins ago0x9a7a7d7e8944b8ffb55a874456688328b2f69e9f IN  ApeSwap: Ape Router V20 MATIC0.0146355405121.1
0x28ae24b0513600c887cbfce8cacb8eb97e8032687fba3fe3b63e13d3c08ec73bSwap Exact Token...408348102023-03-27 18:52:1029 mins ago0xd2f4299922f46d699be976adf57f431ac31177f8 IN  ApeSwap: Ape Router V20 MATIC0.012639131815 115.832066931
0x28ebebaafdbbda4addc5280a64c66a3a14865affb043b709256ce724b590d42cSwap Exact Token...408347602023-03-27 18:50:1031 mins ago0x6f39997db2d835f55a7c860eb82905da0472944c IN  ApeSwap: Ape Router V20 MATIC0.013024721058 114.719875447
0xd49410754db03c472929ceb52ac39c85aadaad0b5ad5d329795d61ca890839cfSwap Tokens For ...408344132023-03-27 18:35:5845 mins ago0x9a7a7d7e8944b8ffb55a874456688328b2f69e9f IN  ApeSwap: Ape Router V20 MATIC0.034782069287.8
0xa2357ed737a312fb71f9e2d006349313b79c13c740c30bec23b9422aba0415c8Swap Exact ETH F...408343292023-03-27 18:33:0048 mins ago0x3cbf5cfb0a5152cd0f55fce5c08ebf08dbb44508 IN  ApeSwap: Ape Router V20.25 MATIC0.051309309346 400.078826545
0x09039b04516018fabbe6fb1c4e3c3faaa401837685f80cca88f605aea61806b2Swap Tokens For ...408341252023-03-27 18:24:4257 mins ago0x9a7a7d7e8944b8ffb55a874456688328b2f69e9f IN  ApeSwap: Ape Router V20 MATIC0.049381353408.6
0xb6f7cb3d788263f586cce233fc4626862db3b2237e23a84b86b2a22e02e7ded4Swap Exact Token...408339222023-03-27 18:16:501 hr 5 mins ago0xab63b1925aeef953808094486e8c65c6eb537f85 IN  ApeSwap: Ape Router V20 MATIC0.054851162786 453.094464572
0xd29d41562f76597b132b10c99f3a3180f904377308ee12fe1033a44e3c756d92Swap Exact Token...408338262023-03-27 18:12:541 hr 8 mins ago0x9e4f30cfe2eb50a94319a21278071e5f91d3db14 IN  ApeSwap: Ape Router V20 MATIC0.027016681704 235.146455441
0xb647ff949186c2943e623b77e12b0f5579512350897522dcf5304dfbd8021840Swap Exact ETH F...408337712023-03-27 18:10:561 hr 10 mins ago0x9e4f30cfe2eb50a94319a21278071e5f91d3db14 IN  ApeSwap: Ape Router V21 MATIC0.024754950056 215.350320623
0xe605eb2e2ad093289c6f55670a0b147cb2b2fd200a9ea61db7fb2b77e5002813Swap Exact Token...408337562023-03-27 18:10:241 hr 11 mins ago0xe59150cc54b28d55b9b1df175a3bdff10a29d1ba IN  ApeSwap: Ape Router V20 MATIC0.006786176058 210.705003846
0xce3842fad04976e4a54cf3084edce1a304d886223319e96e26e58efbe871e5b4Swap Exact Token...408337332023-03-27 18:09:361 hr 12 mins ago0x9a7a7d7e8944b8ffb55a874456688328b2f69e9f IN  ApeSwap: Ape Router V20 MATIC0.0203282625162.5
0x065a34ced24a1b432ac65137e0cc041f1b1249d50dc16b2f9bbda007ee248a78Swap Exact Token...408336752023-03-27 18:07:001 hr 14 mins ago0x4319c70df94658e136defb879cec81164916aa6f IN  ApeSwap: Ape Router V20 MATIC0.012309194527 112.817642564
0xfa2c72e2bb41cb928e5fd5c9be833ebd75a7ebb2c2f1ba59175b59af1f39a3a3Swap Exact Token...408335042023-03-27 18:00:261 hr 21 mins ago0x89e408bcbfe98708df3a76efe79692385cc62b18 IN  ApeSwap: Ape Router V20 MATIC0.019520559691 171.129401432
0x8f9b11ac1d7896ebb148ca14af602410ad0d4bc5b36822c18ca72f732e4a65d6Swap Exact Token...408334202023-03-27 17:56:541 hr 24 mins ago0x94c73002c66d90d7f09e1664202d9128c842064d IN  ApeSwap: Ape Router V20 MATIC0.013046712429 119.52464321
0x8d883dd0ec3e68b79de15216b777db6f6dbd728168ea33537401a01764769376Swap Exact Token...408333662023-03-27 17:54:281 hr 27 mins ago0x94c73002c66d90d7f09e1664202d9128c842064d IN  ApeSwap: Ape Router V20 MATIC0.026578489907 106.850777938
0x5235be33cd1ff47a1cc42342c48342b90e61058ee2329be1d3f1285cc1429c92Swap Tokens For ...408333122023-03-27 17:52:341 hr 29 mins ago0xb4ee0a802d61242371c5b9c89f817648f335fbf8 IN  ApeSwap: Ape Router V20 MATIC0.003335468317 141.753859644
0x3eebb6ab0a594c235b17de42aa3cfc9f98e4ba0685bc70c170e5f570de5cbb0eSwap Tokens For ...408333122023-03-27 17:52:341 hr 29 mins ago0xb4ee0a802d61242371c5b9c89f817648f335fbf8 IN  ApeSwap: Ape Router V20 MATIC0.00311509135 132.388072714
0x3ac1d5ff08be8c70a39d73d08722e063b430634a35825e76416ed1d54fcffa0eSwap Exact ETH F...408332612023-03-27 17:50:441 hr 31 mins ago0xb5a289c5d3f1eac09d2b3278ac3b0c2981dc5686 IN  ApeSwap: Ape Router V21 MATIC0.012238393739 106.465252795
0xc3968da1a354a6bdc6d32c5fca5d61d1822b9d043aab7614cff14bb52e0a8719Remove Liquidity408332362023-03-27 17:49:521 hr 32 mins ago0x94c73002c66d90d7f09e1664202d9128c842064d IN  ApeSwap: Ape Router V20 MATIC0.016300351774 113.668929126
0xd74ef731420e480dbfda851d8736355a1b5bba3478c7c95f18c86e9ee29f004dSwap Exact Token...408332052023-03-27 17:48:461 hr 33 mins ago0x9a7a7d7e8944b8ffb55a874456688328b2f69e9f IN  ApeSwap: Ape Router V20 MATIC0.0191023119152.7
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xd194bf3d046dd4f01d8029248dd35777ef73a71b8ff56236a1a2594408cb59d3408352702023-03-27 19:10:0411 mins ago ApeSwap: Ape Router V2 BitKeep: Swap Router v10.339441517810829042 MATIC
0xd194bf3d046dd4f01d8029248dd35777ef73a71b8ff56236a1a2594408cb59d3408352702023-03-27 19:10:0411 mins ago Polygon: WMATIC Token ApeSwap: Ape Router V20.339441517810829042 MATIC
0xffd8562ca01cd8d9775e069f0fa7f3957181ac1890044a5855817fb8a220615f408351592023-03-27 19:05:3616 mins ago ApeSwap: Ape Router V2 Polygon: WMATIC Token0.997 MATIC
0xffd8562ca01cd8d9775e069f0fa7f3957181ac1890044a5855817fb8a220615f408351592023-03-27 19:05:3616 mins ago 0x86efb351b092a32d833a1ad7374d9bf0fc164aab ApeSwap: Ape Router V20.997 MATIC
0xb72a1f2edcbc3a60982d2aaae1a088ed7de19bcd2cc8d6f09b1bf92c07e8e400408350912023-03-27 19:02:4819 mins ago ApeSwap: Ape Router V2 Polygon: WMATIC Token4.972712116099989214 MATIC
0xed274cf37e55be605d55d843c54e087055f7dcced126e75708e096daaf646054408349792023-03-27 18:58:1023 mins ago ApeSwap: Ape Router V2 Polygon: WMATIC Token0.001 MATIC
0xed274cf37e55be605d55d843c54e087055f7dcced126e75708e096daaf646054408349792023-03-27 18:58:1023 mins ago 0x4fd39c9e151e50580779bd04b1f7ecc310079fd3 ApeSwap: Ape Router V20.001 MATIC
0x2e1f7c093463125392e7f280f1dfd561259d7f514f9d4dbd0e328a3882fa3eca408349662023-03-27 18:57:4224 mins ago ApeSwap: Ape Router V2 Polygon: WMATIC Token0.2 MATIC
0x2e1f7c093463125392e7f280f1dfd561259d7f514f9d4dbd0e328a3882fa3eca408349662023-03-27 18:57:4224 mins ago 0x4fd39c9e151e50580779bd04b1f7ecc310079fd3 ApeSwap: Ape Router V20.2 MATIC
0x400c9c1b24f5078e427c21d4aac74e8b34e538c2afb7fd78fd08063e5b2a7449408348522023-03-27 18:53:4028 mins ago ApeSwap: Ape Router V2 Polygon: WMATIC Token5 MATIC
0x28ae24b0513600c887cbfce8cacb8eb97e8032687fba3fe3b63e13d3c08ec73b408348102023-03-27 18:52:1029 mins ago ApeSwap: Ape Router V20xd2f4299922f46d699be976adf57f431ac31177f81.851240451147861323 MATIC
0x28ae24b0513600c887cbfce8cacb8eb97e8032687fba3fe3b63e13d3c08ec73b408348102023-03-27 18:52:1029 mins ago Polygon: WMATIC Token ApeSwap: Ape Router V21.851240451147861323 MATIC
0x28ebebaafdbbda4addc5280a64c66a3a14865affb043b709256ce724b590d42c408347602023-03-27 18:50:1031 mins ago ApeSwap: Ape Router V20x6f39997db2d835f55a7c860eb82905da0472944c44.155914495867247794 MATIC
0x28ebebaafdbbda4addc5280a64c66a3a14865affb043b709256ce724b590d42c408347602023-03-27 18:50:1031 mins ago Polygon: WMATIC Token ApeSwap: Ape Router V244.155914495867247794 MATIC
0x5cddd9a2c1e398c0226ba61acf6dd22c93cd90ef7c4e8c5c43db659a013baab8408345602023-03-27 18:42:1639 mins ago ApeSwap: Ape Router V2 Polygon: WMATIC Token0.2 MATIC
0x5cddd9a2c1e398c0226ba61acf6dd22c93cd90ef7c4e8c5c43db659a013baab8408345602023-03-27 18:42:1639 mins ago 0x4fd39c9e151e50580779bd04b1f7ecc310079fd3 ApeSwap: Ape Router V20.2 MATIC
0x09561c4aa886f4fa42bf49339652b732f6cc06cc4cb258a0a7a1ea96ef7462c9408344372023-03-27 18:37:0244 mins ago ApeSwap: Ape Router V2 Polygon: WMATIC Token0.001 MATIC
0x09561c4aa886f4fa42bf49339652b732f6cc06cc4cb258a0a7a1ea96ef7462c9408344372023-03-27 18:37:0244 mins ago 0x4fd39c9e151e50580779bd04b1f7ecc310079fd3 ApeSwap: Ape Router V20.001 MATIC
0xa2357ed737a312fb71f9e2d006349313b79c13c740c30bec23b9422aba0415c8408343292023-03-27 18:33:0048 mins ago ApeSwap: Ape Router V2 Polygon: WMATIC Token0.25 MATIC
0x58069d47bff34f32e56d1490f4d6c90efc185253341c5cbd4fd58ab7efdaa097408342402023-03-27 18:29:2052 mins ago ApeSwap: Ape Router V2 Polygon: WMATIC Token2.95112 MATIC
0x58069d47bff34f32e56d1490f4d6c90efc185253341c5cbd4fd58ab7efdaa097408342402023-03-27 18:29:2052 mins ago 0x86efb351b092a32d833a1ad7374d9bf0fc164aab ApeSwap: Ape Router V22.95112 MATIC
0xdf8ea5936af11251ca68a1c32e6571d5fb0b005631928a78483e79a86a26814d408339552023-03-27 18:18:081 hr 3 mins ago ApeSwap: Ape Router V2 Polygon: WMATIC Token0.05 MATIC
0xdf8ea5936af11251ca68a1c32e6571d5fb0b005631928a78483e79a86a26814d408339552023-03-27 18:18:081 hr 3 mins ago 0x4fd39c9e151e50580779bd04b1f7ecc310079fd3 ApeSwap: Ape Router V20.05 MATIC
0x7fc7a1af3a7358c20aa222381f2de6b3074c30236a6d95299221d4c83dfb737a408339192023-03-27 18:16:421 hr 5 mins ago ApeSwap: Ape Router V2 BitKeep: Swap Router v1165.796792499716918347 MATIC
0x7fc7a1af3a7358c20aa222381f2de6b3074c30236a6d95299221d4c83dfb737a408339192023-03-27 18:16:421 hr 5 mins ago Polygon: WMATIC Token ApeSwap: Ape Router V2165.796792499716918347 MATIC
[ Download CSV Export 
Loading

Similar Match Source Code
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0x9E31215F6421c4EED2c04116d430CaF30999680d

Contract Name:
ApeRouter

Compiler Version
v0.6.6+commit.6c089d02

Optimization Enabled:
Yes with 999999 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Standard Json-Input format)

File 1 of 10 : ApeRouter.sol
pragma solidity =0.6.6;

/*
 * ApeSwapFinance 
 * App:             https://apeswap.finance
 * Medium:          https://ape-swap.medium.com/    
 * Twitter:         https://twitter.com/ape_swap 
 * Telegram:        https://t.me/ape_swap
 * Announcements:   https://t.me/ape_swap_news
 * GitHub:          https://github.com/ApeSwapFinance
 */

import './interfaces/IApeFactory.sol';
import '@uniswap/lib/contracts/libraries/TransferHelper.sol';

import './interfaces/IApeRouter02.sol';
import './libraries/ApeLibrary.sol';
import './libraries/SafeMath.sol';
import './interfaces/IERC20.sol';
import './interfaces/IWETH.sol';

contract ApeRouter is IApeRouter02 {
    using SafeMath for uint;

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

    modifier ensure(uint deadline) {
        require(deadline >= block.timestamp, 'ApeRouter: 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 (IApeFactory(factory).getPair(tokenA, tokenB) == address(0)) {
            IApeFactory(factory).createPair(tokenA, tokenB);
        }
        (uint reserveA, uint reserveB) = ApeLibrary.getReserves(factory, tokenA, tokenB);
        if (reserveA == 0 && reserveB == 0) {
            (amountA, amountB) = (amountADesired, amountBDesired);
        } else {
            uint amountBOptimal = ApeLibrary.quote(amountADesired, reserveA, reserveB);
            if (amountBOptimal <= amountBDesired) {
                require(amountBOptimal >= amountBMin, 'ApeRouter: INSUFFICIENT_B_AMOUNT');
                (amountA, amountB) = (amountADesired, amountBOptimal);
            } else {
                uint amountAOptimal = ApeLibrary.quote(amountBDesired, reserveB, reserveA);
                assert(amountAOptimal <= amountADesired);
                require(amountAOptimal >= amountAMin, 'ApeRouter: 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 = ApeLibrary.pairFor(factory, tokenA, tokenB);
        TransferHelper.safeTransferFrom(tokenA, msg.sender, pair, amountA);
        TransferHelper.safeTransferFrom(tokenB, msg.sender, pair, amountB);
        liquidity = IApePair(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 = ApeLibrary.pairFor(factory, token, WETH);
        TransferHelper.safeTransferFrom(token, msg.sender, pair, amountToken);
        IWETH(WETH).deposit{value: amountETH}();
        assert(IWETH(WETH).transfer(pair, amountETH));
        liquidity = IApePair(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 = ApeLibrary.pairFor(factory, tokenA, tokenB);
        IApePair(pair).transferFrom(msg.sender, pair, liquidity); // send liquidity to pair
        (uint amount0, uint amount1) = IApePair(pair).burn(to);
        (address token0,) = ApeLibrary.sortTokens(tokenA, tokenB);
        (amountA, amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0);
        require(amountA >= amountAMin, 'ApeRouter: INSUFFICIENT_A_AMOUNT');
        require(amountB >= amountBMin, 'ApeRouter: 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 = ApeLibrary.pairFor(factory, tokenA, tokenB);
        uint value = approveMax ? uint(-1) : liquidity;
        IApePair(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 = ApeLibrary.pairFor(factory, token, WETH);
        uint value = approveMax ? uint(-1) : liquidity;
        IApePair(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 = ApeLibrary.pairFor(factory, token, WETH);
        uint value = approveMax ? uint(-1) : liquidity;
        IApePair(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,) = ApeLibrary.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 ? ApeLibrary.pairFor(factory, output, path[i + 2]) : _to;
            IApePair(ApeLibrary.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 = ApeLibrary.getAmountsOut(factory, amountIn, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'ApeRouter: INSUFFICIENT_OUTPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, ApeLibrary.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 = ApeLibrary.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= amountInMax, 'ApeRouter: EXCESSIVE_INPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, ApeLibrary.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, 'ApeRouter: INVALID_PATH');
        amounts = ApeLibrary.getAmountsOut(factory, msg.value, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'ApeRouter: INSUFFICIENT_OUTPUT_AMOUNT');
        IWETH(WETH).deposit{value: amounts[0]}();
        assert(IWETH(WETH).transfer(ApeLibrary.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, 'ApeRouter: INVALID_PATH');
        amounts = ApeLibrary.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= amountInMax, 'ApeRouter: EXCESSIVE_INPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, ApeLibrary.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, 'ApeRouter: INVALID_PATH');
        amounts = ApeLibrary.getAmountsOut(factory, amountIn, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'ApeRouter: INSUFFICIENT_OUTPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, ApeLibrary.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, 'ApeRouter: INVALID_PATH');
        amounts = ApeLibrary.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= msg.value, 'ApeRouter: EXCESSIVE_INPUT_AMOUNT');
        IWETH(WETH).deposit{value: amounts[0]}();
        assert(IWETH(WETH).transfer(ApeLibrary.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,) = ApeLibrary.sortTokens(input, output);
            IApePair pair = IApePair(ApeLibrary.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 = ApeLibrary.getAmountOut(amountInput, reserveInput, reserveOutput);
            }
            (uint amount0Out, uint amount1Out) = input == token0 ? (uint(0), amountOutput) : (amountOutput, uint(0));
            address to = i < path.length - 2 ? ApeLibrary.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, ApeLibrary.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,
            'ApeRouter: INSUFFICIENT_OUTPUT_AMOUNT'
        );
    }
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    )
        external
        virtual
        override
        payable
        ensure(deadline)
    {
        require(path[0] == WETH, 'ApeRouter: INVALID_PATH');
        uint amountIn = msg.value;
        IWETH(WETH).deposit{value: amountIn}();
        assert(IWETH(WETH).transfer(ApeLibrary.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,
            'ApeRouter: 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, 'ApeRouter: INVALID_PATH');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, ApeLibrary.pairFor(factory, path[0], path[1]), amountIn
        );
        _swapSupportingFeeOnTransferTokens(path, address(this));
        uint amountOut = IERC20(WETH).balanceOf(address(this));
        require(amountOut >= amountOutMin, 'ApeRouter: 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 ApeLibrary.quote(amountA, reserveA, reserveB);
    }

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

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

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

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

File 2 of 10 : IApeFactory.sol
pragma solidity >=0.6.6;

interface IApeFactory {
    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;
}

File 3 of 10 : IApeRouter02.sol
pragma solidity >=0.6.2;

import './IApeRouter01.sol';

interface IApeRouter02 is IApeRouter01 {
    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;
}

File 4 of 10 : IApeRouter01.sol
pragma solidity >=0.6.2;

interface IApeRouter01 {
    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);
}

File 5 of 10 : ApeLibrary.sol
pragma solidity >=0.5.0;

/*
 * ApeSwapFinance 
 * App:             https://apeswap.finance
 * Medium:          https://ape-swap.medium.com/    
 * Twitter:         https://twitter.com/ape_swap 
 * Telegram:        https://t.me/ape_swap
 * Announcements:   https://t.me/ape_swap_news
 * GitHub:          https://github.com/ApeSwapFinance
 */

import '../interfaces/IApePair.sol';
import "./SafeMath.sol";

library ApeLibrary {
    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, 'ApeLibrary: IDENTICAL_ADDRESSES');
        (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
        require(token0 != address(0), 'ApeLibrary: 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'511f0f358fe530cda0859ec20becf391718fdf5a329be02f4c95361f3d6a42d8' // 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,) = IApePair(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, 'ApeLibrary: INSUFFICIENT_AMOUNT');
        require(reserveA > 0 && reserveB > 0, 'ApeLibrary: 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, 'ApeLibrary: INSUFFICIENT_INPUT_AMOUNT');
        require(reserveIn > 0 && reserveOut > 0, 'ApeLibrary: INSUFFICIENT_LIQUIDITY');
        uint amountInWithFee = amountIn.mul(998);
        uint numerator = amountInWithFee.mul(reserveOut);
        uint denominator = reserveIn.mul(1000).add(amountInWithFee);
        amountOut = numerator / denominator;
    }

    // given an output amount of an asset and pair reserves, returns a required input amount of the other asset
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) internal pure returns (uint amountIn) {
        require(amountOut > 0, 'ApeLibrary: INSUFFICIENT_OUTPUT_AMOUNT');
        require(reserveIn > 0 && reserveOut > 0, 'ApeLibrary: INSUFFICIENT_LIQUIDITY');
        uint numerator = reserveIn.mul(amountOut).mul(1000);
        uint denominator = reserveOut.sub(amountOut).mul(998);
        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, 'ApeLibrary: 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, 'ApeLibrary: 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);
        }
    }
}

File 6 of 10 : IApePair.sol
pragma solidity >=0.6.6;

interface IApePair {
    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;
}

File 7 of 10 : SafeMath.sol
pragma solidity =0.6.6;

// 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');
    }
}

File 8 of 10 : 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);
}

File 9 of 10 : IWETH.sol
pragma solidity >=0.5.0;

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

File 10 of 10 : 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, uint 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: APPROVE_FAILED');
    }

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

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

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

Settings
{
  "metadata": {
    "useLiteralContent": true
  },
  "optimizer": {
    "enabled": true,
    "runs": 999999
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  }
}

Contract Security Audit

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"}]

60c06040523480156200001157600080fd5b506040516200571a3803806200571a833981810160405260408110156200003757600080fd5b5080516020909101516001600160601b0319606092831b8116608052911b1660a05260805160601c60a05160601c61559362000187600039806101ac5280610e5d5280610e985280610fd5528061129852806116f252806118d65280611e1e5280611fa252806120725280612179528061232c52806123c15280612673528061271a52806127ef52806128f452806129dc5280612a5d5280613118528061344e52806134a452806134d852806135595280613773528061392352806139b85250806110c752806111c5528061136b52806113a4528061154f52806117e452806118b45280611aa1528061225f528061240052806125a95280612a9c5280612ddf528061309d52806130c652806130f652806132d35280613482528061385952806139f7528061447652806144b9528061481952806149fa5280614fa15280615082528061510252506155936000f3fe60806040526004361061018f5760003560e01c80638803dbee116100d6578063c45a01551161007f578063e8e3370011610059578063e8e3370014610c71578063f305d71914610cfe578063fb3bdb4114610d51576101d5565b8063c45a015514610b25578063d06ca61f14610b3a578063ded9382a14610bf1576101d5565b8063af2979eb116100b0578063af2979eb146109c8578063b6f9de9514610a28578063baa2abde14610abb576101d5565b80638803dbee146108af578063ad5c464814610954578063ad615dec14610992576101d5565b80634a25d94a11610138578063791ac94711610112578063791ac947146107415780637ff36ab5146107e657806385f8c25914610879576101d5565b80634a25d94a146105775780635b0d59841461061c5780635c11d7951461069c576101d5565b80631f00ca74116101695780631f00ca74146103905780632195995c1461044757806338ed1739146104d2576101d5565b806302751cec146101da578063054d50d41461025357806318cbafe51461029b576101d5565b366101d5573373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146101d357fe5b005b600080fd5b3480156101e657600080fd5b5061023a600480360360c08110156101fd57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a00135610de4565b6040805192835260208301919091528051918290030190f35b34801561025f57600080fd5b506102896004803603606081101561027657600080fd5b5080359060208101359060400135610f37565b60408051918252519081900360200190f35b3480156102a757600080fd5b50610340600480360360a08110156102be57600080fd5b8135916020810135918101906060810160408201356401000000008111156102e557600080fd5b8201836020820111156102f757600080fd5b8035906020019184602083028401116401000000008311171561031957600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135610f4c565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561037c578181015183820152602001610364565b505050509050019250505060405180910390f35b34801561039c57600080fd5b50610340600480360360408110156103b357600080fd5b813591908101906040810160208201356401000000008111156103d557600080fd5b8201836020820111156103e757600080fd5b8035906020019184602083028401116401000000008311171561040957600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611364945050505050565b34801561045357600080fd5b5061023a600480360361016081101561046b57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013582169160408201359160608101359160808201359160a08101359091169060c08101359060e081013515159060ff610100820135169061012081013590610140013561139a565b3480156104de57600080fd5b50610340600480360360a08110156104f557600080fd5b81359160208101359181019060608101604082013564010000000081111561051c57600080fd5b82018360208201111561052e57600080fd5b8035906020019184602083028401116401000000008311171561055057600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602001356114d8565b34801561058357600080fd5b50610340600480360360a081101561059a57600080fd5b8135916020810135918101906060810160408201356401000000008111156105c157600080fd5b8201836020820111156105d357600080fd5b803590602001918460208302840111640100000000831117156105f557600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135611669565b34801561062857600080fd5b50610289600480360361014081101561064057600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e082013516906101008101359061012001356118ac565b3480156106a857600080fd5b506101d3600480360360a08110156106bf57600080fd5b8135916020810135918101906060810160408201356401000000008111156106e657600080fd5b8201836020820111156106f857600080fd5b8035906020019184602083028401116401000000008311171561071a57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602001356119fe565b34801561074d57600080fd5b506101d3600480360360a081101561076457600080fd5b81359160208101359181019060608101604082013564010000000081111561078b57600080fd5b82018360208201111561079d57600080fd5b803590602001918460208302840111640100000000831117156107bf57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135611d97565b610340600480360360808110156107fc57600080fd5b8135919081019060408101602082013564010000000081111561081e57600080fd5b82018360208201111561083057600080fd5b8035906020019184602083028401116401000000008311171561085257600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135612105565b34801561088557600080fd5b506102896004803603606081101561089c57600080fd5b5080359060208101359060400135612525565b3480156108bb57600080fd5b50610340600480360360a08110156108d257600080fd5b8135916020810135918101906060810160408201356401000000008111156108f957600080fd5b82018360208201111561090b57600080fd5b8035906020019184602083028401116401000000008311171561092d57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135612532565b34801561096057600080fd5b50610969612671565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b34801561099e57600080fd5b50610289600480360360608110156109b557600080fd5b5080359060208101359060400135612695565b3480156109d457600080fd5b50610289600480360360c08110156109eb57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a001356126a2565b6101d360048036036080811015610a3e57600080fd5b81359190810190604081016020820135640100000000811115610a6057600080fd5b820183602082011115610a7257600080fd5b80359060200191846020830284011164010000000083111715610a9457600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135612882565b348015610ac757600080fd5b5061023a600480360360e0811015610ade57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013582169160408201359160608101359160808201359160a08101359091169060c00135612d65565b348015610b3157600080fd5b5061096961309b565b348015610b4657600080fd5b5061034060048036036040811015610b5d57600080fd5b81359190810190604081016020820135640100000000811115610b7f57600080fd5b820183602082011115610b9157600080fd5b80359060200191846020830284011164010000000083111715610bb357600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506130bf945050505050565b348015610bfd57600080fd5b5061023a6004803603610140811015610c1557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e082013516906101008101359061012001356130ec565b348015610c7d57600080fd5b50610ce06004803603610100811015610c9557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013582169160408201359160608101359160808201359160a08101359160c0820135169060e00135613244565b60408051938452602084019290925282820152519081900360600190f35b610ce0600480360360c0811015610d1457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a001356133d3565b61034060048036036080811015610d6757600080fd5b81359190810190604081016020820135640100000000811115610d8957600080fd5b820183602082011115610d9b57600080fd5b80359060200191846020830284011164010000000083111715610dbd57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602001356136ff565b6000808242811015610e5757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f417065526f757465723a20455850495245440000000000000000000000000000604482015290519081900360640190fd5b610e86897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a612d65565b9093509150610e96898685613b4e565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610f0957600080fd5b505af1158015610f1d573d6000803e3d6000fd5b50505050610f2b8583613d2b565b50965096945050505050565b6000610f44848484613e68565b949350505050565b60608142811015610fbe57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f417065526f757465723a20455850495245440000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001686867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811061102357fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146110c257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f417065526f757465723a20494e56414c49445f50415448000000000000000000604482015290519081900360640190fd5b6111207f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613f8c92505050565b9150868260018451038151811061113357fe5b60200260200101511015611192576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806154646025913960400191505060405180910390fd5b611257868660008181106111a257fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff163361123d7f00000000000000000000000000000000000000000000000000000000000000008a8a60008181106111f157fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff168b8b600181811061121b57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff166140f2565b8560008151811061124a57fe5b60200260200101516141dd565b611296828787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152503092506143ad915050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836001855103815181106112e257fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561132057600080fd5b505af1158015611334573d6000803e3d6000fd5b50505050611359848360018551038151811061134c57fe5b6020026020010151613d2b565b509695505050505050565b60606113917f00000000000000000000000000000000000000000000000000000000000000008484614634565b90505b92915050565b60008060006113ca7f00000000000000000000000000000000000000000000000000000000000000008f8f6140f2565b90506000876113d9578c6113fb565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b604080517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c48101889052905191925073ffffffffffffffffffffffffffffffffffffffff84169163d505accf9160e48082019260009290919082900301818387803b15801561149757600080fd5b505af11580156114ab573d6000803e3d6000fd5b505050506114be8f8f8f8f8f8f8f612d65565b809450819550505050509b509b9950505050505050505050565b6060814281101561154a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f417065526f757465723a20455850495245440000000000000000000000000000604482015290519081900360640190fd5b6115a87f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613f8c92505050565b915086826001845103815181106115bb57fe5b6020026020010151101561161a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806154646025913960400191505060405180910390fd5b61162a868660008181106111a257fe5b611359828787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508992506143ad915050565b606081428110156116db57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f417065526f757465723a20455850495245440000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001686867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811061174057fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146117df57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f417065526f757465723a20494e56414c49445f50415448000000000000000000604482015290519081900360640190fd5b61183d7f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061463492505050565b9150868260008151811061184d57fe5b60200260200101511115611192576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806154896021913960400191505060405180910390fd5b6000806118fa7f00000000000000000000000000000000000000000000000000000000000000008d7f00000000000000000000000000000000000000000000000000000000000000006140f2565b9050600086611909578b61192b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b604080517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101839052606481018b905260ff8916608482015260a4810188905260c48101879052905191925073ffffffffffffffffffffffffffffffffffffffff84169163d505accf9160e48082019260009290919082900301818387803b1580156119c757600080fd5b505af11580156119db573d6000803e3d6000fd5b505050506119ed8d8d8d8d8d8d6126a2565b9d9c50505050505050505050505050565b8042811015611a6e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f417065526f757465723a20455850495245440000000000000000000000000000604482015290519081900360640190fd5b611afd85856000818110611a7e57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1633611af77f000000000000000000000000000000000000000000000000000000000000000089896000818110611acd57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff168a8a600181811061121b57fe5b8a6141dd565b600085857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110611b2d57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611bc657600080fd5b505afa158015611bda573d6000803e3d6000fd5b505050506040513d6020811015611bf057600080fd5b50516040805160208881028281018201909352888252929350611c329290918991899182918501908490808284376000920191909152508892506147c2915050565b86611d368288887fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110611c6557fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231886040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611cfe57600080fd5b505afa158015611d12573d6000803e3d6000fd5b505050506040513d6020811015611d2857600080fd5b50519063ffffffff614b5516565b1015611d8d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806154646025913960400191505060405180910390fd5b5050505050505050565b8042811015611e0757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f417065526f757465723a20455850495245440000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001685857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110611e6c57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611f0b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f417065526f757465723a20494e56414c49445f50415448000000000000000000604482015290519081900360640190fd5b611f1b85856000818110611a7e57fe5b611f598585808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152503092506147c2915050565b604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905160009173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016916370a0823191602480820192602092909190829003018186803b158015611fe957600080fd5b505afa158015611ffd573d6000803e3d6000fd5b505050506040513d602081101561201357600080fd5b5051905086811015612070576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806154646025913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156120e357600080fd5b505af11580156120f7573d6000803e3d6000fd5b50505050611d8d8482613d2b565b6060814281101561217757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f417065526f757465723a20455850495245440000000000000000000000000000604482015290519081900360640190fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16868660008181106121bb57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461225a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f417065526f757465723a20494e56414c49445f50415448000000000000000000604482015290519081900360640190fd5b6122b87f000000000000000000000000000000000000000000000000000000000000000034888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613f8c92505050565b915086826001845103815181106122cb57fe5b6020026020010151101561232a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806154646025913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db08360008151811061237357fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b1580156123a657600080fd5b505af11580156123ba573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb61242c7f000000000000000000000000000000000000000000000000000000000000000089896000818110611acd57fe5b8460008151811061243957fe5b60200260200101516040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156124aa57600080fd5b505af11580156124be573d6000803e3d6000fd5b505050506040513d60208110156124d457600080fd5b50516124dc57fe5b61251b828787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508992506143ad915050565b5095945050505050565b6000610f44848484614bc7565b606081428110156125a457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f417065526f757465723a20455850495245440000000000000000000000000000604482015290519081900360640190fd5b6126027f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061463492505050565b9150868260008151811061261257fe5b6020026020010151111561161a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806154896021913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081565b6000610f44848484614ceb565b6000814281101561271457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f417065526f757465723a20455850495245440000000000000000000000000000604482015290519081900360640190fd5b612743887f00000000000000000000000000000000000000000000000000000000000000008989893089612d65565b604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290519194506127ed92508a91879173ffffffffffffffffffffffffffffffffffffffff8416916370a0823191602480820192602092909190829003018186803b1580156127bc57600080fd5b505afa1580156127d0573d6000803e3d6000fd5b505050506040513d60208110156127e657600080fd5b5051613b4e565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561286057600080fd5b505af1158015612874573d6000803e3d6000fd5b505050506113598483613d2b565b80428110156128f257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f417065526f757465723a20455850495245440000000000000000000000000000604482015290519081900360640190fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168585600081811061293657fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146129d557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f417065526f757465723a20494e56414c49445f50415448000000000000000000604482015290519081900360640190fd5b60003490507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015612a4257600080fd5b505af1158015612a56573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb612ac87f000000000000000000000000000000000000000000000000000000000000000089896000818110611acd57fe5b836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612b3257600080fd5b505af1158015612b46573d6000803e3d6000fd5b505050506040513d6020811015612b5c57600080fd5b5051612b6457fe5b600086867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110612b9457fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231866040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612c2d57600080fd5b505afa158015612c41573d6000803e3d6000fd5b505050506040513d6020811015612c5757600080fd5b50516040805160208981028281018201909352898252929350612c999290918a918a9182918501908490808284376000920191909152508992506147c2915050565b87611d368289897fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110612ccc57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231896040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611cfe57600080fd5b6000808242811015612dd857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f417065526f757465723a20455850495245440000000000000000000000000000604482015290519081900360640190fd5b6000612e057f00000000000000000000000000000000000000000000000000000000000000008c8c6140f2565b604080517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff831660248201819052604482018d9052915192935090916323b872dd916064808201926020929091908290030181600087803b158015612e8657600080fd5b505af1158015612e9a573d6000803e3d6000fd5b505050506040513d6020811015612eb057600080fd5b5050604080517f89afcb4400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff888116600483015282516000938493928616926389afcb44926024808301939282900301818787803b158015612f2357600080fd5b505af1158015612f37573d6000803e3d6000fd5b505050506040513d6040811015612f4d57600080fd5b50805160209091015190925090506000612f678e8e614de1565b5090508073ffffffffffffffffffffffffffffffffffffffff168e73ffffffffffffffffffffffffffffffffffffffff1614612fa4578183612fa7565b82825b90975095508a87101561301b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f417065526f757465723a20494e53554646494349454e545f415f414d4f554e54604482015290519081900360640190fd5b8986101561308a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f417065526f757465723a20494e53554646494349454e545f425f414d4f554e54604482015290519081900360640190fd5b505050505097509795505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60606113917f00000000000000000000000000000000000000000000000000000000000000008484613f8c565b600080600061313c7f00000000000000000000000000000000000000000000000000000000000000008e7f00000000000000000000000000000000000000000000000000000000000000006140f2565b905060008761314b578c61316d565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b604080517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c48101889052905191925073ffffffffffffffffffffffffffffffffffffffff84169163d505accf9160e48082019260009290919082900301818387803b15801561320957600080fd5b505af115801561321d573d6000803e3d6000fd5b5050505061322f8e8e8e8e8e8e610de4565b909f909e509c50505050505050505050505050565b600080600083428110156132b957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f417065526f757465723a20455850495245440000000000000000000000000000604482015290519081900360640190fd5b6132c78c8c8c8c8c8c614f4a565b909450925060006132f97f00000000000000000000000000000000000000000000000000000000000000008e8e6140f2565b90506133078d3383886141dd565b6133138c3383876141dd565b8073ffffffffffffffffffffffffffffffffffffffff16636a627842886040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15801561339257600080fd5b505af11580156133a6573d6000803e3d6000fd5b505050506040513d60208110156133bc57600080fd5b5051949d939c50939a509198505050505050505050565b6000806000834281101561344857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f417065526f757465723a20455850495245440000000000000000000000000000604482015290519081900360640190fd5b6134768a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c614f4a565b909450925060006134c87f00000000000000000000000000000000000000000000000000000000000000008c7f00000000000000000000000000000000000000000000000000000000000000006140f2565b90506134d68b3383886141dd565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b15801561353e57600080fd5b505af1158015613552573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb82866040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156135fe57600080fd5b505af1158015613612573d6000803e3d6000fd5b505050506040513d602081101561362857600080fd5b505161363057fe5b8073ffffffffffffffffffffffffffffffffffffffff16636a627842886040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b1580156136af57600080fd5b505af11580156136c3573d6000803e3d6000fd5b505050506040513d60208110156136d957600080fd5b50519250348410156136f1576136f133853403613d2b565b505096509650969350505050565b6060814281101561377157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f417065526f757465723a20455850495245440000000000000000000000000000604482015290519081900360640190fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16868660008181106137b557fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461385457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f417065526f757465723a20494e56414c49445f50415448000000000000000000604482015290519081900360640190fd5b6138b27f00000000000000000000000000000000000000000000000000000000000000008888888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061463492505050565b915034826000815181106138c257fe5b60200260200101511115613921576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806154896021913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db08360008151811061396a57fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561399d57600080fd5b505af11580156139b1573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb613a237f000000000000000000000000000000000000000000000000000000000000000089896000818110611acd57fe5b84600081518110613a3057fe5b60200260200101516040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015613aa157600080fd5b505af1158015613ab5573d6000803e3d6000fd5b505050506040513d6020811015613acb57600080fd5b5051613ad357fe5b613b12828787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508992506143ad915050565b81600081518110613b1f57fe5b602002602001015134111561251b5761251b3383600081518110613b3f57fe5b60200260200101513403613d2b565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000178152925182516000946060949389169392918291908083835b60208310613c2457805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613be7565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613c86576040519150601f19603f3d011682016040523d82523d6000602084013e613c8b565b606091505b5091509150818015613cb9575080511580613cb95750808060200190516020811015613cb657600080fd5b50515b613d2457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604482015290519081900360640190fd5b5050505050565b6040805160008082526020820190925273ffffffffffffffffffffffffffffffffffffffff84169083906040518082805190602001908083835b60208310613da257805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613d65565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613e04576040519150601f19603f3d011682016040523d82523d6000602084013e613e09565b606091505b5050905080613e63576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806154cf6023913960400191505060405180910390fd5b505050565b6000808411613ec2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806154aa6025913960400191505060405180910390fd5b600083118015613ed25750600082115b613f27576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806155166022913960400191505060405180910390fd5b6000613f3b856103e663ffffffff61527716565b90506000613f4f828563ffffffff61527716565b90506000613f7583613f69886103e863ffffffff61527716565b9063ffffffff6152fd16565b9050808281613f8057fe5b04979650505050505050565b6060600282511015613fff57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4170654c6962726172793a20494e56414c49445f504154480000000000000000604482015290519081900360640190fd5b815167ffffffffffffffff8111801561401757600080fd5b50604051908082528060200260200182016040528015614041578160200160208202803683370190505b509050828160008151811061405257fe5b60200260200101818152505060005b60018351038110156140ea576000806140a48786858151811061408057fe5b602002602001015187866001018151811061409757fe5b602002602001015161536f565b915091506140c68484815181106140b757fe5b60200260200101518383613e68565b8484600101815181106140d557fe5b60209081029190910101525050600101614061565b509392505050565b60008060006141018585614de1565b604080517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501207fff0000000000000000000000000000000000000000000000000000000000000060688401529a90941b9093166069840152607d8301989098527f511f0f358fe530cda0859ec20becf391718fdf5a329be02f4c95361f3d6a42d8609d808401919091528851808403909101815260bd909201909752805196019590952095945050505050565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017815292518251600094606094938a169392918291908083835b602083106142bb57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161427e565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461431d576040519150601f19603f3d011682016040523d82523d6000602084013e614322565b606091505b5091509150818015614350575080511580614350575080806020019051602081101561434d57600080fd5b50515b6143a5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806154f26024913960400191505060405180910390fd5b505050505050565b60005b600183510381101561462e576000808483815181106143cb57fe5b60200260200101518584600101815181106143e257fe5b60200260200101519150915060006143fa8383614de1565b509050600087856001018151811061440e57fe5b602002602001015190506000808373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16146144565782600061445a565b6000835b91509150600060028a5103881061447157886144b2565b6144b27f0000000000000000000000000000000000000000000000000000000000000000878c8b600201815181106144a557fe5b60200260200101516140f2565b90506144df7f000000000000000000000000000000000000000000000000000000000000000088886140f2565b73ffffffffffffffffffffffffffffffffffffffff1663022c0d9f84848460006040519080825280601f01601f191660200182016040528015614529576020820181803683370190505b506040518563ffffffff1660e01b8152600401808581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b838110156145b457818101518382015260200161459c565b50505050905090810190601f1680156145e15780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b15801561460357600080fd5b505af1158015614617573d6000803e3d6000fd5b5050600190990198506143b0975050505050505050565b50505050565b60606002825110156146a757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4170654c6962726172793a20494e56414c49445f504154480000000000000000604482015290519081900360640190fd5b815167ffffffffffffffff811180156146bf57600080fd5b506040519080825280602002602001820160405280156146e9578160200160208202803683370190505b50905082816001835103815181106146fd57fe5b602090810291909101015281517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff015b80156140ea5760008061475d8786600186038151811061474957fe5b602002602001015187868151811061409757fe5b9150915061477f84848151811061477057fe5b60200260200101518383614bc7565b84600185038151811061478e57fe5b602090810291909101015250507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0161472d565b60005b6001835103811015613e63576000808483815181106147e057fe5b60200260200101518584600101815181106147f757fe5b602002602001015191509150600061480f8383614de1565b509050600061483f7f000000000000000000000000000000000000000000000000000000000000000085856140f2565b90506000806000808473ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561488d57600080fd5b505afa1580156148a1573d6000803e3d6000fd5b505050506040513d60608110156148b757600080fd5b5080516020909101516dffffffffffffffffffffffffffff918216935016905060008073ffffffffffffffffffffffffffffffffffffffff8a811690891614614901578284614904565b83835b91509150614989828b73ffffffffffffffffffffffffffffffffffffffff166370a082318a6040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611cfe57600080fd5b9550614996868383613e68565b9450505050506000808573ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16146149da578260006149de565b6000835b91509150600060028c51038a106149f5578a614a29565b614a297f0000000000000000000000000000000000000000000000000000000000000000898e8d600201815181106144a557fe5b60408051600080825260208201928390527f022c0d9f000000000000000000000000000000000000000000000000000000008352602482018781526044830187905273ffffffffffffffffffffffffffffffffffffffff8086166064850152608060848501908152845160a48601819052969750908c169563022c0d9f958a958a958a9591949193919260c486019290918190849084905b83811015614ad9578181015183820152602001614ac1565b50505050905090810190601f168015614b065780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b158015614b2857600080fd5b505af1158015614b3c573d6000803e3d6000fd5b50506001909b019a506147c59950505050505050505050565b8082038281111561139457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f64732d6d6174682d7375622d756e646572666c6f770000000000000000000000604482015290519081900360640190fd5b6000808411614c21576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806155386026913960400191505060405180910390fd5b600083118015614c315750600082115b614c86576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806155166022913960400191505060405180910390fd5b6000614caa6103e8614c9e868863ffffffff61527716565b9063ffffffff61527716565b90506000614cc46103e6614c9e868963ffffffff614b5516565b9050614ce16001828481614cd457fe5b049063ffffffff6152fd16565b9695505050505050565b6000808411614d5b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4170654c6962726172793a20494e53554646494349454e545f414d4f554e5400604482015290519081900360640190fd5b600083118015614d6b5750600082115b614dc0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806155166022913960400191505060405180910390fd5b82614dd1858463ffffffff61527716565b81614dd857fe5b04949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415614e7f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4170654c6962726172793a204944454e544943414c5f41444452455353455300604482015290519081900360640190fd5b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1610614eb9578284614ebc565b83835b909250905073ffffffffffffffffffffffffffffffffffffffff8216614f4357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4170654c6962726172793a205a45524f5f414444524553530000000000000000604482015290519081900360640190fd5b9250929050565b604080517fe6a4390500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff888116600483015287811660248301529151600092839283927f00000000000000000000000000000000000000000000000000000000000000009092169163e6a4390591604480820192602092909190829003018186803b158015614fea57600080fd5b505afa158015614ffe573d6000803e3d6000fd5b505050506040513d602081101561501457600080fd5b505173ffffffffffffffffffffffffffffffffffffffff1614156150fa57604080517fc9c6539600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a81166004830152898116602483015291517f00000000000000000000000000000000000000000000000000000000000000009092169163c9c65396916044808201926020929091908290030181600087803b1580156150cd57600080fd5b505af11580156150e1573d6000803e3d6000fd5b505050506040513d60208110156150f757600080fd5b50505b6000806151287f00000000000000000000000000000000000000000000000000000000000000008b8b61536f565b9150915081600014801561513a575080155b1561514a5787935086925061526a565b6000615157898484614ceb565b90508781116151da57858110156151cf57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f417065526f757465723a20494e53554646494349454e545f425f414d4f554e54604482015290519081900360640190fd5b889450925082615268565b60006151e7898486614ceb565b9050898111156151f357fe5b8781101561526257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f417065526f757465723a20494e53554646494349454e545f415f414d4f554e54604482015290519081900360640190fd5b94508793505b505b5050965096945050505050565b60008115806152925750508082028282828161528f57fe5b04145b61139457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f64732d6d6174682d6d756c2d6f766572666c6f77000000000000000000000000604482015290519081900360640190fd5b8082018281101561139457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f64732d6d6174682d6164642d6f766572666c6f77000000000000000000000000604482015290519081900360640190fd5b600080600061537e8585614de1565b50905061538c8686866140f2565b5060008061539b8888886140f2565b73ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b1580156153e057600080fd5b505afa1580156153f4573d6000803e3d6000fd5b505050506040513d606081101561540a57600080fd5b5080516020909101516dffffffffffffffffffffffffffff918216935016905073ffffffffffffffffffffffffffffffffffffffff87811690841614615451578082615454565b81815b9099909850965050505050505056fe417065526f757465723a20494e53554646494349454e545f4f55545055545f414d4f554e54417065526f757465723a204558434553534956455f494e5055545f414d4f554e544170654c6962726172793a20494e53554646494349454e545f494e5055545f414d4f554e545472616e7366657248656c7065723a204554485f5452414e534645525f4641494c45445472616e7366657248656c7065723a205452414e534645525f46524f4d5f4641494c45444170654c6962726172793a20494e53554646494349454e545f4c49515549444954594170654c6962726172793a20494e53554646494349454e545f4f55545055545f414d4f554e54a2646970667358221220077ac949dc8c1ea5b2f2c697f4f6715bdbc1a1195ff8f37e1a2e92d449d0c69264736f6c63430006060033000000000000000000000000cf083be4164828f00cae704ec15a36d7114912840000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf1270

Deployed ByteCode Sourcemap

624:17687:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1069:10;:18;1083:4;1069:18;;1062:26;;;;624:17687;;12:1:-1;9;2:12;5026:653:0;;5:9:-1;2:2;;;27:1;24;17:12;2:2;5026:653:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;5026:653:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;17318:248;;5:9:-1;2:2;;;27:1;24;17:12;2:2;17318:248:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;17318:248:0;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;11887:810;;5:9:-1;2:2;;;27:1;24;17:12;2:2;11887:810:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;11887:810:0;;;;;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;11887:810:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;11887:810:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;11887:810:0;;-1:-1:-1;11887:810:0;-1:-1:-1;11887:810: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;11887:810:0;;;;;;;;;;;;;;;;;18070:239;;5:9:-1;2:2;;;27:1;24;17:12;2:2;18070:239:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;18070:239:0;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;18070:239:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;18070:239:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;18070:239:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;18070:239:0;;-1:-1:-1;18070:239:0;;-1:-1:-1;;;;;18070:239:0:i;5684:651::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;5684:651:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;5684:651:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;9248:597::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;9248:597:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;9248:597:0;;;;;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;9248:597:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;9248:597:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;9248:597:0;;-1:-1:-1;9248:597:0;-1:-1:-1;9248:597:0;;;;;;;;;:::i;11094:788::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;11094:788:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;11094:788:0;;;;;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;11094:788:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;11094:788:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;11094:788:0;;-1:-1:-1;11094:788:0;-1:-1:-1;11094:788:0;;;;;;;;;:::i;7745:691::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;7745:691:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;7745:691:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;14781:686::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;14781:686:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;14781:686:0;;;;;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;14781:686:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;14781:686:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;14781:686:0;;-1:-1:-1;14781:686:0;-1:-1:-1;14781:686:0;;;;;;;;;:::i;16287:804::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;16287:804:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;16287:804:0;;;;;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;16287:804:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;16287:804:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;16287:804:0;;-1:-1:-1;16287:804:0;-1:-1:-1;16287:804:0;;;;;;;;;:::i;10430:659::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;10430:659:0;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;10430:659:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;10430:659:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;10430:659:0;;-1:-1:-1;10430:659:0;-1:-1:-1;10430:659:0;;;;;;;;;:::i;17572:247::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;17572:247:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;17572:247:0;;;;;;;;;;;;:::i;9850:575::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;9850:575:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;9850:575:0;;;;;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;9850:575:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;9850:575:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;9850:575:0;;-1:-1:-1;9850:575:0;-1:-1:-1;9850:575:0;;;;;;;;;:::i;742:38::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;742:38:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;17132:180;;5:9:-1;2:2;;;27:1;24;17:12;2:2;17132:180:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;17132:180:0;;;;;;;;;;;;:::i;7060:680::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;7060:680:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;7060:680:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;15472:810::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;15472:810:0;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;15472:810:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;15472:810:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;15472:810:0;;-1:-1:-1;15472:810:0;-1:-1:-1;15472:810:0;;;;;;;;;:::i;4208:813::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;4208:813:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;4208:813:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;695:41::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;695:41:0;;;:::i;17825:239::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;17825:239:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;17825:239:0;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;17825:239:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;17825:239:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;17825:239:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;17825:239:0;;-1:-1:-1;17825:239:0;;-1:-1:-1;;;;;17825:239:0:i;6340:644::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;6340:644:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;6340:644:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;2513:711::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;2513:711:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;2513:711:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;3229:939;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;3229:939:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;12702:770::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;12702:770:0;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;12702:770:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;12702:770:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;12702:770:0;;-1:-1:-1;12702:770:0;-1:-1:-1;12702:770:0;;;;;;;;;:::i;5026:653::-;5256:16;5274:14;5237:8;848:15;836:8;:27;;828:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5327:188:::1;5356:5;5375:4;5393:9;5416:14;5444:12;5478:4;5497:8;5327:15;:188::i;:::-;5300:215:::0;;-1:-1:-1;5300:215:0;-1:-1:-1;5525:51:0::1;5553:5:::0;5560:2;5300:215;5525:27:::1;:51::i;:::-;5592:4;5586:20;;;5607:9;5586:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;5586:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;5586:31:0;;;;5627:45;5658:2;5662:9;5627:30;:45::i;:::-;5026:653:::0;;;;;;;;;;:::o;17318:248::-;17466:14;17503:56;17527:8;17537:9;17548:10;17503:23;:56::i;:::-;17496:63;17318:248;-1:-1:-1;;;;17318:248:0:o;11887:810::-;12096:21;12069:8;848:15;836:8;:27;;828:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12141:29:::1;12166:4;12141:29;:4:::0;;12146:15;;;12141:21;;::::1;;;;;;;;;;;;;:29;;;12133:65;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;12218:49;12243:7;12252:8;12262:4;;12218:49;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;12218:24:0::1;::::0;-1:-1:-1;;;12218:49:0:i:1;:::-;12208:59;;12316:12;12285:7;12310:1;12293:7;:14;:18;12285:27;;;;;;;;;;;;;;:43;;12277:93;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12380:133;12425:4;;12430:1;12425:7;;;;;;;;;;;;;;;12434:10;12446:45;12465:7;12474:4;;12479:1;12474:7;;;;;;;;;;;;;;;12483:4;;12488:1;12483:7;;;;;;;;;;;;;;;12446:18;:45::i;:::-;12493:7;12501:1;12493:10;;;;;;;;;;;;;;12380:31;:133::i;:::-;12523:35;12529:7;12538:4;;12523:35;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;12552:4:0::1;::::0;-1:-1:-1;12523:5:0::1;::::0;-1:-1:-1;;12523:35:0:i:1;:::-;12574:4;12568:20;;;12589:7;12614:1;12597:7;:14;:18;12589:27;;;;;;;;;;;;;;12568:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;12568:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;12568:49:0;;;;12627:63;12658:2;12662:7;12687:1;12670:7;:14;:18;12662:27;;;;;;;;;;;;;;12627:30;:63::i;:::-;11887:810:::0;;;;;;;;;:::o;18070:239::-;18209:21;18253:49;18277:7;18286:9;18297:4;18253:23;:49::i;:::-;18246:56;;18070:239;;;;;:::o;5684:651::-;5981:12;5995;6019;6034:43;6053:7;6062:6;6070;6034:18;:43::i;:::-;6019:58;;6087:10;6100;:33;;6124:9;6100:33;;;6118:2;6100:33;6143:74;;;;;;6165:10;6143:74;;;;6185:4;6143:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6087:46;;-1:-1:-1;6143:21:0;;;;;;:74;;;;;-1:-1:-1;;6143:74:0;;;;;;;;-1:-1:-1;6143:21:0;:74;;;2:2:-1;;;;27:1;24;17:12;2:2;6143:74:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;6143:74:0;;;;6248:80;6264:6;6272;6280:9;6291:10;6303;6315:2;6319:8;6248:15;:80::i;:::-;6227:101;;;;;;;;5684:651;;;;;;;;;;;;;;;;:::o;9248:597::-;9466:21;9447:8;848:15;836:8;:27;;828:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9509:49:::1;9534:7;9543:8;9553:4;;9509:49;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;9509:24:0::1;::::0;-1:-1:-1;;;9509:49:0:i:1;:::-;9499:59;;9607:12;9576:7;9601:1;9584:7;:14;:18;9576:27;;;;;;;;;;;;;;:43;;9568:93;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9671:133;9716:4;;9721:1;9716:7;;;;;;9671:133;9814:24;9820:7;9829:4;;9814:24;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;9835:2:0;;-1:-1:-1;9814:5:0::1;::::0;-1:-1:-1;;9814:24:0:i:1;11094:788::-:0;11303:21;11276:8;848:15;836:8;:27;;828:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11348:29:::1;11373:4;11348:29;:4:::0;;11353:15;;;11348:21;;::::1;;;;;;;;;;;;;:29;;;11340:65;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;11425:49;11449:7;11458:9;11469:4;;11425:49;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;11425:23:0::1;::::0;-1:-1:-1;;;11425:49:0:i:1;:::-;11415:59;;11506:11;11492:7;11500:1;11492:10;;;;;;;;;;;;;;:25;;11484:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7745:691:::0;8055:14;8081:12;8096:40;8115:7;8124:5;8131:4;8096:18;:40::i;:::-;8081:55;;8146:10;8159;:33;;8183:9;8159:33;;;8177:2;8159:33;8202:74;;;;;;8224:10;8202:74;;;;8244:4;8202:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8146:46;;-1:-1:-1;8202:21:0;;;;;;:74;;;;;-1:-1:-1;;8202:74:0;;;;;;;;-1:-1:-1;8202:21:0;:74;;;2:2:-1;;;;27:1;24;17:12;2:2;8202:74:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;8202:74:0;;;;8298:131;8359:5;8366:9;8377:14;8393:12;8407:2;8411:8;8298:47;:131::i;:::-;8286:143;7745:691;-1:-1:-1;;;;;;;;;;;;;7745:691:0:o;14781:686::-;15009:8;848:15;836:8;:27;;828:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15029:131:::1;15074:4;;15079:1;15074:7;;;;;;;;;;;;;;;15083:10;15095:45;15114:7;15123:4;;15128:1;15123:7;;;;;;;;;;;;;;;15132:4;;15137:1;15132:7;;;;;;15095:45;15142:8;15029:31;:131::i;:::-;15170:18;15198:4:::0;;15203:15;;;15198:21;;::::1;;;;;;;;;;;;;15191:39;;;15231:2;15191:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;15191:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;15191:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;15191:43:0;15244:44:::1;::::0;;15191:43:::1;15244:44:::0;;::::1;::::0;;;;;;;;;;;15191:43;;-1:-1:-1;15244:44:0::1;::::0;;;15279:4;;;;;;15244:44;::::1;::::0;15279:4;;15244:44;15279:4;15244:44;1:33:-1::1;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;15285:2:0;;-1:-1:-1;15244:34:0::1;::::0;-1:-1:-1;;15244:44:0:i:1;:::-;15385:12:::0;15319:62:::1;15367:13:::0;15326:4;;15331:15;;;15326:21;;::::1;;;;;;;;;;;;;15319:39;;;15359:2;15319:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;15319:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;15319:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;15319:43:0;;:62:::1;:47;:62;:::i;:::-;:78;;15298:162;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;896:1;14781:686:::0;;;;;;;:::o;16287:804::-;16544:8;848:15;836:8;:27;;828:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16576:29:::1;16601:4;16576:29;:4:::0;;16581:15;;;16576:21;;::::1;;;;;;;;;;;;;:29;;;16568:65;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;16643:131;16688:4;;16693:1;16688:7;;;;;;16643:131;16784:55;16819:4;;16784:55;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;16833:4:0::1;::::0;-1:-1:-1;16784:34:0::1;::::0;-1:-1:-1;;16784:55:0:i:1;:::-;16866:37;::::0;;;;;16897:4:::1;16866:37;::::0;::::1;::::0;;;16849:14:::1;::::0;16866:22:::1;16873:4;16866:22;::::0;::::1;::::0;:37;;;;;::::1;::::0;;;;;;;;;:22;:37;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;16866:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;16866:37:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;16866:37:0;;-1:-1:-1;16921:25:0;;::::1;;16913:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17004:4;16998:20;;;17019:9;16998:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;16998:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;16998:31:0;;;;17039:45;17070:2;17074:9;17039:30;:45::i;10430:659::-:0;10640:21;10613:8;848:15;836:8;:27;;828:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10696:4:::1;10685:15;;:4;;10690:1;10685:7;;;;;;;;;;;;;;;:15;;;10677:51;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;10748:50;10773:7;10782:9;10793:4;;10748:50;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;10748:24:0::1;::::0;-1:-1:-1;;;10748:50:0:i:1;:::-;10738:60;;10847:12;10816:7;10841:1;10824:7;:14;:18;10816:27;;;;;;;;;;;;;;:43;;10808:93;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10917:4;10911:19;;;10938:7;10946:1;10938:10;;;;;;;;;;;;;;10911:40;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;10911:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;10911:40:0;;;;;10974:4;10968:20;;;10989:45;11008:7;11017:4;;11022:1;11017:7;;;;;;10989:45;11036:7;11044:1;11036:10;;;;;;;;;;;;;;10968:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;10968:79:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;10968:79:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;10968:79:0;10961:87:::1;;;;11058:24;11064:7;11073:4;;11058:24;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;11079:2:0;;-1:-1:-1;11058:5:0::1;::::0;-1:-1:-1;;11058:24:0:i:1;:::-;10430:659:::0;;;;;;;;:::o;17572:247::-;17720:13;17756:56;17779:9;17790;17801:10;17756:22;:56::i;9850:575::-;10068:21;10049:8;848:15;836:8;:27;;828:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10111:49:::1;10135:7;10144:9;10155:4;;10111:49;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;10111:23:0::1;::::0;-1:-1:-1;;;10111:49:0:i:1;:::-;10101:59;;10192:11;10178:7;10186:1;10178:10;;;;;;;;;;;;;;:25;;10170:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;742:38:::0;;;:::o;17132:180::-;17229:12;17260:45;17277:7;17286:8;17296;17260:16;:45::i;7060:680::-;7319:14;7300:8;848:15;836:8;:27;;828:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7361:188:::1;7390:5;7409:4;7427:9;7450:14;7478:12;7512:4;7531:8;7361:15;:188::i;:::-;7598:38;::::0;;;;;7630:4:::1;7598:38;::::0;::::1;::::0;;;7345:204;;-1:-1:-1;7559:78:0::1;::::0;-1:-1:-1;7587:5:0;;7594:2;;7598:23:::1;::::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;7598:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;7598:38:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;7598:38:0;7559:27:::1;:78::i;:::-;7653:4;7647:20;;;7668:9;7647:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;7647:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;7647:31:0;;;;7688:45;7719:2;7723:9;7688:30;:45::i;15472:810::-:0;15722:8;848:15;836:8;:27;;828:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15765:4:::1;15754:15;;:4;;15759:1;15754:7;;;;;;;;;;;;;;;:15;;;15746:51;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;15807:13;15823:9;15807:25;;15848:4;15842:19;;;15869:8;15842:38;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;15842:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;15842:38:0;;;;;15903:4;15897:20;;;15918:45;15937:7;15946:4;;15951:1;15946:7;;;;;;15918:45;15965:8;15897:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;15897:77:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;15897:77:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;15897:77:0;15890:85:::1;;;;15985:18;16013:4:::0;;16018:15;;;16013:21;;::::1;;;;;;;;;;;;;16006:39;;;16046:2;16006:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;16006:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;16006:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;16006:43:0;16059:44:::1;::::0;;16006:43:::1;16059:44:::0;;::::1;::::0;;;;;;;;;;;16006:43;;-1:-1:-1;16059:44:0::1;::::0;;;16094:4;;;;;;16059:44;::::1;::::0;16094:4;;16059:44;16094:4;16059:44;1:33:-1::1;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;16100:2:0;;-1:-1:-1;16059:34:0::1;::::0;-1:-1:-1;;16059:44:0:i:1;:::-;16200:12:::0;16134:62:::1;16182:13:::0;16141:4;;16146:15;;;16141:21;;::::1;;;;;;;;;;;;;16134:39;;;16174:2;16134:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;4208:813:0::0;4454:12;4468;4435:8;848:15;836:8;:27;;828:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4492:12:::1;4507:43;4526:7;4535:6;4543;4507:18;:43::i;:::-;4560:56;::::0;;;;;4588:10:::1;4560:56;::::0;::::1;::::0;:27:::1;::::0;::::1;:56:::0;;;;;;;;;;;;;;4492:58;;-1:-1:-1;4560:27:0;;::::1;::::0;:56;;;;;::::1;::::0;;;;;;;;;-1:-1:-1;4560:27:0;:56;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;4560:56:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;4560:56:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;;4683:23:0::1;::::0;;;;;:19:::1;:23:::0;;::::1;;::::0;::::1;::::0;;;4653:12:::1;::::0;;;4683:19;;::::1;::::0;::::1;::::0;:23;;;;;;;;;;;4653:12;4683:19;:23;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;4683:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;4683:23:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;4683:23:0;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;4683:23:0;-1:-1:-1;4717:14:0::1;4736:37;4758:6:::0;4766;4736:21:::1;:37::i;:::-;4716:57;;;4814:6;4804:16;;:6;:16;;;:58;;4845:7;4854;4804:58;;;4824:7;4833;4804:58;4783:79:::0;;-1:-1:-1;4783:79:0;-1:-1:-1;4880:21:0;;::::1;;4872:66;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;;;;;;;;;;::::1;;4967:10;4956:7;:21;;4948:66;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;;;;;;;;;;::::1;;896:1;;;;4208:813:::0;;;;;;;;;;;:::o;695:41::-;;;:::o;17825:239::-;17964:21;18008:49;18033:7;18042:8;18052:4;18008:24;:49::i;6340:644::-;6621:16;6639:14;6665:12;6680:40;6699:7;6708:5;6715:4;6680:18;:40::i;:::-;6665:55;;6730:10;6743;:33;;6767:9;6743:33;;;6761:2;6743:33;6786:74;;;;;;6808:10;6786:74;;;;6828:4;6786:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6730:46;;-1:-1:-1;6786:21:0;;;;;;:74;;;;;-1:-1:-1;;6786:74:0;;;;;;;;-1:-1:-1;6786:21:0;:74;;;2:2:-1;;;;27:1;24;17:12;2:2;6786:74:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;6786:74:0;;;;6897:80;6916:5;6923:9;6934:14;6950:12;6964:2;6968:8;6897:18;:80::i;:::-;6870:107;;;;-1:-1:-1;6340:644:0;-1:-1:-1;;;;;;;;;;;;;6340:644:0:o;2513:711::-;2792:12;2806;2820:14;2773:8;848:15;836:8;:27;;828:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2867:85:::1;2881:6;2889;2897:14;2913;2929:10;2941;2867:13;:85::i;:::-;2846:106:::0;;-1:-1:-1;2846:106:0;-1:-1:-1;2962:12:0::1;2977:43;2996:7;3005:6:::0;3013;2977:18:::1;:43::i;:::-;2962:58;;3030:66;3062:6;3070:10;3082:4;3088:7;3030:31;:66::i;:::-;3106;3138:6;3146:10;3158:4;3164:7;3106:31;:66::i;:::-;3203:4;3194:19;;;3214:2;3194:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;3194:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;3194:23:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;3194:23:0;2513:711;;;;-1:-1:-1;3194:23:0;;-1:-1:-1;2513:711:0;;-1:-1:-1;;;;;;;;;2513:711:0:o;3229:939::-;3475:16;3493:14;3509;3456:8;848:15;836:8;:27;;828:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3562:169:::1;3589:5;3608:4;3626:18;3658:9;3681:14;3709:12;3562:13;:169::i;:::-;3535:196:::0;;-1:-1:-1;3535:196:0;-1:-1:-1;3741:12:0::1;3756:40;3775:7;3784:5:::0;3791:4:::1;3756:18;:40::i;:::-;3741:55;;3806:69;3838:5;3845:10;3857:4;3863:11;3806:31;:69::i;:::-;3891:4;3885:19;;;3912:9;3885:39;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;3885:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;3885:39:0;;;;;3947:4;3941:20;;;3962:4;3968:9;3941:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;3941:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;3941:37:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;3941:37:0;3934:45:::1;;;;4010:4;4001:19;;;4021:2;4001:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;4001:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;4001:23:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;4001:23:0;;-1:-1:-1;4073:9:0::1;:21:::0;-1:-1:-1;4069:92:0::1;;;4096:65;4127:10;4151:9;4139;:21;4096:30;:65::i;:::-;896:1;3229:939:::0;;;;;;;;;;;:::o;12702:770::-;12909:21;12882:8;848:15;836:8;:27;;828:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12965:4:::1;12954:15;;:4;;12959:1;12954:7;;;;;;;;;;;;;;;:15;;;12946:51;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;13017:49;13041:7;13050:9;13061:4;;13017:49;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;13017:23:0::1;::::0;-1:-1:-1;;;13017:49:0:i:1;:::-;13007:59;;13098:9;13084:7;13092:1;13084:10;;;;;;;;;;;;;;:23;;13076:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13161:4;13155:19;;;13182:7;13190:1;13182:10;;;;;;;;;;;;;;13155:40;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;13155:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;13155:40:0;;;;;13218:4;13212:20;;;13233:45;13252:7;13261:4;;13266:1;13261:7;;;;;;13233:45;13280:7;13288:1;13280:10;;;;;;;;;;;;;;13212:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;13212:79:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;13212:79:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;13212:79:0;13205:87:::1;;;;13302:24;13308:7;13317:4;;13302:24;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;13323:2:0;;-1:-1:-1;13302:5:0::1;::::0;-1:-1:-1;;13302:24:0:i:1;:::-;13387:7;13395:1;13387:10;;;;;;;;;;;;;;13375:9;:22;13371:94;;;13399:66;13430:10;13454:7;13462:1;13454:10;;;;;;;;;;;;;;13442:9;:22;13399:30;:66::i;526:357:9:-:0;719:45;;;708:10;719:45;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;719:45:9;;;;;;;25:18:-1;;61:17;;96:58;182:15;719:45:9;179:29:-1;160:49;;708:57:9;;;;673:12;;687:17;;708:10;;;;719:45;708:57;;;25:18:-1;708:57:9;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;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;;;708:57:9;;;;;;;;;;;;;;;;;;;;;;;;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;;672:93:9;;;;783:7;:57;;;;-1:-1:-1;795:11:9;;:16;;:44;;;826:4;815:24;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;815:24:9;795:44;775:101;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;526:357;;;;;:::o;1293:192::-;1400:12;;;1362;1400;;;;;;;;;1379:7;;;;1393:5;;1379:34;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;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;;;1379:34:9;;;;;;;;;;;;;;;;;;;;;;;;;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;;1361:52:9;;;1431:7;1423:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1293:192;;;:::o;2461:498:7:-;2554:14;2599:1;2588:8;:12;2580:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2672:1;2660:9;:13;:31;;;;;2690:1;2677:10;:14;2660:31;2652:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2740:20;2763:17;:8;2776:3;2763:17;:12;:17;:::i;:::-;2740:40;-1:-1:-1;2790:14:7;2807:31;2740:40;2827:10;2807:31;:19;:31;:::i;:::-;2790:48;-1:-1:-1;2848:16:7;2867:40;2891:15;2867:19;:9;2881:4;2867:19;:13;:19;:::i;:::-;:23;:40;:23;:40;:::i;:::-;2848:59;;2941:11;2929:9;:23;;;;;;;2461:498;-1:-1:-1;;;;;;;2461:498:7:o;3610:497::-;3711:21;3767:1;3752:4;:11;:16;;3744:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3828:4;:11;3817:23;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;3817:23:7;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;;-1:-1;3817:23:7;;3807:33;;3863:8;3850:7;3858:1;3850:10;;;;;;;;;;;;;:21;;;;;3886:6;3881:220;3912:1;3898:4;:11;:15;3894:1;:19;3881:220;;;3935:14;3951:15;3970:42;3982:7;3991:4;3996:1;3991:7;;;;;;;;;;;;;;4000:4;4005:1;4009;4005:5;4000:11;;;;;;;;;;;;;;3970;:42::i;:::-;3934:78;;;;4043:47;4056:7;4064:1;4056:10;;;;;;;;;;;;;;4068:9;4079:10;4043:12;:47::i;:::-;4026:7;4034:1;4038;4034:5;4026:14;;;;;;;;;;;;;;;;;:64;-1:-1:-1;;3915:3:7;;3881:220;;;;3610:497;;;;;:::o;983:466::-;1072:12;1097:14;1113;1131:26;1142:6;1150;1131:10;:26::i;:::-;1291:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22::-1;26:21;;;22:32;6:49;;1291:32:7;;;;;1281:43;;;;;;1197:242;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;1197:242:7;;;;;;;1187:253;;;;;;;;;983:466;-1:-1:-1;;;;;983:466:7:o;889:398:9:-;1112:51;;;1101:10;1112:51;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;1112:51:9;;;;;;;25:18:-1;;61:17;;96:58;182:15;1112:51:9;179:29:-1;160:49;;1101:63:9;;;;1066:12;;1080:17;;1101:10;;;;1112:51;1101:63;;;25:18:-1;1101:63:9;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;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;;;1101:63:9;;;;;;;;;;;;;;;;;;;;;;;;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;;1065:99:9;;;;1182:7;:57;;;;-1:-1:-1;1194:11:9;;:16;;:44;;;1225:4;1214:24;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;1214:24:9;1194:44;1174:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;889:398;;;;;;:::o;8543:700:0:-;8649:6;8644:593;8675:1;8661:4;:11;:15;8657:1;:19;8644:593;;;8698:13;8713:14;8732:4;8737:1;8732:7;;;;;;;;;;;;;;8741:4;8746:1;8750;8746:5;8741:11;;;;;;;;;;;;;;8697:56;;;;8768:14;8787:36;8809:5;8816:6;8787:21;:36::i;:::-;8767:56;;;8837:14;8854:7;8862:1;8866;8862:5;8854:14;;;;;;;;;;;;;;8837:31;;8883:15;8900;8928:6;8919:15;;:5;:15;;;:61;;8961:9;8977:1;8919:61;;;8943:1;8947:9;8919:61;8882:98;;;;8994:10;9025:1;9011:4;:11;:15;9007:1;:19;:76;;9080:3;9007:76;;;9029:48;9048:7;9057:6;9065:4;9070:1;9074;9070:5;9065:11;;;;;;;;;;;;;;9029:18;:48::i;:::-;8994:89;;9106:42;9125:7;9134:5;9141:6;9106:18;:42::i;:::-;9097:57;;;9172:10;9184;9196:2;9210:1;9200:12;;;;;;;;;;;;;;;;;;;;;;;;;21:6:-1;;108:14;9200:12:0;87:42:-1;143:17;;-1:-1;9200:12:0;;9097:129;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;9097:129:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;9097:129:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;8678:3:0;;;;;-1:-1:-1;8644:593:0;;-1:-1:-1;;;;;;;;8644:593:0;;;8543:700;;;:::o;4185:518:7:-;4286:21;4342:1;4327:4;:11;:16;;4319:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4403:4;:11;4392:23;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;4392:23:7;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;;-1:-1;4392:23:7;;4382:33;;4455:9;4425:7;4450:1;4433:7;:14;:18;4425:27;;;;;;;;;;;;;;;;;:39;4488:11;;:15;;4474:223;4505:5;;4474:223;;4532:14;4548:15;4567:42;4579:7;4588:4;4597:1;4593;:5;4588:11;;;;;;;;;;;;;;4601:4;4606:1;4601:7;;;;;;;4567:42;4531:78;;;;4640:46;4652:7;4660:1;4652:10;;;;;;;;;;;;;;4664:9;4675:10;4640:11;:46::i;:::-;4623:7;4635:1;4631;:5;4623:14;;;;;;;;;;;;;;;;;:63;-1:-1:-1;;4512:3:7;;4474:223;;13615:1161:0;13727:6;13722:1048;13753:1;13739:4;:11;:15;13735:1;:19;13722:1048;;;13776:13;13791:14;13810:4;13815:1;13810:7;;;;;;;;;;;;;;13819:4;13824:1;13828;13824:5;13819:11;;;;;;;;;;;;;;13775:56;;;;13846:14;13865:36;13887:5;13894:6;13865:21;:36::i;:::-;13845:56;;;13915:13;13940:42;13959:7;13968:5;13975:6;13940:18;:42::i;:::-;13915:68;;13997:16;14027:17;14113:13;14128;14146:4;:16;;;:18;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;14146:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;14146:18:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;14146:18:0;;;;;;;14112:52;;;;;-1:-1:-1;14112:52:0;;-1:-1:-1;14179:17:0;;14220:15;;;;;;;;:61;;14262:8;14272;14220:61;;;14239:8;14249;14220:61;14178:103;;;;14309:56;14352:12;14316:5;14309:23;;;14341:4;14309:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;14309:56:0;14295:70;;14394:65;14418:11;14431:12;14445:13;14394:23;:65::i;:::-;14379:80;;13722:1048;;;;14488:15;14505;14533:6;14524:15;;:5;:15;;;:67;;14569:12;14588:1;14524:67;;;14548:1;14552:12;14524:67;14487:104;;;;14605:10;14636:1;14622:4;:11;:15;14618:1;:19;:76;;14691:3;14618:76;;;14640:48;14659:7;14668:6;14676:4;14681:1;14685;14681:5;14676:11;;;;;;;14640:48;14746:12;;;14756:1;14746:12;;;;;;;;;;14708:51;;;;;;;;;;;;;;;:9;:51;;;;;;;;;;;;;;;;;;;;;;14605:89;;-1:-1:-1;14708:9:0;;;;;;14718:10;;14730;;14605:89;;14746:12;;14708:51;;;;;;;;14746:12;;14708:51;;;;14746: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;14708:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;14708:51:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;13756:3:0;;;;;-1:-1:-1;13722:1048:0;;-1:-1:-1;;;;;;;;;;13722:1048:0;286:127:8;369:5;;;364:16;;;;356:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3077:454:7;3170:13;3215:1;3203:9;:13;3195:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3289:1;3277:9;:13;:31;;;;;3307:1;3294:10;:14;3277:31;3269:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3357:14;3374:34;3403:4;3374:24;:9;3388;3374:24;:13;:24;:::i;:::-;:28;:34;:28;:34;:::i;:::-;3357:51;-1:-1:-1;3418:16:7;3437:34;3467:3;3437:25;:10;3452:9;3437:25;:14;:25;:::i;:34::-;3418:53;;3492:32;3522:1;3505:11;3493:9;:23;;;;;;;3492:32;:29;:32;:::i;:::-;3481:43;3077:454;-1:-1:-1;;;;;;3077:454:7:o;2037:305::-;2119:12;2161:1;2151:7;:11;2143:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2227:1;2216:8;:12;:28;;;;;2243:1;2232:8;:12;2216:28;2208:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2327:8;2303:21;:7;2315:8;2303:21;:11;:21;:::i;:::-;:32;;;;;;;2037:305;-1:-1:-1;;;;2037:305:7:o;561:333::-;636:14;652;696:6;686:16;;:6;:16;;;;678:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;776:6;767:15;;:6;:15;;;:53;;805:6;813;767:53;;;786:6;794;767:53;748:72;;-1:-1:-1;748:72:7;-1:-1:-1;838:20:7;;;830:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;561:333;;;;;:::o;1187:1321:0:-;1491:44;;;;;;:58;:44;;;;;;;;;;;;;;;;1398:12;;;;;;1503:7;1491:28;;;;;;:44;;;;;;;;;;;;;;;:28;:44;;;2:2:-1;;;;27:1;24;17:12;2:2;1491:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1491:44:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;1491:44:0;:58;;;1487:136;;;1565:47;;;;;;:31;:47;;;;;;;;;;;;;;;;1577:7;1565:31;;;;;;:47;;;;;;;;;;;;;;;-1:-1:-1;1565:31:0;:47;;;2:2:-1;;;;27:1;24;17:12;2:2;1565:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1565:47:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;1487:136:0;1633:13;1648;1665:47;1688:7;1697:6;1705;1665:22;:47::i;:::-;1632:80;;;;1726:8;1738:1;1726:13;:30;;;;-1:-1:-1;1743:13:0;;1726:30;1722:780;;;1794:14;;-1:-1:-1;1810:14:0;;-1:-1:-1;1722:780:0;;;1856:19;1878:52;1895:14;1911:8;1921;1878:16;:52::i;:::-;1856:74;;1966:14;1948;:32;1944:548;;2026:10;2008:14;:28;;2000:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2113:14;;-1:-1:-1;2129:14:0;-1:-1:-1;2129:14:0;1944:548;;;2183:19;2205:52;2222:14;2238:8;2248;2205:16;:52::i;:::-;2183:74;;2300:14;2282;:32;;2275:40;;;;2359:10;2341:14;:28;;2333:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2446:14;-1:-1:-1;2462:14:0;;-1:-1:-1;1944:548:0;1722:780;;1187:1321;;;;;;;;;;;:::o;419:140:8:-;471:6;497;;;:30;;-1:-1:-1;;512:5:8;;;526:1;521;512:5;521:1;507:15;;;;;:20;497:30;489:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;154:126;237:5;;;232:16;;;;224:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1504:423:7;1597:13;1612;1638:14;1657:26;1668:6;1676;1657:10;:26::i;:::-;1637:46;;;1693:32;1701:7;1710:6;1718;1693:7;:32::i;:::-;;1736:13;1751;1778:32;1786:7;1795:6;1803;1778:7;:32::i;:::-;1769:54;;;:56;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;1769:56:7;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1769:56:7;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;1769:56:7;;;;;;;1735:90;;;;;-1:-1:-1;1735:90:7;;-1:-1:-1;1858:16:7;;;;;;;;:62;;1901:8;1911;1858:62;;;1878:8;1888;1858:62;1835:85;;;;-1:-1:-1;1504:423:7;-1:-1:-1;;;;;;;1504:423:7:o

Swarm Source

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