Contract 0x52c520ddc9d88a9a3e554a574b31caa9c0932c57

Contract Overview

Balance:
0 CRO

CRO Value:
$0.00

Token:
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x871176dc93e8e8607afc38027a4c309bca68fef69520c69ac67df301c9562c5cAdd Liquidity ET...58289182022-12-02 9:50:1136 mins ago0x94cb3159cc978fef1ff0e426e6eef16e330a512b IN  0x52c520ddc9d88a9a3e554a574b31caa9c0932c5720.99036077293766 CRO1.0240130125530
0xc32b53504d4f8f852be569e3c0fec43c1ac91bec83129ff06c81c6ad5abd40c9Swap Exact Token...58256242022-12-02 4:38:505 hrs 48 mins ago0xa90cb4d9c204333a8fde00cf3177ffbb205edac7 IN  0x52c520ddc9d88a9a3e554a574b31caa9c0932c570 CRO1.3143568689120
0x4de20a820a67eb38eb7a66cc16e21e02c946fea56af51bcf0a78818b1ef37a06Swap Exact Token...58248732022-12-02 3:27:486 hrs 59 mins ago0x0f57ef1147705d5ddc3591093f086f6e027550bb IN  0x52c520ddc9d88a9a3e554a574b31caa9c0932c570 CRO0.6842810305050
0xc853f807f65a87b2b255c343f3db63c21be033059de52704773239383a4c50fbSwap Exact Token...58248292022-12-02 3:23:397 hrs 3 mins ago0x68c15f32e1ef32da79ced1437fce8043817de24e IN  0x52c520ddc9d88a9a3e554a574b31caa9c0932c570 CRO1.621380
0xcd37eb6176d195b5b8483b40f4b15cc3f3728ef0cadaac26befc97b035733a7fSwap ETH For Exa...58219962022-12-01 22:55:2611 hrs 31 mins ago0xf2ef64f71b82af0883aeb3c47cb3f38ed567c217 IN  0x52c520ddc9d88a9a3e554a574b31caa9c0932c57101.999938509650234 CRO3.702834 6,000
0x24f72078fd95cca5d4471f937fae0618ab2d53256891a57164e2f2b7f3d29cc7Swap Exact Token...58208922022-12-01 21:10:4313 hrs 16 mins ago0x1428ae187d7b06a3ddfb2e6d0208176a9b0bc995 IN  0x52c520ddc9d88a9a3e554a574b31caa9c0932c570 CRO1.3144739106860
0xd1667e9e326920e31876f1d7c86274518f185e154b703b0aaecdc77ec81768e7Swap Exact ETH F...58207872022-12-01 21:00:4013 hrs 26 mins ago0xfb954737c1538f64a993effa0995be6d69246a82 IN  0x52c520ddc9d88a9a3e554a574b31caa9c0932c57100 CRO1.1280272397680
0xaa73efc79a15eaed1892092d07ce545e7912671e65ac7a53170e48abfad9ef20Swap Exact Token...58207812022-12-01 21:00:0613 hrs 26 mins ago0xfb954737c1538f64a993effa0995be6d69246a82 IN  0x52c520ddc9d88a9a3e554a574b31caa9c0932c570 CRO0.7414383789560
0xa49e02c13d35179841b68157c848b258b1ff3bab2312043e2d9e970fb6654208Swap Tokens For ...58207682022-12-01 20:58:5213 hrs 28 mins ago0xfb954737c1538f64a993effa0995be6d69246a82 IN  0x52c520ddc9d88a9a3e554a574b31caa9c0932c570 CRO1.1362529354020
0xef9d99cd729c1d52f10af0b27573bfc4a3f6f1d315300835154c6a04cd12e37eSwap Exact ETH F...58207632022-12-01 20:58:2413 hrs 28 mins ago0xfb954737c1538f64a993effa0995be6d69246a82 IN  0x52c520ddc9d88a9a3e554a574b31caa9c0932c57100 CRO1.1280274787550
0x45df0695a604734a2375ee0c840ee91243b8f166caf0e992e4f865ed833ea542Swap Exact Token...58200302022-12-01 19:49:0214 hrs 37 mins ago0x9c724542e87784fab7b6efad08e8bc03e27fbabd IN  0x52c520ddc9d88a9a3e554a574b31caa9c0932c570 CRO0.98476 7,000
0x0daad029f41c022826625be74b929e541a8939812400ac32898adb0a25d4a127Swap Tokens For ...58200192022-12-01 19:47:5914 hrs 39 mins ago0x9c724542e87784fab7b6efad08e8bc03e27fbabd IN  0x52c520ddc9d88a9a3e554a574b31caa9c0932c570 CRO1.635137 7,000
0x7bafa0a9c8ad180d6b0834b1af8b049889acd464f3f27e68c92f9bf88fa1868dRemove Liquidity...58195892022-12-01 19:07:1315 hrs 19 mins ago0x9e43251d8fab9cc2e00b2af820f535adb03cea2a IN  0x52c520ddc9d88a9a3e554a574b31caa9c0932c570 CRO6.11196 6,000
0x0e14a3e9e705235f1840bd8cc12300259c2a7153a84fccccfb9e70d453f3a4e7Remove Liquidity...58195842022-12-01 19:06:4415 hrs 20 mins ago0x9e43251d8fab9cc2e00b2af820f535adb03cea2a IN  0x52c520ddc9d88a9a3e554a574b31caa9c0932c570 CRO6.107124 6,000
0x21881260375386281db15e9abe081e14a34fe4bd10454dc73aa49d9f23821dccRemove Liquidity...58195752022-12-01 19:05:5315 hrs 21 mins ago0x9e43251d8fab9cc2e00b2af820f535adb03cea2a IN  0x52c520ddc9d88a9a3e554a574b31caa9c0932c570 CRO6.095352 6,000
0xf44ec9d75b514a8ab4dfd0a786028816c871878233bdd631d59b990079591667Remove Liquidity...58195612022-12-01 19:04:3415 hrs 22 mins ago0x9e43251d8fab9cc2e00b2af820f535adb03cea2a IN  0x52c520ddc9d88a9a3e554a574b31caa9c0932c570 CRO6.090588 6,000
0xe2142e3a2561a29439b6271fbacc614d2537126852c02620dc8cde78434d8a4eRemove Liquidity...58195552022-12-01 19:04:0115 hrs 22 mins ago0x9e43251d8fab9cc2e00b2af820f535adb03cea2a IN  0x52c520ddc9d88a9a3e554a574b31caa9c0932c570 CRO6.113412 6,000
0xf21299f371a08162d25e6cdb6e31aeacc1c4baafce6ada253a38ae4861805f64Remove Liquidity...58195492022-12-01 19:03:2615 hrs 23 mins ago0x9e43251d8fab9cc2e00b2af820f535adb03cea2a IN  0x52c520ddc9d88a9a3e554a574b31caa9c0932c570 CRO6.108576 6,000
0xcb701dd653e64db0a29608079f2117619522ad7e22d2f969646daa005ad49db0Swap Exact Token...58192952022-12-01 18:39:1815 hrs 47 mins ago0x98e295b5a473db68335748d95fe363f2decd6b44 IN  0x52c520ddc9d88a9a3e554a574b31caa9c0932c570 CRO0.87327 6,000
0xee233b201aa87e999e26c49c491efdb0cc71b91d3babb34613c6d3437220d262Swap Exact Token...58192562022-12-01 18:35:3415 hrs 51 mins ago0x98e295b5a473db68335748d95fe363f2decd6b44 IN  0x52c520ddc9d88a9a3e554a574b31caa9c0932c570 CRO0.87327 6,000
0xcf36f90ae4f98ccf5c8ab8db733a6eb57ecc91e2dad0d9a1b6a942a9385ed445Swap Exact Token...58186142022-12-01 17:34:5216 hrs 52 mins ago0x5909302d0b93c309b30196eb7e3124545ed0de64 IN  0x52c520ddc9d88a9a3e554a574b31caa9c0932c570 CRO1.62138 6,000
0x54367334d2b037d8217ec5e685b16b320aa6c8343d30a74977500d62d81498c6Add Liquidity58179712022-12-01 16:34:1117 hrs 52 mins ago0x75996d5b947fc3608de4acfaf0d78ed25b081a56 IN  0x52c520ddc9d88a9a3e554a574b31caa9c0932c570 CRO1.005135625757 4,865.411474807
0x910a93a2982213f59d3bc90fef5190c75c18b43490a9f2397f5932f35495937eAdd Liquidity ET...58179292022-12-01 16:30:1317 hrs 56 mins ago0x75996d5b947fc3608de4acfaf0d78ed25b081a56 IN  0x52c520ddc9d88a9a3e554a574b31caa9c0932c5751.740727997684091 CRO1.02433007575 4,865.413382941
0x859949aad0c33cd254354175315fab762cf5cab1df85184089865c77adbaeb15Swap Exact Token...58178222022-12-01 16:20:0418 hrs 6 mins ago0xa4487ef3ea6640e9d0bb17d4c4b748f86480a494 IN  0x52c520ddc9d88a9a3e554a574b31caa9c0932c570 CRO1.62138 6,000
0xa3d22e459037431bb8be9230bd5a7abf6a50ea6a3b9812f71870a38dc938d41dSwap Exact Token...58170902022-12-01 15:10:3019 hrs 16 mins ago0xd113fa81093e6019e4e7f85dc561997c58f658a7 IN  0x52c520ddc9d88a9a3e554a574b31caa9c0932c570 CRO0.810936 6,000
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x871176dc93e8e8607afc38027a4c309bca68fef69520c69ac67df301c9562c5c58289182022-12-02 9:50:1136 mins ago 0x52c520ddc9d88a9a3e554a574b31caa9c0932c57 Cronos: WCRO Token20.990360772937660401 CRO
0xc32b53504d4f8f852be569e3c0fec43c1ac91bec83129ff06c81c6ad5abd40c958256242022-12-02 4:38:505 hrs 48 mins ago 0x52c520ddc9d88a9a3e554a574b31caa9c0932c570xa90cb4d9c204333a8fde00cf3177ffbb205edac7227.290867537933601366 CRO
0xc32b53504d4f8f852be569e3c0fec43c1ac91bec83129ff06c81c6ad5abd40c958256242022-12-02 4:38:505 hrs 48 mins ago Cronos: WCRO Token 0x52c520ddc9d88a9a3e554a574b31caa9c0932c57227.290867537933601366 CRO
0x4de20a820a67eb38eb7a66cc16e21e02c946fea56af51bcf0a78818b1ef37a0658248732022-12-02 3:27:486 hrs 59 mins ago 0x52c520ddc9d88a9a3e554a574b31caa9c0932c570x0f57ef1147705d5ddc3591093f086f6e027550bb96.246257362970292269 CRO
0x4de20a820a67eb38eb7a66cc16e21e02c946fea56af51bcf0a78818b1ef37a0658248732022-12-02 3:27:486 hrs 59 mins ago Cronos: WCRO Token 0x52c520ddc9d88a9a3e554a574b31caa9c0932c5796.246257362970292269 CRO
0xc853f807f65a87b2b255c343f3db63c21be033059de52704773239383a4c50fb58248292022-12-02 3:23:397 hrs 3 mins ago 0x52c520ddc9d88a9a3e554a574b31caa9c0932c570x68c15f32e1ef32da79ced1437fce8043817de24e28.655134727904367158 CRO
0xc853f807f65a87b2b255c343f3db63c21be033059de52704773239383a4c50fb58248292022-12-02 3:23:397 hrs 3 mins ago Cronos: WCRO Token 0x52c520ddc9d88a9a3e554a574b31caa9c0932c5728.655134727904367158 CRO
0xcd37eb6176d195b5b8483b40f4b15cc3f3728ef0cadaac26befc97b035733a7f58219962022-12-01 22:55:2611 hrs 31 mins ago 0x52c520ddc9d88a9a3e554a574b31caa9c0932c570xf2ef64f71b82af0883aeb3c47cb3f38ed567c2170.214285585104307215 CRO
0xcd37eb6176d195b5b8483b40f4b15cc3f3728ef0cadaac26befc97b035733a7f58219962022-12-01 22:55:2611 hrs 31 mins ago 0x52c520ddc9d88a9a3e554a574b31caa9c0932c57 Cronos: WCRO Token101.78565292454592757 CRO
0x24f72078fd95cca5d4471f937fae0618ab2d53256891a57164e2f2b7f3d29cc758208922022-12-01 21:10:4313 hrs 16 mins ago 0x52c520ddc9d88a9a3e554a574b31caa9c0932c570x1428ae187d7b06a3ddfb2e6d0208176a9b0bc99572.551129935983928716 CRO
0x24f72078fd95cca5d4471f937fae0618ab2d53256891a57164e2f2b7f3d29cc758208922022-12-01 21:10:4313 hrs 16 mins ago Cronos: WCRO Token 0x52c520ddc9d88a9a3e554a574b31caa9c0932c5772.551129935983928716 CRO
0xd1667e9e326920e31876f1d7c86274518f185e154b703b0aaecdc77ec81768e758207872022-12-01 21:00:4013 hrs 26 mins ago 0x52c520ddc9d88a9a3e554a574b31caa9c0932c57 Cronos: WCRO Token100 CRO
0xaa73efc79a15eaed1892092d07ce545e7912671e65ac7a53170e48abfad9ef2058207812022-12-01 21:00:0613 hrs 26 mins ago 0x52c520ddc9d88a9a3e554a574b31caa9c0932c570xfb954737c1538f64a993effa0995be6d69246a82154.079893739003864599 CRO
0xaa73efc79a15eaed1892092d07ce545e7912671e65ac7a53170e48abfad9ef2058207812022-12-01 21:00:0613 hrs 26 mins ago Cronos: WCRO Token 0x52c520ddc9d88a9a3e554a574b31caa9c0932c57154.079893739003864599 CRO
0xef9d99cd729c1d52f10af0b27573bfc4a3f6f1d315300835154c6a04cd12e37e58207632022-12-01 20:58:2413 hrs 28 mins ago 0x52c520ddc9d88a9a3e554a574b31caa9c0932c57 Cronos: WCRO Token100 CRO
0x45df0695a604734a2375ee0c840ee91243b8f166caf0e992e4f865ed833ea54258200302022-12-01 19:49:0214 hrs 37 mins ago 0x52c520ddc9d88a9a3e554a574b31caa9c0932c570x9c724542e87784fab7b6efad08e8bc03e27fbabd100.830901879212818938 CRO
0x45df0695a604734a2375ee0c840ee91243b8f166caf0e992e4f865ed833ea54258200302022-12-01 19:49:0214 hrs 37 mins ago Cronos: WCRO Token 0x52c520ddc9d88a9a3e554a574b31caa9c0932c57100.830901879212818938 CRO
0x7bafa0a9c8ad180d6b0834b1af8b049889acd464f3f27e68c92f9bf88fa1868d58195892022-12-01 19:07:1315 hrs 19 mins ago 0x52c520ddc9d88a9a3e554a574b31caa9c0932c570x9e43251d8fab9cc2e00b2af820f535adb03cea2a177.86600698629601283 CRO
0x7bafa0a9c8ad180d6b0834b1af8b049889acd464f3f27e68c92f9bf88fa1868d58195892022-12-01 19:07:1315 hrs 19 mins ago Cronos: WCRO Token 0x52c520ddc9d88a9a3e554a574b31caa9c0932c57177.86600698629601283 CRO
0x0e14a3e9e705235f1840bd8cc12300259c2a7153a84fccccfb9e70d453f3a4e758195842022-12-01 19:06:4415 hrs 20 mins ago 0x52c520ddc9d88a9a3e554a574b31caa9c0932c570x9e43251d8fab9cc2e00b2af820f535adb03cea2a177.866006986296012829 CRO
0x0e14a3e9e705235f1840bd8cc12300259c2a7153a84fccccfb9e70d453f3a4e758195842022-12-01 19:06:4415 hrs 20 mins ago Cronos: WCRO Token 0x52c520ddc9d88a9a3e554a574b31caa9c0932c57177.866006986296012829 CRO
0x21881260375386281db15e9abe081e14a34fe4bd10454dc73aa49d9f23821dcc58195752022-12-01 19:05:5315 hrs 21 mins ago 0x52c520ddc9d88a9a3e554a574b31caa9c0932c570x9e43251d8fab9cc2e00b2af820f535adb03cea2a156.940594399672952496 CRO
0x21881260375386281db15e9abe081e14a34fe4bd10454dc73aa49d9f23821dcc58195752022-12-01 19:05:5315 hrs 21 mins ago Cronos: WCRO Token 0x52c520ddc9d88a9a3e554a574b31caa9c0932c57156.940594399672952496 CRO
0xf44ec9d75b514a8ab4dfd0a786028816c871878233bdd631d59b99007959166758195612022-12-01 19:04:3415 hrs 22 mins ago 0x52c520ddc9d88a9a3e554a574b31caa9c0932c570x9e43251d8fab9cc2e00b2af820f535adb03cea2a156.339289440287232372 CRO
0xf44ec9d75b514a8ab4dfd0a786028816c871878233bdd631d59b99007959166758195612022-12-01 19:04:3415 hrs 22 mins ago Cronos: WCRO Token 0x52c520ddc9d88a9a3e554a574b31caa9c0932c57156.339289440287232372 CRO
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
HopRouter

Compiler Version
v0.6.6+commit.6c089d02

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at cronoscan.com on 2022-05-15
*/

// SPDX-License-Identifier: MIT
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');
    }
}

// File: contracts\interfaces\IHopRouter01.sol

pragma solidity >=0.6.2;

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

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

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

// File: contracts\interfaces\IHopRouter02.sol

pragma solidity >=0.6.2;

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

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

// File: contracts\interfaces\IHopFactory.sol

pragma solidity >=0.5.0;

interface IHopFactory {
    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;

    function INIT_CODE_PAIR_HASH() external view returns (bytes32);
}

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

// File: contracts\interfaces\IHopPair.sol

pragma solidity >=0.5.0;

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

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

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

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

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

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

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

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

    function initialize(address, address) external;
}

// File: contracts\libraries\HopLibrary.sol

pragma solidity >=0.5.0;



library HopLibrary {
    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, 'HopLibrary: IDENTICAL_ADDRESSES');
        (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
        require(token0 != address(0), 'HopLibrary: 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'd788d8433081cb1398ee06d930808a50bb2d6a0493c2573b6b68323cfe9b481c' // 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,) = IHopPair(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, 'HopLibrary: INSUFFICIENT_AMOUNT');
        require(reserveA > 0 && reserveB > 0, 'HopLibrary: 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, 'HopLibrary: INSUFFICIENT_INPUT_AMOUNT');
        require(reserveIn > 0 && reserveOut > 0, 'HopLibrary: INSUFFICIENT_LIQUIDITY');
        uint amountInWithFee = amountIn.mul(9800);
        uint numerator = amountInWithFee.mul(reserveOut);
        uint denominator = reserveIn.mul(10000).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, 'HopLibrary: INSUFFICIENT_OUTPUT_AMOUNT');
        require(reserveIn > 0 && reserveOut > 0, 'HopLibrary: INSUFFICIENT_LIQUIDITY');
        uint numerator = reserveIn.mul(amountOut).mul(10000);
        uint denominator = reserveOut.sub(amountOut).mul(9800);
        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, 'HopLibrary: 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, 'HopLibrary: INVALID_PATH');
        amounts = new uint[](path.length);
        amounts[amounts.length - 1] = amountOut;
        for (uint i = path.length - 1; i > 0; i--) {
            (uint reserveIn, uint reserveOut) = getReserves(factory, path[i - 1], path[i]);
            amounts[i - 1] = getAmountIn(amounts[i], reserveIn, reserveOut);
        }
    }
}

// File: contracts\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);
}

// File: contracts\interfaces\IWETH.sol

pragma solidity >=0.5.0;

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

// File: contracts\HopRouter.sol

pragma solidity =0.6.6;







contract HopRouter is IHopRouter02 {
    using SafeMath for uint;

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

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

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

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

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

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

Contract ABI

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

60c060405234801561001057600080fd5b506040516200473a3803806200473a8339818101604052604081101561003557600080fd5b5080516020909101516001600160601b0319606092831b8116608052911b1660a05260805160601c60a05160601c6145b5620001856000398061015f5280610ce45280610d1f5280610e16528061103452806113be528061152452806118eb52806119e55280611a9b5280611b695280611caf5280611d375280611f7c5280611ff752806120a652806121725280612207528061227b52806127a55280612a185280612a6e5280612aa25280612b165280612cb65280612df95280612e81525080610ea45280610f7b52806110fa5280611133528061126e528061144c528061150252806116725280611bfc5280611d695280611ecc52806122ad5280612506528061272a5280612753528061278352806128f05280612a4c5280612d495280612eb3528061375552806137985280613a765280613bf5528061405152806140ff528061417f52506145b56000f3fe60806040526004361061014f5760003560e01c80638803dbee116100b6578063c45a01551161006f578063c45a015514610a10578063d06ca61f14610a25578063ded9382a14610ada578063e8e3370014610b4d578063f305d71914610bcd578063fb3bdb4114610c1357610188565b80638803dbee146107df578063ad5c464814610875578063ad615dec146108a6578063af2979eb146108dc578063b6f9de951461092f578063baa2abde146109b357610188565b80634a25d94a116101085780634a25d94a146104f05780635b0d5984146105865780635c11d795146105f9578063791ac9471461068f5780637ff36ab51461072557806385f8c259146107a957610188565b806302751cec1461018d578063054d50d4146101f957806318cbafe5146102415780631f00ca74146103275780632195995c146103dc57806338ed17391461045a57610188565b3661018857336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461018657fe5b005b600080fd5b34801561019957600080fd5b506101e0600480360360c08110156101b057600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135610c97565b6040805192835260208301919091528051918290030190f35b34801561020557600080fd5b5061022f6004803603606081101561021c57600080fd5b5080359060208101359060400135610db1565b60408051918252519081900360200190f35b34801561024d57600080fd5b506102d7600480360360a081101561026457600080fd5b813591602081013591810190606081016040820135600160201b81111561028a57600080fd5b82018360208201111561029c57600080fd5b803590602001918460208302840111600160201b831117156102bd57600080fd5b91935091506001600160a01b038135169060200135610dc6565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156103135781810151838201526020016102fb565b505050509050019250505060405180910390f35b34801561033357600080fd5b506102d76004803603604081101561034a57600080fd5b81359190810190604081016020820135600160201b81111561036b57600080fd5b82018360208201111561037d57600080fd5b803590602001918460208302840111600160201b8311171561039e57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506110f3945050505050565b3480156103e857600080fd5b506101e0600480360361016081101561040057600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c08101359060e081013515159060ff6101008201351690610120810135906101400135611129565b34801561046657600080fd5b506102d7600480360360a081101561047d57600080fd5b813591602081013591810190606081016040820135600160201b8111156104a357600080fd5b8201836020820111156104b557600080fd5b803590602001918460208302840111600160201b831117156104d657600080fd5b91935091506001600160a01b038135169060200135611223565b3480156104fc57600080fd5b506102d7600480360360a081101561051357600080fd5b813591602081013591810190606081016040820135600160201b81111561053957600080fd5b82018360208201111561054b57600080fd5b803590602001918460208302840111600160201b8311171561056c57600080fd5b91935091506001600160a01b03813516906020013561136e565b34801561059257600080fd5b5061022f60048036036101408110156105aa57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e082013516906101008101359061012001356114fa565b34801561060557600080fd5b50610186600480360360a081101561061c57600080fd5b813591602081013591810190606081016040820135600160201b81111561064257600080fd5b82018360208201111561065457600080fd5b803590602001918460208302840111600160201b8311171561067557600080fd5b91935091506001600160a01b038135169060200135611608565b34801561069b57600080fd5b50610186600480360360a08110156106b257600080fd5b813591602081013591810190606081016040820135600160201b8111156106d857600080fd5b8201836020820111156106ea57600080fd5b803590602001918460208302840111600160201b8311171561070b57600080fd5b91935091506001600160a01b03813516906020013561189d565b6102d76004803603608081101561073b57600080fd5b81359190810190604081016020820135600160201b81111561075c57600080fd5b82018360208201111561076e57600080fd5b803590602001918460208302840111600160201b8311171561078f57600080fd5b91935091506001600160a01b038135169060200135611b21565b3480156107b557600080fd5b5061022f600480360360608110156107cc57600080fd5b5080359060208101359060400135611e74565b3480156107eb57600080fd5b506102d7600480360360a081101561080257600080fd5b813591602081013591810190606081016040820135600160201b81111561082857600080fd5b82018360208201111561083a57600080fd5b803590602001918460208302840111600160201b8311171561085b57600080fd5b91935091506001600160a01b038135169060200135611e81565b34801561088157600080fd5b5061088a611f7a565b604080516001600160a01b039092168252519081900360200190f35b3480156108b257600080fd5b5061022f600480360360608110156108c957600080fd5b5080359060208101359060400135611f9e565b3480156108e857600080fd5b5061022f600480360360c08110156108ff57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135611fab565b6101866004803603608081101561094557600080fd5b81359190810190604081016020820135600160201b81111561096657600080fd5b82018360208201111561097857600080fd5b803590602001918460208302840111600160201b8311171561099957600080fd5b91935091506001600160a01b03813516906020013561212c565b3480156109bf57600080fd5b506101e0600480360360e08110156109d657600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c001356124b8565b348015610a1c57600080fd5b5061088a612728565b348015610a3157600080fd5b506102d760048036036040811015610a4857600080fd5b81359190810190604081016020820135600160201b811115610a6957600080fd5b820183602082011115610a7b57600080fd5b803590602001918460208302840111600160201b83111715610a9c57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955061274c945050505050565b348015610ae657600080fd5b506101e06004803603610140811015610afe57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e08201351690610100810135906101200135612779565b348015610b5957600080fd5b50610baf6004803603610100811015610b7157600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359160c0820135169060e0013561288d565b60408051938452602084019290925282820152519081900360600190f35b610baf600480360360c0811015610be357600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a001356129c9565b6102d760048036036080811015610c2957600080fd5b81359190810190604081016020820135600160201b811115610c4a57600080fd5b820183602082011115610c5c57600080fd5b803590602001918460208302840111600160201b83111715610c7d57600080fd5b91935091506001600160a01b038135169060200135612c6e565b6000808242811015610cde576040805162461bcd60e51b815260206004820152601260248201526000805160206144b3833981519152604482015290519081900360640190fd5b610d0d897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a6124b8565b9093509150610d1d898685612ff0565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610d8357600080fd5b505af1158015610d97573d6000803e3d6000fd5b50505050610da5858361315a565b50965096945050505050565b6000610dbe848484613252565b949350505050565b60608142811015610e0c576040805162461bcd60e51b815260206004820152601260248201526000805160206144b3833981519152604482015290519081900360640190fd5b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001686866000198101818110610e4657fe5b905060200201356001600160a01b03166001600160a01b031614610e9f576040805162461bcd60e51b815260206004820152601760248201526000805160206144f6833981519152604482015290519081900360640190fd5b610efd7f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061334292505050565b91508682600184510381518110610f1057fe5b60200260200101511015610f555760405162461bcd60e51b815260040180806020018281038252602581526020018061455b6025913960400191505060405180910390fd5b610ff386866000818110610f6557fe5b905060200201356001600160a01b031633610fd97f00000000000000000000000000000000000000000000000000000000000000008a8a6000818110610fa757fe5b905060200201356001600160a01b03168b8b6001818110610fc457fe5b905060200201356001600160a01b0316613489565b85600081518110610fe657fe5b6020026020010151613549565b611032828787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152503092506136a6915050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d8360018551038151811061107157fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156110af57600080fd5b505af11580156110c3573d6000803e3d6000fd5b505050506110e884836001855103815181106110db57fe5b602002602001015161315a565b509695505050505050565b60606111207f000000000000000000000000000000000000000000000000000000000000000084846138ec565b90505b92915050565b60008060006111597f00000000000000000000000000000000000000000000000000000000000000008f8f613489565b9050600087611168578c61116c565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b1580156111e257600080fd5b505af11580156111f6573d6000803e3d6000fd5b505050506112098f8f8f8f8f8f8f6124b8565b809450819550505050509b509b9950505050505050505050565b60608142811015611269576040805162461bcd60e51b815260206004820152601260248201526000805160206144b3833981519152604482015290519081900360640190fd5b6112c77f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061334292505050565b915086826001845103815181106112da57fe5b6020026020010151101561131f5760405162461bcd60e51b815260040180806020018281038252602581526020018061455b6025913960400191505060405180910390fd5b61132f86866000818110610f6557fe5b6110e8828787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508992506136a6915050565b606081428110156113b4576040805162461bcd60e51b815260206004820152601260248201526000805160206144b3833981519152604482015290519081900360640190fd5b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016868660001981018181106113ee57fe5b905060200201356001600160a01b03166001600160a01b031614611447576040805162461bcd60e51b815260206004820152601760248201526000805160206144f6833981519152604482015290519081900360640190fd5b6114a57f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506138ec92505050565b915086826000815181106114b557fe5b60200260200101511115610f555760405162461bcd60e51b81526004018080602001828103825260218152602001806145166021913960400191505060405180910390fd5b6000806115487f00000000000000000000000000000000000000000000000000000000000000008d7f0000000000000000000000000000000000000000000000000000000000000000613489565b9050600086611557578b61155b565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018b905260ff8916608482015260a4810188905260c4810187905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b1580156115d157600080fd5b505af11580156115e5573d6000803e3d6000fd5b505050506115f78d8d8d8d8d8d611fab565b9d9c50505050505050505050505050565b804281101561164c576040805162461bcd60e51b815260206004820152601260248201526000805160206144b3833981519152604482015290519081900360640190fd5b6116c18585600081811061165c57fe5b905060200201356001600160a01b0316336116bb7f00000000000000000000000000000000000000000000000000000000000000008989600081811061169e57fe5b905060200201356001600160a01b03168a8a6001818110610fc457fe5b8a613549565b6000858560001981018181106116d357fe5b905060200201356001600160a01b03166001600160a01b03166370a08231856040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561173857600080fd5b505afa15801561174c573d6000803e3d6000fd5b505050506040513d602081101561176257600080fd5b505160408051602088810282810182019093528882529293506117a4929091899189918291850190849080828437600092019190915250889250613a1f915050565b8661185682888860001981018181106117b957fe5b905060200201356001600160a01b03166001600160a01b03166370a08231886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561181e57600080fd5b505afa158015611832573d6000803e3d6000fd5b505050506040513d602081101561184857600080fd5b50519063ffffffff613d2a16565b10156118935760405162461bcd60e51b815260040180806020018281038252602581526020018061455b6025913960400191505060405180910390fd5b5050505050505050565b80428110156118e1576040805162461bcd60e51b815260206004820152601260248201526000805160206144b3833981519152604482015290519081900360640190fd5b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168585600019810181811061191b57fe5b905060200201356001600160a01b03166001600160a01b031614611974576040805162461bcd60e51b815260206004820152601760248201526000805160206144f6833981519152604482015290519081900360640190fd5b6119848585600081811061165c57fe5b6119c2858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613a1f915050565b604080516370a0823160e01b815230600482015290516000916001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916370a0823191602480820192602092909190829003018186803b158015611a2c57600080fd5b505afa158015611a40573d6000803e3d6000fd5b505050506040513d6020811015611a5657600080fd5b5051905086811015611a995760405162461bcd60e51b815260040180806020018281038252602581526020018061455b6025913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611aff57600080fd5b505af1158015611b13573d6000803e3d6000fd5b50505050611893848261315a565b60608142811015611b67576040805162461bcd60e51b815260206004820152601260248201526000805160206144b3833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110611b9e57fe5b905060200201356001600160a01b03166001600160a01b031614611bf7576040805162461bcd60e51b815260206004820152601760248201526000805160206144f6833981519152604482015290519081900360640190fd5b611c557f00000000000000000000000000000000000000000000000000000000000000003488888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061334292505050565b91508682600184510381518110611c6857fe5b60200260200101511015611cad5760405162461bcd60e51b815260040180806020018281038252602581526020018061455b6025913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db083600081518110611ce957fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015611d1c57600080fd5b505af1158015611d30573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb611d957f00000000000000000000000000000000000000000000000000000000000000008989600081811061169e57fe5b84600081518110611da257fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015611df957600080fd5b505af1158015611e0d573d6000803e3d6000fd5b505050506040513d6020811015611e2357600080fd5b5051611e2b57fe5b611e6a828787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508992506136a6915050565b5095945050505050565b6000610dbe848484613d7a565b60608142811015611ec7576040805162461bcd60e51b815260206004820152601260248201526000805160206144b3833981519152604482015290519081900360640190fd5b611f257f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506138ec92505050565b91508682600081518110611f3557fe5b6020026020010151111561131f5760405162461bcd60e51b81526004018080602001828103825260218152602001806145166021913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081565b6000610dbe848484613e6a565b60008142811015611ff1576040805162461bcd60e51b815260206004820152601260248201526000805160206144b3833981519152604482015290519081900360640190fd5b612020887f000000000000000000000000000000000000000000000000000000000000000089898930896124b8565b604080516370a0823160e01b815230600482015290519194506120a492508a9187916001600160a01b038416916370a0823191602480820192602092909190829003018186803b15801561207357600080fd5b505afa158015612087573d6000803e3d6000fd5b505050506040513d602081101561209d57600080fd5b5051612ff0565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561210a57600080fd5b505af115801561211e573d6000803e3d6000fd5b505050506110e8848361315a565b8042811015612170576040805162461bcd60e51b815260206004820152601260248201526000805160206144b3833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316858560008181106121a757fe5b905060200201356001600160a01b03166001600160a01b031614612200576040805162461bcd60e51b815260206004820152601760248201526000805160206144f6833981519152604482015290519081900360640190fd5b60003490507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561226057600080fd5b505af1158015612274573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6122d97f00000000000000000000000000000000000000000000000000000000000000008989600081811061169e57fe5b836040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561232957600080fd5b505af115801561233d573d6000803e3d6000fd5b505050506040513d602081101561235357600080fd5b505161235b57fe5b60008686600019810181811061236d57fe5b905060200201356001600160a01b03166001600160a01b03166370a08231866040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156123d257600080fd5b505afa1580156123e6573d6000803e3d6000fd5b505050506040513d60208110156123fc57600080fd5b5051604080516020898102828101820190935289825292935061243e9290918a918a918291850190849080828437600092019190915250899250613a1f915050565b87611856828989600019810181811061245357fe5b905060200201356001600160a01b03166001600160a01b03166370a08231896040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561181e57600080fd5b60008082428110156124ff576040805162461bcd60e51b815260206004820152601260248201526000805160206144b3833981519152604482015290519081900360640190fd5b600061252c7f00000000000000000000000000000000000000000000000000000000000000008c8c613489565b604080516323b872dd60e01b81523360048201526001600160a01b03831660248201819052604482018d9052915192935090916323b872dd916064808201926020929091908290030181600087803b15801561258757600080fd5b505af115801561259b573d6000803e3d6000fd5b505050506040513d60208110156125b157600080fd5b50506040805163226bf2d160e21b81526001600160a01b03888116600483015282516000938493928616926389afcb44926024808301939282900301818787803b1580156125fe57600080fd5b505af1158015612612573d6000803e3d6000fd5b505050506040513d604081101561262857600080fd5b508051602090910151909250905060006126428e8e613f2c565b509050806001600160a01b03168e6001600160a01b031614612665578183612668565b82825b90975095508a8710156126c2576040805162461bcd60e51b815260206004820181905260248201527f486f70526f757465723a20494e53554646494349454e545f415f414d4f554e54604482015290519081900360640190fd5b89861015612717576040805162461bcd60e51b815260206004820181905260248201527f486f70526f757465723a20494e53554646494349454e545f425f414d4f554e54604482015290519081900360640190fd5b505050505097509795505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60606111207f00000000000000000000000000000000000000000000000000000000000000008484613342565b60008060006127c97f00000000000000000000000000000000000000000000000000000000000000008e7f0000000000000000000000000000000000000000000000000000000000000000613489565b90506000876127d8578c6127dc565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b15801561285257600080fd5b505af1158015612866573d6000803e3d6000fd5b505050506128788e8e8e8e8e8e610c97565b909f909e509c50505050505050505050505050565b600080600083428110156128d6576040805162461bcd60e51b815260206004820152601260248201526000805160206144b3833981519152604482015290519081900360640190fd5b6128e48c8c8c8c8c8c614020565b909450925060006129167f00000000000000000000000000000000000000000000000000000000000000008e8e613489565b90506129248d338388613549565b6129308c338387613549565b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b15801561298857600080fd5b505af115801561299c573d6000803e3d6000fd5b505050506040513d60208110156129b257600080fd5b5051949d939c50939a509198505050505050505050565b60008060008342811015612a12576040805162461bcd60e51b815260206004820152601260248201526000805160206144b3833981519152604482015290519081900360640190fd5b612a408a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c614020565b90945092506000612a927f00000000000000000000000000000000000000000000000000000000000000008c7f0000000000000000000000000000000000000000000000000000000000000000613489565b9050612aa08b338388613549565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b158015612afb57600080fd5b505af1158015612b0f573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb82866040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612b9457600080fd5b505af1158015612ba8573d6000803e3d6000fd5b505050506040513d6020811015612bbe57600080fd5b5051612bc657fe5b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015612c1e57600080fd5b505af1158015612c32573d6000803e3d6000fd5b505050506040513d6020811015612c4857600080fd5b5051925034841015612c6057612c603385340361315a565b505096509650969350505050565b60608142811015612cb4576040805162461bcd60e51b815260206004820152601260248201526000805160206144b3833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110612ceb57fe5b905060200201356001600160a01b03166001600160a01b031614612d44576040805162461bcd60e51b815260206004820152601760248201526000805160206144f6833981519152604482015290519081900360640190fd5b612da27f0000000000000000000000000000000000000000000000000000000000000000888888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506138ec92505050565b91503482600081518110612db257fe5b60200260200101511115612df75760405162461bcd60e51b81526004018080602001828103825260218152602001806145166021913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db083600081518110612e3357fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015612e6657600080fd5b505af1158015612e7a573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb612edf7f00000000000000000000000000000000000000000000000000000000000000008989600081811061169e57fe5b84600081518110612eec57fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612f4357600080fd5b505af1158015612f57573d6000803e3d6000fd5b505050506040513d6020811015612f6d57600080fd5b5051612f7557fe5b612fb4828787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508992506136a6915050565b81600081518110612fc157fe5b6020026020010151341115611e6a57611e6a3383600081518110612fe157fe5b6020026020010151340361315a565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b6020831061306d5780518252601f19909201916020918201910161304e565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146130cf576040519150601f19603f3d011682016040523d82523d6000602084013e6130d4565b606091505b509150915081801561310257508051158061310257508080602001905160208110156130ff57600080fd5b50515b613153576040805162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604482015290519081900360640190fd5b5050505050565b604080516000808252602082019092526001600160a01b0384169083906040518082805190602001908083835b602083106131a65780518252601f199092019160209182019101613187565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613208576040519150601f19603f3d011682016040523d82523d6000602084013e61320d565b606091505b505090508061324d5760405162461bcd60e51b81526004018080602001828103825260238152602001806144d36023913960400191505060405180910390fd5b505050565b60008084116132925760405162461bcd60e51b81526004018080602001828103825260258152602001806144466025913960400191505060405180910390fd5b6000831180156132a25750600082115b6132dd5760405162461bcd60e51b81526004018080602001828103825260228152602001806144916022913960400191505060405180910390fd5b60006132f18561264863ffffffff6142c016565b90506000613305828563ffffffff6142c016565b9050600061332b8361331f8861271063ffffffff6142c016565b9063ffffffff61432316565b905080828161333657fe5b04979650505050505050565b6060600282511015613396576040805162461bcd60e51b8152602060048201526018602482015277090dee098d2c4e4c2e4f27440929cac82989288bea082a8960431b604482015290519081900360640190fd5b815167ffffffffffffffff811180156133ae57600080fd5b506040519080825280602002602001820160405280156133d8578160200160208202803683370190505b50905082816000815181106133e957fe5b60200260200101818152505060005b60018351038110156134815760008061343b8786858151811061341757fe5b602002602001015187866001018151811061342e57fe5b6020026020010151614372565b9150915061345d84848151811061344e57fe5b60200260200101518383613252565b84846001018151811061346c57fe5b602090810291909101015250506001016133f8565b509392505050565b60008060006134988585613f2c565b604080516bffffffffffffffffffffffff19606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501206001600160f81b031960688401529a90941b9093166069840152607d8301989098527fd788d8433081cb1398ee06d930808a50bb2d6a0493c2573b6b68323cfe9b481c609d808401919091528851808403909101815260bd909201909752805196019590952095945050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17815292518251600094606094938a169392918291908083835b602083106135ce5780518252601f1990920191602091820191016135af565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613630576040519150601f19603f3d011682016040523d82523d6000602084013e613635565b606091505b5091509150818015613663575080511580613663575080806020019051602081101561366057600080fd5b50515b61369e5760405162461bcd60e51b81526004018080602001828103825260248152602001806145376024913960400191505060405180910390fd5b505050505050565b60005b60018351038110156138e6576000808483815181106136c457fe5b60200260200101518584600101815181106136db57fe5b60200260200101519150915060006136f38383613f2c565b509050600087856001018151811061370757fe5b60200260200101519050600080836001600160a01b0316866001600160a01b03161461373557826000613739565b6000835b91509150600060028a510388106137505788613791565b6137917f0000000000000000000000000000000000000000000000000000000000000000878c8b6002018151811061378457fe5b6020026020010151613489565b90506137be7f00000000000000000000000000000000000000000000000000000000000000008888613489565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f1916602001820160405280156137fb576020820181803683370190505b506040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03166001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561386c578181015183820152602001613854565b50505050905090810190601f1680156138995780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b1580156138bb57600080fd5b505af11580156138cf573d6000803e3d6000fd5b5050600190990198506136a9975050505050505050565b50505050565b6060600282511015613940576040805162461bcd60e51b8152602060048201526018602482015277090dee098d2c4e4c2e4f27440929cac82989288bea082a8960431b604482015290519081900360640190fd5b815167ffffffffffffffff8111801561395857600080fd5b50604051908082528060200260200182016040528015613982578160200160208202803683370190505b509050828160018351038151811061399657fe5b60209081029190910101528151600019015b8015613481576000806139d8878660018603815181106139c457fe5b602002602001015187868151811061342e57fe5b915091506139fa8484815181106139eb57fe5b60200260200101518383613d7a565b846001850381518110613a0957fe5b60209081029190910101525050600019016139a8565b60005b600183510381101561324d57600080848381518110613a3d57fe5b6020026020010151858460010181518110613a5457fe5b6020026020010151915091506000613a6c8383613f2c565b5090506000613a9c7f00000000000000000000000000000000000000000000000000000000000000008585613489565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015613add57600080fd5b505afa158015613af1573d6000803e3d6000fd5b505050506040513d6060811015613b0757600080fd5b5080516020909101516001600160701b0391821693501690506000806001600160a01b038a811690891614613b3d578284613b40565b83835b91509150613b9e828b6001600160a01b03166370a082318a6040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561181e57600080fd5b9550613bab868383613252565b945050505050600080856001600160a01b0316886001600160a01b031614613bd557826000613bd9565b6000835b91509150600060028c51038a10613bf0578a613c24565b613c247f0000000000000000000000000000000000000000000000000000000000000000898e8d6002018151811061378457fe5b604080516000808252602082019283905263022c0d9f60e01b835260248201878152604483018790526001600160a01b038086166064850152608060848501908152845160a48601819052969750908c169563022c0d9f958a958a958a9591949193919260c486019290918190849084905b83811015613cae578181015183820152602001613c96565b50505050905090810190601f168015613cdb5780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b158015613cfd57600080fd5b505af1158015613d11573d6000803e3d6000fd5b50506001909b019a50613a229950505050505050505050565b80820382811115611123576040805162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b604482015290519081900360640190fd5b6000808411613dba5760405162461bcd60e51b815260040180806020018281038252602681526020018061446b6026913960400191505060405180910390fd5b600083118015613dca5750600082115b613e055760405162461bcd60e51b81526004018080602001828103825260228152602001806144916022913960400191505060405180910390fd5b6000613e29612710613e1d868863ffffffff6142c016565b9063ffffffff6142c016565b90506000613e43612648613e1d868963ffffffff613d2a16565b9050613e606001828481613e5357fe5b049063ffffffff61432316565b9695505050505050565b6000808411613ec0576040805162461bcd60e51b815260206004820152601f60248201527f486f704c6962726172793a20494e53554646494349454e545f414d4f554e5400604482015290519081900360640190fd5b600083118015613ed05750600082115b613f0b5760405162461bcd60e51b81526004018080602001828103825260228152602001806144916022913960400191505060405180910390fd5b82613f1c858463ffffffff6142c016565b81613f2357fe5b04949350505050565b600080826001600160a01b0316846001600160a01b03161415613f96576040805162461bcd60e51b815260206004820152601f60248201527f486f704c6962726172793a204944454e544943414c5f41444452455353455300604482015290519081900360640190fd5b826001600160a01b0316846001600160a01b031610613fb6578284613fb9565b83835b90925090506001600160a01b038216614019576040805162461bcd60e51b815260206004820152601860248201527f486f704c6962726172793a205a45524f5f414444524553530000000000000000604482015290519081900360640190fd5b9250929050565b6040805163e6a4390560e01b81526001600160a01b03888116600483015287811660248301529151600092839283927f00000000000000000000000000000000000000000000000000000000000000009092169163e6a4390591604480820192602092909190829003018186803b15801561409a57600080fd5b505afa1580156140ae573d6000803e3d6000fd5b505050506040513d60208110156140c457600080fd5b50516001600160a01b0316141561417757604080516364e329cb60e11b81526001600160a01b038a81166004830152898116602483015291517f00000000000000000000000000000000000000000000000000000000000000009092169163c9c65396916044808201926020929091908290030181600087803b15801561414a57600080fd5b505af115801561415e573d6000803e3d6000fd5b505050506040513d602081101561417457600080fd5b50505b6000806141a57f00000000000000000000000000000000000000000000000000000000000000008b8b614372565b915091508160001480156141b7575080155b156141c7578793508692506142b3565b60006141d4898484613e6a565b905087811161423d5785811015614232576040805162461bcd60e51b815260206004820181905260248201527f486f70526f757465723a20494e53554646494349454e545f425f414d4f554e54604482015290519081900360640190fd5b8894509250826142b1565b600061424a898486613e6a565b90508981111561425657fe5b878110156142ab576040805162461bcd60e51b815260206004820181905260248201527f486f70526f757465723a20494e53554646494349454e545f415f414d4f554e54604482015290519081900360640190fd5b94508793505b505b5050965096945050505050565b60008115806142db575050808202828282816142d857fe5b04145b611123576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b604482015290519081900360640190fd5b80820182811015611123576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b604482015290519081900360640190fd5b60008060006143818585613f2c565b50905061438f868686613489565b5060008061439e888888613489565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b1580156143d657600080fd5b505afa1580156143ea573d6000803e3d6000fd5b505050506040513d606081101561440057600080fd5b5080516020909101516001600160701b0391821693501690506001600160a01b0387811690841614614433578082614436565b81815b9099909850965050505050505056fe486f704c6962726172793a20494e53554646494349454e545f494e5055545f414d4f554e54486f704c6962726172793a20494e53554646494349454e545f4f55545055545f414d4f554e54486f704c6962726172793a20494e53554646494349454e545f4c4951554944495459486f70526f757465723a204558504952454400000000000000000000000000005472616e7366657248656c7065723a204554485f5452414e534645525f4641494c4544486f70526f757465723a20494e56414c49445f50415448000000000000000000486f70526f757465723a204558434553534956455f494e5055545f414d4f554e545472616e7366657248656c7065723a205452414e534645525f46524f4d5f4641494c4544486f70526f757465723a20494e53554646494349454e545f4f55545055545f414d4f554e54a2646970667358221220b34c78561f4c4ef1906ab4e77159e42923b2e0c744c9db20c175766691683f7564736f6c63430006060033000000000000000000000000918ceff586c00c1fa4726dc50697172fd87df8e90000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae23

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

000000000000000000000000918ceff586c00c1fa4726dc50697172fd87df8e90000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae23

-----Decoded View---------------
Arg [0] : _factory (address): 0x918ceff586c00c1fa4726dc50697172fd87df8e9
Arg [1] : _WETH (address): 0x5c7f8a570d578ed84e63fdfa7b1ee72deae1ae23

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000918ceff586c00c1fa4726dc50697172fd87df8e9
Arg [1] : 0000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae23


Deployed ByteCode Sourcemap

16162:18121:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16624:10;-1:-1:-1;;;;;16638:4:0;16624:18;;16617:26;;;;16162:18121;;12:1:-1;9;2:12;20672:673:0;;5:9:-1;2:2;;;27:1;24;17:12;2:2;20672:673:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;20672:673:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;33251:256;;5:9:-1;2:2;;;27:1;24;17:12;2:2;33251:256:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;33251:256:0;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;27697:826;;5:9:-1;2:2;;;27:1;24;17:12;2:2;27697:826:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;27697:826:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;27697:826:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;27697:826:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;27697:826:0;;-1:-1:-1;27697:826:0;-1:-1:-1;;;;;;27697:826: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;27697:826:0;;;;;;;;;;;;;;;;;34033:247;;5:9:-1;2:2;;;27:1;24;17:12;2:2;34033:247:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;34033:247:0;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;34033:247:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;34033:247:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;34033:247:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;34033:247:0;;-1:-1:-1;34033:247:0;;-1:-1:-1;;;;;34033:247:0:i;21351:665::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;21351:665:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;21351:665:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;24998:610::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;24998:610:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;24998:610:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;24998:610:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;24998:610:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;24998:610:0;;-1:-1:-1;24998:610:0;-1:-1:-1;;;;;;24998:610:0;;;;;;;;:::i;26887:804::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;26887:804:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;26887:804:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;26887:804:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;26887:804:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;26887:804:0;;-1:-1:-1;26887:804:0;-1:-1:-1;;;;;;26887:804:0;;;;;;;;:::i;23464:706::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;23464:706:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;23464:706:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;30646:702::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;30646:702:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;30646:702:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;30646:702:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;30646:702:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;30646:702:0;;-1:-1:-1;30646:702:0;-1:-1:-1;;;;;;30646:702:0;;;;;;;;:::i;32192:825::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;32192:825:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;32192:825:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;32192:825:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;32192:825:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;32192:825:0;;-1:-1:-1;32192:825:0;-1:-1:-1;;;;;;32192:825:0;;;;;;;;:::i;26208:673::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;26208:673:0;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;26208:673:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;26208:673:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;26208:673:0;;-1:-1:-1;26208:673:0;-1:-1:-1;;;;;;26208:673:0;;;;;;;;:::i;33515:255::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;33515:255:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;33515:255:0;;;;;;;;;;;;:::i;25614:588::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;25614:588:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;25614:588:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;25614:588:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;25614:588:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;25614:588:0;;-1:-1:-1;25614:588:0;-1:-1:-1;;;;;;25614:588:0;;;;;;;;:::i;16284:38::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;16284:38:0;;;:::i;:::-;;;;-1:-1:-1;;;;;16284:38:0;;;;;;;;;;;;;;33061:182;;5:9:-1;2:2;;;27:1;24;17:12;2:2;33061:182:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;33061:182:0;;;;;;;;;;;;:::i;22758:700::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;22758:700:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;22758:700:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;31354:832::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;31354:832:0;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;31354:832:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;31354:832:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;31354:832:0;;-1:-1:-1;31354:832:0;-1:-1:-1;;;;;;31354:832:0;;;;;;;;:::i;19837:829::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;19837:829:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;19837:829:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;16236:41::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;16236:41:0;;;:::i;33778:247::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;33778:247:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;33778:247:0;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;33778:247:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;33778:247:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;33778:247:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;33778:247:0;;-1:-1:-1;33778:247:0;;-1:-1:-1;;;;;33778:247:0:i;22022:657::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;22022:657:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;22022:657:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;18100:726::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;18100:726:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;18100:726:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;18832:962;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;18832:962:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;28529:786::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;28529:786:0;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;28529:786:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;28529:786:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;28529:786:0;;-1:-1:-1;28529:786:0;-1:-1:-1;;;;;;28529:786:0;;;;;;;;:::i;20672:673::-;20909:16;20927:14;20890:8;16393:15;16381:8;:27;;16373:58;;;;;-1:-1:-1;;;16373:58:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16373:58:0;;;;;;;;;;;;;;;20981:196:::1;21011:5;21031:4;21050:9;21074:14;21103:12;21138:4;21158:8;20981:15;:196::i;:::-;20954:223:::0;;-1:-1:-1;20954:223:0;-1:-1:-1;21188:51:0::1;21216:5:::0;21223:2;20954:223;21188:27:::1;:51::i;:::-;21256:4;-1:-1:-1::0;;;;;21250:20:0::1;;21271:9;21250:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;21250:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;21250:31:0;;;;21292:45;21323:2;21327:9;21292:30;:45::i;:::-;20672:673:::0;;;;;;;;;;:::o;33251:256::-;33404:14;33443:56;33467:8;33477:9;33488:10;33443:23;:56::i;:::-;33436:63;33251:256;-1:-1:-1;;;;33251:256:0:o;27697:826::-;27911:21;27883:8;16393:15;16381:8;:27;;16373:58;;;;;-1:-1:-1;;;16373:58:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16373:58:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;27983:4:0::1;27958:29;:4:::0;;-1:-1:-1;;27963:15:0;;27958:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;27958:21:0::1;-1:-1:-1::0;;;;;27958:29:0::1;;27950:65;;;::::0;;-1:-1:-1;;;27950:65:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;27950:65:0;;;;;;;;;;;;;::::1;;28036:49;28061:7;28070:8;28080:4;;28036:49;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;28036:24:0::1;::::0;-1:-1:-1;;;28036:49:0:i:1;:::-;28026:59;;28135:12;28104:7;28129:1;28112:7;:14;:18;28104:27;;;;;;;;;;;;;;:43;;28096:93;;;;-1:-1:-1::0;;;28096:93:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28200:135;28246:4;;28251:1;28246:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;28246:7:0::1;28255:10;28267:45;28286:7;28295:4;;28300:1;28295:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;28295:7:0::1;28304:4;;28309:1;28304:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;28304:7:0::1;28267:18;:45::i;:::-;28314:7;28322:1;28314:10;;;;;;;;;;;;;;28200:31;:135::i;:::-;28346:35;28352:7;28361:4;;28346:35;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;28375:4:0::1;::::0;-1:-1:-1;28346:5:0::1;::::0;-1:-1:-1;;28346:35:0:i:1;:::-;28398:4;-1:-1:-1::0;;;;;28392:20:0::1;;28413:7;28438:1;28421:7;:14;:18;28413:27;;;;;;;;;;;;;;28392:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;28392:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;28392:49:0;;;;28452:63;28483:2;28487:7;28512:1;28495:7;:14;:18;28487:27;;;;;;;;;;;;;;28452:30;:63::i;:::-;27697:826:::0;;;;;;;;;:::o;34033:247::-;34177:21;34223:49;34247:7;34256:9;34267:4;34223:23;:49::i;:::-;34216:56;;34033:247;;;;;:::o;21351:665::-;21657:12;21671;21696;21711:43;21730:7;21739:6;21747;21711:18;:43::i;:::-;21696:58;;21765:10;21778;:33;;21802:9;21778:33;;;-1:-1:-1;;21778:33:0;21822:74;;;-1:-1:-1;;;21822:74:0;;21844:10;21822:74;;;;21864:4;21822:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21765:46;;-1:-1:-1;;;;;;21822:21:0;;;;;:74;;;;;-1:-1:-1;;21822:74:0;;;;;;;;-1:-1:-1;21822:21:0;:74;;;2:2:-1;;;;27:1;24;17:12;2:2;21822:74:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21822:74:0;;;;21928:80;21944:6;21952;21960:9;21971:10;21983;21995:2;21999:8;21928:15;:80::i;:::-;21907:101;;;;;;;;21351:665;;;;;;;;;;;;;;;;:::o;24998:610::-;25222:21;25203:8;16393:15;16381:8;:27;;16373:58;;;;;-1:-1:-1;;;16373:58:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16373:58:0;;;;;;;;;;;;;;;25266:49:::1;25291:7;25300:8;25310:4;;25266:49;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;25266:24:0::1;::::0;-1:-1:-1;;;25266:49:0:i:1;:::-;25256:59;;25365:12;25334:7;25359:1;25342:7;:14;:18;25334:27;;;;;;;;;;;;;;:43;;25326:93;;;;-1:-1:-1::0;;;25326:93:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25430:135;25476:4;;25481:1;25476:7;;;;;;25430:135;25576:24;25582:7;25591:4;;25576:24;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;25597:2:0;;-1:-1:-1;25576:5:0::1;::::0;-1:-1:-1;;25576:24:0:i:1;26887:804::-:0;27101:21;27073:8;16393:15;16381:8;:27;;16373:58;;;;;-1:-1:-1;;;16373:58:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16373:58:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;27173:4:0::1;27148:29;:4:::0;;-1:-1:-1;;27153:15:0;;27148:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;27148:21:0::1;-1:-1:-1::0;;;;;27148:29:0::1;;27140:65;;;::::0;;-1:-1:-1;;;27140:65:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;27140:65:0;;;;;;;;;;;;;::::1;;27226:49;27250:7;27259:9;27270:4;;27226:49;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;27226:23:0::1;::::0;-1:-1:-1;;;27226:49:0:i:1;:::-;27216:59;;27308:11;27294:7;27302:1;27294:10;;;;;;;;;;;;;;:25;;27286:71;;;;-1:-1:-1::0;;;27286:71:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23464:706:::0;23782:14;23809:12;23824:40;23843:7;23852:5;23859:4;23824:18;:40::i;:::-;23809:55;;23875:10;23888;:33;;23912:9;23888:33;;;-1:-1:-1;;23888:33:0;23932:74;;;-1:-1:-1;;;23932:74:0;;23954:10;23932:74;;;;23974:4;23932:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23875:46;;-1:-1:-1;;;;;;23932:21:0;;;;;:74;;;;;-1:-1:-1;;23932:74:0;;;;;;;;-1:-1:-1;23932:21:0;:74;;;2:2:-1;;;;27:1;24;17:12;2:2;23932:74:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23932:74:0;;;;24029:133;24091:5;24098:9;24109:14;24125:12;24139:2;24143:8;24029:47;:133::i;:::-;24017:145;23464:706;-1:-1:-1;;;;;;;;;;;;;23464:706:0:o;30646:702::-;30880:8;16393:15;16381:8;:27;;16373:58;;;;;-1:-1:-1;;;16373:58:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16373:58:0;;;;;;;;;;;;;;;30901:133:::1;30947:4;;30952:1;30947:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;30947:7:0::1;30956:10;30968:45;30987:7;30996:4;;31001:1;30996:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;30996:7:0::1;31005:4;;31010:1;31005:7;;;;;;30968:45;31015:8;30901:31;:133::i;:::-;31045:18;31073:4:::0;;-1:-1:-1;;31078:15:0;;31073:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;31073:21:0::1;-1:-1:-1::0;;;;;31066:39:0::1;;31106:2;31066:43;;;;;;;;;;;;;-1:-1:-1::0;;;;;31066:43:0::1;-1:-1:-1::0;;;;;31066:43:0::1;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;31066:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;31066:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;31066:43:0;31120:44:::1;::::0;;31066:43:::1;31120:44:::0;;::::1;::::0;;;;;;;;;;;31066:43;;-1:-1:-1;31120:44:0::1;::::0;;;31155:4;;;;;;31120:44;::::1;::::0;31155:4;;31120:44;31155:4;31120:44;1:33:-1::1;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;31161:2:0;;-1:-1:-1;31120:34:0::1;::::0;-1:-1:-1;;31120:44:0:i:1;:::-;31263:12:::0;31197:62:::1;31245:13:::0;31204:4;;-1:-1:-1;;31209:15:0;;31204:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;31204:21:0::1;-1:-1:-1::0;;;;;31197:39:0::1;;31237:2;31197:43;;;;;;;;;;;;;-1:-1:-1::0;;;;;31197:43:0::1;-1:-1:-1::0;;;;;31197:43:0::1;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;31197:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;31197:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;31197:43:0;;:62:::1;:47;:62;:::i;:::-;:78;;31175:165;;;;-1:-1:-1::0;;;31175:165:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16442:1;30646:702:::0;;;;;;;:::o;32192:825::-;32459:8;16393:15;16381:8;:27;;16373:58;;;;;-1:-1:-1;;;16373:58:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16373:58:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;32518:4:0::1;32493:29;:4:::0;;-1:-1:-1;;32498:15:0;;32493:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;32493:21:0::1;-1:-1:-1::0;;;;;32493:29:0::1;;32485:65;;;::::0;;-1:-1:-1;;;32485:65:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;32485:65:0;;;;;;;;;;;;;::::1;;32561:133;32607:4;;32612:1;32607:7;;;;;;32561:133;32705:55;32740:4;;32705:55;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;32754:4:0::1;::::0;-1:-1:-1;32705:34:0::1;::::0;-1:-1:-1;;32705:55:0:i:1;:::-;32788:37;::::0;;-1:-1:-1;;;32788:37:0;;32819:4:::1;32788:37;::::0;::::1;::::0;;;32771:14:::1;::::0;-1:-1:-1;;;;;32795:4:0::1;32788:22;::::0;::::1;::::0;:37;;;;;::::1;::::0;;;;;;;;;:22;:37;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;32788:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;32788:37:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;32788:37:0;;-1:-1:-1;32844:25:0;;::::1;;32836:75;;;;-1:-1:-1::0;;;32836:75:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32928:4;-1:-1:-1::0;;;;;32922:20:0::1;;32943:9;32922:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;32922:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;32922:31:0;;;;32964:45;32995:2;32999:9;32964:30;:45::i;26208:673::-:0;26424:21;26396:8;16393:15;16381:8;:27;;16373:58;;;;;-1:-1:-1;;;16373:58:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16373:58:0;;;;;;;;;;;;;;;26482:4:::1;-1:-1:-1::0;;;;;26471:15:0::1;:4;;26476:1;26471:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;26471:7:0::1;-1:-1:-1::0;;;;;26471:15:0::1;;26463:51;;;::::0;;-1:-1:-1;;;26463:51:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;26463:51:0;;;;;;;;;;;;;::::1;;26535:50;26560:7;26569:9;26580:4;;26535:50;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;26535:24:0::1;::::0;-1:-1:-1;;;26535:50:0:i:1;:::-;26525:60;;26635:12;26604:7;26629:1;26612:7;:14;:18;26604:27;;;;;;;;;;;;;;:43;;26596:93;;;;-1:-1:-1::0;;;26596:93:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26706:4;-1:-1:-1::0;;;;;26700:19:0::1;;26727:7;26735:1;26727:10;;;;;;;;;;;;;;26700:40;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;26700:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;26700:40:0;;;;;26764:4;-1:-1:-1::0;;;;;26758:20:0::1;;26779:45;26798:7;26807:4;;26812:1;26807:7;;;;;;26779:45;26826:7;26834:1;26826:10;;;;;;;;;;;;;;26758:79;;;;;;;;;;;;;-1:-1:-1::0;;;;;26758:79:0::1;-1:-1:-1::0;;;;;26758:79:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;26758:79:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;26758:79:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;26758:79:0;26751:87:::1;;;;26849:24;26855:7;26864:4;;26849:24;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;26870:2:0;;-1:-1:-1;26849:5:0::1;::::0;-1:-1:-1;;26849:24:0:i:1;:::-;26208:673:::0;;;;;;;;:::o;33515:255::-;33668:13;33706:56;33729:9;33740;33751:10;33706:22;:56::i;25614:588::-;25838:21;25819:8;16393:15;16381:8;:27;;16373:58;;;;;-1:-1:-1;;;16373:58:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16373:58:0;;;;;;;;;;;;;;;25882:49:::1;25906:7;25915:9;25926:4;;25882:49;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;25882:23:0::1;::::0;-1:-1:-1;;;25882:49:0:i:1;:::-;25872:59;;25964:11;25950:7;25958:1;25950:10;;;;;;;;;;;;;;:25;;25942:71;;;;-1:-1:-1::0;;;25942:71:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16284:38:::0;;;:::o;33061:182::-;33158:12;33190:45;33207:7;33216:8;33226;33190:16;:45::i;22758:700::-;23024:14;23005:8;16393:15;16381:8;:27;;16373:58;;;;;-1:-1:-1;;;16373:58:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16373:58:0;;;;;;;;;;;;;;;23067:196:::1;23097:5;23117:4;23136:9;23160:14;23189:12;23224:4;23244:8;23067:15;:196::i;:::-;23313:38;::::0;;-1:-1:-1;;;23313:38:0;;23345:4:::1;23313:38;::::0;::::1;::::0;;;23051:212;;-1:-1:-1;23274:78:0::1;::::0;-1:-1:-1;23302:5:0;;23309:2;;-1:-1:-1;;;;;23313:23: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;23313:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;23313:38:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;23313:38:0;23274:27:::1;:78::i;:::-;23369:4;-1:-1:-1::0;;;;;23363:20:0::1;;23384:9;23363:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;23363:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;23363:31:0;;;;23405:45;23436:2;23440:9;23405:30;:45::i;31354:832::-:0;31614:8;16393:15;16381:8;:27;;16373:58;;;;;-1:-1:-1;;;16373:58:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16373:58:0;;;;;;;;;;;;;;;31659:4:::1;-1:-1:-1::0;;;;;31648:15:0::1;:4;;31653:1;31648:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;31648:7:0::1;-1:-1:-1::0;;;;;31648:15:0::1;;31640:51;;;::::0;;-1:-1:-1;;;31640:51:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;31640:51:0;;;;;;;;;;;;;::::1;;31702:13;31718:9;31702:25;;31744:4;-1:-1:-1::0;;;;;31738:19:0::1;;31765:8;31738:38;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;31738:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;31738:38:0;;;;;31800:4;-1:-1:-1::0;;;;;31794:20:0::1;;31815:45;31834:7;31843:4;;31848:1;31843:7;;;;;;31815:45;31862:8;31794:77;;;;;;;;;;;;;-1:-1:-1::0;;;;;31794:77:0::1;-1:-1:-1::0;;;;;31794:77:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;31794:77:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;31794:77:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;31794:77:0;31787:85:::1;;;;31883:18;31911:4:::0;;-1:-1:-1;;31916:15:0;;31911:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;31911:21:0::1;-1:-1:-1::0;;;;;31904:39:0::1;;31944:2;31904:43;;;;;;;;;;;;;-1:-1:-1::0;;;;;31904:43:0::1;-1:-1:-1::0;;;;;31904:43:0::1;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;31904:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;31904:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;31904:43:0;31958:44:::1;::::0;;31904:43:::1;31958:44:::0;;::::1;::::0;;;;;;;;;;;31904:43;;-1:-1:-1;31958:44:0::1;::::0;;;31993:4;;;;;;31958:44;::::1;::::0;31993:4;;31958:44;31993:4;31958:44;1:33:-1::1;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;31999:2:0;;-1:-1:-1;31958:34:0::1;::::0;-1:-1:-1;;31958:44:0:i:1;:::-;32101:12:::0;32035:62:::1;32083:13:::0;32042:4;;-1:-1:-1;;32047:15:0;;32042:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;32042:21:0::1;-1:-1:-1::0;;;;;32035:39:0::1;;32075:2;32035:43;;;;;;;;;;;;;-1:-1:-1::0;;;;;32035:43:0::1;-1:-1:-1::0;;;;;32035:43:0::1;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;19837:829:0::0;20091:12;20105;20072:8;16393:15;16381:8;:27;;16373:58;;;;;-1:-1:-1;;;16373:58:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16373:58:0;;;;;;;;;;;;;;;20130:12:::1;20145:43;20164:7;20173:6;20181;20145:18;:43::i;:::-;20199:56;::::0;;-1:-1:-1;;;20199:56:0;;20227:10:::1;20199:56;::::0;::::1;::::0;-1:-1:-1;;;;;20199:27:0;::::1;:56:::0;;;;;;;;;;;;;;20130:58;;-1:-1:-1;20199:27:0;;::::1;::::0;:56;;;;;::::1;::::0;;;;;;;;;-1:-1:-1;20199:27:0;:56;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;20199:56:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;20199:56:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;;20323:23:0::1;::::0;;-1:-1:-1;;;20323:23:0;;-1:-1:-1;;;;;20323:23:0;;::::1;;::::0;::::1;::::0;;;20293:12:::1;::::0;;;20323:19;;::::1;::::0;::::1;::::0;:23;;;;;;;;;;;20293:12;20323:19;:23;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;20323:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;20323:23:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;20323:23:0;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;20323:23:0;-1:-1:-1;20358:14:0::1;20377:37;20399:6:::0;20407;20377:21:::1;:37::i;:::-;20357:57;;;20456:6;-1:-1:-1::0;;;;;20446:16:0::1;:6;-1:-1:-1::0;;;;;20446:16:0::1;;:58;;20487:7;20496;20446:58;;;20466:7;20475;20446:58;20425:79:::0;;-1:-1:-1;20425:79:0;-1:-1:-1;20523:21:0;;::::1;;20515:66;;;::::0;;-1:-1:-1;;;20515:66:0;;::::1;;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;;;;;;;;;;::::1;;20611:10;20600:7;:21;;20592:66;;;::::0;;-1:-1:-1;;;20592:66:0;;::::1;;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;;;;;;;;;;::::1;;16442:1;;;;19837:829:::0;;;;;;;;;;;:::o;16236:41::-;;;:::o;33778:247::-;33922:21;33968:49;33993:7;34002:8;34012:4;33968:24;:49::i;22022:657::-;22311:16;22329:14;22356:12;22371:40;22390:7;22399:5;22406:4;22371:18;:40::i;:::-;22356:55;;22422:10;22435;:33;;22459:9;22435:33;;;-1:-1:-1;;22435:33:0;22479:74;;;-1:-1:-1;;;22479:74:0;;22501:10;22479:74;;;;22521:4;22479:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22422:46;;-1:-1:-1;;;;;;22479:21:0;;;;;:74;;;;;-1:-1:-1;;22479:74:0;;;;;;;;-1:-1:-1;22479:21:0;:74;;;2:2:-1;;;;27:1;24;17:12;2:2;22479:74:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22479:74:0;;;;22591:80;22610:5;22617:9;22628:14;22644:12;22658:2;22662:8;22591:18;:80::i;:::-;22564:107;;;;-1:-1:-1;22022:657:0;-1:-1:-1;;;;;;;;;;;;;22022:657:0:o;18100:726::-;18388:12;18402;18416:14;18369:8;16393:15;16381:8;:27;;16373:58;;;;;-1:-1:-1;;;16373:58:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16373:58:0;;;;;;;;;;;;;;;18464:85:::1;18478:6;18486;18494:14;18510;18526:10;18538;18464:13;:85::i;:::-;18443:106:::0;;-1:-1:-1;18443:106:0;-1:-1:-1;18560:12:0::1;18575:43;18594:7;18603:6:::0;18611;18575:18:::1;:43::i;:::-;18560:58;;18629:66;18661:6;18669:10;18681:4;18687:7;18629:31;:66::i;:::-;18706;18738:6;18746:10;18758:4;18764:7;18706:31;:66::i;:::-;18804:4;-1:-1:-1::0;;;;;18795:19:0::1;;18815:2;18795:23;;;;;;;;;;;;;-1:-1:-1::0;;;;;18795:23:0::1;-1:-1:-1::0;;;;;18795:23:0::1;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;18795:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;18795:23:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;18795:23:0;18100:726;;;;-1:-1:-1;18795:23:0;;-1:-1:-1;18100:726:0;;-1:-1:-1;;;;;;;;;18100:726:0:o;18832:962::-;19085:16;19103:14;19119;19066:8;16393:15;16381:8;:27;;16373:58;;;;;-1:-1:-1;;;16373:58:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16373:58:0;;;;;;;;;;;;;;;19173:176:::1;19201:5;19221:4;19240:18;19273:9;19297:14;19326:12;19173:13;:176::i;:::-;19146:203:::0;;-1:-1:-1;19146:203:0;-1:-1:-1;19360:12:0::1;19375:40;19394:7;19403:5:::0;19410:4:::1;19375:18;:40::i;:::-;19360:55;;19426:69;19458:5;19465:10;19477:4;19483:11;19426:31;:69::i;:::-;19512:4;-1:-1:-1::0;;;;;19506:19:0::1;;19533:9;19506:39;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;19506:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;19506:39:0;;;;;19569:4;-1:-1:-1::0;;;;;19563:20:0::1;;19584:4;19590:9;19563:37;;;;;;;;;;;;;-1:-1:-1::0;;;;;19563:37:0::1;-1:-1:-1::0;;;;;19563:37:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;19563:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;19563:37:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;19563:37:0;19556:45:::1;;;;19633:4;-1:-1:-1::0;;;;;19624:19:0::1;;19644:2;19624:23;;;;;;;;;;;;;-1:-1:-1::0;;;;;19624:23:0::1;-1:-1:-1::0;;;;;19624:23:0::1;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;19624:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;19624:23:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;19624:23:0;;-1:-1:-1;19698:9:0::1;:21:::0;-1:-1:-1;19694:92:0::1;;;19721:65;19752:10;19776:9;19764;:21;19721:30;:65::i;:::-;16442:1;18832:962:::0;;;;;;;;;;;:::o;28529:786::-;28742:21;28714:8;16393:15;16381:8;:27;;16373:58;;;;;-1:-1:-1;;;16373:58:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16373:58:0;;;;;;;;;;;;;;;28800:4:::1;-1:-1:-1::0;;;;;28789:15:0::1;:4;;28794:1;28789:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;28789:7:0::1;-1:-1:-1::0;;;;;28789:15:0::1;;28781:51;;;::::0;;-1:-1:-1;;;28781:51:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;28781:51:0;;;;;;;;;;;;;::::1;;28853:49;28877:7;28886:9;28897:4;;28853:49;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;28853:23:0::1;::::0;-1:-1:-1;;;28853:49:0:i:1;:::-;28843:59;;28935:9;28921:7;28929:1;28921:10;;;;;;;;;;;;;;:23;;28913:69;;;;-1:-1:-1::0;;;28913:69:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28999:4;-1:-1:-1::0;;;;;28993:19:0::1;;29020:7;29028:1;29020:10;;;;;;;;;;;;;;28993:40;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;28993:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;28993:40:0;;;;;29057:4;-1:-1:-1::0;;;;;29051:20:0::1;;29072:45;29091:7;29100:4;;29105:1;29100:7;;;;;;29072:45;29119:7;29127:1;29119:10;;;;;;;;;;;;;;29051:79;;;;;;;;;;;;;-1:-1:-1::0;;;;;29051:79:0::1;-1:-1:-1::0;;;;;29051:79:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;29051:79:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;29051:79:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;29051:79:0;29044:87:::1;;;;29142:24;29148:7;29157:4;;29142:24;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;29163:2:0;;-1:-1:-1;29142:5:0::1;::::0;-1:-1:-1;;29142:24:0:i:1;:::-;29229:7;29237:1;29229:10;;;;;;;;;;;;;;29217:9;:22;29213:94;;;29241:66;29272:10;29296:7;29304:1;29296:10;;;;;;;;;;;;;;29284:9;:22;29241:30;:66::i;569:361::-:0;764:45;;;-1:-1:-1;;;;;764:45:0;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;764:45:0;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;753:57:0;;;;718:12;;732:17;;753:10;;;;764:45;753:57;;;25:18:-1;753:57:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;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;;;753: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;;717:93:0;;;;829:7;:57;;;;-1:-1:-1;841:11:0;;:16;;:44;;;872:4;861:24;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;861:24:0;841:44;821:101;;;;;-1:-1:-1;;;821:101:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;569:361;;;;;:::o;1348:195::-;1456:12;;;1418;1456;;;;;;;;;-1:-1:-1;;;;;1435:7:0;;;1449:5;;1435:34;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;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;;;1435: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;;1417:52:0;;;1488:7;1480:55;;;;-1:-1:-1;;;1480:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1348:195;;;:::o;12662:507::-;12755:14;12801:1;12790:8;:12;12782:62;;;;-1:-1:-1;;;12782:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12875:1;12863:9;:13;:31;;;;;12893:1;12880:10;:14;12863:31;12855:78;;;;-1:-1:-1;;;12855:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12944:20;12967:18;:8;12980:4;12967:18;:12;:18;:::i;:::-;12944:41;-1:-1:-1;12996:14:0;13013:31;12944:41;13033:10;13013:31;:19;:31;:::i;:::-;12996:48;-1:-1:-1;13055:16:0;13074:41;13099:15;13074:20;:9;13088:5;13074:20;:13;:20;:::i;:::-;:24;:41;:24;:41;:::i;:::-;13055:60;;13150:11;13138:9;:23;;;;;;;12662:507;-1:-1:-1;;;;;;;12662:507:0:o;13834:505::-;13935:21;13992:1;13977:4;:11;:16;;13969:53;;;;;-1:-1:-1;;;13969:53:0;;;;;;;;;;;;-1:-1:-1;;;13969:53:0;;;;;;;;;;;;;;;14054:4;:11;14043:23;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;14043:23:0;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;;-1:-1;14043:23:0;;14033:33;;14090:8;14077:7;14085:1;14077:10;;;;;;;;;;;;;:21;;;;;14114:6;14109:223;14140:1;14126:4;:11;:15;14122:1;:19;14109:223;;;14164:14;14180:15;14199:42;14211:7;14220:4;14225:1;14220:7;;;;;;;;;;;;;;14229:4;14234:1;14238;14234:5;14229:11;;;;;;;;;;;;;;14199;:42::i;:::-;14163:78;;;;14273:47;14286:7;14294:1;14286:10;;;;;;;;;;;;;;14298:9;14309:10;14273:12;:47::i;:::-;14256:7;14264:1;14268;14264:5;14256:14;;;;;;;;;;;;;;;;;:64;-1:-1:-1;;14143:3:0;;14109:223;;;;13834:505;;;;;:::o;11154:478::-;11243:12;11269:14;11285;11303:26;11314:6;11322;11303:10;:26::i;:::-;11467:32;;;-1:-1:-1;;11467:32:0;;;;;;;;;;;;;;;;;;;;;;;;;22::-1;26:21;;;22:32;6:49;;11467:32:0;;;;;11457:43;;;;;;-1:-1:-1;;;;;;11370:251:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;11370:251:0;;;;;;;11360:262;;;;;;;;;11154:478;-1:-1:-1;;;;;11154:478:0:o;938:402::-;1163:51;;;-1:-1:-1;;;;;1163:51:0;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;1163:51:0;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;1152:63:0;;;;1117:12;;1131:17;;1152:10;;;;1163:51;1152:63;;;25:18:-1;1152:63:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;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;;;1152: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;;1116:99:0;;;;1234:7;:57;;;;-1:-1:-1;1246:11:0;;:16;;:44;;;1277:4;1266:24;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;1266:24:0;1246:44;1226:106;;;;-1:-1:-1;;;1226:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;938:402;;;;;;:::o;24281:711::-;24388:6;24383:602;24414:1;24400:4;:11;:15;24396:1;:19;24383:602;;;24438:13;24453:14;24472:4;24477:1;24472:7;;;;;;;;;;;;;;24481:4;24486:1;24490;24486:5;24481:11;;;;;;;;;;;;;;24437:56;;;;24509:14;24528:36;24550:5;24557:6;24528:21;:36::i;:::-;24508:56;;;24579:14;24596:7;24604:1;24608;24604:5;24596:14;;;;;;;;;;;;;;24579:31;;24626:15;24643;24671:6;-1:-1:-1;;;;;24662:15:0;:5;-1:-1:-1;;;;;24662:15:0;;:61;;24704:9;24720:1;24662:61;;;24686:1;24690:9;24662:61;24625:98;;;;24738:10;24769:1;24755:4;:11;:15;24751:1;:19;:76;;24824:3;24751:76;;;24773:48;24792:7;24801:6;24809:4;24814:1;24818;24814:5;24809:11;;;;;;;;;;;;;;24773:18;:48::i;:::-;24738:89;;24851:42;24870:7;24879:5;24886:6;24851:18;:42::i;:::-;-1:-1:-1;;;;;24842:57:0;;24918:10;24930;24942:2;24956:1;24946:12;;;;;;;;;;;;;;;;;;;;;;;;;21:6:-1;;108:14;24946:12:0;87:42:-1;143:17;;-1:-1;24946:12:0;;24842:131;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24842:131:0;-1:-1:-1;;;;;24842:131:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;24842:131:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;24842:131:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;24417:3:0;;;;;-1:-1:-1;24383:602:0;;-1:-1:-1;;;;;;;;24383:602:0;;;24281:711;;;:::o;14420:526::-;14521:21;14578:1;14563:4;:11;:16;;14555:53;;;;;-1:-1:-1;;;14555:53:0;;;;;;;;;;;;-1:-1:-1;;;14555:53:0;;;;;;;;;;;;;;;14640:4;:11;14629:23;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;14629:23:0;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;;-1:-1;14629:23:0;;14619:33;;14693:9;14663:7;14688:1;14671:7;:14;:18;14663:27;;;;;;;;;;;;;;;;;:39;14727:11;;-1:-1:-1;;14727:15:0;14713:226;14744:5;;14713:226;;14772:14;14788:15;14807:42;14819:7;14828:4;14837:1;14833;:5;14828:11;;;;;;;;;;;;;;14841:4;14846:1;14841:7;;;;;;;14807:42;14771:78;;;;14881:46;14893:7;14901:1;14893:10;;;;;;;;;;;;;;14905:9;14916:10;14881:11;:46::i;:::-;14864:7;14876:1;14872;:5;14864:14;;;;;;;;;;;;;;;;;:63;-1:-1:-1;;;;14751:3:0;14713:226;;29462:1178;29575:6;29570:1063;29601:1;29587:4;:11;:15;29583:1;:19;29570:1063;;;29625:13;29640:14;29659:4;29664:1;29659:7;;;;;;;;;;;;;;29668:4;29673:1;29677;29673:5;29668:11;;;;;;;;;;;;;;29624:56;;;;29696:14;29715:36;29737:5;29744:6;29715:21;:36::i;:::-;29695:56;;;29766:13;29791:42;29810:7;29819:5;29826:6;29791:18;:42::i;:::-;29766:68;;29849:16;29880:17;29968:13;29983;30001:4;-1:-1:-1;;;;;30001:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;30001:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30001:18:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;30001:18:0;;;;;;;-1:-1:-1;;;;;29967:52:0;;;;-1:-1:-1;29967:52:0;;-1:-1:-1;30035:17:0;;-1:-1:-1;;;;;30076:15:0;;;;;;;:61;;30118:8;30128;30076:61;;;30095:8;30105;30076:61;30034:103;;;;30166:56;30209:12;30173:5;-1:-1:-1;;;;;30166:23:0;;30198:4;30166:38;;;;;;;;;;;;;-1:-1:-1;;;;;30166:38:0;-1:-1:-1;;;;;30166:38:0;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;30166:56:0;30152:70;;30252:65;30276:11;30289:12;30303:13;30252:23;:65::i;:::-;30237:80;;29570:1063;;;;30348:15;30365;30393:6;-1:-1:-1;;;;;30384:15:0;:5;-1:-1:-1;;;;;30384:15:0;;:67;;30429:12;30448:1;30384:67;;;30408:1;30412:12;30384:67;30347:104;;;;30466:10;30497:1;30483:4;:11;:15;30479:1;:19;:76;;30552:3;30479:76;;;30501:48;30520:7;30529:6;30537:4;30542:1;30546;30542:5;30537:11;;;;;;;30501:48;30608:12;;;30618:1;30608:12;;;;;;;;;;-1:-1:-1;;;30570:51:0;;;;;;;;;;;;;;-1:-1:-1;;;;;30570:51:0;;;;;;;;;;;;;;;;;;;;;;30466:89;;-1:-1:-1;30570:9:0;;;;;;30580:10;;30592;;30466:89;;30608:12;;30570:51;;;;;;;;30608:12;;30570:51;;;;30608: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;30570:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;30570:51:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;29604:3:0;;;;;-1:-1:-1;29570:1063:0;;-1:-1:-1;;;;;;;;;;29570:1063:0;7683:129;7767:5;;;7762:16;;;;7754:50;;;;;-1:-1:-1;;;7754:50:0;;;;;;;;;;;;-1:-1:-1;;;7754:50:0;;;;;;;;;;;;;;13290:462;13383:13;13429:1;13417:9;:13;13409:64;;;;-1:-1:-1;;;13409:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13504:1;13492:9;:13;:31;;;;;13522:1;13509:10;:14;13492:31;13484:78;;;;-1:-1:-1;;;13484:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13573:14;13590:35;13619:5;13590:24;:9;13604;13590:24;:13;:24;:::i;:::-;:28;:35;:28;:35;:::i;:::-;13573:52;-1:-1:-1;13636:16:0;13655:35;13685:4;13655:25;:10;13670:9;13655:25;:14;:25;:::i;:35::-;13636:54;;13712:32;13742:1;13725:11;13713:9;:23;;;;;;;13712:32;:29;:32;:::i;:::-;13701:43;13290:462;-1:-1:-1;;;;;;13290:462:0:o;12231:309::-;12313:12;12356:1;12346:7;:11;12338:55;;;;;-1:-1:-1;;;12338:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;12423:1;12412:8;:12;:28;;;;;12439:1;12428:8;:12;12412:28;12404:75;;;;-1:-1:-1;;;12404:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12524:8;12500:21;:7;12512:8;12500:21;:11;:21;:::i;:::-;:32;;;;;;;12231:309;-1:-1:-1;;;;12231:309:0:o;10725:337::-;10800:14;10816;10861:6;-1:-1:-1;;;;;10851:16:0;:6;-1:-1:-1;;;;;10851:16:0;;;10843:60;;;;;-1:-1:-1;;;10843:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;10942:6;-1:-1:-1;;;;;10933:15:0;:6;-1:-1:-1;;;;;10933:15:0;;:53;;10971:6;10979;10933:53;;;10952:6;10960;10933:53;10914:72;;-1:-1:-1;10914:72:0;-1:-1:-1;;;;;;11005:20:0;;10997:57;;;;;-1:-1:-1;;;10997:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;10725:337;;;;;:::o;16746:1348::-;17059:44;;;-1:-1:-1;;;17059:44:0;;-1:-1:-1;;;;;17059:44:0;;;;;;;;;;;;;;;;16964:12;;;;;;17071:7;17059:28;;;;;;:44;;;;;;;;;;;;;;;:28;:44;;;2:2:-1;;;;27:1;24;17:12;2:2;17059:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;17059:44:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;17059:44:0;-1:-1:-1;;;;;17059:58:0;;17055:138;;;17134:47;;;-1:-1:-1;;;17134:47:0;;-1:-1:-1;;;;;17134:47:0;;;;;;;;;;;;;;;;17146:7;17134:31;;;;;;:47;;;;;;;;;;;;;;;-1:-1:-1;17134:31:0;:47;;;2:2:-1;;;;27:1;24;17:12;2:2;17134:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;17134:47:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;17055:138:0;17204:13;17219;17236:47;17259:7;17268:6;17276;17236:22;:47::i;:::-;17203:80;;;;17298:8;17310:1;17298:13;:30;;;;-1:-1:-1;17315:13:0;;17298:30;17294:793;;;17367:14;;-1:-1:-1;17383:14:0;;-1:-1:-1;17294:793:0;;;17431:19;17453:52;17470:14;17486:8;17496;17453:16;:52::i;:::-;17431:74;;17542:14;17524;:32;17520:556;;17603:10;17585:14;:28;;17577:73;;;;;-1:-1:-1;;;17577:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17691:14;;-1:-1:-1;17707:14:0;-1:-1:-1;17707:14:0;17520:556;;;17763:19;17785:52;17802:14;17818:8;17828;17785:16;:52::i;:::-;17763:74;;17881:14;17863;:32;;17856:40;;;;17941:10;17923:14;:28;;17915:73;;;;;-1:-1:-1;;;17915:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18029:14;-1:-1:-1;18045:14:0;;-1:-1:-1;17520:556:0;17294:793;;16746:1348;;;;;;;;;;;:::o;7820:142::-;7872:6;7899;;;:30;;-1:-1:-1;;7914:5:0;;;7928:1;7923;7914:5;7923:1;7909:15;;;;;:20;7899:30;7891:63;;;;;-1:-1:-1;;;7891:63:0;;;;;;;;;;;;-1:-1:-1;;;7891:63:0;;;;;;;;;;;;;;7547:128;7631:5;;;7626:16;;;;7618:49;;;;;-1:-1:-1;;;7618:49:0;;;;;;;;;;;;-1:-1:-1;;;7618:49:0;;;;;;;;;;;;;;11690:428;11783:13;11798;11825:14;11844:26;11855:6;11863;11844:10;:26::i;:::-;11824:46;;;11881:32;11889:7;11898:6;11906;11881:7;:32::i;:::-;;11925:13;11940;11967:32;11975:7;11984:6;11992;11967:7;:32::i;:::-;-1:-1:-1;;;;;11958:54:0;;:56;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;11958:56:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;11958:56:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;11958:56:0;;;;;;;-1:-1:-1;;;;;11924:90:0;;;;-1:-1:-1;11924:90:0;;-1:-1:-1;;;;;;12048:16:0;;;;;;;:62;;12091:8;12101;12048:62;;;12068:8;12078;12048:62;12025:85;;;;-1:-1:-1;11690:428:0;-1:-1:-1;;;;;;;11690:428:0:o

Swarm Source

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