Contract 0x319ef69a98c8e8aab36aea561daba0bf3d0fa3ac 1

 

Contract Overview

Balance:
0 BNB

BNB Value:
$0.00

Token:
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x2e8e3efc8aee385db31687c5439d7a35c073bde6b2e8bb4ebdbfebfe66b198fdAdd Liquidity ET...110257912021-09-18 15:52:072 hrs 23 mins ago0x11e29129b4aa6f5a8d9643201a5bc950579b3185 IN  0x319ef69a98c8e8aab36aea561daba0bf3d0fa3ac0.054945593335462 BNB0.000806645
0x48eafa8c0cf5437c5855e70397647276be4498aa8d50bb4d25309507c2db8f5aAdd Liquidity ET...110251842021-09-18 15:21:242 hrs 53 mins ago0xe13a249781062f8096caa2604e19a95d8da85bef IN  0x319ef69a98c8e8aab36aea561daba0bf3d0fa3ac0.004383142681564 BNB0.00086103
0x681958578c5dd82f13823400a75f20dda80d18615501a51044a6f5806aff3acfAdd Liquidity ET...110241202021-09-18 14:28:073 hrs 47 mins ago0x922c96090c6e87f7421aa425df1fb51caf360011 IN  0x319ef69a98c8e8aab36aea561daba0bf3d0fa3ac0.241026387371018 BNB0.00086115
0x3eb7922617737bbcc761ff0c1d46ae2e08c75c31a37028d5369ac2e856a5d92cSwap Exact ETH F...110240872021-09-18 14:26:283 hrs 48 mins ago0x922c96090c6e87f7421aa425df1fb51caf360011 IN  0x319ef69a98c8e8aab36aea561daba0bf3d0fa3ac0.24 BNB0.0006262
0xb88ff5f27687fcbc99db529c67ed092f41880352e273a7839dfcb4700153b1f6Swap ETH For Exa...110224242021-09-18 13:02:095 hrs 13 mins ago0x7e28051536564695142d973a0b0caab17ca64011 IN  0x319ef69a98c8e8aab36aea561daba0bf3d0fa3ac0.008730656989289 BNB0.000666035
0xc8484ee63a3e0dc4586f6d2f6f48af560e6e72052288cce7a449e146363fdb56Add Liquidity ET...110222672021-09-18 12:54:185 hrs 20 mins ago0x97d72cc180285af72a0054077c9e00491a1c62a3 IN  0x319ef69a98c8e8aab36aea561daba0bf3d0fa3ac0.00036 BNB0.000974845
0x81f0c10892c311febc34dbbf278bbe7bfb334e92c926d3695458e7e3e33bb4b3Swap Exact ETH F...110221822021-09-18 12:50:035 hrs 25 mins ago0x97d72cc180285af72a0054077c9e00491a1c62a3 IN  0x319ef69a98c8e8aab36aea561daba0bf3d0fa3ac0.016 BNB0.00062608
0xd5edd5e22edb8b47140d9a71c18ebb96eb0e8f361514d959cb492c2341232719Add Liquidity ET...110208352021-09-18 11:42:316 hrs 32 mins ago0xe13a249781062f8096caa2604e19a95d8da85bef IN  0x319ef69a98c8e8aab36aea561daba0bf3d0fa3ac0.000190792911519 BNB0.00086097
0x55a8013161e07ab076c446ec6767276c281f5f8db43757bf9da82883173192c2Swap ETH For Exa...110183752021-09-18 9:39:318 hrs 35 mins ago0x272a7ec318d4d467c8c2a8dcada22aca003c40c5 IN  0x319ef69a98c8e8aab36aea561daba0bf3d0fa3ac0.003049278061482 BNB0.000590975
0x7648f6e7f598170dd44ac9bd520a98d6ffbb7835f2dc34c0f09e85c9d7139f42Remove Liquidity...110182062021-09-18 9:31:048 hrs 44 mins ago0x051e1e489f4f96a6295ff699cb8e865ecb448c97 IN  0x319ef69a98c8e8aab36aea561daba0bf3d0fa3ac0 BNB0.00097077
0x49ce49bc6df2a50c3d4d83f65dd4e348e49eaf8e48963c88bd7141b0ba16cb03Swap Exact Token...110153192021-09-18 7:06:2211 hrs 8 mins ago0x11492d5e2a3aad0543bdda61196bc828eab8a320 IN  0x319ef69a98c8e8aab36aea561daba0bf3d0fa3ac0 BNB0.0005793192
0x528762a8bdb07583f5c3db0408d6b61d3e7262d6be1eb212e78c40725a5f3e5fSwap Exact ETH F...110152422021-09-18 7:02:3111 hrs 12 mins ago0x11492d5e2a3aad0543bdda61196bc828eab8a320 IN  0x319ef69a98c8e8aab36aea561daba0bf3d0fa3ac0.01 BNB0.000638724
0xa115bcd699a7facf7f8dddbc1e4087240d9ca50c47af8d8f7add723d3cf7d76fAdd Liquidity ET...110151602021-09-18 6:58:2511 hrs 16 mins ago0x11492d5e2a3aad0543bdda61196bc828eab8a320 IN  0x319ef69a98c8e8aab36aea561daba0bf3d0fa3ac0.009973021512585 BNB0.0008782506
0xcd4698b0df02f03bd23aeff55c484e793158df0328d80cc272ffd55acc1c2715Swap Exact ETH F...110151512021-09-18 6:57:5811 hrs 17 mins ago0x11492d5e2a3aad0543bdda61196bc828eab8a320 IN  0x319ef69a98c8e8aab36aea561daba0bf3d0fa3ac0.01 BNB0.000638724
0x785ada447b416245565c13c96cb280060bd059cde766a6e54332f0e66bc553e8Swap Exact Token...110145502021-09-18 6:27:5511 hrs 47 mins ago0xd67617eca555d00f6847af4a3935ab835e76e804 IN  0x319ef69a98c8e8aab36aea561daba0bf3d0fa3ac0 BNB0.00056802
0x580c9269cb4b90476b4110968340c72560b6aba0168fb78f75dfde617c1b6efaRemove Liquidity...110145332021-09-18 6:27:0411 hrs 48 mins ago0xd67617eca555d00f6847af4a3935ab835e76e804 IN  0x319ef69a98c8e8aab36aea561daba0bf3d0fa3ac0 BNB0.000991145
0xbab17b0411e8a1e2f9ece5414f3d66580dfa68cfc001c807da7b1947f3d35260Swap Exact Token...110087572021-09-18 1:37:0916 hrs 38 mins ago0xf9f476cdaa632e3207edd4f2d8127932cb0b3902 IN  0x319ef69a98c8e8aab36aea561daba0bf3d0fa3ac0 BNB0.00126511
0xd12ca9a13081f1e04b54a98c53891eace3d54ca8bd8d8ae23e3d62c8ccd4a724Add Liquidity ET...110064222021-09-17 23:40:1918 hrs 34 mins ago0xa3134f4a21c29bc1353b3c26761ef9b8fffe9033 IN  0x319ef69a98c8e8aab36aea561daba0bf3d0fa3ac1.177561025448415 BNB0.00086121
0x1c1fd351a07ddf80dc705e26e981fb527c078f46a7d3a484da8b3fccca31fb88Swap Exact ETH F...110064132021-09-17 23:39:5218 hrs 35 mins ago0xa3134f4a21c29bc1353b3c26761ef9b8fffe9033 IN  0x319ef69a98c8e8aab36aea561daba0bf3d0fa3ac0.382145985038961 BNB0.00055126
0x6d9d91e8879717a5982693c5ba8a2de2d8f9148d86841afc69cee618d6b4250eSwap Exact Token...110063992021-09-17 23:39:1018 hrs 36 mins ago0xa3134f4a21c29bc1353b3c26761ef9b8fffe9033 IN  0x319ef69a98c8e8aab36aea561daba0bf3d0fa3ac0 BNB0.00150845
0xd9825e7ff5f65916b90b5e86a0e8645c2106e302e117f16fbab6761613f63879Add Liquidity ET...110062172021-09-17 23:30:0418 hrs 45 mins ago0xc207bfd1d4027cfe863ec7ed3f9528ba2e459fa2 IN  0x319ef69a98c8e8aab36aea561daba0bf3d0fa3ac0.130161550467138 BNB0.00086115
0x981ea41a6449c58be4dd25b02c3cab8f6a2fd93877e013186af5b200477c2af3Swap Exact ETH F...110061822021-09-17 23:28:1918 hrs 46 mins ago0xc207bfd1d4027cfe863ec7ed3f9528ba2e459fa2 IN  0x319ef69a98c8e8aab36aea561daba0bf3d0fa3ac0.13 BNB0.00062626
0x480dc1d60a6dbdca0a8a486781ee49949dc5b25b46bf31ec9a98a5973015fd29Add Liquidity ET...110046712021-09-17 22:12:4620 hrs 2 mins ago0x01d1603026e70830687613bd9446de014053f787 IN  0x319ef69a98c8e8aab36aea561daba0bf3d0fa3ac0.03 BNB0.000974965
0x493d6d6472175995a59d851a7f7982c5e567065b06c0c0d9dbe0d572559c1eaaSwap Exact ETH F...110044982021-09-17 22:04:0720 hrs 11 mins ago0x3baac63e66bdc16a110c9aefc4ad94528ed736f9 IN  0x319ef69a98c8e8aab36aea561daba0bf3d0fa3ac0.822080626684329 BNB0.00062626
0x08edbf44f78949974417656812898b566e24da38a7ff1372e452ae1b9d6777ffRemove Liquidity...110042612021-09-17 21:52:1620 hrs 22 mins ago0xe4ed59a1a48fed580d6177834e0e8192e8d2fef8 IN  0x319ef69a98c8e8aab36aea561daba0bf3d0fa3ac0 BNB0.002130725
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x2e8e3efc8aee385db31687c5439d7a35c073bde6b2e8bb4ebdbfebfe66b198fd110257912021-09-18 15:52:072 hrs 23 mins ago 0x319ef69a98c8e8aab36aea561daba0bf3d0fa3ac Binance: WBNB Token0.054945593335462029 BNB
0x48eafa8c0cf5437c5855e70397647276be4498aa8d50bb4d25309507c2db8f5a110251842021-09-18 15:21:242 hrs 53 mins ago 0x319ef69a98c8e8aab36aea561daba0bf3d0fa3ac Binance: WBNB Token0.004383142681564961 BNB
0x681958578c5dd82f13823400a75f20dda80d18615501a51044a6f5806aff3acf110241202021-09-18 14:28:073 hrs 47 mins ago 0x319ef69a98c8e8aab36aea561daba0bf3d0fa3ac Binance: WBNB Token0.241026387371018885 BNB
0x3eb7922617737bbcc761ff0c1d46ae2e08c75c31a37028d5369ac2e856a5d92c110240872021-09-18 14:26:283 hrs 48 mins ago 0x319ef69a98c8e8aab36aea561daba0bf3d0fa3ac Binance: WBNB Token0.24 BNB
0xb88ff5f27687fcbc99db529c67ed092f41880352e273a7839dfcb4700153b1f6110224242021-09-18 13:02:095 hrs 13 mins ago 0x319ef69a98c8e8aab36aea561daba0bf3d0fa3ac0x7e28051536564695142d973a0b0caab17ca640110.000069290928486426 BNB
0xb88ff5f27687fcbc99db529c67ed092f41880352e273a7839dfcb4700153b1f6110224242021-09-18 13:02:095 hrs 13 mins ago 0x319ef69a98c8e8aab36aea561daba0bf3d0fa3ac Binance: WBNB Token0.008661366060803361 BNB
0xc8484ee63a3e0dc4586f6d2f6f48af560e6e72052288cce7a449e146363fdb56110222672021-09-18 12:54:185 hrs 20 mins ago 0x319ef69a98c8e8aab36aea561daba0bf3d0fa3ac0x97d72cc180285af72a0054077c9e00491a1c62a31 wei
0xc8484ee63a3e0dc4586f6d2f6f48af560e6e72052288cce7a449e146363fdb56110222672021-09-18 12:54:185 hrs 20 mins ago 0x319ef69a98c8e8aab36aea561daba0bf3d0fa3ac Binance: WBNB Token0.000359999999999999 BNB
0x81f0c10892c311febc34dbbf278bbe7bfb334e92c926d3695458e7e3e33bb4b3110221822021-09-18 12:50:035 hrs 25 mins ago 0x319ef69a98c8e8aab36aea561daba0bf3d0fa3ac Binance: WBNB Token0.016 BNB
0xd5edd5e22edb8b47140d9a71c18ebb96eb0e8f361514d959cb492c2341232719110208352021-09-18 11:42:316 hrs 32 mins ago 0x319ef69a98c8e8aab36aea561daba0bf3d0fa3ac Binance: WBNB Token0.000190792911519902 BNB
0x55a8013161e07ab076c446ec6767276c281f5f8db43757bf9da82883173192c2110183752021-09-18 9:39:318 hrs 35 mins ago 0x319ef69a98c8e8aab36aea561daba0bf3d0fa3ac0x272a7ec318d4d467c8c2a8dcada22aca003c40c50.000024200619535575 BNB
0x55a8013161e07ab076c446ec6767276c281f5f8db43757bf9da82883173192c2110183752021-09-18 9:39:318 hrs 35 mins ago 0x319ef69a98c8e8aab36aea561daba0bf3d0fa3ac Binance: WBNB Token0.003025077441946912 BNB
0x7648f6e7f598170dd44ac9bd520a98d6ffbb7835f2dc34c0f09e85c9d7139f42110182062021-09-18 9:31:048 hrs 44 mins ago 0x319ef69a98c8e8aab36aea561daba0bf3d0fa3ac0x051e1e489f4f96a6295ff699cb8e865ecb448c970.174504373746074819 BNB
0x7648f6e7f598170dd44ac9bd520a98d6ffbb7835f2dc34c0f09e85c9d7139f42110182062021-09-18 9:31:048 hrs 44 mins ago Binance: WBNB Token 0x319ef69a98c8e8aab36aea561daba0bf3d0fa3ac0.174504373746074819 BNB
0x49ce49bc6df2a50c3d4d83f65dd4e348e49eaf8e48963c88bd7141b0ba16cb03110153192021-09-18 7:06:2211 hrs 8 mins ago 0x319ef69a98c8e8aab36aea561daba0bf3d0fa3ac0x11492d5e2a3aad0543bdda61196bc828eab8a3200.009940108031230075 BNB
0x49ce49bc6df2a50c3d4d83f65dd4e348e49eaf8e48963c88bd7141b0ba16cb03110153192021-09-18 7:06:2211 hrs 8 mins ago Binance: WBNB Token 0x319ef69a98c8e8aab36aea561daba0bf3d0fa3ac0.009940108031230075 BNB
0x528762a8bdb07583f5c3db0408d6b61d3e7262d6be1eb212e78c40725a5f3e5f110152422021-09-18 7:02:3111 hrs 12 mins ago 0x319ef69a98c8e8aab36aea561daba0bf3d0fa3ac Binance: WBNB Token0.01 BNB
0xa115bcd699a7facf7f8dddbc1e4087240d9ca50c47af8d8f7add723d3cf7d76f110151602021-09-18 6:58:2511 hrs 16 mins ago 0x319ef69a98c8e8aab36aea561daba0bf3d0fa3ac Binance: WBNB Token0.009973021512585168 BNB
0xcd4698b0df02f03bd23aeff55c484e793158df0328d80cc272ffd55acc1c2715110151512021-09-18 6:57:5811 hrs 17 mins ago 0x319ef69a98c8e8aab36aea561daba0bf3d0fa3ac Binance: WBNB Token0.01 BNB
0x785ada447b416245565c13c96cb280060bd059cde766a6e54332f0e66bc553e8110145502021-09-18 6:27:5511 hrs 47 mins ago 0x319ef69a98c8e8aab36aea561daba0bf3d0fa3ac0xd67617eca555d00f6847af4a3935ab835e76e8040.036945477257858116 BNB
0x785ada447b416245565c13c96cb280060bd059cde766a6e54332f0e66bc553e8110145502021-09-18 6:27:5511 hrs 47 mins ago Binance: WBNB Token 0x319ef69a98c8e8aab36aea561daba0bf3d0fa3ac0.036945477257858116 BNB
0x580c9269cb4b90476b4110968340c72560b6aba0168fb78f75dfde617c1b6efa110145332021-09-18 6:27:0411 hrs 48 mins ago 0x319ef69a98c8e8aab36aea561daba0bf3d0fa3ac0xd67617eca555d00f6847af4a3935ab835e76e8040.025737790626881633 BNB
0x580c9269cb4b90476b4110968340c72560b6aba0168fb78f75dfde617c1b6efa110145332021-09-18 6:27:0411 hrs 48 mins ago Binance: WBNB Token 0x319ef69a98c8e8aab36aea561daba0bf3d0fa3ac0.025737790626881633 BNB
0xfaa7d3eb326886f43997904230176f3e367ce13e6973c044bdd57c30cb7d22f6110126732021-09-18 4:53:0413 hrs 22 mins ago 0x319ef69a98c8e8aab36aea561daba0bf3d0fa3ac Binance: WBNB Token0.006415950639848991 BNB
0xfaa7d3eb326886f43997904230176f3e367ce13e6973c044bdd57c30cb7d22f6110126732021-09-18 4:53:0413 hrs 22 mins ago 0xece59e58046179a762513727607629641190e421 0x319ef69a98c8e8aab36aea561daba0bf3d0fa3ac0.006415950639848991 BNB
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
PinkswapRouter

Compiler Version
v0.6.6+commit.6c089d02

Optimization Enabled:
Yes with 999999 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at BscScan.com on 2021-05-27
*/

// Dependency file: @uniswap/v2-core/contracts/interfaces/IPinkswapPair.sol

// pragma solidity >=0.5.0;

interface IPinkswapPair {
    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/IPinkswapRouter01.sol

// pragma solidity >=0.6.2;

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

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

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

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

// pragma solidity >=0.5.0;

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

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

// pragma solidity >=0.5.0;

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

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

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

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

// pragma solidity =0.6.6;

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

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

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

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

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

// pragma solidity >=0.5.0;

// import '@uniswap/v2-core/contracts/interfaces/IPinkswapPair.sol';

// import "./SafeMath.sol";

library PinkswapLibrary {
    using SafeMath for uint;

    // returns sorted token addresses, used to handle return values from pairs sorted in this order
    function sortTokens(address tokenA, address tokenB) internal pure returns (address token0, address token1) {
        require(tokenA != tokenB, 'PinkswapLibrary: IDENTICAL_ADDRESSES');
        (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
        require(token0 != address(0), 'PinkswapLibrary: 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'78ee0c97de2aaecb976bed43c44c0619b5458672edd3ac64adc68a286cf86283' // init code hash
            ))));
    }

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

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

// pragma solidity >=0.6.2;

// import './IPinkswapRouter01.sol';

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

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

// Dependency file: @uniswap/lib/contracts/libraries/TransferHelper.sol

// pragma solidity >=0.6.0;

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

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

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

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

// Dependency file: @uniswap/v2-core/contracts/interfaces/IPinkswapFactory.sol

// pragma solidity >=0.5.0;

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

pragma solidity =0.6.6;

// import '@uniswap/v2-core/contracts/interfaces/IPinkswapFactory.sol';
// import '@uniswap/lib/contracts/libraries/TransferHelper.sol';

// import './interfaces/IPinkswapRouter02.sol';
// import './libraries/PinkswapLibrary.sol';
// import './libraries/SafeMath.sol';
// import './interfaces/IERC20.sol';
// import './interfaces/IWETH.sol';

contract PinkswapRouter is IPinkswapRouter02 {
    using SafeMath for uint;

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

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

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

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

    // **** ADD LIQUIDITY ****
    function _addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin
    ) internal virtual returns (uint amountA, uint amountB) {
        // create the pair if it doesn't exist yet
        if (IPinkswapFactory(factory).getPair(tokenA, tokenB) == address(0)) {
            IPinkswapFactory(factory).createPair(tokenA, tokenB);
        }
        (uint reserveA, uint reserveB) = PinkswapLibrary.getReserves(factory, tokenA, tokenB);
        if (reserveA == 0 && reserveB == 0) {
            (amountA, amountB) = (amountADesired, amountBDesired);
        } else {
            uint amountBOptimal = PinkswapLibrary.quote(amountADesired, reserveA, reserveB);
            if (amountBOptimal <= amountBDesired) {
                require(amountBOptimal >= amountBMin, 'PinkswapRouter: INSUFFICIENT_B_AMOUNT');
                (amountA, amountB) = (amountADesired, amountBOptimal);
            } else {
                uint amountAOptimal = PinkswapLibrary.quote(amountBDesired, reserveB, reserveA);
                assert(amountAOptimal <= amountADesired);
                require(amountAOptimal >= amountAMin, 'PinkswapRouter: 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 = PinkswapLibrary.pairFor(factory, tokenA, tokenB);
        TransferHelper.safeTransferFrom(tokenA, msg.sender, pair, amountA);
        TransferHelper.safeTransferFrom(tokenB, msg.sender, pair, amountB);
        liquidity = IPinkswapPair(pair).mint(to);
    }
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external virtual override payable ensure(deadline) returns (uint amountToken, uint amountETH, uint liquidity) {
        (amountToken, amountETH) = _addLiquidity(
            token,
            WETH,
            amountTokenDesired,
            msg.value,
            amountTokenMin,
            amountETHMin
        );
        address pair = PinkswapLibrary.pairFor(factory, token, WETH);
        TransferHelper.safeTransferFrom(token, msg.sender, pair, amountToken);
        IWETH(WETH).deposit{value: amountETH}();
        assert(IWETH(WETH).transfer(pair, amountETH));
        liquidity = IPinkswapPair(pair).mint(to);
        // refund dust eth, if any
        if (msg.value > amountETH) TransferHelper.safeTransferETH(msg.sender, msg.value - amountETH);
    }

    // **** REMOVE LIQUIDITY ****
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) public virtual override ensure(deadline) returns (uint amountA, uint amountB) {
        address pair = PinkswapLibrary.pairFor(factory, tokenA, tokenB);
        IPinkswapPair(pair).transferFrom(msg.sender, pair, liquidity); // send liquidity to pair
        (uint amount0, uint amount1) = IPinkswapPair(pair).burn(to);
        (address token0,) = PinkswapLibrary.sortTokens(tokenA, tokenB);
        (amountA, amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0);
        require(amountA >= amountAMin, 'PinkswapRouter: INSUFFICIENT_A_AMOUNT');
        require(amountB >= amountBMin, 'PinkswapRouter: INSUFFICIENT_B_AMOUNT');
    }
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) public virtual override ensure(deadline) returns (uint amountToken, uint amountETH) {
        (amountToken, amountETH) = removeLiquidity(
            token,
            WETH,
            liquidity,
            amountTokenMin,
            amountETHMin,
            address(this),
            deadline
        );
        TransferHelper.safeTransfer(token, to, amountToken);
        IWETH(WETH).withdraw(amountETH);
        TransferHelper.safeTransferETH(to, amountETH);
    }
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external virtual override returns (uint amountA, uint amountB) {
        address pair = PinkswapLibrary.pairFor(factory, tokenA, tokenB);
        uint value = approveMax ? uint(-1) : liquidity;
        IPinkswapPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        (amountA, amountB) = removeLiquidity(tokenA, tokenB, liquidity, amountAMin, amountBMin, to, deadline);
    }
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external virtual override returns (uint amountToken, uint amountETH) {
        address pair = PinkswapLibrary.pairFor(factory, token, WETH);
        uint value = approveMax ? uint(-1) : liquidity;
        IPinkswapPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        (amountToken, amountETH) = removeLiquidityETH(token, liquidity, amountTokenMin, amountETHMin, to, deadline);
    }

    // **** REMOVE LIQUIDITY (supporting fee-on-transfer tokens) ****
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) public virtual override ensure(deadline) returns (uint amountETH) {
        (, amountETH) = removeLiquidity(
            token,
            WETH,
            liquidity,
            amountTokenMin,
            amountETHMin,
            address(this),
            deadline
        );
        TransferHelper.safeTransfer(token, to, IERC20(token).balanceOf(address(this)));
        IWETH(WETH).withdraw(amountETH);
        TransferHelper.safeTransferETH(to, amountETH);
    }
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external virtual override returns (uint amountETH) {
        address pair = PinkswapLibrary.pairFor(factory, token, WETH);
        uint value = approveMax ? uint(-1) : liquidity;
        IPinkswapPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        amountETH = removeLiquidityETHSupportingFeeOnTransferTokens(
            token, liquidity, amountTokenMin, amountETHMin, to, deadline
        );
    }

    // **** SWAP ****
    // requires the initial amount to have already been sent to the first pair
    function _swap(uint[] memory amounts, address[] memory path, address _to) internal virtual {
        for (uint i; i < path.length - 1; i++) {
            (address input, address output) = (path[i], path[i + 1]);
            (address token0,) = PinkswapLibrary.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 ? PinkswapLibrary.pairFor(factory, output, path[i + 2]) : _to;
            IPinkswapPair(PinkswapLibrary.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 = PinkswapLibrary.getAmountsOut(factory, amountIn, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'PinkswapRouter: INSUFFICIENT_OUTPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, PinkswapLibrary.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 = PinkswapLibrary.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= amountInMax, 'PinkswapRouter: EXCESSIVE_INPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, PinkswapLibrary.pairFor(factory, path[0], path[1]), amounts[0]
        );
        _swap(amounts, path, to);
    }
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        virtual
        override
        payable
        ensure(deadline)
        returns (uint[] memory amounts)
    {
        require(path[0] == WETH, 'PinkswapRouter: INVALID_PATH');
        amounts = PinkswapLibrary.getAmountsOut(factory, msg.value, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'PinkswapRouter: INSUFFICIENT_OUTPUT_AMOUNT');
        IWETH(WETH).deposit{value: amounts[0]}();
        assert(IWETH(WETH).transfer(PinkswapLibrary.pairFor(factory, path[0], path[1]), amounts[0]));
        _swap(amounts, path, to);
    }
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        virtual
        override
        ensure(deadline)
        returns (uint[] memory amounts)
    {
        require(path[path.length - 1] == WETH, 'PinkswapRouter: INVALID_PATH');
        amounts = PinkswapLibrary.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= amountInMax, 'PinkswapRouter: EXCESSIVE_INPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, PinkswapLibrary.pairFor(factory, path[0], path[1]), amounts[0]
        );
        _swap(amounts, path, address(this));
        IWETH(WETH).withdraw(amounts[amounts.length - 1]);
        TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]);
    }
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        virtual
        override
        ensure(deadline)
        returns (uint[] memory amounts)
    {
        require(path[path.length - 1] == WETH, 'PinkswapRouter: INVALID_PATH');
        amounts = PinkswapLibrary.getAmountsOut(factory, amountIn, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'PinkswapRouter: INSUFFICIENT_OUTPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, PinkswapLibrary.pairFor(factory, path[0], path[1]), amounts[0]
        );
        _swap(amounts, path, address(this));
        IWETH(WETH).withdraw(amounts[amounts.length - 1]);
        TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]);
    }
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        virtual
        override
        payable
        ensure(deadline)
        returns (uint[] memory amounts)
    {
        require(path[0] == WETH, 'PinkswapRouter: INVALID_PATH');
        amounts = PinkswapLibrary.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= msg.value, 'PinkswapRouter: EXCESSIVE_INPUT_AMOUNT');
        IWETH(WETH).deposit{value: amounts[0]}();
        assert(IWETH(WETH).transfer(PinkswapLibrary.pairFor(factory, path[0], path[1]), amounts[0]));
        _swap(amounts, path, to);
        // refund dust eth, if any
        if (msg.value > amounts[0]) TransferHelper.safeTransferETH(msg.sender, msg.value - amounts[0]);
    }

    // **** SWAP (supporting fee-on-transfer tokens) ****
    // requires the initial amount to have already been sent to the first pair
    function _swapSupportingFeeOnTransferTokens(address[] memory path, address _to) internal virtual {
        for (uint i; i < path.length - 1; i++) {
            (address input, address output) = (path[i], path[i + 1]);
            (address token0,) = PinkswapLibrary.sortTokens(input, output);
            IPinkswapPair pair = IPinkswapPair(PinkswapLibrary.pairFor(factory, input, output));
            uint amountInput;
            uint amountOutput;
            { // scope to avoid stack too deep errors
            (uint reserve0, uint reserve1,) = pair.getReserves();
            (uint reserveInput, uint reserveOutput) = input == token0 ? (reserve0, reserve1) : (reserve1, reserve0);
            amountInput = IERC20(input).balanceOf(address(pair)).sub(reserveInput);
            amountOutput = PinkswapLibrary.getAmountOut(amountInput, reserveInput, reserveOutput);
            }
            (uint amount0Out, uint amount1Out) = input == token0 ? (uint(0), amountOutput) : (amountOutput, uint(0));
            address to = i < path.length - 2 ? PinkswapLibrary.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, PinkswapLibrary.pairFor(factory, path[0], path[1]), amountIn
        );
        uint balanceBefore = IERC20(path[path.length - 1]).balanceOf(to);
        _swapSupportingFeeOnTransferTokens(path, to);
        require(
            IERC20(path[path.length - 1]).balanceOf(to).sub(balanceBefore) >= amountOutMin,
            'PinkswapRouter: INSUFFICIENT_OUTPUT_AMOUNT'
        );
    }
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    )
        external
        virtual
        override
        payable
        ensure(deadline)
    {
        require(path[0] == WETH, 'PinkswapRouter: INVALID_PATH');
        uint amountIn = msg.value;
        IWETH(WETH).deposit{value: amountIn}();
        assert(IWETH(WETH).transfer(PinkswapLibrary.pairFor(factory, path[0], path[1]), amountIn));
        uint balanceBefore = IERC20(path[path.length - 1]).balanceOf(to);
        _swapSupportingFeeOnTransferTokens(path, to);
        require(
            IERC20(path[path.length - 1]).balanceOf(to).sub(balanceBefore) >= amountOutMin,
            'PinkswapRouter: INSUFFICIENT_OUTPUT_AMOUNT'
        );
    }
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    )
        external
        virtual
        override
        ensure(deadline)
    {
        require(path[path.length - 1] == WETH, 'PinkswapRouter: INVALID_PATH');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, PinkswapLibrary.pairFor(factory, path[0], path[1]), amountIn
        );
        _swapSupportingFeeOnTransferTokens(path, address(this));
        uint amountOut = IERC20(WETH).balanceOf(address(this));
        require(amountOut >= amountOutMin, 'PinkswapRouter: INSUFFICIENT_OUTPUT_AMOUNT');
        IWETH(WETH).withdraw(amountOut);
        TransferHelper.safeTransferETH(to, amountOut);
    }

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

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

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

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

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

Contract Security Audit

Contract ABI

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

60c06040523480156200001157600080fd5b506040516200574138038062005741833981810160405260408110156200003757600080fd5b5080516020909101516001600160601b0319606092831b8116608052911b1660a05260805160601c60a05160601c6155ba62000187600039806101ac5280610e5d5280610e985280610fd5528061129852806116f252806118d65280611e1e5280611fa252806120725280612179528061232c52806123c15280612673528061271a52806127ef52806128f452806129dc5280612a5d52806130ec5280613422528061347852806134ac528061352d528061374752806138f7528061398c5250806110c752806111c5528061136b52806113a4528061154f52806117e452806118b45280611aa1528061225f528061240052806125a95280612a9c5280612ddf5280613071528061309a52806130ca52806132a75280613456528061382d52806139cb528061444a528061448d52806147ed52806149ce5280614f49528061502a52806150aa52506155ba6000f3fe60806040526004361061018f5760003560e01c80638803dbee116100d6578063c45a01551161007f578063e8e3370011610059578063e8e3370014610c71578063f305d71914610cfe578063fb3bdb4114610d51576101d5565b8063c45a015514610b25578063d06ca61f14610b3a578063ded9382a14610bf1576101d5565b8063af2979eb116100b0578063af2979eb146109c8578063b6f9de9514610a28578063baa2abde14610abb576101d5565b80638803dbee146108af578063ad5c464814610954578063ad615dec14610992576101d5565b80634a25d94a11610138578063791ac94711610112578063791ac947146107415780637ff36ab5146107e657806385f8c25914610879576101d5565b80634a25d94a146105775780635b0d59841461061c5780635c11d7951461069c576101d5565b80631f00ca74116101695780631f00ca74146103905780632195995c1461044757806338ed1739146104d2576101d5565b806302751cec146101da578063054d50d41461025357806318cbafe51461029b576101d5565b366101d5573373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146101d357fe5b005b600080fd5b3480156101e657600080fd5b5061023a600480360360c08110156101fd57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a00135610de4565b6040805192835260208301919091528051918290030190f35b34801561025f57600080fd5b506102896004803603606081101561027657600080fd5b5080359060208101359060400135610f37565b60408051918252519081900360200190f35b3480156102a757600080fd5b50610340600480360360a08110156102be57600080fd5b8135916020810135918101906060810160408201356401000000008111156102e557600080fd5b8201836020820111156102f757600080fd5b8035906020019184602083028401116401000000008311171561031957600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135610f4c565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561037c578181015183820152602001610364565b505050509050019250505060405180910390f35b34801561039c57600080fd5b50610340600480360360408110156103b357600080fd5b813591908101906040810160208201356401000000008111156103d557600080fd5b8201836020820111156103e757600080fd5b8035906020019184602083028401116401000000008311171561040957600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611364945050505050565b34801561045357600080fd5b5061023a600480360361016081101561046b57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013582169160408201359160608101359160808201359160a08101359091169060c08101359060e081013515159060ff610100820135169061012081013590610140013561139a565b3480156104de57600080fd5b50610340600480360360a08110156104f557600080fd5b81359160208101359181019060608101604082013564010000000081111561051c57600080fd5b82018360208201111561052e57600080fd5b8035906020019184602083028401116401000000008311171561055057600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602001356114d8565b34801561058357600080fd5b50610340600480360360a081101561059a57600080fd5b8135916020810135918101906060810160408201356401000000008111156105c157600080fd5b8201836020820111156105d357600080fd5b803590602001918460208302840111640100000000831117156105f557600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135611669565b34801561062857600080fd5b50610289600480360361014081101561064057600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e082013516906101008101359061012001356118ac565b3480156106a857600080fd5b506101d3600480360360a08110156106bf57600080fd5b8135916020810135918101906060810160408201356401000000008111156106e657600080fd5b8201836020820111156106f857600080fd5b8035906020019184602083028401116401000000008311171561071a57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602001356119fe565b34801561074d57600080fd5b506101d3600480360360a081101561076457600080fd5b81359160208101359181019060608101604082013564010000000081111561078b57600080fd5b82018360208201111561079d57600080fd5b803590602001918460208302840111640100000000831117156107bf57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135611d97565b610340600480360360808110156107fc57600080fd5b8135919081019060408101602082013564010000000081111561081e57600080fd5b82018360208201111561083057600080fd5b8035906020019184602083028401116401000000008311171561085257600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135612105565b34801561088557600080fd5b506102896004803603606081101561089c57600080fd5b5080359060208101359060400135612525565b3480156108bb57600080fd5b50610340600480360360a08110156108d257600080fd5b8135916020810135918101906060810160408201356401000000008111156108f957600080fd5b82018360208201111561090b57600080fd5b8035906020019184602083028401116401000000008311171561092d57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135612532565b34801561096057600080fd5b50610969612671565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b34801561099e57600080fd5b50610289600480360360608110156109b557600080fd5b5080359060208101359060400135612695565b3480156109d457600080fd5b50610289600480360360c08110156109eb57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a001356126a2565b6101d360048036036080811015610a3e57600080fd5b81359190810190604081016020820135640100000000811115610a6057600080fd5b820183602082011115610a7257600080fd5b80359060200191846020830284011164010000000083111715610a9457600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135612882565b348015610ac757600080fd5b5061023a600480360360e0811015610ade57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013582169160408201359160608101359160808201359160a08101359091169060c00135612d65565b348015610b3157600080fd5b5061096961306f565b348015610b4657600080fd5b5061034060048036036040811015610b5d57600080fd5b81359190810190604081016020820135640100000000811115610b7f57600080fd5b820183602082011115610b9157600080fd5b80359060200191846020830284011164010000000083111715610bb357600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550613093945050505050565b348015610bfd57600080fd5b5061023a6004803603610140811015610c1557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e082013516906101008101359061012001356130c0565b348015610c7d57600080fd5b50610ce06004803603610100811015610c9557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013582169160408201359160608101359160808201359160a08101359160c0820135169060e00135613218565b60408051938452602084019290925282820152519081900360600190f35b610ce0600480360360c0811015610d1457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a001356133a7565b61034060048036036080811015610d6757600080fd5b81359190810190604081016020820135640100000000811115610d8957600080fd5b820183602082011115610d9b57600080fd5b80359060200191846020830284011164010000000083111715610dbd57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602001356136d3565b6000808242811015610e5757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f50696e6b73776170526f757465723a2045585049524544000000000000000000604482015290519081900360640190fd5b610e86897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a612d65565b9093509150610e96898685613b22565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610f0957600080fd5b505af1158015610f1d573d6000803e3d6000fd5b50505050610f2b8583613cff565b50965096945050505050565b6000610f44848484613e3c565b949350505050565b60608142811015610fbe57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f50696e6b73776170526f757465723a2045585049524544000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001686867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811061102357fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146110c257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f50696e6b73776170526f757465723a20494e56414c49445f5041544800000000604482015290519081900360640190fd5b6111207f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613f6092505050565b9150868260018451038151811061113357fe5b60200260200101511015611192576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a81526020018061544f602a913960400191505060405180910390fd5b611257868660008181106111a257fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff163361123d7f00000000000000000000000000000000000000000000000000000000000000008a8a60008181106111f157fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff168b8b600181811061121b57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff166140c6565b8560008151811061124a57fe5b60200260200101516141b1565b61129682878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250614381915050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836001855103815181106112e257fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561132057600080fd5b505af1158015611334573d6000803e3d6000fd5b50505050611359848360018551038151811061134c57fe5b6020026020010151613cff565b509695505050505050565b60606113917f00000000000000000000000000000000000000000000000000000000000000008484614608565b90505b92915050565b60008060006113ca7f00000000000000000000000000000000000000000000000000000000000000008f8f6140c6565b90506000876113d9578c6113fb565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b604080517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c48101889052905191925073ffffffffffffffffffffffffffffffffffffffff84169163d505accf9160e48082019260009290919082900301818387803b15801561149757600080fd5b505af11580156114ab573d6000803e3d6000fd5b505050506114be8f8f8f8f8f8f8f612d65565b809450819550505050509b509b9950505050505050505050565b6060814281101561154a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f50696e6b73776170526f757465723a2045585049524544000000000000000000604482015290519081900360640190fd5b6115a87f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613f6092505050565b915086826001845103815181106115bb57fe5b6020026020010151101561161a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a81526020018061544f602a913960400191505060405180910390fd5b61162a868660008181106111a257fe5b61135982878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250614381915050565b606081428110156116db57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f50696e6b73776170526f757465723a2045585049524544000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001686867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811061174057fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146117df57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f50696e6b73776170526f757465723a20494e56414c49445f5041544800000000604482015290519081900360640190fd5b61183d7f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061460892505050565b9150868260008151811061184d57fe5b60200260200101511115611192576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806154ec6026913960400191505060405180910390fd5b6000806118fa7f00000000000000000000000000000000000000000000000000000000000000008d7f00000000000000000000000000000000000000000000000000000000000000006140c6565b9050600086611909578b61192b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b604080517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101839052606481018b905260ff8916608482015260a4810188905260c48101879052905191925073ffffffffffffffffffffffffffffffffffffffff84169163d505accf9160e48082019260009290919082900301818387803b1580156119c757600080fd5b505af11580156119db573d6000803e3d6000fd5b505050506119ed8d8d8d8d8d8d6126a2565b9d9c50505050505050505050505050565b8042811015611a6e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f50696e6b73776170526f757465723a2045585049524544000000000000000000604482015290519081900360640190fd5b611afd85856000818110611a7e57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1633611af77f000000000000000000000000000000000000000000000000000000000000000089896000818110611acd57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff168a8a600181811061121b57fe5b8a6141b1565b600085857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110611b2d57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611bc657600080fd5b505afa158015611bda573d6000803e3d6000fd5b505050506040513d6020811015611bf057600080fd5b50516040805160208881028281018201909352888252929350611c32929091899189918291850190849080828437600092019190915250889250614796915050565b86611d368288887fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110611c6557fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231886040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611cfe57600080fd5b505afa158015611d12573d6000803e3d6000fd5b505050506040513d6020811015611d2857600080fd5b50519063ffffffff614b2916565b1015611d8d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a81526020018061544f602a913960400191505060405180910390fd5b5050505050505050565b8042811015611e0757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f50696e6b73776170526f757465723a2045585049524544000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001685857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110611e6c57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611f0b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f50696e6b73776170526f757465723a20494e56414c49445f5041544800000000604482015290519081900360640190fd5b611f1b85856000818110611a7e57fe5b611f59858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250614796915050565b604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905160009173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016916370a0823191602480820192602092909190829003018186803b158015611fe957600080fd5b505afa158015611ffd573d6000803e3d6000fd5b505050506040513d602081101561201357600080fd5b5051905086811015612070576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a81526020018061544f602a913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156120e357600080fd5b505af11580156120f7573d6000803e3d6000fd5b50505050611d8d8482613cff565b6060814281101561217757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f50696e6b73776170526f757465723a2045585049524544000000000000000000604482015290519081900360640190fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16868660008181106121bb57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461225a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f50696e6b73776170526f757465723a20494e56414c49445f5041544800000000604482015290519081900360640190fd5b6122b87f000000000000000000000000000000000000000000000000000000000000000034888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613f6092505050565b915086826001845103815181106122cb57fe5b6020026020010151101561232a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a81526020018061544f602a913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db08360008151811061237357fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b1580156123a657600080fd5b505af11580156123ba573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb61242c7f000000000000000000000000000000000000000000000000000000000000000089896000818110611acd57fe5b8460008151811061243957fe5b60200260200101516040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156124aa57600080fd5b505af11580156124be573d6000803e3d6000fd5b505050506040513d60208110156124d457600080fd5b50516124dc57fe5b61251b82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250614381915050565b5095945050505050565b6000610f44848484614b9b565b606081428110156125a457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f50696e6b73776170526f757465723a2045585049524544000000000000000000604482015290519081900360640190fd5b6126027f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061460892505050565b9150868260008151811061261257fe5b6020026020010151111561161a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806154ec6026913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081565b6000610f44848484614cbf565b6000814281101561271457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f50696e6b73776170526f757465723a2045585049524544000000000000000000604482015290519081900360640190fd5b612743887f00000000000000000000000000000000000000000000000000000000000000008989893089612d65565b604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290519194506127ed92508a91879173ffffffffffffffffffffffffffffffffffffffff8416916370a0823191602480820192602092909190829003018186803b1580156127bc57600080fd5b505afa1580156127d0573d6000803e3d6000fd5b505050506040513d60208110156127e657600080fd5b5051613b22565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561286057600080fd5b505af1158015612874573d6000803e3d6000fd5b505050506113598483613cff565b80428110156128f257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f50696e6b73776170526f757465723a2045585049524544000000000000000000604482015290519081900360640190fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168585600081811061293657fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146129d557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f50696e6b73776170526f757465723a20494e56414c49445f5041544800000000604482015290519081900360640190fd5b60003490507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015612a4257600080fd5b505af1158015612a56573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb612ac87f000000000000000000000000000000000000000000000000000000000000000089896000818110611acd57fe5b836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612b3257600080fd5b505af1158015612b46573d6000803e3d6000fd5b505050506040513d6020811015612b5c57600080fd5b5051612b6457fe5b600086867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110612b9457fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231866040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612c2d57600080fd5b505afa158015612c41573d6000803e3d6000fd5b505050506040513d6020811015612c5757600080fd5b50516040805160208981028281018201909352898252929350612c999290918a918a918291850190849080828437600092019190915250899250614796915050565b87611d368289897fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110612ccc57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231896040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611cfe57600080fd5b6000808242811015612dd857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f50696e6b73776170526f757465723a2045585049524544000000000000000000604482015290519081900360640190fd5b6000612e057f00000000000000000000000000000000000000000000000000000000000000008c8c6140c6565b604080517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff831660248201819052604482018d9052915192935090916323b872dd916064808201926020929091908290030181600087803b158015612e8657600080fd5b505af1158015612e9a573d6000803e3d6000fd5b505050506040513d6020811015612eb057600080fd5b5050604080517f89afcb4400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff888116600483015282516000938493928616926389afcb44926024808301939282900301818787803b158015612f2357600080fd5b505af1158015612f37573d6000803e3d6000fd5b505050506040513d6040811015612f4d57600080fd5b50805160209091015190925090506000612f678e8e614d9f565b5090508073ffffffffffffffffffffffffffffffffffffffff168e73ffffffffffffffffffffffffffffffffffffffff1614612fa4578183612fa7565b82825b90975095508a871015613005576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806154796025913960400191505060405180910390fd5b8986101561305e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806155606025913960400191505060405180910390fd5b505050505097509795505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60606113917f00000000000000000000000000000000000000000000000000000000000000008484613f60565b60008060006131107f00000000000000000000000000000000000000000000000000000000000000008e7f00000000000000000000000000000000000000000000000000000000000000006140c6565b905060008761311f578c613141565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b604080517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c48101889052905191925073ffffffffffffffffffffffffffffffffffffffff84169163d505accf9160e48082019260009290919082900301818387803b1580156131dd57600080fd5b505af11580156131f1573d6000803e3d6000fd5b505050506132038e8e8e8e8e8e610de4565b909f909e509c50505050505050505050505050565b6000806000834281101561328d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f50696e6b73776170526f757465723a2045585049524544000000000000000000604482015290519081900360640190fd5b61329b8c8c8c8c8c8c614ef2565b909450925060006132cd7f00000000000000000000000000000000000000000000000000000000000000008e8e6140c6565b90506132db8d3383886141b1565b6132e78c3383876141b1565b8073ffffffffffffffffffffffffffffffffffffffff16636a627842886040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15801561336657600080fd5b505af115801561337a573d6000803e3d6000fd5b505050506040513d602081101561339057600080fd5b5051949d939c50939a509198505050505050505050565b6000806000834281101561341c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f50696e6b73776170526f757465723a2045585049524544000000000000000000604482015290519081900360640190fd5b61344a8a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c614ef2565b9094509250600061349c7f00000000000000000000000000000000000000000000000000000000000000008c7f00000000000000000000000000000000000000000000000000000000000000006140c6565b90506134aa8b3383886141b1565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b15801561351257600080fd5b505af1158015613526573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb82866040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156135d257600080fd5b505af11580156135e6573d6000803e3d6000fd5b505050506040513d60208110156135fc57600080fd5b505161360457fe5b8073ffffffffffffffffffffffffffffffffffffffff16636a627842886040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15801561368357600080fd5b505af1158015613697573d6000803e3d6000fd5b505050506040513d60208110156136ad57600080fd5b50519250348410156136c5576136c533853403613cff565b505096509650969350505050565b6060814281101561374557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f50696e6b73776170526f757465723a2045585049524544000000000000000000604482015290519081900360640190fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168686600081811061378957fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461382857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f50696e6b73776170526f757465723a20494e56414c49445f5041544800000000604482015290519081900360640190fd5b6138867f00000000000000000000000000000000000000000000000000000000000000008888888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061460892505050565b9150348260008151811061389657fe5b602002602001015111156138f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806154ec6026913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db08360008151811061393e57fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561397157600080fd5b505af1158015613985573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6139f77f000000000000000000000000000000000000000000000000000000000000000089896000818110611acd57fe5b84600081518110613a0457fe5b60200260200101516040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015613a7557600080fd5b505af1158015613a89573d6000803e3d6000fd5b505050506040513d6020811015613a9f57600080fd5b5051613aa757fe5b613ae682878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250614381915050565b81600081518110613af357fe5b602002602001015134111561251b5761251b3383600081518110613b1357fe5b60200260200101513403613cff565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000178152925182516000946060949389169392918291908083835b60208310613bf857805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613bbb565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613c5a576040519150601f19603f3d011682016040523d82523d6000602084013e613c5f565b606091505b5091509150818015613c8d575080511580613c8d5750808060200190516020811015613c8a57600080fd5b50515b613cf857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604482015290519081900360640190fd5b5050505050565b6040805160008082526020820190925273ffffffffffffffffffffffffffffffffffffffff84169083906040518082805190602001908083835b60208310613d7657805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613d39565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613dd8576040519150601f19603f3d011682016040523d82523d6000602084013e613ddd565b606091505b5050905080613e37576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602381526020018061549e6023913960400191505060405180910390fd5b505050565b6000808411613e96576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180615512602a913960400191505060405180910390fd5b600083118015613ea65750600082115b613efb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806154046027913960400191505060405180910390fd5b6000613f0f856103e563ffffffff6151f316565b90506000613f23828563ffffffff6151f316565b90506000613f4983613f3d886103e863ffffffff6151f316565b9063ffffffff61527916565b9050808281613f5457fe5b04979650505050505050565b6060600282511015613fd357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f50696e6b737761704c6962726172793a20494e56414c49445f50415448000000604482015290519081900360640190fd5b815167ffffffffffffffff81118015613feb57600080fd5b50604051908082528060200260200182016040528015614015578160200160208202803683370190505b509050828160008151811061402657fe5b60200260200101818152505060005b60018351038110156140be576000806140788786858151811061405457fe5b602002602001015187866001018151811061406b57fe5b60200260200101516152eb565b9150915061409a84848151811061408b57fe5b60200260200101518383613e3c565b8484600101815181106140a957fe5b60209081029190910101525050600101614035565b509392505050565b60008060006140d58585614d9f565b604080517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501207fff0000000000000000000000000000000000000000000000000000000000000060688401529a90941b9093166069840152607d8301989098527f78ee0c97de2aaecb976bed43c44c0619b5458672edd3ac64adc68a286cf86283609d808401919091528851808403909101815260bd909201909752805196019590952095945050505050565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017815292518251600094606094938a169392918291908083835b6020831061428f57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101614252565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146142f1576040519150601f19603f3d011682016040523d82523d6000602084013e6142f6565b606091505b5091509150818015614324575080511580614324575080806020019051602081101561432157600080fd5b50515b614379576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602481526020018061553c6024913960400191505060405180910390fd5b505050505050565b60005b60018351038110156146025760008084838151811061439f57fe5b60200260200101518584600101815181106143b657fe5b60200260200101519150915060006143ce8383614d9f565b50905060008785600101815181106143e257fe5b602002602001015190506000808373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161461442a5782600061442e565b6000835b91509150600060028a510388106144455788614486565b6144867f0000000000000000000000000000000000000000000000000000000000000000878c8b6002018151811061447957fe5b60200260200101516140c6565b90506144b37f000000000000000000000000000000000000000000000000000000000000000088886140c6565b73ffffffffffffffffffffffffffffffffffffffff1663022c0d9f84848460006040519080825280601f01601f1916602001820160405280156144fd576020820181803683370190505b506040518563ffffffff1660e01b8152600401808581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b83811015614588578181015183820152602001614570565b50505050905090810190601f1680156145b55780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b1580156145d757600080fd5b505af11580156145eb573d6000803e3d6000fd5b505060019099019850614384975050505050505050565b50505050565b606060028251101561467b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f50696e6b737761704c6962726172793a20494e56414c49445f50415448000000604482015290519081900360640190fd5b815167ffffffffffffffff8111801561469357600080fd5b506040519080825280602002602001820160405280156146bd578160200160208202803683370190505b50905082816001835103815181106146d157fe5b602090810291909101015281517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff015b80156140be576000806147318786600186038151811061471d57fe5b602002602001015187868151811061406b57fe5b9150915061475384848151811061474457fe5b60200260200101518383614b9b565b84600185038151811061476257fe5b602090810291909101015250507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01614701565b60005b6001835103811015613e37576000808483815181106147b457fe5b60200260200101518584600101815181106147cb57fe5b60200260200101519150915060006147e38383614d9f565b50905060006148137f000000000000000000000000000000000000000000000000000000000000000085856140c6565b90506000806000808473ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561486157600080fd5b505afa158015614875573d6000803e3d6000fd5b505050506040513d606081101561488b57600080fd5b5080516020909101516dffffffffffffffffffffffffffff918216935016905060008073ffffffffffffffffffffffffffffffffffffffff8a8116908916146148d55782846148d8565b83835b9150915061495d828b73ffffffffffffffffffffffffffffffffffffffff166370a082318a6040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611cfe57600080fd5b955061496a868383613e3c565b9450505050506000808573ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16146149ae578260006149b2565b6000835b91509150600060028c51038a106149c9578a6149fd565b6149fd7f0000000000000000000000000000000000000000000000000000000000000000898e8d6002018151811061447957fe5b60408051600080825260208201928390527f022c0d9f000000000000000000000000000000000000000000000000000000008352602482018781526044830187905273ffffffffffffffffffffffffffffffffffffffff8086166064850152608060848501908152845160a48601819052969750908c169563022c0d9f958a958a958a9591949193919260c486019290918190849084905b83811015614aad578181015183820152602001614a95565b50505050905090810190601f168015614ada5780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b158015614afc57600080fd5b505af1158015614b10573d6000803e3d6000fd5b50506001909b019a506147999950505050505050505050565b8082038281111561139457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f64732d6d6174682d7375622d756e646572666c6f770000000000000000000000604482015290519081900360640190fd5b6000808411614bf5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b8152602001806154c1602b913960400191505060405180910390fd5b600083118015614c055750600082115b614c5a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806154046027913960400191505060405180910390fd5b6000614c7e6103e8614c72868863ffffffff6151f316565b9063ffffffff6151f316565b90506000614c986103e5614c72868963ffffffff614b2916565b9050614cb56001828481614ca857fe5b049063ffffffff61527916565b9695505050505050565b6000808411614d19576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806153e06024913960400191505060405180910390fd5b600083118015614d295750600082115b614d7e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806154046027913960400191505060405180910390fd5b82614d8f858463ffffffff6151f316565b81614d9657fe5b04949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415614e27576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602481526020018061542b6024913960400191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1610614e61578284614e64565b83835b909250905073ffffffffffffffffffffffffffffffffffffffff8216614eeb57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f50696e6b737761704c6962726172793a205a45524f5f41444452455353000000604482015290519081900360640190fd5b9250929050565b604080517fe6a4390500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff888116600483015287811660248301529151600092839283927f00000000000000000000000000000000000000000000000000000000000000009092169163e6a4390591604480820192602092909190829003018186803b158015614f9257600080fd5b505afa158015614fa6573d6000803e3d6000fd5b505050506040513d6020811015614fbc57600080fd5b505173ffffffffffffffffffffffffffffffffffffffff1614156150a257604080517fc9c6539600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a81166004830152898116602483015291517f00000000000000000000000000000000000000000000000000000000000000009092169163c9c65396916044808201926020929091908290030181600087803b15801561507557600080fd5b505af1158015615089573d6000803e3d6000fd5b505050506040513d602081101561509f57600080fd5b50505b6000806150d07f00000000000000000000000000000000000000000000000000000000000000008b8b6152eb565b915091508160001480156150e2575080155b156150f2578793508692506151e6565b60006150ff898484614cbf565b905087811161516c5785811015615161576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806155606025913960400191505060405180910390fd5b8894509250826151e4565b6000615179898486614cbf565b90508981111561518557fe5b878110156151de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806154796025913960400191505060405180910390fd5b94508793505b505b5050965096945050505050565b600081158061520e5750508082028282828161520b57fe5b04145b61139457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f64732d6d6174682d6d756c2d6f766572666c6f77000000000000000000000000604482015290519081900360640190fd5b8082018281101561139457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f64732d6d6174682d6164642d6f766572666c6f77000000000000000000000000604482015290519081900360640190fd5b60008060006152fa8585614d9f565b5090506153088686866140c6565b506000806153178888886140c6565b73ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561535c57600080fd5b505afa158015615370573d6000803e3d6000fd5b505050506040513d606081101561538657600080fd5b5080516020909101516dffffffffffffffffffffffffffff918216935016905073ffffffffffffffffffffffffffffffffffffffff878116908416146153cd5780826153d0565b81815b9099909850965050505050505056fe50696e6b737761704c6962726172793a20494e53554646494349454e545f414d4f554e5450696e6b737761704c6962726172793a20494e53554646494349454e545f4c495155494449545950696e6b737761704c6962726172793a204944454e544943414c5f41444452455353455350696e6b73776170526f757465723a20494e53554646494349454e545f4f55545055545f414d4f554e5450696e6b73776170526f757465723a20494e53554646494349454e545f415f414d4f554e545472616e7366657248656c7065723a204554485f5452414e534645525f4641494c454450696e6b737761704c6962726172793a20494e53554646494349454e545f4f55545055545f414d4f554e5450696e6b73776170526f757465723a204558434553534956455f494e5055545f414d4f554e5450696e6b737761704c6962726172793a20494e53554646494349454e545f494e5055545f414d4f554e545472616e7366657248656c7065723a205452414e534645525f46524f4d5f4641494c454450696e6b73776170526f757465723a20494e53554646494349454e545f425f414d4f554e54a26469706673582212208aadca8ddee0905076884f3e637dc0cbe034a378a2bbe7e74fbed7f5493130bc64736f6c634300060600330000000000000000000000007d2ce25c28334e40f37b2a068ec8d5a59f11ea54000000000000000000000000bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c

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

0000000000000000000000007d2ce25c28334e40f37b2a068ec8d5a59f11ea54000000000000000000000000bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c

-----Decoded View---------------
Arg [0] : _factory (address): 0x7d2ce25c28334e40f37b2a068ec8d5a59f11ea54
Arg [1] : _WETH (address): 0xbb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c

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


Deployed ByteCode Sourcemap

16831:18476:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17308:10;:18;17322:4;17308:18;;17301:26;;;;16831:18476;;12:1:-1;9;2:12;21441:673:0;;5:9:-1;2:2;;;27:1;24;17:12;2:2;21441:673:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;21441:673:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;34255:261;;5:9:-1;2:2;;;27:1;24;17:12;2:2;34255:261:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;34255:261:0;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;28586:846;;5:9:-1;2:2;;;27:1;24;17:12;2:2;28586:846:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;28586:846:0;;;;;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;28586:846:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;28586:846:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;28586:846:0;;-1:-1:-1;28586:846:0;-1:-1:-1;28586:846:0;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;28586:846:0;;;;;;;;;;;;;;;;;35052:252;;5:9:-1;2:2;;;27:1;24;17:12;2:2;35052:252:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;35052:252:0;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;35052:252:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;35052:252:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;35052:252:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;35052:252:0;;-1:-1:-1;35052:252:0;;-1:-1:-1;;;;;35052:252:0:i;22120:675::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;22120:675:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;22120:675:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;25817:625::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;25817:625:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;25817:625:0;;;;;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;25817:625:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;25817:625:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;25817:625:0;;-1:-1:-1;25817:625:0;-1:-1:-1;25817:625:0;;;;;;;;;:::i;27756:824::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;27756:824:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;27756:824:0;;;;;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;27756:824:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;27756:824:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;27756:824:0;;-1:-1:-1;27756:824:0;-1:-1:-1;27756:824:0;;;;;;;;;:::i;24253:716::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;24253:716:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;24253:716:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;31605:712::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;31605:712:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;31605:712:0;;;;;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;31605:712:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;31605:712:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;31605:712:0;;-1:-1:-1;31605:712:0;-1:-1:-1;31605:712:0;;;;;;;;;:::i;33176:840::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;33176:840:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;33176:840:0;;;;;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;33176:840:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;33176:840:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;33176:840:0;;-1:-1:-1;33176:840:0;-1:-1:-1;33176:840:0;;;;;;;;;:::i;27057:693::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;27057:693:0;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;27057:693:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;27057:693:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;27057:693:0;;-1:-1:-1;27057:693:0;-1:-1:-1;27057:693:0;;;;;;;;;:::i;34524:260::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;34524:260:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;34524:260:0;;;;;;;;;;;;:::i;26448:603::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;26448:603:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;26448:603:0;;;;;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;26448:603:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;26448:603:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;26448:603:0;;-1:-1:-1;26448:603:0;-1:-1:-1;26448:603:0;;;;;;;;;:::i;16963:38::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;16963:38:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;34060:187;;5:9:-1;2:2;;;27:1;24;17:12;2:2;34060:187:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;34060:187:0;;;;;;;;;;;;:::i;23547:700::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;23547:700:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;23547:700:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;32323:847::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;32323:847:0;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;32323:847:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;32323:847:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;32323:847:0;;-1:-1:-1;32323:847:0;-1:-1:-1;32323:847:0;;;;;;;;;:::i;20576:859::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;20576:859:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;20576:859:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;16915:41::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;16915:41:0;;;:::i;34792:252::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;34792:252:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;34792:252:0;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;34792:252:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;34792:252:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;34792:252:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;34792:252:0;;-1:-1:-1;34792:252:0;;-1:-1:-1;;;;;34792:252:0:i;22801:667::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;22801:667:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;22801:667:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;18819:736::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;18819:736:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;18819:736:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;19561:972;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;19561:972:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;29438:806::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;29438:806:0;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;29438:806:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;29438:806:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;29438:806:0;;-1:-1:-1;29438:806:0;-1:-1:-1;29438:806:0;;;;;;;;;:::i;21441:673::-;21678:16;21696:14;21659:8;17072:15;17060:8;:27;;17052:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21750:196:::1;21780:5;21800:4;21819:9;21843:14;21872:12;21907:4;21927:8;21750:15;:196::i;:::-;21723:223:::0;;-1:-1:-1;21723:223:0;-1:-1:-1;21957:51:0::1;21985:5:::0;21992:2;21723:223;21957:27:::1;:51::i;:::-;22025:4;22019:20;;;22040:9;22019:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;22019:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;22019:31:0;;;;22061:45;22092:2;22096:9;22061:30;:45::i;:::-;21441:673:::0;;;;;;;;;;:::o;34255:261::-;34408:14;34447:61;34476:8;34486:9;34497:10;34447:28;:61::i;:::-;34440:68;34255:261;-1:-1:-1;;;;34255:261:0:o;28586:846::-;28800:21;28772:8;17072:15;17060:8;:27;;17052:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28847:29:::1;28872:4;28847:29;:4:::0;;28852:15;;;28847:21;;::::1;;;;;;;;;;;;;:29;;;28839:70;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;28930:54;28960:7;28969:8;28979:4;;28930:54;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;28930:29:0::1;::::0;-1:-1:-1;;;28930:54:0:i:1;:::-;28920:64;;29034:12;29003:7;29028:1;29011:7;:14;:18;29003:27;;;;;;;;;;;;;;:43;;28995:98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29104:140;29150:4;;29155:1;29150:7;;;;;;;;;;;;;;;29159:10;29171:50;29195:7;29204:4;;29209:1;29204:7;;;;;;;;;;;;;;;29213:4;;29218:1;29213:7;;;;;;;;;;;;;;;29171:23;:50::i;:::-;29223:7;29231:1;29223:10;;;;;;;;;;;;;;29104:31;:140::i;:::-;29255:35;29261:7;29270:4;;29255:35;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;29284:4:0::1;::::0;-1:-1:-1;29255:5:0::1;::::0;-1:-1:-1;;29255:35:0:i:1;:::-;29307:4;29301:20;;;29322:7;29347:1;29330:7;:14;:18;29322:27;;;;;;;;;;;;;;29301:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;29301:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;29301:49:0;;;;29361:63;29392:2;29396:7;29421:1;29404:7;:14;:18;29396:27;;;;;;;;;;;;;;29361:30;:63::i;:::-;28586:846:::0;;;;;;;;;:::o;35052:252::-;35196:21;35242:54;35271:7;35280:9;35291:4;35242:28;:54::i;:::-;35235:61;;35052:252;;;;;:::o;22120:675::-;22426:12;22440;22465;22480:48;22504:7;22513:6;22521;22480:23;:48::i;:::-;22465:63;;22539:10;22552;:33;;22576:9;22552:33;;;22570:2;22552:33;22596:79;;;;;;22623:10;22596:79;;;;22643:4;22596:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22539:46;;-1:-1:-1;22596:26:0;;;;;;:79;;;;;-1:-1:-1;;22596:79:0;;;;;;;;-1:-1:-1;22596:26:0;:79;;;2:2:-1;;;;27:1;24;17:12;2:2;22596:79:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22596:79:0;;;;22707:80;22723:6;22731;22739:9;22750:10;22762;22774:2;22778:8;22707:15;:80::i;:::-;22686:101;;;;;;;;22120:675;;;;;;;;;;;;;;;;:::o;25817:625::-;26041:21;26022:8;17072:15;17060:8;:27;;17052:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26085:54:::1;26115:7;26124:8;26134:4;;26085:54;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;26085:29:0::1;::::0;-1:-1:-1;;;26085:54:0:i:1;:::-;26075:64;;26189:12;26158:7;26183:1;26166:7;:14;:18;26158:27;;;;;;;;;;;;;;:43;;26150:98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26259:140;26305:4;;26310:1;26305:7;;;;;;26259:140;26410:24;26416:7;26425:4;;26410:24;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;26431:2:0;;-1:-1:-1;26410:5:0::1;::::0;-1:-1:-1;;26410:24:0:i:1;27756:824::-:0;27970:21;27942:8;17072:15;17060:8;:27;;17052:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28017:29:::1;28042:4;28017:29;:4:::0;;28022:15;;;28017:21;;::::1;;;;;;;;;;;;;:29;;;28009:70;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;28100:54;28129:7;28138:9;28149:4;;28100:54;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;28100:28:0::1;::::0;-1:-1:-1;;;28100:54:0:i:1;:::-;28090:64;;28187:11;28173:7;28181:1;28173:10;;;;;;;;;;;;;;:25;;28165:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24253:716:::0;24571:14;24598:12;24613:45;24637:7;24646:5;24653:4;24613:23;:45::i;:::-;24598:60;;24669:10;24682;:33;;24706:9;24682:33;;;24700:2;24682:33;24726:79;;;;;;24753:10;24726:79;;;;24773:4;24726:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24669:46;;-1:-1:-1;24726:26:0;;;;;;:79;;;;;-1:-1:-1;;24726:79:0;;;;;;;;-1:-1:-1;24726:26:0;:79;;;2:2:-1;;;;27:1;24;17:12;2:2;24726:79:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24726:79:0;;;;24828:133;24890:5;24897:9;24908:14;24924:12;24938:2;24942:8;24828:47;:133::i;:::-;24816:145;24253:716;-1:-1:-1;;;;;;;;;;;;;24253:716:0:o;31605:712::-;31839:8;17072:15;17060:8;:27;;17052:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31860:138:::1;31906:4;;31911:1;31906:7;;;;;;;;;;;;;;;31915:10;31927:50;31951:7;31960:4;;31965:1;31960:7;;;;;;;;;;;;;;;31969:4;;31974:1;31969:7;;;;;;31927:50;31979:8;31860:31;:138::i;:::-;32009:18;32037:4:::0;;32042:15;;;32037:21;;::::1;;;;;;;;;;;;;32030:39;;;32070:2;32030:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;32030:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;32030:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;32030:43:0;32084:44:::1;::::0;;32030:43:::1;32084:44:::0;;::::1;::::0;;;;;;;;;;;32030:43;;-1:-1:-1;32084:44:0::1;::::0;;;32119:4;;;;;;32084:44;::::1;::::0;32119:4;;32084:44;32119:4;32084:44;1:33:-1::1;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;32125:2:0;;-1:-1:-1;32084:34:0::1;::::0;-1:-1:-1;;32084:44:0:i:1;:::-;32227:12:::0;32161:62:::1;32209:13:::0;32168:4;;32173:15;;;32168:21;;::::1;;;;;;;;;;;;;32161:39;;;32201:2;32161:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;32161:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;32161:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;32161:43:0;;:62:::1;:47;:62;:::i;:::-;:78;;32139:170;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17126:1;31605:712:::0;;;;;;;:::o;33176:840::-;33443:8;17072:15;17060:8;:27;;17052:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33477:29:::1;33502:4;33477:29;:4:::0;;33482:15;;;33477:21;;::::1;;;;;;;;;;;;;:29;;;33469:70;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;33550:138;33596:4;;33601:1;33596:7;;;;;;33550:138;33699:55;33734:4;;33699:55;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;33748:4:0::1;::::0;-1:-1:-1;33699:34:0::1;::::0;-1:-1:-1;;33699:55:0:i:1;:::-;33782:37;::::0;;;;;33813:4:::1;33782:37;::::0;::::1;::::0;;;33765:14:::1;::::0;33782:22:::1;33789:4;33782:22;::::0;::::1;::::0;:37;;;;;::::1;::::0;;;;;;;;;:22;:37;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;33782:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;33782:37:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;33782:37:0;;-1:-1:-1;33838:25:0;;::::1;;33830:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33927:4;33921:20;;;33942:9;33921:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;33921:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;33921:31:0;;;;33963:45;33994:2;33998:9;33963:30;:45::i;27057:693::-:0;27273:21;27245:8;17072:15;17060:8;:27;;17052:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27331:4:::1;27320:15;;:4;;27325:1;27320:7;;;;;;;;;;;;;;;:15;;;27312:56;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;27389:55;27419:7;27428:9;27439:4;;27389:55;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;27389:29:0::1;::::0;-1:-1:-1;;;27389:55:0:i:1;:::-;27379:65;;27494:12;27463:7;27488:1;27471:7;:14;:18;27463:27;;;;;;;;;;;;;;:43;;27455:98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27570:4;27564:19;;;27591:7;27599:1;27591:10;;;;;;;;;;;;;;27564:40;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;27564:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;27564:40:0;;;;;27628:4;27622:20;;;27643:50;27667:7;27676:4;;27681:1;27676:7;;;;;;27643:50;27695:7;27703:1;27695:10;;;;;;;;;;;;;;27622:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;27622:84:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;27622:84:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;27622:84:0;27615:92:::1;;;;27718:24;27724:7;27733:4;;27718:24;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;27739:2:0;;-1:-1:-1;27718:5:0::1;::::0;-1:-1:-1;;27718:24:0:i:1;:::-;27057:693:::0;;;;;;;;:::o;34524:260::-;34677:13;34715:61;34743:9;34754;34765:10;34715:27;:61::i;26448:603::-;26672:21;26653:8;17072:15;17060:8;:27;;17052:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26716:54:::1;26745:7;26754:9;26765:4;;26716:54;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;26716:28:0::1;::::0;-1:-1:-1;;;26716:54:0:i:1;:::-;26706:64;;26803:11;26789:7;26797:1;26789:10;;;;;;;;;;;;;;:25;;26781:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16963:38:::0;;;:::o;34060:187::-;34157:12;34189:50;34211:7;34220:8;34230;34189:21;:50::i;23547:700::-;23813:14;23794:8;17072:15;17060:8;:27;;17052:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23856:196:::1;23886:5;23906:4;23925:9;23949:14;23978:12;24013:4;24033:8;23856:15;:196::i;:::-;24102:38;::::0;;;;;24134:4:::1;24102:38;::::0;::::1;::::0;;;23840:212;;-1:-1:-1;24063:78:0::1;::::0;-1:-1:-1;24091:5:0;;24098:2;;24102:23:::1;::::0;::::1;::::0;::::1;::::0;:38;;;;;::::1;::::0;;;;;;;;;:23;:38;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;24102:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;24102:38:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;24102:38:0;24063:27:::1;:78::i;:::-;24158:4;24152:20;;;24173:9;24152:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;24152:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;24152:31:0;;;;24194:45;24225:2;24229:9;24194:30;:45::i;32323:847::-:0;32583:8;17072:15;17060:8;:27;;17052:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32628:4:::1;32617:15;;:4;;32622:1;32617:7;;;;;;;;;;;;;;;:15;;;32609:56;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;32676:13;32692:9;32676:25;;32718:4;32712:19;;;32739:8;32712:38;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;32712:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;32712:38:0;;;;;32774:4;32768:20;;;32789:50;32813:7;32822:4;;32827:1;32822:7;;;;;;32789:50;32841:8;32768:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;32768:82:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;32768:82:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;32768:82:0;32761:90:::1;;;;32862:18;32890:4:::0;;32895:15;;;32890:21;;::::1;;;;;;;;;;;;;32883:39;;;32923:2;32883:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;32883:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;32883:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;32883:43:0;32937:44:::1;::::0;;32883:43:::1;32937:44:::0;;::::1;::::0;;;;;;;;;;;32883:43;;-1:-1:-1;32937:44:0::1;::::0;;;32972:4;;;;;;32937:44;::::1;::::0;32972:4;;32937:44;32972:4;32937:44;1:33:-1::1;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;32978:2:0;;-1:-1:-1;32937:34:0::1;::::0;-1:-1:-1;;32937:44:0:i:1;:::-;33080:12:::0;33014:62:::1;33062:13:::0;33021:4;;33026:15;;;33021:21;;::::1;;;;;;;;;;;;;33014:39;;;33054:2;33014:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;20576:859:0::0;20830:12;20844;20811:8;17072:15;17060:8;:27;;17052:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20869:12:::1;20884:48;20908:7;20917:6;20925;20884:23;:48::i;:::-;20943:61;::::0;;;;;20976:10:::1;20943:61;::::0;::::1;::::0;:32:::1;::::0;::::1;:61:::0;;;;;;;;;;;;;;20869:63;;-1:-1:-1;20943:32:0;;::::1;::::0;:61;;;;;::::1;::::0;;;;;;;;;-1:-1:-1;20943:32:0;:61;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;20943:61:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;20943:61:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;;21072:28:0::1;::::0;;;;;:24:::1;:28:::0;;::::1;;::::0;::::1;::::0;;;21042:12:::1;::::0;;;21072:24;;::::1;::::0;::::1;::::0;:28;;;;;;;;;;;21042:12;21072:24;:28;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;21072:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;21072:28:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;21072:28:0;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;21072:28:0;-1:-1:-1;21112:14:0::1;21131:42;21158:6:::0;21166;21131:26:::1;:42::i;:::-;21111:62;;;21215:6;21205:16;;:6;:16;;;:58;;21246:7;21255;21205:58;;;21225:7;21234;21205:58;21184:79:::0;;-1:-1:-1;21184:79:0;-1:-1:-1;21282:21:0;;::::1;;21274:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21375:10;21364:7;:21;;21356:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17126:1;;;;20576:859:::0;;;;;;;;;;;:::o;16915:41::-;;;:::o;34792:252::-;34936:21;34982:54;35012:7;35021:8;35031:4;34982:29;:54::i;22801:667::-;23090:16;23108:14;23135:12;23150:45;23174:7;23183:5;23190:4;23150:23;:45::i;:::-;23135:60;;23206:10;23219;:33;;23243:9;23219:33;;;23237:2;23219:33;23263:79;;;;;;23290:10;23263:79;;;;23310:4;23263:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23206:46;;-1:-1:-1;23263:26:0;;;;;;:79;;;;;-1:-1:-1;;23263:79:0;;;;;;;;-1:-1:-1;23263:26:0;:79;;;2:2:-1;;;;27:1;24;17:12;2:2;23263:79:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23263:79:0;;;;23380:80;23399:5;23406:9;23417:14;23433:12;23447:2;23451:8;23380:18;:80::i;:::-;23353:107;;;;-1:-1:-1;22801:667:0;-1:-1:-1;;;;;;;;;;;;;22801:667:0:o;18819:736::-;19107:12;19121;19135:14;19088:8;17072:15;17060:8;:27;;17052:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19183:85:::1;19197:6;19205;19213:14;19229;19245:10;19257;19183:13;:85::i;:::-;19162:106:::0;;-1:-1:-1;19162:106:0;-1:-1:-1;19279:12:0::1;19294:48;19318:7;19327:6:::0;19335;19294:23:::1;:48::i;:::-;19279:63;;19353:66;19385:6;19393:10;19405:4;19411:7;19353:31;:66::i;:::-;19430;19462:6;19470:10;19482:4;19488:7;19430:31;:66::i;:::-;19533:4;19519:24;;;19544:2;19519:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;19519:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;19519:28:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;19519:28:0;18819:736;;;;-1:-1:-1;19519:28:0;;-1:-1:-1;18819:736:0;;-1:-1:-1;;;;;;;;;18819:736:0:o;19561:972::-;19814:16;19832:14;19848;19795:8;17072:15;17060:8;:27;;17052:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19902:176:::1;19930:5;19950:4;19969:18;20002:9;20026:14;20055:12;19902:13;:176::i;:::-;19875:203:::0;;-1:-1:-1;19875:203:0;-1:-1:-1;20089:12:0::1;20104:45;20128:7;20137:5:::0;20144:4:::1;20104:23;:45::i;:::-;20089:60;;20160:69;20192:5;20199:10;20211:4;20217:11;20160:31;:69::i;:::-;20246:4;20240:19;;;20267:9;20240:39;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;20240:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;20240:39:0;;;;;20303:4;20297:20;;;20318:4;20324:9;20297:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;20297:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;20297:37:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;20297:37:0;20290:45:::1;;;;20372:4;20358:24;;;20383:2;20358:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;20358:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;20358:28:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;20358:28:0;;-1:-1:-1;20437:9:0::1;:21:::0;-1:-1:-1;20433:92:0::1;;;20460:65;20491:10;20515:9;20503;:21;20460:30;:65::i;:::-;17126:1;19561:972:::0;;;;;;;;;;;:::o;29438:806::-;29651:21;29623:8;17072:15;17060:8;:27;;17052:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29709:4:::1;29698:15;;:4;;29703:1;29698:7;;;;;;;;;;;;;;;:15;;;29690:56;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;29767:54;29796:7;29805:9;29816:4;;29767:54;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;29767:28:0::1;::::0;-1:-1:-1;;;29767:54:0:i:1;:::-;29757:64;;29854:9;29840:7;29848:1;29840:10;;;;;;;;;;;;;;:23;;29832:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29923:4;29917:19;;;29944:7;29952:1;29944:10;;;;;;;;;;;;;;29917:40;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;29917:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;29917:40:0;;;;;29981:4;29975:20;;;29996:50;30020:7;30029:4;;30034:1;30029:7;;;;;;29996:50;30048:7;30056:1;30048:10;;;;;;;;;;;;;;29975:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;29975:84:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;29975:84:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;29975:84:0;29968:92:::1;;;;30071:24;30077:7;30086:4;;30071:24;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;30092:2:0;;-1:-1:-1;30071:5:0::1;::::0;-1:-1:-1;;30071:24:0:i:1;:::-;30158:7;30166:1;30158:10;;;;;;;;;;;;;;30146:9;:22;30142:94;;;30170:66;30201:10;30225:7;30233:1;30225:10;;;;;;;;;;;;;;30213:9;:22;30170:30;:66::i;14707:361::-:0;14902:45;;;14891:10;14902:45;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;14902:45:0;;;;;;;25:18:-1;;61:17;;96:58;182:15;14902:45:0;179:29:-1;160:49;;14891:57:0;;;;14856:12;;14870:17;;14891:10;;;;14902:45;14891:57;;;25:18:-1;14891:57:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;14891:57:0;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;14855:93:0;;;;14967:7;:57;;;;-1:-1:-1;14979:11:0;;:16;;:44;;;15010:4;14999:24;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;14999:24:0;14979:44;14959:101;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14707:361;;;;;:::o;15486:195::-;15594:12;;;15556;15594;;;;;;;;;15573:7;;;;15587:5;;15573:34;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;15573:34:0;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;15555:52:0;;;15626:7;15618:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15486:195;;;:::o;10375:515::-;10468:14;10514:1;10503:8;:12;10495:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10593:1;10581:9;:13;:31;;;;;10611:1;10598:10;:14;10581:31;10573:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10667:20;10690:17;:8;10703:3;10690:17;:12;:17;:::i;:::-;10667:40;-1:-1:-1;10718:14:0;10735:31;10667:40;10755:10;10735:31;:19;:31;:::i;:::-;10718:48;-1:-1:-1;10777:16:0;10796:40;10820:15;10796:19;:9;10810:4;10796:19;:13;:19;:::i;:::-;:23;:40;:23;:40;:::i;:::-;10777:59;;10871:11;10859:9;:23;;;;;;;10375:515;-1:-1:-1;;;;;;;10375:515:0:o;11563:510::-;11664:21;11721:1;11706:4;:11;:16;;11698:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11788:4;:11;11777:23;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;11777:23:0;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;;-1:-1;11777:23:0;;11767:33;;11824:8;11811:7;11819:1;11811:10;;;;;;;;;;;;;:21;;;;;11848:6;11843:223;11874:1;11860:4;:11;:15;11856:1;:19;11843:223;;;11898:14;11914:15;11933:42;11945:7;11954:4;11959:1;11954:7;;;;;;;;;;;;;;11963:4;11968:1;11972;11968:5;11963:11;;;;;;;;;;;;;;11933;:42::i;:::-;11897:78;;;;12007:47;12020:7;12028:1;12020:10;;;;;;;;;;;;;;12032:9;12043:10;12007:12;:47::i;:::-;11990:7;11998:1;12002;11998:5;11990:14;;;;;;;;;;;;;;;;;:64;-1:-1:-1;;11877:3:0;;11843:223;;;;11563:510;;;;;:::o;8852:478::-;8941:12;8967:14;8983;9001:26;9012:6;9020;9001:10;:26::i;:::-;9165:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22::-1;26:21;;;22:32;6:49;;9165:32:0;;;;;9155:43;;;;;;9068:251;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;9068:251:0;;;;;;;9058:262;;;;;;;;;8852:478;-1:-1:-1;;;;;8852:478:0:o;15076:402::-;15301:51;;;15290:10;15301:51;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;15301:51:0;;;;;;;25:18:-1;;61:17;;96:58;182:15;15301:51:0;179:29:-1;160:49;;15290:63:0;;;;15255:12;;15269:17;;15290:10;;;;15301:51;15290:63;;;25:18:-1;15290:63:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;15290:63:0;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;15254:99:0;;;;15372:7;:57;;;;-1:-1:-1;15384:11:0;;:16;;:44;;;15415:4;15404:24;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;15404:24:0;15384:44;15364:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15076:402;;;;;;:::o;25080:731::-;25187:6;25182:622;25213:1;25199:4;:11;:15;25195:1;:19;25182:622;;;25237:13;25252:14;25271:4;25276:1;25271:7;;;;;;;;;;;;;;25280:4;25285:1;25289;25285:5;25280:11;;;;;;;;;;;;;;25236:56;;;;25308:14;25327:41;25354:5;25361:6;25327:26;:41::i;:::-;25307:61;;;25383:14;25400:7;25408:1;25412;25408:5;25400:14;;;;;;;;;;;;;;25383:31;;25430:15;25447;25475:6;25466:15;;:5;:15;;;:61;;25508:9;25524:1;25466:61;;;25490:1;25494:9;25466:61;25429:98;;;;25542:10;25573:1;25559:4;:11;:15;25555:1;:19;:81;;25633:3;25555:81;;;25577:53;25601:7;25610:6;25618:4;25623:1;25627;25623:5;25618:11;;;;;;;;;;;;;;25577:23;:53::i;:::-;25542:94;;25665:47;25689:7;25698:5;25705:6;25665:23;:47::i;:::-;25651:67;;;25737:10;25749;25761:2;25775:1;25765:12;;;;;;;;;;;;;;;;;;;;;;;;;21:6:-1;;108:14;25765:12:0;87:42:-1;143:17;;-1:-1;25765:12:0;;25651:141;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;25651:141:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;25651:141:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;25216:3:0;;;;;-1:-1:-1;25182:622:0;;-1:-1:-1;;;;;;;;25182:622:0;;;25080:731;;;:::o;12154:531::-;12255:21;12312:1;12297:4;:11;:16;;12289:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12379:4;:11;12368:23;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;12368:23:0;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;;-1:-1;12368:23:0;;12358:33;;12432:9;12402:7;12427:1;12410:7;:14;:18;12402:27;;;;;;;;;;;;;;;;;:39;12466:11;;:15;;12452:226;12483:5;;12452:226;;12511:14;12527:15;12546:42;12558:7;12567:4;12576:1;12572;:5;12567:11;;;;;;;;;;;;;;12580:4;12585:1;12580:7;;;;;;;12546:42;12510:78;;;;12620:46;12632:7;12640:1;12632:10;;;;;;;;;;;;;;12644:9;12655:10;12620:11;:46::i;:::-;12603:7;12615:1;12611;:5;12603:14;;;;;;;;;;;;;;;;;:63;-1:-1:-1;;12490:3:0;;12452:226;;30391:1208;30504:6;30499:1093;30530:1;30516:4;:11;:15;30512:1;:19;30499:1093;;;30554:13;30569:14;30588:4;30593:1;30588:7;;;;;;;;;;;;;;30597:4;30602:1;30606;30602:5;30597:11;;;;;;;;;;;;;;30553:56;;;;30625:14;30644:41;30671:5;30678:6;30644:26;:41::i;:::-;30624:61;;;30700:18;30735:47;30759:7;30768:5;30775:6;30735:23;:47::i;:::-;30700:83;;30798:16;30829:17;30917:13;30932;30950:4;:16;;;:18;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;30950:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30950:18:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;30950:18:0;;;;;;;30916:52;;;;;-1:-1:-1;30916:52:0;;-1:-1:-1;30984:17:0;;31025:15;;;;;;;;:61;;31067:8;31077;31025:61;;;31044:8;31054;31025:61;30983:103;;;;31115:56;31158:12;31122:5;31115:23;;;31147:4;31115:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;31115:56:0;31101:70;;31201;31230:11;31243:12;31257:13;31201:28;:70::i;:::-;31186:85;;30499:1093;;;;31302:15;31319;31347:6;31338:15;;:5;:15;;;:67;;31383:12;31402:1;31338:67;;;31362:1;31366:12;31338:67;31301:104;;;;31420:10;31451:1;31437:4;:11;:15;31433:1;:19;:81;;31511:3;31433:81;;;31455:53;31479:7;31488:6;31496:4;31501:1;31505;31501:5;31496:11;;;;;;;31455:53;31567:12;;;31577:1;31567:12;;;;;;;;;;31529:51;;;;;;;;;;;;;;;:9;:51;;;;;;;;;;;;;;;;;;;;;;31420:94;;-1:-1:-1;31529:9:0;;;;;;31539:10;;31551;;31420:94;;31567:12;;31529:51;;;;;;;;31567:12;;31529:51;;;;31567:12;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;31529:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;31529:51:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;30533:3:0;;;;;-1:-1:-1;30499:1093:0;;-1:-1:-1;;;;;;;;;;30499:1093:0;7766:129;7850:5;;;7845:16;;;;7837:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11011:470;11104:13;11150:1;11138:9;:13;11130:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11230:1;11218:9;:13;:31;;;;;11248:1;11235:10;:14;11218:31;11210:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11304:14;11321:34;11350:4;11321:24;:9;11335;11321:24;:13;:24;:::i;:::-;:28;:34;:28;:34;:::i;:::-;11304:51;-1:-1:-1;11366:16:0;11385:34;11415:3;11385:25;:10;11400:9;11385:25;:14;:25;:::i;:34::-;11366:53;;11441:32;11471:1;11454:11;11442:9;:23;;;;;;;11441:32;:29;:32;:::i;:::-;11430:43;11011:470;-1:-1:-1;;;;;;11011:470:0:o;9934:319::-;10016:12;10059:1;10049:7;:11;10041:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10131:1;10120:8;:12;:28;;;;;10147:1;10136:8;:12;10120:28;10112:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10237:8;10213:21;:7;10225:8;10213:21;:11;:21;:::i;:::-;:32;;;;;;;9934:319;-1:-1:-1;;;;9934:319:0:o;8413:347::-;8488:14;8504;8549:6;8539:16;;:6;:16;;;;8531:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8635:6;8626:15;;:6;:15;;;:53;;8664:6;8672;8626:53;;;8645:6;8653;8626:53;8607:72;;-1:-1:-1;8607:72:0;-1:-1:-1;8698:20:0;;;8690:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8413:347;;;;;:::o;17430:1383::-;17743:49;;;;;;:63;:49;;;;;;;;;;;;;;;;17648:12;;;;;;17760:7;17743:33;;;;;;:49;;;;;;;;;;;;;;;:33;:49;;;2:2:-1;;;;27:1;24;17:12;2:2;17743:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;17743:49:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;17743:49:0;:63;;;17739:148;;;17823:52;;;;;;:36;:52;;;;;;;;;;;;;;;;17840:7;17823:36;;;;;;:52;;;;;;;;;;;;;;;-1:-1:-1;17823:36:0;:52;;;2:2:-1;;;;27:1;24;17:12;2:2;17823:52:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;17823:52:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;17739:148:0;17898:13;17913;17930:52;17958:7;17967:6;17975;17930:27;:52::i;:::-;17897:85;;;;17997:8;18009:1;17997:13;:30;;;;-1:-1:-1;18014:13:0;;17997:30;17993:813;;;18066:14;;-1:-1:-1;18082:14:0;;-1:-1:-1;17993:813:0;;;18130:19;18152:57;18174:14;18190:8;18200;18152:21;:57::i;:::-;18130:79;;18246:14;18228;:32;18224:571;;18307:10;18289:14;:28;;18281:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18400:14;;-1:-1:-1;18416:14:0;-1:-1:-1;18416:14:0;18224:571;;;18472:19;18494:57;18516:14;18532:8;18542;18494:21;:57::i;:::-;18472:79;;18595:14;18577;:32;;18570:40;;;;18655:10;18637:14;:28;;18629:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18748:14;-1:-1:-1;18764:14:0;;-1:-1:-1;18224:571:0;17993:813;;17430:1383;;;;;;;;;;;:::o;7903:142::-;7955:6;7982;;;:30;;-1:-1:-1;;7997:5:0;;;8011:1;8006;7997:5;8006:1;7992:15;;;;;:20;7982:30;7974:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7630:128;7714:5;;;7709:16;;;;7701:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9388:433;9481:13;9496;9523:14;9542:26;9553:6;9561;9542:10;:26::i;:::-;9522:46;;;9579:32;9587:7;9596:6;9604;9579:7;:32::i;:::-;;9623:13;9638;9670:32;9678:7;9687:6;9695;9670:7;:32::i;:::-;9656:59;;;:61;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;9656:61:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;9656:61:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;9656:61:0;;;;;;;9622:95;;;;;-1:-1:-1;9622:95:0;;-1:-1:-1;9751:16:0;;;;;;;;:62;;9794:8;9804;9751:62;;;9771:8;9781;9751:62;9728:85;;;;-1:-1:-1;9388:433:0;-1:-1:-1;;;;;;;9388:433:0:o

Swarm Source

ipfs://8aadca8ddee0905076884f3e637dc0cbe034a378a2bbe7e74fbed7f5493130bc
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.