Contract 0xcb5e44df65baadb4538731a391fe1acf19047482

Contract Overview

Balance:
0 CRO

CRO Value:
$0.00

Token:
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x95f90bc8ae5bec97736314699e771afc0589b712943e3b76c04de939532879adRedeem68733392023-02-08 19:27:1016 hrs 19 mins ago0x199aa8cfbbf7f1690ff873f9fe5ed2ddd21ccc0a IN  0xcb5e44df65baadb4538731a391fe1acf190474820 CRO1.34678937237 4,817.377364338
0x3b96d0a4850f7ce70ff44c9360781b3b9b0f4cebc703a582c97cf4f1affac355Mint Collateral68733262023-02-08 19:25:5716 hrs 20 mins ago0x199aa8cfbbf7f1690ff873f9fe5ed2ddd21ccc0a IN  0xcb5e44df65baadb4538731a391fe1acf190474820 CRO0.989831466381 4,817.377957869
0x8e0f51f64b55b1717c18c5509284c17898b156dd7c3bfcc381d730f389b8ba33Redeem68635452023-02-08 4:05:021 day 7 hrs ago0xe46e6d0ef865ae7a8c74a0c733ae0f250b5b6cd4 IN  0xcb5e44df65baadb4538731a391fe1acf190474820 CRO0.690779667165 4,817.824432734
0xf75d829f0c9980200847c631eaa31a6a1985f9c0e93cf9ec1c16498d3916a81fMint68634102023-02-08 3:52:211 day 7 hrs ago0x36de6d01ab563d3e0fd7661c75dce8202aa82649 IN  0xcb5e44df65baadb4538731a391fe1acf190474820 CRO0.686502321849 4,817.830628035
0x7f30bec4a72c447361b4f6cadb332bf22d95a030cc4998b4c34e08444769cccaMint ETH68622322023-02-08 2:01:391 day 9 hrs ago0x66bc3025dd6459690eb6558dc6d6312c3c125f5a IN  0xcb5e44df65baadb4538731a391fe1acf1904748244.893739339370216 CRO0.6758303230220
0x08ae6c6261fa649d1c9ae1d6e31ce09268a3cb2551134ec5f660e7d6c5745e22Redeem68385572023-02-06 12:53:312 days 22 hrs ago0xfc3bc5c1a6af3544b67834e13f11bd125dba03eb IN  0xcb5e44df65baadb4538731a391fe1acf190474820 CRO1.119851214893 4,818.968667782
0x4c3993dacbdc1a689a2e26c70098f7e6e7e4c8d796303d9dbcc3096622753f8cRedeem68385462023-02-06 12:52:292 days 22 hrs ago0xfc3bc5c1a6af3544b67834e13f11bd125dba03eb IN  0xcb5e44df65baadb4538731a391fe1acf190474820 CRO0.62007122154 4,818.969181883
0x8c817b8f5570365db8a7a2e45ad44d6612f597c279c1c8913b7fbfca924b7053Liquidate68384962023-02-06 12:47:462 days 22 hrs ago0xfc3bc5c1a6af3544b67834e13f11bd125dba03eb IN  0xcb5e44df65baadb4538731a391fe1acf190474820 CRO1.066838500254 4,818.471496952
0xc7919721408dc6aa0210e8228d4dd73e49f60921050f775f72977a6d356d5986Redeem68384402023-02-06 12:42:302 days 23 hrs ago0xfc3bc5c1a6af3544b67834e13f11bd125dba03eb IN  0xcb5e44df65baadb4538731a391fe1acf190474820 CRO0.620129683055 4,818.974107749
0x7ad246664af690bf1281e69c586d9fead723d56d7a5c75f7cbb372d93a14bda0Liquidate68383902023-02-06 12:37:472 days 23 hrs ago0xfc3bc5c1a6af3544b67834e13f11bd125dba03eb IN  0xcb5e44df65baadb4538731a391fe1acf190474820 CRO1.027005248015 4,818.476430947
0x767d0f465214c178b16f73e2936b3366e807101cc2c8c7b415d0916ea067fc81Redeem68382352023-02-06 12:23:112 days 23 hrs ago0xfc3bc5c1a6af3544b67834e13f11bd125dba03eb IN  0xcb5e44df65baadb4538731a391fe1acf190474820 CRO0.620073082412 4,818.983643911
0x825152e2adf86ad844d4bfb843dc3ba2bd997a01c76cb16049ce3b66abeb4a1aLiquidate68381842023-02-06 12:18:242 days 23 hrs ago0xfc3bc5c1a6af3544b67834e13f11bd125dba03eb IN  0xcb5e44df65baadb4538731a391fe1acf190474820 CRO1.066663425102 4,818.485989919
0x862fcbb4bded694cf80a660b8591271576f70797f629a157ef17122b4fcd6f5fRedeem68367062023-02-06 9:59:173 days 1 hr ago0xecf45bf53c17e3e7a1e217ceeafe43a989d388da IN  0xcb5e44df65baadb4538731a391fe1acf190474820 CRO1.185752535253 4,819.054826171
0x7ebe3bfb71013e1d71ec6b550c77a24bc129ea2dc5181f8e5fab4018632a9a37Redeem68366882023-02-06 9:57:363 days 1 hr ago0xfc3bc5c1a6af3544b67834e13f11bd125dba03eb IN  0xcb5e44df65baadb4538731a391fe1acf190474820 CRO0.620082349876 4,819.055667283
0x1886d6ee889406fef34be5940e80c9ee3992fbfd2e49827f5e1b4b88df3051b8Liquidate68366372023-02-06 9:52:483 days 1 hr ago0xecf45bf53c17e3e7a1e217ceeafe43a989d388da IN  0xcb5e44df65baadb4538731a391fe1acf190474820 CRO1.067131935116 4,820.058064431
0xb9cafa4cbba9292ce5693d41395c69bf094355ea333f3926836e3f802c5f384bRedeem68355892023-02-06 8:14:023 days 3 hrs ago0xecf45bf53c17e3e7a1e217ceeafe43a989d388da IN  0xcb5e44df65baadb4538731a391fe1acf190474820 CRO0.642660886902 4,994.527887766
0xdf6273abd9a72d22970e90527e62eca1b667b925686457c973331dc0beb75954Liquidate68355202023-02-06 8:07:323 days 3 hrs ago0xecf45bf53c17e3e7a1e217ceeafe43a989d388da IN  0xcb5e44df65baadb4538731a391fe1acf190474820 CRO1.14950462195 4,820.109870181
0x106c63fd8ea0e01e6d1a15730d0037a57e2a0cf201be3003adffd298ae4d3c51Liquidate68334072023-02-06 4:48:383 days 6 hrs ago0x816b08a376f3dd25c5b28e230d8139aa74e72aef IN  0xcb5e44df65baadb4538731a391fe1acf190474820 CRO0.8430989370690
0xd7ec3eea0220956d1309142b1dbd7e705d436585dbbe43d6bdb86c5d7aff68dcLiquidate68333782023-02-06 4:45:553 days 7 hrs ago0x816b08a376f3dd25c5b28e230d8139aa74e72aef IN  0xcb5e44df65baadb4538731a391fe1acf190474820 CRO0.8430991615740
0x2d4b9bcea49ccefcf1b39733c58225c6787c12f5ffc09c24e8a2251d0afb08f0Liquidate68333192023-02-06 4:40:213 days 7 hrs ago0x816b08a376f3dd25c5b28e230d8139aa74e72aef IN  0xcb5e44df65baadb4538731a391fe1acf190474820 CRO0.8430996404860
0x669d0da5685d19c6303ca02cc4f735dbb8ffddbe33eae2c7c073eabbb434819aRedeem68322632023-02-06 3:01:053 days 8 hrs ago0xfc3bc5c1a6af3544b67834e13f11bd125dba03eb IN  0xcb5e44df65baadb4538731a391fe1acf190474820 CRO0.620050959289 4,819.261153649
0x07b2649d22c2202f1425898eb254a0c7c5e04a723acc5bda163ee5e19844d695Redeem68321762023-02-06 2:52:533 days 8 hrs ago0xecf45bf53c17e3e7a1e217ceeafe43a989d388da IN  0xcb5e44df65baadb4538731a391fe1acf190474820 CRO1.18567416924 4,819.265161853
0x0050335b2dd40428188a2a8de4bed56d3c2b0c2ac9d169f3131adba6c1744a91Redeem68321612023-02-06 2:51:283 days 8 hrs ago0xfc3bc5c1a6af3544b67834e13f11bd125dba03eb IN  0xcb5e44df65baadb4538731a391fe1acf190474820 CRO0.620109393835 4,819.26584315
0x504b0ebd935ee8be5bc6a202820dd6da7fca374b9f7d969896006ca9b75d8e98Liquidate68321472023-02-06 2:50:093 days 8 hrs ago0xecf45bf53c17e3e7a1e217ceeafe43a989d388da IN  0xcb5e44df65baadb4538731a391fe1acf190474820 CRO1.027618149239 4,820.266476097
0xdf18fd0b52ed610bca56ac9701d5f0adf12cadb90c8756fbd1a72c41dcca27abRedeem68321412023-02-06 2:49:353 days 8 hrs ago0xecf45bf53c17e3e7a1e217ceeafe43a989d388da IN  0xcb5e44df65baadb4538731a391fe1acf190474820 CRO0.620109510796 4,819.266752127
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x7f30bec4a72c447361b4f6cadb332bf22d95a030cc4998b4c34e08444769ccca68622322023-02-08 2:01:391 day 9 hrs ago 0xcb5e44df65baadb4538731a391fe1acf19047482 Cronos: WCRO Token44.893739339370216174 CRO
0x53b699b76d756f0d3ce1b0655a24b9782e30e59f300a8fabb44e4a484ff80e4a68283882023-02-05 20:56:153 days 14 hrs ago 0xcb5e44df65baadb4538731a391fe1acf190474820xfc3bc5c1a6af3544b67834e13f11bd125dba03eb20.00044086165241119 CRO
0x53b699b76d756f0d3ce1b0655a24b9782e30e59f300a8fabb44e4a484ff80e4a68283882023-02-05 20:56:153 days 14 hrs ago Cronos: WCRO Token 0xcb5e44df65baadb4538731a391fe1acf1904748220.00044086165241119 CRO
0x7657fe20dc07b44b2ce3d004dbb5346dc20b6e40a6d0167067dada651230ad0868283772023-02-05 20:55:133 days 14 hrs ago 0xcb5e44df65baadb4538731a391fe1acf190474820x5e75d8a59bba836bee68b91073b7106a296b3be5450.019411651519005461 CRO
0x7657fe20dc07b44b2ce3d004dbb5346dc20b6e40a6d0167067dada651230ad0868283772023-02-05 20:55:133 days 14 hrs ago Cronos: WCRO Token 0xcb5e44df65baadb4538731a391fe1acf19047482450.019411651519005461 CRO
0x7f85edee8dec7001b90a90d490449b7403fe613979c97d04e172ba61d237979d68283352023-02-05 20:51:143 days 14 hrs ago 0xcb5e44df65baadb4538731a391fe1acf19047482 Cronos: WCRO Token470 CRO
0x85fdc16c160cef026464b2bef43d6bdff4a4fdd82563a6d0608ffeb86d5f438068282502023-02-05 20:43:143 days 15 hrs ago 0xcb5e44df65baadb4538731a391fe1acf190474820xfc3bc5c1a6af3544b67834e13f11bd125dba03eb9,079.284725007790541256 CRO
0x85fdc16c160cef026464b2bef43d6bdff4a4fdd82563a6d0608ffeb86d5f438068282502023-02-05 20:43:143 days 15 hrs ago Cronos: WCRO Token 0xcb5e44df65baadb4538731a391fe1acf190474829,079.284725007790541256 CRO
0x35cd65b4ce128a7c5ea17b78e4029412a4df38ab4ce021aea18a4b29184f4b1568282172023-02-05 20:40:083 days 15 hrs ago 0xcb5e44df65baadb4538731a391fe1acf19047482 Cronos: WCRO Token9,000 CRO
0xded784c7ffdd5471df1a63220c63d27b10f6b4e53cdb6a25abc7b345fa95503768281622023-02-05 20:34:563 days 15 hrs ago 0xcb5e44df65baadb4538731a391fe1acf190474820xecf45bf53c17e3e7a1e217ceeafe43a989d388da10,000.235216047066016152 CRO
0xded784c7ffdd5471df1a63220c63d27b10f6b4e53cdb6a25abc7b345fa95503768281622023-02-05 20:34:563 days 15 hrs ago Cronos: WCRO Token 0xcb5e44df65baadb4538731a391fe1acf1904748210,000.235216047066016152 CRO
0x03d48c007959acb47330b8874b393b7b2c8eae05abdd3e1697d833e3f568834968281542023-02-05 20:34:103 days 15 hrs ago 0xcb5e44df65baadb4538731a391fe1acf19047482 Cronos: WCRO Token10,000 CRO
0xcb9d2b8c2a38f25c71527ae337d5cf0d94aac5377a8c59699aa88ae993f7738368281242023-02-05 20:31:203 days 15 hrs ago 0xcb5e44df65baadb4538731a391fe1acf19047482 Cronos: WCRO Token80 CRO
0x7d9e06b8ab6b67dd171bb694d4d82d8dcabf4fd373ba92136ee3f28ca637de7e68281122023-02-05 20:30:123 days 15 hrs ago 0xcb5e44df65baadb4538731a391fe1acf190474820xecf45bf53c17e3e7a1e217ceeafe43a989d388da80.001701992324339352 CRO
0x7d9e06b8ab6b67dd171bb694d4d82d8dcabf4fd373ba92136ee3f28ca637de7e68281122023-02-05 20:30:123 days 15 hrs ago Cronos: WCRO Token 0xcb5e44df65baadb4538731a391fe1acf1904748280.001701992324339352 CRO
0x3e8c25895f538a5585c4757a16fc13e9fc35c8604fb6a12e9ea4dcc3410b201d68280482023-02-05 20:24:113 days 15 hrs ago 0xcb5e44df65baadb4538731a391fe1acf19047482 Cronos: WCRO Token80 CRO
0x59e25806a1a11ebd10589e8684a7460022f0292fca310dd59c2b1179d809307e68272462023-02-05 19:08:383 days 16 hrs ago 0xcb5e44df65baadb4538731a391fe1acf190474820xecf45bf53c17e3e7a1e217ceeafe43a989d388da80.006563695453262982 CRO
0x59e25806a1a11ebd10589e8684a7460022f0292fca310dd59c2b1179d809307e68272462023-02-05 19:08:383 days 16 hrs ago Cronos: WCRO Token 0xcb5e44df65baadb4538731a391fe1acf1904748280.006563695453262982 CRO
0x3a71c7ea59c7e076714b9349bc98d075bd666de35f444a8b4b980938f0caf48e68271722023-02-05 19:01:393 days 16 hrs ago 0xcb5e44df65baadb4538731a391fe1acf19047482 Cronos: WCRO Token80 CRO
0x53f1dfc044420ff18b7da991f8033c7415dcd7eb7a36aa5cdf47565f2717347568052992023-02-04 8:41:155 days 3 hrs ago 0xcb5e44df65baadb4538731a391fe1acf190474820xfc3bc5c1a6af3544b67834e13f11bd125dba03eb101.002568319626646999 CRO
0x53f1dfc044420ff18b7da991f8033c7415dcd7eb7a36aa5cdf47565f2717347568052992023-02-04 8:41:155 days 3 hrs ago Cronos: WCRO Token 0xcb5e44df65baadb4538731a391fe1acf19047482101.002568319626646999 CRO
0x14d617556edbe94d7161cb9c54502a20820b258f38fcbf37d23187aa8353bb4e68052172023-02-04 8:33:335 days 3 hrs ago 0xcb5e44df65baadb4538731a391fe1acf19047482 Cronos: WCRO Token100 CRO
0xd8577231ff290c155ab8cbb40b8a04a0b50d3d4b62f8209a66b64088a963991a68051282023-02-04 8:25:105 days 3 hrs ago 0xcb5e44df65baadb4538731a391fe1acf19047482 Cronos: WCRO Token1 CRO
0x1ed6731608be05d5f9c3ab3f5321bda0d4904c81b2d944155f9d3779ee5fa97d67780252023-02-02 13:51:546 days 21 hrs ago 0xcb5e44df65baadb4538731a391fe1acf190474820xfc3bc5c1a6af3544b67834e13f11bd125dba03eb17.046361743073415507 CRO
0x1ed6731608be05d5f9c3ab3f5321bda0d4904c81b2d944155f9d3779ee5fa97d67780252023-02-02 13:51:546 days 21 hrs ago Cronos: WCRO Token 0xcb5e44df65baadb4538731a391fe1acf1904748217.046361743073415507 CRO
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Router02

Compiler Version
v0.6.6+commit.6c089d02

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// File: evo-periphery/contracts/libraries/TransferHelper.sol



pragma solidity =0.6.6;

// 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: evo-periphery/contracts/libraries/SafeMath.sol

pragma solidity =0.6.6;

// From https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/math/Math.sol
// Subject to the MIT license.

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting with custom message on overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     * - Addition cannot overflow.
     */
    function add(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, errorMessage);

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on underflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot underflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction underflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on underflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot underflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     * - Multiplication cannot overflow.
     */
    function mul(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, errorMessage);

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers.
     * Reverts on division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers.
     * Reverts with custom message on division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be 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;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

// File: evo-periphery/contracts/interfaces/IUniswapV2Pair.sol

pragma solidity >=0.5.0;

interface IUniswapV2Pair {
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
    event Transfer(address indexed from, address indexed to, uint256 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 (uint256);

    function balanceOf(address owner) external view returns (uint256);

    function allowance(address owner, address spender)
        external
        view
        returns (uint256);

    function approve(address spender, uint256 value) external returns (bool);

    function transfer(address to, uint256 value) external returns (bool);

    function transferFrom(
        address from,
        address to,
        uint256 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 (uint256);

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

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

    function MINIMUM_LIQUIDITY() external pure returns (uint256);

    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 (uint256);

    function price1CumulativeLast() external view returns (uint256);

    function kLast() external view returns (uint256);

    function mint(address to) external returns (uint256 liquidity);

    function burn(address to)
        external
        returns (uint256 amount0, uint256 amount1);

    function swap(
        uint256 amount0Out,
        uint256 amount1Out,
        address to,
        bytes calldata data
    ) external;

    function skim(address to) external;

    function sync() external;

    function initialize(address, address) external;
}

// File: evo-periphery/contracts/interfaces/IWETH.sol

pragma solidity >=0.5.0;

interface IWETH {
    function deposit() external payable;

    function transfer(address to, uint256 value) external returns (bool);

    function withdraw(uint256) external;
}

// File: evo-periphery/contracts/interfaces/IUniswapV2Router01.sol

pragma solidity >=0.5.0;

interface IUniswapV2Router01 {
    function factory() external pure returns (address);

    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    )
        external
        returns (
            uint256 amountA,
            uint256 amountB,
            uint256 liquidity
        );

    function addLiquidityETH(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    )
        external
        payable
        returns (
            uint256 amountToken,
            uint256 amountETH,
            uint256 liquidity
        );

    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETH(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountToken, uint256 amountETH);

    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETHWithPermit(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountToken, uint256 amountETH);

    function swapExactTokensForTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapTokensForExactTokens(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactETHForTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function swapTokensForExactETH(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactTokensForETH(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapETHForExactTokens(
        uint256 amountOut,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function quote(
        uint256 amountA,
        uint256 reserveA,
        uint256 reserveB
    ) external pure returns (uint256 amountB);

    function getAmountOut(
        uint256 amountIn,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountOut);

    function getAmountIn(
        uint256 amountOut,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountIn);

    function getAmountsOut(uint256 amountIn, address[] calldata path)
        external
        view
        returns (uint256[] memory amounts);

    function getAmountsIn(uint256 amountOut, address[] calldata path)
        external
        view
        returns (uint256[] memory amounts);
}

// File: evo-periphery/contracts/interfaces/IERC20.sol

pragma solidity >=0.5.0;

interface IERC20 {
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
    event Transfer(address indexed from, address indexed to, uint256 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 (uint256);

    function balanceOf(address owner) external view returns (uint256);

    function allowance(address owner, address spender)
        external
        view
        returns (uint256);

    function approve(address spender, uint256 value) external returns (bool);

    function transfer(address to, uint256 value) external returns (bool);

    function transferFrom(
        address from,
        address to,
        uint256 value
    ) external returns (bool);
}

// File: evo-periphery/contracts/interfaces/IMasterChef.sol

pragma solidity >=0.5.16;


// Making the original MasterChef as an interface leads to compilation fail.
// Use Contract instead of Interface here
contract IMasterChef {
    // Info of each user.
    struct UserInfo {
        uint256 amount; // How many LP tokens the user has provided.
        uint256 rewardDebt; // Reward debt. See explanation below.
    }

    // Info of each pool.
    struct PoolInfo {
        IERC20 lpToken; // Address of LP token contract.
        uint256 allocPoint; // How many allocation points assigned to this pool. Reward tokens to distribute per block.
        uint256 lastRewardBlock; // Last block number that reward token distribution occurs.
        uint256 accRewardTokenPerShare; // Accumulated reward tokens per share, times 1e12. See below.
    }

    // Info of each user that stakes LP tokens.
    mapping(uint256 => PoolInfo) public poolInfo;
    mapping(uint256 => mapping(address => UserInfo)) public userInfo;

    // Deposit LP tokens to MasterChef.
    function deposit(uint256 _pid, uint256 _amount) external {}

    // Withdraw LP tokens from MasterChef.
    function withdraw(uint256 _pid, uint256 _amount) external {}
}

// File: evo-periphery/contracts/interfaces/IVaultToken.sol

pragma solidity >=0.5.0;



interface IVaultToken {
    /*** Tarot ERC20 ***/

    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 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 (uint256);

    function balanceOf(address owner) external view returns (uint256);

    function allowance(address owner, address spender)
        external
        view
        returns (uint256);

    function approve(address spender, uint256 value) external returns (bool);

    function transfer(address to, uint256 value) external returns (bool);

    function transferFrom(
        address from,
        address to,
        uint256 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 (uint256);

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

    /*** Pool Token ***/

    event Mint(
        address indexed sender,
        address indexed minter,
        uint256 mintAmount,
        uint256 mintTokens
    );
    event Redeem(
        address indexed sender,
        address indexed redeemer,
        uint256 redeemAmount,
        uint256 redeemTokens
    );
    event Sync(uint256 totalBalance);

    function underlying() external view returns (address);

    function factory() external view returns (address);

    function totalBalance() external view returns (uint256);

    function MINIMUM_LIQUIDITY() external pure returns (uint256);

    function exchangeRate() external view returns (uint256);

    function mint(address minter) external returns (uint256 mintTokens);

    function redeem(address redeemer) external returns (uint256 redeemAmount);

    function skim(address to) external;

    function sync() external;

    function _setFactory() external;

    /*** VaultToken ***/

    event Reinvest(address indexed caller, uint256 reward, uint256 bounty);

    function isVaultToken() external pure returns (bool);

    function router() external view returns (IUniswapV2Router01);

    function masterChef() external view returns (IMasterChef);

    function rewardsToken() external view returns (address);

    function WETH() external view returns (address);

    function token0() external view returns (address);

    function token1() external view returns (address);

    function swapFeeFactor() external view returns (uint256);

    function pid() external view returns (uint256);

    function REINVEST_BOUNTY() external pure returns (uint256);

    function getReserves()
        external
        view
        returns (
            uint112 reserve0,
            uint112 reserve1,
            uint32 blockTimestampLast
        );

    function price0CumulativeLast() external view returns (uint256);

    function price1CumulativeLast() external view returns (uint256);

    function _initialize(
        IUniswapV2Router01 _router,
        IMasterChef _masterChef,
        address _rewardsToken,
        uint256 _swapFeeFactor,
        uint256 _pid
    ) external;

    function reinvest() external;
}

// File: evo-periphery/contracts/interfaces/IEvoCallee.sol

pragma solidity >=0.5.0;

interface IEvoCallee {
    function evoBorrow(
        address sender,
        address borrower,
        uint256 borrowAmount,
        bytes calldata data
    ) external;

    function evoRedeem(
        address sender,
        uint256 redeemAmount,
        bytes calldata data
    ) external;
}

// File: evo-periphery/contracts/interfaces/ICollateral.sol

pragma solidity >=0.5.0;

interface ICollateral {
    /*** Tarot ERC20 ***/

    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 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 (uint256);

    function balanceOf(address owner) external view returns (uint256);

    function allowance(address owner, address spender)
        external
        view
        returns (uint256);

    function approve(address spender, uint256 value) external returns (bool);

    function transfer(address to, uint256 value) external returns (bool);

    function transferFrom(
        address from,
        address to,
        uint256 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 (uint256);

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

    /*** Pool Token ***/

    event Mint(
        address indexed sender,
        address indexed minter,
        uint256 mintAmount,
        uint256 mintTokens
    );
    event Redeem(
        address indexed sender,
        address indexed redeemer,
        uint256 redeemAmount,
        uint256 redeemTokens
    );
    event Sync(uint256 totalBalance);

    function underlying() external view returns (address);

    function factory() external view returns (address);

    function totalBalance() external view returns (uint256);

    function MINIMUM_LIQUIDITY() external pure returns (uint256);

    function exchangeRate() external returns (uint256);

    function mint(address minter) external returns (uint256 mintTokens);

    function redeem(address redeemer) external returns (uint256 redeemAmount);

    function skim(address to) external;

    function sync() external;

    function _setFactory() external;

    /*** Collateral ***/

    function borrowable0() external view returns (address);

    function borrowable1() external view returns (address);

    function evoPriceOracle() external view returns (address);

    function safetyMarginSqrt() external view returns (uint256);

    function liquidationIncentive() external view returns (uint256);

    function getPrices() external returns (uint256 price0, uint256 price1);

    function tokensUnlocked(address from, uint256 value)
        external
        returns (bool);

    function accountLiquidityAmounts(
        address account,
        uint256 amount0,
        uint256 amount1
    ) external returns (uint256 liquidity, uint256 shortfall);

    function accountLiquidity(address account)
        external
        returns (uint256 liquidity, uint256 shortfall);

    function canBorrow(
        address account,
        address borrowable,
        uint256 accountBorrows
    ) external returns (bool);

    function seize(
        address liquidator,
        address borrower,
        uint256 repayAmount
    ) external returns (uint256 seizeTokens);

    function flashRedeem(
        address redeemer,
        uint256 redeemAmount,
        bytes calldata data
    ) external;

    /*** Collateral Setter ***/

    event NewSafetyMargin(uint256 newSafetyMarginSqrt);
    event NewLiquidationIncentive(uint256 newLiquidationIncentive);

    function SAFETY_MARGIN_SQRT_MIN() external pure returns (uint256);

    function SAFETY_MARGIN_SQRT_MAX() external pure returns (uint256);

    function LIQUIDATION_INCENTIVE_MIN() external pure returns (uint256);

    function LIQUIDATION_INCENTIVE_MAX() external pure returns (uint256);

    function _initialize(
        string calldata _name,
        string calldata _symbol,
        address _underlying,
        address _borrowable0,
        address _borrowable1
    ) external;

    function _setSafetyMarginSqrt(uint256 newSafetyMarginSqrt) external;

    function _setLiquidationIncentive(uint256 newLiquidationIncentive) external;
}

// File: evo-periphery/contracts/interfaces/IBorrowable.sol

pragma solidity >=0.5.0;

interface IBorrowable {
    /*** Tarot ERC20 ***/

    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 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 (uint256);

    function balanceOf(address owner) external view returns (uint256);

    function allowance(address owner, address spender)
        external
        view
        returns (uint256);

    function approve(address spender, uint256 value) external returns (bool);

    function transfer(address to, uint256 value) external returns (bool);

    function transferFrom(
        address from,
        address to,
        uint256 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 (uint256);

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

    /*** Pool Token ***/

    event Mint(
        address indexed sender,
        address indexed minter,
        uint256 mintAmount,
        uint256 mintTokens
    );
    event Redeem(
        address indexed sender,
        address indexed redeemer,
        uint256 redeemAmount,
        uint256 redeemTokens
    );
    event Sync(uint256 totalBalance);

    function underlying() external view returns (address);

    function factory() external view returns (address);

    function totalBalance() external view returns (uint256);

    function MINIMUM_LIQUIDITY() external pure returns (uint256);

    function exchangeRate() external returns (uint256);

    function mint(address minter) external returns (uint256 mintTokens);

    function redeem(address redeemer) external returns (uint256 redeemAmount);

    function skim(address to) external;

    function sync() external;

    function _setFactory() external;

    /*** Borrowable ***/

    event BorrowApproval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
    event Borrow(
        address indexed sender,
        address indexed borrower,
        address indexed receiver,
        uint256 borrowAmount,
        uint256 repayAmount,
        uint256 accountBorrowsPrior,
        uint256 accountBorrows,
        uint256 totalBorrows
    );
    event Liquidate(
        address indexed sender,
        address indexed borrower,
        address indexed liquidator,
        uint256 seizeTokens,
        uint256 repayAmount,
        uint256 accountBorrowsPrior,
        uint256 accountBorrows,
        uint256 totalBorrows
    );

    function BORROW_FEE() external pure returns (uint256);

    function collateral() external view returns (address);

    function reserveFactor() external view returns (uint256);

    function exchangeRateLast() external view returns (uint256);

    function borrowIndex() external view returns (uint256);

    function totalBorrows() external view returns (uint256);

    function borrowAllowance(address owner, address spender)
        external
        view
        returns (uint256);

    function borrowBalance(address borrower) external view returns (uint256);

    function borrowTracker() external view returns (address);

    function BORROW_PERMIT_TYPEHASH() external pure returns (bytes32);

    function borrowApprove(address spender, uint256 value)
        external
        returns (bool);

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

    function borrow(
        address borrower,
        address receiver,
        uint256 borrowAmount,
        bytes calldata data
    ) external;

    function liquidate(address borrower, address liquidator)
        external
        returns (uint256 seizeTokens);

    function trackBorrow(address borrower) external;

    /*** Borrowable Interest Rate Model ***/

    event AccrueInterest(
        uint256 interestAccumulated,
        uint256 borrowIndex,
        uint256 totalBorrows
    );
    event CalculateKink(uint256 kinkRate);
    event CalculateBorrowRate(uint256 borrowRate);

    function KINK_BORROW_RATE_MAX() external pure returns (uint256);

    function KINK_BORROW_RATE_MIN() external pure returns (uint256);

    function KINK_MULTIPLIER() external pure returns (uint256);

    function borrowRate() external view returns (uint256);

    function kinkBorrowRate() external view returns (uint256);

    function kinkUtilizationRate() external view returns (uint256);

    function adjustSpeed() external view returns (uint256);

    function rateUpdateTimestamp() external view returns (uint32);

    function accrualTimestamp() external view returns (uint32);

    function accrueInterest() external;

    /*** Borrowable Setter ***/

    event NewReserveFactor(uint256 newReserveFactor);
    event NewKinkUtilizationRate(uint256 newKinkUtilizationRate);
    event NewAdjustSpeed(uint256 newAdjustSpeed);
    event NewBorrowTracker(address newBorrowTracker);

    function RESERVE_FACTOR_MAX() external pure returns (uint256);

    function KINK_UR_MIN() external pure returns (uint256);

    function KINK_UR_MAX() external pure returns (uint256);

    function ADJUST_SPEED_MIN() external pure returns (uint256);

    function ADJUST_SPEED_MAX() external pure returns (uint256);

    function _initialize(
        string calldata _name,
        string calldata _symbol,
        address _underlying,
        address _collateral
    ) external;

    function _setReserveFactor(uint256 newReserveFactor) external;

    function _setKinkUtilizationRate(uint256 newKinkUtilizationRate) external;

    function _setAdjustSpeed(uint256 newAdjustSpeed) external;

    function _setBorrowTracker(address newBorrowTracker) external;
}

// File: evo-periphery/contracts/interfaces/IPoolToken.sol

pragma solidity >=0.5.0;

interface IPoolToken {
    /*** Tarot ERC20 ***/

    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 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 (uint256);

    function balanceOf(address owner) external view returns (uint256);

    function allowance(address owner, address spender)
        external
        view
        returns (uint256);

    function approve(address spender, uint256 value) external returns (bool);

    function transfer(address to, uint256 value) external returns (bool);

    function transferFrom(
        address from,
        address to,
        uint256 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 (uint256);

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

    /*** Pool Token ***/

    event Mint(
        address indexed sender,
        address indexed minter,
        uint256 mintAmount,
        uint256 mintTokens
    );
    event Redeem(
        address indexed sender,
        address indexed redeemer,
        uint256 redeemAmount,
        uint256 redeemTokens
    );
    event Sync(uint256 totalBalance);

    function underlying() external view returns (address);

    function factory() external view returns (address);

    function totalBalance() external view returns (uint256);

    function MINIMUM_LIQUIDITY() external pure returns (uint256);

    function exchangeRate() external returns (uint256);

    function mint(address minter) external returns (uint256 mintTokens);

    function redeem(address redeemer) external returns (uint256 redeemAmount);

    function skim(address to) external;

    function sync() external;

    function _setFactory() external;
}

// File: evo-periphery/contracts/interfaces/IRouter02.sol

pragma solidity >=0.5.0;

interface IRouter02 {
    function factory() external pure returns (address);

    function bDeployer() external pure returns (address);

    function cDeployer() external pure returns (address);

    function WETH() external pure returns (address);

    function mint(
        address poolToken,
        uint256 amount,
        address to,
        uint256 deadline
    ) external returns (uint256 tokens);

    function mintETH(
        address poolToken,
        address to,
        uint256 deadline
    ) external payable returns (uint256 tokens);

    function mintCollateral(
        address poolToken,
        uint256 amount,
        address to,
        uint256 deadline,
        bytes calldata permitData
    ) external returns (uint256 tokens);

    function redeem(
        address poolToken,
        uint256 tokens,
        address to,
        uint256 deadline,
        bytes calldata permitData
    ) external returns (uint256 amount);

    function redeemETH(
        address poolToken,
        uint256 tokens,
        address to,
        uint256 deadline,
        bytes calldata permitData
    ) external returns (uint256 amountETH);

    function borrow(
        address borrowable,
        uint256 amount,
        address to,
        uint256 deadline,
        bytes calldata permitData
    ) external;

    function borrowETH(
        address borrowable,
        uint256 amountETH,
        address to,
        uint256 deadline,
        bytes calldata permitData
    ) external;

    function repay(
        address borrowable,
        uint256 amountMax,
        address borrower,
        uint256 deadline
    ) external returns (uint256 amount);

    function repayETH(
        address borrowable,
        address borrower,
        uint256 deadline
    ) external payable returns (uint256 amountETH);

    function liquidate(
        address borrowable,
        uint256 amountMax,
        address borrower,
        address to,
        uint256 deadline
    ) external returns (uint256 amount, uint256 seizeTokens);

    function liquidateETH(
        address borrowable,
        address borrower,
        address to,
        uint256 deadline
    ) external payable returns (uint256 amountETH, uint256 seizeTokens);

    function leverage(
        address uniswapV2Pair,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline,
        bytes calldata permitDataA,
        bytes calldata permitDataB
    ) external;

    function deleverage(
        address uniswapV2Pair,
        uint256 redeemTokens,
        uint256 amountAMin,
        uint256 amountBMin,
        uint256 deadline,
        bytes calldata permitData
    ) external;

    function isVaultToken(address underlying) external view returns (bool);

    function getUniswapV2Pair(address underlying)
        external
        view
        returns (address);

    function getBorrowable(address uniswapV2Pair, uint8 index)
        external
        view
        returns (address borrowable);

    function getCollateral(address uniswapV2Pair)
        external
        view
        returns (address collateral);

    function getLendingPool(address uniswapV2Pair)
        external
        view
        returns (
            address collateral,
            address borrowableA,
            address borrowableB
        );
}

// File: evo-periphery/contracts/Router02.sol

pragma solidity =0.6.6;
pragma experimental ABIEncoderV2;












contract Router02 is IRouter02, IEvoCallee {
    using SafeMath for uint256;

    address public immutable override factory;
    address public immutable override bDeployer;
    address public immutable override cDeployer;
    address public immutable override WETH;

    modifier ensure(uint256 deadline) {
        require(deadline >= block.timestamp, "EvoRouter: EXPIRED");
        _;
    }

    modifier checkETH(address poolToken) {
        require(
            WETH == IPoolToken(poolToken).underlying(),
            "EvoRouter: NOT_WETH"
        );
        _;
    }

    constructor(
        address _factory,
        address _bDeployer,
        address _cDeployer,
        address _WETH
    ) public {
        factory = _factory;
        bDeployer = _bDeployer;
        cDeployer = _cDeployer;
        WETH = _WETH;
    }

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

    /*** Mint ***/

    function _mint(
        address poolToken,
        address token,
        uint256 amount,
        address from,
        address to
    ) internal virtual returns (uint256 tokens) {
        if (from == address(this))
            TransferHelper.safeTransfer(token, poolToken, amount);
        else TransferHelper.safeTransferFrom(token, from, poolToken, amount);
        tokens = IPoolToken(poolToken).mint(to);
    }

    function mint(
        address poolToken,
        uint256 amount,
        address to,
        uint256 deadline
    ) external virtual override ensure(deadline) returns (uint256 tokens) {
        return
            _mint(
                poolToken,
                IPoolToken(poolToken).underlying(),
                amount,
                msg.sender,
                to
            );
    }

    function mintETH(
        address poolToken,
        address to,
        uint256 deadline
    )
        external
        payable
        virtual
        override
        ensure(deadline)
        checkETH(poolToken)
        returns (uint256 tokens)
    {
        IWETH(WETH).deposit{value: msg.value}();
        return _mint(poolToken, WETH, msg.value, address(this), to);
    }

    function mintCollateral(
        address poolToken,
        uint256 amount,
        address to,
        uint256 deadline,
        bytes calldata permitData
    ) external virtual override ensure(deadline) returns (uint256 tokens) {
        address underlying = IPoolToken(poolToken).underlying();
        if (isVaultToken(underlying)) {
            address uniswapV2Pair = IVaultToken(underlying).underlying();
            _permit(uniswapV2Pair, amount, deadline, permitData);
            TransferHelper.safeTransferFrom(
                uniswapV2Pair,
                msg.sender,
                underlying,
                amount
            );
            IVaultToken(underlying).mint(poolToken);
            return IPoolToken(poolToken).mint(to);
        } else {
            _permit(underlying, amount, deadline, permitData);
            return _mint(poolToken, underlying, amount, msg.sender, to);
        }
    }

    /*** Redeem ***/

    function redeem(
        address poolToken,
        uint256 tokens,
        address to,
        uint256 deadline,
        bytes memory permitData
    ) public virtual override ensure(deadline) returns (uint256 amount) {
        _permit(poolToken, tokens, deadline, permitData);
        IPoolToken(poolToken).transferFrom(msg.sender, poolToken, tokens);
        address underlying = IPoolToken(poolToken).underlying();
        if (isVaultToken(underlying)) {
            IPoolToken(poolToken).redeem(underlying);
            return IVaultToken(underlying).redeem(to);
        } else {
            return IPoolToken(poolToken).redeem(to);
        }
    }

    function redeemETH(
        address poolToken,
        uint256 tokens,
        address to,
        uint256 deadline,
        bytes memory permitData
    )
        public
        virtual
        override
        ensure(deadline)
        checkETH(poolToken)
        returns (uint256 amountETH)
    {
        amountETH = redeem(
            poolToken,
            tokens,
            address(this),
            deadline,
            permitData
        );
        IWETH(WETH).withdraw(amountETH);
        TransferHelper.safeTransferETH(to, amountETH);
    }

    /*** Borrow ***/

    function borrow(
        address borrowable,
        uint256 amount,
        address to,
        uint256 deadline,
        bytes memory permitData
    ) public virtual override ensure(deadline) {
        _borrowPermit(borrowable, amount, deadline, permitData);
        IBorrowable(borrowable).borrow(msg.sender, to, amount, new bytes(0));
    }

    function borrowETH(
        address borrowable,
        uint256 amountETH,
        address to,
        uint256 deadline,
        bytes memory permitData
    ) public virtual override ensure(deadline) checkETH(borrowable) {
        borrow(borrowable, amountETH, address(this), deadline, permitData);
        IWETH(WETH).withdraw(amountETH);
        TransferHelper.safeTransferETH(to, amountETH);
    }
    /*** Repay ***/

    function _repayAmount(
        address borrowable,
        uint256 amountMax,
        address borrower
    ) internal virtual returns (uint256 amount) {
        IBorrowable(borrowable).accrueInterest();
        uint256 borrowedAmount = IBorrowable(borrowable).borrowBalance(
            borrower
        );
        amount = amountMax < borrowedAmount ? amountMax : borrowedAmount;
    }

    function repay(
        address borrowable,
        uint256 amountMax,
        address borrower,
        uint256 deadline
    ) external virtual override ensure(deadline) returns (uint256 amount) {
        amount = _repayAmount(borrowable, amountMax, borrower);
        TransferHelper.safeTransferFrom(
            IBorrowable(borrowable).underlying(),
            msg.sender,
            borrowable,
            amount
        );
        IBorrowable(borrowable).borrow(borrower, address(0), 0, new bytes(0));
    }

    function repayETH(
        address borrowable,
        address borrower,
        uint256 deadline
    )
        external
        payable
        virtual
        override
        ensure(deadline)
        checkETH(borrowable)
        returns (uint256 amountETH)
    {
        amountETH = _repayAmount(borrowable, msg.value, borrower);
        IWETH(WETH).deposit{value: amountETH}();
        assert(IWETH(WETH).transfer(borrowable, amountETH));
        IBorrowable(borrowable).borrow(borrower, address(0), 0, new bytes(0));
        // refund surpluss eth, if any
        if (msg.value > amountETH)
            TransferHelper.safeTransferETH(msg.sender, msg.value - amountETH);
    }

    /*** Liquidate ***/

    function liquidate(
        address borrowable,
        uint256 amountMax,
        address borrower,
        address to,
        uint256 deadline
    )
        external
        virtual
        override
        ensure(deadline)
        returns (uint256 amount, uint256 seizeTokens)
    {
        amount = _repayAmount(borrowable, amountMax, borrower);
        TransferHelper.safeTransferFrom(
            IBorrowable(borrowable).underlying(),
            msg.sender,
            borrowable,
            amount
        );
        seizeTokens = IBorrowable(borrowable).liquidate(borrower, to);
    }

    function liquidateETH(
        address borrowable,
        address borrower,
        address to,
        uint256 deadline
    )
        external
        payable
        virtual
        override
        ensure(deadline)
        checkETH(borrowable)
        returns (uint256 amountETH, uint256 seizeTokens)
    {
        amountETH = _repayAmount(borrowable, msg.value, borrower);
        IWETH(WETH).deposit{value: amountETH}();
        assert(IWETH(WETH).transfer(borrowable, amountETH));
        seizeTokens = IBorrowable(borrowable).liquidate(borrower, to);
        // refund surpluss eth, if any
        if (msg.value > amountETH)
            TransferHelper.safeTransferETH(msg.sender, msg.value - amountETH);
    }

    /*** Leverage LP Token ***/

    function _leverage(
        address underlying,
        uint256 amountA,
        uint256 amountB,
        address to
    ) internal virtual {
        address borrowableA = getBorrowable(underlying, 0);
        // mint collateral
        bytes memory borrowBData = abi.encode(
            CalleeData({
                callType: CallType.ADD_LIQUIDITY_AND_MINT,
                underlying: underlying,
                borrowableIndex: 1,
                data: abi.encode(
                    AddLiquidityAndMintCalldata({
                        amountA: amountA,
                        amountB: amountB,
                        to: to
                    })
                )
            })
        );
        // borrow borrowableB
        bytes memory borrowAData = abi.encode(
            CalleeData({
                callType: CallType.BORROWB,
                underlying: underlying,
                borrowableIndex: 0,
                data: abi.encode(
                    BorrowBCalldata({
                        borrower: msg.sender,
                        receiver: address(this),
                        borrowAmount: amountB,
                        data: borrowBData
                    })
                )
            })
        );
        // borrow borrowableA
        IBorrowable(borrowableA).borrow(
            msg.sender,
            address(this),
            amountA,
            borrowAData
        );
    }

    function leverage(
        address underlying,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline,
        bytes calldata permitDataA,
        bytes calldata permitDataB
    ) external virtual override ensure(deadline) {
        _borrowPermit(
            getBorrowable(underlying, 0),
            amountADesired,
            deadline,
            permitDataA
        );
        _borrowPermit(
            getBorrowable(underlying, 1),
            amountBDesired,
            deadline,
            permitDataB
        );
        address uniswapV2Pair = getUniswapV2Pair(underlying);
        (uint256 amountA, uint256 amountB) = _optimalLiquidity(
            uniswapV2Pair,
            amountADesired,
            amountBDesired,
            amountAMin,
            amountBMin
        );
        _leverage(underlying, amountA, amountB, to);
    }

    function _addLiquidityAndMint(
        address underlying,
        uint256 amountA,
        uint256 amountB,
        address to
    ) internal virtual {
        (
            address collateral,
            address borrowableA,
            address borrowableB
        ) = getLendingPool(underlying);
        address uniswapV2Pair = getUniswapV2Pair(underlying);
        // add liquidity to uniswap pair
        TransferHelper.safeTransfer(
            IBorrowable(borrowableA).underlying(),
            uniswapV2Pair,
            amountA
        );
        TransferHelper.safeTransfer(
            IBorrowable(borrowableB).underlying(),
            uniswapV2Pair,
            amountB
        );
        // mint LP token
        if (isVaultToken(underlying))
            IUniswapV2Pair(uniswapV2Pair).mint(underlying);
        IUniswapV2Pair(underlying).mint(collateral);
        // mint collateral
        ICollateral(collateral).mint(to);
    }

    /*** Deleverage LP Token ***/

    function deleverage(
        address underlying,
        uint256 redeemTokens,
        uint256 amountAMin,
        uint256 amountBMin,
        uint256 deadline,
        bytes calldata permitData
    ) external virtual override ensure(deadline) {
        address collateral = getCollateral(underlying);
        uint256 exchangeRate = ICollateral(collateral).exchangeRate();
        require(redeemTokens > 0, "EvoRouter: REDEEM_ZERO");
        uint256 redeemAmount = (redeemTokens - 1).mul(exchangeRate).div(1e18);
        _permit(collateral, redeemTokens, deadline, permitData);
        bytes memory redeemData = abi.encode(
            CalleeData({
                callType: CallType.REMOVE_LIQ_AND_REPAY,
                underlying: underlying,
                borrowableIndex: 0,
                data: abi.encode(
                    RemoveLiqAndRepayCalldata({
                        borrower: msg.sender,
                        redeemTokens: redeemTokens,
                        redeemAmount: redeemAmount,
                        amountAMin: amountAMin,
                        amountBMin: amountBMin
                    })
                )
            })
        );
        // flashRedeem
        ICollateral(collateral).flashRedeem(
            address(this),
            redeemAmount,
            redeemData
        );
    }

    function _removeLiqAndRepay(
        address underlying,
        address borrower,
        uint256 redeemTokens,
        uint256 redeemAmount,
        uint256 amountAMin,
        uint256 amountBMin
    ) internal virtual {
        (
            address collateral,
            address borrowableA,
            address borrowableB
        ) = getLendingPool(underlying);
        address tokenA = IBorrowable(borrowableA).underlying();
        address tokenB = IBorrowable(borrowableB).underlying();
        address uniswapV2Pair = getUniswapV2Pair(underlying);
        // removeLiquidity
        IUniswapV2Pair(underlying).transfer(underlying, redeemAmount);
        //TransferHelper.safeTransfer(underlying, underlying, redeemAmount);
        if (isVaultToken(underlying))
            IVaultToken(underlying).redeem(uniswapV2Pair);
        (uint256 amountAMax, uint256 amountBMax) = IUniswapV2Pair(uniswapV2Pair)
            .burn(address(this));
        require(amountAMax >= amountAMin, "EvoRouter: INSUFFICIENT_A_AMOUNT");
        require(amountBMax >= amountBMin, "EvoRouter: INSUFFICIENT_B_AMOUNT");
        // repay and refund
        _repayAndRefund(borrowableA, tokenA, borrower, amountAMax);
        _repayAndRefund(borrowableB, tokenB, borrower, amountBMax);
        // repay flash redeem
        ICollateral(collateral).transferFrom(
            borrower,
            collateral,
            redeemTokens
        );
    }

    function _repayAndRefund(
        address borrowable,
        address token,
        address borrower,
        uint256 amountMax
    ) internal virtual {
        //repay
        uint256 amount = _repayAmount(borrowable, amountMax, borrower);
        TransferHelper.safeTransfer(token, borrowable, amount);
        IBorrowable(borrowable).borrow(borrower, address(0), 0, new bytes(0));
        // refund excess
        if (amountMax > amount) {
            uint256 refundAmount = amountMax - amount;
            if (token == WETH) {
                IWETH(WETH).withdraw(refundAmount);
                TransferHelper.safeTransferETH(borrower, refundAmount);
            } else TransferHelper.safeTransfer(token, borrower, refundAmount);
        }
    }

    /*** Evo Callee ***/

    enum CallType {
        ADD_LIQUIDITY_AND_MINT,
        BORROWB,
        REMOVE_LIQ_AND_REPAY
    }
    struct CalleeData {
        CallType callType;
        address underlying;
        uint8 borrowableIndex;
        bytes data;
    }
    struct AddLiquidityAndMintCalldata {
        uint256 amountA;
        uint256 amountB;
        address to;
    }
    struct BorrowBCalldata {
        address borrower;
        address receiver;
        uint256 borrowAmount;
        bytes data;
    }
    struct RemoveLiqAndRepayCalldata {
        address borrower;
        uint256 redeemTokens;
        uint256 redeemAmount;
        uint256 amountAMin;
        uint256 amountBMin;
    }

    function evoBorrow(
        address sender,
        address borrower,
        uint256 borrowAmount,
        bytes calldata data
    ) external virtual override {
        borrower;
        borrowAmount;
        CalleeData memory calleeData = abi.decode(data, (CalleeData));
        address declaredCaller = getBorrowable(
            calleeData.underlying,
            calleeData.borrowableIndex
        );
        // only succeeds if called by a borrowable and if that borrowable has been called by the router
        require(sender == address(this), "EvoRouter: SENDER_NOT_ROUTER");
        require(msg.sender == declaredCaller, "EvoRouter: UNAUTHORIZED_CALLER");
        if (calleeData.callType == CallType.ADD_LIQUIDITY_AND_MINT) {
            AddLiquidityAndMintCalldata memory d = abi.decode(
                calleeData.data,
                (AddLiquidityAndMintCalldata)
            );
            _addLiquidityAndMint(
                calleeData.underlying,
                d.amountA,
                d.amountB,
                d.to
            );
        } else if (calleeData.callType == CallType.BORROWB) {
            BorrowBCalldata memory d = abi.decode(
                calleeData.data,
                (BorrowBCalldata)
            );
            address borrowableB = getBorrowable(calleeData.underlying, 1);
            IBorrowable(borrowableB).borrow(
                d.borrower,
                d.receiver,
                d.borrowAmount,
                d.data
            );
        } else revert();
    }

    function evoRedeem(
        address sender,
        uint256 redeemAmount,
        bytes calldata data
    ) external virtual override {
        redeemAmount;
        CalleeData memory calleeData = abi.decode(data, (CalleeData));
        address declaredCaller = getCollateral(calleeData.underlying);
        // only succeeds if called by a collateral and if that collateral has been called by the router
        require(sender == address(this), "EvoRouter: SENDER_NOT_ROUTER");
        require(msg.sender == declaredCaller, "EvoRouter: UNAUTHORIZED_CALLER");
        if (calleeData.callType == CallType.REMOVE_LIQ_AND_REPAY) {
            RemoveLiqAndRepayCalldata memory d = abi.decode(
                calleeData.data,
                (RemoveLiqAndRepayCalldata)
            );
            _removeLiqAndRepay(
                calleeData.underlying,
                d.borrower,
                d.redeemTokens,
                d.redeemAmount,
                d.amountAMin,
                d.amountBMin
            );
        } else revert();
    }

    /*** Utilities ***/

    function _permit(
        address poolToken,
        uint256 amount,
        uint256 deadline,
        bytes memory permitData
    ) internal virtual {
        if (permitData.length == 0) return;
        (bool approveMax, uint8 v, bytes32 r, bytes32 s) = abi.decode(
            permitData,
            (bool, uint8, bytes32, bytes32)
        );
        uint256 value = approveMax ? uint256(-1) : amount;
        IPoolToken(poolToken).permit(
            msg.sender,
            address(this),
            value,
            deadline,
            v,
            r,
            s
        );
    }

    function _borrowPermit(
        address borrowable,
        uint256 amount,
        uint256 deadline,
        bytes memory permitData
    ) internal virtual {
        if (permitData.length == 0) return;
        (bool approveMax, uint8 v, bytes32 r, bytes32 s) = abi.decode(
            permitData,
            (bool, uint8, bytes32, bytes32)
        );
        uint256 value = approveMax ? uint256(-1) : amount;
        IBorrowable(borrowable).borrowPermit(
            msg.sender,
            address(this),
            value,
            deadline,
            v,
            r,
            s
        );
    }

    function _optimalLiquidity(
        address uniswapV2Pair,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin
    ) public view virtual returns (uint256 amountA, uint256 amountB) {
        (uint256 reserveA, uint256 reserveB, ) = IUniswapV2Pair(uniswapV2Pair)
            .getReserves();
        uint256 amountBOptimal = _quote(amountADesired, reserveA, reserveB);
        if (amountBOptimal <= amountBDesired) {
            require(
                amountBOptimal >= amountBMin,
                "EvoRouter: INSUFFICIENT_B_AMOUNT"
            );
            (amountA, amountB) = (amountADesired, amountBOptimal);
        } else {
            uint256 amountAOptimal = _quote(amountBDesired, reserveB, reserveA);
            assert(amountAOptimal <= amountADesired);
            require(
                amountAOptimal >= amountAMin,
                "EvoRouter: INSUFFICIENT_A_AMOUNT"
            );
            (amountA, amountB) = (amountAOptimal, amountBDesired);
        }
    }

    // given some amount of an asset and pair reserves, returns an equivalent amount of the other asset
    function _quote(
        uint256 amountA,
        uint256 reserveA,
        uint256 reserveB
    ) internal pure returns (uint256 amountB) {
        require(amountA > 0, "EvoRouter: INSUFFICIENT_AMOUNT");
        require(
            reserveA > 0 && reserveB > 0,
            "EvoRouter: INSUFFICIENT_LIQUIDITY"
        );
        amountB = amountA.mul(reserveB) / reserveA;
    }

    function isVaultToken(address underlying)
        public
        view
        virtual
        override
        returns (bool)
    {
        try IVaultToken(underlying).isVaultToken() returns (bool result) {
            return result;
        } catch {
            return false;
        }
    }

    function getUniswapV2Pair(address underlying)
        public
        view
        virtual
        override
        returns (address)
    {
        try IVaultToken(underlying).underlying() returns (address u) {
            if (u != address(0)) return u;
            return underlying;
        } catch {
            return underlying;
        }
    }

    function getBorrowable(address underlying, uint8 index)
        public
        view
        virtual
        override
        returns (address borrowable)
    {
        require(index < 2, "EvoRouter: INDEX_TOO_HIGH");
        borrowable = address(
            uint256(
                keccak256(
                    abi.encodePacked(
                        hex"ff",
                        bDeployer,
                        keccak256(abi.encodePacked(factory, underlying, index)),
                        hex"d2e40dca60205bf10e93cbd99eddb009936b945bbbaccfd0a5dc4d7608889338" // Borrowable bytecode keccak256                            
                    )
                )
            )
        );
    }

    function getCollateral(address underlying)
        public
        view
        virtual
        override
        returns (address collateral)
    {
        collateral = address(
            uint256(
                keccak256(
                    abi.encodePacked(
                        hex"ff",
                        cDeployer,
                        keccak256(abi.encodePacked(factory, underlying)),
                        hex"969ff7e96aa71aadc69cd15729e1d58ccf173f64d006b169e4a8379380af0867" // Collateral bytecode keccak256
                    )
                )
            )
        );
    }

    function getLendingPool(address underlying)
        public
        view
        virtual
        override
        returns (
            address collateral,
            address borrowableA,
            address borrowableB
        )
    {
        collateral = getCollateral(underlying);
        borrowableA = getBorrowable(underlying, 0);
        borrowableB = getBorrowable(underlying, 1);
    }
}

Contract ABI

[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_bDeployer","type":"address"},{"internalType":"address","name":"_cDeployer","type":"address"},{"internalType":"address","name":"_WETH","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"uniswapV2Pair","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"}],"name":"_optimalLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bDeployer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"borrowable","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bytes","name":"permitData","type":"bytes"}],"name":"borrow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"borrowable","type":"address"},{"internalType":"uint256","name":"amountETH","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bytes","name":"permitData","type":"bytes"}],"name":"borrowETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cDeployer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"underlying","type":"address"},{"internalType":"uint256","name":"redeemTokens","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bytes","name":"permitData","type":"bytes"}],"name":"deleverage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"borrower","type":"address"},{"internalType":"uint256","name":"borrowAmount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"evoBorrow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"redeemAmount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"evoRedeem","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"underlying","type":"address"},{"internalType":"uint8","name":"index","type":"uint8"}],"name":"getBorrowable","outputs":[{"internalType":"address","name":"borrowable","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"underlying","type":"address"}],"name":"getCollateral","outputs":[{"internalType":"address","name":"collateral","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"underlying","type":"address"}],"name":"getLendingPool","outputs":[{"internalType":"address","name":"collateral","type":"address"},{"internalType":"address","name":"borrowableA","type":"address"},{"internalType":"address","name":"borrowableB","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"underlying","type":"address"}],"name":"getUniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"underlying","type":"address"}],"name":"isVaultToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"underlying","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"},{"internalType":"bytes","name":"permitDataA","type":"bytes"},{"internalType":"bytes","name":"permitDataB","type":"bytes"}],"name":"leverage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"borrowable","type":"address"},{"internalType":"uint256","name":"amountMax","type":"uint256"},{"internalType":"address","name":"borrower","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"liquidate","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"seizeTokens","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"borrowable","type":"address"},{"internalType":"address","name":"borrower","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"liquidateETH","outputs":[{"internalType":"uint256","name":"amountETH","type":"uint256"},{"internalType":"uint256","name":"seizeTokens","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"poolToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"mint","outputs":[{"internalType":"uint256","name":"tokens","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"poolToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bytes","name":"permitData","type":"bytes"}],"name":"mintCollateral","outputs":[{"internalType":"uint256","name":"tokens","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"poolToken","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"mintETH","outputs":[{"internalType":"uint256","name":"tokens","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"poolToken","type":"address"},{"internalType":"uint256","name":"tokens","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bytes","name":"permitData","type":"bytes"}],"name":"redeem","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"poolToken","type":"address"},{"internalType":"uint256","name":"tokens","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bytes","name":"permitData","type":"bytes"}],"name":"redeemETH","outputs":[{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"borrowable","type":"address"},{"internalType":"uint256","name":"amountMax","type":"uint256"},{"internalType":"address","name":"borrower","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"repay","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"borrowable","type":"address"},{"internalType":"address","name":"borrower","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"repayETH","outputs":[{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"payable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6101006040523480156200001257600080fd5b50604051620043c7380380620043c7833981016040819052620000359162000083565b6001600160601b0319606094851b811660805292841b831660a05290831b821660c05290911b1660e052620000e3565b80516001600160a01b03811681146200007d57600080fd5b92915050565b6000806000806080858703121562000099578384fd5b620000a5868662000065565b9350620000b6866020870162000065565b9250620000c7866040870162000065565b9150620000d8866060870162000065565b905092959194509250565b60805160601c60a05160601c60c05160601c60e05160601c61423e620001896000398061017a528061080d5280610879528061098852806109f15280610b8a5280610bde5280610c64528061158552806115cc528061164452806119725280611d985280611dec5280611e72528061305552806130a45250806118b352806118d9525080611a965280611fcc5250806118fa5280611a725280611fed525061423e6000f3fe60806040526004361061016a5760003560e01c8063703de94c116100d1578063c45a01551161008a578063e569058911610064578063e56905891461044f578063eb03419a1461046f578063ef974e9c14610482578063fcb2a895146104a2576101a3565b8063c45a015514610405578063db5a26901461041a578063dbe5f2fb1461042f576101a3565b8063703de94c1461036857806377370d621461037b5780637a4660d51461039b5780639b56d6c9146103b0578063ad5c4648146103d0578063c2a1582e146103e5576101a3565b80633970036a116101235780633970036a1461028d5780633c173a4f146102ba57806343e26448146102da5780635c1e6404146102fa57806367bf252f146103285780636aee7c1e14610348576101a3565b80630572bf5f146101a85780631f1cc5bc146101e05780632b005cfc1461020d5780632c3445041461022d578063338c4ccb1461024d57806335bb10591461027a576101a3565b366101a357336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a157fe5b005b600080fd5b3480156101b457600080fd5b506101c86101c3366004613284565b6104c2565b6040516101d793929190613c9c565b60405180910390f35b3480156101ec57600080fd5b506102006101fb3660046134c8565b6104f2565b6040516101d7919061413e565b34801561021957600080fd5b506102006102283660046134c8565b61076d565b34801561023957600080fd5b506101a16102483660046134c8565b6108ea565b34801561025957600080fd5b5061026d610268366004613284565b610a6b565b6040516101d79190613cd8565b61020061028836600461330c565b610aea565b34801561029957600080fd5b506102ad6102a8366004613284565b610d83565b6040516101d79190613baf565b3480156102c657600080fd5b506102006102d5366004613417565b610e18565b3480156102e657600080fd5b506102006102f536600461344e565b610ec2565b34801561030657600080fd5b5061031a6103153660046133bd565b61118f565b6040516101d7929190614147565b34801561033457600080fd5b506101a16103433660046135d9565b6112c9565b34801561035457600080fd5b50610200610363366004613417565b6113c0565b61020061037636600461330c565b6114e5565b34801561038757600080fd5b506101a16103963660046136a8565b61166b565b3480156103a757600080fd5b506102ad6118b1565b3480156103bc57600080fd5b506102ad6103cb366004613284565b6118d5565b3480156103dc57600080fd5b506102ad611970565b3480156103f157600080fd5b506101a161040036600461353c565b611994565b34801561041157600080fd5b506102ad611a70565b34801561042657600080fd5b506102ad611a94565b34801561043b57600080fd5b506101a161044a3660046134c8565b611ab8565b34801561045b57600080fd5b506101a161046a36600461334c565b611b5e565b61031a61047d3660046132bc565b611cf7565b34801561048e57600080fd5b506102ad61049d366004613723565b611fa5565b3480156104ae57600080fd5b5061031a6104bd366004613596565b612066565b60008060006104d0846118d5565b92506104dd846000611fa5565b91506104ea846001611fa5565b929491935050565b6000824281101561051e5760405162461bcd60e51b815260040161051590613e40565b60405180910390fd5b61052a87878686612181565b6040516323b872dd60e01b81526001600160a01b038816906323b872dd9061055a9033908b908b90600401613c37565b602060405180830381600087803b15801561057457600080fd5b505af1158015610588573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ac919061375b565b506000876001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b1580156105e857600080fd5b505afa1580156105fc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061062091906132a0565b905061062b81610a6b565b15610735576040516395a2251f60e01b81526001600160a01b038916906395a2251f9061065c908490600401613baf565b602060405180830381600087803b15801561067657600080fd5b505af115801561068a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106ae9190613a31565b506040516395a2251f60e01b81526001600160a01b038216906395a2251f906106db908990600401613baf565b602060405180830381600087803b1580156106f557600080fd5b505af1158015610709573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061072d9190613a31565b925050610763565b6040516395a2251f60e01b81526001600160a01b038916906395a2251f906106db908990600401613baf565b505b5095945050505050565b600082428110156107905760405162461bcd60e51b815260040161051590613e40565b86806001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b1580156107ca57600080fd5b505afa1580156107de573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061080291906132a0565b6001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146108525760405162461bcd60e51b815260040161051590613dd2565b61085f88883088886104f2565b604051632e1a7d4d60e01b81529093506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690632e1a7d4d906108ae90869060040161413e565b600060405180830381600087803b1580156108c857600080fd5b505af11580156108dc573d6000803e3d6000fd5b505050506107618684612238565b814281101561090b5760405162461bcd60e51b815260040161051590613e40565b85806001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b15801561094557600080fd5b505afa158015610959573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061097d91906132a0565b6001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146109cd5760405162461bcd60e51b815260040161051590613dd2565b6109da8787308787611ab8565b604051632e1a7d4d60e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690632e1a7d4d90610a2690899060040161413e565b600060405180830381600087803b158015610a4057600080fd5b505af1158015610a54573d6000803e3d6000fd5b50505050610a628587612238565b50505050505050565b6000816001600160a01b0316636ee272276040518163ffffffff1660e01b815260040160206040518083038186803b158015610aa657600080fd5b505afa925050508015610ad6575060408051601f3d908101601f19168201909252610ad39181019061375b565b60015b610ae257506000610ae5565b90505b919050565b60008142811015610b0d5760405162461bcd60e51b815260040161051590613e40565b84806001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b158015610b4757600080fd5b505afa158015610b5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b7f91906132a0565b6001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614610bcf5760405162461bcd60e51b815260040161051590613dd2565b610bda8634876122ca565b92507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0846040518263ffffffff1660e01b81526004016000604051808303818588803b158015610c3757600080fd5b505af1158015610c4b573d6000803e3d6000fd5b505060405163a9059cbb60e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016935063a9059cbb9250610c9e915089908790600401613cbf565b602060405180830381600087803b158015610cb857600080fd5b505af1158015610ccc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cf0919061375b565b610cf657fe5b6040805160008082526020820192839052631e7dcc0d60e01b9092526001600160a01b03881691631e7dcc0d91610d34918991819060248101613bc3565b600060405180830381600087803b158015610d4e57600080fd5b505af1158015610d62573d6000803e3d6000fd5b5050505082341115610d7a57610d7a33843403612238565b50509392505050565b6000816001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b158015610dbe57600080fd5b505afa925050508015610dee575060408051601f3d908101601f19168201909252610deb918101906132a0565b60015b610df9575080610ae5565b6001600160a01b03811615610e0f579050610ae5565b82915050610ae5565b60008142811015610e3b5760405162461bcd60e51b815260040161051590613e40565b610eb886876001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b158015610e7857600080fd5b505afa158015610e8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eb091906132a0565b8733886123b8565b9695505050505050565b60008342811015610ee55760405162461bcd60e51b815260040161051590613e40565b6000886001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b158015610f2057600080fd5b505afa158015610f34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f5891906132a0565b9050610f6381610a6b565b15611131576000816001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b158015610fa357600080fd5b505afa158015610fb7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fdb91906132a0565b905061101f818a8989898080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061218192505050565b61102b8133848c612465565b6040516335313c2160e11b81526001600160a01b03831690636a62784290611057908d90600401613baf565b602060405180830381600087803b15801561107157600080fd5b505af1158015611085573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110a99190613a31565b506040516335313c2160e11b81526001600160a01b038b1690636a627842906110d6908b90600401613baf565b602060405180830381600087803b1580156110f057600080fd5b505af1158015611104573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111289190613a31565b93505050611184565b61117381898888888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061218192505050565b61118089828a338b6123b8565b9250505b509695505050505050565b60008082428110156111b35760405162461bcd60e51b815260040161051590613e40565b6111be8888886122ca565b925061123c886001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b1580156111fc57600080fd5b505afa158015611210573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061123491906132a0565b338a86612465565b6040516386b9d81f60e01b81526001600160a01b038916906386b9d81f9061126a9089908990600401613c82565b602060405180830381600087803b15801561128457600080fd5b505af1158015611298573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112bc9190613a31565b9150509550959350505050565b84428110156112ea5760405162461bcd60e51b815260040161051590613e40565b6113366112f88d6000611fa5565b8c8888888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061254e92505050565b6113826113448d6001611fa5565b8b8886868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061254e92505050565b600061138d8d610d83565b905060008061139f838f8f8f8f612066565b915091506113af8f83838d6125c7565b505050505050505050505050505050565b600081428110156113e35760405162461bcd60e51b815260040161051590613e40565b6113ee8686866122ca565b915061146c866001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b15801561142c57600080fd5b505afa158015611440573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061146491906132a0565b338885612465565b6040805160008082526020820192839052631e7dcc0d60e01b9092526001600160a01b03881691631e7dcc0d916114aa918891819060248101613bc3565b600060405180830381600087803b1580156114c457600080fd5b505af11580156114d8573d6000803e3d6000fd5b5050505050949350505050565b600081428110156115085760405162461bcd60e51b815260040161051590613e40565b84806001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b15801561154257600080fd5b505afa158015611556573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061157a91906132a0565b6001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146115ca5760405162461bcd60e51b815260040161051590613dd2565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b15801561162557600080fd5b505af1158015611639573d6000803e3d6000fd5b5050505050610eb8867f00000000000000000000000000000000000000000000000000000000000000003430896123b8565b824281101561168c5760405162461bcd60e51b815260040161051590613e40565b6000611697896118d5565b90506000816001600160a01b0316633ba0b9a96040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156116d657600080fd5b505af11580156116ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061170e9190613a31565b9050600089116117305760405162461bcd60e51b815260040161051590614009565b600061175e670de0b6b3a76400006117526000198d018563ffffffff61277c16565b9063ffffffff6127bf16565b90506117a2838b8989898080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061218192505050565b604080516080810190915260609080600281526020018d6001600160a01b03168152602001600060ff1681526020016040518060a00160405280336001600160a01b031681526020018e81526020018581526020018d81526020018c8152506040516020016118119190614100565b60408051601f1981840301815291815291525161183191906020016140b0565b60408051601f19818403018152908290526319f3400d60e01b825291506001600160a01b038516906319f3400d9061187190309086908690600401613c5b565b600060405180830381600087803b15801561188b57600080fd5b505af115801561189f573d6000803e3d6000fd5b50505050505050505050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000008360405160200161192b929190613a98565b60405160208183030381529060405280519060200120604051602001611952929190613b0d565b60408051601f19818403018152919052805160209091012092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b61199c613125565b6119a8828401846138da565b905060006119b982602001516118d5565b90506001600160a01b03861630146119e35760405162461bcd60e51b815260040161051590613f19565b336001600160a01b03821614611a0b5760405162461bcd60e51b815260040161051590613f85565b600282516002811115611a1a57fe5b14156101a357611a2861314c565b8260600151806020019051810190611a409190613981565b9050610a62836020015182600001518360200151846040015185606001518660800151612801565b505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b8142811015611ad95760405162461bcd60e51b815260040161051590613e40565b611ae58686858561254e565b60408051600081526020810191829052631e7dcc0d60e01b9091526001600160a01b03871690631e7dcc0d90611b2490339088908a9060248101613bc3565b600060405180830381600087803b158015611b3e57600080fd5b505af1158015611b52573d6000803e3d6000fd5b50505050505050505050565b611b66613125565b611b72828401846138da565b90506000611b8882602001518360400151611fa5565b90506001600160a01b0387163014611bb25760405162461bcd60e51b815260040161051590613f19565b336001600160a01b03821614611bda5760405162461bcd60e51b815260040161051590613f85565b600082516002811115611be957fe5b1415611c3357611bf7613184565b8260600151806020019051810190611c0f91906137c6565b9050611c2d8360200151826000015183602001518460400151612b7a565b50610a62565b600182516002811115611c4257fe5b14156101a357611c506131ae565b8260600151806020019051810190611c689190613809565b90506000611c7b84602001516001611fa5565b8251602084015160408086015160608701519151631e7dcc0d60e01b81529495506001600160a01b03861694631e7dcc0d94611cbe949093909291600401613bc3565b600060405180830381600087803b158015611cd857600080fd5b505af1158015611cec573d6000803e3d6000fd5b505050505050610a62565b6000808242811015611d1b5760405162461bcd60e51b815260040161051590613e40565b86806001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b158015611d5557600080fd5b505afa158015611d69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d8d91906132a0565b6001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614611ddd5760405162461bcd60e51b815260040161051590613dd2565b611de88834896122ca565b93507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b158015611e4557600080fd5b505af1158015611e59573d6000803e3d6000fd5b505060405163a9059cbb60e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016935063a9059cbb9250611eac91508b908890600401613cbf565b602060405180830381600087803b158015611ec657600080fd5b505af1158015611eda573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611efe919061375b565b611f0457fe5b6040516386b9d81f60e01b81526001600160a01b038916906386b9d81f90611f32908a908a90600401613c82565b602060405180830381600087803b158015611f4c57600080fd5b505af1158015611f60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f849190613a31565b925083341115611f9a57611f9a33853403612238565b505094509492505050565b600060028260ff1610611fca5760405162461bcd60e51b815260040161051590613d9b565b7f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000848460405160200161202093929190613aba565b60405160208183030381529060405280519060200120604051602001612047929190613b5e565b60408051601f1981840301815291905280516020909101209392505050565b600080600080886001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b1580156120a557600080fd5b505afa1580156120b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120dd91906139dd565b506001600160701b031691506001600160701b031691506000612101898484612e27565b9050878111612135578581101561212a5760405162461bcd60e51b815260040161051590613ee4565b889450925082612174565b6000612142898486612e27565b90508981111561214e57fe5b8781101561216e5760405162461bcd60e51b815260040161051590613f50565b94508793505b5050509550959350505050565b805161218c57612232565b600080600080848060200190518101906121a6919061377b565b93509350935093506000846121bb57876121bf565b6000195b60405163d505accf60e01b81529091506001600160a01b038a169063d505accf906121fa903390309086908d908b908b908b90600401613bf6565b600060405180830381600087803b15801561221457600080fd5b505af1158015612228573d6000803e3d6000fd5b5050505050505050505b50505050565b604080516000808252602082019092526001600160a01b0384169083906040516122629190613af1565b60006040518083038185875af1925050503d806000811461229f576040519150601f19603f3d011682016040523d82523d6000602084013e6122a4565b606091505b50509050806122c55760405162461bcd60e51b815260040161051590613d47565b505050565b6000836001600160a01b031663a6afed956040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561230757600080fd5b505af115801561231b573d6000803e3d6000fd5b50506040516326b9f4dd60e11b8152600092506001600160a01b0387169150634d73e9ba9061234e908690600401613baf565b60206040518083038186803b15801561236657600080fd5b505afa15801561237a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061239e9190613a31565b90508084106123ad57806123af565b835b95945050505050565b60006001600160a01b0383163014156123db576123d6858786612e95565b6123e7565b6123e785848887612465565b6040516335313c2160e11b81526001600160a01b03871690636a62784290612413908590600401613baf565b602060405180830381600087803b15801561242d57600080fd5b505af1158015612441573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eb89190613a31565b60006060856001600160a01b03166323b872dd86868660405160240161248d93929190613c37565b6040516020818303038152906040529060e01b6020820180516001600160e01b0383818316178352505050506040516124c69190613af1565b6000604051808303816000865af19150503d8060008114612503576040519150601f19603f3d011682016040523d82523d6000602084013e612508565b606091505b5091509150818015612532575080511580612532575080806020019051810190612532919061375b565b611a685760405162461bcd60e51b815260040161051590613cf6565b805161255957612232565b60008060008084806020019051810190612573919061377b565b9350935093509350600084612588578761258c565b6000195b60405163279e6d5760e21b81529091506001600160a01b038a1690639e79b55c906121fa903390309086908d908b908b908b90600401613bf6565b60006125d4856000611fa5565b905060606040518060800160405280600060028111156125f057fe5b8152602001876001600160a01b03168152602001600160ff1681526020016040518060600160405280888152602001878152602001866001600160a01b03168152506040516020016126429190614039565b60408051601f1981840301815291815291525161266291906020016140b0565b60408051601f198184030181526080830190915291506060908060018152602001886001600160a01b03168152602001600060ff1681526020016040518060800160405280336001600160a01b03168152602001306001600160a01b03168152602001888152602001858152506040516020016126df9190614063565b60408051601f198184030181529181529152516126ff91906020016140b0565b60408051601f1981840301815290829052631e7dcc0d60e01b825291506001600160a01b03841690631e7dcc0d9061274190339030908b908790600401613bc3565b600060405180830381600087803b15801561275b57600080fd5b505af115801561276f573d6000803e3d6000fd5b5050505050505050505050565b60008261278b575060006127b9565b8282028284828161279857fe5b04146127b65760405162461bcd60e51b815260040161051590613dff565b90505b92915050565b60006127b683836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612f83565b600080600061280f896104c2565b9250925092506000826001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b15801561285057600080fd5b505afa158015612864573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061288891906132a0565b90506000826001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b1580156128c557600080fd5b505afa1580156128d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128fd91906132a0565b9050600061290a8c610d83565b60405163a9059cbb60e01b81529091506001600160a01b038d169063a9059cbb9061293b908f908d90600401613cbf565b602060405180830381600087803b15801561295557600080fd5b505af1158015612969573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061298d919061375b565b506129978c610a6b565b15612a1c576040516395a2251f60e01b81526001600160a01b038d16906395a2251f906129c8908490600401613baf565b602060405180830381600087803b1580156129e257600080fd5b505af11580156129f6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a1a9190613a31565b505b600080826001600160a01b03166389afcb44306040518263ffffffff1660e01b8152600401612a4b9190613baf565b6040805180830381600087803b158015612a6457600080fd5b505af1158015612a78573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a9c9190613a49565b9150915089821015612ac05760405162461bcd60e51b815260040161051590613f50565b88811015612ae05760405162461bcd60e51b815260040161051590613ee4565b612aec87868f85612fba565b612af886858f84612fba565b876001600160a01b03166323b872dd8e8a8f6040518463ffffffff1660e01b8152600401612b2893929190613c37565b602060405180830381600087803b158015612b4257600080fd5b505af1158015612b56573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113af919061375b565b6000806000612b88876104c2565b9250925092506000612b9988610d83565b9050612c16836001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b158015612bd757600080fd5b505afa158015612beb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c0f91906132a0565b8289612e95565b612c91826001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b158015612c5257600080fd5b505afa158015612c66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c8a91906132a0565b8288612e95565b612c9a88610a6b565b15612d1f576040516335313c2160e11b81526001600160a01b03821690636a62784290612ccb908b90600401613baf565b602060405180830381600087803b158015612ce557600080fd5b505af1158015612cf9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d1d9190613a31565b505b6040516335313c2160e11b81526001600160a01b03891690636a62784290612d4b908790600401613baf565b602060405180830381600087803b158015612d6557600080fd5b505af1158015612d79573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d9d9190613a31565b506040516335313c2160e11b81526001600160a01b03851690636a62784290612dca908890600401613baf565b602060405180830381600087803b158015612de457600080fd5b505af1158015612df8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e1c9190613a31565b505050505050505050565b6000808411612e485760405162461bcd60e51b815260040161051590613e6c565b600083118015612e585750600082115b612e745760405162461bcd60e51b815260040161051590613ea3565b82612e85858463ffffffff61277c16565b81612e8c57fe5b04949350505050565b60006060846001600160a01b031663a9059cbb8585604051602401612ebb929190613cbf565b6040516020818303038152906040529060e01b6020820180516001600160e01b038381831617835250505050604051612ef49190613af1565b6000604051808303816000865af19150503d8060008114612f31576040519150601f19603f3d011682016040523d82523d6000602084013e612f36565b606091505b5091509150818015612f60575080511580612f60575080806020019051810190612f60919061375b565b612f7c5760405162461bcd60e51b815260040161051590613fbc565b5050505050565b60008183612fa45760405162461bcd60e51b81526004016105159190613ce3565b506000838581612fb057fe5b0495945050505050565b6000612fc78583856122ca565b9050612fd4848683612e95565b6040805160008082526020820192839052631e7dcc0d60e01b9092526001600160a01b03871691631e7dcc0d91613012918791819060248101613bc3565b600060405180830381600087803b15801561302c57600080fd5b505af1158015613040573d6000803e3d6000fd5b5050505080821115612f7c57600081830390507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316856001600160a01b0316141561311a57604051632e1a7d4d60e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690632e1a7d4d906130d990849060040161413e565b600060405180830381600087803b1580156130f357600080fd5b505af1158015613107573d6000803e3d6000fd5b505050506131158482612238565b611a68565b611a68858583612e95565b60408051608081019091528060008152600060208201819052604082015260609081015290565b6040518060a0016040528060006001600160a01b03168152602001600081526020016000815260200160008152602001600081525090565b6040518060600160405280600081526020016000815260200160006001600160a01b031681525090565b604080516080810182526000808252602082018190529181019190915260608082015290565b80356127b9816141cc565b60008083601f8401126131f0578182fd5b50813567ffffffffffffffff811115613207578182fd5b60208301915083602082850101111561321f57600080fd5b9250929050565b600082601f830112613236578081fd5b81356132496132448261417c565b614155565b915080825283602082850101111561326057600080fd5b8060208401602084013760009082016020015292915050565b80356127b9816141f9565b600060208284031215613295578081fd5b81356127b6816141cc565b6000602082840312156132b1578081fd5b81516127b6816141cc565b600080600080608085870312156132d1578283fd5b84356132dc816141cc565b935060208501356132ec816141cc565b925060408501356132fc816141cc565b9396929550929360600135925050565b600080600060608486031215613320578283fd5b833561332b816141cc565b9250602084013561333b816141cc565b929592945050506040919091013590565b600080600080600060808688031215613363578081fd5b853561336e816141cc565b9450602086013561337e816141cc565b935060408601359250606086013567ffffffffffffffff8111156133a0578182fd5b6133ac888289016131df565b969995985093965092949392505050565b600080600080600060a086880312156133d4578283fd5b85356133df816141cc565b94506020860135935060408601356133f6816141cc565b92506060860135613406816141cc565b949793965091946080013592915050565b6000806000806080858703121561342c578182fd5b8435613437816141cc565b93506020850135925060408501356132fc816141cc565b60008060008060008060a08789031215613466578384fd5b8635613471816141cc565b9550602087013594506040870135613488816141cc565b935060608701359250608087013567ffffffffffffffff8111156134aa578182fd5b6134b689828a016131df565b979a9699509497509295939492505050565b600080600080600060a086880312156134df578283fd5b85356134ea816141cc565b9450602086013593506040860135613501816141cc565b925060608601359150608086013567ffffffffffffffff811115613523578182fd5b61352f88828901613226565b9150509295509295909350565b60008060008060608587031215613551578182fd5b843561355c816141cc565b935060208501359250604085013567ffffffffffffffff81111561357e578283fd5b61358a878288016131df565b95989497509550505050565b600080600080600060a086880312156135ad578283fd5b85356135b8816141cc565b97602087013597506040870135966060810135965060800135945092505050565b60008060008060008060008060008060006101208c8e0312156135fa578889fd5b6136048c356141cc565b8b359a5060208c0135995060408c0135985060608c0135975060808c0135965061363160a08d01356141cc565b60a08c0135955060c08c0135945067ffffffffffffffff8060e08e01351115613658578485fd5b6136688e60e08f01358f016131df565b90955093506101008d013581101561367e578283fd5b506136908d6101008e01358e016131df565b81935080925050509295989b509295989b9093969950565b600080600080600080600060c0888a0312156136c2578081fd5b87356136cd816141cc565b96506020880135955060408801359450606088013593506080880135925060a088013567ffffffffffffffff811115613704578182fd5b6137108a828b016131df565b989b979a50959850939692959293505050565b60008060408385031215613735578182fd5b8235613740816141cc565b91506020830135613750816141f9565b809150509250929050565b60006020828403121561376c578081fd5b815180151581146127b6578182fd5b60008060008060808587031215613790578182fd5b8451801515811461379f578283fd5b60208601519094506137b0816141f9565b6040860151606090960151949790965092505050565b6000606082840312156137d7578081fd5b6137e16060614155565b825181526020830151602082015260408301516137fd816141cc565b60408201529392505050565b6000602080838503121561381b578182fd5b825167ffffffffffffffff80821115613832578384fd5b81850160808188031215613844578485fd5b61384e6080614155565b9250805161385b816141cc565b83528084015161386a816141cc565b8385015260408181015190840152606081015182811115613889578586fd5b019050601f8101861361389a578384fd5b80516138a86132448261417c565b81815287858385010111156138bb578586fd5b6138ca828683018786016141a0565b6060840152509095945050505050565b6000602082840312156138eb578081fd5b813567ffffffffffffffff80821115613902578283fd5b81840160808187031215613914578384fd5b61391e6080614155565b925080356003811061392e578485fd5b835261393d86602083016131d4565b602084015261394f8660408301613279565b6040840152606081013582811115613965578485fd5b61397187828401613226565b6060850152509195945050505050565b600060a08284031215613992578081fd5b61399c60a0614155565b82516139a7816141cc565b80825250602083015160208201526040830151604082015260608301516060820152608083015160808201528091505092915050565b6000806000606084860312156139f1578081fd5b83516139fc816141e4565b6020850151909350613a0d816141e4565b604085015190925063ffffffff81168114613a26578182fd5b809150509250925092565b600060208284031215613a42578081fd5b5051919050565b60008060408385031215613a5b578182fd5b505080516020909101519092909150565b60008151808452613a848160208601602086016141a0565b601f01601f19169290920160200192915050565b6001600160601b0319606093841b811682529190921b16601482015260280190565b606093841b6001600160601b031990811682529290931b909116601483015260f81b6001600160f81b031916602882015260290190565b60008251613b038184602087016141a0565b9190910192915050565b6001600160f81b0319815260609290921b6001600160601b031916600183015260158201527f969ff7e96aa71aadc69cd15729e1d58ccf173f64d006b169e4a8379380af0867603582015260550190565b6001600160f81b0319815260609290921b6001600160601b031916600183015260158201527fd2e40dca60205bf10e93cbd99eddb009936b945bbbaccfd0a5dc4d7608889338603582015260550190565b6001600160a01b0391909116815260200190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090610eb890830184613a6c565b6001600160a01b0397881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b600060018060a01b0385168252836020830152606060408301526123af6060830184613a6c565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b0393841681529183166020830152909116604082015260600190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b6000602082526127b66020830184613a6c565b60208082526031908201527f5472616e7366657248656c7065723a3a7472616e7366657246726f6d3a207472604082015270185b9cd9995c919c9bdb4819985a5b1959607a1b606082015260800190565b60208082526034908201527f5472616e7366657248656c7065723a3a736166655472616e736665724554483a60408201527308115512081d1c985b9cd9995c8819985a5b195960621b606082015260800190565b60208082526019908201527f45766f526f757465723a20494e4445585f544f4f5f4849474800000000000000604082015260600190565b60208082526013908201527208aecdea4deeae8cae474409c9ea8beae8aa89606b1b604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b602080825260129082015271115d9bd49bdd5d195c8e881156141254915160721b604082015260600190565b6020808252601e908201527f45766f526f757465723a20494e53554646494349454e545f414d4f554e540000604082015260600190565b60208082526021908201527f45766f526f757465723a20494e53554646494349454e545f4c495155494449546040820152605960f81b606082015260800190565b6020808252818101527f45766f526f757465723a20494e53554646494349454e545f425f414d4f554e54604082015260600190565b6020808252601c908201527f45766f526f757465723a2053454e4445525f4e4f545f524f5554455200000000604082015260600190565b6020808252818101527f45766f526f757465723a20494e53554646494349454e545f415f414d4f554e54604082015260600190565b6020808252601e908201527f45766f526f757465723a20554e415554484f52495a45445f43414c4c45520000604082015260600190565b6020808252602d908201527f5472616e7366657248656c7065723a3a736166655472616e736665723a20747260408201526c185b9cd9995c8819985a5b1959609a1b606082015260800190565b60208082526016908201527545766f526f757465723a2052454445454d5f5a45524f60501b604082015260600190565b81518152602080830151908201526040918201516001600160a01b03169181019190915260600190565b60006020825260018060a01b03808451166020840152806020850151166040840152506040830151606083015260608301516080808401526140a860a0840182613a6c565b949350505050565b6000602082528251600381106140c257fe5b8060208401525060018060a01b03602084015116604083015260ff604084015116606083015260608301516080808401526140a860a0840182613a6c565b81516001600160a01b031681526020808301519082015260408083015190820152606080830151908201526080918201519181019190915260a00190565b90815260200190565b918252602082015260400190565b60405181810167ffffffffffffffff8111828210171561417457600080fd5b604052919050565b600067ffffffffffffffff821115614192578081fd5b50601f01601f191660200190565b60005b838110156141bb5781810151838201526020016141a3565b838111156122325750506000910152565b6001600160a01b03811681146141e157600080fd5b50565b6001600160701b03811681146141e157600080fd5b60ff811681146141e157600080fdfea264697066735822122069e212f72522de2b7e712915b980e8138539b7d414b41d45128a0f486828082b64736f6c63430006060033000000000000000000000000b8b48e97cd037987de138b978df265d873333a3b000000000000000000000000d5ded86121ce03a825589a8eb9c831e8e6c848d400000000000000000000000005472c48d6515407ec649eb0eaa5861d7412beac0000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae23

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

000000000000000000000000b8b48e97cd037987de138b978df265d873333a3b000000000000000000000000d5ded86121ce03a825589a8eb9c831e8e6c848d400000000000000000000000005472c48d6515407ec649eb0eaa5861d7412beac0000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae23

-----Decoded View---------------
Arg [0] : _factory (address): 0xb8b48e97cd037987de138b978df265d873333a3b
Arg [1] : _bDeployer (address): 0xd5ded86121ce03a825589a8eb9c831e8e6c848d4
Arg [2] : _cDeployer (address): 0x05472c48d6515407ec649eb0eaa5861d7412beac
Arg [3] : _WETH (address): 0x5c7f8a570d578ed84e63fdfa7b1ee72deae1ae23

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000b8b48e97cd037987de138b978df265d873333a3b
Arg [1] : 000000000000000000000000d5ded86121ce03a825589a8eb9c831e8e6c848d4
Arg [2] : 00000000000000000000000005472c48d6515407ec649eb0eaa5861d7412beac
Arg [3] : 0000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae23


Deployed ByteCode Sourcemap

40250:24267:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41162:10;-1:-1:-1;;;;;41176:4:0;41162:18;;41155:26;;;;40250:24267;;12:1:-1;9;2:12;64107:407:0;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;64107:407:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;43495:668;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;43495:668:0;;;;;;;;:::i;:::-;;;;;;;;44171:576;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;44171:576:0;;;;;;;;:::i;45140:410::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;45140:410:0;;;;;;;;:::i;62061:305::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;62061:305:0;;;;;;;;:::i;:::-;;;;;;;;46520:700;;;;;;;;;:::i;62374:361::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;62374:361:0;;;;;;;;:::i;:::-;;;;;;;;41708:405;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;41708:405:0;;;;;;;;:::i;42521:942::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;42521:942:0;;;;;;;;:::i;47255:617::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;47255:617:0;;;;;;;;:::i;:::-;;;;;;;;;50144:992;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;50144:992:0;;;;;;;;:::i;45983:529::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;45983:529:0;;;;;;;;:::i;42121:392::-;;;;;;;;;:::i;52163:1371::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;52163:1371:0;;;;;;;;:::i;40433:43::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;40433:43:0;;;:::i;63478:621::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;63478:621:0;;;;;;;;:::i;40483:38::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;40483:38:0;;;:::i;58106:1072::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;58106:1072:0;;;;;;;;:::i;40335:41::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;40335:41:0;;;:::i;40383:43::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;40383:43:0;;;:::i;44779:353::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;44779:353:0;;;;;;;;:::i;56532:1566::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;56532:1566:0;;;;;;;;:::i;47880:738::-;;;;;;;;;:::i;62743:727::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;62743:727:0;;;;;;;;:::i;60476:1073::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;60476:1073:0;;;;;;;;:::i;64107:407::-;64248:18;64281:19;64315;64375:25;64389:10;64375:13;:25::i;:::-;64362:38;;64425:28;64439:10;64451:1;64425:13;:28::i;:::-;64411:42;;64478:28;64492:10;64504:1;64478:13;:28::i;:::-;64107:407;;;;-1:-1:-1;;64107:407:0:o;43495:668::-;43703:14;43684:8;40595:15;40583:8;:27;;40575:58;;;;-1:-1:-1;;;40575:58:0;;;;;;;;;;;;;;;;;43730:48:::1;43738:9;43749:6;43757:8;43767:10;43730:7;:48::i;:::-;43789:65;::::0;-1:-1:-1;;;43789:65:0;;-1:-1:-1;;;;;43789:34:0;::::1;::::0;::::1;::::0;:65:::1;::::0;43824:10:::1;::::0;43800:9;;43847:6;;43789:65:::1;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;43789:65:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;43789:65:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;43789:65:0;;;;;;;;;;43865:18;43897:9;-1:-1:-1::0;;;;;43886:32:0::1;;:34;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;43886:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;43886:34:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;43886:34:0;;;;;;;;;43865:55;;43935:24;43948:10;43935:12;:24::i;:::-;43931:225;;;43976:40;::::0;-1:-1:-1;;;43976:40:0;;-1:-1:-1;;;;;43976:28:0;::::1;::::0;::::1;::::0;:40:::1;::::0;44005:10;;43976:40:::1;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;43976:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;43976:40:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;43976:40:0;;;;;;;;;-1:-1:-1::0;44038:34:0::1;::::0;-1:-1:-1;;;44038:34:0;;-1:-1:-1;;;;;44038:30:0;::::1;::::0;::::1;::::0;:34:::1;::::0;44069:2;;44038:34:::1;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;44038:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;44038:34:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;44038:34:0;;;;;;;;;44031:41;;;;;43931:225;44112:32;::::0;-1:-1:-1;;;44112:32:0;;-1:-1:-1;;;;;44112:28:0;::::1;::::0;::::1;::::0;:32:::1;::::0;44141:2;;44112:32:::1;;;;43931:225;40644:1;;43495:668:::0;;;;;;;;:::o;44171:576::-;44456:17;44399:8;40595:15;40583:8;:27;;40575:58;;;;-1:-1:-1;;;40575:58:0;;;;;;;;;44427:9:::1;40750;-1:-1:-1::0;;;;;40739:32:0::1;;:34;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;40739:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;40739:34:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;40739:34:0;;;;;;;;;-1:-1:-1::0;;;;;40731:42:0::1;:4;-1:-1:-1::0;;;;;40731:42:0::1;;40709:111;;;;-1:-1:-1::0;;;40709:111:0::1;;;;;;;;;44503:138:::2;44524:9;44548:6;44577:4;44597:8;44620:10;44503:6;:138::i;:::-;44652:31;::::0;-1:-1:-1;;;44652:31:0;;44491:150;;-1:-1:-1;;;;;;44658:4:0::2;44652:20;::::0;::::2;::::0;:31:::2;::::0;44491:150;;44652:31:::2;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::2;2:2;44652:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;44652:31:0;;;;44694:45;44725:2;44729:9;44694:30;:45::i;45140:410::-:0;45336:8;40595:15;40583:8;:27;;40575:58;;;;-1:-1:-1;;;40575:58:0;;;;;;;;;45355:10:::1;40750:9;-1:-1:-1::0;;;;;40739:32:0::1;;:34;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;40739:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;40739:34:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;40739:34:0;;;;;;;;;-1:-1:-1::0;;;;;40731:42:0::1;:4;-1:-1:-1::0;;;;;40731:42:0::1;;40709:111;;;;-1:-1:-1::0;;;40709:111:0::1;;;;;;;;;45378:66:::2;45385:10;45397:9;45416:4;45423:8;45433:10;45378:6;:66::i;:::-;45455:31;::::0;-1:-1:-1;;;45455:31:0;;-1:-1:-1;;;;;45461:4:0::2;45455:20;::::0;::::2;::::0;:31:::2;::::0;45476:9;;45455:31:::2;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::2;2:2;45455:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;45455:31:0;;;;45497:45;45528:2;45532:9;45497:30;:45::i;:::-;40644:1:::1;45140:410:::0;;;;;;:::o;62061:305::-;62186:4;62224:10;-1:-1:-1;;;;;62212:36:0;;:38;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;62212:38:0;;;;;;;;;;;-1:-1:-1;62212:38:0;;;101:4:-1;62212:38:0;80:15:-1;;;-1:-1;;76:31;65:43;;113:20;;;62212:38:0;;;;;;;;;;62208:151;;-1:-1:-1;62342:5:0;62335:12;;62208:151;62295:6;-1:-1:-1;62208:151:0;62061:305;;;:::o;46520:700::-;46772:17;46714:8;40595:15;40583:8;:27;;40575:58;;;;-1:-1:-1;;;40575:58:0;;;;;;;;;46742:10:::1;40750:9;-1:-1:-1::0;;;;;40739:32:0::1;;:34;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;40739:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;40739:34:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;40739:34:0;;;;;;;;;-1:-1:-1::0;;;;;40731:42:0::1;:4;-1:-1:-1::0;;;;;40731:42:0::1;;40709:111;;;;-1:-1:-1::0;;;40709:111:0::1;;;;;;;;;46819:45:::2;46832:10;46844:9;46855:8;46819:12;:45::i;:::-;46807:57;;46881:4;-1:-1:-1::0;;;;;46875:19:0::2;;46902:9;46875:39;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::2;2:2;46875:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;-1:-1:::0;;46932:43:0::2;::::0;-1:-1:-1;;;46932:43:0;;-1:-1:-1;;;;;46938:4:0::2;46932:20;::::0;-1:-1:-1;46932:20:0::2;::::0;-1:-1:-1;46932:43:0::2;::::0;-1:-1:-1;46953:10:0;;46965:9;;46932:43:::2;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::2;2:2;46932:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;46932:43:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;46932:43:0;;;;;;;;;46925:51;;;;47043:12;::::0;;47036:1:::2;47043:12:::0;;;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;46987:69:0;;;-1:-1:-1;;;;;46987:30:0;::::2;::::0;::::2;::::0;:69:::2;::::0;47018:8;;47036:1;;46987:69;;;::::2;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::2;2:2;46987:69:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;46987:69:0;;;;47123:9;47111;:21;47107:105;;;47147:65;47178:10;47202:9;47190;:21;47147:30;:65::i;:::-;40644:1:::1;46520:700:::0;;;;;;:::o;62374:361::-;62503:7;62544:10;-1:-1:-1;;;;;62532:34:0;;:36;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;62532:36:0;;;;;;;;;;;-1:-1:-1;62532:36:0;;;101:4:-1;62532:36:0;80:15:-1;;;-1:-1;;76:31;65:43;;113:20;;;62532:36:0;;;;;;;;;;62528:200;;-1:-1:-1;62706:10:0;62699:17;;62528:200;-1:-1:-1;;;;;62608:15:0;;;62604:29;;62632:1;-1:-1:-1;62625:8:0;;62604:29;62655:10;62648:17;;;;;41708:405;41882:14;41863:8;40595:15;40583:8;:27;;40575:58;;;;-1:-1:-1;;;40575:58:0;;;;;;;;;41929:176:::1;41953:9;41992;-1:-1:-1::0;;;;;41981:32:0::1;;:34;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;41981:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;41981:34:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;41981:34:0;;;;;;;;;42034:6;42059:10;42088:2;41929:5;:176::i;:::-;41909:196:::0;41708:405;-1:-1:-1;;;;;;41708:405:0:o;42521:942::-;42741:14;42722:8;40595:15;40583:8;:27;;40575:58;;;;-1:-1:-1;;;40575:58:0;;;;;;;;;42768:18:::1;42800:9;-1:-1:-1::0;;;;;42789:32:0::1;;:34;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;42789:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;42789:34:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;42789:34:0;;;;;;;;;42768:55;;42838:24;42851:10;42838:12;:24::i;:::-;42834:622;;;42879:21;42915:10;-1:-1:-1::0;;;;;42903:34:0::1;;:36;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;42903:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;42903:36:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;42903:36:0;;;;;;;;;42879:60;;42954:52;42962:13;42977:6;42985:8;42995:10;;42954:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;42954:7:0::1;::::0;-1:-1:-1;;;42954:52:0:i:1;:::-;43021:161;43071:13;43103:10;43132;43161:6;43021:31;:161::i;:::-;43197:39;::::0;-1:-1:-1;;;43197:39:0;;-1:-1:-1;;;;;43197:28:0;::::1;::::0;::::1;::::0;:39:::1;::::0;43226:9;;43197:39:::1;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;43197:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;43197:39:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;43197:39:0;;;;;;;;;-1:-1:-1::0;43258:30:0::1;::::0;-1:-1:-1;;;43258:30:0;;-1:-1:-1;;;;;43258:26:0;::::1;::::0;::::1;::::0;:30:::1;::::0;43285:2;;43258:30:::1;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;43258:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;43258:30:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;43258:30:0;;;;;;;;;43251:37;;;;;;42834:622;43321:49;43329:10;43341:6;43349:8;43359:10;;43321:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;43321:7:0::1;::::0;-1:-1:-1;;;43321:49:0:i:1;:::-;43392:52;43398:9;43409:10;43421:6;43429:10;43441:2;43392:5;:52::i;:::-;43385:59;;;40644:1;42521:942:::0;;;;;;;;;:::o;47255:617::-;47510:14;47526:19;47482:8;40595:15;40583:8;:27;;40575:58;;;;-1:-1:-1;;;40575:58:0;;;;;;;;;47572:45:::1;47585:10;47597:9;47608:8;47572:12;:45::i;:::-;47563:54;;47628:164;47686:10;-1:-1:-1::0;;;;;47674:34:0::1;;:36;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;47674:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;47674:36:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;47674:36:0;;;;;;;;;47725:10;47750;47775:6;47628:31;:164::i;:::-;47817:47;::::0;-1:-1:-1;;;47817:47:0;;-1:-1:-1;;;;;47817:33:0;::::1;::::0;::::1;::::0;:47:::1;::::0;47851:8;;47861:2;;47817:47:::1;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;47817:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;47817:47:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;47817:47:0;;;;;;;;;47803:61;;47255:617:::0;;;;;;;;;:::o;50144:992::-;50477:8;40595:15;40583:8;:27;;40575:58;;;;-1:-1:-1;;;40575:58:0;;;;;;;;;50498:145:::1;50526:28;50540:10;50552:1;50526:13;:28::i;:::-;50569:14;50598:8;50621:11;;50498:145;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;50498:13:0::1;::::0;-1:-1:-1;;;50498:145:0:i:1;:::-;50654;50682:28;50696:10;50708:1;50682:13;:28::i;:::-;50725:14;50754:8;50777:11;;50654:145;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;50654:13:0::1;::::0;-1:-1:-1;;;50654:145:0:i:1;:::-;50810:21;50834:28;50851:10;50834:16;:28::i;:::-;50810:52;;50874:15;50891::::0;50910:164:::1;50942:13;50970:14;50999;51028:10;51053;50910:17;:164::i;:::-;50873:201;;;;51085:43;51095:10;51107:7;51116;51125:2;51085:9;:43::i;:::-;40644:1;;;50144:992:::0;;;;;;;;;;;;:::o;45983:529::-;46168:14;46149:8;40595:15;40583:8;:27;;40575:58;;;;-1:-1:-1;;;40575:58:0;;;;;;;;;46204:45:::1;46217:10;46229:9;46240:8;46204:12;:45::i;:::-;46195:54;;46260:164;46318:10;-1:-1:-1::0;;;;;46306:34:0::1;;:36;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;46306:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;46306:36:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;46306:36:0;;;;;;;;;46357:10;46382;46407:6;46260:31;:164::i;:::-;46491:12;::::0;;46484:1:::1;46491:12:::0;;;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;46435:69:0;;;-1:-1:-1;;;;;46435:30:0;::::1;::::0;::::1;::::0;:69:::1;::::0;46466:8;;46484:1;;46435:69;;;::::1;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;46435:69:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;46435:69:0;;;;45983:529:::0;;;;;;;:::o;42121:392::-;42364:14;42307:8;40595:15;40583:8;:27;;40575:58;;;;-1:-1:-1;;;40575:58:0;;;;;;;;;42335:9:::1;40750;-1:-1:-1::0;;;;;40739:32:0::1;;:34;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;40739:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;40739:34:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;40739:34:0;;;;;;;;;-1:-1:-1::0;;;;;40731:42:0::1;:4;-1:-1:-1::0;;;;;40731:42:0::1;;40709:111;;;;-1:-1:-1::0;;;40709:111:0::1;;;;;;;;;42402:4:::2;-1:-1:-1::0;;;;;42396:19:0::2;;42423:9;42396:39;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::2;2:2;42396:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;42396:39:0;;;;;42453:52;42459:9;42470:4;42476:9;42495:4;42502:2;42453:5;:52::i;52163:1371::-:0;52404:8;40595:15;40583:8;:27;;40575:58;;;;-1:-1:-1;;;40575:58:0;;;;;;;;;52425:18:::1;52446:25;52460:10;52446:13;:25::i;:::-;52425:46;;52482:20;52517:10;-1:-1:-1::0;;;;;52505:36:0::1;;:38;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;52505:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;52505:38:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;52505:38:0;;;;;;;;;52482:61;;52577:1;52562:12;:16;52554:51;;;;-1:-1:-1::0;;;52554:51:0::1;;;;;;;;;52616:20;52639:46;52680:4;52639:36;-1:-1:-1::0;;52640:16:0;;52662:12;52639:36:::1;:22;:36;:::i;:::-;:40:::0;:46:::1;:40;:46;:::i;:::-;52616:69;;52696:55;52704:10;52716:12;52730:8;52740:10;;52696:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;52696:7:0::1;::::0;-1:-1:-1;;;52696:55:0:i:1;:::-;52813:541;::::0;;::::1;::::0;::::1;::::0;;;52762:23:::1;::::0;52813:541;52853:29:::1;52813:541;;;;52913:10;-1:-1:-1::0;;;;;52813:541:0::1;;;;;52959:1;52813:541;;;;;;53018:301;;;;;;;;53081:10;-1:-1:-1::0;;;;;53018:301:0::1;;;;;53132:12;53018:301;;;;53185:12;53018:301;;;;53236:10;53018:301;;;;53285:10;53018:301;;::::0;52985:353:::1;;;;;;;;;;;::::0;;-1:-1:-1;;26:21;;::::1;22:32:::0;6:49;;52985:353:0;;;52813:541;;52788:577;::::1;::::0;;49:4:-1::1;52788:577:0;;;;;::::0;;-1:-1:-1;;26:21;;::::1;22:32:::0;6:49;;52788:577:0;;;;-1:-1:-1;;;53400:126:0;;52788:577;-1:-1:-1;;;;;;53400:35:0;::::1;::::0;::::1;::::0;:126:::1;::::0;53458:4:::1;::::0;53478:12;;52788:577;;53400:126:::1;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;53400:126:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;53400:126:0;;;;40644:1;;;;52163:1371:::0;;;;;;;;:::o;40433:43::-;;;:::o;63478:621::-;63604:18;63810:9;63873:7;63882:10;63856:37;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;63856:37:0;;;63846:48;;;;;;63733:313;;;;;;;;;;;;;;-1:-1:-1;;26:21;;;22:32;6:49;;63733:313:0;;;63701:364;;49:4:-1;63701:364:0;;;;;63478:621;-1:-1:-1;;63478:621:0:o;40483:38::-;;;:::o;58106:1072::-;58278:28;;:::i;:::-;58309:30;;;;58320:4;58309:30;;;58278:61;;58350:22;58375:36;58389:10;:21;;;58375:13;:36::i;:::-;58350:61;-1:-1:-1;;;;;;58535:23:0;;58553:4;58535:23;58527:64;;;;-1:-1:-1;;;58527:64:0;;;;;;;;;58610:10;-1:-1:-1;;;;;58610:28:0;;;58602:71;;;;-1:-1:-1;;;58602:71:0;;;;;;;;;58711:29;58688:19;;:52;;;;;;;;;58684:486;;;58757:34;;:::i;:::-;58823:10;:15;;;58794:105;;;;;;;;;;;;;;58757:142;;58914:230;58951:10;:21;;;58991:1;:10;;;59020:1;:14;;;59053:1;:14;;;59086:1;:12;;;59117:1;:12;;;58914:18;:230::i;58684:486::-;58106:1072;;;;;;:::o;40335:41::-;;;:::o;40383:43::-;;;:::o;44779:353::-;44969:8;40595:15;40583:8;:27;;40575:58;;;;-1:-1:-1;;;40575:58:0;;;;;;;;;44990:55:::1;45004:10;45016:6;45024:8;45034:10;44990:13;:55::i;:::-;45111:12;::::0;;45121:1:::1;45111:12:::0;;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;45056:68:0;;;-1:-1:-1;;;;;45056:30:0;::::1;::::0;::::1;::::0;:68:::1;::::0;45087:10:::1;::::0;45099:2;;45103:6;;45056:68;;;::::1;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;45056:68:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;45056:68:0;;;;44779:353:::0;;;;;;:::o;56532:1566::-;56750:28;;:::i;:::-;56781:30;;;;56792:4;56781:30;;;56750:61;;56822:22;56847:101;56875:10;:21;;;56911:10;:26;;;56847:13;:101::i;:::-;56822:126;-1:-1:-1;;;;;;57072:23:0;;57090:4;57072:23;57064:64;;;;-1:-1:-1;;;57064:64:0;;;;;;;;;57147:10;-1:-1:-1;;;;;57147:28:0;;;57139:71;;;;-1:-1:-1;;;57139:71:0;;;;;;;;;57248:31;57225:19;;:54;;;;;;;;;57221:869;;;57296:36;;:::i;:::-;57364:10;:15;;;57335:107;;;;;;;;;;;;;;57296:146;;57457:154;57496:10;:21;;;57536:1;:9;;;57564:1;:9;;;57592:1;:4;;;57457:20;:154::i;:::-;57221:869;;;;57656:16;57633:19;;:39;;;;;;;;;57629:461;;;57689:24;;:::i;:::-;57745:10;:15;;;57716:95;;;;;;;;;;;;;;57689:122;;57826:19;57848:39;57862:10;:21;;;57885:1;57848:13;:39::i;:::-;57952:10;;57981;;;;58010:14;;;;;58043:6;;;;57902:162;;-1:-1:-1;;;57902:162:0;;57826:61;;-1:-1:-1;;;;;;57902:31:0;;;;;:162;;57952:10;;57981;;58010:14;57902:162;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;57902:162:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;57902:162:0;;;;57629:461;;;;47880:738;48157:17;48176:19;48099:8;40595:15;40583:8;:27;;40575:58;;;;-1:-1:-1;;;40575:58:0;;;;;;;;;48127:10:::1;40750:9;-1:-1:-1::0;;;;;40739:32:0::1;;:34;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;40739:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;40739:34:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;40739:34:0;;;;;;;;;-1:-1:-1::0;;;;;40731:42:0::1;:4;-1:-1:-1::0;;;;;40731:42:0::1;;40709:111;;;;-1:-1:-1::0;;;40709:111:0::1;;;;;;;;;48225:45:::2;48238:10;48250:9;48261:8;48225:12;:45::i;:::-;48213:57;;48287:4;-1:-1:-1::0;;;;;48281:19:0::2;;48308:9;48281:39;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::2;2:2;48281:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;-1:-1:::0;;48338:43:0::2;::::0;-1:-1:-1;;;48338:43:0;;-1:-1:-1;;;;;48344:4:0::2;48338:20;::::0;-1:-1:-1;48338:20:0::2;::::0;-1:-1:-1;48338:43:0::2;::::0;-1:-1:-1;48359:10:0;;48371:9;;48338:43:::2;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::2;2:2;48338:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;48338:43:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;48338:43:0;;;;;;;;;48331:51;;;;48407:47;::::0;-1:-1:-1;;;48407:47:0;;-1:-1:-1;;;;;48407:33:0;::::2;::::0;::::2;::::0;:47:::2;::::0;48441:8;;48451:2;;48407:47:::2;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::2;2:2;48407:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;48407:47:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;48407:47:0;;;;;;;;;48393:61;;48521:9;48509;:21;48505:105;;;48545:65;48576:10;48600:9;48588;:21;48545:30;:65::i;:::-;40644:1:::1;47880:738:::0;;;;;;;;:::o;62743:727::-;62882:18;62934:1;62926:5;:9;;;62918:47;;;;-1:-1:-1;;;62918:47:0;;;;;;;;;63146:9;63209:7;63218:10;63230:5;63192:44;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;63192:44:0;;;63182:55;;;;;;63069:348;;;;;;;;;;;;;;-1:-1:-1;;26:21;;;22:32;6:49;;63069:348:0;;;63037:399;;49:4:-1;63037:399:0;;;;;62743:727;-1:-1:-1;;;62743:727:0:o;60476:1073::-;60695:15;60712;60741:16;60759;60796:13;-1:-1:-1;;;;;60781:55:0;;:57;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;60781:57:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;60781:57:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;60781:57:0;;;;;;;;;60740:98;-1:-1:-1;;;;;60740:98:0;;;-1:-1:-1;;;;;60740:98:0;;;60849:22;60874:42;60881:14;60897:8;60907;60874:6;:42::i;:::-;60849:67;;60949:14;60931;:32;60927:615;;61024:10;61006:14;:28;;60980:122;;;;-1:-1:-1;;;60980:122:0;;;;;;;;;61139:14;;-1:-1:-1;61155:14:0;-1:-1:-1;61155:14:0;60927:615;;;61203:22;61228:42;61235:14;61251:8;61261;61228:6;:42::i;:::-;61203:67;;61310:14;61292;:32;;61285:40;;;;61384:10;61366:14;:28;;61340:122;;;;-1:-1:-1;;;61340:122:0;;;;;;;;;61499:14;-1:-1:-1;61515:14:0;;-1:-1:-1;60927:615:0;60476:1073;;;;;;;;;;;:::o;59213:616::-;59383:17;;59379:35;;59407:7;;59379:35;59425:15;59442:7;59451:9;59462;59500:10;59475:92;;;;;;;;;;;;;;59424:143;;;;;;;;59578:13;59594:10;:33;;59621:6;59594:33;;;-1:-1:-1;;59594:33:0;59638:183;;-1:-1:-1;;;59638:183:0;;59578:49;;-1:-1:-1;;;;;;59638:28:0;;;;;:183;;59681:10;;59714:4;;59578:49;;59754:8;;59777:1;;59793;;59809;;59638:183;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;59638:183:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;59638:183:0;;;;59213:616;;;;;;;;;;:::o;1726:254::-;1839:12;;;1799;1839;;;;;;;;;-1:-1:-1;;;;;1817:7:0;;;1832:5;;1817:35;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;1798:54:0;;;1885:7;1863:109;;;;-1:-1:-1;;;1863:109:0;;;;;;;;;1726:254;;;:::o;45579:396::-;45718:14;45757:10;-1:-1:-1;;;;;45745:38:0;;:40;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;45745:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;45821:71:0;;-1:-1:-1;;;45821:71:0;;45796:22;;-1:-1:-1;;;;;;45821:37:0;;;-1:-1:-1;45821:37:0;;:71;;45873:8;;45821:71;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;45821:71:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45821:71:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;45821:71:0;;;;;;;;;45796:96;;45924:14;45912:9;:26;:55;;45953:14;45912:55;;;45941:9;45912:55;45903:64;45579:396;-1:-1:-1;;;;;45579:396:0:o;41274:426::-;41443:14;-1:-1:-1;;;;;41474:21:0;;41490:4;41474:21;41470:172;;;41510:53;41538:5;41545:9;41556:6;41510:27;:53::i;:::-;41470:172;;;41579:63;41611:5;41618:4;41624:9;41635:6;41579:31;:63::i;:::-;41662:30;;-1:-1:-1;;;41662:30:0;;-1:-1:-1;;;;;41662:26:0;;;;;:30;;41689:2;;41662:30;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;41662:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41662:30:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;41662:30:0;;;;;;;;1196:522;1421:12;1435:17;1456:5;-1:-1:-1;;;;;1456:10:0;1504;1516:4;1522:2;1526:5;1481:51;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;1481:51:0;;;;;;38:4:-1;29:7;25:18;67:10;61:17;-1:-1;;;;;199:8;192:4;186;182:15;179:29;167:10;160:49;0:215;;;1481:51:0;1456:87;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;1420:123:0;;;;1576:7;:57;;;;-1:-1:-1;1588:11:0;;:16;;:44;;;1619:4;1608:24;;;;;;;;;;;;;;1554:156;;;;-1:-1:-1;;;1554:156:0;;;;;;;;59837:631;60014:17;;60010:35;;60038:7;;60010:35;60056:15;60073:7;60082:9;60093;60131:10;60106:92;;;;;;;;;;;;;;60055:143;;;;;;;;60209:13;60225:10;:33;;60252:6;60225:33;;;-1:-1:-1;;60225:33:0;60269:191;;-1:-1:-1;;;60269:191:0;;60209:49;;-1:-1:-1;;;;;;60269:36:0;;;;;:191;;60320:10;;60353:4;;60209:49;;60393:8;;60416:1;;60432;;60448;;60269:191;;;;48661:1475;48817:19;48839:28;48853:10;48865:1;48839:13;:28::i;:::-;48817:50;;48906:24;48958:413;;;;;;;;48998:31;48958:413;;;;;;;;;;;;49060:10;-1:-1:-1;;;;;48958:413:0;;;;;49106:1;48958:413;;;;;;49165:171;;;;;;;;49229:7;49165:171;;;;49272:7;49165:171;;;;49310:2;-1:-1:-1;;;;;49165:171:0;;;;49132:223;;;;;;;;;;;;;-1:-1:-1;;26:21;;;22:32;6:49;;49132:223:0;;;48958:413;;48933:449;;;;49:4:-1;48933:449:0;;;;;;;-1:-1:-1;;26:21;;;22:32;6:49;;49476:456:0;;;;;;48933:449;-1:-1:-1;49424:24:0;;30:7:-1;49516:16:0;49476:456;;;;49563:10;-1:-1:-1;;;;;49476:456:0;;;;;49609:1;49476:456;;;;;;49668:229;;;;;;;;49721:10;-1:-1:-1;;;;;49668:229:0;;;;;49776:4;-1:-1:-1;;;;;49668:229:0;;;;;49822:7;49668:229;;;;49862:11;49668:229;;;49635:281;;;;;;;;;;;;;-1:-1:-1;;26:21;;;22:32;6:49;;49635:281:0;;;49476:456;;49451:492;;;;49:4:-1;49451:492:0;;;;;;;-1:-1:-1;;26:21;;;22:32;6:49;;49451:492:0;;;;-1:-1:-1;;;49985:143:0;;49451:492;-1:-1:-1;;;;;;49985:31:0;;;;;:143;;50031:10;;50064:4;;50084:7;;49451:492;;49985:143;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;49985:143:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;49985:143:0;;;;48661:1475;;;;;;;:::o;4853:471::-;4911:7;5156:6;5152:47;;-1:-1:-1;5186:1:0;5179:8;;5152:47;5223:5;;;5227:1;5223;:5;:1;5247:5;;;;;:10;5239:56;;;;-1:-1:-1;;;5239:56:0;;;;;;;;;5315:1;-1:-1:-1;4853:471:0;;;;;:::o;6545:132::-;6603:7;6630:39;6634:1;6637;6630:39;;;;;;;;;;;;;;;;;:3;:39::i;53542:1466::-;53796:18;53829:19;53863;53896:26;53911:10;53896:14;:26::i;:::-;53781:141;;;;;;53933:14;53962:11;-1:-1:-1;;;;;53950:35:0;;:37;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;53950:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53950:37:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;53950:37:0;;;;;;;;;53933:54;;53998:14;54027:11;-1:-1:-1;;;;;54015:35:0;;:37;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;54015:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;54015:37:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;54015:37:0;;;;;;;;;53998:54;;54063:21;54087:28;54104:10;54087:16;:28::i;:::-;54154:61;;-1:-1:-1;;;54154:61:0;;54063:52;;-1:-1:-1;;;;;;54154:35:0;;;;;:61;;54169:10;;54202:12;;54154:61;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;54154:61:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;54154:61:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;54154:61:0;;;;;;;;;;54308:24;54321:10;54308:12;:24::i;:::-;54304:88;;;54347:45;;-1:-1:-1;;;54347:45:0;;-1:-1:-1;;;;;54347:30:0;;;;;:45;;54378:13;;54347:45;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;54347:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;54347:45:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;54347:45:0;;;;;;;;;;54304:88;54404:18;54424;54461:13;-1:-1:-1;;;;;54446:48:0;;54503:4;54446:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;54446:63:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;54446:63:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;54446:63:0;;;;;;;;;54403:106;;;;54542:10;54528;:24;;54520:69;;;;-1:-1:-1;;;54520:69:0;;;;;;;;;54622:10;54608;:24;;54600:69;;;;-1:-1:-1;;;54600:69:0;;;;;;;;;54709:58;54725:11;54738:6;54746:8;54756:10;54709:15;:58::i;:::-;54778;54794:11;54807:6;54815:8;54825:10;54778:15;:58::i;:::-;54890:10;-1:-1:-1;;;;;54878:36:0;;54929:8;54952:10;54977:12;54878:122;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;54878:122:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;54878:122:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;54878:122:0;;;;;;;;51144:974;51326:18;51359:19;51393;51426:26;51441:10;51426:14;:26::i;:::-;51311:141;;;;;;51463:21;51487:28;51504:10;51487:16;:28::i;:::-;51463:52;;51568:140;51622:11;-1:-1:-1;;;;;51610:35:0;;:37;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;51610:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;51610:37:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;51610:37:0;;;;;;;;;51662:13;51690:7;51568:27;:140::i;:::-;51719;51773:11;-1:-1:-1;;;;;51761:35:0;;:37;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;51761:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;51761:37:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;51761:37:0;;;;;;;;;51813:13;51841:7;51719:27;:140::i;:::-;51900:24;51913:10;51900:12;:24::i;:::-;51896:89;;;51939:46;;-1:-1:-1;;;51939:46:0;;-1:-1:-1;;;;;51939:34:0;;;;;:46;;51974:10;;51939:46;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;51939:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;51939:46:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;51939:46:0;;;;;;;;;;51896:89;51996:43;;-1:-1:-1;;;51996:43:0;;-1:-1:-1;;;;;51996:31:0;;;;;:43;;52028:10;;51996:43;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;51996:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;51996:43:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;51996:43:0;;;;;;;;;-1:-1:-1;52078:32:0;;-1:-1:-1;;;52078:32:0;;-1:-1:-1;;;;;52078:28:0;;;;;:32;;52107:2;;52078:32;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;52078:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;52078:32:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;52078:32:0;;;;;;;;;;51144:974;;;;;;;;:::o;61662:391::-;61788:15;61834:1;61824:7;:11;61816:54;;;;-1:-1:-1;;;61816:54:0;;;;;;;;;61914:1;61903:8;:12;:28;;;;;61930:1;61919:8;:12;61903:28;61881:111;;;;-1:-1:-1;;;61881:111:0;;;;;;;;;62037:8;62013:21;:7;62025:8;62013:21;:11;:21;:::i;:::-;:32;;;;;;;61662:391;-1:-1:-1;;;;61662:391:0:o;715:473::-;901:12;915:17;936:5;-1:-1:-1;;;;;936:10:0;984;996:2;1000:5;961:45;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;961:45:0;;;;;;38:4:-1;29:7;25:18;67:10;61:17;-1:-1;;;;;199:8;192:4;186;182:15;179:29;167:10;160:49;0:215;;;961:45:0;936:81;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;900:117:0;;;;1050:7;:57;;;;-1:-1:-1;1062:11:0;;:16;;:44;;;1093:4;1082:24;;;;;;;;;;;;;;1028:152;;;;-1:-1:-1;;;1028:152:0;;;;;;;;;715:473;;;;;:::o;7165:379::-;7285:7;7387:12;7380:5;7372:28;;;;-1:-1:-1;;;7372:28:0;;;;;;;;;;;7411:9;7427:1;7423;:5;;;;;;;7165:379;-1:-1:-1;;;;;7165:379:0:o;55016:768::-;55201:14;55218:45;55231:10;55243:9;55254:8;55218:12;:45::i;:::-;55201:62;;55274:54;55302:5;55309:10;55321:6;55274:27;:54::i;:::-;55395:12;;;55388:1;55395:12;;;;;;;;;;-1:-1:-1;;;55339:69:0;;;-1:-1:-1;;;;;55339:30:0;;;;;:69;;55370:8;;55388:1;;55339:69;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;55339:69:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;55339:69:0;;;;55461:6;55449:9;:18;55445:332;;;55484:20;55519:6;55507:9;:18;55484:41;;55553:4;-1:-1:-1;;;;;55544:13:0;:5;-1:-1:-1;;;;;55544:13:0;;55540:225;;;55578:34;;-1:-1:-1;;;55578:34:0;;-1:-1:-1;;;;;55584:4:0;55578:20;;;;:34;;55599:12;;55578:34;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;55578:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;55578:34:0;;;;55631:54;55662:8;55672:12;55631:30;:54::i;:::-;55540:225;;;55707:58;55735:5;55742:8;55752:12;55707:27;:58::i;40250:24267::-;;;;;;;;;;;-1:-1:-1;40250:24267:0;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;-1:-1:-1;;;;;40250:24267:0;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;40250:24267:0;;;;;:::o;:::-;;;;;;;;;-1:-1:-1;40250:24267:0;;;;;;;;;;;;;;;;;;;;;;:::o;5:130:-1:-;72:20;;97:33;72:20;97:33;;573:336;;;687:3;680:4;672:6;668:17;664:27;654:2;;-1:-1;;695:12;654:2;-1:-1;725:20;;765:18;754:30;;751:2;;;-1:-1;;787:12;751:2;831:4;823:6;819:17;807:29;;882:3;831:4;862:17;823:6;848:32;;845:41;842:2;;;899:1;;889:12;842:2;647:262;;;;;;918:440;;1019:3;1012:4;1004:6;1000:17;996:27;986:2;;-1:-1;;1027:12;986:2;1074:6;1061:20;1096:64;1111:48;1152:6;1111:48;;;1096:64;;;1087:73;;1180:6;1173:5;1166:21;1284:3;1216:4;1275:6;1208;1266:16;;1263:25;1260:2;;;1301:1;;1291:12;1260:2;54476:6;1216:4;1208:6;1204:17;1216:4;1242:5;1238:16;54453:30;54532:1;54514:16;;;1216:4;54514:16;54507:27;1242:5;979:379;-1:-1;;979:379;6237:126;6302:20;;6327:31;6302:20;6327:31;;6507:241;;6611:2;6599:9;6590:7;6586:23;6582:32;6579:2;;;-1:-1;;6617:12;6579:2;85:6;72:20;97:33;124:5;97:33;;6755:263;;6870:2;6858:9;6849:7;6845:23;6841:32;6838:2;;;-1:-1;;6876:12;6838:2;226:6;220:13;238:33;265:5;238:33;;7025:617;;;;;7180:3;7168:9;7159:7;7155:23;7151:33;7148:2;;;-1:-1;;7187:12;7148:2;85:6;72:20;97:33;124:5;97:33;;;7239:63;-1:-1;7339:2;7378:22;;72:20;97:33;72:20;97:33;;;7347:63;-1:-1;7447:2;7486:22;;72:20;97:33;72:20;97:33;;;7142:500;;;;-1:-1;7455:63;;7555:2;7594:22;5887:20;;-1:-1;;7142:500;7649:491;;;;7787:2;7775:9;7766:7;7762:23;7758:32;7755:2;;;-1:-1;;7793:12;7755:2;85:6;72:20;97:33;124:5;97:33;;;7845:63;-1:-1;7945:2;7984:22;;72:20;97:33;72:20;97:33;;;7749:391;;7953:63;;-1:-1;;;8053:2;8092:22;;;;5887:20;;7749:391;8147:741;;;;;;8321:3;8309:9;8300:7;8296:23;8292:33;8289:2;;;-1:-1;;8328:12;8289:2;85:6;72:20;97:33;124:5;97:33;;;8380:63;-1:-1;8480:2;8519:22;;72:20;97:33;72:20;97:33;;;8488:63;-1:-1;8588:2;8627:22;;5887:20;;-1:-1;8724:2;8709:18;;8696:32;8748:18;8737:30;;8734:2;;;-1:-1;;8770:12;8734:2;8808:64;8864:7;8855:6;8844:9;8840:22;8808:64;;;8283:605;;;;-1:-1;8283:605;;-1:-1;8798:74;;;8283:605;-1:-1;;;8283:605;8895:743;;;;;;9067:3;9055:9;9046:7;9042:23;9038:33;9035:2;;;-1:-1;;9074:12;9035:2;85:6;72:20;97:33;124:5;97:33;;;9126:63;-1:-1;9226:2;9265:22;;5887:20;;-1:-1;9334:2;9373:22;;72:20;97:33;72:20;97:33;;;9342:63;-1:-1;9442:2;9481:22;;72:20;97:33;72:20;97:33;;;9029:609;;;;-1:-1;9029:609;;9550:3;9590:22;5887:20;;9029:609;-1:-1;;9029:609;9645:617;;;;;9800:3;9788:9;9779:7;9775:23;9771:33;9768:2;;;-1:-1;;9807:12;9768:2;85:6;72:20;97:33;124:5;97:33;;;9859:63;-1:-1;9959:2;9998:22;;5887:20;;-1:-1;10067:2;10106:22;;72:20;97:33;72:20;97:33;;10269:867;;;;;;;10460:3;10448:9;10439:7;10435:23;10431:33;10428:2;;;-1:-1;;10467:12;10428:2;85:6;72:20;97:33;124:5;97:33;;;10519:63;-1:-1;10619:2;10658:22;;5887:20;;-1:-1;10727:2;10766:22;;72:20;97:33;72:20;97:33;;;10735:63;-1:-1;10835:2;10874:22;;5887:20;;-1:-1;10971:3;10956:19;;10943:33;10996:18;10985:30;;10982:2;;;-1:-1;;11018:12;10982:2;11056:64;11112:7;11103:6;11092:9;11088:22;11056:64;;;10422:714;;;;-1:-1;10422:714;;-1:-1;10422:714;;11046:74;;10422:714;-1:-1;;;10422:714;11143:847;;;;;;11324:3;11312:9;11303:7;11299:23;11295:33;11292:2;;;-1:-1;;11331:12;11292:2;85:6;72:20;97:33;124:5;97:33;;;11383:63;-1:-1;11483:2;11522:22;;5887:20;;-1:-1;11591:2;11630:22;;72:20;97:33;72:20;97:33;;;11599:63;-1:-1;11699:2;11738:22;;5887:20;;-1:-1;11835:3;11820:19;;11807:33;11860:18;11849:30;;11846:2;;;-1:-1;;11882:12;11846:2;11912:62;11966:7;11957:6;11946:9;11942:22;11912:62;;;11902:72;;;11286:704;;;;;;;;;11997:615;;;;;12154:2;12142:9;12133:7;12129:23;12125:32;12122:2;;;-1:-1;;12160:12;12122:2;85:6;72:20;97:33;124:5;97:33;;;12212:63;-1:-1;12312:2;12351:22;;5887:20;;-1:-1;12448:2;12433:18;;12420:32;12472:18;12461:30;;12458:2;;;-1:-1;;12494:12;12458:2;12532:64;12588:7;12579:6;12568:9;12564:22;12532:64;;;12116:496;;;;-1:-1;12522:74;-1:-1;;;;12116:496;12619:743;;;;;;12791:3;12779:9;12770:7;12766:23;12762:33;12759:2;;;-1:-1;;12798:12;12759:2;85:6;72:20;97:33;124:5;97:33;;;12850:63;12950:2;12989:22;;5887:20;;-1:-1;13058:2;13097:22;;5887:20;;13166:2;13205:22;;5887:20;;-1:-1;13274:3;13314:22;5887:20;;-1:-1;12753:609;-1:-1;;;12753:609;13369:1497;;;;;;;;;;;;13648:3;13636:9;13627:7;13623:23;13619:33;13616:2;;;-1:-1;;13655:12;13616:2;97:33;85:6;72:20;97:33;;;85:6;72:20;13707:63;;13807:2;13850:9;13846:22;5887:20;13815:63;;13915:2;13958:9;13954:22;5887:20;13923:63;;14023:2;14066:9;14062:22;5887:20;14031:63;;14131:3;14175:9;14171:22;5887:20;14140:63;;97:33;14240:3;14284:9;14280:22;72:20;97:33;;;14240:3;14284:9;14280:22;72:20;14249:63;;14349:3;14393:9;14389:22;5887:20;14358:63;;14511:18;;14486:3;14475:9;14471:19;14458:33;14500:30;14497:2;;;-1:-1;;14533:12;14497:2;14571:64;14627:7;14486:3;14475:9;14471:19;14458:33;14607:9;14603:22;14571:64;;;14561:74;;-1:-1;14561:74;-1:-1;14700:3;14685:19;;14672:33;14714:30;-1:-1;14711:2;;;-1:-1;;14747:12;14711:2;;14786:64;14842:7;14700:3;14689:9;14685:19;14672:33;14822:9;14818:22;14786:64;;;14775:75;;;;;;;;13610:1256;;;;;;;;;;;;;;;14873:993;;;;;;;;15081:3;15069:9;15060:7;15056:23;15052:33;15049:2;;;-1:-1;;15088:12;15049:2;85:6;72:20;97:33;124:5;97:33;;;15140:63;-1:-1;15240:2;15279:22;;5887:20;;-1:-1;15348:2;15387:22;;5887:20;;-1:-1;15456:2;15495:22;;5887:20;;-1:-1;15564:3;15604:22;;5887:20;;-1:-1;15701:3;15686:19;;15673:33;15726:18;15715:30;;15712:2;;;-1:-1;;15748:12;15712:2;15786:64;15842:7;15833:6;15822:9;15818:22;15786:64;;;15043:823;;;;-1:-1;15043:823;;-1:-1;15043:823;;;;15776:74;;-1:-1;;;15043:823;15873:362;;;15992:2;15980:9;15971:7;15967:23;15963:32;15960:2;;;-1:-1;;15998:12;15960:2;85:6;72:20;97:33;124:5;97:33;;;16050:63;-1:-1;16150:2;16187:22;;6302:20;6327:31;6302:20;6327:31;;;16158:61;;;;15954:281;;;;;;16242:257;;16354:2;16342:9;16333:7;16329:23;16325:32;16322:2;;;-1:-1;;16360:12;16322:2;364:6;358:13;55826:5;53003:13;52996:21;55804:5;55801:32;55791:2;;-1:-1;;55837:12;16506:662;;;;;16667:3;16655:9;16646:7;16642:23;16638:33;16635:2;;;-1:-1;;16674:12;16635:2;364:6;358:13;55826:5;53003:13;52996:21;55804:5;55801:32;55791:2;;-1:-1;;55837:12;55791:2;16834;16882:22;;6446:13;16726:71;;-1:-1;6464:31;6446:13;6464:31;;;16951:2;17001:22;;496:13;17070:2;17120:22;;;496:13;16629:539;;16842:72;;-1:-1;16629:539;-1:-1;;;16629:539;17175:353;;17335:2;17323:9;17314:7;17310:23;17306:32;17303:2;;;-1:-1;;17341:12;17303:2;2211:20;17335:2;2211:20;;;6041:6;6035:13;2298:16;2291:86;2441:2;2510:9;2506:22;6035:13;2441:2;2460:5;2456:16;2449:86;2594:2;2663:9;2659:22;220:13;238:33;265:5;238:33;;;2594:2;2609:16;;2602:86;2613:5;17297:231;-1:-1;;;17297:231;17535:408;;17683:2;;17671:9;17662:7;17658:23;17654:32;17651:2;;;-1:-1;;17689:12;17651:2;17740:17;17734:24;17778:18;;17770:6;17767:30;17764:2;;;-1:-1;;17800:12;17764:2;17910:6;17899:9;17895:22;2887:4;2875:9;2870:3;2866:19;2862:30;2859:2;;;-1:-1;;2895:12;2859:2;2923:20;2887:4;2923:20;;;2914:29;;226:6;220:13;238:33;265:5;238:33;;;3004:86;;3220:22;;;220:13;238:33;220:13;238:33;;;3170:16;;;3163:86;3318:2;3383:22;;;6035:13;3333:16;;;3326:86;3494:2;3479:18;;3473:25;3507:30;;;3504:2;;;-1:-1;;3540:12;3504:2;3626:22;;-1:-1;1472:4;1460:17;;1456:27;-1:-1;1446:2;;-1:-1;;1487:12;1446:2;1527:6;1521:13;1549:64;1564:48;1605:6;1564:48;;1549:64;1633:6;1626:5;1619:21;1737:3;17683:2;1728:6;1661;1719:16;;1716:25;1713:2;;;-1:-1;;1744:12;1713:2;1764:39;1796:6;17683:2;1695:5;1691:16;17683:2;1661:6;1657:17;1764:39;;;3494:2;3567:16;;3560:95;-1:-1;3571:5;;17645:298;-1:-1;;;;;17645:298;17950:383;;18082:2;18070:9;18061:7;18057:23;18053:32;18050:2;;;-1:-1;;18088:12;18050:2;18146:17;18133:31;18184:18;;18176:6;18173:30;18170:2;;;-1:-1;;18206:12;18170:2;18300:6;18289:9;18285:22;3833:4;3821:9;3816:3;3812:19;3808:30;3805:2;;;-1:-1;;3841:12;3805:2;3869:20;3833:4;3869:20;;;3860:29;;1910:6;1897:20;56069:1;56062:5;56059:12;56049:2;;-1:-1;;56075:12;56049:2;3950:88;;4138:49;4183:3;18082:2;4159:22;;4138:49;;;18082:2;4124:5;4120:16;4113:75;4293:47;4336:3;4260:2;4316:9;4312:22;4293:47;;;4260:2;4279:5;4275:16;4268:73;4430:2;4419:9;4415:18;4402:32;18184:18;4446:6;4443:30;4440:2;;;-1:-1;;4476:12;4440:2;4521:58;4575:3;4566:6;4555:9;4551:22;4521:58;;;4430:2;4503:16;;4496:84;-1:-1;4507:5;;18044:289;-1:-1;;;;;18044:289;18340:350;;18498:3;18486:9;18477:7;18473:23;18469:33;18466:2;;;-1:-1;;18505:12;18466:2;4835:20;18498:3;4835:20;;;226:6;220:13;238:33;265:5;238:33;;;4941:60;4923:16;4916:86;;5071:2;5140:9;5136:22;6035:13;5071:2;5090:5;5086:16;5079:86;5234:2;5303:9;5299:22;6035:13;5234:2;5253:5;5249:16;5242:86;5395:2;5464:9;5460:22;6035:13;5395:2;5414:5;5410:16;5403:86;5556:3;5626:9;5622:22;6035:13;5556:3;5576:5;5572:16;5565:86;18557:117;;;;18460:230;;;;;18697:533;;;;18845:2;18833:9;18824:7;18820:23;18816:32;18813:2;;;-1:-1;;18851:12;18813:2;5763:6;5757:13;5775:33;5802:5;5775:33;;;19014:2;19064:22;;5757:13;18903:74;;-1:-1;5775:33;5757:13;5775:33;;;19133:2;19182:22;;6175:13;19022:74;;-1:-1;53642:10;53631:22;;56407:34;;56397:2;;-1:-1;;56445:12;56397:2;19141:73;;;;18807:423;;;;;;19237:263;;19352:2;19340:9;19331:7;19327:23;19323:32;19320:2;;;-1:-1;;19358:12;19320:2;-1:-1;6035:13;;19314:186;-1:-1;19314:186;19507:399;;;19639:2;19627:9;19618:7;19614:23;19610:32;19607:2;;;-1:-1;;19645:12;19607:2;-1:-1;;6035:13;;19808:2;19858:22;;;6035:13;;;;;-1:-1;19601:305;20841:323;;20973:5;51858:12;52133:6;52128:3;52121:19;21056:52;21101:6;52170:4;52165:3;52161:14;52170:4;21082:5;21078:16;21056:52;;;55283:7;55267:14;-1:-1;;55263:28;21120:39;;;;52170:4;21120:39;;20921:243;-1:-1;;20921:243;33169:383;-1:-1;;;;;;55482:2;55478:14;;;;;20381:58;;55478:14;;;;;33413:2;33404:12;;20381:58;33515:12;;;33304:248;33559:513;55482:2;55478:14;;;-1:-1;;;;;;55478:14;;;20381:58;;55478:14;;;;;;;33827:2;33818:12;;20381:58;55375:15;;-1:-1;;;;;;55375:15;33929:12;;;33103:54;34036:11;;;33718:354;34079:262;;21681:5;51858:12;21792:52;21837:6;21832:3;21825:4;21818:5;21814:16;21792:52;;;21856:16;;;;;34204:137;-1:-1;;34204:137;34348:917;-1:-1;;;;;;24263:87;;55482:2;55478:14;;;;-1:-1;;;;;;55478:14;24248:1;24369:11;;20381:58;34951:12;;;20633:37;26115:66;35062:12;;;26095:87;26201:12;;;34685:580;35272:917;-1:-1;;;;;;24263:87;;55482:2;55478:14;;;;-1:-1;;;;;;55478:14;24248:1;24369:11;;20381:58;35875:12;;;20633:37;28273:66;35986:12;;;28253:87;28359:12;;;35609:580;36196:213;-1:-1;;;;;53425:54;;;;20123:37;;36314:2;36299:18;;36285:124;36652:663;-1:-1;;;;;53425:54;;;19992:58;;53425:54;;37069:2;37054:18;;19992:58;37152:2;37137:18;;20633:37;;;36888:3;37189:2;37174:18;;37167:48;;;36652:663;;37229:76;;36873:19;;37291:6;37229:76;;37322:907;-1:-1;;;;;53425:54;;;19992:58;;53425:54;;;;37801:2;37786:18;;19992:58;37884:2;37869:18;;20633:37;;;;37967:2;37952:18;;20633:37;;;;53736:4;53725:16;38046:3;38031:19;;32857:35;55478:14;38115:19;;20633:37;38214:3;38199:19;;20633:37;;;;37620:3;37605:19;;37591:638;38236:451;-1:-1;;;;;53425:54;;;19992:58;;53425:54;;;;38590:2;38575:18;;20123:37;38673:2;38658:18;;20633:37;;;;38418:2;38403:18;;38389:298;39348:535;;765:18;;55478:14;;;53429:5;53425:54;19999:3;19992:58;20663:5;39720:2;39709:9;39705:18;20633:37;39548:2;39757;39746:9;39742:18;39735:48;39797:76;39548:2;39537:9;39533:18;39859:6;39797:76;;39890:324;-1:-1;;;;;53425:54;;;20123:37;;53425:54;;40200:2;40185:18;;20123:37;40036:2;40021:18;;40007:207;40891:435;-1:-1;;;;;53425:54;;;20123:37;;53425:54;;;41229:2;41214:18;;20123:37;53425:54;;;41312:2;41297:18;;20123:37;41065:2;41050:18;;41036:290;42413:324;-1:-1;;;;;53425:54;;;;20123:37;;42723:2;42708:18;;20633:37;42559:2;42544:18;;42530:207;42744:201;53003:13;;52996:21;20516:34;;42856:2;42841:18;;42827:118;42952:301;;43090:2;43111:17;43104:47;43165:78;43090:2;43079:9;43075:18;43229:6;43165:78;;43260:407;43451:2;43465:47;;;22757:2;43436:18;;;52121:19;22793:34;52161:14;;;22773:55;-1:-1;;;22848:12;;;22841:41;22901:12;;;43422:245;43674:407;43865:2;43879:47;;;23152:2;43850:18;;;52121:19;23188:34;52161:14;;;23168:55;-1:-1;;;23243:12;;;23236:44;23299:12;;;43836:245;44088:407;44279:2;44293:47;;;23550:2;44264:18;;;52121:19;23586:27;52161:14;;;23566:48;23633:12;;;44250:245;44502:407;44693:2;44707:47;;;23884:2;44678:18;;;52121:19;-1:-1;;;52161:14;;;23900:42;23961:12;;;44664:245;44916:407;45107:2;45121:47;;;24619:2;45092:18;;;52121:19;24655:34;52161:14;;;24635:55;-1:-1;;;24710:12;;;24703:25;24747:12;;;45078:245;45330:407;45521:2;45535:47;;;24998:2;45506:18;;;52121:19;-1:-1;;;52161:14;;;25014:41;25074:12;;;45492:245;45744:407;45935:2;45949:47;;;25325:2;45920:18;;;52121:19;25361:32;52161:14;;;25341:53;25413:12;;;45906:245;46158:407;46349:2;46363:47;;;25664:2;46334:18;;;52121:19;25700:34;52161:14;;;25680:55;-1:-1;;;25755:12;;;25748:25;25792:12;;;46320:245;46572:407;46763:2;46777:47;;;46748:18;;;52121:19;26488:34;52161:14;;;26468:55;26542:12;;;46734:245;46986:407;47177:2;47191:47;;;26793:2;47162:18;;;52121:19;26829:30;52161:14;;;26809:51;26879:12;;;47148:245;47400:407;47591:2;47605:47;;;47576:18;;;52121:19;27166:34;52161:14;;;27146:55;27220:12;;;47562:245;47814:407;48005:2;48019:47;;;27471:2;47990:18;;;52121:19;27507:32;52161:14;;;27487:53;27559:12;;;47976:245;48228:407;48419:2;48433:47;;;27810:2;48404:18;;;52121:19;27846:34;52161:14;;;27826:55;-1:-1;;;27901:12;;;27894:37;27950:12;;;48390:245;48642:407;48833:2;48847:47;;;28610:2;48818:18;;;52121:19;-1:-1;;;52161:14;;;28626:45;28690:12;;;48804:245;49056:393;29065:23;;20633:37;;29239:4;29228:16;;;29222:23;29299:14;;;20633:37;29391:4;29380:16;;;29374:23;-1:-1;;;;;53425:54;29451:14;;;20123:37;;;;49264:2;49249:18;;49235:214;49456:393;;49640:2;49661:17;49654:47;765:18;;55478:14;;;53436:42;29810:16;29804:23;53425:54;49640:2;49629:9;49625:18;20123:37;53436:42;49640:2;29972:5;29968:16;29962:23;53425:54;30039:14;49629:9;30039:14;20123:37;;30039:14;30134:5;30130:16;30124:23;30201:14;49629:9;30201:14;20633:37;30201:14;30288:5;30284:16;30278:23;29734:4;;49629:9;30321:14;30314:38;30367:71;29725:14;49629:9;29725:14;30419:12;30367:71;;;49707:132;49611:238;-1:-1;;;;49611:238;49856:373;;50030:2;50051:17;50044:47;30779:16;30773:23;55592:1;55585:5;55582:12;55572:2;;55598:9;55572:2;53979:37;50030:2;50019:9;50015:18;21956:61;;765:18;;55478:14;;;50030:2;30954:5;30950:16;30944:23;53425:54;31021:14;50019:9;31021:14;20123:37;53736:4;31021:14;31119:5;31115:16;31109:23;53725:16;31182:14;50019:9;31182:14;32857:35;31182:14;31269:5;31265:16;31259:23;30703:4;;50019:9;31302:14;31295:38;31348:71;30694:14;50019:9;30694:14;31400:12;31348:71;;50236:386;31806:23;;-1:-1;;;;;53425:54;20123:37;;31985:4;31974:16;;;31968:23;32045:14;;;20633:37;32147:4;32136:16;;;32130:23;32207:14;;;20633:37;32307:4;32296:16;;;32290:23;32367:14;;;20633:37;32467:4;32456:16;;;32450:23;32527:14;;;20633:37;;;;50440:3;50425:19;;50411:211;50629:213;20633:37;;;50747:2;50732:18;;50718:124;50849:324;20633:37;;;51159:2;51144:18;;20633:37;50995:2;50980:18;;50966:207;51180:256;51242:2;51236:9;51268:17;;;51343:18;51328:34;;51364:22;;;51325:62;51322:2;;;51400:1;;51390:12;51322:2;51242;51409:22;51220:216;;-1:-1;51220:216;51443:321;;51586:18;51578:6;51575:30;51572:2;;;-1:-1;;51608:12;51572:2;-1:-1;55283:7;51662:17;-1:-1;;51658:33;51749:4;51739:15;;51509:255;54549:268;54614:1;54621:101;54635:6;54632:1;54629:13;54621:101;;;54702:11;;;54696:18;54683:11;;;54676:39;54657:2;54650:10;54621:101;;;54737:6;54734:1;54731:13;54728:2;;;-1:-1;;54614:1;54784:16;;54777:27;54598:219;55621:117;-1:-1;;;;;53425:54;;55680:35;;55670:2;;55729:1;;55719:12;55670:2;55664:74;;56101:117;-1:-1;;;;;56188:5;53309:42;56163:5;56160:35;56150:2;;56209:1;;56199:12;56471:113;53736:4;56554:5;53725:16;56531:5;56528:33;56518:2;;56575:1;;56565:12

Swarm Source

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