Contract 0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e

Txn Hash Method
Block
From
To
Value [Txn Fee]
0x423feaba9673eb5969355dcf57367707be3ba8cdbc70e546854f4aeabc9829acSwap Exact Token...18568992022-09-26 3:13:123 hrs 21 mins ago0x3735773a5aa173c2d576a27185b233ca4c5510b5 IN  0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e0 CLV0.01043284
0xd2ba3dffef2fdc8aea004bfa48c225c5bd71c7b88fd3b2dab19dff7d7f9f2c9eAdd Liquidity ET...18568022022-09-26 2:53:243 hrs 41 mins ago0x522bab714d329169252c78b25a45aedcb5502bbd IN  0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e132.316740186399136 CLV0.0165902
0x86ea76ee495a56f761a8ee6f53d8655ecbf0c6a01af40e86378a5654b2567b14Swap Tokens For ...18567962022-09-26 2:52:123 hrs 42 mins ago0x522bab714d329169252c78b25a45aedcb5502bbd IN  0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e0 CLV0.01492337
0x180395d91d3560f5968a519a1c2d9d48a1a34da6c5df3e2affafa5c4c609df24Add Liquidity ET...18497582022-09-25 3:00:121 day 3 hrs ago0x75f2f9e62e965670e77aadc71cef043ffbd5f383 IN  0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e18.416966798745531 CLV0.00262592
0x28deb41f3c599d8de4007782a954874681700d83d7b7907d0dab89251d804a8bSwap Exact Token...18497552022-09-25 2:59:241 day 3 hrs ago0x75f2f9e62e965670e77aadc71cef043ffbd5f383 IN  0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e0 CLV0.00271296
0x5a7579f97f05e0c45c8daf5d0826c1397b9fc28e3b71294e51aceb09c34524c5Add Liquidity ET...18462952022-09-24 15:06:001 day 15 hrs ago0x0f617402b5954a8118ce951fbbddaf1a4ac16310 IN  0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e126.538788573560334 CLV0.01444498
0x12f9c4a6fd880d42229acbc8dcce94c1f13e855241304a181df57d16190141f1Swap Exact Token...18462822022-09-24 15:03:241 day 15 hrs ago0x0f617402b5954a8118ce951fbbddaf1a4ac16310 IN  0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e0 CLV0.0149226
0xd75698c37349313b5b9d709952868acc049d0e9609d228915575f066beca7d2aSwap Exact Token...18462622022-09-24 14:59:241 day 15 hrs ago0x0f617402b5954a8118ce951fbbddaf1a4ac16310 IN  0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e0 CLV0.0149226
0xb444987c7d8f62f95343287480fdd40da97f0458ee48ee95ddc58477b50df471Add Liquidity ET...18414832022-09-23 22:49:062 days 7 hrs ago0x0617a09a1f1d091f51e296738d452e8a42abf475 IN  0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e1.900613877823681 CLV0.01233056
0x569e1506a83c3043907352d7479accd06d23c2eccb8c2de3ccee2b63ef33679aAdd Liquidity ET...18392772022-09-23 15:21:062 days 15 hrs ago0x0ca6df523f93f8bc274d13e18f30e4f2ed1c835a IN  0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e400 CLV0.01741498
0xde81699f82f3bd7da47b827679ba025e5655182d37e2b5f87dc92cd33dd06705Swap Exact Token...18392712022-09-23 15:19:542 days 15 hrs ago0x0ca6df523f93f8bc274d13e18f30e4f2ed1c835a IN  0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e0 CLV0.01492392
0xe0c9bb565c32b7ac855387967f6d5332d67c029e7c7fe9676a5b4acb2cc012d5Swap Exact Token...18392592022-09-23 15:17:302 days 15 hrs ago0x0ca6df523f93f8bc274d13e18f30e4f2ed1c835a IN  0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e0 CLV0.0125664
0x71fe8e1e69ed35ed5d15b541b2bf0a5c801b173922bd4385e28d0854aa31d74dSwap Exact Token...18391892022-09-23 15:03:302 days 15 hrs ago0x0ca6df523f93f8bc274d13e18f30e4f2ed1c835a IN  0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e0 CLV0.01043152
0x251f042e8189a84db222c998e14aefd1e364eb4131bc3cc510f0a7153c94cb3dAdd Liquidity ET...18363442022-09-23 5:23:303 days 1 hr ago0x5def548d48d623c370bf86e9c27c1b83cb222e74 IN  0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e3.656363613196351 CLV0.0131296
0x4f1190f234ac11740fab8354aecf28cb177c8449c91eabf46b31bb50697500bbSwap Exact Token...18363402022-09-23 5:22:423 days 1 hr ago0x5def548d48d623c370bf86e9c27c1b83cb222e74 IN  0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e0 CLV0.0135648
0x9e82f267407bc050e5b1cd5599371d29ade1d1c2f85512e34fe64a75e0dc7d12Add Liquidity ET...18345662022-09-22 23:22:543 days 7 hrs ago0x0617a09a1f1d091f51e296738d452e8a42abf475 IN  0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e2.646399037396646 CLV0.01444256
0x754cd99cd4bf07b53f990db71f0bb9cda89187457d6f7cca56079c79b9034906Add Liquidity ET...18281332022-09-22 1:38:304 days 4 hrs ago0x8e7fbb49f436d0e8a50c02f631e729a57a9a0aca IN  0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e9.427621276501658 CLV0.01233056
0x7600bb9a73b81c759f9a7a74f8b2252d841decb0e6cb230600d130cea59a1b84Swap Exact Token...18281232022-09-22 1:36:304 days 4 hrs ago0x8e7fbb49f436d0e8a50c02f631e729a57a9a0aca IN  0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e0 CLV0.01491996
0x3542dde050db9624a00419b05c23433b0977f13ff93a0cdd6e679f6534d83b8aAdd Liquidity ET...18281162022-09-22 1:35:064 days 4 hrs ago0x8e7fbb49f436d0e8a50c02f631e729a57a9a0aca IN  0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e13 CLV0.01741366
0x44f1f400899a74ed6bd9a494f21edf67f556a78367bc6265014be6acdee978a6Swap Exact Token...18274812022-09-21 23:27:064 days 7 hrs ago0x5893d101a31ee2f7bceb3a838ca598c5783bba5c IN  0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e0 CLV0.01281456
0xbee18d5d3f3bb58f32582d9f0a9578173a4f4d3aa7973bfd3a1184ae7c5ad17bSwap Exact Token...18248582022-09-21 14:36:484 days 15 hrs ago0x0617a09a1f1d091f51e296738d452e8a42abf475 IN  0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e0 CLV0.0128106
0xae20f1bd9cfc5400e95ae394f725d5aad7d4bb0944211c79e81f30baac2e3550Swap Exact Token...18234652022-09-21 9:53:124 days 20 hrs ago0x3735773a5aa173c2d576a27185b233ca4c5510b5 IN  0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e0 CLV0.0125422
0x59bf442047c4e9af94b41a0938fc7c5ee7234bea687624f6fefd97d650607220Add Liquidity ET...18213292022-09-21 2:39:125 days 3 hrs ago0x522bab714d329169252c78b25a45aedcb5502bbd IN  0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e51 CLV0.01741498
0x329ba7f2a5f2651f79dfa24a7a80772c7a9436afd6ace8069c96a8eef3cb30bcSwap Tokens For ...18213222022-09-21 2:37:485 days 3 hrs ago0x522bab714d329169252c78b25a45aedcb5502bbd IN  0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e0 CLV0.01492205
0x02b0fec05ba3d85547bf6d9d8fe26231f9385e898de163fcf34da688996ec8dbSwap Exact ETH F...18176382022-09-20 14:11:485 days 16 hrs ago0x32d152ca82cb16aeb7a6de89c6162199f34afabe IN  0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e1,070 CLV0.01330175
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x251f042e8189a84db222c998e14aefd1e364eb4131bc3cc510f0a7153c94cb3d18363442022-09-23 5:23:303 days 1 hr ago 0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e 0x6d6ad95425fcf315c39fa6f3226471d4f16f27b33.656363613196351731 CLV
0x4f1190f234ac11740fab8354aecf28cb177c8449c91eabf46b31bb50697500bb18363402022-09-23 5:22:423 days 1 hr ago 0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e0x5def548d48d623c370bf86e9c27c1b83cb222e742.472039443300263738 CLV
0x4f1190f234ac11740fab8354aecf28cb177c8449c91eabf46b31bb50697500bb18363402022-09-23 5:22:423 days 1 hr ago 0x6d6ad95425fcf315c39fa6f3226471d4f16f27b3 0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e2.472039443300263738 CLV
0xc15329eace7878ea19d392d2d87482b0180da7617ad9c8b2f08ee5986964987218306502022-09-22 10:05:303 days 20 hrs ago 0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e 0xcd8c7eed3932926b54448fc2747324febaf3c7af13.814463864525999175 CLV
0xc15329eace7878ea19d392d2d87482b0180da7617ad9c8b2f08ee5986964987218306502022-09-22 10:05:303 days 20 hrs ago 0x6d6ad95425fcf315c39fa6f3226471d4f16f27b3 0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e13.814463864525999175 CLV
0x986ded87ef74f8d7a90ce14f9e39add6e0fe39843e4f17d0afefe87f0e8c6efb18153952022-09-20 6:37:245 days 23 hrs ago 0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e0xac351fa54f0c6d6fe5323560564ea30a5cd348171 wei
0x986ded87ef74f8d7a90ce14f9e39add6e0fe39843e4f17d0afefe87f0e8c6efb18153952022-09-20 6:37:245 days 23 hrs ago 0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e 0x6d6ad95425fcf315c39fa6f3226471d4f16f27b3229.999999999999999999 CLV
0x2e6ce1bad73e7234c9381ac6aac8de24f7ca609429b164ab4931465dd97ffbf118153772022-09-20 6:33:486 days 1 min ago 0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e0xac351fa54f0c6d6fe5323560564ea30a5cd34817256.017876117670801334 CLV
0x2e6ce1bad73e7234c9381ac6aac8de24f7ca609429b164ab4931465dd97ffbf118153772022-09-20 6:33:486 days 1 min ago 0x6d6ad95425fcf315c39fa6f3226471d4f16f27b3 0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e256.017876117670801334 CLV
0x661b7f7c85c13d03916d61bf8190e23ae48ccb46d638e9ced4d5a5346f283f4a18088062022-09-19 8:06:366 days 22 hrs ago 0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e 0x6d6ad95425fcf315c39fa6f3226471d4f16f27b31,256 CLV
0x4660f8cb13eb41382ba48ed136f013007fba827bc4733acc6bbb74b8c9d982a818060362022-09-18 22:42:067 days 7 hrs ago 0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e 0x6d6ad95425fcf315c39fa6f3226471d4f16f27b33,032 CLV
0xec018f0288c23b5ebe87af755d56e24e1e9458260b792d71c2b9023d074ec1e718051992022-09-18 19:51:547 days 10 hrs ago 0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e 0x6d6ad95425fcf315c39fa6f3226471d4f16f27b32,352.087659197299282294 CLV
0x6bfd2fe5ee294eb0e64f1c35972559b3d011e2f414526fc1a2bfeb0c9701ec7117997072022-09-18 1:13:428 days 5 hrs ago 0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e 0x6d6ad95425fcf315c39fa6f3226471d4f16f27b3598.038991640210107377 CLV
0x90c41bb31d2e0df19e56dd87dd4dfd3ba75144785bf781790aba9fc5923b695017997012022-09-18 1:12:308 days 5 hrs ago 0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e 0x6d6ad95425fcf315c39fa6f3226471d4f16f27b30.1 CLV
0x0bb6ff5fc5f964eb5ae26ac0914c63da50a7f15c78b52d89074452fb14c8b76417996982022-09-18 1:11:548 days 5 hrs ago 0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e 0x6d6ad95425fcf315c39fa6f3226471d4f16f27b3595 CLV
0x89fd5dd5170bbaad263dcdc4dd23b4c52e6e8f784c307c5f499ee14b8906006b17992452022-09-17 23:40:188 days 6 hrs ago 0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e0x7163b314d7c7c0197cd652f816faa0f9d03074a149.586603788036128465 CLV
0x89fd5dd5170bbaad263dcdc4dd23b4c52e6e8f784c307c5f499ee14b8906006b17992452022-09-17 23:40:188 days 6 hrs ago 0x6d6ad95425fcf315c39fa6f3226471d4f16f27b3 0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e49.586603788036128465 CLV
0x0001251ad720d822fb7dea504271d592b485271dcecd426d94d89b8fcca6da1017990922022-09-17 23:08:548 days 7 hrs ago 0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e0xee6a11695a33358b08c75684805770aca89cdb95252.758499256778573857 CLV
0x0001251ad720d822fb7dea504271d592b485271dcecd426d94d89b8fcca6da1017990922022-09-17 23:08:548 days 7 hrs ago 0x6d6ad95425fcf315c39fa6f3226471d4f16f27b3 0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e252.758499256778573857 CLV
0x21358ccf313767b55274f820bcb38f891871146d4209e126e2aa4623d993ef5817990852022-09-17 23:07:308 days 7 hrs ago 0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e0xee6a11695a33358b08c75684805770aca89cdb95254.375877596394997162 CLV
0x21358ccf313767b55274f820bcb38f891871146d4209e126e2aa4623d993ef5817990852022-09-17 23:07:308 days 7 hrs ago 0x6d6ad95425fcf315c39fa6f3226471d4f16f27b3 0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e254.375877596394997162 CLV
0xdafff1384963d38e88d03882dc217e8987a38b92784feca607fbfd54e0118dff17989062022-09-17 22:30:488 days 8 hrs ago 0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e0xee6a11695a33358b08c75684805770aca89cdb9559.237243483553535467 CLV
0xdafff1384963d38e88d03882dc217e8987a38b92784feca607fbfd54e0118dff17989062022-09-17 22:30:488 days 8 hrs ago 0x6d6ad95425fcf315c39fa6f3226471d4f16f27b3 0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e59.237243483553535467 CLV
0xc351834b3398659c2b8de3a06de7a08ff686bc3f16412c28a8018b6ee320fea317948152022-09-17 8:35:488 days 21 hrs ago 0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e 0x6d6ad95425fcf315c39fa6f3226471d4f16f27b37.389206297397517731 CLV
0x631aab8cd21cbadbfbaa3d61ede848378372372b646bef397098c9bd9b3fdf2f17948062022-09-17 8:34:008 days 22 hrs ago 0x5d91eaee3a8b2a73b0505c9585cbfcd81d972d7e0x5def548d48d623c370bf86e9c27c1b83cb222e747.503356519056501104 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.