Contract 0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e

Txn Hash Method
Block
From
To
Value [Txn Fee]
0xdeac94b4d09f52acd899352916a149b05d20c18d93bdd8a99ace3d7eabbde138Swap Exact Token...28139042023-02-07 21:29:548 mins ago0x786b1e24177fb2e821b9381174dfcc29bd61b4f7 IN  0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e0 CLV0.00116484
0x7be8151b055f71e69ad162a8d56cff588e114082deba60df659663a6a61a1274Swap Exact Token...28107392023-02-07 10:48:0010 hrs 50 mins ago0x1ce125db01ada30f77b7435e0fd970437193de71 IN  0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e0 CLV0.0116028
0x96eaeba73c0c41183def79519a16c6ded8ef01e21cd43a3b7ceac1c2fe757eb8Swap Exact Token...28105232023-02-07 10:04:2411 hrs 34 mins ago0x1ce125db01ada30f77b7435e0fd970437193de71 IN  0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e0 CLV0.0116028
0xce09e73c5872b918bb2168f1c1fa560ec408e497cb4a5a70a43c731e863e2b7eSwap Exact Token...28076842023-02-07 0:32:2421 hrs 6 mins ago0x786b1e24177fb2e821b9381174dfcc29bd61b4f7 IN  0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e0 CLV0.00116472
0xe3f9f4cced74b03eebe92cafd492d165c72b1fd65eef9a3e949c5584181a4953Add Liquidity ET...28067692023-02-06 21:27:541 day 10 mins ago0xce4078281de3c1b3f493743b6322a38325b7503e IN  0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e6.992488231117622 CLV0.0131296
0x7044f29b5d1a2c219f195fd9965736f60eae63685ce5bb4bfdcdc4f383321c02Swap Exact Token...28063252023-02-06 19:58:421 day 1 hr ago0x786b1e24177fb2e821b9381174dfcc29bd61b4f7 IN  0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e0 CLV0.00116484
0xa40225a5f07170bb1feff6465f01c7f0e5694d8de3b8d768eca1dd0bc4bd49d9Swap Exact ETH F...28051812023-02-06 16:03:541 day 5 hrs ago0x71abba53768a3d8fab89ff22aba855d36aaf0147 IN  0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e312 CLV0.001322425
0x42f0b55564110db18aad86fa3796b01c28ba2dfd14d8e4085203060d79a6c30aAdd Liquidity ET...28012892023-02-06 2:58:361 day 18 hrs ago0x522bab714d329169252c78b25a45aedcb5502bbd IN  0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e82.053531723988896 CLV0.01444388
0x294a6ef422d1fd4f7d6c84f8e05c1edacde9099a679e28b1810bc0b67c8087e1Swap Tokens For ...28012692023-02-06 2:54:241 day 18 hrs ago0x522bab714d329169252c78b25a45aedcb5502bbd IN  0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e0 CLV0.01492205
0x99dc8f5ca3ed57a240ec22be4cde8b45eec053942e98e3e8fea23ca138bbd0c8Swap Exact Token...27996552023-02-05 21:28:482 days 9 mins ago0x786b1e24177fb2e821b9381174dfcc29bd61b4f7 IN  0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e0 CLV0.00116472
0xe1ad170b95dc01b8fd8902b187330b57bb87c1a77a724d558a5b11c9966b5cf1Swap Exact Token...27935332023-02-05 0:51:122 days 20 hrs ago0x786b1e24177fb2e821b9381174dfcc29bd61b4f7 IN  0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e0 CLV0.0011646
0x5ecd8897be75f4018e223fc1dae8ceec4e458bc71d53a509a16e5552949264d4Swap Exact Token...27924912023-02-04 21:20:063 days 18 mins ago0x786b1e24177fb2e821b9381174dfcc29bd61b4f7 IN  0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e0 CLV0.00116484
0x364c7016d91ec1975a799d346cc129fa66ffc5efcd2ebd2d37524ea576bf18a0Add Liquidity27909812023-02-04 16:14:183 days 5 hrs ago0x62b764030bf1f015bfb842b70a5b175054416bb0 IN  0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e0 CLV0.01579105
0x63e867e35006942847b66a340cf200a883d40186f6f895c6177740399c303103Swap Exact Token...27909752023-02-04 16:13:063 days 5 hrs ago0x62b764030bf1f015bfb842b70a5b175054416bb0 IN  0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e0 CLV0.01253956
0x700f7f19e2b16a10213976d4f2ce8522ec6a83644aec23e423b4412714ee7dbbSwap Exact Token...27874752023-02-04 4:24:423 days 17 hrs ago0x786b1e24177fb2e821b9381174dfcc29bd61b4f7 IN  0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e0 CLV0.00116484
0x5c262033fe3c19147cb99ce3c0eb8e005e9406648e9a997e94be271d86a145ecAdd Liquidity ET...27866812023-02-04 1:43:543 days 19 hrs ago0x0617a09a1f1d091f51e296738d452e8a42abf475 IN  0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e4 CLV0.01741234
0xbfac18d0ea035d13e5f74f1973134618d065eec8227a85c88ba2304bb3e17091Swap Exact ETH F...27866742023-02-04 1:42:303 days 19 hrs ago0x0617a09a1f1d091f51e296738d452e8a42abf475 IN  0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e4 CLV0.01336775
0xda052236adb28230d183cd24ef4266a23fa0ce6c7f7be3a67f8b3d8892c280adSwap Exact Token...27846162023-02-03 18:45:304 days 2 hrs ago0x786b1e24177fb2e821b9381174dfcc29bd61b4f7 IN  0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e0 CLV0.00116484
0x1c22576de7c61280a1f0a9d5906316de9f1cef337feb60b362af269f9872b73eSwap Exact Token...27825452023-02-03 11:44:544 days 9 hrs ago0x786b1e24177fb2e821b9381174dfcc29bd61b4f7 IN  0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e0 CLV0.00116484
0xebe38d6f2e70d91a3c6b05bbd56abcfcf3e0f7b67a7b8aec2c64d212b724e813Add Liquidity ET...27822142023-02-03 10:37:484 days 11 hrs ago0x4c30ed208c11e5f4a1cbe4c9f190f0f932b7fb9e IN  0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e11.83286953672271 CLV0.01444366
0x7630ab9ea5b94eadb5b1185448147d35bfbdbdcdef0a4f8e6ce5e8eb54e561fbSwap Exact Token...27822032023-02-03 10:35:364 days 11 hrs ago0xfc2f3c2b6872d6ad347e78f096026274326ab081 IN  0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e0 CLV0.0125422
0xe47543dfdd22e1b25085fedc79c24e2b8618fb3a9bfabff295273d78e3879675Add Liquidity27821962023-02-03 10:34:064 days 11 hrs ago0xfc2f3c2b6872d6ad347e78f096026274326ab081 IN  0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e0 CLV0.01578313
0x726d77ac4e694701c537d37068498fb0313124121715ea3049b443da04b1df52Swap Exact Token...27804852023-02-03 4:49:124 days 16 hrs ago0x786b1e24177fb2e821b9381174dfcc29bd61b4f7 IN  0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e0 CLV0.00116472
0x28050b8118245d9dc3c316db1dfe05d22eafcdbdfe869f944f937d71f2484277Add Liquidity ET...27799592023-02-03 3:03:304 days 18 hrs ago0x522bab714d329169252c78b25a45aedcb5502bbd IN  0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e77.723166986341672 CLV0.01233298
0x538175b1327f67d10cf60384a0da32258fff18bc70623cf73d7d400211569eb2Swap Tokens For ...27799532023-02-03 3:02:184 days 18 hrs ago0x522bab714d329169252c78b25a45aedcb5502bbd IN  0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e0 CLV0.01492205
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xdeac94b4d09f52acd899352916a149b05d20c18d93bdd8a99ace3d7eabbde13828139042023-02-07 21:29:548 mins ago 0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e0x786b1e24177fb2e821b9381174dfcc29bd61b4f768.704766181426611617 CLV
0xdeac94b4d09f52acd899352916a149b05d20c18d93bdd8a99ace3d7eabbde13828139042023-02-07 21:29:548 mins ago 0x6d6ad95425fcf315c39fa6f3226471d4f16f27b3 0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e68.704766181426611617 CLV
0x7be8151b055f71e69ad162a8d56cff588e114082deba60df659663a6a61a127428107392023-02-07 10:48:0010 hrs 50 mins ago 0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e0x1ce125db01ada30f77b7435e0fd970437193de711,312.712933173721010603 CLV
0x7be8151b055f71e69ad162a8d56cff588e114082deba60df659663a6a61a127428107392023-02-07 10:48:0010 hrs 50 mins ago 0x6d6ad95425fcf315c39fa6f3226471d4f16f27b3 0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e1,312.712933173721010603 CLV
0xbe3e297cf6693d309f6d23bd314cda331366c1da67f4eb2451fc3219873a5c7f28105232023-02-07 10:04:2411 hrs 34 mins ago 0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e0x1ce125db01ada30f77b7435e0fd970437193de711,363.114951354755304436 CLV
0xbe3e297cf6693d309f6d23bd314cda331366c1da67f4eb2451fc3219873a5c7f28105232023-02-07 10:04:2411 hrs 34 mins ago 0x6d6ad95425fcf315c39fa6f3226471d4f16f27b3 0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e1,363.114951354755304436 CLV
0xce09e73c5872b918bb2168f1c1fa560ec408e497cb4a5a70a43c731e863e2b7e28076842023-02-07 0:32:2421 hrs 6 mins ago 0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e0x786b1e24177fb2e821b9381174dfcc29bd61b4f715.411659080344062695 CLV
0xce09e73c5872b918bb2168f1c1fa560ec408e497cb4a5a70a43c731e863e2b7e28076842023-02-07 0:32:2421 hrs 6 mins ago 0x6d6ad95425fcf315c39fa6f3226471d4f16f27b3 0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e15.411659080344062695 CLV
0xe3f9f4cced74b03eebe92cafd492d165c72b1fd65eef9a3e949c5584181a495328067692023-02-06 21:27:541 day 10 mins ago 0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e 0x6d6ad95425fcf315c39fa6f3226471d4f16f27b36.992488231117622731 CLV
0x7044f29b5d1a2c219f195fd9965736f60eae63685ce5bb4bfdcdc4f383321c0228063252023-02-06 19:58:421 day 1 hr ago 0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e0x786b1e24177fb2e821b9381174dfcc29bd61b4f775.837697633129398343 CLV
0x7044f29b5d1a2c219f195fd9965736f60eae63685ce5bb4bfdcdc4f383321c0228063252023-02-06 19:58:421 day 1 hr ago 0x6d6ad95425fcf315c39fa6f3226471d4f16f27b3 0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e75.837697633129398343 CLV
0x99dc8f5ca3ed57a240ec22be4cde8b45eec053942e98e3e8fea23ca138bbd0c827996552023-02-05 21:28:482 days 9 mins ago 0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e0x786b1e24177fb2e821b9381174dfcc29bd61b4f769.693970147771101312 CLV
0x99dc8f5ca3ed57a240ec22be4cde8b45eec053942e98e3e8fea23ca138bbd0c827996552023-02-05 21:28:482 days 9 mins ago 0x6d6ad95425fcf315c39fa6f3226471d4f16f27b3 0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e69.693970147771101312 CLV
0xe1ad170b95dc01b8fd8902b187330b57bb87c1a77a724d558a5b11c9966b5cf127935332023-02-05 0:51:122 days 20 hrs ago 0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e0x786b1e24177fb2e821b9381174dfcc29bd61b4f711.912172357908679186 CLV
0xe1ad170b95dc01b8fd8902b187330b57bb87c1a77a724d558a5b11c9966b5cf127935332023-02-05 0:51:122 days 20 hrs ago 0x6d6ad95425fcf315c39fa6f3226471d4f16f27b3 0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e11.912172357908679186 CLV
0x5ecd8897be75f4018e223fc1dae8ceec4e458bc71d53a509a16e5552949264d427924912023-02-04 21:20:063 days 18 mins ago 0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e0x786b1e24177fb2e821b9381174dfcc29bd61b4f757.342362447467812249 CLV
0x5ecd8897be75f4018e223fc1dae8ceec4e458bc71d53a509a16e5552949264d427924912023-02-04 21:20:063 days 18 mins ago 0x6d6ad95425fcf315c39fa6f3226471d4f16f27b3 0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e57.342362447467812249 CLV
0x700f7f19e2b16a10213976d4f2ce8522ec6a83644aec23e423b4412714ee7dbb27874752023-02-04 4:24:423 days 17 hrs ago 0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e0x786b1e24177fb2e821b9381174dfcc29bd61b4f732.677597170151875215 CLV
0x700f7f19e2b16a10213976d4f2ce8522ec6a83644aec23e423b4412714ee7dbb27874752023-02-04 4:24:423 days 17 hrs ago 0x6d6ad95425fcf315c39fa6f3226471d4f16f27b3 0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e32.677597170151875215 CLV
0xda052236adb28230d183cd24ef4266a23fa0ce6c7f7be3a67f8b3d8892c280ad27846162023-02-03 18:45:304 days 2 hrs ago 0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e0x786b1e24177fb2e821b9381174dfcc29bd61b4f723.76661556546835973 CLV
0xda052236adb28230d183cd24ef4266a23fa0ce6c7f7be3a67f8b3d8892c280ad27846162023-02-03 18:45:304 days 2 hrs ago 0x6d6ad95425fcf315c39fa6f3226471d4f16f27b3 0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e23.76661556546835973 CLV
0x1c22576de7c61280a1f0a9d5906316de9f1cef337feb60b362af269f9872b73e27825452023-02-03 11:44:544 days 9 hrs ago 0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e0x786b1e24177fb2e821b9381174dfcc29bd61b4f723.527159208101306198 CLV
0x1c22576de7c61280a1f0a9d5906316de9f1cef337feb60b362af269f9872b73e27825452023-02-03 11:44:544 days 9 hrs ago 0x6d6ad95425fcf315c39fa6f3226471d4f16f27b3 0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e23.527159208101306198 CLV
0x726d77ac4e694701c537d37068498fb0313124121715ea3049b443da04b1df5227804852023-02-03 4:49:124 days 16 hrs ago 0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e0x786b1e24177fb2e821b9381174dfcc29bd61b4f718.316104980938102878 CLV
0x726d77ac4e694701c537d37068498fb0313124121715ea3049b443da04b1df5227804852023-02-03 4:49:124 days 16 hrs ago 0x6d6ad95425fcf315c39fa6f3226471d4f16f27b3 0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e18.316104980938102878 CLV
[ Download CSV Export 
Loading

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

Contract Name:
HuckleberryRouter

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at clvscan.com on 2022-05-16
*/

// File: contracts/interfaces/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: contracts/interfaces/IERC20.sol



pragma solidity 0.6.12;

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: contracts/libraries/SafeMath.sol


pragma solidity 0.6.12;

// 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: contracts/interfaces/IHuckleberryPair.sol


pragma solidity 0.6.12;

interface IHuckleberryPair {
    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: contracts/interfaces/IHuckleberryRouter01.sol


pragma solidity >=0.6.2;

interface IHuckleberryRouter01 {
    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: contracts/interfaces/IHuckleberryRouter.sol


pragma solidity >=0.6.2;


interface IHuckleberryRouter is IHuckleberryRouter01 {
    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: contracts/libraries/TransferHelper.sol




pragma solidity 0.6.12;

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

// File: contracts/interfaces/IHuckleberryFactory.sol


pragma solidity 0.6.12;

interface IHuckleberryFactory {
    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: contracts/libraries/HuckleberryLibrary.sol


pragma solidity >=0.5.0;




library HuckleberryLibrary {
    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, 'HuckleberryLibrary: IDENTICAL_ADDRESSES');
        (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
        require(token0 != address(0), 'HuckleberryLibrary: ZERO_ADDRESS');
    }

    // calculates the CREATE2 address for a pair without making any external calls
    function pairFor(address factory, address tokenA, address tokenB) internal view 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'96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f' // init code hash
        //     ))));
        pair = IHuckleberryFactory(factory).getPair(tokenA, tokenB);
    }

    // fetches and sorts the reserves for a pair
    function getReserves(address factory, address tokenA, address tokenB) internal view returns (uint reserveA, uint reserveB) {
        (address token0,) = sortTokens(tokenA, tokenB);
        (uint reserve0, uint reserve1,) = IHuckleberryPair(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, 'HuckleberryLibrary: INSUFFICIENT_AMOUNT');
        require(reserveA > 0 && reserveB > 0, 'HuckleberryLibrary: 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, 'HuckleberryLibrary: INSUFFICIENT_INPUT_AMOUNT');
        require(reserveIn > 0 && reserveOut > 0, 'HuckleberryLibrary: INSUFFICIENT_LIQUIDITY');
        uint amountInWithFee = amountIn.mul(997);
        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, 'HuckleberryLibrary: INSUFFICIENT_OUTPUT_AMOUNT');
        require(reserveIn > 0 && reserveOut > 0, 'HuckleberryLibrary: INSUFFICIENT_LIQUIDITY');
        uint numerator = reserveIn.mul(amountOut).mul(1000);
        uint denominator = reserveOut.sub(amountOut).mul(997);
        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, 'HuckleberryLibrary: 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, 'HuckleberryLibrary: 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: contracts/HuckleberryRouter.sol


pragma solidity 0.6.12;

/*
 * HuckleberryFinance
 * App:             https://huckleberry.finance
 * GitHub:          https://github.com/huckleberryDex
 */








contract HuckleberryRouter is IHuckleberryRouter {
    using SafeMath for uint;

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

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

    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    )
        external
        virtual
        override
        payable
        ensure(deadline)
    {
        require(path[0] == WETH, 'HuckleberryRouter: INVALID_PATH');
        uint amountIn = msg.value;
        IWETH(WETH).deposit{value: amountIn}();
        assert(IWETH(WETH).transfer(HuckleberryLibrary.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,
            'HuckleberryRouter: 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, 'HuckleberryRouter: INVALID_PATH');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, HuckleberryLibrary.pairFor(factory, path[0], path[1]), amountIn
        );
        _swapSupportingFeeOnTransferTokens(path, address(this));
        uint amountOut = IERC20(WETH).balanceOf(address(this));
        require(amountOut >= amountOutMin, 'HuckleberryRouter: 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 HuckleberryLibrary.quote(amountA, reserveA, reserveB);
    }

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

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

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

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

Contract ABI

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

60c060405234801561001057600080fd5b50604051620046cd380380620046cd8339818101604052604081101561003557600080fd5b5080516020909101516001600160601b0319606092831b8116608052911b1660a05260805160601c60a05160601c614548620001856000398061015f5280610ce45280610d1f5280610e16528061103452806113be528061152452806118d352806119ae5280611a885280611b565280611c9c5280611d245280611f605280611fdb528061208f528061215b52806121f05280612264528061274752806129b15280612a075280612a3b5280612aaf5280612c3d5280612d805280612e08525080610ea45280610f7b52806110fa5280611133528061126e528061144c528061150252806116725280611be95280611d565280611eb0528061229652806124d452806126cc52806126f55280612725528061289252806129e55280612cd05280612e3a528061369452806136d752806139b15280613b275280613f185280613fd1528061408452506145486000f3fe60806040526004361061014f5760003560e01c80638803dbee116100b6578063c45a01551161006f578063c45a015514610a10578063d06ca61f14610a25578063ded9382a14610ada578063e8e3370014610b4d578063f305d71914610bcd578063fb3bdb4114610c1357610188565b80638803dbee146107df578063ad5c464814610875578063ad615dec146108a6578063af2979eb146108dc578063b6f9de951461092f578063baa2abde146109b357610188565b80634a25d94a116101085780634a25d94a146104f05780635b0d5984146105865780635c11d795146105f9578063791ac9471461068f5780637ff36ab51461072557806385f8c259146107a957610188565b806302751cec1461018d578063054d50d4146101f957806318cbafe5146102415780631f00ca74146103275780632195995c146103dc57806338ed17391461045a57610188565b3661018857336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461018657fe5b005b600080fd5b34801561019957600080fd5b506101e0600480360360c08110156101b057600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135610c97565b6040805192835260208301919091528051918290030190f35b34801561020557600080fd5b5061022f6004803603606081101561021c57600080fd5b5080359060208101359060400135610db1565b60408051918252519081900360200190f35b34801561024d57600080fd5b506102d7600480360360a081101561026457600080fd5b813591602081013591810190606081016040820135600160201b81111561028a57600080fd5b82018360208201111561029c57600080fd5b803590602001918460208302840111600160201b831117156102bd57600080fd5b91935091506001600160a01b038135169060200135610dc6565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156103135781810151838201526020016102fb565b505050509050019250505060405180910390f35b34801561033357600080fd5b506102d76004803603604081101561034a57600080fd5b81359190810190604081016020820135600160201b81111561036b57600080fd5b82018360208201111561037d57600080fd5b803590602001918460208302840111600160201b8311171561039e57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506110f3945050505050565b3480156103e857600080fd5b506101e0600480360361016081101561040057600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c08101359060e081013515159060ff6101008201351690610120810135906101400135611129565b34801561046657600080fd5b506102d7600480360360a081101561047d57600080fd5b813591602081013591810190606081016040820135600160201b8111156104a357600080fd5b8201836020820111156104b557600080fd5b803590602001918460208302840111600160201b831117156104d657600080fd5b91935091506001600160a01b038135169060200135611223565b3480156104fc57600080fd5b506102d7600480360360a081101561051357600080fd5b813591602081013591810190606081016040820135600160201b81111561053957600080fd5b82018360208201111561054b57600080fd5b803590602001918460208302840111600160201b8311171561056c57600080fd5b91935091506001600160a01b03813516906020013561136e565b34801561059257600080fd5b5061022f60048036036101408110156105aa57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e082013516906101008101359061012001356114fa565b34801561060557600080fd5b50610186600480360360a081101561061c57600080fd5b813591602081013591810190606081016040820135600160201b81111561064257600080fd5b82018360208201111561065457600080fd5b803590602001918460208302840111600160201b8311171561067557600080fd5b91935091506001600160a01b038135169060200135611608565b34801561069b57600080fd5b50610186600480360360a08110156106b257600080fd5b813591602081013591810190606081016040820135600160201b8111156106d857600080fd5b8201836020820111156106ea57600080fd5b803590602001918460208302840111600160201b8311171561070b57600080fd5b91935091506001600160a01b038135169060200135611885565b6102d76004803603608081101561073b57600080fd5b81359190810190604081016020820135600160201b81111561075c57600080fd5b82018360208201111561076e57600080fd5b803590602001918460208302840111600160201b8311171561078f57600080fd5b91935091506001600160a01b038135169060200135611b0e565b3480156107b557600080fd5b5061022f600480360360608110156107cc57600080fd5b5080359060208101359060400135611e58565b3480156107eb57600080fd5b506102d7600480360360a081101561080257600080fd5b813591602081013591810190606081016040820135600160201b81111561082857600080fd5b82018360208201111561083a57600080fd5b803590602001918460208302840111600160201b8311171561085b57600080fd5b91935091506001600160a01b038135169060200135611e65565b34801561088157600080fd5b5061088a611f5e565b604080516001600160a01b039092168252519081900360200190f35b3480156108b257600080fd5b5061022f600480360360608110156108c957600080fd5b5080359060208101359060400135611f82565b3480156108e857600080fd5b5061022f600480360360c08110156108ff57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135611f8f565b6101866004803603608081101561094557600080fd5b81359190810190604081016020820135600160201b81111561096657600080fd5b82018360208201111561097857600080fd5b803590602001918460208302840111600160201b8311171561099957600080fd5b91935091506001600160a01b038135169060200135612115565b3480156109bf57600080fd5b506101e0600480360360e08110156109d657600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c00135612486565b348015610a1c57600080fd5b5061088a6126ca565b348015610a3157600080fd5b506102d760048036036040811015610a4857600080fd5b81359190810190604081016020820135600160201b811115610a6957600080fd5b820183602082011115610a7b57600080fd5b803590602001918460208302840111600160201b83111715610a9c57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506126ee945050505050565b348015610ae657600080fd5b506101e06004803603610140811015610afe57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e0820135169061010081013590610120013561271b565b348015610b5957600080fd5b50610baf6004803603610100811015610b7157600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359160c0820135169060e0013561282f565b60408051938452602084019290925282820152519081900360600190f35b610baf600480360360c0811015610be357600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135612962565b6102d760048036036080811015610c2957600080fd5b81359190810190604081016020820135600160201b811115610c4a57600080fd5b820183602082011115610c5c57600080fd5b803590602001918460208302840111600160201b83111715610c7d57600080fd5b91935091506001600160a01b038135169060200135612bf5565b6000808242811015610cde576040805162461bcd60e51b815260206004820152601a602482015260008051602061445d833981519152604482015290519081900360640190fd5b610d0d897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a612486565b9093509150610d1d898685612f6e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610d8357600080fd5b505af1158015610d97573d6000803e3d6000fd5b50505050610da585836130d8565b50965096945050505050565b6000610dbe8484846131d0565b949350505050565b60608142811015610e0c576040805162461bcd60e51b815260206004820152601a602482015260008051602061445d833981519152604482015290519081900360640190fd5b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001686866000198101818110610e4657fe5b905060200201356001600160a01b03166001600160a01b031614610e9f576040805162461bcd60e51b815260206004820152601f602482015260008051602061443d833981519152604482015290519081900360640190fd5b610efd7f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506132a892505050565b91508682600184510381518110610f1057fe5b60200260200101511015610f555760405162461bcd60e51b815260040180806020018281038252602d815260200180614362602d913960400191505060405180910390fd5b610ff386866000818110610f6557fe5b905060200201356001600160a01b031633610fd97f00000000000000000000000000000000000000000000000000000000000000008a8a6000818110610fa757fe5b905060200201356001600160a01b03168b8b6001818110610fc457fe5b905060200201356001600160a01b03166133f4565b85600081518110610fe657fe5b6020026020010151613488565b611032828787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152503092506135e5915050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d8360018551038151811061107157fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156110af57600080fd5b505af11580156110c3573d6000803e3d6000fd5b505050506110e884836001855103815181106110db57fe5b60200260200101516130d8565b509695505050505050565b60606111207f00000000000000000000000000000000000000000000000000000000000000008484613822565b90505b92915050565b60008060006111597f00000000000000000000000000000000000000000000000000000000000000008f8f6133f4565b9050600087611168578c61116c565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b1580156111e257600080fd5b505af11580156111f6573d6000803e3d6000fd5b505050506112098f8f8f8f8f8f8f612486565b809450819550505050509b509b9950505050505050505050565b60608142811015611269576040805162461bcd60e51b815260206004820152601a602482015260008051602061445d833981519152604482015290519081900360640190fd5b6112c77f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506132a892505050565b915086826001845103815181106112da57fe5b6020026020010151101561131f5760405162461bcd60e51b815260040180806020018281038252602d815260200180614362602d913960400191505060405180910390fd5b61132f86866000818110610f6557fe5b6110e8828787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508992506135e5915050565b606081428110156113b4576040805162461bcd60e51b815260206004820152601a602482015260008051602061445d833981519152604482015290519081900360640190fd5b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016868660001981018181106113ee57fe5b905060200201356001600160a01b03166001600160a01b031614611447576040805162461bcd60e51b815260206004820152601f602482015260008051602061443d833981519152604482015290519081900360640190fd5b6114a57f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061382292505050565b915086826000815181106114b557fe5b60200260200101511115610f555760405162461bcd60e51b815260040180806020018281038252602981526020018061438f6029913960400191505060405180910390fd5b6000806115487f00000000000000000000000000000000000000000000000000000000000000008d7f00000000000000000000000000000000000000000000000000000000000000006133f4565b9050600086611557578b61155b565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018b905260ff8916608482015260a4810188905260c4810187905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b1580156115d157600080fd5b505af11580156115e5573d6000803e3d6000fd5b505050506115f78d8d8d8d8d8d611f8f565b9d9c50505050505050505050505050565b804281101561164c576040805162461bcd60e51b815260206004820152601a602482015260008051602061445d833981519152604482015290519081900360640190fd5b6116c18585600081811061165c57fe5b905060200201356001600160a01b0316336116bb7f00000000000000000000000000000000000000000000000000000000000000008989600081811061169e57fe5b905060200201356001600160a01b03168a8a6001818110610fc457fe5b8a613488565b6000858560001981018181106116d357fe5b905060200201356001600160a01b03166001600160a01b03166370a08231856040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561172f57600080fd5b505afa158015611743573d6000803e3d6000fd5b505050506040513d602081101561175957600080fd5b5051604080516020888102828101820190935288825292935061179b92909189918991829185019084908082843760009201919091525088925061395a915050565b8661183e82888860001981018181106117b057fe5b905060200201356001600160a01b03166001600160a01b03166370a08231886040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561180c57600080fd5b505afa158015611820573d6000803e3d6000fd5b505050506040513d602081101561183657600080fd5b505190613c5c565b101561187b5760405162461bcd60e51b815260040180806020018281038252602d815260200180614362602d913960400191505060405180910390fd5b5050505050505050565b80428110156118c9576040805162461bcd60e51b815260206004820152601a602482015260008051602061445d833981519152604482015290519081900360640190fd5b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168585600019810181811061190357fe5b905060200201356001600160a01b03166001600160a01b03161461195c576040805162461bcd60e51b815260206004820152601f602482015260008051602061443d833981519152604482015290519081900360640190fd5b61196c8585600081811061165c57fe5b6119aa85858080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525030925061395a915050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611a1957600080fd5b505afa158015611a2d573d6000803e3d6000fd5b505050506040513d6020811015611a4357600080fd5b5051905086811015611a865760405162461bcd60e51b815260040180806020018281038252602d815260200180614362602d913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611aec57600080fd5b505af1158015611b00573d6000803e3d6000fd5b5050505061187b84826130d8565b60608142811015611b54576040805162461bcd60e51b815260206004820152601a602482015260008051602061445d833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110611b8b57fe5b905060200201356001600160a01b03166001600160a01b031614611be4576040805162461bcd60e51b815260206004820152601f602482015260008051602061443d833981519152604482015290519081900360640190fd5b611c427f0000000000000000000000000000000000000000000000000000000000000000348888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506132a892505050565b91508682600184510381518110611c5557fe5b60200260200101511015611c9a5760405162461bcd60e51b815260040180806020018281038252602d815260200180614362602d913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db083600081518110611cd657fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015611d0957600080fd5b505af1158015611d1d573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb611d827f00000000000000000000000000000000000000000000000000000000000000008989600081811061169e57fe5b84600081518110611d8f57fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015611ddd57600080fd5b505af1158015611df1573d6000803e3d6000fd5b505050506040513d6020811015611e0757600080fd5b5051611e0f57fe5b611e4e828787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508992506135e5915050565b5095945050505050565b6000610dbe848484613cac565b60608142811015611eab576040805162461bcd60e51b815260206004820152601a602482015260008051602061445d833981519152604482015290519081900360640190fd5b611f097f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061382292505050565b91508682600081518110611f1957fe5b6020026020010151111561131f5760405162461bcd60e51b815260040180806020018281038252602981526020018061438f6029913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081565b6000610dbe848484613d84565b60008142811015611fd5576040805162461bcd60e51b815260206004820152601a602482015260008051602061445d833981519152604482015290519081900360640190fd5b612004887f00000000000000000000000000000000000000000000000000000000000000008989893089612486565b90508092505061208d88858a6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561205c57600080fd5b505afa158015612070573d6000803e3d6000fd5b505050506040513d602081101561208657600080fd5b5051612f6e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156120f357600080fd5b505af1158015612107573d6000803e3d6000fd5b505050506110e884836130d8565b8042811015612159576040805162461bcd60e51b815260206004820152601a602482015260008051602061445d833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168585600081811061219057fe5b905060200201356001600160a01b03166001600160a01b0316146121e9576040805162461bcd60e51b815260206004820152601f602482015260008051602061443d833981519152604482015290519081900360640190fd5b60003490507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561224957600080fd5b505af115801561225d573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6122c27f00000000000000000000000000000000000000000000000000000000000000008989600081811061169e57fe5b836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561230957600080fd5b505af115801561231d573d6000803e3d6000fd5b505050506040513d602081101561233357600080fd5b505161233b57fe5b60008686600019810181811061234d57fe5b905060200201356001600160a01b03166001600160a01b03166370a08231866040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156123a957600080fd5b505afa1580156123bd573d6000803e3d6000fd5b505050506040513d60208110156123d357600080fd5b505160408051602089810282810182019093528982529293506124159290918a918a91829185019084908082843760009201919091525089925061395a915050565b8761183e828989600019810181811061242a57fe5b905060200201356001600160a01b03166001600160a01b03166370a08231896040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561180c57600080fd5b60008082428110156124cd576040805162461bcd60e51b815260206004820152601a602482015260008051602061445d833981519152604482015290519081900360640190fd5b60006124fa7f00000000000000000000000000000000000000000000000000000000000000008c8c6133f4565b604080516323b872dd60e01b81523360048201526001600160a01b03831660248201819052604482018d9052915192935090916323b872dd916064808201926020929091908290030181600087803b15801561255557600080fd5b505af1158015612569573d6000803e3d6000fd5b505050506040513d602081101561257f57600080fd5b50506040805163226bf2d160e21b81526001600160a01b03888116600483015282516000938493928616926389afcb44926024808301939282900301818787803b1580156125cc57600080fd5b505af11580156125e0573d6000803e3d6000fd5b505050506040513d60408110156125f657600080fd5b508051602090910151909250905060006126108e8e613e2a565b509050806001600160a01b03168e6001600160a01b031614612633578183612636565b82825b90975095508a87101561267a5760405162461bcd60e51b81526004018080602001828103825260288152602001806144a06028913960400191505060405180910390fd5b898610156126b95760405162461bcd60e51b815260040180806020018281038252602881526020018061433a6028913960400191505060405180910390fd5b505050505097509795505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60606111207f000000000000000000000000000000000000000000000000000000000000000084846132a8565b600080600061276b7f00000000000000000000000000000000000000000000000000000000000000008e7f00000000000000000000000000000000000000000000000000000000000000006133f4565b905060008761277a578c61277e565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b1580156127f457600080fd5b505af1158015612808573d6000803e3d6000fd5b5050505061281a8e8e8e8e8e8e610c97565b909f909e509c50505050505050505050505050565b60008060008342811015612878576040805162461bcd60e51b815260206004820152601a602482015260008051602061445d833981519152604482015290519081900360640190fd5b6128868c8c8c8c8c8c613f08565b909450925060006128b87f00000000000000000000000000000000000000000000000000000000000000008e8e6133f4565b90506128c68d338388613488565b6128d28c338387613488565b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050602060405180830381600087803b15801561292157600080fd5b505af1158015612935573d6000803e3d6000fd5b505050506040513d602081101561294b57600080fd5b5051949d939c50939a509198505050505050505050565b600080600083428110156129ab576040805162461bcd60e51b815260206004820152601a602482015260008051602061445d833981519152604482015290519081900360640190fd5b6129d98a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c613f08565b90945092506000612a2b7f00000000000000000000000000000000000000000000000000000000000000008c7f00000000000000000000000000000000000000000000000000000000000000006133f4565b9050612a398b338388613488565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b158015612a9457600080fd5b505af1158015612aa8573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb82866040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612b2457600080fd5b505af1158015612b38573d6000803e3d6000fd5b505050506040513d6020811015612b4e57600080fd5b5051612b5657fe5b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050602060405180830381600087803b158015612ba557600080fd5b505af1158015612bb9573d6000803e3d6000fd5b505050506040513d6020811015612bcf57600080fd5b5051925034841015612be757612be7338534036130d8565b505096509650969350505050565b60608142811015612c3b576040805162461bcd60e51b815260206004820152601a602482015260008051602061445d833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110612c7257fe5b905060200201356001600160a01b03166001600160a01b031614612ccb576040805162461bcd60e51b815260206004820152601f602482015260008051602061443d833981519152604482015290519081900360640190fd5b612d297f00000000000000000000000000000000000000000000000000000000000000008888888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061382292505050565b91503482600081518110612d3957fe5b60200260200101511115612d7e5760405162461bcd60e51b815260040180806020018281038252602981526020018061438f6029913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db083600081518110612dba57fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015612ded57600080fd5b505af1158015612e01573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb612e667f00000000000000000000000000000000000000000000000000000000000000008989600081811061169e57fe5b84600081518110612e7357fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612ec157600080fd5b505af1158015612ed5573d6000803e3d6000fd5b505050506040513d6020811015612eeb57600080fd5b5051612ef357fe5b612f32828787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508992506135e5915050565b81600081518110612f3f57fe5b6020026020010151341115611e4e57611e4e3383600081518110612f5f57fe5b602002602001015134036130d8565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b60208310612feb5780518252601f199092019160209182019101612fcc565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461304d576040519150601f19603f3d011682016040523d82523d6000602084013e613052565b606091505b5091509150818015613080575080511580613080575080806020019051602081101561307d57600080fd5b50515b6130d1576040805162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604482015290519081900360640190fd5b5050505050565b604080516000808252602082019092526001600160a01b0384169083906040518082805190602001908083835b602083106131245780518252601f199092019160209182019101613105565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613186576040519150601f19603f3d011682016040523d82523d6000602084013e61318b565b606091505b50509050806131cb5760405162461bcd60e51b815260040180806020018281038252602381526020018061447d6023913960400191505060405180910390fd5b505050565b60008084116132105760405162461bcd60e51b815260040180806020018281038252602d8152602001806143b8602d913960400191505060405180910390fd5b6000831180156132205750600082115b61325b5760405162461bcd60e51b815260040180806020018281038252602a815260200180614413602a913960400191505060405180910390fd5b6000613269856103e5614199565b905060006132778285614199565b905060006132918361328b886103e8614199565b906141fc565b905080828161329c57fe5b04979650505050505050565b6060600282511015613301576040805162461bcd60e51b815260206004820181905260248201527f4875636b6c6562657272794c6962726172793a20494e56414c49445f50415448604482015290519081900360640190fd5b815167ffffffffffffffff8111801561331957600080fd5b50604051908082528060200260200182016040528015613343578160200160208202803683370190505b509050828160008151811061335457fe5b60200260200101818152505060005b60018351038110156133ec576000806133a68786858151811061338257fe5b602002602001015187866001018151811061339957fe5b602002602001015161424b565b915091506133c88484815181106133b957fe5b602002602001015183836131d0565b8484600101815181106133d757fe5b60209081029190910101525050600101613363565b509392505050565b6000836001600160a01b031663e6a4390584846040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b031681526020019250505060206040518083038186803b15801561345457600080fd5b505afa158015613468573d6000803e3d6000fd5b505050506040513d602081101561347e57600080fd5b5051949350505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17815292518251600094606094938a169392918291908083835b6020831061350d5780518252601f1990920191602091820191016134ee565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461356f576040519150601f19603f3d011682016040523d82523d6000602084013e613574565b606091505b50915091508180156135a25750805115806135a2575080806020019051602081101561359f57600080fd5b50515b6135dd5760405162461bcd60e51b81526004018080602001828103825260248152602001806144ef6024913960400191505060405180910390fd5b505050505050565b60005b600183510381101561381c5760008084838151811061360357fe5b602002602001015185846001018151811061361a57fe5b60200260200101519150915060006136328383613e2a565b509050600087856001018151811061364657fe5b60200260200101519050600080836001600160a01b0316866001600160a01b03161461367457826000613678565b6000835b91509150600060028a5103881061368f57886136d0565b6136d07f0000000000000000000000000000000000000000000000000000000000000000878c8b600201815181106136c357fe5b60200260200101516133f4565b90506136fd7f000000000000000000000000000000000000000000000000000000000000000088886133f4565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f19166020018201604052801561373a576020820181803683370190505b506040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b838110156137a257818101518382015260200161378a565b50505050905090810190601f1680156137cf5780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b1580156137f157600080fd5b505af1158015613805573d6000803e3d6000fd5b5050600190990198506135e8975050505050505050565b50505050565b606060028251101561387b576040805162461bcd60e51b815260206004820181905260248201527f4875636b6c6562657272794c6962726172793a20494e56414c49445f50415448604482015290519081900360640190fd5b815167ffffffffffffffff8111801561389357600080fd5b506040519080825280602002602001820160405280156138bd578160200160208202803683370190505b50905082816001835103815181106138d157fe5b60209081029190910101528151600019015b80156133ec57600080613913878660018603815181106138ff57fe5b602002602001015187868151811061339957fe5b9150915061393584848151811061392657fe5b60200260200101518383613cac565b84600185038151811061394457fe5b60209081029190910101525050600019016138e3565b60005b60018351038110156131cb5760008084838151811061397857fe5b602002602001015185846001018151811061398f57fe5b60200260200101519150915060006139a78383613e2a565b50905060006139d77f000000000000000000000000000000000000000000000000000000000000000085856133f4565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015613a1857600080fd5b505afa158015613a2c573d6000803e3d6000fd5b505050506040513d6060811015613a4257600080fd5b5080516020909101516001600160701b0391821693501690506000806001600160a01b038a811690891614613a78578284613a7b565b83835b91509150613ad0828b6001600160a01b03166370a082318a6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561180c57600080fd5b9550613add8683836131d0565b945050505050600080856001600160a01b0316886001600160a01b031614613b0757826000613b0b565b6000835b91509150600060028c51038a10613b22578a613b56565b613b567f0000000000000000000000000000000000000000000000000000000000000000898e8d600201815181106136c357fe5b604080516000808252602082019283905263022c0d9f60e01b835260248201878152604483018790526001600160a01b038086166064850152608060848501908152845160a48601819052969750908c169563022c0d9f958a958a958a9591949193919260c486019290918190849084905b83811015613be0578181015183820152602001613bc8565b50505050905090810190601f168015613c0d5780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b158015613c2f57600080fd5b505af1158015613c43573d6000803e3d6000fd5b50506001909b019a5061395d9950505050505050505050565b80820382811115611123576040805162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b604482015290519081900360640190fd5b6000808411613cec5760405162461bcd60e51b815260040180806020018281038252602e8152602001806143e5602e913960400191505060405180910390fd5b600083118015613cfc5750600082115b613d375760405162461bcd60e51b815260040180806020018281038252602a815260200180614413602a913960400191505060405180910390fd5b6000613d4f6103e8613d498688614199565b90614199565b90506000613d636103e5613d498689613c5c565b9050613d7a6001828481613d7357fe5b04906141fc565b9695505050505050565b6000808411613dc45760405162461bcd60e51b81526004018080602001828103825260278152602001806144c86027913960400191505060405180910390fd5b600083118015613dd45750600082115b613e0f5760405162461bcd60e51b815260040180806020018281038252602a815260200180614413602a913960400191505060405180910390fd5b82613e1a8584614199565b81613e2157fe5b04949350505050565b600080826001600160a01b0316846001600160a01b03161415613e7e5760405162461bcd60e51b81526004018080602001828103825260278152602001806143136027913960400191505060405180910390fd5b826001600160a01b0316846001600160a01b031610613e9e578284613ea1565b83835b90925090506001600160a01b038216613f01576040805162461bcd60e51b815260206004820181905260248201527f4875636b6c6562657272794c6962726172793a205a45524f5f41444452455353604482015290519081900360640190fd5b9250929050565b60008060006001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e6a439058a8a6040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b031681526020019250505060206040518083038186803b158015613f9457600080fd5b505afa158015613fa8573d6000803e3d6000fd5b505050506040513d6020811015613fbe57600080fd5b50516001600160a01b0316141561407c577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c9c6539689896040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b0316815260200192505050602060405180830381600087803b15801561404f57600080fd5b505af1158015614063573d6000803e3d6000fd5b505050506040513d602081101561407957600080fd5b50505b6000806140aa7f00000000000000000000000000000000000000000000000000000000000000008b8b61424b565b915091508160001480156140bc575080155b156140cc5787935086925061418c565b60006140d9898484613d84565b905087811161412c57858110156141215760405162461bcd60e51b815260040180806020018281038252602881526020018061433a6028913960400191505060405180910390fd5b88945092508261418a565b6000614139898486613d84565b90508981111561414557fe5b878110156141845760405162461bcd60e51b81526004018080602001828103825260288152602001806144a06028913960400191505060405180910390fd5b94508793505b505b5050965096945050505050565b60008115806141b4575050808202828282816141b157fe5b04145b611123576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b604482015290519081900360640190fd5b80820182811015611123576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b604482015290519081900360640190fd5b600080600061425a8585613e2a565b50905060008061426b8888886133f4565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b1580156142a357600080fd5b505afa1580156142b7573d6000803e3d6000fd5b505050506040513d60608110156142cd57600080fd5b5080516020909101516001600160701b0391821693501690506001600160a01b0387811690841614614300578082614303565b81815b9099909850965050505050505056fe4875636b6c6562657272794c6962726172793a204944454e544943414c5f4144445245535345534875636b6c656265727279526f757465723a20494e53554646494349454e545f425f414d4f554e544875636b6c656265727279526f757465723a20494e53554646494349454e545f4f55545055545f414d4f554e544875636b6c656265727279526f757465723a204558434553534956455f494e5055545f414d4f554e544875636b6c6562657272794c6962726172793a20494e53554646494349454e545f494e5055545f414d4f554e544875636b6c6562657272794c6962726172793a20494e53554646494349454e545f4f55545055545f414d4f554e544875636b6c6562657272794c6962726172793a20494e53554646494349454e545f4c49515549444954594875636b6c656265727279526f757465723a20494e56414c49445f50415448004875636b6c656265727279526f757465723a20455850495245440000000000005472616e7366657248656c7065723a204554485f5452414e534645525f4641494c45444875636b6c656265727279526f757465723a20494e53554646494349454e545f415f414d4f554e544875636b6c6562657272794c6962726172793a20494e53554646494349454e545f414d4f554e545472616e7366657248656c7065723a205452414e534645525f46524f4d5f4641494c4544a26469706673582212202bf7f1734e7dfca1fce8e424bf0e99472712001eba7d1d02fd24e87ade5b1b4964736f6c634300060c00330000000000000000000000001f4b7660b6adc3943b5038e3426b33c1c0e343e60000000000000000000000006d6ad95425fcf315c39fa6f3226471d4f16f27b3

Deployed ByteCode Sourcemap

16499:18721:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16983:10;-1:-1:-1;;;;;16997:4:0;16983:18;;16976:26;;;;16499:18721;;;;;21173:673;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;21173:673:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;34156:264;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34156:264:0;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;28406:858;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;28406:858:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;28406:858:0;;;;;;;;;;;;-1:-1:-1;28406:858:0;-1:-1:-1;;;;;;28406:858:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34962:255;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34962:255:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34962:255:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34962:255:0;;-1:-1:-1;34962:255:0;;-1:-1:-1;;;;;34962:255:0:i;21854:681::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;21854:681:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;25587:634::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;25587:634:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;25587:634:0;;;;;;;;;;;;-1:-1:-1;25587:634:0;-1:-1:-1;;;;;;25587:634:0;;;;;;;;:::i;27562:836::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;27562:836:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;27562:836:0;;;;;;;;;;;;-1:-1:-1;27562:836:0;-1:-1:-1;;;;;;27562:836:0;;;;;;;;:::i;24003:722::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;24003:722:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;31471:718::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;31471:718:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;31471:718:0;;;;;;;;;;;;-1:-1:-1;31471:718:0;-1:-1:-1;;;;;;31471:718:0;;;;;;;;:::i;33065:849::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;33065:849:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;33065:849:0;;;;;;;;;;;;-1:-1:-1;33065:849:0;-1:-1:-1;;;;;;33065:849:0;;;;;;;;:::i;26849:705::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;26849:705:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;26849:705:0;;;;;;;;;;;;-1:-1:-1;26849:705:0;-1:-1:-1;;;;;;26849:705:0;;;;;;;;:::i;34428:263::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34428:263:0;;;;;;;;;;;;:::i;26229:612::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;26229:612:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;26229:612:0;;;;;;;;;;;;-1:-1:-1;26229:612:0;-1:-1:-1;;;;;;26229:612:0;;;;;;;;:::i;16635:38::-;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;16635:38:0;;;;;;;;;;;;;;33958:190;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33958:190:0;;;;;;;;;;;;:::i;23295:700::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;23295:700:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;32197:856::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;32197:856:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;32197:856:0;;;;;;;;;;;;-1:-1:-1;32197:856:0;-1:-1:-1;;;;;;32197:856:0;;;;;;;;:::i;20288:877::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;20288:877:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;16587:41::-;;;;;;;;;;;;;:::i;34699:255::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34699:255:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34699:255:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34699:255:0;;-1:-1:-1;34699:255:0;;-1:-1:-1;;;;;34699:255:0:i;22543:673::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;22543:673:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;18517:742::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;18517:742:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;19267:978;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;19267:978:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;29272:818::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;29272:818:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;29272:818:0;;;;;;;;;;;;-1:-1:-1;29272:818:0;-1:-1:-1;;;;;;29272:818:0;;;;;;;;:::i;21173:673::-;21410:16;21428:14;21391:8;16744:15;16732:8;:27;;16724:66;;;;;-1:-1:-1;;;16724:66:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16724:66:0;;;;;;;;;;;;;;;21482:196:::1;21512:5;21532:4;21551:9;21575:14;21604:12;21639:4;21659:8;21482:15;:196::i;:::-;21455:223:::0;;-1:-1:-1;21455:223:0;-1:-1:-1;21689:51:0::1;21717:5:::0;21724:2;21455:223;21689:27:::1;:51::i;:::-;21757:4;-1:-1:-1::0;;;;;21751:20:0::1;;21772:9;21751:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;21793:45;21824:2;21828:9;21793:30;:45::i;:::-;21173:673:::0;;;;;;;;;;:::o;34156:264::-;34309:14;34348:64;34380:8;34390:9;34401:10;34348:31;:64::i;:::-;34341:71;34156:264;-1:-1:-1;;;;34156:264:0:o;28406:858::-;28620:21;28592:8;16744:15;16732:8;:27;;16724:66;;;;;-1:-1:-1;;;16724:66:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16724:66:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;28692:4:0::1;28667:29;:4:::0;;-1:-1:-1;;28672:15:0;;28667:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;28667:21:0::1;-1:-1:-1::0;;;;;28667:29:0::1;;28659:73;;;::::0;;-1:-1:-1;;;28659:73:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;28659:73:0;;;;;;;;;;;;;::::1;;28753:57;28786:7;28795:8;28805:4;;28753:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;28753:32:0::1;::::0;-1:-1:-1;;;28753:57:0:i:1;:::-;28743:67;;28860:12;28829:7;28854:1;28837:7;:14;:18;28829:27;;;;;;;;;;;;;;:43;;28821:101;;;;-1:-1:-1::0;;;28821:101:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28933:143;28979:4;;28984:1;28979:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;28979:7:0::1;28988:10;29000:53;29027:7;29036:4;;29041:1;29036:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;29036:7:0::1;29045:4;;29050:1;29045:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;29045:7:0::1;29000:26;:53::i;:::-;29055:7;29063:1;29055:10;;;;;;;;;;;;;;28933:31;:143::i;:::-;29087:35;29093:7;29102:4;;29087:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;29116:4:0::1;::::0;-1:-1:-1;29087:5:0::1;::::0;-1:-1:-1;;29087:35:0:i:1;:::-;29139:4;-1:-1:-1::0;;;;;29133:20:0::1;;29154:7;29179:1;29162:7;:14;:18;29154:27;;;;;;;;;;;;;;29133:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;29193:63;29224:2;29228:7;29253:1;29236:7;:14;:18;29228:27;;;;;;;;;;;;;;29193:30;:63::i;:::-;28406:858:::0;;;;;;;;;:::o;34962:255::-;35106:21;35152:57;35184:7;35193:9;35204:4;35152:31;:57::i;:::-;35145:64;;34962:255;;;;;:::o;21854:681::-;22160:12;22174;22199;22214:51;22241:7;22250:6;22258;22214:26;:51::i;:::-;22199:66;;22276:10;22289;:33;;22313:9;22289:33;;;-1:-1:-1;;22289:33:0;22333:82;;;-1:-1:-1;;;22333:82:0;;22363:10;22333:82;;;;22383:4;22333:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22276:46;;-1:-1:-1;;;;;;22333:29:0;;;;;:82;;;;;-1:-1:-1;;22333:82:0;;;;;;;;-1:-1:-1;22333:29:0;:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22447:80;22463:6;22471;22479:9;22490:10;22502;22514:2;22518:8;22447:15;:80::i;:::-;22426:101;;;;;;;;21854:681;;;;;;;;;;;;;;;;:::o;25587:634::-;25811:21;25792:8;16744:15;16732:8;:27;;16724:66;;;;;-1:-1:-1;;;16724:66:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16724:66:0;;;;;;;;;;;;;;;25855:57:::1;25888:7;25897:8;25907:4;;25855:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;25855:32:0::1;::::0;-1:-1:-1;;;25855:57:0:i:1;:::-;25845:67;;25962:12;25931:7;25956:1;25939:7;:14;:18;25931:27;;;;;;;;;;;;;;:43;;25923:101;;;;-1:-1:-1::0;;;25923:101:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26035:143;26081:4;;26086:1;26081:7;;;;;;26035:143;26189:24;26195:7;26204:4;;26189:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;26210:2:0;;-1:-1:-1;26189:5:0::1;::::0;-1:-1:-1;;26189:24:0:i:1;27562:836::-:0;27776:21;27748:8;16744:15;16732:8;:27;;16724:66;;;;;-1:-1:-1;;;16724:66:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16724:66:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;27848:4:0::1;27823:29;:4:::0;;-1:-1:-1;;27828:15:0;;27823:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;27823:21:0::1;-1:-1:-1::0;;;;;27823:29:0::1;;27815:73;;;::::0;;-1:-1:-1;;;27815:73:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;27815:73:0;;;;;;;;;;;;;::::1;;27909:57;27941:7;27950:9;27961:4;;27909:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;27909:31:0::1;::::0;-1:-1:-1;;;27909:57:0:i:1;:::-;27899:67;;27999:11;27985:7;27993:1;27985:10;;;;;;;;;;;;;;:25;;27977:79;;;;-1:-1:-1::0;;;27977:79:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24003:722:::0;24321:14;24348:12;24363:48;24390:7;24399:5;24406:4;24363:26;:48::i;:::-;24348:63;;24422:10;24435;:33;;24459:9;24435:33;;;-1:-1:-1;;24435:33:0;24479:82;;;-1:-1:-1;;;24479:82:0;;24509:10;24479:82;;;;24529:4;24479:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24422:46;;-1:-1:-1;;;;;;24479:29:0;;;;;:82;;;;;-1:-1:-1;;24479:82:0;;;;;;;;-1:-1:-1;24479:29:0;:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24584:133;24646:5;24653:9;24664:14;24680:12;24694:2;24698:8;24584:47;:133::i;:::-;24572:145;24003:722;-1:-1:-1;;;;;;;;;;;;;24003:722:0:o;31471:718::-;31705:8;16744:15;16732:8;:27;;16724:66;;;;;-1:-1:-1;;;16724:66:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16724:66:0;;;;;;;;;;;;;;;31726:141:::1;31772:4;;31777:1;31772:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;31772:7:0::1;31781:10;31793:53;31820:7;31829:4;;31834:1;31829:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;31829:7:0::1;31838:4;;31843:1;31838:7;;;;;;31793:53;31848:8;31726:31;:141::i;:::-;31878:18;31906:4:::0;;-1:-1:-1;;31911:15:0;;31906:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;31906:21:0::1;-1:-1:-1::0;;;;;31899:39:0::1;;31939:2;31899:43;;;;;;;;;;;;;-1:-1:-1::0;;;;;31899:43:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;31899:43:0;31953:44:::1;::::0;;31899:43:::1;31953:44:::0;;::::1;::::0;;;;;;;;;;;31899:43;;-1:-1:-1;31953:44:0::1;::::0;;;31988:4;;;;;;31953:44;::::1;::::0;31988:4;;31953:44;31988:4;31953:44;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;31994:2:0;;-1:-1:-1;31953:34:0::1;::::0;-1:-1:-1;;31953:44:0:i:1;:::-;32096:12:::0;32030:62:::1;32078:13:::0;32037:4;;-1:-1:-1;;32042:15:0;;32037:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;32037:21:0::1;-1:-1:-1::0;;;;;32030:39:0::1;;32070:2;32030:43;;;;;;;;;;;;;-1:-1:-1::0;;;;;32030:43:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;32030:43:0;;:47:::1;:62::i;:::-;:78;;32008:173;;;;-1:-1:-1::0;;;32008:173:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16801:1;31471:718:::0;;;;;;;:::o;33065:849::-;33332:8;16744:15;16732:8;:27;;16724:66;;;;;-1:-1:-1;;;16724:66:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16724:66:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;33391:4:0::1;33366:29;:4:::0;;-1:-1:-1;;33371:15:0;;33366:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;33366:21:0::1;-1:-1:-1::0;;;;;33366:29:0::1;;33358:73;;;::::0;;-1:-1:-1;;;33358:73:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;33358:73:0;;;;;;;;;;;;;::::1;;33442:141;33488:4;;33493:1;33488:7;;;;;;33442:141;33594:55;33629:4;;33594:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;33643:4:0::1;::::0;-1:-1:-1;33594:34:0::1;::::0;-1:-1:-1;;33594:55:0:i:1;:::-;33660:14;33684:4;-1:-1:-1::0;;;;;33677:22:0::1;;33708:4;33677:37;;;;;;;;;;;;;-1:-1:-1::0;;;;;33677:37:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;33677:37:0;;-1:-1:-1;33733:25:0;;::::1;;33725:83;;;;-1:-1:-1::0;;;33725:83:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33825:4;-1:-1:-1::0;;;;;33819:20:0::1;;33840:9;33819:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;33861:45;33892:2;33896:9;33861:30;:45::i;26849:705::-:0;27065:21;27037:8;16744:15;16732:8;:27;;16724:66;;;;;-1:-1:-1;;;16724:66:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16724:66:0;;;;;;;;;;;;;;;27123:4:::1;-1:-1:-1::0;;;;;27112:15:0::1;:4;;27117:1;27112:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;27112:7:0::1;-1:-1:-1::0;;;;;27112:15:0::1;;27104:59;;;::::0;;-1:-1:-1;;;27104:59:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;27104:59:0;;;;;;;;;;;;;::::1;;27184:58;27217:7;27226:9;27237:4;;27184:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;27184:32:0::1;::::0;-1:-1:-1;;;27184:58:0:i:1;:::-;27174:68;;27292:12;27261:7;27286:1;27269:7;:14;:18;27261:27;;;;;;;;;;;;;;:43;;27253:101;;;;-1:-1:-1::0;;;27253:101:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27371:4;-1:-1:-1::0;;;;;27365:19:0::1;;27392:7;27400:1;27392:10;;;;;;;;;;;;;;27365:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;27429:4;-1:-1:-1::0;;;;;27423:20:0::1;;27444:53;27471:7;27480:4;;27485:1;27480:7;;;;;;27444:53;27499:7;27507:1;27499:10;;;;;;;;;;;;;;27423:87;;;;;;;;;;;;;-1:-1:-1::0;;;;;27423:87:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;27423:87:0;27416:95:::1;;;;27522:24;27528:7;27537:4;;27522:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;27543:2:0;;-1:-1:-1;27522:5:0::1;::::0;-1:-1:-1;;27522:24:0:i:1;:::-;26849:705:::0;;;;;;;;:::o;34428:263::-;34581:13;34619:64;34650:9;34661;34672:10;34619:30;:64::i;26229:612::-;26453:21;26434:8;16744:15;16732:8;:27;;16724:66;;;;;-1:-1:-1;;;16724:66:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16724:66:0;;;;;;;;;;;;;;;26497:57:::1;26529:7;26538:9;26549:4;;26497:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;26497:31:0::1;::::0;-1:-1:-1;;;26497:57:0:i:1;:::-;26487:67;;26587:11;26573:7;26581:1;26573:10;;;;;;;;;;;;;;:25;;26565:79;;;;-1:-1:-1::0;;;26565:79:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16635:38:::0;;;:::o;33958:190::-;34055:12;34087:53;34112:7;34121:8;34131;34087:24;:53::i;23295:700::-;23561:14;23542:8;16744:15;16732:8;:27;;16724:66;;;;;-1:-1:-1;;;16724:66:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16724:66:0;;;;;;;;;;;;;;;23604:196:::1;23634:5;23654:4;23673:9;23697:14;23726:12;23761:4;23781:8;23604:15;:196::i;:::-;23588:212;;;;;;23811:78;23839:5;23846:2;23857:5;-1:-1:-1::0;;;;;23850:23:0::1;;23882:4;23850:38;;;;;;;;;;;;;-1:-1:-1::0;;;;;23850:38:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;23850:38:0;23811:27:::1;:78::i;:::-;23906:4;-1:-1:-1::0;;;;;23900:20:0::1;;23921:9;23900:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;23942:45;23973:2;23977:9;23942:30;:45::i;32197:856::-:0;32457:8;16744:15;16732:8;:27;;16724:66;;;;;-1:-1:-1;;;16724:66:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16724:66:0;;;;;;;;;;;;;;;32502:4:::1;-1:-1:-1::0;;;;;32491:15:0::1;:4;;32496:1;32491:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;32491:7:0::1;-1:-1:-1::0;;;;;32491:15:0::1;;32483:59;;;::::0;;-1:-1:-1;;;32483:59:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;32483:59:0;;;;;;;;;;;;;::::1;;32553:13;32569:9;32553:25;;32595:4;-1:-1:-1::0;;;;;32589:19:0::1;;32616:8;32589:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;32651:4;-1:-1:-1::0;;;;;32645:20:0::1;;32666:53;32693:7;32702:4;;32707:1;32702:7;;;;;;32666:53;32721:8;32645:85;;;;;;;;;;;;;-1:-1:-1::0;;;;;32645:85:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;32645:85:0;32638:93:::1;;;;32742:18;32770:4:::0;;-1:-1:-1;;32775:15:0;;32770:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;32770:21:0::1;-1:-1:-1::0;;;;;32763:39:0::1;;32803:2;32763:43;;;;;;;;;;;;;-1:-1:-1::0;;;;;32763:43:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;32763:43:0;32817:44:::1;::::0;;32763:43:::1;32817:44:::0;;::::1;::::0;;;;;;;;;;;32763:43;;-1:-1:-1;32817:44:0::1;::::0;;;32852:4;;;;;;32817:44;::::1;::::0;32852:4;;32817:44;32852:4;32817:44;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;32858:2:0;;-1:-1:-1;32817:34:0::1;::::0;-1:-1:-1;;32817:44:0:i:1;:::-;32960:12:::0;32894:62:::1;32942:13:::0;32901:4;;-1:-1:-1;;32906:15:0;;32901:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;32901:21:0::1;-1:-1:-1::0;;;;;32894:39:0::1;;32934:2;32894:43;;;;;;;;;;;;;-1:-1:-1::0;;;;;32894:43:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;20288:877:::0;20542:12;20556;20523:8;16744:15;16732:8;:27;;16724:66;;;;;-1:-1:-1;;;16724:66:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16724:66:0;;;;;;;;;;;;;;;20581:12:::1;20596:51;20623:7;20632:6;20640;20596:26;:51::i;:::-;20658:64;::::0;;-1:-1:-1;;;20658:64:0;;20694:10:::1;20658:64;::::0;::::1;::::0;-1:-1:-1;;;;;20658:35:0;::::1;:64:::0;;;;;;;;;;;;;;20581:66;;-1:-1:-1;20658:35:0;;::::1;::::0;:64;;;;;::::1;::::0;;;;;;;;;-1:-1:-1;20658:35:0;:64;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;20790:31:0::1;::::0;;-1:-1:-1;;;20790:31:0;;-1:-1:-1;;;;;20790:31:0;;::::1;;::::0;::::1;::::0;;;20760:12:::1;::::0;;;20790:27;;::::1;::::0;::::1;::::0;:31;;;;;;;;;;;20760:12;20790:27;:31;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;20790:31:0;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;20790:31:0;-1:-1:-1;20833:14:0::1;20852:45;20882:6:::0;20890;20852:29:::1;:45::i;:::-;20832:65;;;20939:6;-1:-1:-1::0;;;;;20929:16:0::1;:6;-1:-1:-1::0;;;;;20929:16:0::1;;:58;;20970:7;20979;20929:58;;;20949:7;20958;20929:58;20908:79:::0;;-1:-1:-1;20908:79:0;-1:-1:-1;21006:21:0;;::::1;;20998:74;;;;-1:-1:-1::0;;;20998:74:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21102:10;21091:7;:21;;21083:74;;;;-1:-1:-1::0;;;21083:74:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16801:1;;;;20288:877:::0;;;;;;;;;;;:::o;16587:41::-;;;:::o;34699:255::-;34843:21;34889:57;34922:7;34931:8;34941:4;34889:32;:57::i;22543:673::-;22832:16;22850:14;22877:12;22892:48;22919:7;22928:5;22935:4;22892:26;:48::i;:::-;22877:63;;22951:10;22964;:33;;22988:9;22964:33;;;-1:-1:-1;;22964:33:0;23008:82;;;-1:-1:-1;;;23008:82:0;;23038:10;23008:82;;;;23058:4;23008:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22951:46;;-1:-1:-1;;;;;;23008:29:0;;;;;:82;;;;;-1:-1:-1;;23008:82:0;;;;;;;;-1:-1:-1;23008:29:0;:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23128:80;23147:5;23154:9;23165:14;23181:12;23195:2;23199:8;23128:18;:80::i;:::-;23101:107;;;;-1:-1:-1;22543:673:0;-1:-1:-1;;;;;;;;;;;;;22543:673:0:o;18517:742::-;18805:12;18819;18833:14;18786:8;16744:15;16732:8;:27;;16724:66;;;;;-1:-1:-1;;;16724:66:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16724:66:0;;;;;;;;;;;;;;;18881:85:::1;18895:6;18903;18911:14;18927;18943:10;18955;18881:13;:85::i;:::-;18860:106:::0;;-1:-1:-1;18860:106:0;-1:-1:-1;18977:12:0::1;18992:51;19019:7;19028:6:::0;19036;18992:26:::1;:51::i;:::-;18977:66;;19054;19086:6;19094:10;19106:4;19112:7;19054:31;:66::i;:::-;19131;19163:6;19171:10;19183:4;19189:7;19131:31;:66::i;:::-;19237:4;-1:-1:-1::0;;;;;19220:27:0::1;;19248:2;19220:31;;;;;;;;;;;;;-1:-1:-1::0;;;;;19220:31:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;19220:31:0;18517:742;;;;-1:-1:-1;19220:31:0;;-1:-1:-1;18517:742:0;;-1:-1:-1;;;;;;;;;18517:742:0:o;19267:978::-;19520:16;19538:14;19554;19501:8;16744:15;16732:8;:27;;16724:66;;;;;-1:-1:-1;;;16724:66:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16724:66:0;;;;;;;;;;;;;;;19608:176:::1;19636:5;19656:4;19675:18;19708:9;19732:14;19761:12;19608:13;:176::i;:::-;19581:203:::0;;-1:-1:-1;19581:203:0;-1:-1:-1;19795:12:0::1;19810:48;19837:7;19846:5:::0;19853:4:::1;19810:26;:48::i;:::-;19795:63;;19869:69;19901:5;19908:10;19920:4;19926:11;19869:31;:69::i;:::-;19955:4;-1:-1:-1::0;;;;;19949:19:0::1;;19976:9;19949:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;20012:4;-1:-1:-1::0;;;;;20006:20:0::1;;20027:4;20033:9;20006:37;;;;;;;;;;;;;-1:-1:-1::0;;;;;20006:37:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;20006:37:0;19999:45:::1;;;;20084:4;-1:-1:-1::0;;;;;20067:27:0::1;;20095:2;20067:31;;;;;;;;;;;;;-1:-1:-1::0;;;;;20067:31:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;20067:31:0;;-1:-1:-1;20149:9:0::1;:21:::0;-1:-1:-1;20145:92:0::1;;;20172:65;20203:10;20227:9;20215;:21;20172:30;:65::i;:::-;16801:1;19267:978:::0;;;;;;;;;;;:::o;29272:818::-;29485:21;29457:8;16744:15;16732:8;:27;;16724:66;;;;;-1:-1:-1;;;16724:66:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16724:66:0;;;;;;;;;;;;;;;29543:4:::1;-1:-1:-1::0;;;;;29532:15:0::1;:4;;29537:1;29532:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;29532:7:0::1;-1:-1:-1::0;;;;;29532:15:0::1;;29524:59;;;::::0;;-1:-1:-1;;;29524:59:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;29524:59:0;;;;;;;;;;;;;::::1;;29604:57;29636:7;29645:9;29656:4;;29604:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;29604:31:0::1;::::0;-1:-1:-1;;;29604:57:0:i:1;:::-;29594:67;;29694:9;29680:7;29688:1;29680:10;;;;;;;;;;;;;;:23;;29672:77;;;;-1:-1:-1::0;;;29672:77:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29766:4;-1:-1:-1::0;;;;;29760:19:0::1;;29787:7;29795:1;29787:10;;;;;;;;;;;;;;29760:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;29824:4;-1:-1:-1::0;;;;;29818:20:0::1;;29839:53;29866:7;29875:4;;29880:1;29875:7;;;;;;29839:53;29894:7;29902:1;29894:10;;;;;;;;;;;;;;29818:87;;;;;;;;;;;;;-1:-1:-1::0;;;;;29818:87:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;29818:87:0;29811:95:::1;;;;29917:24;29923:7;29932:4;;29917:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;29938:2:0;;-1:-1:-1;29917:5:0::1;::::0;-1:-1:-1;;29917:24:0:i:1;:::-;30004:7;30012:1;30004:10;;;;;;;;;;;;;;29992:9;:22;29988:94;;;30016:66;30047:10;30071:7;30079:1;30071:10;;;;;;;;;;;;;;30059:9;:22;30016:30;:66::i;9935:361::-:0;10130:45;;;-1:-1:-1;;;;;10130:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10130:45:0;-1:-1:-1;;;10130:45:0;;;10119:57;;;;10084:12;;10098:17;;10119:10;;;;10130:45;10119:57;;;10130:45;10119:57;;10130:45;10119:57;;;;;;;;;;-1:-1:-1;;10119:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10083:93;;;;10195:7;:57;;;;-1:-1:-1;10207:11:0;;:16;;:44;;;10238:4;10227:24;;;;;;;;;;;;;;;-1:-1:-1;10227:24:0;10207:44;10187:101;;;;;-1:-1:-1;;;10187:101:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;9935:361;;;;;:::o;10714:195::-;10822:12;;;10784;10822;;;;;;;;;-1:-1:-1;;;;;10801:7:0;;;10815:5;;10801:34;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;10801:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10783:52;;;10854:7;10846:55;;;;-1:-1:-1;;;10846:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10714:195;;;:::o;13939:521::-;14032:14;14078:1;14067:8;:12;14059:70;;;;-1:-1:-1;;;14059:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14160:1;14148:9;:13;:31;;;;;14178:1;14165:10;:14;14148:31;14140:86;;;;-1:-1:-1;;;14140:86:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14237:20;14260:17;:8;14273:3;14260:12;:17::i;:::-;14237:40;-1:-1:-1;14288:14:0;14305:31;14237:40;14325:10;14305:19;:31::i;:::-;14288:48;-1:-1:-1;14347:16:0;14366:40;14390:15;14366:19;:9;14380:4;14366:13;:19::i;:::-;:23;;:40::i;:::-;14347:59;;14441:11;14429:9;:23;;;;;;;13939:521;-1:-1:-1;;;;;;;13939:521:0:o;15139:513::-;15240:21;15297:1;15282:4;:11;:16;;15274:61;;;;;-1:-1:-1;;;15274:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15367:4;:11;15356:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15356:23:0;;15346:33;;15403:8;15390:7;15398:1;15390:10;;;;;;;;;;;;;:21;;;;;15427:6;15422:223;15453:1;15439:4;:11;:15;15435:1;:19;15422:223;;;15477:14;15493:15;15512:42;15524:7;15533:4;15538:1;15533:7;;;;;;;;;;;;;;15542:4;15547:1;15551;15547:5;15542:11;;;;;;;;;;;;;;15512;:42::i;:::-;15476:78;;;;15586:47;15599:7;15607:1;15599:10;;;;;;;;;;;;;;15611:9;15622:10;15586:12;:47::i;:::-;15569:7;15577:1;15581;15577:5;15569:14;;;;;;;;;;;;;;;;;:64;-1:-1:-1;;15456:3:0;;15422:223;;;;15139:513;;;;;:::o;12359:569::-;12448:12;12888:7;-1:-1:-1;;;;;12868:36:0;;12905:6;12913;12868:52;;;;;;;;;;;;;-1:-1:-1;;;;;12868:52:0;;;;;;-1:-1:-1;;;;;12868:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12868:52:0;;12359:569;-1:-1:-1;;;;12359:569:0:o;10304:402::-;10529:51;;;-1:-1:-1;;;;;10529:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10529:51:0;-1:-1:-1;;;10529:51:0;;;10518:63;;;;10483:12;;10497:17;;10518:10;;;;10529:51;10518:63;;;10529:51;10518:63;;10529:51;10518:63;;;;;;;;;;-1:-1:-1;;10518:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10482:99;;;;10600:7;:57;;;;-1:-1:-1;10612:11:0;;:16;;:44;;;10643:4;10632:24;;;;;;;;;;;;;;;-1:-1:-1;10632:24:0;10612:44;10592:106;;;;-1:-1:-1;;;10592:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10304:402;;;;;;:::o;24836:743::-;24943:6;24938:634;24969:1;24955:4;:11;:15;24951:1;:19;24938:634;;;24993:13;25008:14;25027:4;25032:1;25027:7;;;;;;;;;;;;;;25036:4;25041:1;25045;25041:5;25036:11;;;;;;;;;;;;;;24992:56;;;;25064:14;25083:44;25113:5;25120:6;25083:29;:44::i;:::-;25063:64;;;25142:14;25159:7;25167:1;25171;25167:5;25159:14;;;;;;;;;;;;;;25142:31;;25189:15;25206;25234:6;-1:-1:-1;;;;;25225:15:0;:5;-1:-1:-1;;;;;25225:15:0;;:61;;25267:9;25283:1;25225:61;;;25249:1;25253:9;25225:61;25188:98;;;;25301:10;25332:1;25318:4;:11;:15;25314:1;:19;:84;;25395:3;25314:84;;;25336:56;25363:7;25372:6;25380:4;25385:1;25389;25385:5;25380:11;;;;;;;;;;;;;;25336:26;:56::i;:::-;25301:97;;25430:50;25457:7;25466:5;25473:6;25430:26;:50::i;:::-;-1:-1:-1;;;;;25413:73:0;;25505:10;25517;25529:2;25543:1;25533:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25533:12:0;;25413:147;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25413:147:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;24972:3:0;;;;;-1:-1:-1;24938:634:0;;-1:-1:-1;;;;;;;;24938:634:0;;;24836:743;;;:::o;15733:534::-;15834:21;15891:1;15876:4;:11;:16;;15868:61;;;;;-1:-1:-1;;;15868:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15961:4;:11;15950:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15950:23:0;;15940:33;;16014:9;15984:7;16009:1;15992:7;:14;:18;15984:27;;;;;;;;;;;;;;;;;:39;16048:11;;-1:-1:-1;;16048:15:0;16034:226;16065:5;;16034:226;;16093:14;16109:15;16128:42;16140:7;16149:4;16158:1;16154;:5;16149:11;;;;;;;;;;;;;;16162:4;16167:1;16162:7;;;;;;;16128:42;16092:78;;;;16202:46;16214:7;16222:1;16214:10;;;;;;;;;;;;;;16226:9;16237:10;16202:11;:46::i;:::-;16185:7;16197:1;16193;:5;16185:14;;;;;;;;;;;;;;;;;:63;-1:-1:-1;;;;16072:3:0;16034:226;;30237:1226;30350:6;30345:1111;30376:1;30362:4;:11;:15;30358:1;:19;30345:1111;;;30400:13;30415:14;30434:4;30439:1;30434:7;;;;;;;;;;;;;;30443:4;30448:1;30452;30448:5;30443:11;;;;;;;;;;;;;;30399:56;;;;30471:14;30490:44;30520:5;30527:6;30490:29;:44::i;:::-;30470:64;;;30549:21;30590:50;30617:7;30626:5;30633:6;30590:26;:50::i;:::-;30549:92;;30656:16;30687:17;30775:13;30790;30808:4;-1:-1:-1;;;;;30808:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30808:18:0;;;;;;;-1:-1:-1;;;;;30774:52:0;;;;-1:-1:-1;30774:52:0;;-1:-1:-1;30842:17:0;;-1:-1:-1;;;;;30883:15:0;;;;;;;:61;;30925:8;30935;30883:61;;;30902:8;30912;30883:61;30841:103;;;;30973:56;31016:12;30980:5;-1:-1:-1;;;;;30973:23:0;;31005:4;30973:38;;;;;;;;;;;;;-1:-1:-1;;;;;30973:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;:56;30959:70;;31059:73;31091:11;31104:12;31118:13;31059:31;:73::i;:::-;31044:88;;30345:1111;;;;31163:15;31180;31208:6;-1:-1:-1;;;;;31199:15:0;:5;-1:-1:-1;;;;;31199:15:0;;:67;;31244:12;31263:1;31199:67;;;31223:1;31227:12;31199:67;31162:104;;;;31281:10;31312:1;31298:4;:11;:15;31294:1;:19;:84;;31375:3;31294:84;;;31316:56;31343:7;31352:6;31360:4;31365:1;31369;31365:5;31360:11;;;;;;;31316:56;31431:12;;;31441:1;31431:12;;;;;;;;;;-1:-1:-1;;;31393:51:0;;;;;;;;;;;;;;-1:-1:-1;;;;;31393:51:0;;;;;;;;;;;;;;;;;;;;;;31281:97;;-1:-1:-1;31393:9:0;;;;;;31403:10;;31415;;31281:97;;31431:12;;31393:51;;;;;;;;31431:12;;31393:51;;;;31431:12;;31393:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;30379:3:0;;;;;-1:-1:-1;30345:1111:0;;-1:-1:-1;;;;;;;;;;30345:1111:0;1481:129;1565:5;;;1560:16;;;;1552:50;;;;;-1:-1:-1;;;1552:50:0;;;;;;;;;;;;-1:-1:-1;;;1552:50:0;;;;;;;;;;;;;;14581:476;14674:13;14720:1;14708:9;:13;14700:72;;;;-1:-1:-1;;;14700:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14803:1;14791:9;:13;:31;;;;;14821:1;14808:10;:14;14791:31;14783:86;;;;-1:-1:-1;;;14783:86:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14880:14;14897:34;14926:4;14897:24;:9;14911;14897:13;:24::i;:::-;:28;;:34::i;:::-;14880:51;-1:-1:-1;14942:16:0;14961:34;14991:3;14961:25;:10;14976:9;14961:14;:25::i;:34::-;14942:53;;15017:32;15047:1;15030:11;15018:9;:23;;;;;;;15017:29;:32::i;:::-;15006:43;14581:476;-1:-1:-1;;;;;;14581:476:0:o;13492:325::-;13574:12;13617:1;13607:7;:11;13599:63;;;;-1:-1:-1;;;13599:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13692:1;13681:8;:12;:28;;;;;13708:1;13697:8;:12;13681:28;13673:83;;;;-1:-1:-1;;;13673:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13801:8;13777:21;:7;13789:8;13777:11;:21::i;:::-;:32;;;;;;;13492:325;-1:-1:-1;;;;13492:325:0:o;11914:353::-;11989:14;12005;12050:6;-1:-1:-1;;;;;12040:16:0;:6;-1:-1:-1;;;;;12040:16:0;;;12032:68;;;;-1:-1:-1;;;12032:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12139:6;-1:-1:-1;;;;;12130:15:0;:6;-1:-1:-1;;;;;12130:15:0;;:53;;12168:6;12176;12130:53;;;12149:6;12157;12130:53;12111:72;;-1:-1:-1;12111:72:0;-1:-1:-1;;;;;;12202:20:0;;12194:65;;;;;-1:-1:-1;;;12194:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11914:353;;;;;:::o;17105:1404::-;17323:12;17337;17482:1;-1:-1:-1;;;;;17418:66:0;17438:7;-1:-1:-1;;;;;17418:36:0;;17455:6;17463;17418:52;;;;;;;;;;;;;-1:-1:-1;;;;;17418:52:0;;;;;;-1:-1:-1;;;;;17418:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17418:52:0;-1:-1:-1;;;;;17418:66:0;;17414:154;;;17521:7;-1:-1:-1;;;;;17501:39:0;;17541:6;17549;17501:55;;;;;;;;;;;;;-1:-1:-1;;;;;17501:55:0;;;;;;-1:-1:-1;;;;;17501:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;17414:154:0;17579:13;17594;17611:55;17642:7;17651:6;17659;17611:30;:55::i;:::-;17578:88;;;;17681:8;17693:1;17681:13;:30;;;;-1:-1:-1;17698:13:0;;17681:30;17677:825;;;17750:14;;-1:-1:-1;17766:14:0;;-1:-1:-1;17677:825:0;;;17814:19;17836:60;17861:14;17877:8;17887;17836:24;:60::i;:::-;17814:82;;17933:14;17915;:32;17911:580;;17994:10;17976:14;:28;;17968:81;;;;-1:-1:-1;;;17968:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18090:14;;-1:-1:-1;18106:14:0;-1:-1:-1;18106:14:0;17911:580;;;18162:19;18184:60;18209:14;18225:8;18235;18184:24;:60::i;:::-;18162:82;;18288:14;18270;:32;;18263:40;;;;18348:10;18330:14;:28;;18322:81;;;;-1:-1:-1;;;18322:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18444:14;-1:-1:-1;18460:14:0;;-1:-1:-1;17911:580:0;17677:825;;17105:1404;;;;;;;;;;;:::o;1618:142::-;1670:6;1697;;;:30;;-1:-1:-1;;1712:5:0;;;1726:1;1721;1712:5;1721:1;1707:15;;;;;:20;1697:30;1689:63;;;;;-1:-1:-1;;;1689:63:0;;;;;;;;;;;;-1:-1:-1;;;1689:63:0;;;;;;;;;;;;;;1345:128;1429:5;;;1424:16;;;;1416:49;;;;;-1:-1:-1;;;1416:49:0;;;;;;;;;;;;-1:-1:-1;;;1416:49:0;;;;;;;;;;;;;;12986:393;13079:13;13094;13121:14;13140:26;13151:6;13159;13140:10;:26::i;:::-;13120:46;;;13178:13;13193;13228:32;13236:7;13245:6;13253;13228:7;:32::i;:::-;-1:-1:-1;;;;;13211:62:0;;:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13211:64:0;;;;;;;-1:-1:-1;;;;;13177:98:0;;;;-1:-1:-1;13177:98:0;;-1:-1:-1;;;;;;13309:16:0;;;;;;;:62;;13352:8;13362;13309:62;;;13329:8;13339;13309:62;13286:85;;;;-1:-1:-1;12986:393:0;-1:-1:-1;;;;;;;12986:393:0:o

Swarm Source

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