Contract 0x6022ff1654247f4e715254be00daa49f163b8d00

 
 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x901ee1456bd9613a221c710b7c78252eb385cbc00d38f1c04a06253e68438bbaSwap Exact Token...121482662021-10-27 23:28:472 mins ago0x6d73ee520d233fca5e986dd7e97e126ba24e8353 IN  0x6022ff1654247f4e715254be00daa49f163b8d000 BNB0.00072668
0x396ea58f63ee914ef464680adb377f9f7d06a465ebb945dc057f6d997a5665deSwap Exact Token...121482202021-10-27 23:26:294 mins ago0xa9c543b4c1470e3c3fe6ef9492a31fead682381e IN  0x6022ff1654247f4e715254be00daa49f163b8d000 BNB0.00188135
0xe83ab5633f3f498d6393666140dd18324d328a6964c6aa335f0c5b7d1240baebRemove Liquidity121480712021-10-27 23:19:0211 mins ago0x6154399eb5a55f5adda71d57ce5c42747f76651f IN  0x6022ff1654247f4e715254be00daa49f163b8d000 BNB0.00105296
0x0d47b9a8cdc9833678147aab05937c8831d592afb06c1bce87b92dcc15ad2c13Swap Exact Token...121478792021-10-27 23:09:2621 mins ago0x64ff092e1c1c2b21488b307d7ca3b5cd98c6ad40 IN  0x6022ff1654247f4e715254be00daa49f163b8d000 BNB0.00072668
0xb94464b103095e494a746fd1e8b69b609f56f149b0f0441485eab61f08eb109dSwap Exact Token...121478742021-10-27 23:09:1121 mins ago0x234d871cb302b94a72a5273ca337dc7972c33888 IN  0x6022ff1654247f4e715254be00daa49f163b8d000 BNB0.000794195
0xb8050128e9ae1fcc4e7c0f41f82aee7ffa2ce1ce75bf02b5bf1ca0830ea94a82Swap Exact Token...121478482021-10-27 23:07:5323 mins ago0xfc3b9fe7ae34a00d60b04472659ebb6f1b8dfd86 IN  0x6022ff1654247f4e715254be00daa49f163b8d000 BNB0.00161986
0xf8c4bfd353a1b773cd4c46fd9dd20f62e7357478930758d603ff9e12b55f39a8Swap Exact Token...121478272021-10-27 23:06:5024 mins ago0x7e50c6c8ed301e916876c2bb37e7446ac652346b IN  0x6022ff1654247f4e715254be00daa49f163b8d000 BNB0.0007938
0x89c5c39eae48097084b833fe662b8621d88161695b919dd60bc60c97c8dfda03Remove Liquidity121478172021-10-27 23:06:2024 mins ago0x7e50c6c8ed301e916876c2bb37e7446ac652346b IN  0x6022ff1654247f4e715254be00daa49f163b8d000 BNB0.000838775
0x53c6fd8c92f5ed7c4b732a180dee16b55a1b9e758b35f6820e1262932634f150Swap Exact Token...121476962021-10-27 23:00:1730 mins ago0xb2a4584407bb58a02a4183d20a4fbc1db4c55b92 IN  0x6022ff1654247f4e715254be00daa49f163b8d000 BNB0.0008688
0x71633ad0b4ee2b18c0b407a6c20b1cc1ab3f07c3e37705b64607fb054158d420Swap Exact Token...121474692021-10-27 22:48:5642 mins ago0xf324adc872005197a6f7dae214d3b63aa0c3625f IN  0x6022ff1654247f4e715254be00daa49f163b8d000 BNB0.001070485
0xe1cdc2244b6d157afa7ea89826b3cffdb0578e061ba3f3b497bcc9edc742453fSwap Exact Token...121474622021-10-27 22:48:3542 mins ago0xf324adc872005197a6f7dae214d3b63aa0c3625f IN  0x6022ff1654247f4e715254be00daa49f163b8d000 BNB0.001020385
0x399cc3e050a02112cea0680939f3abd72926d608f133dfa104ae4e9ee4e6fc4bSwap Exact Token...121474562021-10-27 22:48:1742 mins ago0xf324adc872005197a6f7dae214d3b63aa0c3625f IN  0x6022ff1654247f4e715254be00daa49f163b8d000 BNB0.001665905
0x10f44e4472d409e840af1e60673fd3e5995f81182aa30406b3509176c85dfddaSwap Exact Token...121473842021-10-27 22:44:4146 mins ago0x47798dc3057dfb1612de932e7d2c7efa4fc421ca IN  0x6022ff1654247f4e715254be00daa49f163b8d000 BNB0.00072668
0xf1eaae2c3bf355f4b523b87ade717fac6b186be2b0965af59075e9a84693a7dcSwap Exact Token...121472782021-10-27 22:39:2351 mins ago0x043420587faa9a292e0b689bd7d096f9570a28fc IN  0x6022ff1654247f4e715254be00daa49f163b8d000 BNB0.00094756
0xb49fa358b4fa702d457b55c586e5bc824f537c6f368fecb53fbf127fca077364Swap Exact Token...121472492021-10-27 22:37:5653 mins ago0x7563b3172636a3343ff0eda7c0a858f84cdde770 IN  0x6022ff1654247f4e715254be00daa49f163b8d000 BNB0.001248545
0x2877da0a29365d3ba41b93ded5617c98ba956d06f21f0a5b2820955cf30608c3Add Liquidity121470322021-10-27 22:27:051 hr 3 mins ago0x785b291ba3701855f8f8a7196f2ed876513bff3f IN  0x6022ff1654247f4e715254be00daa49f163b8d000 BNB0.001260045
0x17b454c68ba746968698111b600d305401f1dd185e3ab5902000cc5e76a8b656Swap Exact Token...121470242021-10-27 22:26:411 hr 4 mins ago0x785b291ba3701855f8f8a7196f2ed876513bff3f IN  0x6022ff1654247f4e715254be00daa49f163b8d000 BNB0.002022645
0xd49ed10b1e252218c28129e53736b65794690e6ff945f2d1b406ba2cd00dd8acSwap Exact Token...121463612021-10-27 21:53:321 hr 37 mins ago0x4de94bfcf0a7a692cb61f5037675628b43f69d1b IN  0x6022ff1654247f4e715254be00daa49f163b8d000 BNB0.00102544
0xb1f1475c9328a5b2792a54755182b4455176f0eeb25a672a30815caa9dddf524Swap Exact Token...121459992021-10-27 21:35:251 hr 55 mins ago0x0383a7d79478ef05ba1183884b6d7c698256813d IN  0x6022ff1654247f4e715254be00daa49f163b8d000 BNB0.00100964
0x35d684ac0fd5eb54d05b28382440cb006c676cfbc4df63b122d10e2c249133f8Swap Exact Token...121459182021-10-27 21:31:221 hr 59 mins ago0x2721210569ecc60244d0a99ebc0c01d72fa91a1c IN  0x6022ff1654247f4e715254be00daa49f163b8d000 BNB0.00088454
0xad8bfea8e5ede2a1cf2af2b977fe202c938818ad833f71831c10a93335ce72c5Swap Exact Token...121459052021-10-27 21:30:432 hrs ago0xa1811902eb8527edcba13c7cb93465efff43b853 IN  0x6022ff1654247f4e715254be00daa49f163b8d000 BNB0.00105202
0x8dd06dfe88dd0b58de48dd4d582fe9ec56863ac00757c5a0e11783f5389da339Add Liquidity ET...121457482021-10-27 21:22:522 hrs 8 mins ago0x13b39775583e0888f9836782acf9f1e50f767ca4 IN  0x6022ff1654247f4e715254be00daa49f163b8d000.129815182701228 BNB0.00095685
0xd87edd7bea8a946bc1deae9427ec2dd1d1d41e9cdcaa34a7f774365f98471372Swap Exact Token...121457432021-10-27 21:22:372 hrs 8 mins ago0x13b39775583e0888f9836782acf9f1e50f767ca4 IN  0x6022ff1654247f4e715254be00daa49f163b8d000 BNB0.001032805
0x4fa86392fb44dc7f2cf83a5ff80dcfed0cca425b1ec6901b5234dfc9778b3712Add Liquidity ET...121452282021-10-27 20:56:522 hrs 34 mins ago0xdbb2d0b767690c4112ea58523d1d56f98c7cc0d2 IN  0x6022ff1654247f4e715254be00daa49f163b8d000.13273734332345 BNB0.00095685
0x56a844aa10dbc695b2a5de9f673c94d35a268fbe2f0028f47f1cb063411c94f6Swap Exact Token...121452172021-10-27 20:56:192 hrs 34 mins ago0xdbb2d0b767690c4112ea58523d1d56f98c7cc0d2 IN  0x6022ff1654247f4e715254be00daa49f163b8d000 BNB0.00135171
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xe1cdc2244b6d157afa7ea89826b3cffdb0578e061ba3f3b497bcc9edc742453f121474622021-10-27 22:48:3542 mins ago 0x6022ff1654247f4e715254be00daa49f163b8d000xf324adc872005197a6f7dae214d3b63aa0c3625f0.464543784310406044 BNB
0xe1cdc2244b6d157afa7ea89826b3cffdb0578e061ba3f3b497bcc9edc742453f121474622021-10-27 22:48:3542 mins ago Binance: WBNB Token 0x6022ff1654247f4e715254be00daa49f163b8d000.464543784310406044 BNB
0xd49ed10b1e252218c28129e53736b65794690e6ff945f2d1b406ba2cd00dd8ac121463612021-10-27 21:53:321 hr 37 mins ago 0x6022ff1654247f4e715254be00daa49f163b8d000x4de94bfcf0a7a692cb61f5037675628b43f69d1b0.084145741898620215 BNB
0xd49ed10b1e252218c28129e53736b65794690e6ff945f2d1b406ba2cd00dd8ac121463612021-10-27 21:53:321 hr 37 mins ago Binance: WBNB Token 0x6022ff1654247f4e715254be00daa49f163b8d000.084145741898620215 BNB
0x35d684ac0fd5eb54d05b28382440cb006c676cfbc4df63b122d10e2c249133f8121459182021-10-27 21:31:221 hr 59 mins ago 0x6022ff1654247f4e715254be00daa49f163b8d000x2721210569ecc60244d0a99ebc0c01d72fa91a1c0.044730704959640295 BNB
0x35d684ac0fd5eb54d05b28382440cb006c676cfbc4df63b122d10e2c249133f8121459182021-10-27 21:31:221 hr 59 mins ago Binance: WBNB Token 0x6022ff1654247f4e715254be00daa49f163b8d000.044730704959640295 BNB
0x8dd06dfe88dd0b58de48dd4d582fe9ec56863ac00757c5a0e11783f5389da339121457482021-10-27 21:22:522 hrs 8 mins ago 0x6022ff1654247f4e715254be00daa49f163b8d000x13b39775583e0888f9836782acf9f1e50f767ca41 wei
0x8dd06dfe88dd0b58de48dd4d582fe9ec56863ac00757c5a0e11783f5389da339121457482021-10-27 21:22:522 hrs 8 mins ago 0x6022ff1654247f4e715254be00daa49f163b8d00 Binance: WBNB Token0.129815182701228777 BNB
0xd87edd7bea8a946bc1deae9427ec2dd1d1d41e9cdcaa34a7f774365f98471372121457432021-10-27 21:22:372 hrs 8 mins ago 0x6022ff1654247f4e715254be00daa49f163b8d000x13b39775583e0888f9836782acf9f1e50f767ca40.129615744539273731 BNB
0xd87edd7bea8a946bc1deae9427ec2dd1d1d41e9cdcaa34a7f774365f98471372121457432021-10-27 21:22:372 hrs 8 mins ago Binance: WBNB Token 0x6022ff1654247f4e715254be00daa49f163b8d000.129615744539273731 BNB
0x4fa86392fb44dc7f2cf83a5ff80dcfed0cca425b1ec6901b5234dfc9778b3712121452282021-10-27 20:56:522 hrs 34 mins ago 0x6022ff1654247f4e715254be00daa49f163b8d000xdbb2d0b767690c4112ea58523d1d56f98c7cc0d21 wei
0x4fa86392fb44dc7f2cf83a5ff80dcfed0cca425b1ec6901b5234dfc9778b3712121452282021-10-27 20:56:522 hrs 34 mins ago 0x6022ff1654247f4e715254be00daa49f163b8d00 Binance: WBNB Token0.132737343323450193 BNB
0x3cef7bb61d78cf24ec98ec0b4d0230779563c5fb8f0c4a33fbf1a293f37740e6121439402021-10-27 19:52:253 hrs 38 mins ago 0x6022ff1654247f4e715254be00daa49f163b8d000x45f0c6eef98bd80b2df8c9b0ead3d398892faffc0.346972175076553099 BNB
0x3cef7bb61d78cf24ec98ec0b4d0230779563c5fb8f0c4a33fbf1a293f37740e6121439402021-10-27 19:52:253 hrs 38 mins ago Binance: WBNB Token 0x6022ff1654247f4e715254be00daa49f163b8d000.346972175076553099 BNB
0x3fc6f116ef61a78afdcf20d387d10edca5fedeca02c885f18cde793c602662ba121429732021-10-27 19:03:554 hrs 27 mins ago 0x6022ff1654247f4e715254be00daa49f163b8d000xb2a4584407bb58a02a4183d20a4fbc1db4c55b921 wei
0x3fc6f116ef61a78afdcf20d387d10edca5fedeca02c885f18cde793c602662ba121429732021-10-27 19:03:554 hrs 27 mins ago 0x6022ff1654247f4e715254be00daa49f163b8d00 Binance: WBNB Token0.398178629121075957 BNB
0xaaa1cce7d1ab8fb350771688fa0b7425a7863c8bb3289505d80e8c6e56e04efb121429592021-10-27 19:03:134 hrs 27 mins ago 0x6022ff1654247f4e715254be00daa49f163b8d000xb2a4584407bb58a02a4183d20a4fbc1db4c55b920.397614402336526266 BNB
0xaaa1cce7d1ab8fb350771688fa0b7425a7863c8bb3289505d80e8c6e56e04efb121429592021-10-27 19:03:134 hrs 27 mins ago Binance: WBNB Token 0x6022ff1654247f4e715254be00daa49f163b8d000.397614402336526266 BNB
0x54c43601798ffff28b95f855d6c997af1a4ccfffb512e5f83fb0b5f71142fec7121426732021-10-27 18:48:494 hrs 42 mins ago 0x6022ff1654247f4e715254be00daa49f163b8d00 Binance: WBNB Token0.03 BNB
0xfe629f74fd99a4781b3dcc6f3eaf17b23a553a1b1f0818ad4f37e048c7d69a3e121425902021-10-27 18:44:404 hrs 46 mins ago 0x6022ff1654247f4e715254be00daa49f163b8d000xb99a4488b901476a838ea7ce27f3741450e9c6bc0.016777369714907651 BNB
0xfe629f74fd99a4781b3dcc6f3eaf17b23a553a1b1f0818ad4f37e048c7d69a3e121425902021-10-27 18:44:404 hrs 46 mins ago Binance: WBNB Token 0x6022ff1654247f4e715254be00daa49f163b8d000.016777369714907651 BNB
0x844eb313a8d77c285136a644e3c5da6070398dc643a2fec3f1a595c3fb26758a121423512021-10-27 18:32:434 hrs 58 mins ago 0x6022ff1654247f4e715254be00daa49f163b8d000xede537a7766fda09c592b410925d155ad2eed7bd0.012001636811313213 BNB
0x844eb313a8d77c285136a644e3c5da6070398dc643a2fec3f1a595c3fb26758a121423512021-10-27 18:32:434 hrs 58 mins ago Binance: WBNB Token 0x6022ff1654247f4e715254be00daa49f163b8d000.012001636811313213 BNB
0xfbbef630b3d3e86a41b933e247e68383fbff10faa006f85f43d28cac5731009b121421682021-10-27 18:23:345 hrs 7 mins ago 0x6022ff1654247f4e715254be00daa49f163b8d000xdbb2d0b767690c4112ea58523d1d56f98c7cc0d20.219281687433625331 BNB
0xfbbef630b3d3e86a41b933e247e68383fbff10faa006f85f43d28cac5731009b121421682021-10-27 18:23:345 hrs 7 mins ago Binance: WBNB Token 0x6022ff1654247f4e715254be00daa49f163b8d000.219281687433625331 BNB
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
CoinSwapV1Router02

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

// File: contracts/libraries/TransferHelper.sol


pragma solidity =0.6.12;

// helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false
library TransferHelper {
    function safeApprove(
        address token,
        address to,
        uint256 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::safeApprove: approve failed'
        );
    }

    function safeTransfer(
        address token,
        address to,
        uint256 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::safeTransfer: transfer failed'
        );
    }

    function safeTransferFrom(
        address token,
        address from,
        address to,
        uint256 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::transferFrom: transferFrom failed'
        );
    }

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

// File: contracts/interfaces/ICoinSwapV1Pair.sol


pragma solidity =0.6.12;

interface ICoinSwapV1Pair {
    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 swap(uint amount0Out, uint amount1Out, address to, bytes calldata data, address from) external;
    function skim(address to) external;
    function sync() external;

    function initialize(address , address)external;
}

// File: contracts/interfaces/IFeeManager.sol


pragma solidity =0.6.12;

interface IFeeManager {
    function feeToRate() external view returns (uint256);

    function isOpenSwapMining() external view returns (uint8);

    function supportDeductionFeeValue() external view returns (uint256);

    function supportDeductionFeeSwitches(address from) external view returns (uint8);

    function defaultFeeAddress() external view returns (address);

    function feeToken() external view returns (address);

    function blackHoleAddress() external view returns (address);

    function router() external view returns (address);

    function isWhitelist(address _token) external view returns (bool);

    function feeSplit(address from, uint256 feeValue) external returns (uint[] memory valueData, address[] memory addressData);

    function getTokenQuantity(address tokenIn, address tokenOut, uint256 tokenAmount) external view returns (uint256);
}

// File: contracts/libraries/SafeMath.sol


pragma solidity =0.6.12;

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

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

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

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

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }
}

// File: contracts/interfaces/IERC20.sol


pragma solidity =0.6.12;

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

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

    function burn(uint256 amount) external;

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

// File: contracts/libraries/CoinSwapV1Library.sol


pragma solidity =0.6.12;





library CoinSwapV1Library {
    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, 'CoinSwapV1Library: IDENTICAL_ADDRESSES');
        (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
        require(token0 != address(0), 'CoinSwapV1Library: 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'e7ff72c0256b183c54523faca44414712d6fd65a03baa024a23b8eb68f5e6d1c' // init code hash
            ))));
    }

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

    // given an input amount of an asset and pair reserves, returns the maximum output amount of the other asset
    function getAmountOutNoFee1(uint amountIn, uint reserveIn, uint reserveOut, address feeManager, address inToken, address outToken) internal view returns (uint amountOut, uint fee) {
        require(amountIn > 0, 'CoinSwapV1Library: INSUFFICIENT_INPUT_AMOUNT');
        require(reserveIn > 0 && reserveOut > 0, 'CoinSwapV1Library: INSUFFICIENT_LIQUIDITY');
        uint realAmountIn = amountIn.mul(1000) / 997;
        fee = realAmountIn .sub(amountIn);
        uint numerator = amountIn.mul(reserveOut);
        uint denominator = reserveIn.add(amountIn);
        amountOut = numerator / denominator;
        fee = IFeeManager(feeManager).getTokenQuantity(inToken, outToken, fee);
    }

    // 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, 'CoinSwapV1Library: INSUFFICIENT_OUTPUT_AMOUNT');
        require(reserveIn > 0 && reserveOut > 0, 'CoinSwapV1Library: INSUFFICIENT_LIQUIDITY');
        uint numerator = reserveIn.mul(amountOut).mul(1000);
        uint denominator = reserveOut.sub(amountOut).mul(997);
        amountIn = (numerator / denominator).add(1);
    }

    // given an output amount of an asset and pair reserves, returns a required input amount of the other asset
    function getAmountInNoFee1(uint amountOut, uint reserveIn, uint reserveOut, address feeManager, address inToken, address outToken) internal view returns (uint amountIn, uint fee) {
        require(amountOut > 0, 'CoinSwapV1Library: INSUFFICIENT_OUTPUT_AMOUNT');
        require(reserveIn > 0 && reserveOut > 0, 'CoinSwapV1Library: INSUFFICIENT_LIQUIDITY');
        uint numerator = reserveIn.mul(amountOut).mul(1000);
        uint denominator = reserveOut.sub(amountOut).mul(997);
        uint realAmountIn = (numerator / denominator).add(1);
        fee = realAmountIn.mul(3) / 1000;
        amountIn = realAmountIn.sub(fee);
        fee = IFeeManager(feeManager).getTokenQuantity(inToken, outToken, fee);
    }

    // performs chained getAmountOut calculations on any number of pairs
    function getAmountsOut1(address factory, uint amountIn, address[] memory path, address feeManager, address from) internal view returns (uint[] memory amounts, uint[] memory feeAmounts) {
        require(path.length >= 2, 'CoinSwapV1Library: INVALID_PATH');
        amounts = new uint[](path.length);
        feeAmounts = new uint[](path.length);
        amounts[0] = amountIn;
        uint needCoinsNum;
        for (uint i; i < path.length - 1; i++) {
            (amounts[i + 1], feeAmounts[i], needCoinsNum) = feeConsult(factory, amounts[i], feeManager, path[i], path[i + 1], false, from, needCoinsNum, i);
        }
    }

    // performs chained getAmountIn calculations on any number of pairs
    function getAmountsIn1(address factory, uint amountOut, address[] memory path, address feeManager, address from) internal view returns (uint[] memory amounts, uint[] memory feeAmounts) {
        require(path.length >= 2, 'CoinSwapV1Library: INVALID_PATH');
        amounts = new uint[](path.length);
        feeAmounts = new uint[](path.length);
        amounts[amounts.length - 1] = amountOut;
        uint needCoinsNum;
        for (uint i = path.length - 1; i > 0; i--) {
            (amounts[i - 1], feeAmounts[i - 1], needCoinsNum) = feeConsult(factory, amounts[i], feeManager, path[i - 1], path[i], true, from, needCoinsNum, i);
        }
    }

    function isSupportSwitch(address feeManager, address from) internal view returns (bool){
        return IFeeManager(feeManager).supportDeductionFeeSwitches(from) == 1;
    }

    struct Params {
        uint amount;
        uint fee;
        uint tempNum;
        uint reserveIn;
        uint reserveOut;
        uint newNeedCoinsNum;
    }

    function feeConsult(address factory, uint amountInput, address feeManager, address path, address path1, bool isIn, address from, uint needCoinsNum, uint i) internal view returns (uint, uint, uint){
        Params memory params = Params(0, 0, 0, 0, 0, 0);
        (params.reserveIn, params.reserveOut) = getReserves(factory, path, path1);
        if (isSupportSwitch(feeManager, from)) {
            if (isIn) {
                (params.amount, params.fee) = getAmountInNoFee1(amountInput, params.reserveIn, params.reserveOut, feeManager, path, path1);
                if (i == 1) params.tempNum = params.tempNum.add(params.amount);
            } else {
                (params.amount, params.fee) = getAmountOutNoFee1(amountInput, params.reserveIn, params.reserveOut, feeManager, path, path1);
                if (i == 0) params.tempNum = params.tempNum.add(amountInput);
            }
            if (path != IFeeManager(feeManager).feeToken()) {
                params.tempNum = 0;
            }
            params.newNeedCoinsNum = params.tempNum.add(needCoinsNum).add(params.fee);
            if (params.fee > 0 && IERC20(IFeeManager(feeManager).feeToken()).balanceOf(from) >= params.newNeedCoinsNum) {
                return (params.amount, params.fee, params.newNeedCoinsNum);
            }
        }
        params.fee = 0;
        params.tempNum = 0;
        if (isIn) {
            (params.amount) = getAmountIn(amountInput, params.reserveIn, params.reserveOut);
            if (i == 1) params.tempNum = params.tempNum.add(params.amount);
        } else {
            (params.amount) = getAmountOut(amountInput, params.reserveIn, params.reserveOut);
            if (i == 0) params.tempNum = params.tempNum.add(amountInput);
        }
        if (path != IFeeManager(feeManager).feeToken()) {
            params.tempNum = 0;
        }
        return (params.amount, params.fee, params.tempNum.add(needCoinsNum));
    }
}

// File: contracts/interfaces/IWETH.sol


pragma solidity =0.6.12;

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

// File: contracts/interfaces/IOracle.sol


pragma solidity =0.6.12;

interface IOracle {
    function update(address tokenA, address tokenB) external;

    function consult(address tokenIn, uint amountIn, address tokenOut) external view returns (uint amountOut);

    function consultPriceDecPercent() external view returns (uint);
}

// File: contracts/CoinSwapV1Router02.sol


pragma solidity =0.6.12;






interface ICoinSwapV1Factory1 {
    function getPair(address tokenA, address tokenB) external view returns (address pair);

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

interface ISwapMining {
    function swap(address account, address input, address output, uint256 amount) external returns (bool);
}

contract CoinSwapV1Router02 {
    using SafeMath for uint;

    address public owner;
    address public immutable factory;//
    address public immutable WETH;
    address public swapMining;
    address public feeManager;
    IOracle public oracle;

    event FeeSplit(address src, uint256 _tokenId, address _token, address _to, uint256 _value);
    event FeeBurn(address _token, address _to, uint256 _value);
    event SetOwner(address _owner);
    event SetSwapMining(address _swapMining);
    event SetFeeManager(address _feeManager);
    event SetOracle(address _oracle);

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

    constructor(address _factory, address _WETH) public {
        factory = _factory;
        WETH = _WETH;
        owner = msg.sender;
    }

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

    modifier onlyOwner() {
        require(owner == msg.sender, "manger: caller is not the manger");
        _;
    }

    function setOwner(address _owner) external onlyOwner {
        require(_owner != address(0), "_owner is zero address");
        owner = _owner;
        emit SetOwner( _owner);
    }

    function setSwapMining(address _swapMining) public onlyOwner {
        swapMining = _swapMining;
        emit SetSwapMining(_swapMining);
    }

    function setFeeManager(address _feeManager) public onlyOwner {
        require(_feeManager != address(0), "_feeManager is zero address");
        feeManager = _feeManager;
        emit SetFeeManager(_feeManager);
    }

    function setOracle(IOracle _oracle) public onlyOwner {
        oracle = _oracle;
        emit SetOracle(address(_oracle));
    }

    // **** 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 (ICoinSwapV1Factory1(factory).getPair(tokenA, tokenB) == address(0)) {
            ICoinSwapV1Factory1(factory).createPair(tokenA, tokenB);
        }
        (uint reserveA, uint reserveB) = CoinSwapV1Library.getReserves(factory, tokenA, tokenB);
        if (reserveA == 0 && reserveB == 0) {
            (amountA, amountB) = (amountADesired, amountBDesired);
        } else {
            uint amountBOptimal = CoinSwapV1Library.quote(amountADesired, reserveA, reserveB);
            if (amountBOptimal <= amountBDesired) {
                require(amountBOptimal >= amountBMin, 'CoinSwapV1Router02: INSUFFICIENT_B_AMOUNT');
                (amountA, amountB) = (amountADesired, amountBOptimal);
            } else {
                uint amountAOptimal = CoinSwapV1Library.quote(amountBDesired, reserveB, reserveA);
                assert(amountAOptimal <= amountADesired);
                require(amountAOptimal >= amountAMin, 'CoinSwapV1Router02: 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 ensure(deadline) returns (uint amountA, uint amountB, uint liquidity) {
        (amountA, amountB) = _addLiquidity(tokenA, tokenB, amountADesired, amountBDesired, amountAMin, amountBMin);
        address pair = CoinSwapV1Library.pairFor(factory, tokenA, tokenB);
        TransferHelper.safeTransferFrom(tokenA, msg.sender, pair, amountA);
        TransferHelper.safeTransferFrom(tokenB, msg.sender, pair, amountB);
        liquidity = ICoinSwapV1Pair(pair).mint(to);
        updatePrice(tokenA, tokenB);
    }

    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external virtual payable ensure(deadline) returns (uint amountToken, uint amountETH, uint liquidity) {
        (amountToken, amountETH) = _addLiquidity(
            token,
            WETH,
            amountTokenDesired,
            msg.value,
            amountTokenMin,
            amountETHMin
        );
        address pair = CoinSwapV1Library.pairFor(factory, token, WETH);
        TransferHelper.safeTransferFrom(token, msg.sender, pair, amountToken);
        IWETH(WETH).deposit{value : amountETH}();
        assert(IWETH(WETH).transfer(pair, amountETH));
        liquidity = ICoinSwapV1Pair(pair).mint(to);
        // refund dust eth, if any
        if (msg.value > amountETH) TransferHelper.safeTransferETH(msg.sender, msg.value - amountETH);
        updatePrice(token, WETH);
    }

    // **** REMOVE LIQUIDITY ****
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) public virtual ensure(deadline) returns (uint amountA, uint amountB) {
        address pair = CoinSwapV1Library.pairFor(factory, tokenA, tokenB);
        ICoinSwapV1Pair(pair).transferFrom(msg.sender, pair, liquidity);
        // send liquidity to pair
        (uint amount0, uint amount1) = ICoinSwapV1Pair(pair).burn(to);
        (address token0,) = CoinSwapV1Library.sortTokens(tokenA, tokenB);
        (amountA, amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0);
        require(amountA >= amountAMin, 'CoinSwapV1Router02: INSUFFICIENT_A_AMOUNT');
        require(amountB >= amountBMin, 'CoinSwapV1Router02: INSUFFICIENT_B_AMOUNT');
        updatePrice(tokenA, tokenB);
    }

    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) public virtual 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);
        updatePrice(token, WETH);
    }

    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 returns (uint amountA, uint amountB) {
        address pair = CoinSwapV1Library.pairFor(factory, tokenA, tokenB);
        uint value = approveMax ? uint(- 1) : liquidity;
        ICoinSwapV1Pair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        (amountA, amountB) = removeLiquidity(tokenA, tokenB, liquidity, amountAMin, amountBMin, to, deadline);
        updatePrice(tokenA, tokenB);
    }

    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external virtual returns (uint amountToken, uint amountETH) {
        address pair = CoinSwapV1Library.pairFor(factory, token, WETH);
        uint value = approveMax ? uint(- 1) : liquidity;
        ICoinSwapV1Pair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        (amountToken, amountETH) = removeLiquidityETH(token, liquidity, amountTokenMin, amountETHMin, to, deadline);
        updatePrice(token, WETH);
    }

    // **** REMOVE LIQUIDITY (supporting fee-on-transfer tokens) ****
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) public virtual 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);
        updatePrice(token, WETH);
    }

    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external virtual returns (uint amountETH) {
        address pair = CoinSwapV1Library.pairFor(factory, token, WETH);
        uint value = approveMax ? uint(- 1) : liquidity;
        ICoinSwapV1Pair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        amountETH = removeLiquidityETHSupportingFeeOnTransferTokens(
            token, liquidity, amountTokenMin, amountETHMin, to, deadline
        );
        updatePrice(token, WETH);
    }

    // **** SWAP ****
    // requires the initial amount to have already been sent to the first pair
    function _swap(uint[] memory amounts, uint[] memory feeAmounts, 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,) = CoinSwapV1Library.sortTokens(input, output);
            uint amountOut = amounts[i + 1];
            bool can = false;
            if (CoinSwapV1Library.isSupportSwitch(feeManager, msg.sender) && feeAmounts[i] > 0) {
                feeTransFer(msg.sender, feeAmounts[i]);
                can = IFeeManager(feeManager).isOpenSwapMining() == 0;
            }
            if ((swapMining != address(0)) && !can) {
                ISwapMining(swapMining).swap(msg.sender, input, output, amountOut);
            }
            (uint amount0Out, uint amount1Out) = input == token0 ? (uint(0), amountOut) : (amountOut, uint(0));
            address to = i < path.length - 2 ? CoinSwapV1Library.pairFor(factory, output, path[i + 2]) : _to;
            ICoinSwapV1Pair(CoinSwapV1Library.pairFor(factory, input, output)).swap(
                amount0Out, amount1Out, to, new bytes(0), msg.sender
            );
            updatePrice(path[i], path[i + 1]);
        }
    }

    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external virtual ensure(deadline) returns (uint[] memory amounts) {
        require(feeManager != address(0), "ROUTER:feeManager is not zero address");
        uint[] memory feeAmounts;
        (amounts, feeAmounts) = CoinSwapV1Library.getAmountsOut1(factory, amountIn, path, feeManager, msg.sender);
        require(amounts[amounts.length - 1] >= amountOutMin, 'CoinSwapV1Router02: INSUFFICIENT_OUTPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, CoinSwapV1Library.pairFor(factory, path[0], path[1]), amounts[0]
        );
        _swap(amounts, feeAmounts, path, to);
    }

    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external virtual ensure(deadline) returns (uint[] memory amounts) {
        require(feeManager != address(0), "ROUTER:feeManager is not zero address");
        uint[] memory feeAmounts;
        (amounts, feeAmounts) = CoinSwapV1Library.getAmountsIn1(factory, amountOut, path, feeManager, msg.sender);
        require(amounts[0] <= amountInMax, 'CoinSwapV1Router02: EXCESSIVE_INPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, CoinSwapV1Library.pairFor(factory, path[0], path[1]), amounts[0]
        );
        _swap(amounts, feeAmounts, path, to);
    }

    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external virtual payable ensure(deadline) returns (uint[] memory amounts){
        require(path[0] == WETH, 'CoinSwapV1Router02: INVALID_PATH');
        require(feeManager != address(0), "ROUTER:feeManager is not zero address");
        uint[] memory feeAmounts;
        (amounts, feeAmounts) = CoinSwapV1Library.getAmountsOut1(factory, msg.value, path, feeManager, msg.sender);
        require(amounts[amounts.length - 1] >= amountOutMin, 'CoinSwapV1Router02: INSUFFICIENT_OUTPUT_AMOUNT');
        IWETH(WETH).deposit{value : amounts[0]}();
        assert(IWETH(WETH).transfer(CoinSwapV1Library.pairFor(factory, path[0], path[1]), amounts[0]));
        _swap(amounts, feeAmounts, path, to);
    }

    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline) external virtual ensure(deadline) returns (uint[] memory amounts){
        require(path[path.length - 1] == WETH, 'CoinSwapV1Router02: INVALID_PATH');
        require(feeManager != address(0), "ROUTER:feeManager is not zero address");
        uint[] memory feeAmounts;
        (amounts, feeAmounts) = CoinSwapV1Library.getAmountsIn1(factory, amountOut, path, feeManager, msg.sender);
        require(amounts[0] <= amountInMax, 'CoinSwapV1Router02: EXCESSIVE_INPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, CoinSwapV1Library.pairFor(factory, path[0], path[1]), amounts[0]
        );
        _swap(amounts, feeAmounts, 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 ensure(deadline) returns (uint[] memory amounts){
        require(path[path.length - 1] == WETH, 'CoinSwapV1Router02: INVALID_PATH');
        require(feeManager != address(0), "ROUTER:feeManager is not zero address");
        uint[] memory feeAmounts;
        (amounts, feeAmounts) = CoinSwapV1Library.getAmountsOut1(factory, amountIn, path, feeManager, msg.sender);
        require(amounts[amounts.length - 1] >= amountOutMin, 'CoinSwapV1Router02: INSUFFICIENT_OUTPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, CoinSwapV1Library.pairFor(factory, path[0], path[1]), amounts[0]
        );
        _swap(amounts, feeAmounts, 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 payable ensure(deadline) returns (uint[] memory amounts){
        require(path[0] == WETH, 'CoinSwapV1Router02: INVALID_PATH');
        require(feeManager != address(0), "ROUTER:feeManager is not zero address");
        uint[] memory feeAmounts;
        (amounts, feeAmounts) = CoinSwapV1Library.getAmountsIn1(factory, amountOut, path, feeManager, msg.sender);
        require(amounts[0] <= msg.value, 'CoinSwapV1Router02: EXCESSIVE_INPUT_AMOUNT');
        IWETH(WETH).deposit{value : amounts[0]}();
        assert(IWETH(WETH).transfer(CoinSwapV1Library.pairFor(factory, path[0], path[1]), amounts[0]));
        _swap(amounts, feeAmounts, path, to);
        // refund dust eth, if any
        if (msg.value > amounts[0]) TransferHelper.safeTransferETH(msg.sender, msg.value - amounts[0]);
    }

    struct Params {
        uint amountInput;
        uint amountOutput;
        uint feeAmount;
        uint reserve0;
        uint reserve1;
        uint reserveInput;
        uint reserveOutput;
    }
    // **** 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,) = CoinSwapV1Library.sortTokens(input, output);
            ICoinSwapV1Pair pair = ICoinSwapV1Pair(CoinSwapV1Library.pairFor(factory, input, output));
            Params memory params = Params(0, 0, 0, 0, 0, 0, 0);
            bool can = false;
            {// scope to avoid stack too deep errors
                (params.reserve0, params.reserve1,) = pair.getReserves();
                (params.reserveInput, params.reserveOutput) = input == token0 ? (params.reserve0, params.reserve1) : (params.reserve1, params.reserve0);
                params.amountInput = IERC20(input).balanceOf(address(pair)).sub(params.reserveInput);

                (params.amountOutput) = CoinSwapV1Library.getAmountOut(params.amountInput, params.reserveInput, params.reserveOutput);

                if (CoinSwapV1Library.isSupportSwitch(feeManager, msg.sender)) {
                    uint256 outValue;
                    (outValue, params.feeAmount) = CoinSwapV1Library.getAmountOutNoFee1(params.amountInput, params.reserveInput, params.reserveOutput, feeManager, path[i], path[i + 1]);
                    if (params.feeAmount > 0 && IERC20(IFeeManager(feeManager).feeToken()).balanceOf(msg.sender) >= params.feeAmount) {
                        params.amountOutput = outValue;
                        feeTransFer(msg.sender, params.feeAmount);
                        can = IFeeManager(feeManager).isOpenSwapMining() == 0;
                    }
                }
            }
            if ((swapMining != address(0)) && !can) {
                ISwapMining(swapMining).swap(msg.sender, input, output, params.amountOutput);
            }
            (uint amount0Out, uint amount1Out) = input == token0 ? (uint(0), params.amountOutput) : (params.amountOutput, uint(0));
            address to = i < path.length - 2 ? CoinSwapV1Library.pairFor(factory, output, path[i + 2]) : _to;
            pair.swap(amount0Out, amount1Out, to, new bytes(0), msg.sender);
            updatePrice(path[i], path[i + 1]);
        }
    }

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external virtual ensure(deadline) {
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, CoinSwapV1Library.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,
            'CoinSwapV1Router02: INSUFFICIENT_OUTPUT_AMOUNT'
        );
    }

    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external virtual payable ensure(deadline) {
        require(path[0] == WETH, 'CoinSwapV1Router02: INVALID_PATH');
        uint amountIn = msg.value;
        IWETH(WETH).deposit{value : amountIn}();
        assert(IWETH(WETH).transfer(CoinSwapV1Library.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,
            'CoinSwapV1Router02: INSUFFICIENT_OUTPUT_AMOUNT'
        );
    }

    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external virtual ensure(deadline) {
        require(path[path.length - 1] == WETH, 'CoinSwapV1Router02: INVALID_PATH');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, CoinSwapV1Library.pairFor(factory, path[0], path[1]), amountIn
        );
        _swapSupportingFeeOnTransferTokens(path, address(this));
        uint amountOut = IERC20(WETH).balanceOf(address(this));
        require(amountOut >= amountOutMin, 'CoinSwapV1Router02: INSUFFICIENT_OUTPUT_AMOUNT');
        IWETH(WETH).withdraw(amountOut);
        TransferHelper.safeTransferETH(to, amountOut);
    }

    function feeTransFer(address from, uint feeValue) internal {
        address burnAddress = IFeeManager(feeManager).blackHoleAddress();
        TransferHelper.safeTransferFrom(IFeeManager(feeManager).feeToken(), from, burnAddress, feeValue);
        emit FeeBurn(IFeeManager(feeManager).feeToken(), burnAddress, feeValue);
    }

    function updatePrice(address tokenA, address tokenB) internal {
        if (address(oracle) != address(0)) {
            oracle.update(tokenA, tokenB);
        }
    }

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

    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) public pure virtual returns (uint amountOut){
        (amountOut) = CoinSwapV1Library.getAmountOut(amountIn, reserveIn, reserveOut);
    }

    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) public pure virtual returns (uint amountIn){
        (amountIn) = CoinSwapV1Library.getAmountIn(amountOut, reserveIn, reserveOut);
    }

    function getAmountsOut(uint amountIn, address[] memory path) public view virtual returns (uint[] memory amounts){
        (amounts,) = CoinSwapV1Library.getAmountsOut1(factory, amountIn, path, feeManager, msg.sender);
    }

    function getAmountsIn(uint amountOut, address[] memory path) public view virtual returns (uint[] memory amounts){
        (amounts,) = CoinSwapV1Library.getAmountsIn1(factory, amountOut, path, feeManager, msg.sender);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_WETH","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_token","type":"address"},{"indexed":false,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"FeeBurn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"src","type":"address"},{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"address","name":"_token","type":"address"},{"indexed":false,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"FeeSplit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_feeManager","type":"address"}],"name":"SetFeeManager","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_oracle","type":"address"}],"name":"SetOracle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_owner","type":"address"}],"name":"SetOwner","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_swapMining","type":"address"}],"name":"SetSwapMining","type":"event"},{"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":[],"name":"feeManager","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":[],"name":"oracle","outputs":[{"internalType":"contract IOracle","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"address","name":"_feeManager","type":"address"}],"name":"setFeeManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IOracle","name":"_oracle","type":"address"}],"name":"setOracle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"setOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_swapMining","type":"address"}],"name":"setSwapMining","outputs":[],"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":[],"name":"swapMining","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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"}]

60c06040523480156200001157600080fd5b5060405162005fe538038062005fe5833981810160405260408110156200003757600080fd5b5080516020909101516001600160601b0319606092831b8116608052911b1660a052600080546001600160a01b0319163317905560805160601c60a05160601c615e33620001b2600039806101f75280610e9c5280610ed75280610f6352806110ed528061136952806118665280611ad95280611bb45280611eb35280611f8e528061206852806121e65280612389528061241152806126d85280612753528061280752806128935280612908528061299d5280612a115280612f1f5280612ffd52806131bb5280613211528061324552806132b952806133f75280613471528061361152806136995250806111c452806112af5280611435528061147a5280611605528061193d5280611ab75280611c5252806122c2528061244352806126055280612a435280612c815280612e835280612eb15280612efd528061309552806131ef528061354d52806136cb52806141a252806141e552806145655280614a135280614e395280614ef25280614fa55250615e336000f3fe6080604052600436106101e75760003560e01c80637ff36ab511610102578063baa2abde11610095578063ded9382a11610064578063ded9382a14610c92578063e8e3370014610d05578063f305d71914610d85578063fb3bdb4114610dcb57610220565b8063baa2abde14610b56578063c45a015514610bb3578063d06ca61f14610bc8578063d0fb020314610c7d57610220565b8063ad5c4648116100d1578063ad5c464814610a34578063ad615dec14610a49578063af2979eb14610a7f578063b6f9de9514610ad257610220565b80637ff36ab5146108cf57806385f8c259146109535780638803dbee146109895780638da5cb5b14610a1f57610220565b80634a25d94a1161017a5780635c11d795116101495780635c11d7951461075b578063791ac947146107f15780637adbf973146108875780637dc0d1d0146108ba57610220565b80634a25d94a146105ee5780634e5eda11146106845780634f887183146106b55780635b0d5984146106e857610220565b80631f00ca74116101b65780631f00ca74146103f25780632195995c146104a757806338ed173914610525578063472d35b9146105bb57610220565b806302751cec14610225578063054d50d41461029157806313af4035146102d957806318cbafe51461030c57610220565b3661022057336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461021e57fe5b005b600080fd5b34801561023157600080fd5b50610278600480360360c081101561024857600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135610e4f565b6040805192835260208301919091528051918290030190f35b34801561029d57600080fd5b506102c7600480360360608110156102b457600080fd5b5080359060208101359060400135610f93565b60408051918252519081900360200190f35b3480156102e557600080fd5b5061021e600480360360208110156102fc57600080fd5b50356001600160a01b0316610fa8565b34801561031857600080fd5b506103a2600480360360a081101561032f57600080fd5b813591602081013591810190606081016040820135600160201b81111561035557600080fd5b82018360208201111561036757600080fd5b803590602001918460208302840111600160201b8311171561038857600080fd5b91935091506001600160a01b03813516906020013561109d565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156103de5781810151838201526020016103c6565b505050509050019250505060405180910390f35b3480156103fe57600080fd5b506103a26004803603604081101561041557600080fd5b81359190810190604081016020820135600160201b81111561043657600080fd5b82018360208201111561044857600080fd5b803590602001918460208302840111600160201b8311171561046957600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611429945050505050565b3480156104b357600080fd5b5061027860048036036101608110156104cb57600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c08101359060e081013515159060ff6101008201351690610120810135906101400135611470565b34801561053157600080fd5b506103a2600480360360a081101561054857600080fd5b813591602081013591810190606081016040820135600160201b81111561056e57600080fd5b82018360208201111561058057600080fd5b803590602001918460208302840111600160201b831117156105a157600080fd5b91935091506001600160a01b038135169060200135611571565b3480156105c757600080fd5b5061021e600480360360208110156105de57600080fd5b50356001600160a01b031661171a565b3480156105fa57600080fd5b506103a2600480360360a081101561061157600080fd5b813591602081013591810190606081016040820135600160201b81111561063757600080fd5b82018360208201111561064957600080fd5b803590602001918460208302840111600160201b8311171561066a57600080fd5b91935091506001600160a01b038135169060200135611816565b34801561069057600080fd5b506106996119ff565b604080516001600160a01b039092168252519081900360200190f35b3480156106c157600080fd5b5061021e600480360360208110156106d857600080fd5b50356001600160a01b0316611a0e565b3480156106f457600080fd5b506102c7600480360361014081101561070c57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e08201351690610100810135906101200135611aaf565b34801561076757600080fd5b5061021e600480360360a081101561077e57600080fd5b813591602081013591810190606081016040820135600160201b8111156107a457600080fd5b8201836020820111156107b657600080fd5b803590602001918460208302840111600160201b831117156107d757600080fd5b91935091506001600160a01b038135169060200135611be8565b3480156107fd57600080fd5b5061021e600480360360a081101561081457600080fd5b813591602081013591810190606081016040820135600160201b81111561083a57600080fd5b82018360208201111561084c57600080fd5b803590602001918460208302840111600160201b8311171561086d57600080fd5b91935091506001600160a01b038135169060200135611e65565b34801561089357600080fd5b5061021e600480360360208110156108aa57600080fd5b50356001600160a01b03166120ee565b3480156108c657600080fd5b5061069961218f565b6103a2600480360360808110156108e557600080fd5b81359190810190604081016020820135600160201b81111561090657600080fd5b82018360208201111561091857600080fd5b803590602001918460208302840111600160201b8311171561093957600080fd5b91935091506001600160a01b03813516906020013561219e565b34801561095f57600080fd5b506102c76004803603606081101561097657600080fd5b5080359060208101359060400135612564565b34801561099557600080fd5b506103a2600480360360a08110156109ac57600080fd5b813591602081013591810190606081016040820135600160201b8111156109d257600080fd5b8201836020820111156109e457600080fd5b803590602001918460208302840111600160201b83111715610a0557600080fd5b91935091506001600160a01b038135169060200135612571565b348015610a2b57600080fd5b506106996126c7565b348015610a4057600080fd5b506106996126d6565b348015610a5557600080fd5b506102c760048036036060811015610a6c57600080fd5b50803590602081013590604001356126fa565b348015610a8b57600080fd5b506102c7600480360360c0811015610aa257600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135612707565b61021e60048036036080811015610ae857600080fd5b81359190810190604081016020820135600160201b811115610b0957600080fd5b820183602082011115610b1b57600080fd5b803590602001918460208302840111600160201b83111715610b3c57600080fd5b91935091506001600160a01b0381351690602001356128c2565b348015610b6257600080fd5b50610278600480360360e0811015610b7957600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c00135612c33565b348015610bbf57600080fd5b50610699612e81565b348015610bd457600080fd5b506103a260048036036040811015610beb57600080fd5b81359190810190604081016020820135600160201b811115610c0c57600080fd5b820183602082011115610c1e57600080fd5b803590602001918460208302840111600160201b83111715610c3f57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550612ea5945050505050565b348015610c8957600080fd5b50610699612ee4565b348015610c9e57600080fd5b506102786004803603610140811015610cb657600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e08201351690610100810135906101200135612ef3565b348015610d1157600080fd5b50610d676004803603610100811015610d2957600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359160c0820135169060e00135613032565b60408051938452602084019290925282820152519081900360600190f35b610d67600480360360c0811015610d9b57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a0013561316c565b6103a260048036036080811015610de157600080fd5b81359190810190604081016020820135600160201b811115610e0257600080fd5b820183602082011115610e1457600080fd5b803590602001918460208302840111600160201b83111715610e3557600080fd5b91935091506001600160a01b038135169060200135613429565b6000808242811015610e96576040805162461bcd60e51b815260206004820152601b6024820152600080516020615cf1833981519152604482015290519081900360640190fd5b610ec5897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a612c33565b9093509150610ed5898685613800565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610f3b57600080fd5b505af1158015610f4f573d6000803e3d6000fd5b50505050610f5d8583613954565b610f87897f0000000000000000000000000000000000000000000000000000000000000000613a4c565b50965096945050505050565b6000610fa0848484613ad0565b949350505050565b6000546001600160a01b03163314610ff5576040805162461bcd60e51b81526020600482018190526024820152600080516020615d37833981519152604482015290519081900360640190fd5b6001600160a01b038116611049576040805162461bcd60e51b81526020600482015260166024820152755f6f776e6572206973207a65726f206164647265737360501b604482015290519081900360640190fd5b600080546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f167d3e9c1016ab80e58802ca9da10ce5c6a0f4debc46a2e7a2cd9e56899a4fb59181900360200190a150565b606081428110156110e3576040805162461bcd60e51b815260206004820152601b6024820152600080516020615cf1833981519152604482015290519081900360640190fd5b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168686600019810181811061111d57fe5b905060200201356001600160a01b03166001600160a01b031614611176576040805162461bcd60e51b81526020600482018190526024820152600080516020615cd1833981519152604482015290519081900360640190fd5b6002546001600160a01b03166111bd5760405162461bcd60e51b8152600401808060200182810382526025815260200180615d806025913960400191505060405180910390fd5b606061122b7f00000000000000000000000000000000000000000000000000000000000000008a898980806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506002546001600160a01b03169150339050613ba8565b8151919450915088908490600019810190811061124457fe5b602002602001015110156112895760405162461bcd60e51b815260040180806020018281038252602e815260200180615c50602e913960400191505060405180910390fd5b6113278787600081811061129957fe5b905060200201356001600160a01b03163361130d7f00000000000000000000000000000000000000000000000000000000000000008b8b60008181106112db57fe5b905060200201356001600160a01b03168c8c60018181106112f857fe5b905060200201356001600160a01b0316613d4d565b8660008151811061131a57fe5b6020026020010151613e0d565b6113678382898980806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613f62915050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d846001865103815181106113a657fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156113e457600080fd5b505af11580156113f8573d6000803e3d6000fd5b5050505061141d858460018651038151811061141057fe5b6020026020010151613954565b50509695505050505050565b600254606090611468907f000000000000000000000000000000000000000000000000000000000000000090859085906001600160a01b03163361436f565b509392505050565b60008060006114a07f00000000000000000000000000000000000000000000000000000000000000008f8f613d4d565b90506000876114af578c6114b3565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b15801561152957600080fd5b505af115801561153d573d6000803e3d6000fd5b505050506115508f8f8f8f8f8f8f612c33565b909450925061155f8f8f613a4c565b50509b509b9950505050505050505050565b606081428110156115b7576040805162461bcd60e51b815260206004820152601b6024820152600080516020615cf1833981519152604482015290519081900360640190fd5b6002546001600160a01b03166115fe5760405162461bcd60e51b8152600401808060200182810382526025815260200180615d806025913960400191505060405180910390fd5b606061166c7f00000000000000000000000000000000000000000000000000000000000000008a898980806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506002546001600160a01b03169150339050613ba8565b8151919450915088908490600019810190811061168557fe5b602002602001015110156116ca5760405162461bcd60e51b815260040180806020018281038252602e815260200180615c50602e913960400191505060405180910390fd5b6116da8787600081811061129957fe5b61141d83828989808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508b9250613f62915050565b6000546001600160a01b03163314611767576040805162461bcd60e51b81526020600482018190526024820152600080516020615d37833981519152604482015290519081900360640190fd5b6001600160a01b0381166117c2576040805162461bcd60e51b815260206004820152601b60248201527f5f6665654d616e61676572206973207a65726f20616464726573730000000000604482015290519081900360640190fd5b600280546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f5d0517e3a4eabea892d9750138cd21d4a6cf3b935b43d0598df7055f463819b29181900360200190a150565b6060814281101561185c576040805162461bcd60e51b815260206004820152601b6024820152600080516020615cf1833981519152604482015290519081900360640190fd5b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168686600019810181811061189657fe5b905060200201356001600160a01b03166001600160a01b0316146118ef576040805162461bcd60e51b81526020600482018190526024820152600080516020615cd1833981519152604482015290519081900360640190fd5b6002546001600160a01b03166119365760405162461bcd60e51b8152600401808060200182810382526025815260200180615d806025913960400191505060405180910390fd5b60606119a47f00000000000000000000000000000000000000000000000000000000000000008a898980806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506002546001600160a01b0316915033905061436f565b809250819450505087836000815181106119ba57fe5b602002602001015111156112895760405162461bcd60e51b815260040180806020018281038252602a815260200180615c7e602a913960400191505060405180910390fd5b6001546001600160a01b031681565b6000546001600160a01b03163314611a5b576040805162461bcd60e51b81526020600482018190526024820152600080516020615d37833981519152604482015290519081900360640190fd5b600180546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f1cd55a004e8e0cc5e7fe14924dc56f0d525a2bc2bdd307f1c0e41aaa1d4ffede9181900360200190a150565b600080611afd7f00000000000000000000000000000000000000000000000000000000000000008d7f0000000000000000000000000000000000000000000000000000000000000000613d4d565b9050600086611b0c578b611b10565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018b905260ff8916608482015260a4810188905260c4810187905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b158015611b8657600080fd5b505af1158015611b9a573d6000803e3d6000fd5b50505050611bac8d8d8d8d8d8d612707565b9250611bd88d7f0000000000000000000000000000000000000000000000000000000000000000613a4c565b50509a9950505050505050505050565b8042811015611c2c576040805162461bcd60e51b815260206004820152601b6024820152600080516020615cf1833981519152604482015290519081900360640190fd5b611ca185856000818110611c3c57fe5b905060200201356001600160a01b031633611c9b7f000000000000000000000000000000000000000000000000000000000000000089896000818110611c7e57fe5b905060200201356001600160a01b03168a8a60018181106112f857fe5b8a613e0d565b600085856000198101818110611cb357fe5b905060200201356001600160a01b03166001600160a01b03166370a08231856040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611d0f57600080fd5b505afa158015611d23573d6000803e3d6000fd5b505050506040513d6020811015611d3957600080fd5b50516040805160208881028281018201909352888252929350611d7b92909189918991829185019084908082843760009201919091525088925061450e915050565b86611e1e8288886000198101818110611d9057fe5b905060200201356001600160a01b03166001600160a01b03166370a08231886040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611dec57600080fd5b505afa158015611e00573d6000803e3d6000fd5b505050506040513d6020811015611e1657600080fd5b505190614b77565b1015611e5b5760405162461bcd60e51b815260040180806020018281038252602e815260200180615c50602e913960400191505060405180910390fd5b5050505050505050565b8042811015611ea9576040805162461bcd60e51b815260206004820152601b6024820152600080516020615cf1833981519152604482015290519081900360640190fd5b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001685856000198101818110611ee357fe5b905060200201356001600160a01b03166001600160a01b031614611f3c576040805162461bcd60e51b81526020600482018190526024820152600080516020615cd1833981519152604482015290519081900360640190fd5b611f4c85856000818110611c3c57fe5b611f8a85858080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525030925061450e915050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611ff957600080fd5b505afa15801561200d573d6000803e3d6000fd5b505050506040513d602081101561202357600080fd5b50519050868110156120665760405162461bcd60e51b815260040180806020018281038252602e815260200180615c50602e913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156120cc57600080fd5b505af11580156120e0573d6000803e3d6000fd5b50505050611e5b8482613954565b6000546001600160a01b0316331461213b576040805162461bcd60e51b81526020600482018190526024820152600080516020615d37833981519152604482015290519081900360640190fd5b600380546001600160a01b0383166001600160a01b0319909116811790915560408051918252517fd3b5d1e0ffaeff528910f3663f0adace7694ab8241d58e17a91351ced2e080319181900360200190a150565b6003546001600160a01b031681565b606081428110156121e4576040805162461bcd60e51b815260206004820152601b6024820152600080516020615cf1833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168686600081811061221b57fe5b905060200201356001600160a01b03166001600160a01b031614612274576040805162461bcd60e51b81526020600482018190526024820152600080516020615cd1833981519152604482015290519081900360640190fd5b6002546001600160a01b03166122bb5760405162461bcd60e51b8152600401808060200182810382526025815260200180615d806025913960400191505060405180910390fd5b60606123297f000000000000000000000000000000000000000000000000000000000000000034898980806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506002546001600160a01b03169150339050613ba8565b8151919450915088908490600019810190811061234257fe5b602002602001015110156123875760405162461bcd60e51b815260040180806020018281038252602e815260200180615c50602e913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0846000815181106123c357fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b1580156123f657600080fd5b505af115801561240a573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb61248c7f00000000000000000000000000000000000000000000000000000000000000008a8a600081811061246f57fe5b905060200201356001600160a01b03168b8b60018181106112f857fe5b8560008151811061249957fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156124e757600080fd5b505af11580156124fb573d6000803e3d6000fd5b505050506040513d602081101561251157600080fd5b505161251957fe5b61255983828989808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508b9250613f62915050565b505095945050505050565b6000610fa0848484614bcd565b606081428110156125b7576040805162461bcd60e51b815260206004820152601b6024820152600080516020615cf1833981519152604482015290519081900360640190fd5b6002546001600160a01b03166125fe5760405162461bcd60e51b8152600401808060200182810382526025815260200180615d806025913960400191505060405180910390fd5b606061266c7f00000000000000000000000000000000000000000000000000000000000000008a898980806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506002546001600160a01b0316915033905061436f565b8092508194505050878360008151811061268257fe5b602002602001015111156116ca5760405162461bcd60e51b815260040180806020018281038252602a815260200180615c7e602a913960400191505060405180910390fd5b6000546001600160a01b031681565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000610fa0848484614ca5565b6000814281101561274d576040805162461bcd60e51b815260206004820152601b6024820152600080516020615cf1833981519152604482015290519081900360640190fd5b61277c887f00000000000000000000000000000000000000000000000000000000000000008989893089612c33565b90508092505061280588858a6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156127d457600080fd5b505afa1580156127e8573d6000803e3d6000fd5b505050506040513d60208110156127fe57600080fd5b5051613800565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561286b57600080fd5b505af115801561287f573d6000803e3d6000fd5b5050505061288d8483613954565b6128b7887f0000000000000000000000000000000000000000000000000000000000000000613a4c565b509695505050505050565b8042811015612906576040805162461bcd60e51b815260206004820152601b6024820152600080516020615cf1833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168585600081811061293d57fe5b905060200201356001600160a01b03166001600160a01b031614612996576040805162461bcd60e51b81526020600482018190526024820152600080516020615cd1833981519152604482015290519081900360640190fd5b60003490507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b1580156129f657600080fd5b505af1158015612a0a573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb612a6f7f000000000000000000000000000000000000000000000000000000000000000089896000818110611c7e57fe5b836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612ab657600080fd5b505af1158015612aca573d6000803e3d6000fd5b505050506040513d6020811015612ae057600080fd5b5051612ae857fe5b600086866000198101818110612afa57fe5b905060200201356001600160a01b03166001600160a01b03166370a08231866040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015612b5657600080fd5b505afa158015612b6a573d6000803e3d6000fd5b505050506040513d6020811015612b8057600080fd5b50516040805160208981028281018201909352898252929350612bc29290918a918a91829185019084908082843760009201919091525089925061450e915050565b87611e1e8289896000198101818110612bd757fe5b905060200201356001600160a01b03166001600160a01b03166370a08231896040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611dec57600080fd5b6000808242811015612c7a576040805162461bcd60e51b815260206004820152601b6024820152600080516020615cf1833981519152604482015290519081900360640190fd5b6000612ca77f00000000000000000000000000000000000000000000000000000000000000008c8c613d4d565b604080516323b872dd60e01b81523360048201526001600160a01b03831660248201819052604482018d9052915192935090916323b872dd916064808201926020929091908290030181600087803b158015612d0257600080fd5b505af1158015612d16573d6000803e3d6000fd5b505050506040513d6020811015612d2c57600080fd5b50506040805163226bf2d160e21b81526001600160a01b03888116600483015282516000938493928616926389afcb44926024808301939282900301818787803b158015612d7957600080fd5b505af1158015612d8d573d6000803e3d6000fd5b505050506040513d6040811015612da357600080fd5b50805160209091015190925090506000612dbd8e8e614d4b565b509050806001600160a01b03168e6001600160a01b031614612de0578183612de3565b82825b90975095508a871015612e275760405162461bcd60e51b8152600401808060200182810382526029815260200180615d576029913960400191505060405180910390fd5b89861015612e665760405162461bcd60e51b8152600401808060200182810382526029815260200180615b6f6029913960400191505060405180910390fd5b612e708e8e613a4c565b505050505097509795505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600254606090611468907f000000000000000000000000000000000000000000000000000000000000000090859085906001600160a01b031633613ba8565b6002546001600160a01b031681565b6000806000612f437f00000000000000000000000000000000000000000000000000000000000000008e7f0000000000000000000000000000000000000000000000000000000000000000613d4d565b9050600087612f52578c612f56565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b158015612fcc57600080fd5b505af1158015612fe0573d6000803e3d6000fd5b50505050612ff28e8e8e8e8e8e610e4f565b90945092506130218e7f0000000000000000000000000000000000000000000000000000000000000000613a4c565b50509a509a98505050505050505050565b6000806000834281101561307b576040805162461bcd60e51b815260206004820152601b6024820152600080516020615cf1833981519152604482015290519081900360640190fd5b6130898c8c8c8c8c8c614e29565b909450925060006130bb7f00000000000000000000000000000000000000000000000000000000000000008e8e613d4d565b90506130c98d338388613e0d565b6130d58c338387613e0d565b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050602060405180830381600087803b15801561312457600080fd5b505af1158015613138573d6000803e3d6000fd5b505050506040513d602081101561314e57600080fd5b5051925061315c8d8d613a4c565b5050985098509895505050505050565b600080600083428110156131b5576040805162461bcd60e51b815260206004820152601b6024820152600080516020615cf1833981519152604482015290519081900360640190fd5b6131e38a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c614e29565b909450925060006132357f00000000000000000000000000000000000000000000000000000000000000008c7f0000000000000000000000000000000000000000000000000000000000000000613d4d565b90506132438b338388613e0d565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b15801561329e57600080fd5b505af11580156132b2573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb82866040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561332e57600080fd5b505af1158015613342573d6000803e3d6000fd5b505050506040513d602081101561335857600080fd5b505161336057fe5b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050602060405180830381600087803b1580156133af57600080fd5b505af11580156133c3573d6000803e3d6000fd5b505050506040513d60208110156133d957600080fd5b50519250348410156133f1576133f133853403613954565b61341b8b7f0000000000000000000000000000000000000000000000000000000000000000613a4c565b505096509650969350505050565b6060814281101561346f576040805162461bcd60e51b815260206004820152601b6024820152600080516020615cf1833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316868660008181106134a657fe5b905060200201356001600160a01b03166001600160a01b0316146134ff576040805162461bcd60e51b81526020600482018190526024820152600080516020615cd1833981519152604482015290519081900360640190fd5b6002546001600160a01b03166135465760405162461bcd60e51b8152600401808060200182810382526025815260200180615d806025913960400191505060405180910390fd5b60606135b47f000000000000000000000000000000000000000000000000000000000000000089898980806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506002546001600160a01b0316915033905061436f565b809250819450505034836000815181106135ca57fe5b6020026020010151111561360f5760405162461bcd60e51b815260040180806020018281038252602a815260200180615c7e602a913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db08460008151811061364b57fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561367e57600080fd5b505af1158015613692573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6136f77f00000000000000000000000000000000000000000000000000000000000000008a8a600081811061246f57fe5b8560008151811061370457fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561375257600080fd5b505af1158015613766573d6000803e3d6000fd5b505050506040513d602081101561377c57600080fd5b505161378457fe5b6137c483828989808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508b9250613f62915050565b826000815181106137d157fe5b60200260200101513411156125595761255933846000815181106137f157fe5b60200260200101513403613954565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b6020831061387d5780518252601f19909201916020918201910161385e565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146138df576040519150601f19603f3d011682016040523d82523d6000602084013e6138e4565b606091505b5091509150818015613912575080511580613912575080806020019051602081101561390f57600080fd5b50515b61394d5760405162461bcd60e51b815260040180806020018281038252602d815260200180615da5602d913960400191505060405180910390fd5b5050505050565b604080516000808252602082019092526001600160a01b0384169083906040518082805190602001908083835b602083106139a05780518252601f199092019160209182019101613981565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613a02576040519150601f19603f3d011682016040523d82523d6000602084013e613a07565b606091505b5050905080613a475760405162461bcd60e51b8152600401808060200182810382526034815260200180615c1c6034913960400191505060405180910390fd5b505050565b6003546001600160a01b031615613acc576003546040805163c640752d60e01b81526001600160a01b03858116600483015284811660248301529151919092169163c640752d91604480830192600092919082900301818387803b158015613ab357600080fd5b505af1158015613ac7573d6000803e3d6000fd5b505050505b5050565b6000808411613b105760405162461bcd60e51b815260040180806020018281038252602c815260200180615dd2602c913960400191505060405180910390fd5b600083118015613b205750600082115b613b5b5760405162461bcd60e51b8152600401808060200182810382526029815260200180615ca86029913960400191505060405180910390fd5b6000613b69856103e56150ba565b90506000613b7782856150ba565b90506000613b9183613b8b886103e86150ba565b9061511d565b9050808281613b9c57fe5b04979650505050505050565b606080600285511015613c02576040805162461bcd60e51b815260206004820152601f60248201527f436f696e5377617056314c6962726172793a20494e56414c49445f5041544800604482015290519081900360640190fd5b845167ffffffffffffffff81118015613c1a57600080fd5b50604051908082528060200260200182016040528015613c44578160200160208202803683370190505b509150845167ffffffffffffffff81118015613c5f57600080fd5b50604051908082528060200260200182016040528015613c89578160200160208202803683370190505b5090508582600081518110613c9a57fe5b6020026020010181815250506000805b6001875103811015613d4157613d0489858381518110613cc657fe5b6020026020010151888a8581518110613cdb57fe5b60200260200101518b8660010181518110613cf257fe5b602002602001015160008b898961516c565b868460010181518110613d1357fe5b60200260200101868581518110613d2657fe5b60209081029190910101929092529190529150600101613caa565b50509550959350505050565b6000806000613d5c8585614d4b565b604080516bffffffffffffffffffffffff19606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501206001600160f81b031960688401529a90941b9093166069840152607d8301989098527fe7ff72c0256b183c54523faca44414712d6fd65a03baa024a23b8eb68f5e6d1c609d808401919091528851808403909101815260bd909201909752805196019590952095945050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17815292518251600094606094938a169392918291908083835b60208310613e925780518252601f199092019160209182019101613e73565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613ef4576040519150601f19603f3d011682016040523d82523d6000602084013e613ef9565b606091505b5091509150818015613f27575080511580613f275750808060200190516020811015613f2457600080fd5b50515b613ac75760405162461bcd60e51b8152600401808060200182810382526031815260200180615bc56031913960400191505060405180910390fd5b60005b600183510381101561394d57600080848381518110613f8057fe5b6020026020010151858460010181518110613f9757fe5b6020026020010151915091506000613faf8383614d4b565b5090506000888560010181518110613fc357fe5b602002602001015190506000613fee600260009054906101000a90046001600160a01b03163361552c565b801561400d5750600089878151811061400357fe5b6020026020010151115b156140b05761402f338a888151811061402257fe5b60200260200101516155b4565b600260009054906101000a90046001600160a01b03166001600160a01b031663eccb7b086040518163ffffffff1660e01b815260040160206040518083038186803b15801561407d57600080fd5b505afa158015614091573d6000803e3d6000fd5b505050506040513d60208110156140a757600080fd5b505160ff161590505b6001546001600160a01b0316158015906140c8575080155b1561415e576001546040805163152cf14360e31b81523360048201526001600160a01b0388811660248301528781166044830152606482018690529151919092169163a9678a189160848083019260209291908290030181600087803b15801561413157600080fd5b505af1158015614145573d6000803e3d6000fd5b505050506040513d602081101561415b57600080fd5b50505b600080846001600160a01b0316876001600160a01b03161461418257836000614186565b6000845b91509150600060028b5103891061419d57896141de565b6141de7f0000000000000000000000000000000000000000000000000000000000000000888d8c600201815181106141d157fe5b6020026020010151613d4d565b905061420b7f00000000000000000000000000000000000000000000000000000000000000008989613d4d565b6001600160a01b0316636e1fdd7f84848460006040519080825280601f01601f191660200182016040528015614248576020820181803683370190505b50336040518663ffffffff1660e01b815260040180868152602001858152602001846001600160a01b0316815260200180602001836001600160a01b03168152602001828103825284818151815260200191508051906020019080838360005b838110156142c05781810151838201526020016142a8565b50505050905090810190601f1680156142ed5780820380516001836020036101000a031916815260200191505b509650505050505050600060405180830381600087803b15801561431057600080fd5b505af1158015614324573d6000803e3d6000fd5b5050505061435b8b8a8151811061433757fe5b60200260200101518c8b6001018151811061434e57fe5b6020026020010151613a4c565b505060019096019550613f65945050505050565b6060806002855110156143c9576040805162461bcd60e51b815260206004820152601f60248201527f436f696e5377617056314c6962726172793a20494e56414c49445f5041544800604482015290519081900360640190fd5b845167ffffffffffffffff811180156143e157600080fd5b5060405190808252806020026020018201604052801561440b578160200160208202803683370190505b509150845167ffffffffffffffff8111801561442657600080fd5b50604051908082528060200260200182016040528015614450578160200160208202803683370190505b509050858260018451038151811061446457fe5b60209081029190910101528451600090600019015b8015613d41576144cd8985838151811061448f57fe5b6020026020010151888a60018603815181106144a757fe5b60200260200101518b86815181106144bb57fe5b602002602001015160018b898961516c565b8660018503815181106144dc57fe5b602002602001018660018603815181106144f257fe5b6020908102919091010192909252919052915060001901614479565b60005b6001835103811015613a475760008084838151811061452c57fe5b602002602001015185846001018151811061454357fe5b602002602001015191509150600061455b8383614d4b565b509050600061458b7f00000000000000000000000000000000000000000000000000000000000000008585613d4d565b9050614595615afb565b6040518060e00160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090506000826001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561460c57600080fd5b505afa158015614620573d6000803e3d6000fd5b505050506040513d606081101561463657600080fd5b5080516020909101516001600160701b0390811660808501521660608301526001600160a01b03868116908516146146775781608001518260600151614682565b816060015182608001515b60c084015260a08301819052604080516370a0823160e01b81526001600160a01b03868116600483015291516146db93928a16916370a08231916024808301926020929190829003018186803b158015611dec57600080fd5b80835260a083015160c08401516146f3929190613ad0565b602083015260025461470e906001600160a01b03163361552c565b1561491557600061476d83600001518460a001518560c00151600260009054906101000a90046001600160a01b03168e8d8151811061474957fe5b60200260200101518f8e6001018151811061476057fe5b6020026020010151615763565b604085018190529091501580159061487657508260400151600260009054906101000a90046001600160a01b03166001600160a01b031663647846a56040518163ffffffff1660e01b815260040160206040518083038186803b1580156147d357600080fd5b505afa1580156147e7573d6000803e3d6000fd5b505050506040513d60208110156147fd57600080fd5b5051604080516370a0823160e01b815233600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b15801561484757600080fd5b505afa15801561485b573d6000803e3d6000fd5b505050506040513d602081101561487157600080fd5b505110155b15614913576020830181905260408301516148929033906155b4565b600260009054906101000a90046001600160a01b03166001600160a01b031663eccb7b086040518163ffffffff1660e01b815260040160206040518083038186803b1580156148e057600080fd5b505afa1580156148f4573d6000803e3d6000fd5b505050506040513d602081101561490a57600080fd5b505160ff161591505b505b6001546001600160a01b03161580159061492d575080155b156149c7576001546020808401516040805163152cf14360e31b81523360048201526001600160a01b038b811660248301528a8116604483015260648201939093529051919093169263a9678a189260848083019391928290030181600087803b15801561499a57600080fd5b505af11580156149ae573d6000803e3d6000fd5b505050506040513d60208110156149c457600080fd5b50505b600080856001600160a01b0316886001600160a01b0316146149ef57836020015160006149f7565b600084602001515b91509150600060028c51038a10614a0e578a614a42565b614a427f0000000000000000000000000000000000000000000000000000000000000000898e8d600201815181106141d157fe5b6040805160008082526020820192839052636e1fdd7f60e01b835260248201878152604483018790526001600160a01b0380861660648501523360a4850181905260a060848601908152855160c48701819052979850918d1696636e1fdd7f968b968b968b9691959193919260e487019290918190849084905b83811015614ad4578181015183820152602001614abc565b50505050905090810190601f168015614b015780820380516001836020036101000a031916815260200191505b509650505050505050600060405180830381600087803b158015614b2457600080fd5b505af1158015614b38573d6000803e3d6000fd5b50505050614b628c8b81518110614b4b57fe5b60200260200101518d8c6001018151811061434e57fe5b50506001909701965061451195505050505050565b80820382811115614bc7576040805162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b604482015290519081900360640190fd5b92915050565b6000808411614c0d5760405162461bcd60e51b815260040180806020018281038252602d815260200180615b98602d913960400191505060405180910390fd5b600083118015614c1d5750600082115b614c585760405162461bcd60e51b8152600401808060200182810382526029815260200180615ca86029913960400191505060405180910390fd5b6000614c706103e8614c6a86886150ba565b906150ba565b90506000614c846103e5614c6a8689614b77565b9050614c9b6001828481614c9457fe5b049061511d565b9695505050505050565b6000808411614ce55760405162461bcd60e51b8152600401808060200182810382526026815260200180615bf66026913960400191505060405180910390fd5b600083118015614cf55750600082115b614d305760405162461bcd60e51b8152600401808060200182810382526029815260200180615ca86029913960400191505060405180910390fd5b82614d3b85846150ba565b81614d4257fe5b04949350505050565b600080826001600160a01b0316846001600160a01b03161415614d9f5760405162461bcd60e51b8152600401808060200182810382526026815260200180615d116026913960400191505060405180910390fd5b826001600160a01b0316846001600160a01b031610614dbf578284614dc2565b83835b90925090506001600160a01b038216614e22576040805162461bcd60e51b815260206004820152601f60248201527f436f696e5377617056314c6962726172793a205a45524f5f4144445245535300604482015290519081900360640190fd5b9250929050565b60008060006001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e6a439058a8a6040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b031681526020019250505060206040518083038186803b158015614eb557600080fd5b505afa158015614ec9573d6000803e3d6000fd5b505050506040513d6020811015614edf57600080fd5b50516001600160a01b03161415614f9d577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c9c6539689896040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b0316815260200192505050602060405180830381600087803b158015614f7057600080fd5b505af1158015614f84573d6000803e3d6000fd5b505050506040513d6020811015614f9a57600080fd5b50505b600080614fcb7f00000000000000000000000000000000000000000000000000000000000000008b8b6158e3565b91509150816000148015614fdd575080155b15614fed578793508692506150ad565b6000614ffa898484614ca5565b905087811161504d57858110156150425760405162461bcd60e51b8152600401808060200182810382526029815260200180615b6f6029913960400191505060405180910390fd5b8894509250826150ab565b600061505a898486614ca5565b90508981111561506657fe5b878110156150a55760405162461bcd60e51b8152600401808060200182810382526029815260200180615d576029913960400191505060405180910390fd5b94508793505b505b5050965096945050505050565b60008115806150d5575050808202828282816150d257fe5b04145b614bc7576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b604482015290519081900360640190fd5b80820182811015614bc7576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b604482015290519081900360640190fd5b6000806000615179615b38565b6040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600081525090506151b98d8b8b6158e3565b608083015260608201526151cd8b8861552c565b15615404578715615219576151ee8c826060015183608001518e8e8e6159aa565b602083015281526001851415615214578051604082015161520e9161511d565b60408201525b615250565b61522f8c826060015183608001518e8e8e615763565b602083015281528461525057604081015161524a908d61511d565b60408201525b8a6001600160a01b031663647846a56040518163ffffffff1660e01b815260040160206040518083038186803b15801561528957600080fd5b505afa15801561529d573d6000803e3d6000fd5b505050506040513d60208110156152b357600080fd5b50516001600160a01b038b81169116146152cf57600060408201525b6152ee8160200151613b8b88846040015161511d90919063ffffffff16565b60a08201526020810151158015906153e457508060a001518b6001600160a01b031663647846a56040518163ffffffff1660e01b815260040160206040518083038186803b15801561533f57600080fd5b505afa158015615353573d6000803e3d6000fd5b505050506040513d602081101561536957600080fd5b5051604080516370a0823160e01b81526001600160a01b038b81166004830152915191909216916370a08231916024808301926020929190829003018186803b1580156153b557600080fd5b505afa1580156153c9573d6000803e3d6000fd5b505050506040513d60208110156153df57600080fd5b505110155b1561540457806000015181602001518260a001519350935093505061551d565b600060208201819052604082015287156154515761542b8c82606001518360800151614bcd565b8152600185141561544c57805160408201516154469161511d565b60408201525b615480565b6154648c82606001518360800151613ad0565b81528461548057604081015161547a908d61511d565b60408201525b8a6001600160a01b031663647846a56040518163ffffffff1660e01b815260040160206040518083038186803b1580156154b957600080fd5b505afa1580156154cd573d6000803e3d6000fd5b505050506040513d60208110156154e357600080fd5b50516001600160a01b038b81169116146154ff57600060408201525b805160208201516040830151615515908961511d565b935093509350505b99509950999650505050505050565b6000826001600160a01b0316637ab41bfd836040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561557b57600080fd5b505afa15801561558f573d6000803e3d6000fd5b505050506040513d60208110156155a557600080fd5b505160ff166001149392505050565b600254604080516399f7db7d60e01b815290516000926001600160a01b0316916399f7db7d916004808301926020929190829003018186803b1580156155f957600080fd5b505afa15801561560d573d6000803e3d6000fd5b505050506040513d602081101561562357600080fd5b50516002546040805163647846a560e01b815290519293506156a5926001600160a01b039092169163647846a591600480820192602092909190829003018186803b15801561567157600080fd5b505afa158015615685573d6000803e3d6000fd5b505050506040513d602081101561569b57600080fd5b5051848385613e0d565b6002546040805163647846a560e01b815290517fe9636822f07fbe1b12a4943ca822303faab84d464c8c4f93a750269a75192645926001600160a01b03169163647846a5916004808301926020929190829003018186803b15801561570957600080fd5b505afa15801561571d573d6000803e3d6000fd5b505050506040513d602081101561573357600080fd5b5051604080516001600160a01b0392831681529184166020830152818101859052519081900360600190a1505050565b600080600088116157a55760405162461bcd60e51b815260040180806020018281038252602c815260200180615dd2602c913960400191505060405180910390fd5b6000871180156157b55750600086115b6157f05760405162461bcd60e51b8152600401808060200182810382526029815260200180615ca86029913960400191505060405180910390fd5b60006103e56158018a6103e86150ba565b8161580857fe5b049050615815818a614b77565b915060006158238a896150ba565b905060006158318a8c61511d565b905080828161583c57fe5b049450876001600160a01b031663d5229ea38888876040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b03168152602001828152602001935050505060206040518083038186803b1580156158a557600080fd5b505afa1580156158b9573d6000803e3d6000fd5b505050506040513d60208110156158cf57600080fd5b5051949b949a509398505050505050505050565b60008060006158f28585614d4b565b509050600080615903888888613d4d565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561593b57600080fd5b505afa15801561594f573d6000803e3d6000fd5b505050506040513d606081101561596557600080fd5b5080516020909101516001600160701b0391821693501690506001600160a01b038781169084161461599857808261599b565b81815b90999098509650505050505050565b600080600088116159ec5760405162461bcd60e51b815260040180806020018281038252602d815260200180615b98602d913960400191505060405180910390fd5b6000871180156159fc5750600086115b615a375760405162461bcd60e51b8152600401808060200182810382526029815260200180615ca86029913960400191505060405180910390fd5b6000615a496103e8614c6a8a8c6150ba565b90506000615a5d6103e5614c6a8a8d614b77565b90506000615a6f6001838581614c9457fe5b90506103e8615a7f8260036150ba565b81615a8657fe5b049350615a938185614b77565b9450876001600160a01b031663d5229ea38888876040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b03168152602001828152602001935050505060206040518083038186803b1580156158a557600080fd5b6040518060e00160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6040518060c00160405280600081526020016000815260200160008152602001600081526020016000815260200160008152509056fe436f696e537761705631526f7574657230323a20494e53554646494349454e545f425f414d4f554e54436f696e5377617056314c6962726172793a20494e53554646494349454e545f4f55545055545f414d4f554e545472616e7366657248656c7065723a3a7472616e7366657246726f6d3a207472616e7366657246726f6d206661696c6564436f696e5377617056314c6962726172793a20494e53554646494349454e545f414d4f554e545472616e7366657248656c7065723a3a736166655472616e736665724554483a20455448207472616e73666572206661696c6564436f696e537761705631526f7574657230323a20494e53554646494349454e545f4f55545055545f414d4f554e54436f696e537761705631526f7574657230323a204558434553534956455f494e5055545f414d4f554e54436f696e5377617056314c6962726172793a20494e53554646494349454e545f4c4951554944495459436f696e537761705631526f7574657230323a20494e56414c49445f50415448436f696e537761705631526f7574657230323a20455850495245440000000000436f696e5377617056314c6962726172793a204944454e544943414c5f4144445245535345536d616e6765723a2063616c6c6572206973206e6f7420746865206d616e676572436f696e537761705631526f7574657230323a20494e53554646494349454e545f415f414d4f554e54524f555445523a6665654d616e61676572206973206e6f74207a65726f20616464726573735472616e7366657248656c7065723a3a736166655472616e736665723a207472616e73666572206661696c6564436f696e5377617056314c6962726172793a20494e53554646494349454e545f494e5055545f414d4f554e54a2646970667358221220c015a4d3f2a1e160e975e5756db6e7a8ab1968f29777c54e89dd2e96b657f24d64736f6c634300060c0033000000000000000000000000f964b1b0c64ccfb0854e77fd2dbed68d0aadd26c000000000000000000000000bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c

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

000000000000000000000000f964b1b0c64ccfb0854e77fd2dbed68d0aadd26c000000000000000000000000bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c

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

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


Deployed ByteCode Sourcemap

17336:22984:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18266:10;-1:-1:-1;;;;;18280:4:0;18266:18;;18259:26;;;;17336:22984;;;;;23392:699;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;23392:699:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;39425:210;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39425:210:0;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;18489:185;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18489:185:0;-1:-1:-1;;;;;18489:185:0;;:::i;31802:969::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;31802:969:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;31802:969:0;;;;;;;;;;;;-1:-1:-1;31802:969:0;-1:-1:-1;;;;;;31802:969:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40092:225;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;40092:225:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;40092:225:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40092:225:0;;-1:-1:-1;40092:225:0;;-1:-1:-1;;;;;40092:225:0:i;24099:709::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;24099:709:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;28447:795::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;28447:795:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;28447:795:0;;;;;;;;;;;;-1:-1:-1;28447:795:0;-1:-1:-1;;;;;;28447:795:0;;;;;;;;:::i;18836:222::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18836:222:0;-1:-1:-1;;;;;18836:222:0;;:::i;30847:947::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;30847:947:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;30847:947:0;;;;;;;;;;;;-1:-1:-1;30847:947:0;-1:-1:-1;;;;;;30847:947:0;;;;;;;;:::i;17507:25::-;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;17507:25:0;;;;;;;;;;;;;;18682:146;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18682:146:0;-1:-1:-1;;;;;18682:146:0;;:::i;26327:747::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;26327:747:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;36351:709::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;36351:709:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;36351:709:0;;;;;;;;;;;;-1:-1:-1;36351:709:0;-1:-1:-1;;;;;;36351:709:0;;;;;;;;:::i;37875:800::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;37875:800:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;37875:800:0;;;;;;;;;;;;-1:-1:-1;37875:800:0;-1:-1:-1;;;;;;37875:800:0;;;;;;;;:::i;19066:131::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19066:131:0;-1:-1:-1;;;;;19066:131:0;;:::i;17571:21::-;;;;;;;;;;;;;:::i;30031:808::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;30031:808:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;30031:808:0;;;;;;;;;;;;-1:-1:-1;30031:808:0;-1:-1:-1;;;;;;30031:808:0;;;;;;;;:::i;39643:208::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39643:208:0;;;;;;;;;;;;:::i;29250:773::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;29250:773:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;29250:773:0;;;;;;;;;;;;-1:-1:-1;29250:773:0;-1:-1:-1;;;;;;29250:773:0;;;;;;;;:::i;17403:20::-;;;;;;;;;;;;;:::i;17471:29::-;;;;;;;;;;;;;:::i;39237:180::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39237:180:0;;;;;;;;;;;;:::i;25593:726::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;25593:726:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;37068:799::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;37068:799:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;37068:799:0;;;;;;;;;;;;-1:-1:-1;37068:799:0;-1:-1:-1;;;;;;37068:799:0;;;;;;;;:::i;22471:913::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;22471:913:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;17430:32::-;;;;;;;;;;;;;:::i;39859:225::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;39859:225:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;39859:225:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39859:225:0;;-1:-1:-1;39859:225:0;;-1:-1:-1;;;;;39859:225:0:i;17539:25::-;;;;;;;;;;;;;:::i;24816:698::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;24816:698:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;20648:769::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;20648:769:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;21425:1003;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;21425:1003:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;32779:921::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;32779:921:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;32779:921:0;;;;;;;;;;;;-1:-1:-1;32779:921:0;-1:-1:-1;;;;;;32779:921:0;;;;;;;;:::i;23392:699::-;23620:16;23638:14;23601:8;17997:15;17985:8;:27;;17977:67;;;;;-1:-1:-1;;;17977:67:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17977:67:0;;;;;;;;;;;;;;;23692:196:::1;23722:5;23742:4;23761:9;23785:14;23814:12;23849:4;23869:8;23692:15;:196::i;:::-;23665:223:::0;;-1:-1:-1;23665:223:0;-1:-1:-1;23899:51:0::1;23927:5:::0;23934:2;23665:223;23899:27:::1;:51::i;:::-;23967:4;-1:-1:-1::0;;;;;23961:20:0::1;;23982:9;23961:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;24003:45;24034:2;24038:9;24003:30;:45::i;:::-;24059:24;24071:5;24078:4;24059:11;:24::i;:::-;23392:699:::0;;;;;;;;;;:::o;39425:210::-;39524:14;39564:63;39595:8;39605:9;39616:10;39564:30;:63::i;:::-;39550:77;39425:210;-1:-1:-1;;;;39425:210:0:o;18489:185::-;18405:5;;-1:-1:-1;;;;;18405:5:0;18414:10;18405:19;18397:64;;;;;-1:-1:-1;;;18397:64:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;18397:64:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;18561:20:0;::::1;18553:55;;;::::0;;-1:-1:-1;;;18553:55:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;18553:55:0;;;;;;;;;;;;;::::1;;18619:5;:14:::0;;-1:-1:-1;;;;;18619:14:0;::::1;-1:-1:-1::0;;;;;;18619:14:0;;::::1;::::0;::::1;::::0;;;18649:17:::1;::::0;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;18489:185:::0;:::o;31802:969::-;31962:21;31943:8;17997:15;17985:8;:27;;17977:67;;;;;-1:-1:-1;;;17977:67:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17977:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;32028:4:0::1;32003:29;:4:::0;;-1:-1:-1;;32008:15:0;;32003:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;32003:21:0::1;-1:-1:-1::0;;;;;32003:29:0::1;;31995:74;;;::::0;;-1:-1:-1;;;31995:74:0;;::::1;;::::0;::::1;::::0;;;;;;;-1:-1:-1;;;;;;;;;;;31995:74:0;;;;;;;;;;;;;::::1;;32088:10;::::0;-1:-1:-1;;;;;32088:10:0::1;32080:74;;;;-1:-1:-1::0;;;32080:74:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32165:24;32224:81;32257:7;32266:8;32276:4;;32224:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;32282:10:0::1;::::0;-1:-1:-1;;;;;32282:10:0::1;::::0;-1:-1:-1;32294:10:0::1;::::0;-1:-1:-1;32224:32:0::1;:81::i;:::-;32332:14:::0;;32200:105;;-1:-1:-1;32200:105:0;-1:-1:-1;32355:12:0;;32200:105;;-1:-1:-1;;32332:18:0;;;32324:27;::::1;;;;;;;;;;;:43;;32316:102;;;;-1:-1:-1::0;;;32316:102:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32429:142;32475:4;;32480:1;32475:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;32475:7:0::1;32484:10;32496:52;32522:7;32531:4;;32536:1;32531:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;32531:7:0::1;32540:4;;32545:1;32540:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;32540:7:0::1;32496:25;:52::i;:::-;32550:7;32558:1;32550:10;;;;;;;;;;;;;;32429:31;:142::i;:::-;32582:47;32588:7;32597:10;32609:4;;32582:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;32623:4:0::1;::::0;-1:-1:-1;32582:5:0::1;::::0;-1:-1:-1;;32582:47:0:i:1;:::-;32646:4;-1:-1:-1::0;;;;;32640:20:0::1;;32661:7;32686:1;32669:7;:14;:18;32661:27;;;;;;;;;;;;;;32640:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;32700:63;32731:2;32735:7;32760:1;32743:7;:14;:18;32735:27;;;;;;;;;;;;;;32700:30;:63::i;:::-;18055:1;31802:969:::0;;;;;;;;;:::o;40092:225::-;40286:10;;40182:21;;40228:81;;40260:7;;40269:9;;40280:4;;-1:-1:-1;;;;;40286:10:0;40298;40228:31;:81::i;:::-;-1:-1:-1;40215:94:0;40092:225;-1:-1:-1;;;40092:225:0:o;24099:709::-;24396:12;24410;24435;24450:50;24476:7;24485:6;24493;24450:25;:50::i;:::-;24435:65;;24511:10;24524;:34;;24549:9;24524:34;;;-1:-1:-1;;24524:34:0;24569:81;;;-1:-1:-1;;;24569:81:0;;24598:10;24569:81;;;;24618:4;24569:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24511:47;;-1:-1:-1;;;;;;24569:28:0;;;;;:81;;;;;-1:-1:-1;;24569:81:0;;;;;;;;-1:-1:-1;24569:28:0;:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24682:80;24698:6;24706;24714:9;24725:10;24737;24749:2;24753:8;24682:15;:80::i;:::-;24661:101;;-1:-1:-1;24661:101:0;-1:-1:-1;24773:27:0;24785:6;24793;24773:11;:27::i;:::-;24099:709;;;;;;;;;;;;;;;;:::o;28447:795::-;28662:21;28643:8;17997:15;17985:8;:27;;17977:67;;;;;-1:-1:-1;;;17977:67:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17977:67:0;;;;;;;;;;;;;;;28704:10:::1;::::0;-1:-1:-1;;;;;28704:10:0::1;28696:74;;;;-1:-1:-1::0;;;28696:74:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28781:24;28840:81;28873:7;28882:8;28892:4;;28840:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;28898:10:0::1;::::0;-1:-1:-1;;;;;28898:10:0::1;::::0;-1:-1:-1;28910:10:0::1;::::0;-1:-1:-1;28840:32:0::1;:81::i;:::-;28948:14:::0;;28816:105;;-1:-1:-1;28816:105:0;-1:-1:-1;28971:12:0;;28816:105;;-1:-1:-1;;28948:18:0;;;28940:27;::::1;;;;;;;;;;;:43;;28932:102;;;;-1:-1:-1::0;;;28932:102:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29045:142;29091:4;;29096:1;29091:7;;;;;;29045:142;29198:36;29204:7;29213:10;29225:4;;29198:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;29231:2:0;;-1:-1:-1;29198:5:0::1;::::0;-1:-1:-1;;29198:36:0:i:1;18836:222::-:0;18405:5;;-1:-1:-1;;;;;18405:5:0;18414:10;18405:19;18397:64;;;;;-1:-1:-1;;;18397:64:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;18397:64:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;18916:25:0;::::1;18908:65;;;::::0;;-1:-1:-1;;;18908:65:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;18984:10;:24:::0;;-1:-1:-1;;;;;18984:24:0;::::1;-1:-1:-1::0;;;;;;18984:24:0;;::::1;::::0;::::1;::::0;;;19024:26:::1;::::0;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;18836:222:::0;:::o;30847:947::-;31007:21;30988:8;17997:15;17985:8;:27;;17977:67;;;;;-1:-1:-1;;;17977:67:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17977:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;31073:4:0::1;31048:29;:4:::0;;-1:-1:-1;;31053:15:0;;31048:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;31048:21:0::1;-1:-1:-1::0;;;;;31048:29:0::1;;31040:74;;;::::0;;-1:-1:-1;;;31040:74:0;;::::1;;::::0;::::1;::::0;;;;;;;-1:-1:-1;;;;;;;;;;;31040:74:0;;;;;;;;;;;;;::::1;;31133:10;::::0;-1:-1:-1;;;;;31133:10:0::1;31125:74;;;;-1:-1:-1::0;;;31125:74:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31210:24;31269:81;31301:7;31310:9;31321:4;;31269:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;31327:10:0::1;::::0;-1:-1:-1;;;;;31327:10:0::1;::::0;-1:-1:-1;31339:10:0::1;::::0;-1:-1:-1;31269:31:0::1;:81::i;:::-;31245:105;;;;;;;;31383:11;31369:7;31377:1;31369:10;;;;;;;;;;;;;;:25;;31361:80;;;;-1:-1:-1::0;;;31361:80:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17507:25:::0;;;-1:-1:-1;;;;;17507:25:0;;:::o;18682:146::-;18405:5;;-1:-1:-1;;;;;18405:5:0;18414:10;18405:19;18397:64;;;;;-1:-1:-1;;;18397:64:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;18397:64:0;;;;;;;;;;;;;;;18754:10:::1;:24:::0;;-1:-1:-1;;;;;18754:24:0;::::1;-1:-1:-1::0;;;;;;18754:24:0;;::::1;::::0;::::1;::::0;;;18794:26:::1;::::0;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;18682:146:::0;:::o;26327:747::-;26636:14;26663:12;26678:47;26704:7;26713:5;26720:4;26678:25;:47::i;:::-;26663:62;;26736:10;26749;:34;;26774:9;26749:34;;;-1:-1:-1;;26749:34:0;26794:81;;;-1:-1:-1;;;26794:81:0;;26823:10;26794:81;;;;26843:4;26794:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26736:47;;-1:-1:-1;;;;;;26794:28:0;;;;;:81;;;;;-1:-1:-1;;26794:81:0;;;;;;;;-1:-1:-1;26794:28:0;:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26898:133;26960:5;26967:9;26978:14;26994:12;27008:2;27012:8;26898:47;:133::i;:::-;26886:145;;27042:24;27054:5;27061:4;27042:11;:24::i;:::-;26327:747;;;;;;;;;;;;;;:::o;36351:709::-;36576:8;17997:15;17985:8;:27;;17977:67;;;;;-1:-1:-1;;;17977:67:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17977:67:0;;;;;;;;;;;;;;;36597:140:::1;36643:4;;36648:1;36643:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;36643:7:0::1;36652:10;36664:52;36690:7;36699:4;;36704:1;36699:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;36699:7:0::1;36708:4;;36713:1;36708:7;;;;;;36664:52;36718:8;36597:31;:140::i;:::-;36748:18;36776:4:::0;;-1:-1:-1;;36781:15:0;;36776:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;36776:21:0::1;-1:-1:-1::0;;;;;36769:39:0::1;;36809:2;36769:43;;;;;;;;;;;;;-1:-1:-1::0;;;;;36769:43:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;36769:43:0;36823:44:::1;::::0;;36769:43:::1;36823:44:::0;;::::1;::::0;;;;;;;;;;;36769:43;;-1:-1:-1;36823:44:0::1;::::0;;;36858:4;;;;;;36823:44;::::1;::::0;36858:4;;36823:44;36858:4;36823:44;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;36864:2:0;;-1:-1:-1;36823:34:0::1;::::0;-1:-1:-1;;36823:44:0:i:1;:::-;36966:12:::0;36900:62:::1;36948:13:::0;36907:4;;-1:-1:-1;;36912:15:0;;36907:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;36907:21:0::1;-1:-1:-1::0;;;;;36900:39:0::1;;36940:2;36900:43;;;;;;;;;;;;;-1:-1:-1::0;;;;;36900:43:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;36900:43:0;;:47:::1;:62::i;:::-;:78;;36878:174;;;;-1:-1:-1::0;;;36878:174:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18055:1;36351:709:::0;;;;;;;:::o;37875:800::-;38097:8;17997:15;17985:8;:27;;17977:67;;;;;-1:-1:-1;;;17977:67:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17977:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;38151:4:0::1;38126:29;:4:::0;;-1:-1:-1;;38131:15:0;;38126:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;38126:21:0::1;-1:-1:-1::0;;;;;38126:29:0::1;;38118:74;;;::::0;;-1:-1:-1;;;38118:74:0;;::::1;;::::0;::::1;::::0;;;;;;;-1:-1:-1;;;;;;;;;;;38118:74:0;;;;;;;;;;;;;::::1;;38203:140;38249:4;;38254:1;38249:7;;;;;;38203:140;38354:55;38389:4;;38354:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;38403:4:0::1;::::0;-1:-1:-1;38354:34:0::1;::::0;-1:-1:-1;;38354:55:0:i:1;:::-;38420:14;38444:4;-1:-1:-1::0;;;;;38437:22:0::1;;38468:4;38437:37;;;;;;;;;;;;;-1:-1:-1::0;;;;;38437:37:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;38437:37:0;;-1:-1:-1;38493:25:0;;::::1;;38485:84;;;;-1:-1:-1::0;;;38485:84:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38586:4;-1:-1:-1::0;;;;;38580:20:0::1;;38601:9;38580:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;38622:45;38653:2;38657:9;38622:30;:45::i;19066:131::-:0;18405:5;;-1:-1:-1;;;;;18405:5:0;18414:10;18405:19;18397:64;;;;;-1:-1:-1;;;18397:64:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;18397:64:0;;;;;;;;;;;;;;;19130:6:::1;:16:::0;;-1:-1:-1;;;;;19130:16:0;::::1;-1:-1:-1::0;;;;;;19130:16:0;;::::1;::::0;::::1;::::0;;;19162:27:::1;::::0;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;19066:131:::0;:::o;17571:21::-;;;-1:-1:-1;;;;;17571:21:0;;:::o;30031:808::-;30184:21;30165:8;17997:15;17985:8;:27;;17977:67;;;;;-1:-1:-1;;;17977:67:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17977:67:0;;;;;;;;;;;;;;;30236:4:::1;-1:-1:-1::0;;;;;30225:15:0::1;:4;;30230:1;30225:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;30225:7:0::1;-1:-1:-1::0;;;;;30225:15:0::1;;30217:60;;;::::0;;-1:-1:-1;;;30217:60:0;;::::1;;::::0;::::1;::::0;;;;;;;-1:-1:-1;;;;;;;;;;;30217:60:0;;;;;;;;;;;;;::::1;;30296:10;::::0;-1:-1:-1;;;;;30296:10:0::1;30288:74;;;;-1:-1:-1::0;;;30288:74:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30373:24;30432:82;30465:7;30474:9;30485:4;;30432:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;30491:10:0::1;::::0;-1:-1:-1;;;;;30491:10:0::1;::::0;-1:-1:-1;30503:10:0::1;::::0;-1:-1:-1;30432:32:0::1;:82::i;:::-;30541:14:::0;;30408:106;;-1:-1:-1;30408:106:0;-1:-1:-1;30564:12:0;;30408:106;;-1:-1:-1;;30541:18:0;;;30533:27;::::1;;;;;;;;;;;:43;;30525:102;;;;-1:-1:-1::0;;;30525:102:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30644:4;-1:-1:-1::0;;;;;30638:19:0::1;;30666:7;30674:1;30666:10;;;;;;;;;;;;;;30638:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;30703:4;-1:-1:-1::0;;;;;30697:20:0::1;;30718:52;30744:7;30753:4;;30758:1;30753:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;30753:7:0::1;30762:4;;30767:1;30762:7;;;;;;30718:52;30772:7;30780:1;30772:10;;;;;;;;;;;;;;30697:86;;;;;;;;;;;;;-1:-1:-1::0;;;;;30697:86:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;30697:86:0;30690:94:::1;;;;30795:36;30801:7;30810:10;30822:4;;30795:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;30828:2:0;;-1:-1:-1;30795:5:0::1;::::0;-1:-1:-1;;30795:36:0:i:1;:::-;18055:1;30031:808:::0;;;;;;;;:::o;39643:208::-;39742:13;39780:63;39810:9;39821;39832:10;39780:29;:63::i;29250:773::-;29465:21;29446:8;17997:15;17985:8;:27;;17977:67;;;;;-1:-1:-1;;;17977:67:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17977:67:0;;;;;;;;;;;;;;;29507:10:::1;::::0;-1:-1:-1;;;;;29507:10:0::1;29499:74;;;;-1:-1:-1::0;;;29499:74:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29584:24;29643:81;29675:7;29684:9;29695:4;;29643:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;29701:10:0::1;::::0;-1:-1:-1;;;;;29701:10:0::1;::::0;-1:-1:-1;29713:10:0::1;::::0;-1:-1:-1;29643:31:0::1;:81::i;:::-;29619:105;;;;;;;;29757:11;29743:7;29751:1;29743:10;;;;;;;;;;;;;;:25;;29735:80;;;;-1:-1:-1::0;;;29735:80:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17403:20:::0;;;-1:-1:-1;;;;;17403:20:0;;:::o;17471:29::-;;;:::o;39237:180::-;39325:12;39357:52;39381:7;39390:8;39400;39357:23;:52::i;25593:726::-;25850:14;25831:8;17997:15;17985:8;:27;;17977:67;;;;;-1:-1:-1;;;17977:67:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17977:67:0;;;;;;;;;;;;;;;25893:196:::1;25923:5;25943:4;25962:9;25986:14;26015:12;26050:4;26070:8;25893:15;:196::i;:::-;25877:212;;;;;;26100:78;26128:5;26135:2;26146:5;-1:-1:-1::0;;;;;26139:23:0::1;;26171:4;26139:38;;;;;;;;;;;;;-1:-1:-1::0;;;;;26139:38:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;26139:38:0;26100:27:::1;:78::i;:::-;26195:4;-1:-1:-1::0;;;;;26189:20:0::1;;26210:9;26189:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;26231:45;26262:2;26266:9;26231:30;:45::i;:::-;26287:24;26299:5;26306:4;26287:11;:24::i;:::-;25593:726:::0;;;;;;;;;:::o;37068:799::-;37274:8;17997:15;17985:8;:27;;17977:67;;;;;-1:-1:-1;;;17977:67:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17977:67:0;;;;;;;;;;;;;;;37314:4:::1;-1:-1:-1::0;;;;;37303:15:0::1;:4;;37308:1;37303:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;37303:7:0::1;-1:-1:-1::0;;;;;37303:15:0::1;;37295:60;;;::::0;;-1:-1:-1;;;37295:60:0;;::::1;;::::0;::::1;::::0;;;;;;;-1:-1:-1;;;;;;;;;;;37295:60:0;;;;;;;;;;;;;::::1;;37366:13;37382:9;37366:25;;37408:4;-1:-1:-1::0;;;;;37402:19:0::1;;37430:8;37402:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;37465:4;-1:-1:-1::0;;;;;37459:20:0::1;;37480:52;37506:7;37515:4;;37520:1;37515:7;;;;;;37480:52;37534:8;37459:84;;;;;;;;;;;;;-1:-1:-1::0;;;;;37459:84:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;37459:84:0;37452:92:::1;;;;37555:18;37583:4:::0;;-1:-1:-1;;37588:15:0;;37583:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;37583:21:0::1;-1:-1:-1::0;;;;;37576:39:0::1;;37616:2;37576:43;;;;;;;;;;;;;-1:-1:-1::0;;;;;37576:43:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;37576:43:0;37630:44:::1;::::0;;37576:43:::1;37630:44:::0;;::::1;::::0;;;;;;;;;;;37576:43;;-1:-1:-1;37630:44:0::1;::::0;;;37665:4;;;;;;37630:44;::::1;::::0;37665:4;;37630:44;37665:4;37630:44;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;37671:2:0;;-1:-1:-1;37630:34:0::1;::::0;-1:-1:-1;;37630:44:0:i:1;:::-;37773:12:::0;37707:62:::1;37755:13:::0;37714:4;;-1:-1:-1;;37719:15:0;;37714:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;37714:21:0::1;-1:-1:-1::0;;;;;37707:39:0::1;;37747:2;37707:43;;;;;;;;;;;;;-1:-1:-1::0;;;;;37707:43:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;22471:913:::0;22716:12;22730;22697:8;17997:15;17985:8;:27;;17977:67;;;;;-1:-1:-1;;;17977:67:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17977:67:0;;;;;;;;;;;;;;;22755:12:::1;22770:50;22796:7;22805:6;22813;22770:25;:50::i;:::-;22831:63;::::0;;-1:-1:-1;;;22831:63:0;;22866:10:::1;22831:63;::::0;::::1;::::0;-1:-1:-1;;;;;22831:34:0;::::1;:63:::0;;;;;;;;;;;;;;22755:65;;-1:-1:-1;22831:34:0;;::::1;::::0;:63;;;;;::::1;::::0;;;;;;;;;-1:-1:-1;22831:34:0;:63;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;22971:30:0::1;::::0;;-1:-1:-1;;;22971:30:0;;-1:-1:-1;;;;;22971:30:0;;::::1;;::::0;::::1;::::0;;;22941:12:::1;::::0;;;22971:26;;::::1;::::0;::::1;::::0;:30;;;;;;;;;;;22941:12;22971:26;:30;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;22971:30:0;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;22971:30:0;-1:-1:-1;23013:14:0::1;23032:44;23061:6:::0;23069;23032:28:::1;:44::i;:::-;23012:64;;;23118:6;-1:-1:-1::0;;;;;23108:16:0::1;:6;-1:-1:-1::0;;;;;23108:16:0::1;;:58;;23149:7;23158;23108:58;;;23128:7;23137;23108:58;23087:79:::0;;-1:-1:-1;23087:79:0;-1:-1:-1;23185:21:0;;::::1;;23177:75;;;;-1:-1:-1::0;;;23177:75:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23282:10;23271:7;:21;;23263:75;;;;-1:-1:-1::0;;;23263:75:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23349:27;23361:6;23369;23349:11;:27::i;:::-;18055:1;;;;22471:913:::0;;;;;;;;;;;:::o;17430:32::-;;;:::o;39859:225::-;40053:10;;39949:21;;39995:81;;40028:7;;40037:8;;40047:4;;-1:-1:-1;;;;;40053:10:0;40065;39995:32;:81::i;17539:25::-;;;-1:-1:-1;;;;;17539:25:0;;:::o;24816:698::-;25096:16;25114:14;25141:12;25156:47;25182:7;25191:5;25198:4;25156:25;:47::i;:::-;25141:62;;25214:10;25227;:34;;25252:9;25227:34;;;-1:-1:-1;;25227:34:0;25272:81;;;-1:-1:-1;;;25272:81:0;;25301:10;25272:81;;;;25321:4;25272:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25214:47;;-1:-1:-1;;;;;;25272:28:0;;;;;:81;;;;;-1:-1:-1;;25272:81:0;;;;;;;;-1:-1:-1;25272:28:0;:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25391:80;25410:5;25417:9;25428:14;25444:12;25458:2;25462:8;25391:18;:80::i;:::-;25364:107;;-1:-1:-1;25364:107:0;-1:-1:-1;25482:24:0;25494:5;25501:4;25482:11;:24::i;:::-;24816:698;;;;;;;;;;;;;;;:::o;20648:769::-;20927:12;20941;20955:14;20908:8;17997:15;17985:8;:27;;17977:67;;;;;-1:-1:-1;;;17977:67:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17977:67:0;;;;;;;;;;;;;;;21003:85:::1;21017:6;21025;21033:14;21049;21065:10;21077;21003:13;:85::i;:::-;20982:106:::0;;-1:-1:-1;20982:106:0;-1:-1:-1;21099:12:0::1;21114:50;21140:7;21149:6:::0;21157;21114:25:::1;:50::i;:::-;21099:65;;21175:66;21207:6;21215:10;21227:4;21233:7;21175:31;:66::i;:::-;21252;21284:6;21292:10;21304:4;21310:7;21252:31;:66::i;:::-;21357:4;-1:-1:-1::0;;;;;21341:26:0::1;;21368:2;21341:30;;;;;;;;;;;;;-1:-1:-1::0;;;;;21341:30:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;21341:30:0;;-1:-1:-1;21382:27:0::1;21394:6:::0;21402;21382:11:::1;:27::i;:::-;18055:1;20648:769:::0;;;;;;;;;;;;;:::o;21425:1003::-;21669:16;21687:14;21703;21650:8;17997:15;17985:8;:27;;17977:67;;;;;-1:-1:-1;;;17977:67:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17977:67:0;;;;;;;;;;;;;;;21757:176:::1;21785:5;21805:4;21824:18;21857:9;21881:14;21910:12;21757:13;:176::i;:::-;21730:203:::0;;-1:-1:-1;21730:203:0;-1:-1:-1;21944:12:0::1;21959:47;21985:7;21994:5:::0;22001:4:::1;21959:25;:47::i;:::-;21944:62;;22017:69;22049:5;22056:10;22068:4;22074:11;22017:31;:69::i;:::-;22103:4;-1:-1:-1::0;;;;;22097:19:0::1;;22125:9;22097:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;22161:4;-1:-1:-1::0;;;;;22155:20:0::1;;22176:4;22182:9;22155:37;;;;;;;;;;;;;-1:-1:-1::0;;;;;22155:37:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;22155:37:0;22148:45:::1;;;;22232:4;-1:-1:-1::0;;;;;22216:26:0::1;;22243:2;22216:30;;;;;;;;;;;;;-1:-1:-1::0;;;;;22216:30:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;22216:30:0;;-1:-1:-1;22297:9:0::1;:21:::0;-1:-1:-1;22293:92:0::1;;;22320:65;22351:10;22375:9;22363;:21;22320:30;:65::i;:::-;22396:24;22408:5;22415:4;22396:11;:24::i;:::-;18055:1;21425:1003:::0;;;;;;;;;;;:::o;32779:921::-;32929:21;32910:8;17997:15;17985:8;:27;;17977:67;;;;;-1:-1:-1;;;17977:67:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17977:67:0;;;;;;;;;;;;;;;32981:4:::1;-1:-1:-1::0;;;;;32970:15:0::1;:4;;32975:1;32970:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;32970:7:0::1;-1:-1:-1::0;;;;;32970:15:0::1;;32962:60;;;::::0;;-1:-1:-1;;;32962:60:0;;::::1;;::::0;::::1;::::0;;;;;;;-1:-1:-1;;;;;;;;;;;32962:60:0;;;;;;;;;;;;;::::1;;33041:10;::::0;-1:-1:-1;;;;;33041:10:0::1;33033:74;;;;-1:-1:-1::0;;;33033:74:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33118:24;33177:81;33209:7;33218:9;33229:4;;33177:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;33235:10:0::1;::::0;-1:-1:-1;;;;;33235:10:0::1;::::0;-1:-1:-1;33247:10:0::1;::::0;-1:-1:-1;33177:31:0::1;:81::i;:::-;33153:105;;;;;;;;33291:9;33277:7;33285:1;33277:10;;;;;;;;;;;;;;:23;;33269:78;;;;-1:-1:-1::0;;;33269:78:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33364:4;-1:-1:-1::0;;;;;33358:19:0::1;;33386:7;33394:1;33386:10;;;;;;;;;;;;;;33358:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;33423:4;-1:-1:-1::0;;;;;33417:20:0::1;;33438:52;33464:7;33473:4;;33478:1;33473:7;;;;;;33438:52;33492:7;33500:1;33492:10;;;;;;;;;;;;;;33417:86;;;;;;;;;;;;;-1:-1:-1::0;;;;;33417:86:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;33417:86:0;33410:94:::1;;;;33515:36;33521:7;33530:10;33542:4;;33515:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;33548:2:0;;-1:-1:-1;33515:5:0::1;::::0;-1:-1:-1;;33515:36:0:i:1;:::-;33614:7;33622:1;33614:10;;;;;;;;;;;;;;33602:9;:22;33598:94;;;33626:66;33657:10;33681:7;33689:1;33681:10;;;;;;;;;;;;;;33669:9;:22;33626:30;:66::i;676:449::-:0;908:45;;;-1:-1:-1;;;;;908:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;908:45:0;-1:-1:-1;;;908:45:0;;;897:57;;;;862:12;;876:17;;897:10;;;;908:45;897:57;;;908:45;897:57;;908:45;897:57;;;;;;;;;;-1:-1:-1;;897:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;861:93;;;;987:7;:57;;;;-1:-1:-1;999:11:0;;:16;;:44;;;1030:4;1019:24;;;;;;;;;;;;;;;-1:-1:-1;1019:24:0;999:44;965:152;;;;-1:-1:-1;;;965:152:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;676:449;;;;;:::o;1639:217::-;1752:12;;;1712;1752;;;;;;;;;-1:-1:-1;;;;;1730:7:0;;;1745:5;;1730:35;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1730:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1711:54;;;1784:7;1776:72;;;;-1:-1:-1;;;1776:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1639:217;;;:::o;39022:171::-;39107:6;;-1:-1:-1;;;;;39107:6:0;39099:29;39095:91;;39145:6;;:29;;;-1:-1:-1;;;39145:29:0;;-1:-1:-1;;;;;39145:29:0;;;;;;;;;;;;;;;;:6;;;;;:13;;:29;;;;;:6;;:29;;;;;;;:6;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39095:91;39022:171;;:::o;9732:519::-;9825:14;9871:1;9860:8;:12;9852:69;;;;-1:-1:-1;;;9852:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9952:1;9940:9;:13;:31;;;;;9970:1;9957:10;:14;9940:31;9932:85;;;;-1:-1:-1;;;9932:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10028:20;10051:17;:8;10064:3;10051:12;:17::i;:::-;10028:40;-1:-1:-1;10079:14:0;10096:31;10028:40;10116:10;10096:19;:31::i;:::-;10079:48;-1:-1:-1;10138:16:0;10157:40;10181:15;10157:19;:9;10171:4;10157:13;:19::i;:::-;:23;;:40::i;:::-;10138:59;;10232:11;10220:9;:23;;;;;;;9732:519;-1:-1:-1;;;;;;;9732:519:0:o;12587:634::-;12723:21;12746:24;12806:1;12791:4;:11;:16;;12783:60;;;;;-1:-1:-1;;;12783:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;12875:4;:11;12864:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12864:23:0;;12854:33;;12922:4;:11;12911:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12911:23:0;;12898:36;;12958:8;12945:7;12953:1;12945:10;;;;;;;;;;;;;:21;;;;;12977:17;13010:6;13005:209;13036:1;13022:4;:11;:15;13018:1;:19;13005:209;;;13107:95;13118:7;13127;13135:1;13127:10;;;;;;;;;;;;;;13139;13151:4;13156:1;13151:7;;;;;;;;;;;;;;13160:4;13165:1;13169;13165:5;13160:11;;;;;;;;;;;;;;13173:5;13180:4;13186:12;13200:1;13107:10;:95::i;:::-;13060:7;13068:1;13072;13068:5;13060:14;;;;;;;;;;;;;13076:10;13087:1;13076:13;;;;;;;;;;;;;;;;;13059:143;;;;;;;;-1:-1:-1;13039:3:0;;13005:209;;;;12587:634;;;;;;;;;:::o;8246:478::-;8335:12;8361:14;8377;8395:26;8406:6;8414;8395:10;:26::i;:::-;8559:32;;;-1:-1:-1;;8559:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8549:43;;;;;;-1:-1:-1;;;;;;8462:251:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8452:262;;;;;;;;;8246:478;-1:-1:-1;;;;;8246:478:0:o;1133:498::-;1404:51;;;-1:-1:-1;;;;;1404:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1404:51:0;-1:-1:-1;;;1404:51:0;;;1393:63;;;;1358:12;;1372:17;;1393:10;;;;1404:51;1393:63;;;1404:51;1393:63;;1404:51;1393:63;;;;;;;;;;-1:-1:-1;;1393:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1357:99;;;;1489:7;:57;;;;-1:-1:-1;1501:11:0;;:16;;:44;;;1532:4;1521:24;;;;;;;;;;;;;;;-1:-1:-1;1521:24:0;1501:44;1467:156;;;;-1:-1:-1;;;1467:156:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27185:1254;27318:6;27313:1119;27344:1;27330:4;:11;:15;27326:1;:19;27313:1119;;;27368:13;27383:14;27402:4;27407:1;27402:7;;;;;;;;;;;;;;27411:4;27416:1;27420;27416:5;27411:11;;;;;;;;;;;;;;27367:56;;;;27439:14;27458:43;27487:5;27494:6;27458:28;:43::i;:::-;27438:63;;;27516:14;27533:7;27541:1;27545;27541:5;27533:14;;;;;;;;;;;;;;27516:31;;27562:8;27597:57;27631:10;;;;;;;;;-1:-1:-1;;;;;27631:10:0;27643;27597:33;:57::i;:::-;:78;;;;;27674:1;27658:10;27669:1;27658:13;;;;;;;;;;;;;;:17;27597:78;27593:229;;;27696:38;27708:10;27720;27731:1;27720:13;;;;;;;;;;;;;;27696:11;:38::i;:::-;27771:10;;;;;;;;;-1:-1:-1;;;;;27771:10:0;-1:-1:-1;;;;;27759:40:0;;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27759:42:0;:47;;;;-1:-1:-1;27593:229:0;27841:10;;-1:-1:-1;;;;;27841:10:0;:24;;;;27840:34;;;27871:3;27870:4;27840:34;27836:141;;;27907:10;;27895:66;;;-1:-1:-1;;;27895:66:0;;27924:10;27895:66;;;;-1:-1:-1;;;;;27895:66:0;;;;;;;;;;;;;;;;;;;;;;27907:10;;;;;27895:28;;:66;;;;;;;;;;;;;;27907:10;;27895:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;27836:141:0;27992:15;28009;28037:6;-1:-1:-1;;;;;28028:15:0;:5;-1:-1:-1;;;;;28028:15:0;;:61;;28070:9;28086:1;28028:61;;;28052:1;28056:9;28028:61;27991:98;;;;28104:10;28135:1;28121:4;:11;:15;28117:1;:19;:83;;28197:3;28117:83;;;28139:55;28165:7;28174:6;28182:4;28187:1;28191;28187:5;28182:11;;;;;;;;;;;;;;28139:25;:55::i;:::-;28104:96;;28231:49;28257:7;28266:5;28273:6;28231:25;:49::i;:::-;-1:-1:-1;;;;;28215:71:0;;28305:10;28317;28329:2;28343:1;28333:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28333:12:0;;28347:10;28215:157;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;28215:157:0;;;;;;;;;-1:-1:-1;;;;;28215:157:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28387:33;28399:4;28404:1;28399:7;;;;;;;;;;;;;;28408:4;28413:1;28417;28413:5;28408:11;;;;;;;;;;;;;;28387;:33::i;:::-;-1:-1:-1;;27347:3:0;;;;;-1:-1:-1;27313:1119:0;;-1:-1:-1;;;;;27313:1119:0;13302:659;13438:21;13461:24;13521:1;13506:4;:11;:16;;13498:60;;;;;-1:-1:-1;;;13498:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;13590:4;:11;13579:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13579:23:0;;13569:33;;13637:4;:11;13626:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13626:23:0;;13613:36;;13690:9;13660:7;13685:1;13668:7;:14;:18;13660:27;;;;;;;;;;;;;;;;;:39;13752:11;;13710:17;;-1:-1:-1;;13752:15:0;13738:216;13769:5;;13738:216;;13848:94;13859:7;13868;13876:1;13868:10;;;;;;;;;;;;;;13880;13892:4;13901:1;13897;:5;13892:11;;;;;;;;;;;;;;13905:4;13910:1;13905:7;;;;;;;;;;;;;;13914:4;13920;13926:12;13940:1;13848:10;:94::i;:::-;13797:7;13809:1;13805;:5;13797:14;;;;;;;;;;;;;13813:10;13828:1;13824;:5;13813:17;;;;;;;;;;;;;;;;;13796:146;;;;;;;;-1:-1:-1;;;13776:3:0;13738:216;;34060:2283;34173:6;34168:2168;34199:1;34185:4;:11;:15;34181:1;:19;34168:2168;;;34223:13;34238:14;34257:4;34262:1;34257:7;;;;;;;;;;;;;;34266:4;34271:1;34275;34271:5;34266:11;;;;;;;;;;;;;;34222:56;;;;34294:14;34313:43;34342:5;34349:6;34313:28;:43::i;:::-;34293:63;;;34371:20;34410:49;34436:7;34445:5;34452:6;34410:25;:49::i;:::-;34371:89;;34475:20;;:::i;:::-;34498:27;;;;;;;;34505:1;34498:27;;;;34508:1;34498:27;;;;34511:1;34498:27;;;;34514:1;34498:27;;;;34517:1;34498:27;;;;34520:1;34498:27;;;;34523:1;34498:27;;;34475:50;;34540:8;34667:4;-1:-1:-1;;;;;34667:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34667:18:0;;;;;;;-1:-1:-1;;;;;34629:56:0;;;34647:15;;;34629:56;;34667:18;34630:15;;34629:56;-1:-1:-1;;;;;34750:15:0;;;;;;;:89;;34806:6;:15;;;34823:6;:15;;;34750:89;;;34769:6;:15;;;34786:6;:15;;;34750:89;34726:20;;;34704:135;34705:19;;;34704:135;;;34879:38;;;-1:-1:-1;;;34879:38:0;;-1:-1:-1;;;;;34879:38:0;;;;;;;;;:63;;34704:135;34879:23;;;;;:38;;;;;-1:-1:-1;;34879:38:0;;;;;;;:23;:38;;;;;;;;;;:63;34858:84;;;35038:19;;;;35059:20;;;;34987:93;;34858:84;35038:19;34987:30;:93::i;:::-;34964:19;;;34963:117;35139:10;;35105:57;;-1:-1:-1;;;;;35139:10:0;35151;35105:33;:57::i;:::-;35101:674;;;35187:16;35257:133;35294:6;:18;;;35314:6;:19;;;35335:6;:20;;;35357:10;;;;;;;;;-1:-1:-1;;;;;35357:10:0;35369:4;35374:1;35369:7;;;;;;;;;;;;;;35378:4;35383:1;35387;35383:5;35378:11;;;;;;;;;;;;;;35257:36;:133::i;:::-;35237:16;;;35226:164;;;;;-1:-1:-1;35417:20:0;;;;:108;;;35509:6;:16;;;35460:10;;;;;;;;;-1:-1:-1;;;;;35460:10:0;-1:-1:-1;;;;;35448:32:0;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35448:34:0;35441:64;;;-1:-1:-1;;;35441:64:0;;35494:10;35441:64;;;;;;-1:-1:-1;;;;;35441:52:0;;;;;;:64;;;;;35448:34;;35441:64;;;;;;;;:52;:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35441:64:0;:84;;35417:108;35413:343;;;35554:19;;;:30;;;35635:16;;;;35611:41;;35623:10;;35611:11;:41::i;:::-;35697:10;;;;;;;;;-1:-1:-1;;;;;35697:10:0;-1:-1:-1;;;;;35685:40:0;;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35685:42:0;:47;;;;-1:-1:-1;35413:343:0;35101:674;;35809:10;;-1:-1:-1;;;;;35809:10:0;:24;;;;35808:34;;;35839:3;35838:4;35808:34;35804:151;;;35875:10;;35919:19;;;;;35863:76;;;-1:-1:-1;;;35863:76:0;;35892:10;35863:76;;;;-1:-1:-1;;;;;35863:76:0;;;;;;;;;;;;;;;;;;;;;;;35875:10;;;;;35863:28;;:76;;;;;35919:19;;35863:76;;;;;35875:10;;35863:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;35804:151:0;35970:15;35987;36015:6;-1:-1:-1;;;;;36006:15:0;:5;-1:-1:-1;;;;;36006:15:0;;:81;;36058:6;:19;;;36084:1;36006:81;;;36030:1;36034:6;:19;;;36006:81;35969:118;;;;36102:10;36133:1;36119:4;:11;:15;36115:1;:19;:83;;36195:3;36115:83;;;36137:55;36163:7;36172:6;36180:4;36185:1;36189;36185:5;36180:11;;;;;;;36137:55;36251:12;;;36261:1;36251:12;;;;;;;;;;-1:-1:-1;;;36213:63:0;;;;;;;;;;;;;;-1:-1:-1;;;;;36213:63:0;;;;;;;36265:10;36213:63;;;;;;;;;;;;;;;;;;;;;36102:96;;-1:-1:-1;36213:9:0;;;;;;36223:10;;36235;;36102:96;;36251:12;;36213:63;;;;;;;;36251:12;;36213:63;;;;36251:12;;36213:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36291:33;36303:4;36308:1;36303:7;;;;;;;;;;;;;;36312:4;36317:1;36321;36317:5;36312:11;;;;;;;36291:33;-1:-1:-1;;34202:3:0;;;;;-1:-1:-1;34168:2168:0;;-1:-1:-1;;;;;;34168:2168:0;5831:129;5915:5;;;5910:16;;;;5902:50;;;;;-1:-1:-1;;;5902:50:0;;;;;;;;;;;;-1:-1:-1;;;5902:50:0;;;;;;;;;;;;;;;5831:129;;;;:::o;11189:474::-;11282:13;11328:1;11316:9;:13;11308:71;;;;-1:-1:-1;;;11308:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11410:1;11398:9;:13;:31;;;;;11428:1;11415:10;:14;11398:31;11390:85;;;;-1:-1:-1;;;11390:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11486:14;11503:34;11532:4;11503:24;:9;11517;11503:13;:24::i;:::-;:28;;:34::i;:::-;11486:51;-1:-1:-1;11548:16:0;11567:34;11597:3;11567:25;:10;11582:9;11567:14;:25::i;:34::-;11548:53;;11623:32;11653:1;11636:11;11624:9;:23;;;;;;;11623:29;:32::i;:::-;11612:43;11189:474;-1:-1:-1;;;;;;11189:474:0:o;9287:323::-;9369:12;9412:1;9402:7;:11;9394:62;;;;-1:-1:-1;;;9394:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9486:1;9475:8;:12;:28;;;;;9502:1;9491:8;:12;9475:28;9467:82;;;;-1:-1:-1;;;9467:82:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9594:8;9570:21;:7;9582:8;9570:11;:21::i;:::-;:32;;;;;;;9287:323;-1:-1:-1;;;;9287:323:0:o;7803:351::-;7878:14;7894;7939:6;-1:-1:-1;;;;;7929:16:0;:6;-1:-1:-1;;;;;7929:16:0;;;7921:67;;;;-1:-1:-1;;;7921:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8027:6;-1:-1:-1;;;;;8018:15:0;:6;-1:-1:-1;;;;;8018:15:0;;:53;;8056:6;8064;8018:53;;;8037:6;8045;8018:53;7999:72;;-1:-1:-1;7999:72:0;-1:-1:-1;;;;;;8090:20:0;;8082:64;;;;;-1:-1:-1;;;8082:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;7803:351;;;;;:::o;19237:1403::-;19455:12;19469;19614:1;-1:-1:-1;;;;;19550:66:0;19570:7;-1:-1:-1;;;;;19550:36:0;;19587:6;19595;19550:52;;;;;;;;;;;;;-1:-1:-1;;;;;19550:52:0;;;;;;-1:-1:-1;;;;;19550:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19550:52:0;-1:-1:-1;;;;;19550:66:0;;19546:154;;;19653:7;-1:-1:-1;;;;;19633:39:0;;19673:6;19681;19633:55;;;;;;;;;;;;;-1:-1:-1;;;;;19633:55:0;;;;;;-1:-1:-1;;;;;19633:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;19546:154:0;19711:13;19726;19743:54;19773:7;19782:6;19790;19743:29;:54::i;:::-;19710:87;;;;19812:8;19824:1;19812:13;:30;;;;-1:-1:-1;19829:13:0;;19812:30;19808:825;;;19881:14;;-1:-1:-1;19897:14:0;;-1:-1:-1;19808:825:0;;;19945:19;19967:59;19991:14;20007:8;20017;19967:23;:59::i;:::-;19945:81;;20063:14;20045;:32;20041:581;;20124:10;20106:14;:28;;20098:82;;;;-1:-1:-1;;;20098:82:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20221:14;;-1:-1:-1;20237:14:0;-1:-1:-1;20237:14:0;20041:581;;;20293:19;20315:59;20339:14;20355:8;20365;20315:23;:59::i;:::-;20293:81;;20418:14;20400;:32;;20393:40;;;;20478:10;20460:14;:28;;20452:82;;;;-1:-1:-1;;;20452:82:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20575:14;-1:-1:-1;20591:14:0;;-1:-1:-1;20041:581:0;19808:825;;19237:1403;;;;;;;;;;;:::o;5968:142::-;6020:6;6047;;;:30;;-1:-1:-1;;6062:5:0;;;6076:1;6071;6062:5;6071:1;6057:15;;;;;:20;6047:30;6039:63;;;;;-1:-1:-1;;;6039:63:0;;;;;;;;;;;;-1:-1:-1;;;6039:63:0;;;;;;;;;;;;;;5695:128;5779:5;;;5774:16;;;;5766:49;;;;;-1:-1:-1;;;5766:49:0;;;;;;;;;;;;-1:-1:-1;;;5766:49:0;;;;;;;;;;;;;;14328:1957;14507:4;14513;14519;14535:20;;:::i;:::-;14558:24;;;;;;;;14565:1;14558:24;;;;14568:1;14558:24;;;;14571:1;14558:24;;;;14574:1;14558:24;;;;14577:1;14558:24;;;;14580:1;14558:24;;;14535:47;;14633:33;14645:7;14654:4;14660:5;14633:11;:33::i;:::-;14612:17;;;14593:73;14594:16;;;14593:73;14681:33;14697:10;14709:4;14681:15;:33::i;:::-;14677:974;;;14735:4;14731:491;;;14790:92;14808:11;14821:6;:16;;;14839:6;:17;;;14858:10;14870:4;14876:5;14790:17;:92::i;:::-;14776:10;;;14760:122;;;14910:1;14905:6;;14901:62;;;14949:13;;14930:14;;;;:33;;:18;:33::i;:::-;14913:14;;;:50;14901:62;14731:491;;;15034:93;15053:11;15066:6;:16;;;15084:6;:17;;;15103:10;15115:4;15121:5;15034:18;:93::i;:::-;15020:10;;;15004:123;;;15150:6;15146:60;;15175:14;;;;:31;;15194:11;15175:18;:31::i;:::-;15158:14;;;:48;15146:60;15260:10;-1:-1:-1;;;;;15248:32:0;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15248:34:0;-1:-1:-1;;;;;15240:42:0;;;;;;15236:101;;15320:1;15303:14;;;:18;15236:101;15376:48;15413:6;:10;;;15376:32;15395:12;15376:6;:14;;;:18;;:32;;;;:::i;:48::-;15351:22;;;:73;15443:10;;;;:14;;;;:102;;;15523:6;:22;;;15480:10;-1:-1:-1;;;;;15468:32:0;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15468:34:0;15461:58;;;-1:-1:-1;;;15461:58:0;;-1:-1:-1;;;;;15461:58:0;;;;;;;;;:52;;;;;;;:58;;;;;15468:34;;15461:58;;;;;;;:52;:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15461:58:0;:84;;15443:102;15439:201;;;15574:6;:13;;;15589:6;:10;;;15601:6;:22;;;15566:58;;;;;;;;;15439:201;15674:1;15661:10;;;:14;;;15686;;;:18;15715:381;;;;15758:61;15770:11;15783:6;:16;;;15801:6;:17;;;15758:11;:61::i;:::-;15740:79;;15843:1;15838:6;;15834:62;;;15882:13;;15863:14;;;;:33;;:18;:33::i;:::-;15846:14;;;:50;15834:62;15715:381;;;15947:62;15960:11;15973:6;:16;;;15991:6;:17;;;15947:12;:62::i;:::-;15929:80;;16028:6;16024:60;;16053:14;;;;:31;;16072:11;16053:18;:31::i;:::-;16036:14;;;:48;16024:60;16130:10;-1:-1:-1;;;;;16118:32:0;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16118:34:0;-1:-1:-1;;;;;16110:42:0;;;;;;16106:93;;16186:1;16169:14;;;:18;16106:93;16217:13;;16232:10;;;;16244:14;;;;:32;;16263:12;16244:18;:32::i;:::-;16209:68;;;;;;;14328:1957;;;;;;;;;;;;;;:::o;13969:175::-;14051:4;14086:10;-1:-1:-1;;;;;14074:51:0;;14126:4;14074:57;;;;;;;;;;;;;-1:-1:-1;;;;;14074:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14074:57:0;:62;;14135:1;14074:62;;13969:175;-1:-1:-1;;;13969:175:0:o;38683:331::-;38787:10;;38775:42;;;-1:-1:-1;;;38775:42:0;;;;38753:19;;-1:-1:-1;;;;;38787:10:0;;38775:40;;:42;;;;;;;;;;;;;;38787:10;38775:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38775:42:0;38872:10;;38860:34;;;-1:-1:-1;;;38860:34:0;;;;38775:42;;-1:-1:-1;38828:96:0;;-1:-1:-1;;;;;38872:10:0;;;;38860:32;;:34;;;;;38775:42;;38860:34;;;;;;;;38872:10;38860:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38860:34:0;38896:4;38902:11;38915:8;38828:31;:96::i;:::-;38960:10;;38948:34;;;-1:-1:-1;;;38948:34:0;;;;38940:66;;-1:-1:-1;;;;;38960:10:0;;38948:32;;:34;;;;;;;;;;;;;;38960:10;38948:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38948:34:0;38940:66;;;-1:-1:-1;;;;;38940:66:0;;;;;;;;38948:34;38940:66;;;;;;;;;;;;;;;;;;38683:331;;;:::o;10373:695::-;10527:14;10543:8;10583:1;10572:8;:12;10564:69;;;;-1:-1:-1;;;10564:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10664:1;10652:9;:13;:31;;;;;10682:1;10669:10;:14;10652:31;10644:85;;;;-1:-1:-1;;;10644:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10740:17;10781:3;10760:18;:8;10773:4;10760:12;:18::i;:::-;:24;;;;;;;-1:-1:-1;10801:27:0;10760:24;10819:8;10801:17;:27::i;:::-;10795:33;-1:-1:-1;10839:14:0;10856:24;:8;10869:10;10856:12;:24::i;:::-;10839:41;-1:-1:-1;10891:16:0;10910:23;:9;10924:8;10910:13;:23::i;:::-;10891:42;;10968:11;10956:9;:23;;;;;;10944:35;;11008:10;-1:-1:-1;;;;;10996:40:0;;11037:7;11046:8;11056:3;10996:64;;;;;;;;;;;;;-1:-1:-1;;;;;10996:64:0;;;;;;-1:-1:-1;;;;;10996:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10996:64:0;10373:695;;10996:64;;-1:-1:-1;10373:695:0;;-1:-1:-1;;;;;;;;;10373:695:0:o;8782:392::-;8875:13;8890;8917:14;8936:26;8947:6;8955;8936:10;:26::i;:::-;8916:46;;;8974:13;8989;9023:32;9031:7;9040:6;9048;9023:7;:32::i;:::-;-1:-1:-1;;;;;9007:61:0;;:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9007:63:0;;;;;;;-1:-1:-1;;;;;8973:97:0;;;;-1:-1:-1;8973:97:0;;-1:-1:-1;;;;;;9104:16:0;;;;;;;:62;;9147:8;9157;9104:62;;;9124:8;9134;9104:62;9081:85;;;;-1:-1:-1;8782:392:0;-1:-1:-1;;;;;;;8782:392:0:o;11784:721::-;11938:13;11953:8;11994:1;11982:9;:13;11974:71;;;;-1:-1:-1;;;11974:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12076:1;12064:9;:13;:31;;;;;12094:1;12081:10;:14;12064:31;12056:85;;;;-1:-1:-1;;;12056:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12152:14;12169:34;12198:4;12169:24;:9;12183;12169:13;:24::i;:34::-;12152:51;-1:-1:-1;12214:16:0;12233:34;12263:3;12233:25;:10;12248:9;12233:14;:25::i;:34::-;12214:53;;12278:17;12298:32;12328:1;12311:11;12299:9;:23;;;;12298:32;12278:52;-1:-1:-1;12369:4:0;12347:19;12278:52;12364:1;12347:16;:19::i;:::-;:26;;;;;;;-1:-1:-1;12395:21:0;:12;12347:26;12395:16;:21::i;:::-;12384:32;;12445:10;-1:-1:-1;;;;;12433:40:0;;12474:7;12483:8;12493:3;12433:64;;;;;;;;;;;;;-1:-1:-1;;;;;12433:64:0;;;;;;-1:-1:-1;;;;;12433:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o

Swarm Source

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