Contract 0xe85c6ab56a3422e7bafd71e81eb7d0f290646078

Txn Hash
Block
From
To
Value [Txn Fee]
0x92bddd359d8ef17c322538cf77777ecf38124fc088f0cf04f72b8368588a9b9c15108022020-10-20 14:29:4836 secs ago0xbbda84a7f919b7c75e02f479e2ba51e31ff4adf8 IN  0xe85c6ab56a3422e7bafd71e81eb7d0f2906460789.683981914374509 BNB0.00352172
0x6d809a811947b36831502ddaffbee84f6446dee0387a9cc72f5168f67dca200215107872020-10-20 14:29:031 min ago0xb59c1ef28de0c8eadcb6b1afd15df57e78547e7b IN  0xe85c6ab56a3422e7bafd71e81eb7d0f2906460780 BNB0.00316062
0x8f04438be6a82f60dd5f3f49c8b74e649cd951088f2ffbd131e97b28890e6af315107862020-10-20 14:29:001 min ago0x13c298c3d47d55343dbe3ae8175e8fa40417193f IN  0xe85c6ab56a3422e7bafd71e81eb7d0f2906460780.111379500856878 BNB0.00266284
0x5e945d3ef62a6188205a2e2198e6f8b2a53ca24fe55e788e94e0bc7b1de6a1d415107762020-10-20 14:28:301 min ago0x13c298c3d47d55343dbe3ae8175e8fa40417193f IN  0xe85c6ab56a3422e7bafd71e81eb7d0f2906460780.1 BNB0.0030612
0x190034599a7e66b3205edf0902a12dbaa73d9f1128b5b2b9b7c30c290d314a8915107642020-10-20 14:27:542 mins ago0xf6968659315e0b998def70b689a912bf5d455a56 IN  0xe85c6ab56a3422e7bafd71e81eb7d0f2906460789 BNB0.00382468
0xcb6ae7b8d757ab1d478c4230542b3c6a9b20f7b1e5c1fb651f76b9ecf9e3a45915107592020-10-20 14:27:392 mins ago0xb500d933b379bc33fc8332adf917495917e3915c IN  0xe85c6ab56a3422e7bafd71e81eb7d0f2906460780.073484138783039 BNB0.00351816
0x057a93808fdfdf51f370d9e7eed981c5fa0da94baf32d8d8281e0ce5ae84032015107532020-10-20 14:27:213 mins ago0x3a730d09b4834382b16a6027510cf7b70c6402cc IN  0xe85c6ab56a3422e7bafd71e81eb7d0f290646078931.38706642 BNB0.00315606
0x6f75fa9cc25bf2bd82fe4532830c16590f47aa95dfe33167bc1016973d163c7215107272020-10-20 14:26:034 mins ago0x0f7ac37c32afd5dcf184300f6f47fffacde000ca IN  0xe85c6ab56a3422e7bafd71e81eb7d0f2906460780 BNB0.00316086
0xdae049c5d18465abaed15ce4e83af44c7a41c3f19542efefcd5a2789ec18380815107212020-10-20 14:25:454 mins ago0xf6968659315e0b998def70b689a912bf5d455a56 IN  0xe85c6ab56a3422e7bafd71e81eb7d0f29064607810.087414863294267 BNB0.00352172
0x23b2a1129c71388644b0585c2a7ffd892a395fbb66f3be76134bf15316b3574715107162020-10-20 14:25:304 mins ago0x0f7ac37c32afd5dcf184300f6f47fffacde000ca IN  0xe85c6ab56a3422e7bafd71e81eb7d0f2906460780 BNB0.0048016
0x94b5c87ae686d286f155c1f446968a5e63605284fb7c6b8e580b1070acfe58bf15106732020-10-20 14:23:217 mins ago0xc8dc6da781097a2be9854f69faed10e087da8ad3 IN  0xe85c6ab56a3422e7bafd71e81eb7d0f2906460780 BNB0.00316086
0xc291ceb6ab79c434c3ad67084d3dbf287c48090c21e1906e76ef608d952035b715106392020-10-20 14:21:398 mins ago0x83e259726cb73603ec1af3fa329d61c012b45e08 IN  0xe85c6ab56a3422e7bafd71e81eb7d0f2906460788.988077794310498 BNB0.0035184
0xa86cf8a82dac595118fb5db25cf02bab25e84aa92072bc6d8f161ab5cc4a325015106192020-10-20 14:20:399 mins ago0x83e259726cb73603ec1af3fa329d61c012b45e08 IN  0xe85c6ab56a3422e7bafd71e81eb7d0f2906460789.581367787332513 BNB0.00352172
0xd7326ed5ffe5b16057687109fb70d18e10e7f125d4c0085f5aa7fb7298395ec115106092020-10-20 14:20:0910 mins ago0x53d9ca67e76e73d91b8697643221d8cf11c48356 IN  0xe85c6ab56a3422e7bafd71e81eb7d0f290646078188.614800506578426 BNB0.00270066
0x8982b0c2b98b8923ccdd8d8e9039a4e5ca43e7f7d1313c84009a26f5ec59ef3415106042020-10-20 14:19:5410 mins ago0x0f7ac37c32afd5dcf184300f6f47fffacde000ca IN  0xe85c6ab56a3422e7bafd71e81eb7d0f2906460781,401.980675714706685 BNB0.00270022
0xebe6f44c95aac17400989b53e9d038013ecb027a74940f4e449ca842b17289b215105722020-10-20 14:18:1812 mins ago0xef575087f1e7bec54046f98119c8c392a37c51dd IN  0xe85c6ab56a3422e7bafd71e81eb7d0f2906460780 BNB0.002700159
0xf39bbf5c2d34f3b2b7f205ed8d72bb1e9dbae0612ffa28e211e962a327551fd115105692020-10-20 14:18:0912 mins ago0xef575087f1e7bec54046f98119c8c392a37c51dd IN  0xe85c6ab56a3422e7bafd71e81eb7d0f2906460780 BNB0.002700159
0x2585b3432fb9872c9863d95705c50e91499b139726125c159a8f3a13fd82c82115105642020-10-20 14:17:5412 mins ago0xa31556a0d64f2d022f553b6419d2de19ceaf802d IN  0xe85c6ab56a3422e7bafd71e81eb7d0f2906460780 BNB0.003563744
0x338a76e0a2bbb416d28fff070c89593861c7811b9ef257b0fc61f6ac5e7cdad515105632020-10-20 14:17:5112 mins ago0xef575087f1e7bec54046f98119c8c392a37c51dd IN  0xe85c6ab56a3422e7bafd71e81eb7d0f2906460780 BNB0.002700159
0xa7c440568c73d10738ab8ae28e8d23e8eec52ce9334b8b551ed89d5c17cd0f0e15105612020-10-20 14:17:4512 mins ago0xa31556a0d64f2d022f553b6419d2de19ceaf802d IN  0xe85c6ab56a3422e7bafd71e81eb7d0f2906460780 BNB0.003563744
0x9b82b6e1ee5e262186a7d724ff7e09a7c84bea1b1793145d104355d3422e92ba15105582020-10-20 14:17:3612 mins ago0xf20b54793c7847f1dc6327b3e8ba67a79a0de8d8 IN  0xe85c6ab56a3422e7bafd71e81eb7d0f2906460788.891348522750641 BNB0.00351816
0x9df26ea534fa45275468cf2b84ce67bb03cceb5a17d45be622b679d671baf56015105382020-10-20 14:16:3613 mins ago0xf20b54793c7847f1dc6327b3e8ba67a79a0de8d8 IN  0xe85c6ab56a3422e7bafd71e81eb7d0f2906460789.478284944742149 BNB0.00352172
0xa5b7f21226aa18c09457af291853761d6eb7f27036897be82541836fb53539ae15104892020-10-20 14:14:0916 mins ago0x890094b6b59706b902b4f3a59051d75375554df2 IN  0xe85c6ab56a3422e7bafd71e81eb7d0f2906460780 BNB0.00263374
0x39d89e387886233379db53132e387efaa69c83703d29236be75c00538a44764015104892020-10-20 14:14:0916 mins ago0x743c0c3af61af8f340dc50e0f5b3583d89ce390e IN  0xe85c6ab56a3422e7bafd71e81eb7d0f2906460788.797379464529359 BNB0.0035184
0x05245e0c98ef34225bd7dd297b99b18e806d7648a8c4bfd448da535a1ffabf0415104712020-10-20 14:13:1517 mins ago0x743c0c3af61af8f340dc50e0f5b3583d89ce390e IN  0xe85c6ab56a3422e7bafd71e81eb7d0f2906460789.37814340647622 BNB0.00352172
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x92bddd359d8ef17c322538cf77777ecf38124fc088f0cf04f72b8368588a9b9c15108022020-10-20 14:29:4836 secs ago 0xe85c6ab56a3422e7bafd71e81eb7d0f2906460780xbbda84a7f919b7c75e02f479e2ba51e31ff4adf80.095881009053212968 BNB
0x92bddd359d8ef17c322538cf77777ecf38124fc088f0cf04f72b8368588a9b9c15108022020-10-20 14:29:4836 secs ago 0xe85c6ab56a3422e7bafd71e81eb7d0f290646078 0xb6b0ba4e208ab93602be7a81f1400a7c7daad1f20 BNB
0x92bddd359d8ef17c322538cf77777ecf38124fc088f0cf04f72b8368588a9b9c15108022020-10-20 14:29:4836 secs ago 0xe85c6ab56a3422e7bafd71e81eb7d0f290646078 Binance: WBNB Token0 BNB
0x92bddd359d8ef17c322538cf77777ecf38124fc088f0cf04f72b8368588a9b9c15108022020-10-20 14:29:4836 secs ago 0xe85c6ab56a3422e7bafd71e81eb7d0f290646078 Binance: WBNB Token9.588100905321296802 BNB
0x92bddd359d8ef17c322538cf77777ecf38124fc088f0cf04f72b8368588a9b9c15108022020-10-20 14:29:4836 secs ago 0xe85c6ab56a3422e7bafd71e81eb7d0f290646078 0xb6b0ba4e208ab93602be7a81f1400a7c7daad1f20 BNB
0x6d809a811947b36831502ddaffbee84f6446dee0387a9cc72f5168f67dca200215107872020-10-20 14:29:031 min ago 0xe85c6ab56a3422e7bafd71e81eb7d0f2906460780xb59c1ef28de0c8eadcb6b1afd15df57e78547e7b3.343910567850020418 BNB
0x6d809a811947b36831502ddaffbee84f6446dee0387a9cc72f5168f67dca200215107872020-10-20 14:29:031 min ago Binance: WBNB Token 0xe85c6ab56a3422e7bafd71e81eb7d0f2906460783.343910567850020418 BNB
0x6d809a811947b36831502ddaffbee84f6446dee0387a9cc72f5168f67dca200215107872020-10-20 14:29:031 min ago 0xe85c6ab56a3422e7bafd71e81eb7d0f290646078 Binance: WBNB Token0 BNB
0x6d809a811947b36831502ddaffbee84f6446dee0387a9cc72f5168f67dca200215107872020-10-20 14:29:031 min ago 0xe85c6ab56a3422e7bafd71e81eb7d0f290646078 Binance: WBNB Token0 BNB
0x6d809a811947b36831502ddaffbee84f6446dee0387a9cc72f5168f67dca200215107872020-10-20 14:29:031 min ago 0xe85c6ab56a3422e7bafd71e81eb7d0f290646078 0xb6b0ba4e208ab93602be7a81f1400a7c7daad1f20 BNB
0x6d809a811947b36831502ddaffbee84f6446dee0387a9cc72f5168f67dca200215107872020-10-20 14:29:031 min ago 0xe85c6ab56a3422e7bafd71e81eb7d0f290646078 Narwhalswap: NAR Token0 BNB
0x6d809a811947b36831502ddaffbee84f6446dee0387a9cc72f5168f67dca200215107872020-10-20 14:29:031 min ago 0xe85c6ab56a3422e7bafd71e81eb7d0f290646078 0xb6b0ba4e208ab93602be7a81f1400a7c7daad1f20 BNB
0x6d809a811947b36831502ddaffbee84f6446dee0387a9cc72f5168f67dca200215107872020-10-20 14:29:031 min ago 0xe85c6ab56a3422e7bafd71e81eb7d0f290646078 Narwhalswap: NAR Token0 BNB
0x8f04438be6a82f60dd5f3f49c8b74e649cd951088f2ffbd131e97b28890e6af315107862020-10-20 14:29:001 min ago 0xe85c6ab56a3422e7bafd71e81eb7d0f2906460780x13c298c3d47d55343dbe3ae8175e8fa40417193f0.007286509401851872 BNB
0x8f04438be6a82f60dd5f3f49c8b74e649cd951088f2ffbd131e97b28890e6af315107862020-10-20 14:29:001 min ago 0xe85c6ab56a3422e7bafd71e81eb7d0f290646078 0x5ec32c21c9a6215d239f2bd0df22d7632b4717c30 BNB
0x8f04438be6a82f60dd5f3f49c8b74e649cd951088f2ffbd131e97b28890e6af315107862020-10-20 14:29:001 min ago 0xe85c6ab56a3422e7bafd71e81eb7d0f290646078 Binance: WBNB Token0 BNB
0x8f04438be6a82f60dd5f3f49c8b74e649cd951088f2ffbd131e97b28890e6af315107862020-10-20 14:29:001 min ago 0xe85c6ab56a3422e7bafd71e81eb7d0f290646078 Binance: WBNB Token0.104092991455026755 BNB
0x8f04438be6a82f60dd5f3f49c8b74e649cd951088f2ffbd131e97b28890e6af315107862020-10-20 14:29:001 min ago 0xe85c6ab56a3422e7bafd71e81eb7d0f290646078 0x5ec32c21c9a6215d239f2bd0df22d7632b4717c30 BNB
0x5e945d3ef62a6188205a2e2198e6f8b2a53ca24fe55e788e94e0bc7b1de6a1d415107762020-10-20 14:28:301 min ago 0xe85c6ab56a3422e7bafd71e81eb7d0f290646078 0xb6b0ba4e208ab93602be7a81f1400a7c7daad1f20 BNB
0x5e945d3ef62a6188205a2e2198e6f8b2a53ca24fe55e788e94e0bc7b1de6a1d415107762020-10-20 14:28:301 min ago 0xe85c6ab56a3422e7bafd71e81eb7d0f290646078 Binance: WBNB Token0 BNB
0x5e945d3ef62a6188205a2e2198e6f8b2a53ca24fe55e788e94e0bc7b1de6a1d415107762020-10-20 14:28:301 min ago 0xe85c6ab56a3422e7bafd71e81eb7d0f290646078 Binance: WBNB Token0.1 BNB
0x5e945d3ef62a6188205a2e2198e6f8b2a53ca24fe55e788e94e0bc7b1de6a1d415107762020-10-20 14:28:301 min ago 0xe85c6ab56a3422e7bafd71e81eb7d0f290646078 0xb6b0ba4e208ab93602be7a81f1400a7c7daad1f20 BNB
0x190034599a7e66b3205edf0902a12dbaa73d9f1128b5b2b9b7c30c290d314a8915107642020-10-20 14:27:542 mins ago 0xe85c6ab56a3422e7bafd71e81eb7d0f290646078 0xb6b0ba4e208ab93602be7a81f1400a7c7daad1f20 BNB
0x190034599a7e66b3205edf0902a12dbaa73d9f1128b5b2b9b7c30c290d314a8915107642020-10-20 14:27:542 mins ago 0xe85c6ab56a3422e7bafd71e81eb7d0f290646078 Binance: WBNB Token0 BNB
0x190034599a7e66b3205edf0902a12dbaa73d9f1128b5b2b9b7c30c290d314a8915107642020-10-20 14:27:542 mins ago 0xe85c6ab56a3422e7bafd71e81eb7d0f290646078 Binance: WBNB Token9 BNB
[ Download CSV Export 

Contract Source Code Verified (Exact Match)

Contract Name:
NarwhalswapRouter

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at BscScan.com on 2020-09-27
*/

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

// SPDX-License-Identifier: GPL-3.0-or-later

// pragma solidity >=0.6.2;

interface INarwhalswapRouter01 {
    function factory() external pure returns (address);
    function WBNB() 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 addLiquidityBNB(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountBNBMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountBNB, 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 removeLiquidityBNB(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountBNBMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountBNB);
    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 removeLiquidityBNBWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountBNBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountBNB);
    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 swapExactBNBForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactBNB(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForBNB(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapBNBForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

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

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

// pragma solidity >=0.5.0;

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

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

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

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

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

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

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

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

    function initialize(address, address) external;
}

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

// pragma solidity >=0.5.0;

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

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

// pragma solidity >=0.5.0;

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

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

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

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

// pragma solidity >=0.5.0;

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

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

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

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

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

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

// pragma solidity >=0.6.2;

// import './INarwhalswapRouter01.sol';

interface INarwhalswapRouter02 is INarwhalswapRouter01 {
    function removeLiquidityBNBSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountBNBMin,
        address to,
        uint deadline
    ) external returns (uint amountBNB);
    function removeLiquidityBNBWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountBNBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountBNB);

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

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

// pragma solidity >=0.6.0;

// helper methods for interacting with BEP20 tokens and sending BNB 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 safeTransferBNB(address to, uint value) internal {
        (bool success,) = to.call{value:value}(new bytes(0));
        require(success, 'TransferHelper: BNB_TRANSFER_FAILED');
    }
}

// Dependency 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 SafeMathNarwhalswap {
    function add(uint x, uint y) internal pure returns (uint z) {
        require((z = x + y) >= x, 'ds-math-add-overflow');
    }

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

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

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

// pragma solidity >=0.5.0;

// import '../interfaces/INarwhalswapPair.sol';

// import "./SafeMath.sol";

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

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

    // fetches and sorts the reserves for a pair
    function getReserves(address factory, address tokenA, address tokenB) internal view returns (uint reserveA, uint reserveB) {
        (address token0,) = sortTokens(tokenA, tokenB);
        (uint reserve0, uint reserve1,) = INarwhalswapPair(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, 'NarwhalswapLibrary: INSUFFICIENT_AMOUNT');
        require(reserveA > 0 && reserveB > 0, 'NarwhalswapLibrary: 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, 'NarwhalswapLibrary: INSUFFICIENT_INPUT_AMOUNT');
        require(reserveIn > 0 && reserveOut > 0, 'NarwhalswapLibrary: 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, 'NarwhalswapLibrary: INSUFFICIENT_OUTPUT_AMOUNT');
        require(reserveIn > 0 && reserveOut > 0, 'NarwhalswapLibrary: 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, 'NarwhalswapLibrary: 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, 'NarwhalswapLibrary: 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);
        }
    }
}

pragma solidity =0.6.12;


// import './libraries/NarwhalswapLibrary.sol';
// import './libraries/SafeMath.sol';
// import './libraries/TransferHelper.sol';
// import './interfaces/INarwhalswapRouter02.sol';
// import './interfaces/INarwhalswapFactory.sol';
// import './interfaces/IBEP20.sol';
// import './interfaces/IWBNB.sol';

contract NarwhalswapRouter is INarwhalswapRouter02 {
    using SafeMathNarwhalswap for uint;

    address public immutable override factory;
    address public immutable override WBNB;

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

    constructor(address _factory, address _WBNB) public {
        factory = _factory;
        WBNB = _WBNB;
    }

    receive() external payable {
        assert(msg.sender == WBNB); // only accept BNB via fallback from the WBNB 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 (INarwhalswapFactory(factory).getPair(tokenA, tokenB) == address(0)) {
            INarwhalswapFactory(factory).createPair(tokenA, tokenB);
        }
        (uint reserveA, uint reserveB) = NarwhalswapLibrary.getReserves(factory, tokenA, tokenB);
        if (reserveA == 0 && reserveB == 0) {
            (amountA, amountB) = (amountADesired, amountBDesired);
        } else {
            uint amountBOptimal = NarwhalswapLibrary.quote(amountADesired, reserveA, reserveB);
            if (amountBOptimal <= amountBDesired) {
                require(amountBOptimal >= amountBMin, 'NarwhalswapRouter: INSUFFICIENT_B_AMOUNT');
                (amountA, amountB) = (amountADesired, amountBOptimal);
            } else {
                uint amountAOptimal = NarwhalswapLibrary.quote(amountBDesired, reserveB, reserveA);
                assert(amountAOptimal <= amountADesired);
                require(amountAOptimal >= amountAMin, 'NarwhalswapRouter: 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 = NarwhalswapLibrary.pairFor(factory, tokenA, tokenB);
        TransferHelper.safeTransferFrom(tokenA, msg.sender, pair, amountA);
        TransferHelper.safeTransferFrom(tokenB, msg.sender, pair, amountB);
        liquidity = INarwhalswapPair(pair).mint(to);
    }
    function addLiquidityBNB(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountBNBMin,
        address to,
        uint deadline
    ) external virtual override payable ensure(deadline) returns (uint amountToken, uint amountBNB, uint liquidity) {
        (amountToken, amountBNB) = _addLiquidity(
            token,
            WBNB,
            amountTokenDesired,
            msg.value,
            amountTokenMin,
            amountBNBMin
        );
        address pair = NarwhalswapLibrary.pairFor(factory, token, WBNB);
        TransferHelper.safeTransferFrom(token, msg.sender, pair, amountToken);
        IWBNB(WBNB).deposit{value: amountBNB}();
        assert(IWBNB(WBNB).transfer(pair, amountBNB));
        liquidity = INarwhalswapPair(pair).mint(to);
        // refund dust BNB, if any
        if (msg.value > amountBNB) TransferHelper.safeTransferBNB(msg.sender, msg.value - amountBNB);
    }

    // **** 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 = NarwhalswapLibrary.pairFor(factory, tokenA, tokenB);
        INarwhalswapPair(pair).transferFrom(msg.sender, pair, liquidity); // send liquidity to pair
        (uint amount0, uint amount1) = INarwhalswapPair(pair).burn(to);
        (address token0,) = NarwhalswapLibrary.sortTokens(tokenA, tokenB);
        (amountA, amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0);
        require(amountA >= amountAMin, 'NarwhalswapRouter: INSUFFICIENT_A_AMOUNT');
        require(amountB >= amountBMin, 'NarwhalswapRouter: INSUFFICIENT_B_AMOUNT');
    }
    function removeLiquidityBNB(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountBNBMin,
        address to,
        uint deadline
    ) public virtual override ensure(deadline) returns (uint amountToken, uint amountBNB) {
        (amountToken, amountBNB) = removeLiquidity(
            token,
            WBNB,
            liquidity,
            amountTokenMin,
            amountBNBMin,
            address(this),
            deadline
        );
        TransferHelper.safeTransfer(token, to, amountToken);
        IWBNB(WBNB).withdraw(amountBNB);
        TransferHelper.safeTransferBNB(to, amountBNB);
    }
    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 = NarwhalswapLibrary.pairFor(factory, tokenA, tokenB);
        uint value = approveMax ? uint(-1) : liquidity;
        INarwhalswapPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        (amountA, amountB) = removeLiquidity(tokenA, tokenB, liquidity, amountAMin, amountBMin, to, deadline);
    }
    function removeLiquidityBNBWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountBNBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external virtual override returns (uint amountToken, uint amountBNB) {
        address pair = NarwhalswapLibrary.pairFor(factory, token, WBNB);
        uint value = approveMax ? uint(-1) : liquidity;
        INarwhalswapPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        (amountToken, amountBNB) = removeLiquidityBNB(token, liquidity, amountTokenMin, amountBNBMin, to, deadline);
    }

    // **** REMOVE LIQUIDITY (supporting fee-on-transfer tokens) ****
    function removeLiquidityBNBSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountBNBMin,
        address to,
        uint deadline
    ) public virtual override ensure(deadline) returns (uint amountBNB) {
        (, amountBNB) = removeLiquidity(
            token,
            WBNB,
            liquidity,
            amountTokenMin,
            amountBNBMin,
            address(this),
            deadline
        );
        TransferHelper.safeTransfer(token, to, IBEP20Narwhalswap(token).balanceOf(address(this)));
        IWBNB(WBNB).withdraw(amountBNB);
        TransferHelper.safeTransferBNB(to, amountBNB);
    }
    function removeLiquidityBNBWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountBNBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external virtual override returns (uint amountBNB) {
        address pair = NarwhalswapLibrary.pairFor(factory, token, WBNB);
        uint value = approveMax ? uint(-1) : liquidity;
        INarwhalswapPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        amountBNB = removeLiquidityBNBSupportingFeeOnTransferTokens(
            token, liquidity, amountTokenMin, amountBNBMin, 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,) = NarwhalswapLibrary.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 ? NarwhalswapLibrary.pairFor(factory, output, path[i + 2]) : _to;
            INarwhalswapPair(NarwhalswapLibrary.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 = NarwhalswapLibrary.getAmountsOut(factory, amountIn, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'NarwhalswapRouter: INSUFFICIENT_OUTPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, NarwhalswapLibrary.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 = NarwhalswapLibrary.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= amountInMax, 'NarwhalswapRouter: EXCESSIVE_INPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, NarwhalswapLibrary.pairFor(factory, path[0], path[1]), amounts[0]
        );
        _swap(amounts, path, to);
    }
    function swapExactBNBForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        virtual
        override
        payable
        ensure(deadline)
        returns (uint[] memory amounts)
    {
        require(path[0] == WBNB, 'NarwhalswapRouter: INVALID_PATH');
        amounts = NarwhalswapLibrary.getAmountsOut(factory, msg.value, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'NarwhalswapRouter: INSUFFICIENT_OUTPUT_AMOUNT');
        IWBNB(WBNB).deposit{value: amounts[0]}();
        assert(IWBNB(WBNB).transfer(NarwhalswapLibrary.pairFor(factory, path[0], path[1]), amounts[0]));
        _swap(amounts, path, to);
    }
    function swapTokensForExactBNB(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] == WBNB, 'NarwhalswapRouter: INVALID_PATH');
        amounts = NarwhalswapLibrary.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= amountInMax, 'NarwhalswapRouter: EXCESSIVE_INPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, NarwhalswapLibrary.pairFor(factory, path[0], path[1]), amounts[0]
        );
        _swap(amounts, path, address(this));
        IWBNB(WBNB).withdraw(amounts[amounts.length - 1]);
        TransferHelper.safeTransferBNB(to, amounts[amounts.length - 1]);
    }
    function swapExactTokensForBNB(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] == WBNB, 'NarwhalswapRouter: INVALID_PATH');
        amounts = NarwhalswapLibrary.getAmountsOut(factory, amountIn, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'NarwhalswapRouter: INSUFFICIENT_OUTPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, NarwhalswapLibrary.pairFor(factory, path[0], path[1]), amounts[0]
        );
        _swap(amounts, path, address(this));
        IWBNB(WBNB).withdraw(amounts[amounts.length - 1]);
        TransferHelper.safeTransferBNB(to, amounts[amounts.length - 1]);
    }
    function swapBNBForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        virtual
        override
        payable
        ensure(deadline)
        returns (uint[] memory amounts)
    {
        require(path[0] == WBNB, 'NarwhalswapRouter: INVALID_PATH');
        amounts = NarwhalswapLibrary.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= msg.value, 'NarwhalswapRouter: EXCESSIVE_INPUT_AMOUNT');
        IWBNB(WBNB).deposit{value: amounts[0]}();
        assert(IWBNB(WBNB).transfer(NarwhalswapLibrary.pairFor(factory, path[0], path[1]), amounts[0]));
        _swap(amounts, path, to);
        // refund dust BNB, if any
        if (msg.value > amounts[0]) TransferHelper.safeTransferBNB(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,) = NarwhalswapLibrary.sortTokens(input, output);
            INarwhalswapPair pair = INarwhalswapPair(NarwhalswapLibrary.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 = IBEP20Narwhalswap(input).balanceOf(address(pair)).sub(reserveInput);
            amountOutput = NarwhalswapLibrary.getAmountOut(amountInput, reserveInput, reserveOutput);
            }
            (uint amount0Out, uint amount1Out) = input == token0 ? (uint(0), amountOutput) : (amountOutput, uint(0));
            address to = i < path.length - 2 ? NarwhalswapLibrary.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, NarwhalswapLibrary.pairFor(factory, path[0], path[1]), amountIn
        );
        uint balanceBefore = IBEP20Narwhalswap(path[path.length - 1]).balanceOf(to);
        _swapSupportingFeeOnTransferTokens(path, to);
        require(
            IBEP20Narwhalswap(path[path.length - 1]).balanceOf(to).sub(balanceBefore) >= amountOutMin,
            'NarwhalswapRouter: INSUFFICIENT_OUTPUT_AMOUNT'
        );
    }
    function swapExactBNBForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    )
        external
        virtual
        override
        payable
        ensure(deadline)
    {
        require(path[0] == WBNB, 'NarwhalswapRouter: INVALID_PATH');
        uint amountIn = msg.value;
        IWBNB(WBNB).deposit{value: amountIn}();
        assert(IWBNB(WBNB).transfer(NarwhalswapLibrary.pairFor(factory, path[0], path[1]), amountIn));
        uint balanceBefore = IBEP20Narwhalswap(path[path.length - 1]).balanceOf(to);
        _swapSupportingFeeOnTransferTokens(path, to);
        require(
            IBEP20Narwhalswap(path[path.length - 1]).balanceOf(to).sub(balanceBefore) >= amountOutMin,
            'NarwhalswapRouter: INSUFFICIENT_OUTPUT_AMOUNT'
        );
    }
    function swapExactTokensForBNBSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    )
        external
        virtual
        override
        ensure(deadline)
    {
        require(path[path.length - 1] == WBNB, 'NarwhalswapRouter: INVALID_PATH');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, NarwhalswapLibrary.pairFor(factory, path[0], path[1]), amountIn
        );
        _swapSupportingFeeOnTransferTokens(path, address(this));
        uint amountOut = IBEP20Narwhalswap(WBNB).balanceOf(address(this));
        require(amountOut >= amountOutMin, 'NarwhalswapRouter: INSUFFICIENT_OUTPUT_AMOUNT');
        IWBNB(WBNB).withdraw(amountOut);
        TransferHelper.safeTransferBNB(to, amountOut);
    }

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

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

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

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

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

Contract ABI

[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_WBNB","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"WBNB","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":"amountBNBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidityBNB","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountBNB","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":"amountBNBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityBNB","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountBNB","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":"amountBNBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityBNBSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountBNB","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":"amountBNBMin","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":"removeLiquidityBNBWithPermit","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountBNB","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":"amountBNBMin","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":"removeLiquidityBNBWithPermitSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountBNB","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":"swapBNBForExactTokens","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":"swapExactBNBForTokens","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":"swapExactBNBForTokensSupportingFeeOnTransferTokens","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":"swapExactTokensForBNB","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":"swapExactTokensForBNBSupportingFeeOnTransferTokens","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":"swapTokensForExactBNB","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"}]

60c060405234801561001057600080fd5b50604051620046f9380380620046f98339818101604052604081101561003557600080fd5b5080516020909101516001600160601b0319606092831b8116608052911b1660a05260805160601c60a05160601c614574620001856000398061015f5280610e08528061111a52806111af5280611223528061171252806118a252806119805280611aac5280611bef5280611c775280611eef5280611f59528061209f528061212752806122aa528061235e52806126c752806127a2528061287c52806129525280612adb5280612b165280612d2a5280612d805280612db45280612e28525080610cb35280610cec5280610de65280610f3b52806110125280611255528061154552806117a0528061195e5280611b3f5280611ca95280611e3f5280611fec52806121595280612432528061262a528061265352806129e05280612c0b5280612d5e528061359652806135d9528061377b52806138f15280613f445280613ffd52806140b052506145746000f3fe60806040526004361061014f5760003560e01c80638dd95002116100b6578063d06ca61f1161006f578063d06ca61f1461099d578063d46d2f8314610a52578063d67b571e14610ae8578063e058848814610b7e578063e8e3370014610bd1578063eaaed44214610c5157610188565b80638dd95002146107ed5780639cf689111461081e578063ad615dec146108a2578063b7e65949146108d8578063baa2abde1461092b578063c45a01551461098857610188565b80635c11d795116101085780635c11d795146104fe5780635d616c5b14610594578063685a0a341461062a5780638332a9631461069d57806385f8c259146107215780638803dbee1461075757610188565b8063054d50d41461018d5780631f00ca74146101d55780632195995c146102da57806334a0772d1461037157806338ed1739146103e457806350e27df31461047a57610188565b3661018857336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461018657fe5b005b600080fd5b34801561019957600080fd5b506101c3600480360360608110156101b057600080fd5b5080359060208101359060400135610c97565b60408051918252519081900360200190f35b3480156101e157600080fd5b5061028a600480360360408110156101f857600080fd5b81359190810190604081016020820135600160201b81111561021957600080fd5b82018360208201111561022b57600080fd5b803590602001918460208302840111600160201b8311171561024c57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610cac945050505050565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156102c65781810151838201526020016102ae565b505050509050019250505060405180910390f35b3480156102e657600080fd5b5061035860048036036101608110156102fe57600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c08101359060e081013515159060ff6101008201351690610120810135906101400135610ce2565b6040805192835260208301919091528051918290030190f35b34801561037d57600080fd5b50610358600480360361014081101561039557600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e08201351690610100810135906101200135610ddc565b3480156103f057600080fd5b5061028a600480360360a081101561040757600080fd5b813591602081013591810190606081016040820135600160201b81111561042d57600080fd5b82018360208201111561043f57600080fd5b803590602001918460208302840111600160201b8311171561046057600080fd5b91935091506001600160a01b038135169060200135610ef0565b6101866004803603608081101561049057600080fd5b81359190810190604081016020820135600160201b8111156104b157600080fd5b8201836020820111156104c357600080fd5b803590602001918460208302840111600160201b831117156104e457600080fd5b91935091506001600160a01b0381351690602001356110d4565b34801561050a57600080fd5b50610186600480360360a081101561052157600080fd5b813591602081013591810190606081016040820135600160201b81111561054757600080fd5b82018360208201111561055957600080fd5b803590602001918460208302840111600160201b8311171561057a57600080fd5b91935091506001600160a01b0381351690602001356114db565b3480156105a057600080fd5b5061028a600480360360a08110156105b757600080fd5b813591602081013591810190606081016040820135600160201b8111156105dd57600080fd5b8201836020820111156105ef57600080fd5b803590602001918460208302840111600160201b8311171561061057600080fd5b91935091506001600160a01b0381351690602001356116c2565b34801561063657600080fd5b506101c3600480360361014081101561064e57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e08201351690610100810135906101200135611956565b61028a600480360360808110156106b357600080fd5b81359190810190604081016020820135600160201b8111156106d457600080fd5b8201836020820111156106e657600080fd5b803590602001918460208302840111600160201b8311171561070757600080fd5b91935091506001600160a01b038135169060200135611a64565b34801561072d57600080fd5b506101c36004803603606081101561074457600080fd5b5080359060208101359060400135611de7565b34801561076357600080fd5b5061028a600480360360a081101561077a57600080fd5b813591602081013591810190606081016040820135600160201b8111156107a057600080fd5b8201836020820111156107b257600080fd5b803590602001918460208302840111600160201b831117156107d357600080fd5b91935091506001600160a01b038135169060200135611df4565b3480156107f957600080fd5b50610802611eed565b604080516001600160a01b039092168252519081900360200190f35b61028a6004803603608081101561083457600080fd5b81359190810190604081016020820135600160201b81111561085557600080fd5b82018360208201111561086757600080fd5b803590602001918460208302840111600160201b8311171561088857600080fd5b91935091506001600160a01b038135169060200135611f11565b3480156108ae57600080fd5b506101c3600480360360608110156108c557600080fd5b5080359060208101359060400135612251565b3480156108e457600080fd5b506101c3600480360360c08110156108fb57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a0013561225e565b34801561093757600080fd5b50610358600480360360e081101561094e57600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c001356123e4565b34801561099457600080fd5b50610802612628565b3480156109a957600080fd5b5061028a600480360360408110156109c057600080fd5b81359190810190604081016020820135600160201b8111156109e157600080fd5b8201836020820111156109f357600080fd5b803590602001918460208302840111600160201b83111715610a1457600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955061264c945050505050565b348015610a5e57600080fd5b50610186600480360360a0811015610a7557600080fd5b813591602081013591810190606081016040820135600160201b811115610a9b57600080fd5b820183602082011115610aad57600080fd5b803590602001918460208302840111600160201b83111715610ace57600080fd5b91935091506001600160a01b038135169060200135612679565b348015610af457600080fd5b5061028a600480360360a0811015610b0b57600080fd5b813591602081013591810190606081016040820135600160201b811115610b3157600080fd5b820183602082011115610b4357600080fd5b803590602001918460208302840111600160201b83111715610b6457600080fd5b91935091506001600160a01b038135169060200135612902565b348015610b8a57600080fd5b50610358600480360360c0811015610ba157600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135612a8e565b348015610bdd57600080fd5b50610c336004803603610100811015610bf557600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359160c0820135169060e00135612ba8565b60408051938452602084019290925282820152519081900360600190f35b610c33600480360360c0811015610c6757600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135612cdb565b6000610ca4848484612f6e565b949350505050565b6060610cd97f00000000000000000000000000000000000000000000000000000000000000008484613046565b90505b92915050565b6000806000610d127f00000000000000000000000000000000000000000000000000000000000000008f8f613193565b9050600087610d21578c610d25565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b158015610d9b57600080fd5b505af1158015610daf573d6000803e3d6000fd5b50505050610dc28f8f8f8f8f8f8f6123e4565b809450819550505050509b509b9950505050505050505050565b6000806000610e2c7f00000000000000000000000000000000000000000000000000000000000000008e7f0000000000000000000000000000000000000000000000000000000000000000613193565b9050600087610e3b578c610e3f565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b158015610eb557600080fd5b505af1158015610ec9573d6000803e3d6000fd5b50505050610edb8e8e8e8e8e8e612a8e565b909f909e509c50505050505050505050505050565b60608142811015610f36576040805162461bcd60e51b815260206004820152601a60248201526000805160206143b6833981519152604482015290519081900360640190fd5b610f947f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061325392505050565b91508682600184510381518110610fa757fe5b60200260200101511015610fec5760405162461bcd60e51b815260040180806020018281038252602d81526020018061442c602d913960400191505060405180910390fd5b61108a86866000818110610ffc57fe5b905060200201356001600160a01b0316336110707f00000000000000000000000000000000000000000000000000000000000000008a8a600081811061103e57fe5b905060200201356001600160a01b03168b8b600181811061105b57fe5b905060200201356001600160a01b0316613193565b8560008151811061107d57fe5b602002602001015161338a565b6110c9828787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508992506134e7915050565b509695505050505050565b8042811015611118576040805162461bcd60e51b815260206004820152601a60248201526000805160206143b6833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168585600081811061114f57fe5b905060200201356001600160a01b03166001600160a01b0316146111a8576040805162461bcd60e51b815260206004820152601f602482015260008051602061436c833981519152604482015290519081900360640190fd5b60003490507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561120857600080fd5b505af115801561121c573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb61129e7f00000000000000000000000000000000000000000000000000000000000000008989600081811061128157fe5b905060200201356001600160a01b03168a8a600181811061105b57fe5b836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156112e557600080fd5b505af11580156112f9573d6000803e3d6000fd5b505050506040513d602081101561130f57600080fd5b505161131757fe5b60008686600019810181811061132957fe5b905060200201356001600160a01b03166001600160a01b03166370a08231866040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561138557600080fd5b505afa158015611399573d6000803e3d6000fd5b505050506040513d60208110156113af57600080fd5b505160408051602089810282810182019093528982529293506113f19290918a918a918291850190849080828437600092019190915250899250613724915050565b87611494828989600019810181811061140657fe5b905060200201356001600160a01b03166001600160a01b03166370a08231896040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561146257600080fd5b505afa158015611476573d6000803e3d6000fd5b505050506040513d602081101561148c57600080fd5b505190613a2b565b10156114d15760405162461bcd60e51b815260040180806020018281038252602d81526020018061442c602d913960400191505060405180910390fd5b5050505050505050565b804281101561151f576040805162461bcd60e51b815260206004820152601a60248201526000805160206143b6833981519152604482015290519081900360640190fd5b6115778585600081811061152f57fe5b905060200201356001600160a01b0316336115717f00000000000000000000000000000000000000000000000000000000000000008989600081811061128157fe5b8a61338a565b60008585600019810181811061158957fe5b905060200201356001600160a01b03166001600160a01b03166370a08231856040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156115e557600080fd5b505afa1580156115f9573d6000803e3d6000fd5b505050506040513d602081101561160f57600080fd5b50516040805160208881028281018201909352888252929350611651929091899189918291850190849080828437600092019190915250889250613724915050565b86611494828888600019810181811061166657fe5b905060200201356001600160a01b03166001600160a01b03166370a08231886040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561146257600080fd5b60608142811015611708576040805162461bcd60e51b815260206004820152601a60248201526000805160206143b6833981519152604482015290519081900360640190fd5b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168686600019810181811061174257fe5b905060200201356001600160a01b03166001600160a01b03161461179b576040805162461bcd60e51b815260206004820152601f602482015260008051602061436c833981519152604482015290519081900360640190fd5b6117f97f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061325392505050565b9150868260018451038151811061180c57fe5b602002602001015110156118515760405162461bcd60e51b815260040180806020018281038252602d81526020018061442c602d913960400191505060405180910390fd5b61186186866000818110610ffc57fe5b6118a0828787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152503092506134e7915050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836001855103815181106118df57fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561191d57600080fd5b505af1158015611931573d6000803e3d6000fd5b505050506110c9848360018551038151811061194957fe5b6020026020010151613a7b565b6000806119a47f00000000000000000000000000000000000000000000000000000000000000008d7f0000000000000000000000000000000000000000000000000000000000000000613193565b90506000866119b3578b6119b7565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018b905260ff8916608482015260a4810188905260c4810187905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b158015611a2d57600080fd5b505af1158015611a41573d6000803e3d6000fd5b50505050611a538d8d8d8d8d8d61225e565b9d9c50505050505050505050505050565b60608142811015611aaa576040805162461bcd60e51b815260206004820152601a60248201526000805160206143b6833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110611ae157fe5b905060200201356001600160a01b03166001600160a01b031614611b3a576040805162461bcd60e51b815260206004820152601f602482015260008051602061436c833981519152604482015290519081900360640190fd5b611b987f00000000000000000000000000000000000000000000000000000000000000008888888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061304692505050565b91503482600081518110611ba857fe5b60200260200101511115611bed5760405162461bcd60e51b81526004018080602001828103825260298152602001806144a36029913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db083600081518110611c2957fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015611c5c57600080fd5b505af1158015611c70573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb611cd57f00000000000000000000000000000000000000000000000000000000000000008989600081811061128157fe5b84600081518110611ce257fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015611d3057600080fd5b505af1158015611d44573d6000803e3d6000fd5b505050506040513d6020811015611d5a57600080fd5b5051611d6257fe5b611da1828787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508992506134e7915050565b81600081518110611dae57fe5b6020026020010151341115611ddd57611ddd3383600081518110611dce57fe5b60200260200101513403613a7b565b5095945050505050565b6000610ca4848484613b6e565b60608142811015611e3a576040805162461bcd60e51b815260206004820152601a60248201526000805160206143b6833981519152604482015290519081900360640190fd5b611e987f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061304692505050565b91508682600081518110611ea857fe5b60200260200101511115610fec5760405162461bcd60e51b81526004018080602001828103825260298152602001806144a36029913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081565b60608142811015611f57576040805162461bcd60e51b815260206004820152601a60248201526000805160206143b6833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110611f8e57fe5b905060200201356001600160a01b03166001600160a01b031614611fe7576040805162461bcd60e51b815260206004820152601f602482015260008051602061436c833981519152604482015290519081900360640190fd5b6120457f00000000000000000000000000000000000000000000000000000000000000003488888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061325392505050565b9150868260018451038151811061205857fe5b6020026020010151101561209d5760405162461bcd60e51b815260040180806020018281038252602d81526020018061442c602d913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0836000815181106120d957fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561210c57600080fd5b505af1158015612120573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6121857f00000000000000000000000000000000000000000000000000000000000000008989600081811061128157fe5b8460008151811061219257fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156121e057600080fd5b505af11580156121f4573d6000803e3d6000fd5b505050506040513d602081101561220a57600080fd5b505161221257fe5b611ddd828787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508992506134e7915050565b6000610ca4848484613c46565b600081428110156122a4576040805162461bcd60e51b815260206004820152601a60248201526000805160206143b6833981519152604482015290519081900360640190fd5b6122d3887f000000000000000000000000000000000000000000000000000000000000000089898930896123e4565b90508092505061235c88858a6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561232b57600080fd5b505afa15801561233f573d6000803e3d6000fd5b505050506040513d602081101561235557600080fd5b5051613cec565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156123c257600080fd5b505af11580156123d6573d6000803e3d6000fd5b505050506110c98483613a7b565b600080824281101561242b576040805162461bcd60e51b815260206004820152601a60248201526000805160206143b6833981519152604482015290519081900360640190fd5b60006124587f00000000000000000000000000000000000000000000000000000000000000008c8c613193565b604080516323b872dd60e01b81523360048201526001600160a01b03831660248201819052604482018d9052915192935090916323b872dd916064808201926020929091908290030181600087803b1580156124b357600080fd5b505af11580156124c7573d6000803e3d6000fd5b505050506040513d60208110156124dd57600080fd5b50506040805163226bf2d160e21b81526001600160a01b03888116600483015282516000938493928616926389afcb44926024808301939282900301818787803b15801561252a57600080fd5b505af115801561253e573d6000803e3d6000fd5b505050506040513d604081101561255457600080fd5b5080516020909101519092509050600061256e8e8e613e56565b509050806001600160a01b03168e6001600160a01b031614612591578183612594565b82825b90975095508a8710156125d85760405162461bcd60e51b81526004018080602001828103825260288152602001806145176028913960400191505060405180910390fd5b898610156126175760405162461bcd60e51b81526004018080602001828103825260288152602001806143d66028913960400191505060405180910390fd5b505050505097509795505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6060610cd97f00000000000000000000000000000000000000000000000000000000000000008484613253565b80428110156126bd576040805162461bcd60e51b815260206004820152601a60248201526000805160206143b6833981519152604482015290519081900360640190fd5b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016858560001981018181106126f757fe5b905060200201356001600160a01b03166001600160a01b031614612750576040805162461bcd60e51b815260206004820152601f602482015260008051602061436c833981519152604482015290519081900360640190fd5b6127608585600081811061152f57fe5b61279e858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613724915050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561280d57600080fd5b505afa158015612821573d6000803e3d6000fd5b505050506040513d602081101561283757600080fd5b505190508681101561287a5760405162461bcd60e51b815260040180806020018281038252602d81526020018061442c602d913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156128e057600080fd5b505af11580156128f4573d6000803e3d6000fd5b505050506114d18482613a7b565b60608142811015612948576040805162461bcd60e51b815260206004820152601a60248201526000805160206143b6833981519152604482015290519081900360640190fd5b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168686600019810181811061298257fe5b905060200201356001600160a01b03166001600160a01b0316146129db576040805162461bcd60e51b815260206004820152601f602482015260008051602061436c833981519152604482015290519081900360640190fd5b612a397f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061304692505050565b91508682600081518110612a4957fe5b602002602001015111156118515760405162461bcd60e51b81526004018080602001828103825260298152602001806144a36029913960400191505060405180910390fd5b6000808242811015612ad5576040805162461bcd60e51b815260206004820152601a60248201526000805160206143b6833981519152604482015290519081900360640190fd5b612b04897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a6123e4565b9093509150612b14898685613cec565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015612b7a57600080fd5b505af1158015612b8e573d6000803e3d6000fd5b50505050612b9c8583613a7b565b50965096945050505050565b60008060008342811015612bf1576040805162461bcd60e51b815260206004820152601a60248201526000805160206143b6833981519152604482015290519081900360640190fd5b612bff8c8c8c8c8c8c613f34565b90945092506000612c317f00000000000000000000000000000000000000000000000000000000000000008e8e613193565b9050612c3f8d33838861338a565b612c4b8c33838761338a565b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050602060405180830381600087803b158015612c9a57600080fd5b505af1158015612cae573d6000803e3d6000fd5b505050506040513d6020811015612cc457600080fd5b5051949d939c50939a509198505050505050505050565b60008060008342811015612d24576040805162461bcd60e51b815260206004820152601a60248201526000805160206143b6833981519152604482015290519081900360640190fd5b612d528a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c613f34565b90945092506000612da47f00000000000000000000000000000000000000000000000000000000000000008c7f0000000000000000000000000000000000000000000000000000000000000000613193565b9050612db28b33838861338a565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b158015612e0d57600080fd5b505af1158015612e21573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb82866040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612e9d57600080fd5b505af1158015612eb1573d6000803e3d6000fd5b505050506040513d6020811015612ec757600080fd5b5051612ecf57fe5b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050602060405180830381600087803b158015612f1e57600080fd5b505af1158015612f32573d6000803e3d6000fd5b505050506040513d6020811015612f4857600080fd5b5051925034841015612f6057612f6033853403613a7b565b505096509650969350505050565b6000808411612fae5760405162461bcd60e51b815260040180806020018281038252602d81526020018061433f602d913960400191505060405180910390fd5b600083118015612fbe5750600082115b612ff95760405162461bcd60e51b815260040180806020018281038252602a81526020018061438c602a913960400191505060405180910390fd5b6000613007856103e56141c5565b9050600061301582856141c5565b9050600061302f83613029886103e86141c5565b90614228565b905080828161303a57fe5b04979650505050505050565b606060028251101561309f576040805162461bcd60e51b815260206004820181905260248201527f4e61727768616c737761704c6962726172793a20494e56414c49445f50415448604482015290519081900360640190fd5b815167ffffffffffffffff811180156130b757600080fd5b506040519080825280602002602001820160405280156130e1578160200160208202803683370190505b50905082816001835103815181106130f557fe5b60209081029190910101528151600019015b801561318b576000806131448786600186038151811061312357fe5b602002602001015187868151811061313757fe5b6020026020010151614277565b9150915061316684848151811061315757fe5b60200260200101518383613b6e565b84600185038151811061317557fe5b6020908102919091010152505060001901613107565b509392505050565b60008060006131a28585613e56565b604080516bffffffffffffffffffffffff19606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501206001600160f81b031960688401529a90941b9093166069840152607d8301989098527f8a30072f74333632d4cca8ddbfc623703398716ee4a6a93f48d4fc610b5b4cf4609d808401919091528851808403909101815260bd909201909752805196019590952095945050505050565b60606002825110156132ac576040805162461bcd60e51b815260206004820181905260248201527f4e61727768616c737761704c6962726172793a20494e56414c49445f50415448604482015290519081900360640190fd5b815167ffffffffffffffff811180156132c457600080fd5b506040519080825280602002602001820160405280156132ee578160200160208202803683370190505b50905082816000815181106132ff57fe5b60200260200101818152505060005b600183510381101561318b576000806133448786858151811061332d57fe5b602002602001015187866001018151811061313757fe5b9150915061336684848151811061335757fe5b60200260200101518383612f6e565b84846001018151811061337557fe5b6020908102919091010152505060010161330e565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17815292518251600094606094938a169392918291908083835b6020831061340f5780518252601f1990920191602091820191016133f0565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613471576040519150601f19603f3d011682016040523d82523d6000602084013e613476565b606091505b50915091508180156134a45750805115806134a457508080602001905160208110156134a157600080fd5b50515b6134df5760405162461bcd60e51b81526004018080602001828103825260248152602001806144f36024913960400191505060405180910390fd5b505050505050565b60005b600183510381101561371e5760008084838151811061350557fe5b602002602001015185846001018151811061351c57fe5b60200260200101519150915060006135348383613e56565b509050600087856001018151811061354857fe5b60200260200101519050600080836001600160a01b0316866001600160a01b0316146135765782600061357a565b6000835b91509150600060028a5103881061359157886135d2565b6135d27f0000000000000000000000000000000000000000000000000000000000000000878c8b600201815181106135c557fe5b6020026020010151613193565b90506135ff7f00000000000000000000000000000000000000000000000000000000000000008888613193565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f19166020018201604052801561363c576020820181803683370190505b506040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b838110156136a457818101518382015260200161368c565b50505050905090810190601f1680156136d15780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b1580156136f357600080fd5b505af1158015613707573d6000803e3d6000fd5b5050600190990198506134ea975050505050505050565b50505050565b60005b6001835103811015613a265760008084838151811061374257fe5b602002602001015185846001018151811061375957fe5b60200260200101519150915060006137718383613e56565b50905060006137a17f00000000000000000000000000000000000000000000000000000000000000008585613193565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b1580156137e257600080fd5b505afa1580156137f6573d6000803e3d6000fd5b505050506040513d606081101561380c57600080fd5b5080516020909101516001600160701b0391821693501690506000806001600160a01b038a811690891614613842578284613845565b83835b9150915061389a828b6001600160a01b03166370a082318a6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561146257600080fd5b95506138a7868383612f6e565b945050505050600080856001600160a01b0316886001600160a01b0316146138d1578260006138d5565b6000835b91509150600060028c51038a106138ec578a613920565b6139207f0000000000000000000000000000000000000000000000000000000000000000898e8d600201815181106135c557fe5b604080516000808252602082019283905263022c0d9f60e01b835260248201878152604483018790526001600160a01b038086166064850152608060848501908152845160a48601819052969750908c169563022c0d9f958a958a958a9591949193919260c486019290918190849084905b838110156139aa578181015183820152602001613992565b50505050905090810190601f1680156139d75780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b1580156139f957600080fd5b505af1158015613a0d573d6000803e3d6000fd5b50506001909b019a506137279950505050505050505050565b505050565b80820382811115610cdc576040805162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b604482015290519081900360640190fd5b604080516000808252602082019092526001600160a01b0384169083906040518082805190602001908083835b60208310613ac75780518252601f199092019160209182019101613aa8565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613b29576040519150601f19603f3d011682016040523d82523d6000602084013e613b2e565b606091505b5050905080613a265760405162461bcd60e51b81526004018080602001828103825260238152602001806144806023913960400191505060405180910390fd5b6000808411613bae5760405162461bcd60e51b815260040180806020018281038252602e8152602001806143fe602e913960400191505060405180910390fd5b600083118015613bbe5750600082115b613bf95760405162461bcd60e51b815260040180806020018281038252602a81526020018061438c602a913960400191505060405180910390fd5b6000613c116103e8613c0b86886141c5565b906141c5565b90506000613c256103e5613c0b8689613a2b565b9050613c3c6001828481613c3557fe5b0490614228565b9695505050505050565b6000808411613c865760405162461bcd60e51b81526004018080602001828103825260278152602001806144596027913960400191505060405180910390fd5b600083118015613c965750600082115b613cd15760405162461bcd60e51b815260040180806020018281038252602a81526020018061438c602a913960400191505060405180910390fd5b82613cdc85846141c5565b81613ce357fe5b04949350505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b60208310613d695780518252601f199092019160209182019101613d4a565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613dcb576040519150601f19603f3d011682016040523d82523d6000602084013e613dd0565b606091505b5091509150818015613dfe575080511580613dfe5750808060200190516020811015613dfb57600080fd5b50515b613e4f576040805162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604482015290519081900360640190fd5b5050505050565b600080826001600160a01b0316846001600160a01b03161415613eaa5760405162461bcd60e51b81526004018080602001828103825260278152602001806144cc6027913960400191505060405180910390fd5b826001600160a01b0316846001600160a01b031610613eca578284613ecd565b83835b90925090506001600160a01b038216613f2d576040805162461bcd60e51b815260206004820181905260248201527f4e61727768616c737761704c6962726172793a205a45524f5f41444452455353604482015290519081900360640190fd5b9250929050565b60008060006001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e6a439058a8a6040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b031681526020019250505060206040518083038186803b158015613fc057600080fd5b505afa158015613fd4573d6000803e3d6000fd5b505050506040513d6020811015613fea57600080fd5b50516001600160a01b031614156140a8577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c9c6539689896040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b0316815260200192505050602060405180830381600087803b15801561407b57600080fd5b505af115801561408f573d6000803e3d6000fd5b505050506040513d60208110156140a557600080fd5b50505b6000806140d67f00000000000000000000000000000000000000000000000000000000000000008b8b614277565b915091508160001480156140e8575080155b156140f8578793508692506141b8565b6000614105898484613c46565b9050878111614158578581101561414d5760405162461bcd60e51b81526004018080602001828103825260288152602001806143d66028913960400191505060405180910390fd5b8894509250826141b6565b6000614165898486613c46565b90508981111561417157fe5b878110156141b05760405162461bcd60e51b81526004018080602001828103825260288152602001806145176028913960400191505060405180910390fd5b94508793505b505b5050965096945050505050565b60008115806141e0575050808202828282816141dd57fe5b04145b610cdc576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b604482015290519081900360640190fd5b80820182811015610cdc576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b604482015290519081900360640190fd5b60008060006142868585613e56565b509050600080614297888888613193565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b1580156142cf57600080fd5b505afa1580156142e3573d6000803e3d6000fd5b505050506040513d60608110156142f957600080fd5b5080516020909101516001600160701b0391821693501690506001600160a01b038781169084161461432c57808261432f565b81815b9099909850965050505050505056fe4e61727768616c737761704c6962726172793a20494e53554646494349454e545f494e5055545f414d4f554e544e61727768616c73776170526f757465723a20494e56414c49445f50415448004e61727768616c737761704c6962726172793a20494e53554646494349454e545f4c49515549444954594e61727768616c73776170526f757465723a20455850495245440000000000004e61727768616c73776170526f757465723a20494e53554646494349454e545f425f414d4f554e544e61727768616c737761704c6962726172793a20494e53554646494349454e545f4f55545055545f414d4f554e544e61727768616c73776170526f757465723a20494e53554646494349454e545f4f55545055545f414d4f554e544e61727768616c737761704c6962726172793a20494e53554646494349454e545f414d4f554e545472616e7366657248656c7065723a20424e425f5452414e534645525f4641494c45444e61727768616c73776170526f757465723a204558434553534956455f494e5055545f414d4f554e544e61727768616c737761704c6962726172793a204944454e544943414c5f4144445245535345535472616e7366657248656c7065723a205452414e534645525f46524f4d5f4641494c45444e61727768616c73776170526f757465723a20494e53554646494349454e545f415f414d4f554e54a2646970667358221220215e09e4e19355a81a430b1d65f43d9a8290736d6c4a5349c3658c65391702b264736f6c634300060c0033000000000000000000000000b9fa84912ff2383a617d8b433e926adf0dd3fea1000000000000000000000000bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c

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

000000000000000000000000b9fa84912ff2383a617d8b433e926adf0dd3fea1000000000000000000000000bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000b9fa84912ff2383a617d8b433e926adf0dd3fea1
Arg [1] : 000000000000000000000000bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c


Deployed ByteCode Sourcemap

16835:18777:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17332:10;-1:-1:-1;;;;;17346:4:0;17332:18;;17325:26;;;;16835:18777;;;;;34548:264;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34548:264:0;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;35354:255;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;35354:255:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;35354:255:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35354:255:0;;-1:-1:-1;35354:255:0;;-1:-1:-1;;;;;35354:255:0:i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22195:681;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;22195:681:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;22882:673;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;22882:673:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;25933:634::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;25933:634:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;25933:634:0;;;;;;;;;;;;-1:-1:-1;25933:634:0;-1:-1:-1;;;;;;25933:634:0;;;;;;;;:::i;32562:878::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;32562:878:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;32562:878:0;;;;;;;;;;;;-1:-1:-1;32562:878:0;-1:-1:-1;;;;;;32562:878:0;;;;;;;;:::i;31816:740::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;31816:740:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;31816:740:0;;;;;;;;;;;;-1:-1:-1;31816:740:0;-1:-1:-1;;;;;;31816:740:0;;;;;;;;:::i;28744:858::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;28744:858:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;28744:858:0;;;;;;;;;;;;-1:-1:-1;28744:858:0;-1:-1:-1;;;;;;28744:858:0;;;;;;;;:::i;24351:722::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;24351:722:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;29608:818::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;29608:818:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;29608:818:0;;;;;;;;;;;;-1:-1:-1;29608:818:0;-1:-1:-1;;;;;;29608:818:0;;;;;;;;:::i;34820:263::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34820:263:0;;;;;;;;;;;;:::i;26573:612::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;26573:612:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;26573:612:0;;;;;;;;;;;;-1:-1:-1;26573:612:0;-1:-1:-1;;;;;;26573:612:0;;;;;;;;:::i;16984:38::-;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;16984:38:0;;;;;;;;;;;;;;27191:705;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;27191:705:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;27191:705:0;;;;;;;;;;;;-1:-1:-1;27191:705:0;-1:-1:-1;;;;;;27191:705:0;;;;;;;;:::i;34350:190::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34350:190:0;;;;;;;;;;;;:::i;23634:711::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;23634:711:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;20633:877::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;20633:877:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;16936:41::-;;;;;;;;;;;;;:::i;35091:255::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;35091:255:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;35091:255:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35091:255:0;;-1:-1:-1;35091:255:0;;-1:-1:-1;;;;;35091:255:0:i;33446:860::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;33446:860:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;33446:860:0;;;;;;;;;;;;-1:-1:-1;33446:860:0;-1:-1:-1;;;;;;33446:860:0;;;;;;;;:::i;27902:836::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;27902:836:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;27902:836:0;;;;;;;;;;;;-1:-1:-1;27902:836:0;-1:-1:-1;;;;;;27902:836:0;;;;;;;;:::i;21516:673::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;21516:673:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;18864:742::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;18864:742:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;19612:978;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;19612:978:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;34548:264::-;34701:14;34740:64;34772:8;34782:9;34793:10;34740:31;:64::i;:::-;34733:71;34548:264;-1:-1:-1;;;;34548:264:0:o;35354:255::-;35498:21;35544:57;35576:7;35585:9;35596:4;35544:31;:57::i;:::-;35537:64;;35354:255;;;;;:::o;22195:681::-;22501:12;22515;22540;22555:51;22582:7;22591:6;22599;22555:26;:51::i;:::-;22540:66;;22617:10;22630;:33;;22654:9;22630:33;;;-1:-1:-1;;22630:33:0;22674:82;;;-1:-1:-1;;;22674:82:0;;22704:10;22674:82;;;;22724:4;22674:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22617:46;;-1:-1:-1;;;;;;22674:29:0;;;;;:82;;;;;-1:-1:-1;;22674:82:0;;;;;;;;-1:-1:-1;22674:29:0;:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22788:80;22804:6;22812;22820:9;22831:10;22843;22855:2;22859:8;22788:15;:80::i;:::-;22767:101;;;;;;;;22195:681;;;;;;;;;;;;;;;;:::o;22882:673::-;23171:16;23189:14;23216:12;23231:48;23258:7;23267:5;23274:4;23231:26;:48::i;:::-;23216:63;;23290:10;23303;:33;;23327:9;23303:33;;;-1:-1:-1;;23303:33:0;23347:82;;;-1:-1:-1;;;23347:82:0;;23377:10;23347:82;;;;23397:4;23347:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23290:46;;-1:-1:-1;;;;;;23347:29:0;;;;;:82;;;;;-1:-1:-1;;23347:82:0;;;;;;;;-1:-1:-1;23347:29:0;:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23467:80;23486:5;23493:9;23504:14;23520:12;23534:2;23538:8;23467:18;:80::i;:::-;23440:107;;;;-1:-1:-1;22882:673:0;-1:-1:-1;;;;;;;;;;;;;22882:673:0:o;25933:634::-;26157:21;26138:8;17093:15;17081:8;:27;;17073:66;;;;;-1:-1:-1;;;17073:66:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17073:66:0;;;;;;;;;;;;;;;26201:57:::1;26234:7;26243:8;26253:4;;26201:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;26201:32:0::1;::::0;-1:-1:-1;;;26201:57:0:i:1;:::-;26191:67;;26308:12;26277:7;26302:1;26285:7;:14;:18;26277:27;;;;;;;;;;;;;;:43;;26269:101;;;;-1:-1:-1::0;;;26269:101:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26381:143;26427:4;;26432:1;26427:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;26427:7:0::1;26436:10;26448:53;26475:7;26484:4;;26489:1;26484:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;26484:7:0::1;26493:4;;26498:1;26493:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;26493:7:0::1;26448:26;:53::i;:::-;26503:7;26511:1;26503:10;;;;;;;;;;;;;;26381:31;:143::i;:::-;26535:24;26541:7;26550:4;;26535:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;26556:2:0;;-1:-1:-1;26535:5:0::1;::::0;-1:-1:-1;;26535:24:0:i:1;:::-;25933:634:::0;;;;;;;;;:::o;32562:878::-;32822:8;17093:15;17081:8;:27;;17073:66;;;;;-1:-1:-1;;;17073:66:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17073:66:0;;;;;;;;;;;;;;;32867:4:::1;-1:-1:-1::0;;;;;32856:15:0::1;:4;;32861:1;32856:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;32856:7:0::1;-1:-1:-1::0;;;;;32856:15:0::1;;32848:59;;;::::0;;-1:-1:-1;;;32848:59:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;32848:59:0;;;;;;;;;;;;;::::1;;32918:13;32934:9;32918:25;;32960:4;-1:-1:-1::0;;;;;32954:19:0::1;;32981:8;32954:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;33016:4;-1:-1:-1::0;;;;;33010:20:0::1;;33031:53;33058:7;33067:4;;33072:1;33067:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;33067:7:0::1;33076:4;;33081:1;33076:7;;;;;;33031:53;33086:8;33010:85;;;;;;;;;;;;;-1:-1:-1::0;;;;;33010:85:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;33010:85:0;33003:93:::1;;;;33107:18;33146:4:::0;;-1:-1:-1;;33151:15:0;;33146:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;33146:21:0::1;-1:-1:-1::0;;;;;33128:50:0::1;;33179:2;33128:54;;;;;;;;;;;;;-1:-1:-1::0;;;;;33128:54:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;33128:54:0;33193:44:::1;::::0;;33128:54:::1;33193:44:::0;;::::1;::::0;;;;;;;;;;;33128:54;;-1:-1:-1;33193:44:0::1;::::0;;;33228:4;;;;;;33193:44;::::1;::::0;33228:4;;33193:44;33228:4;33193:44;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;33234:2:0;;-1:-1:-1;33193:34:0::1;::::0;-1:-1:-1;;33193:44:0:i:1;:::-;33347:12:::0;33270:73:::1;33329:13:::0;33288:4;;-1:-1:-1;;33293:15:0;;33288:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;33288:21:0::1;-1:-1:-1::0;;;;;33270:50:0::1;;33321:2;33270:54;;;;;;;;;;;;;-1:-1:-1::0;;;;;33270:54:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;33270:54:0;;:58:::1;:73::i;:::-;:89;;33248:184;;;;-1:-1:-1::0;;;33248:184:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17150:1;;32562:878:::0;;;;;;:::o;31816:740::-;32050:8;17093:15;17081:8;:27;;17073:66;;;;;-1:-1:-1;;;17073:66:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17073:66:0;;;;;;;;;;;;;;;32071:141:::1;32117:4;;32122:1;32117:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;32117:7:0::1;32126:10;32138:53;32165:7;32174:4;;32179:1;32174:7;;;;;;32138:53;32193:8;32071:31;:141::i;:::-;32223:18;32262:4:::0;;-1:-1:-1;;32267:15:0;;32262:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;32262:21:0::1;-1:-1:-1::0;;;;;32244:50:0::1;;32295:2;32244:54;;;;;;;;;;;;;-1:-1:-1::0;;;;;32244:54:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;32244:54:0;32309:44:::1;::::0;;32244:54:::1;32309:44:::0;;::::1;::::0;;;;;;;;;;;32244:54;;-1:-1:-1;32309:44:0::1;::::0;;;32344:4;;;;;;32309:44;::::1;::::0;32344:4;;32309:44;32344:4;32309:44;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;32350:2:0;;-1:-1:-1;32309:34:0::1;::::0;-1:-1:-1;;32309:44:0:i:1;:::-;32463:12:::0;32386:73:::1;32445:13:::0;32404:4;;-1:-1:-1;;32409:15:0;;32404:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;32404:21:0::1;-1:-1:-1::0;;;;;32386:50:0::1;;32437:2;32386:54;;;;;;;;;;;;;-1:-1:-1::0;;;;;32386:54:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;28744:858:::0;28958:21;28930:8;17093:15;17081:8;:27;;17073:66;;;;;-1:-1:-1;;;17073:66:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17073:66:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;29030:4:0::1;29005:29;:4:::0;;-1:-1:-1;;29010:15:0;;29005:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;29005:21:0::1;-1:-1:-1::0;;;;;29005:29:0::1;;28997:73;;;::::0;;-1:-1:-1;;;28997:73:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;28997:73:0;;;;;;;;;;;;;::::1;;29091:57;29124:7;29133:8;29143:4;;29091:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;29091:32:0::1;::::0;-1:-1:-1;;;29091:57:0:i:1;:::-;29081:67;;29198:12;29167:7;29192:1;29175:7;:14;:18;29167:27;;;;;;;;;;;;;;:43;;29159:101;;;;-1:-1:-1::0;;;29159:101:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29271:143;29317:4;;29322:1;29317:7;;;;;;29271:143;29425:35;29431:7;29440:4;;29425:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;29454:4:0::1;::::0;-1:-1:-1;29425:5:0::1;::::0;-1:-1:-1;;29425:35:0:i:1;:::-;29477:4;-1:-1:-1::0;;;;;29471:20:0::1;;29492:7;29517:1;29500:7;:14;:18;29492:27;;;;;;;;;;;;;;29471:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;29531:63;29562:2;29566:7;29591:1;29574:7;:14;:18;29566:27;;;;;;;;;;;;;;29531:30;:63::i;24351:722::-:0;24669:14;24696:12;24711:48;24738:7;24747:5;24754:4;24711:26;:48::i;:::-;24696:63;;24770:10;24783;:33;;24807:9;24783:33;;;-1:-1:-1;;24783:33:0;24827:82;;;-1:-1:-1;;;24827:82:0;;24857:10;24827:82;;;;24877:4;24827:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24770:46;;-1:-1:-1;;;;;;24827:29:0;;;;;:82;;;;;-1:-1:-1;;24827:82:0;;;;;;;;-1:-1:-1;24827:29:0;:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24932:133;24994:5;25001:9;25012:14;25028:12;25042:2;25046:8;24932:47;:133::i;:::-;24920:145;24351:722;-1:-1:-1;;;;;;;;;;;;;24351:722:0:o;29608:818::-;29821:21;29793:8;17093:15;17081:8;:27;;17073:66;;;;;-1:-1:-1;;;17073:66:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17073:66:0;;;;;;;;;;;;;;;29879:4:::1;-1:-1:-1::0;;;;;29868:15:0::1;:4;;29873:1;29868:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;29868:7:0::1;-1:-1:-1::0;;;;;29868:15:0::1;;29860:59;;;::::0;;-1:-1:-1;;;29860:59:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;29860:59:0;;;;;;;;;;;;;::::1;;29940:57;29972:7;29981:9;29992:4;;29940:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;29940:31:0::1;::::0;-1:-1:-1;;;29940:57:0:i:1;:::-;29930:67;;30030:9;30016:7;30024:1;30016:10;;;;;;;;;;;;;;:23;;30008:77;;;;-1:-1:-1::0;;;30008:77:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30102:4;-1:-1:-1::0;;;;;30096:19:0::1;;30123:7;30131:1;30123:10;;;;;;;;;;;;;;30096:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;30160:4;-1:-1:-1::0;;;;;30154:20:0::1;;30175:53;30202:7;30211:4;;30216:1;30211:7;;;;;;30175:53;30230:7;30238:1;30230:10;;;;;;;;;;;;;;30154:87;;;;;;;;;;;;;-1:-1:-1::0;;;;;30154:87:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;30154:87:0;30147:95:::1;;;;30253:24;30259:7;30268:4;;30253:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;30274:2:0;;-1:-1:-1;30253:5:0::1;::::0;-1:-1:-1;;30253:24:0:i:1;:::-;30340:7;30348:1;30340:10;;;;;;;;;;;;;;30328:9;:22;30324:94;;;30352:66;30383:10;30407:7;30415:1;30407:10;;;;;;;;;;;;;;30395:9;:22;30352:30;:66::i;:::-;29608:818:::0;;;;;;;;:::o;34820:263::-;34973:13;35011:64;35042:9;35053;35064:10;35011:30;:64::i;26573:612::-;26797:21;26778:8;17093:15;17081:8;:27;;17073:66;;;;;-1:-1:-1;;;17073:66:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17073:66:0;;;;;;;;;;;;;;;26841:57:::1;26873:7;26882:9;26893:4;;26841:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;26841:31:0::1;::::0;-1:-1:-1;;;26841:57:0:i:1;:::-;26831:67;;26931:11;26917:7;26925:1;26917:10;;;;;;;;;;;;;;:25;;26909:79;;;;-1:-1:-1::0;;;26909:79:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16984:38:::0;;;:::o;27191:705::-;27407:21;27379:8;17093:15;17081:8;:27;;17073:66;;;;;-1:-1:-1;;;17073:66:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17073:66:0;;;;;;;;;;;;;;;27465:4:::1;-1:-1:-1::0;;;;;27454:15:0::1;:4;;27459:1;27454:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;27454:7:0::1;-1:-1:-1::0;;;;;27454:15:0::1;;27446:59;;;::::0;;-1:-1:-1;;;27446:59:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;27446:59:0;;;;;;;;;;;;;::::1;;27526:58;27559:7;27568:9;27579:4;;27526:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;27526:32:0::1;::::0;-1:-1:-1;;;27526:58:0:i:1;:::-;27516:68;;27634:12;27603:7;27628:1;27611:7;:14;:18;27603:27;;;;;;;;;;;;;;:43;;27595:101;;;;-1:-1:-1::0;;;27595:101:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27713:4;-1:-1:-1::0;;;;;27707:19:0::1;;27734:7;27742:1;27734:10;;;;;;;;;;;;;;27707:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;27771:4;-1:-1:-1::0;;;;;27765:20:0::1;;27786:53;27813:7;27822:4;;27827:1;27822:7;;;;;;27786:53;27841:7;27849:1;27841:10;;;;;;;;;;;;;;27765:87;;;;;;;;;;;;;-1:-1:-1::0;;;;;27765:87:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;27765:87:0;27758:95:::1;;;;27864:24;27870:7;27879:4;;27864:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;27885:2:0;;-1:-1:-1;27864:5:0::1;::::0;-1:-1:-1;;27864:24:0:i:1;34350:190::-:0;34447:12;34479:53;34504:7;34513:8;34523;34479:24;:53::i;23634:711::-;23900:14;23881:8;17093:15;17081:8;:27;;17073:66;;;;;-1:-1:-1;;;17073:66:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17073:66:0;;;;;;;;;;;;;;;23943:196:::1;23973:5;23993:4;24012:9;24036:14;24065:12;24100:4;24120:8;23943:15;:196::i;:::-;23927:212;;;;;;24150:89;24178:5;24185:2;24207:5;-1:-1:-1::0;;;;;24189:34:0::1;;24232:4;24189:49;;;;;;;;;;;;;-1:-1:-1::0;;;;;24189:49:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;24189:49:0;24150:27:::1;:89::i;:::-;24256:4;-1:-1:-1::0;;;;;24250:20:0::1;;24271:9;24250:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;24292:45;24323:2;24327:9;24292:30;:45::i;20633:877::-:0;20887:12;20901;20868:8;17093:15;17081:8;:27;;17073:66;;;;;-1:-1:-1;;;17073:66:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17073:66:0;;;;;;;;;;;;;;;20926:12:::1;20941:51;20968:7;20977:6;20985;20941:26;:51::i;:::-;21003:64;::::0;;-1:-1:-1;;;21003:64:0;;21039:10:::1;21003:64;::::0;::::1;::::0;-1:-1:-1;;;;;21003:35:0;::::1;:64:::0;;;;;;;;;;;;;;20926:66;;-1:-1:-1;21003:35:0;;::::1;::::0;:64;;;;;::::1;::::0;;;;;;;;;-1:-1:-1;21003:35:0;:64;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;21135:31:0::1;::::0;;-1:-1:-1;;;21135:31:0;;-1:-1:-1;;;;;21135:31:0;;::::1;;::::0;::::1;::::0;;;21105:12:::1;::::0;;;21135:27;;::::1;::::0;::::1;::::0;:31;;;;;;;;;;;21105:12;21135:27;:31;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;21135:31:0;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;21135:31:0;-1:-1:-1;21178:14:0::1;21197:45;21227:6:::0;21235;21197:29:::1;:45::i;:::-;21177:65;;;21284:6;-1:-1:-1::0;;;;;21274:16:0::1;:6;-1:-1:-1::0;;;;;21274:16:0::1;;:58;;21315:7;21324;21274:58;;;21294:7;21303;21274:58;21253:79:::0;;-1:-1:-1;21253:79:0;-1:-1:-1;21351:21:0;;::::1;;21343:74;;;;-1:-1:-1::0;;;21343:74:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21447:10;21436:7;:21;;21428:74;;;;-1:-1:-1::0;;;21428:74:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17150:1;;;;20633:877:::0;;;;;;;;;;;:::o;16936:41::-;;;:::o;35091:255::-;35235:21;35281:57;35314:7;35323:8;35333:4;35281:32;:57::i;33446:860::-;33713:8;17093:15;17081:8;:27;;17073:66;;;;;-1:-1:-1;;;17073:66:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17073:66:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;33772:4:0::1;33747:29;:4:::0;;-1:-1:-1;;33752:15:0;;33747:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;33747:21:0::1;-1:-1:-1::0;;;;;33747:29:0::1;;33739:73;;;::::0;;-1:-1:-1;;;33739:73:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;33739:73:0;;;;;;;;;;;;;::::1;;33823:141;33869:4;;33874:1;33869:7;;;;;;33823:141;33975:55;34010:4;;33975:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;34024:4:0::1;::::0;-1:-1:-1;33975:34:0::1;::::0;-1:-1:-1;;33975:55:0:i:1;:::-;34041:14;34076:4;-1:-1:-1::0;;;;;34058:33:0::1;;34100:4;34058:48;;;;;;;;;;;;;-1:-1:-1::0;;;;;34058:48:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;34058:48:0;;-1:-1:-1;34125:25:0;;::::1;;34117:83;;;;-1:-1:-1::0;;;34117:83:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34217:4;-1:-1:-1::0;;;;;34211:20:0::1;;34232:9;34211:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;34253:45;34284:2;34288:9;34253:30;:45::i;27902:836::-:0;28116:21;28088:8;17093:15;17081:8;:27;;17073:66;;;;;-1:-1:-1;;;17073:66:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17073:66:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;28188:4:0::1;28163:29;:4:::0;;-1:-1:-1;;28168:15:0;;28163:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;28163:21:0::1;-1:-1:-1::0;;;;;28163:29:0::1;;28155:73;;;::::0;;-1:-1:-1;;;28155:73:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;28155:73:0;;;;;;;;;;;;;::::1;;28249:57;28281:7;28290:9;28301:4;;28249:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;28249:31:0::1;::::0;-1:-1:-1;;;28249:57:0:i:1;:::-;28239:67;;28339:11;28325:7;28333:1;28325:10;;;;;;;;;;;;;;:25;;28317:79;;;;-1:-1:-1::0;;;28317:79:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21516:673:::0;21753:16;21771:14;21734:8;17093:15;17081:8;:27;;17073:66;;;;;-1:-1:-1;;;17073:66:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17073:66:0;;;;;;;;;;;;;;;21825:196:::1;21855:5;21875:4;21894:9;21918:14;21947:12;21982:4;22002:8;21825:15;:196::i;:::-;21798:223:::0;;-1:-1:-1;21798:223:0;-1:-1:-1;22032:51:0::1;22060:5:::0;22067:2;21798:223;22032:27:::1;:51::i;:::-;22100:4;-1:-1:-1::0;;;;;22094:20:0::1;;22115:9;22094:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;22136:45;22167:2;22171:9;22136:30;:45::i;:::-;21516:673:::0;;;;;;;;;;:::o;18864:742::-;19152:12;19166;19180:14;19133:8;17093:15;17081:8;:27;;17073:66;;;;;-1:-1:-1;;;17073:66:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17073:66:0;;;;;;;;;;;;;;;19228:85:::1;19242:6;19250;19258:14;19274;19290:10;19302;19228:13;:85::i;:::-;19207:106:::0;;-1:-1:-1;19207:106:0;-1:-1:-1;19324:12:0::1;19339:51;19366:7;19375:6:::0;19383;19339:26:::1;:51::i;:::-;19324:66;;19401;19433:6;19441:10;19453:4;19459:7;19401:31;:66::i;:::-;19478;19510:6;19518:10;19530:4;19536:7;19478:31;:66::i;:::-;19584:4;-1:-1:-1::0;;;;;19567:27:0::1;;19595:2;19567:31;;;;;;;;;;;;;-1:-1:-1::0;;;;;19567:31:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;19567:31:0;18864:742;;;;-1:-1:-1;19567:31:0;;-1:-1:-1;18864:742:0;;-1:-1:-1;;;;;;;;;18864:742:0:o;19612:978::-;19865:16;19883:14;19899;19846:8;17093:15;17081:8;:27;;17073:66;;;;;-1:-1:-1;;;17073:66:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17073:66:0;;;;;;;;;;;;;;;19953:176:::1;19981:5;20001:4;20020:18;20053:9;20077:14;20106:12;19953:13;:176::i;:::-;19926:203:::0;;-1:-1:-1;19926:203:0;-1:-1:-1;20140:12:0::1;20155:48;20182:7;20191:5:::0;20198:4:::1;20155:26;:48::i;:::-;20140:63;;20214:69;20246:5;20253:10;20265:4;20271:11;20214:31;:69::i;:::-;20300:4;-1:-1:-1::0;;;;;20294:19:0::1;;20321:9;20294:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;20357:4;-1:-1:-1::0;;;;;20351:20:0::1;;20372:4;20378:9;20351:37;;;;;;;;;;;;;-1:-1:-1::0;;;;;20351:37:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;20351:37:0;20344:45:::1;;;;20429:4;-1:-1:-1::0;;;;;20412:27:0::1;;20440:2;20412:31;;;;;;;;;;;;;-1:-1:-1::0;;;;;20412:31:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;20412:31:0;;-1:-1:-1;20494:9:0::1;:21:::0;-1:-1:-1;20490:92:0::1;;;20517:65;20548:10;20572:9;20560;:21;20517:30;:65::i;:::-;17150:1;19612:978:::0;;;;;;;;;;;:::o;14157:521::-;14250:14;14296:1;14285:8;:12;14277:70;;;;-1:-1:-1;;;14277:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14378:1;14366:9;:13;:31;;;;;14396:1;14383:10;:14;14366:31;14358:86;;;;-1:-1:-1;;;14358:86:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14455:20;14478:17;:8;14491:3;14478:12;:17::i;:::-;14455:40;-1:-1:-1;14506:14:0;14523:31;14455:40;14543:10;14523:19;:31::i;:::-;14506:48;-1:-1:-1;14565:16:0;14584:40;14608:15;14584:19;:9;14598:4;14584:13;:19::i;:::-;:23;;:40::i;:::-;14565:59;;14659:11;14647:9;:23;;;;;;;14157:521;-1:-1:-1;;;;;;;14157:521:0:o;15951:534::-;16052:21;16109:1;16094:4;:11;:16;;16086:61;;;;;-1:-1:-1;;;16086:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16179:4;:11;16168:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16168:23:0;;16158:33;;16232:9;16202:7;16227:1;16210:7;:14;:18;16202:27;;;;;;;;;;;;;;;;;:39;16266:11;;-1:-1:-1;;16266:15:0;16252:226;16283:5;;16252:226;;16311:14;16327:15;16346:42;16358:7;16367:4;16376:1;16372;:5;16367:11;;;;;;;;;;;;;;16380:4;16385:1;16380:7;;;;;;;;;;;;;;16346:11;:42::i;:::-;16310:78;;;;16420:46;16432:7;16440:1;16432:10;;;;;;;;;;;;;;16444:9;16455:10;16420:11;:46::i;:::-;16403:7;16415:1;16411;:5;16403:14;;;;;;;;;;;;;;;;;:63;-1:-1:-1;;;;16290:3:0;16252:226;;;;15951:534;;;;;:::o;12668:478::-;12757:12;12783:14;12799;12817:26;12828:6;12836;12817:10;:26::i;:::-;12981:32;;;-1:-1:-1;;12981:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12971:43;;;;;;-1:-1:-1;;;;;;12884:251:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12874:262;;;;;;;;;12668:478;-1:-1:-1;;;;;12668:478:0:o;15357:513::-;15458:21;15515:1;15500:4;:11;:16;;15492:61;;;;;-1:-1:-1;;;15492:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15585:4;:11;15574:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15574:23:0;;15564:33;;15621:8;15608:7;15616:1;15608:10;;;;;;;;;;;;;:21;;;;;15645:6;15640:223;15671:1;15657:4;:11;:15;15653:1;:19;15640:223;;;15695:14;15711:15;15730:42;15742:7;15751:4;15756:1;15751:7;;;;;;;;;;;;;;15760:4;15765:1;15769;15765:5;15760:11;;;;;;;15730:42;15694:78;;;;15804:47;15817:7;15825:1;15817:10;;;;;;;;;;;;;;15829:9;15840:10;15804:12;:47::i;:::-;15787:7;15795:1;15799;15795:5;15787:14;;;;;;;;;;;;;;;;;:64;-1:-1:-1;;15674:3:0;;15640:223;;10602:402;10827:51;;;-1:-1:-1;;;;;10827:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10827:51:0;-1:-1:-1;;;10827:51:0;;;10816:63;;;;10781:12;;10795:17;;10816:10;;;;10827:51;10816:63;;;10827:51;10816:63;;10827:51;10816:63;;;;;;;;;;-1:-1:-1;;10816:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10780:99;;;;10898:7;:57;;;;-1:-1:-1;10910:11:0;;:16;;:44;;;10941:4;10930:24;;;;;;;;;;;;;;;-1:-1:-1;10930:24:0;10910:44;10890:106;;;;-1:-1:-1;;;10890:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10602:402;;;;;;:::o;25184:743::-;25291:6;25286:634;25317:1;25303:4;:11;:15;25299:1;:19;25286:634;;;25341:13;25356:14;25375:4;25380:1;25375:7;;;;;;;;;;;;;;25384:4;25389:1;25393;25389:5;25384:11;;;;;;;;;;;;;;25340:56;;;;25412:14;25431:44;25461:5;25468:6;25431:29;:44::i;:::-;25411:64;;;25490:14;25507:7;25515:1;25519;25515:5;25507:14;;;;;;;;;;;;;;25490:31;;25537:15;25554;25582:6;-1:-1:-1;;;;;25573:15:0;:5;-1:-1:-1;;;;;25573:15:0;;:61;;25615:9;25631:1;25573:61;;;25597:1;25601:9;25573:61;25536:98;;;;25649:10;25680:1;25666:4;:11;:15;25662:1;:19;:84;;25743:3;25662:84;;;25684:56;25711:7;25720:6;25728:4;25733:1;25737;25733:5;25728:11;;;;;;;;;;;;;;25684:26;:56::i;:::-;25649:97;;25778:50;25805:7;25814:5;25821:6;25778:26;:50::i;:::-;-1:-1:-1;;;;;25761:73:0;;25853:10;25865;25877:2;25891:1;25881:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25881:12:0;;25761:147;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25761:147:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;25320:3:0;;;;;-1:-1:-1;25286:634:0;;-1:-1:-1;;;;;;;;25286:634:0;;;25184:743;;;:::o;30573:1237::-;30686:6;30681:1122;30712:1;30698:4;:11;:15;30694:1;:19;30681:1122;;;30736:13;30751:14;30770:4;30775:1;30770:7;;;;;;;;;;;;;;30779:4;30784:1;30788;30784:5;30779:11;;;;;;;;;;;;;;30735:56;;;;30807:14;30826:44;30856:5;30863:6;30826:29;:44::i;:::-;30806:64;;;30885:21;30926:50;30953:7;30962:5;30969:6;30926:26;:50::i;:::-;30885:92;;30992:16;31023:17;31111:13;31126;31144:4;-1:-1:-1;;;;;31144:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31144:18:0;;;;;;;-1:-1:-1;;;;;31110:52:0;;;;-1:-1:-1;31110:52:0;;-1:-1:-1;31178:17:0;;-1:-1:-1;;;;;31219:15:0;;;;;;;:61;;31261:8;31271;31219:61;;;31238:8;31248;31219:61;31177:103;;;;31309:67;31363:12;31327:5;-1:-1:-1;;;;;31309:34:0;;31352:4;31309:49;;;;;;;;;;;;;-1:-1:-1;;;;;31309:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;:67;31295:81;;31406:73;31438:11;31451:12;31465:13;31406:31;:73::i;:::-;31391:88;;30681:1122;;;;31510:15;31527;31555:6;-1:-1:-1;;;;;31546:15:0;:5;-1:-1:-1;;;;;31546:15:0;;:67;;31591:12;31610:1;31546:67;;;31570:1;31574:12;31546:67;31509:104;;;;31628:10;31659:1;31645:4;:11;:15;31641:1;:19;:84;;31722:3;31641:84;;;31663:56;31690:7;31699:6;31707:4;31712:1;31716;31712:5;31707:11;;;;;;;31663:56;31778:12;;;31788:1;31778:12;;;;;;;;;;-1:-1:-1;;;31740:51:0;;;;;;;;;;;;;;-1:-1:-1;;;;;31740:51:0;;;;;;;;;;;;;;;;;;;;;;31628:97;;-1:-1:-1;31740:9:0;;;;;;31750:10;;31762;;31628:97;;31778:12;;31740:51;;;;;;;;31778:12;;31740:51;;;;31778:12;;31740:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;30715:3:0;;;;;-1:-1:-1;30681:1122:0;;-1:-1:-1;;;;;;;;;;30681:1122:0;;;30573:1237;;:::o;11580:129::-;11664:5;;;11659:16;;;;11651:50;;;;;-1:-1:-1;;;11651:50:0;;;;;;;;;;;;-1:-1:-1;;;11651:50:0;;;;;;;;;;;;;;11012:195;11120:12;;;11082;11120;;;;;;;;;-1:-1:-1;;;;;11099:7:0;;;11113:5;;11099:34;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;11099:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11081:52;;;11152:7;11144:55;;;;-1:-1:-1;;;11144:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14799:476;14892:13;14938:1;14926:9;:13;14918:72;;;;-1:-1:-1;;;14918:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15021:1;15009:9;:13;:31;;;;;15039:1;15026:10;:14;15009:31;15001:86;;;;-1:-1:-1;;;15001:86:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15098:14;15115:34;15144:4;15115:24;:9;15129;15115:13;:24::i;:::-;:28;;:34::i;:::-;15098:51;-1:-1:-1;15160:16:0;15179:34;15209:3;15179:25;:10;15194:9;15179:14;:25::i;:34::-;15160:53;;15235:32;15265:1;15248:11;15236:9;:23;;;;;;;15235:29;:32::i;:::-;15224:43;14799:476;-1:-1:-1;;;;;;14799:476:0:o;13710:325::-;13792:12;13835:1;13825:7;:11;13817:63;;;;-1:-1:-1;;;13817:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13910:1;13899:8;:12;:28;;;;;13926:1;13915:8;:12;13899:28;13891:83;;;;-1:-1:-1;;;13891:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14019:8;13995:21;:7;14007:8;13995:11;:21::i;:::-;:32;;;;;;;13710:325;-1:-1:-1;;;;13710:325:0:o;10233:361::-;10428:45;;;-1:-1:-1;;;;;10428:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10428:45:0;-1:-1:-1;;;10428:45:0;;;10417:57;;;;10382:12;;10396:17;;10417:10;;;;10428:45;10417:57;;;10428:45;10417:57;;10428:45;10417:57;;;;;;;;;;-1:-1:-1;;10417:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10381:93;;;;10493:7;:57;;;;-1:-1:-1;10505:11:0;;:16;;:44;;;10536:4;10525:24;;;;;;;;;;;;;;;-1:-1:-1;10525:24:0;10505:44;10485:101;;;;;-1:-1:-1;;;10485:101:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;10233:361;;;;;:::o;12223:353::-;12298:14;12314;12359:6;-1:-1:-1;;;;;12349:16:0;:6;-1:-1:-1;;;;;12349:16:0;;;12341:68;;;;-1:-1:-1;;;12341:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12448:6;-1:-1:-1;;;;;12439:15:0;:6;-1:-1:-1;;;;;12439:15:0;;:53;;12477:6;12485;12439:53;;;12458:6;12466;12439:53;12420:72;;-1:-1:-1;12420:72:0;-1:-1:-1;;;;;;12511:20:0;;12503:65;;;;;-1:-1:-1;;;12503:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12223:353;;;;;:::o;17454:1404::-;17672:12;17686;17831:1;-1:-1:-1;;;;;17767:66:0;17787:7;-1:-1:-1;;;;;17767:36:0;;17804:6;17812;17767:52;;;;;;;;;;;;;-1:-1:-1;;;;;17767:52:0;;;;;;-1:-1:-1;;;;;17767:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17767:52:0;-1:-1:-1;;;;;17767:66:0;;17763:154;;;17870:7;-1:-1:-1;;;;;17850:39:0;;17890:6;17898;17850:55;;;;;;;;;;;;;-1:-1:-1;;;;;17850:55:0;;;;;;-1:-1:-1;;;;;17850:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;17763:154:0;17928:13;17943;17960:55;17991:7;18000:6;18008;17960:30;:55::i;:::-;17927:88;;;;18030:8;18042:1;18030:13;:30;;;;-1:-1:-1;18047:13:0;;18030:30;18026:825;;;18099:14;;-1:-1:-1;18115:14:0;;-1:-1:-1;18026:825:0;;;18163:19;18185:60;18210:14;18226:8;18236;18185:24;:60::i;:::-;18163:82;;18282:14;18264;:32;18260:580;;18343:10;18325:14;:28;;18317:81;;;;-1:-1:-1;;;18317:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18439:14;;-1:-1:-1;18455:14:0;-1:-1:-1;18455:14:0;18260:580;;;18511:19;18533:60;18558:14;18574:8;18584;18533:24;:60::i;:::-;18511:82;;18637:14;18619;:32;;18612:40;;;;18697:10;18679:14;:28;;18671:81;;;;-1:-1:-1;;;18671:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18793:14;-1:-1:-1;18809:14:0;;-1:-1:-1;18260:580:0;18026:825;;17454:1404;;;;;;;;;;;:::o;11717:142::-;11769:6;11796;;;:30;;-1:-1:-1;;11811:5:0;;;11825:1;11820;11811:5;11820:1;11806:15;;;;;:20;11796:30;11788:63;;;;;-1:-1:-1;;;11788:63:0;;;;;;;;;;;;-1:-1:-1;;;11788:63:0;;;;;;;;;;;;;;11444:128;11528:5;;;11523:16;;;;11515:49;;;;;-1:-1:-1;;;11515:49:0;;;;;;;;;;;;-1:-1:-1;;;11515:49:0;;;;;;;;;;;;;;13204:393;13297:13;13312;13339:14;13358:26;13369:6;13377;13358:10;:26::i;:::-;13338:46;;;13396:13;13411;13446:32;13454:7;13463:6;13471;13446:7;:32::i;:::-;-1:-1:-1;;;;;13429:62:0;;:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13429:64:0;;;;;;;-1:-1:-1;;;;;13395:98:0;;;;-1:-1:-1;13395:98:0;;-1:-1:-1;;;;;;13527:16:0;;;;;;;:62;;13570:8;13580;13527:62;;;13547:8;13557;13527:62;13504:85;;;;-1:-1:-1;13204:393:0;-1:-1:-1;;;;;;;13204:393:0:o

Swarm Source

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