Contract 0x2dA2409cDf11C607375AC9A43c18faB2152b5884

Txn Hash Method
Block
From
To
Value [Txn Fee]
0xa48166aaf03a84cd585af134c50784ca3979e4f8a87e6e049b2efa228634d819Zap In196882322022-09-08 18:27:2122 days 8 hrs ago0x05e5ab383f3c2d423cfd118b83420261ab0990bc IN  0x2da2409cdf11c607375ac9a43c18fab2152b58840 AVAX0.01357854304 26.41
0x86620f2a10e94050098489f9ff41aaf90f934853ce3c89b076ab3a16e816e83cZap In196526672022-09-07 20:54:3123 days 5 hrs ago0xc48f95eb1e739ac91075d5772194e37d5fc65764 IN  0x2da2409cdf11c607375ac9a43c18fab2152b58840 AVAX0.0140744415 26.5
0xaeea778f5d04a9a5993fbc7d878bd44c725255e5da80a2dde7fa6ccc1a39b37dZap In AVAX192391702022-08-28 18:03:4533 days 8 hrs ago0x74b2a9c92f8d0644c253cf300449a4f5176c7ea1 IN  0x2da2409cdf11c607375ac9a43c18fab2152b58840.505062076595697 AVAX0.013832894 26.5
0x502d179ed6d50c68388571ade3fbca902192610f4e3c191f5fc14a3ca0a11a03Zap In188763312022-08-20 6:11:0441 days 20 hrs ago0xcad9b3fe59edb87a33f74a33d35d2fc35d18e5a6 IN  0x2da2409cdf11c607375ac9a43c18fab2152b58840 AVAX0.0140750775 26.5
0xc493a64f81865b79f7b68aab78b9508213d398ebfe7e1fb4ad57e592ed108da0Zap In188762022022-08-20 6:06:4641 days 20 hrs ago0xcad9b3fe59edb87a33f74a33d35d2fc35d18e5a6 IN  0x2da2409cdf11c607375ac9a43c18fab2152b58840 AVAX0.0134008115 26.5
0x1e9d0d4a028ec15120e7f1f216b0db55034a90524a9501fc463d3c259e0387fdZap In187672812022-08-17 16:24:1044 days 10 hrs ago0x702816268ad970c41edc3f880e4b657b9dec0acd IN  0x2da2409cdf11c607375ac9a43c18fab2152b58840 AVAX0.0133283075 26.5
0x990a951e392c12586087e425272806f294415f13d21d27c87b63038105b6893dZap In186804312022-08-15 15:22:1446 days 11 hrs ago0x6fe797a05359c9d91b1f85d418e2ed4ea6c65a8f IN  0x2da2409cdf11c607375ac9a43c18fab2152b58840 AVAX0.013625611 26.5
0xa81ec91d85aad86353fb53b53b8b3de6074427876ab6851f8eb6e1bf7537bb81Zap In185248682022-08-12 0:16:1250 days 2 hrs ago0x6fe797a05359c9d91b1f85d418e2ed4ea6c65a8f IN  0x2da2409cdf11c607375ac9a43c18fab2152b58840 AVAX0.0140797415 26.5
0xe63affb085b8acb3cec7d7045145877e83cdc4cde5e73e9c55ac113c7b05c7d4Zap In185220782022-08-11 22:42:5250 days 4 hrs ago0x05e5ab383f3c2d423cfd118b83420261ab0990bc IN  0x2da2409cdf11c607375ac9a43c18fab2152b58840 AVAX0.01358142173 26.41
0x56e37a16dcd002bb15cbd35e5e899013c5d6b6266a1f2626dc52f7c1c8975d28Zap In184785002022-08-10 22:22:4151 days 4 hrs ago0x6fe797a05359c9d91b1f85d418e2ed4ea6c65a8f IN  0x2da2409cdf11c607375ac9a43c18fab2152b58840 AVAX0.0144593275 26.5
0x6f6cf698f4d82a1043de9128eac101ac958c4109726e1fbcbd016d3759e81be4Zap In183803432022-08-08 15:28:3453 days 11 hrs ago0x702816268ad970c41edc3f880e4b657b9dec0acd IN  0x2da2409cdf11c607375ac9a43c18fab2152b58840 AVAX0.0136268035 26.5
0xfda53f5d572ce6610f8789d61b3b7c3f0d8afcfff99435cb8f2d907d41f64b20Zap In AVAX183589552022-08-08 3:34:0453 days 23 hrs ago0x28cd7cd5450574d79646d8b2654a5144de8366a3 IN  0x2da2409cdf11c607375ac9a43c18fab2152b58842.1 AVAX0.0152314845 26.5
0xa4c71819094e7be0bbe352c3fade8cd070e0e0bb02509bc6768ce81e9b81e0e5Zap In AVAX180871552022-08-01 18:37:1460 days 8 hrs ago0x594e7eb84465eb1356bfa955f25512ba193cffee IN  0x2da2409cdf11c607375ac9a43c18fab2152b58849.076923453852964 AVAX0.01427212246 26.41
0x0a16c585f42b6efd8a6247763c11cd7d541afa53f1b8ab0b6f4d083937b55173Zap In180390912022-07-31 14:59:5061 days 11 hrs ago0x5fb1135b942a326b28052c49586c50b712630549 IN  0x2da2409cdf11c607375ac9a43c18fab2152b58840 AVAX0.0146498095 26.5
0x3150c6255034193856f3213261ff72f530920ab449e30b4ef2d2a08bd15a893cZap In179567032022-07-29 15:34:3163 days 11 hrs ago0x05e5ab383f3c2d423cfd118b83420261ab0990bc IN  0x2da2409cdf11c607375ac9a43c18fab2152b58840 AVAX0.013814918 26
0x85f224ec6c82de751fb5815cbecde2cade101b8155a218b75d759c6f5684edb2Zap In172881202022-07-13 21:07:1479 days 5 hrs ago0x702816268ad970c41edc3f880e4b657b9dec0acd IN  0x2da2409cdf11c607375ac9a43c18fab2152b58840 AVAX0.013628897 26.5
0x37c04a8e366aa4f68f4800539b08b2f20629518cc79cc3441ce5e25f38961d4aZap In172880332022-07-13 21:04:1979 days 5 hrs ago0x702816268ad970c41edc3f880e4b657b9dec0acd IN  0x2da2409cdf11c607375ac9a43c18fab2152b58840 AVAX0.013627148 26.5
0xe1e866da236b8b2c52ad05f2f16786ef963b615d8b5c93e74e1d829ee519879fZap In170186722022-07-07 14:18:4485 days 12 hrs ago0x702816268ad970c41edc3f880e4b657b9dec0acd IN  0x2da2409cdf11c607375ac9a43c18fab2152b58840 AVAX0.0027816785 26.5
0x83d09faf560fa4443773a8c62e2c8050dd89067384c3977c94a142dde15b7b6eZap In169370892022-07-05 16:50:0987 days 10 hrs ago0xb02772fbf7c77a6eabd05d769aa045079f0db1a3 IN  0x2da2409cdf11c607375ac9a43c18fab2152b58840 AVAX0.014825213 26.5
0xa9768127aad7014b7a73c3edb932210be02b2454a76457e29f2a9e83b8e704f4Zap In165003212022-06-25 13:30:5497 days 13 hrs ago0xc48f95eb1e739ac91075d5772194e37d5fc65764 IN  0x2da2409cdf11c607375ac9a43c18fab2152b58840 AVAX0.0140802185 26.5
0x03446f9ded9ea4f560b0394fed7764015ad2da6364f9d3ae0670fd86876ac7c1Zap In163659062022-06-22 10:54:35100 days 15 hrs ago0x53ea7731a71d662f0419a92f0f8ac7f8142f4ca2 IN  0x2da2409cdf11c607375ac9a43c18fab2152b58840 AVAX0.0134008115 26.5
0x3fc7499b379e24abb3d3c489917964529269b04363324772cfff2663dcd2e44aZap In163379062022-06-21 19:21:06101 days 7 hrs ago0x05e5ab383f3c2d423cfd118b83420261ab0990bc IN  0x2da2409cdf11c607375ac9a43c18fab2152b58840 AVAX0.073328646 138
0x891514dafa8921a3ca484496d679c2777fc82afae228d7226b71b7c51aa9d6ddZap In162523182022-06-19 19:47:48103 days 7 hrs ago0x86a69e4fa797262e9cb539155adf1ae6681a9766 IN  0x2da2409cdf11c607375ac9a43c18fab2152b58840 AVAX0.0145359125 26.5
0xe8fd83e4735dd3a89c04ec526886b76d5b4e044ddcd259bc6d5361ee13469e90Zap In161636592022-06-17 18:58:06105 days 7 hrs ago0xdbec956315f4c27fbaf24c8b6882c9de5ef91695 IN  0x2da2409cdf11c607375ac9a43c18fab2152b58840 AVAX0.0136113805 26.5
0xde403fe7868cb7c882aef2edf3833a4065e8a8a2a894e7a6534cdbf6918e0503Zap In AVAX157602132022-06-08 12:32:31114 days 14 hrs ago0x6fe797a05359c9d91b1f85d418e2ed4ea6c65a8f IN  0x2da2409cdf11c607375ac9a43c18fab2152b58840.5 AVAX0.014888548 26.5
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xaeea778f5d04a9a5993fbc7d878bd44c725255e5da80a2dde7fa6ccc1a39b37d192391702022-08-28 18:03:4533 days 8 hrs ago 0x2da2409cdf11c607375ac9a43c18fab2152b58840x74b2a9c92f8d0644c253cf300449a4f5176c7ea10.000000487648348284 AVAX
0xaeea778f5d04a9a5993fbc7d878bd44c725255e5da80a2dde7fa6ccc1a39b37d192391702022-08-28 18:03:4533 days 8 hrs ago Wrapped AVAX 0x2da2409cdf11c607375ac9a43c18fab2152b58840.000000487648348284 AVAX
0xaeea778f5d04a9a5993fbc7d878bd44c725255e5da80a2dde7fa6ccc1a39b37d192391702022-08-28 18:03:4533 days 8 hrs ago 0x2da2409cdf11c607375ac9a43c18fab2152b5884 Wrapped AVAX0.505062076595697322 AVAX
0xfda53f5d572ce6610f8789d61b3b7c3f0d8afcfff99435cb8f2d907d41f64b20183589552022-08-08 3:34:0453 days 23 hrs ago 0x2da2409cdf11c607375ac9a43c18fab2152b58840x28cd7cd5450574d79646d8b2654a5144de8366a30.000002344993150402 AVAX
0xfda53f5d572ce6610f8789d61b3b7c3f0d8afcfff99435cb8f2d907d41f64b20183589552022-08-08 3:34:0453 days 23 hrs ago Wrapped AVAX 0x2da2409cdf11c607375ac9a43c18fab2152b58840.000002344993150402 AVAX
0xfda53f5d572ce6610f8789d61b3b7c3f0d8afcfff99435cb8f2d907d41f64b20183589552022-08-08 3:34:0453 days 23 hrs ago 0x2da2409cdf11c607375ac9a43c18fab2152b5884 Wrapped AVAX2.1 AVAX
0xa4c71819094e7be0bbe352c3fade8cd070e0e0bb02509bc6768ce81e9b81e0e5180871552022-08-01 18:37:1460 days 8 hrs ago 0x2da2409cdf11c607375ac9a43c18fab2152b5884 Wrapped AVAX9.0769234538529648 AVAX
0xde403fe7868cb7c882aef2edf3833a4065e8a8a2a894e7a6534cdbf6918e0503157602132022-06-08 12:32:31114 days 14 hrs ago 0x2da2409cdf11c607375ac9a43c18fab2152b58840x6fe797a05359c9d91b1f85d418e2ed4ea6c65a8f0.000000456475429717 AVAX
0xde403fe7868cb7c882aef2edf3833a4065e8a8a2a894e7a6534cdbf6918e0503157602132022-06-08 12:32:31114 days 14 hrs ago Wrapped AVAX 0x2da2409cdf11c607375ac9a43c18fab2152b58840.000000456475429717 AVAX
0xde403fe7868cb7c882aef2edf3833a4065e8a8a2a894e7a6534cdbf6918e0503157602132022-06-08 12:32:31114 days 14 hrs ago 0x2da2409cdf11c607375ac9a43c18fab2152b5884 Wrapped AVAX0.5 AVAX
0xf2e817f3e8a0fc0b3243caf4bb3ef64cbed8646e1d3d700e4d775590f826ef22154903112022-06-02 5:35:31120 days 21 hrs ago 0x2da2409cdf11c607375ac9a43c18fab2152b58840x6b7273be8821753e97821497ecf0d499c29232130.00000052381464053 AVAX
0xf2e817f3e8a0fc0b3243caf4bb3ef64cbed8646e1d3d700e4d775590f826ef22154903112022-06-02 5:35:31120 days 21 hrs ago Wrapped AVAX 0x2da2409cdf11c607375ac9a43c18fab2152b58840.00000052381464053 AVAX
0xf2e817f3e8a0fc0b3243caf4bb3ef64cbed8646e1d3d700e4d775590f826ef22154903112022-06-02 5:35:31120 days 21 hrs ago 0x2da2409cdf11c607375ac9a43c18fab2152b5884 Wrapped AVAX0.53507373813951265 AVAX
0xebe9c8db8d5ed6ad43bc38f1a4284e2f7c5f82bdf124da53b95656334c9a1cd5153243142022-05-29 9:14:17124 days 17 hrs ago 0x2da2409cdf11c607375ac9a43c18fab2152b58840x6a2166a6a1e2573b772e48f529e0d6299bab29980.000002251922487216 AVAX
0xebe9c8db8d5ed6ad43bc38f1a4284e2f7c5f82bdf124da53b95656334c9a1cd5153243142022-05-29 9:14:17124 days 17 hrs ago Wrapped AVAX 0x2da2409cdf11c607375ac9a43c18fab2152b58840.000002251922487216 AVAX
0x954d678c9f55d403f31d794a10ac83c64c52ba13845c36d0fdfb577afc0e0fd3152866532022-05-28 12:06:31125 days 14 hrs ago 0x2da2409cdf11c607375ac9a43c18fab2152b58840x483251e8ff51c72078ae97885a203a8e23fd95220.000000690741494531 AVAX
0x954d678c9f55d403f31d794a10ac83c64c52ba13845c36d0fdfb577afc0e0fd3152866532022-05-28 12:06:31125 days 14 hrs ago Wrapped AVAX 0x2da2409cdf11c607375ac9a43c18fab2152b58840.000000690741494531 AVAX
0x954d678c9f55d403f31d794a10ac83c64c52ba13845c36d0fdfb577afc0e0fd3152866532022-05-28 12:06:31125 days 14 hrs ago 0x2da2409cdf11c607375ac9a43c18fab2152b5884 Wrapped AVAX1 AVAX
0xce090c80f70e45819b9c446f56ea1f0eeddae5d4c0ae1cbcc9cb7abaff672233150779062022-05-23 15:41:19130 days 11 hrs ago 0x2da2409cdf11c607375ac9a43c18fab2152b58840x664f144909839deb4b08622e85c423a0924967430.000003342404876669 AVAX
0xce090c80f70e45819b9c446f56ea1f0eeddae5d4c0ae1cbcc9cb7abaff672233150779062022-05-23 15:41:19130 days 11 hrs ago Wrapped AVAX 0x2da2409cdf11c607375ac9a43c18fab2152b58840.000003342404876669 AVAX
0xce090c80f70e45819b9c446f56ea1f0eeddae5d4c0ae1cbcc9cb7abaff672233150779062022-05-23 15:41:19130 days 11 hrs ago 0x2da2409cdf11c607375ac9a43c18fab2152b5884 Wrapped AVAX3 AVAX
0x3605748810c4a76d9d133dd3087b0369d289d437297857182bb3fe12bc86a484146258542022-05-13 3:57:31140 days 22 hrs ago 0x2da2409cdf11c607375ac9a43c18fab2152b58840x0b8df125462f2e50bad33de177d2c702ab3841650.000000926895143658 AVAX
0x3605748810c4a76d9d133dd3087b0369d289d437297857182bb3fe12bc86a484146258542022-05-13 3:57:31140 days 22 hrs ago Wrapped AVAX 0x2da2409cdf11c607375ac9a43c18fab2152b58840.000000926895143658 AVAX
0x3605748810c4a76d9d133dd3087b0369d289d437297857182bb3fe12bc86a484146258542022-05-13 3:57:31140 days 22 hrs ago 0x2da2409cdf11c607375ac9a43c18fab2152b5884 Wrapped AVAX0.84090947250386925 AVAX
0x6615dce2fe5e7782f2c731cc813ce9f75942b2cfa8d18c253151e96cc2928c36143166162022-05-05 20:15:51148 days 6 hrs ago 0x2da2409cdf11c607375ac9a43c18fab2152b58840x0a41f36d96b38a4cd8b4fe8bde0d7dc06919226c0.000002106903576123 AVAX
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
SnowglobeZapAvaxTraderJoe

Compiler Version
v0.6.7+commit.b8d736ae

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at snowtrace.io on 2021-11-27
*/

// Sources flattened with hardhat v2.6.5 https://hardhat.org

// File contracts/lib/safe-math.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.6.0;

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

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    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 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) {
        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 contracts/lib/context.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.6.0;

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with GSN meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address payable) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}


// File contracts/lib/erc20.sol

// File: contracts/GSN/Context.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.6.0;


// File: contracts/token/ERC20/IERC20.sol


/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

// File: contracts/utils/Address.sol


/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain`call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
      return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return _functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        return _functionCallWithValue(target, data, value, errorMessage);
    }

    function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) {
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: weiValue }(data);
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: contracts/token/ERC20/ERC20.sol

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin guidelines: functions revert instead
 * of returning `false` on failure. This behavior is nonetheless conventional
 * and does not conflict with the expectations of ERC20 applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20 {
    using SafeMath for uint256;
    using Address for address;

    mapping (address => uint256) private _balances;

    mapping (address => mapping (address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;
    uint8 private _decimals;

    /**
     * @dev Sets the values for {name} and {symbol}, initializes {decimals} with
     * a default value of 18.
     *
     * To select a different value for {decimals}, use {_setupDecimals}.
     *
     * All three of these values are immutable: they can only be set once during
     * construction.
     */
    constructor (string memory name, string memory symbol) public {
        _name = name;
        _symbol = symbol;
        _decimals = 18;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5,05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is
     * called.
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view returns (uint8) {
        return _decimals;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20};
     *
     * Requirements:
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }

    /**
     * @dev Moves tokens `amount` from `sender` to `recipient`.
     *
     * This is internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(address sender, address recipient, uint256 amount) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

        _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements
     *
     * - `to` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(address owner, address spender, uint256 amount) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Sets {decimals} to a value other than the default one of 18.
     *
     * WARNING: This function should only be called from the constructor. Most
     * applications that interact with token contracts will not expect
     * {decimals} to ever change, and may work incorrectly if it does.
     */
    function _setupDecimals(uint8 decimals_) internal {
        _decimals = decimals_;
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be to transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }
}

/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using SafeMath for uint256;
    using Address for address;

    function safeTransfer(IERC20 token, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(IERC20 token, address spender, uint256 value) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        // solhint-disable-next-line max-line-length
        require((value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).add(value);
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero");
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) { // Return data is optional
            // solhint-disable-next-line max-line-length
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}


// File contracts/interfaces/pangolin.sol

// SPDX-License-Identifier: MIT

// SPDX-License-Identifier: MIT
pragma solidity ^0.6.2;

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

    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 addLiquidityAVAX(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountAVAXMin,
        address to,
        uint256 deadline
    )
        external
        payable
        returns (
            uint256 amountToken,
            uint256 amountAVAX,
            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 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 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);

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

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

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

interface IPangolinFactory {
    event PairCreated(
        address indexed token0,
        address indexed token1,
        address pair,
        uint256
    );

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

    function allPairs(uint256) external view returns (address pair);

    function allPairsLength() external view returns (uint256);

    function feeTo() external view returns (address);

    function feeToSetter() external view returns (address);

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


// File contracts/interfaces/joe.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.6.2;

interface IJoeRouter {

    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 addLiquidityAVAX(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountAVAXMin,
        address to,
        uint256 deadline
    )
        external
        payable
        returns (
            uint256 amountToken,
            uint256 amountAVAX,
            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 swapExactTokensForTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

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

    function swapAVAXForExactTokens(
        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 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);
}

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

interface IJoeFactory {
    event PairCreated(
        address indexed token0,
        address indexed token1,
        address pair,
        uint256
    );

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

    function allPairs(uint256) external view returns (address pair);

    function allPairsLength() external view returns (uint256);

    function feeTo() external view returns (address);

    function feeToSetter() external view returns (address);

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


// File contracts/lib/square-root.sol

// File: @uniswap/lib/contracts/libraries/Babylonian.sol
pragma solidity >=0.4.0;

// computes square roots using the babylonian method
// https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method
library Babylonian {
    // credit for this implementation goes to
    // https://github.com/abdk-consulting/abdk-libraries-solidity/blob/master/ABDKMath64x64.sol#L687
    function sqrt(uint256 x) internal pure returns (uint256) {
        if (x == 0) return 0;
        // this block is equivalent to r = uint256(1) << (BitMath.mostSignificantBit(x) / 2);
        // however that code costs significantly more gas
        uint256 xx = x;
        uint256 r = 1;
        if (xx >= 0x100000000000000000000000000000000) {
            xx >>= 128;
            r <<= 64;
        }
        if (xx >= 0x10000000000000000) {
            xx >>= 64;
            r <<= 32;
        }
        if (xx >= 0x100000000) {
            xx >>= 32;
            r <<= 16;
        }
        if (xx >= 0x10000) {
            xx >>= 16;
            r <<= 8;
        }
        if (xx >= 0x100) {
            xx >>= 8;
            r <<= 4;
        }
        if (xx >= 0x10) {
            xx >>= 4;
            r <<= 2;
        }
        if (xx >= 0x8) {
            r <<= 1;
        }
        r = (r + x / r) >> 1;
        r = (r + x / r) >> 1;
        r = (r + x / r) >> 1;
        r = (r + x / r) >> 1;
        r = (r + x / r) >> 1;
        r = (r + x / r) >> 1;
        r = (r + x / r) >> 1; // Seven iterations should be enough
        uint256 r1 = x / r;
        return (r < r1 ? r : r1);
    }
}


// File contracts/interfaces/wavax.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.6.0;

interface WAVAX {
    function name() external view returns (string memory);

    function approve(address guy, uint256 wad) external returns (bool);

    function totalSupply() external view returns (uint256);

    function transferFrom(
        address src,
        address dst,
        uint256 wad
    ) external returns (bool);

    function withdraw(uint256 wad) external;

    function decimals() external view returns (uint8);

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

    function symbol() external view returns (string memory);

    function transfer(address dst, uint256 wad) external returns (bool);

    function deposit() external payable;

    function allowance(address, address) external view returns (uint256);
}


// File contracts/interfaces/globe.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.6.2;

interface IGlobe is IERC20 {
    function token() external view returns (address);

    function claimInsurance() external; // NOTE: Only yDelegatedVault implements this

    function getRatio() external view returns (uint256);

    function depositAll() external;

    function deposit(uint256) external;

    function withdrawAll() external;

    function withdraw(uint256) external;

    function earn() external;

    function decimals() external view returns (uint8);
}


// File contracts/interfaces/uniAmm.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.6.2;

//this is a universal interface for pairs using uniswapv2.

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

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


// File contracts/zapper-contract/zapper-base.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.6.7;
abstract contract ZapperBase {
    using SafeERC20 for IERC20;
    using Address for address;
    using SafeMath for uint256;
    using SafeERC20 for IGlobe;

    address public router;

    address public constant wavax = 0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7;

    uint256 public constant minimumAmount = 1000;

    constructor(address _router) public {
        // Safety checks to ensure WAVAX token address
        WAVAX(wavax).deposit{value: 0}();
        WAVAX(wavax).withdraw(0);
        router = _router;
    }

    receive() external payable {
        assert(msg.sender == wavax);
    }

    function _getSwapAmount(uint256 investmentA, uint256 reserveA, uint256 reserveB) public view virtual returns (uint256 swapAmount);

    //returns DUST
    function _returnAssets(address[] memory tokens) internal {
        uint256 balance;
        for (uint256 i; i < tokens.length; i++) {
            balance = IERC20(tokens[i]).balanceOf(address(this));
            if (balance > 0) {
                if (tokens[i] == wavax) {
                    WAVAX(wavax).withdraw(balance);
                    (bool success, ) = msg.sender.call{value: balance}(
                        new bytes(0)
                    );
                    require(success, "AVAX transfer failed");
                } else {
                    IERC20(tokens[i]).safeTransfer(msg.sender, balance);
                }
            }
        }
    }

    function _swapAndStake(address snowglobe, uint256 tokenAmountOutMin, address tokenIn) public virtual;

    function zapInAVAX(address snowglobe, uint256 tokenAmountOutMin, address tokenIn) external payable{
        require(msg.value >= minimumAmount, "Insignificant input amount");

        WAVAX(wavax).deposit{value: msg.value}();

        // allows us to zapIn if avax isn't part of the original pair
        if (tokenIn != wavax){
            uint256 _amount = IERC20(wavax).balanceOf(address(this));

            (, IUniPair pair) = _getVaultPair(snowglobe);

            (uint256 reserveA, uint256 reserveB, ) = pair.getReserves();
            require(reserveA > minimumAmount && reserveB > minimumAmount, "Liquidity pair reserves too low");

            bool isInputA = pair.token0() == tokenIn;
            require(isInputA || pair.token1() == tokenIn, "Input token not present in liquidity pair");

            address[] memory path = new address[](2);
            path[0] = wavax;
            path[1] = tokenIn;

            uint256 swapAmountIn;
        
            swapAmountIn = _getSwapAmount(_amount, reserveA, reserveB);
       
            _approveTokenIfNeeded(path[0], address(router));
            IUniAmmRouter(router).swapExactTokensForTokens(
                swapAmountIn,
                tokenAmountOutMin,
                path,
                address(this),
                block.timestamp
            );
            _swapAndStake(snowglobe, tokenAmountOutMin, tokenIn);
        }else{
            _swapAndStake(snowglobe, tokenAmountOutMin, tokenIn);
        }
    }

    // transfers tokens from msg.sender to this contract 
    function zapIn(address snowglobe, uint256 tokenAmountOutMin, address tokenIn, uint256 tokenInAmount) external {
        require(tokenInAmount >= minimumAmount, "Insignificant input amount");
        require(IERC20(tokenIn).allowance(msg.sender, address(this)) >= tokenInAmount, "Input token is not approved");

        // transfer token 
        IERC20(tokenIn).safeTransferFrom(
            msg.sender,
            address(this),
            tokenInAmount
        );
        _swapAndStake(snowglobe, tokenAmountOutMin, tokenIn);
    }

    function zapOutAndSwap(address snowglobe, uint256 withdrawAmount, address desiredToken, uint256 desiredTokenOutMin) public virtual;

    function _removeLiquidity(address pair, address to) internal {
        IERC20(pair).safeTransfer(pair, IERC20(pair).balanceOf(address(this)));
        (uint256 amount0, uint256 amount1) = IUniPair(pair).burn(to);

        require(amount0 >= minimumAmount, "Router: INSUFFICIENT_A_AMOUNT");
        require(amount1 >= minimumAmount, "Router: INSUFFICIENT_B_AMOUNT");
    }

    function _getVaultPair(address snowglobe) internal view returns (IGlobe vault, IUniPair pair){

        vault = IGlobe(snowglobe);
        pair = IUniPair(vault.token());



        require(pair.factory() == IUniPair(router).factory(), "Incompatible liquidity pair factory");
    }

    function _approveTokenIfNeeded(address token, address spender) internal {
        if (IERC20(token).allowance(address(this), spender) == 0) {
            IERC20(token).safeApprove(spender, uint256(~0));
        }
    }

    function zapOut(address snowglobe, uint256 withdrawAmount) external {
        (IGlobe vault, IUniPair pair) = _getVaultPair(snowglobe);

        IERC20(snowglobe).safeTransferFrom(msg.sender, address(this), withdrawAmount);
        vault.withdraw(withdrawAmount);

        if (pair.token0() != wavax && pair.token1() != wavax) {
            return _removeLiquidity(address(pair), msg.sender);
        }


        _removeLiquidity(address(pair), address(this));

        address[] memory tokens = new address[](2);
        tokens[0] = pair.token0();
        tokens[1] = pair.token1();

        _returnAssets(tokens);
    }
}


// File contracts/interfaces/gaugeproxy.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.6.7;

interface IGaugeV2 {
    function depositAll() external;

    function deposit(uint256 amount) external;

    function depositFor(uint256 amount, address account) external;

    function withdrawAll() external;

    function withdraw(uint256 amount) external;

    function exit() external;

    function getReward() external;
}

interface IGaugeProxyV2 {
    function tokens() external view returns (address[] memory);

    function getGauge(address _token) external view returns (address);
}


// File contracts/zapper-contract/SnowglobeZapperTraderJoe.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.6.7;
contract SnowglobeZapAvaxTraderJoe is ZapperBase {
    address public gaugeProxy = 0x215D5eDEb6A6a3f84AE9d72962FEaCCdF815BF27;

    constructor()
        public ZapperBase(0x60aE616a2155Ee3d9A68541Ba4544862310933d4){

        }

    function zapOutAndSwap(address snowglobe, uint256 withdrawAmount, address desiredToken, uint256 desiredTokenOutMin) public override {
        (IGlobe vault, IUniPair pair) = _getVaultPair(snowglobe);
        address token0 = pair.token0();
        address token1 = pair.token1();
        require(token0 == desiredToken || token1 == desiredToken, "desired token not present in liquidity pair");

        vault.safeTransferFrom(msg.sender, address(this), withdrawAmount);
        vault.withdraw(withdrawAmount);
        _removeLiquidity(address(pair), address(this));

        address swapToken = token1 == desiredToken ? token0 : token1;
        address[] memory path = new address[](2);
        path[0] = swapToken;
        path[1] = desiredToken;

        _approveTokenIfNeeded(path[0], address(router));
        IJoeRouter(router).swapExactTokensForTokens(
            IERC20(swapToken).balanceOf(address(this)),
            desiredTokenOutMin,
            path,
            address(this),
            block.timestamp
        );

        _returnAssets(path);
    }

    function _swapAndStake(address snowglobe, uint256 tokenAmountOutMin, address tokenIn) public override {
        (IGlobe vault, IUniPair pair) = _getVaultPair(snowglobe);

        (uint256 reserveA, uint256 reserveB, ) = pair.getReserves();
        require(reserveA > minimumAmount && reserveB > minimumAmount, "Liquidity pair reserves too low");

        bool isInputA = pair.token0() == tokenIn;
        require(isInputA || pair.token1() == tokenIn, "Input token not present in liquidity pair");

        address[] memory path = new address[](2);
        path[0] = tokenIn;
        path[1] = isInputA ? pair.token1() : pair.token0();

        uint256 fullInvestment = IERC20(tokenIn).balanceOf(address(this));
        uint256 swapAmountIn;
        if (isInputA) {
            swapAmountIn = _getSwapAmount(fullInvestment, reserveA, reserveB);
        } else {
            swapAmountIn = _getSwapAmount(fullInvestment, reserveB, reserveA);
        }

        _approveTokenIfNeeded(path[0], address(router));
        uint256[] memory swappedAmounts = IJoeRouter(router)
            .swapExactTokensForTokens(
                swapAmountIn,
                tokenAmountOutMin,
                path,
                address(this),
                block.timestamp
            );

        _approveTokenIfNeeded(path[1], address(router));
        (, , uint256 amountLiquidity) = IJoeRouter(router).addLiquidity(
            path[0],
            path[1],
            fullInvestment.sub(swappedAmounts[0]),
            swappedAmounts[1],
            1,
            1,
            address(this),
            block.timestamp
        );

        _approveTokenIfNeeded(address(pair), address(vault));
        vault.deposit(amountLiquidity);

        //add to guage if possible instead of returning to user, and so no receipt token
        vault.safeTransfer(msg.sender, vault.balanceOf(address(this)));

        //taking receipt token and sending back to user
        vault.safeTransfer(msg.sender, vault.balanceOf(address(this)));

        //interact with gauge proxy to get gauge address
        address gaugeAddress = IGaugeProxyV2(gaugeProxy).getGauge(snowglobe);

        //deposit for into gauge
        IGaugeV2(gaugeAddress).depositFor(vault.balanceOf(msg.sender), msg.sender);

        _returnAssets(path);
    }

    function _getSwapAmount(uint256 investmentA, uint256 reserveA, uint256 reserveB) public view override returns (uint256 swapAmount) {
        uint256 halfInvestment = investmentA.div(2);
        uint256 nominator = IJoeRouter(router).getAmountOut(
            halfInvestment,
            reserveA,
            reserveB
        );
        uint256 denominator = IJoeRouter(router).quote(
            halfInvestment,
            reserveA.add(halfInvestment),
            reserveB.sub(nominator)
        );
        swapAmount = investmentA.sub(
            Babylonian.sqrt(
                (halfInvestment * halfInvestment * nominator) / denominator
            )
        );
    }

    function estimateSwap(address snowglobe, address tokenIn, uint256 fullInvestmentIn) public view returns (uint256 swapAmountIn, uint256 swapAmountOut, address swapTokenOut){
        (, IUniPair pair) = _getVaultPair(snowglobe);

        bool isInputA = pair.token0() == tokenIn;
        require(isInputA || pair.token1() == tokenIn, "Input token not present in liquidity pair");

        (uint256 reserveA, uint256 reserveB, ) = pair.getReserves();
        (reserveA, reserveB) = isInputA ? (reserveA, reserveB) : (reserveB, reserveA);

        swapAmountIn = _getSwapAmount(fullInvestmentIn, reserveA, reserveB);
        swapAmountOut = IJoeRouter(router).getAmountOut(
            swapAmountIn,
            reserveA,
            reserveB
        );
        swapTokenOut = isInputA ? pair.token1() : pair.token0();
    }
}

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"investmentA","type":"uint256"},{"internalType":"uint256","name":"reserveA","type":"uint256"},{"internalType":"uint256","name":"reserveB","type":"uint256"}],"name":"_getSwapAmount","outputs":[{"internalType":"uint256","name":"swapAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"snowglobe","type":"address"},{"internalType":"uint256","name":"tokenAmountOutMin","type":"uint256"},{"internalType":"address","name":"tokenIn","type":"address"}],"name":"_swapAndStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"snowglobe","type":"address"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"fullInvestmentIn","type":"uint256"}],"name":"estimateSwap","outputs":[{"internalType":"uint256","name":"swapAmountIn","type":"uint256"},{"internalType":"uint256","name":"swapAmountOut","type":"uint256"},{"internalType":"address","name":"swapTokenOut","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gaugeProxy","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wavax","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"snowglobe","type":"address"},{"internalType":"uint256","name":"tokenAmountOutMin","type":"uint256"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"tokenInAmount","type":"uint256"}],"name":"zapIn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"snowglobe","type":"address"},{"internalType":"uint256","name":"tokenAmountOutMin","type":"uint256"},{"internalType":"address","name":"tokenIn","type":"address"}],"name":"zapInAVAX","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"snowglobe","type":"address"},{"internalType":"uint256","name":"withdrawAmount","type":"uint256"}],"name":"zapOut","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"snowglobe","type":"address"},{"internalType":"uint256","name":"withdrawAmount","type":"uint256"},{"internalType":"address","name":"desiredToken","type":"address"},{"internalType":"uint256","name":"desiredTokenOutMin","type":"uint256"}],"name":"zapOutAndSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052600180546001600160a01b03191673215d5edeb6a6a3f84ae9d72962feaccdf815bf271790553480156200003757600080fd5b507360ae616a2155ee3d9a68541ba4544862310933d473b31f66aa3c1e785363f0875a1b74e27b85fd66c76001600160a01b031663d0e30db060006040518263ffffffff1660e01b81526004016000604051808303818588803b1580156200009e57600080fd5b505af1158015620000b3573d6000803e3d6000fd5b505060408051632e1a7d4d60e01b8152600060048201819052915173b31f66aa3c1e785363f0875a1b74e27b85fd66c79550632e1a7d4d945060248083019450909182900301818387803b1580156200010b57600080fd5b505af115801562000120573d6000803e3d6000fd5b5050600080546001600160a01b039094166001600160a01b0319909416939093179092555050612fae80620001566000396000f3fe6080604052600436106100a05760003560e01c8063b384bcbc11610064578063b384bcbc14610229578063bb0c82981461026c578063ca1c9b7514610281578063d9139f6314610296578063f3cc669a146102cf578063f887ea4014610316576100c4565b8063117be4c2146100c95780633f2f869a146100fa578063597fd0a21461016457806372f8b6cd146101ac578063b302b64c146101f3576100c4565b366100c4573373b31f66aa3c1e785363f0875a1b74e27b85fd66c7146100c257fe5b005b600080fd5b3480156100d557600080fd5b506100de61032b565b604080516001600160a01b039092168252519081900360200190f35b34801561010657600080fd5b5061013d6004803603606081101561011d57600080fd5b506001600160a01b03813581169160208101359091169060400135610343565b6040805193845260208401929092526001600160a01b031682820152519081900360600190f35b34801561017057600080fd5b5061019a6004803603606081101561018757600080fd5b508035906020810135906040013561069b565b60408051918252519081900360200190f35b3480156101b857600080fd5b506100c2600480360360808110156101cf57600080fd5b506001600160a01b0381358116916020810135916040820135169060600135610812565b6100c26004803603606081101561020957600080fd5b506001600160a01b03813581169160208101359160409091013516610963565b34801561023557600080fd5b506100c26004803603606081101561024c57600080fd5b506001600160a01b03813581169160208101359160409091013516610f77565b34801561027857600080fd5b5061019a61192d565b34801561028d57600080fd5b506100de611933565b3480156102a257600080fd5b506100c2600480360360408110156102b957600080fd5b506001600160a01b038135169060200135611942565b3480156102db57600080fd5b506100c2600480360360808110156102f257600080fd5b506001600160a01b0381358116916020810135916040820135169060600135611c67565b34801561032257600080fd5b506100de6120ea565b73b31f66aa3c1e785363f0875a1b74e27b85fd66c781565b600080600080610352876120f9565b9150506000866001600160a01b0316826001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561039a57600080fd5b505afa1580156103ae573d6000803e3d6000fd5b505050506040513d60208110156103c457600080fd5b50516001600160a01b031614905080806104535750866001600160a01b0316826001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b15801561041c57600080fd5b505afa158015610430573d6000803e3d6000fd5b505050506040513d602081101561044657600080fd5b50516001600160a01b0316145b61048e5760405162461bcd60e51b8152600401808060200182810382526029815260200180612f506029913960400191505060405180910390fd5b600080836001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b1580156104ca57600080fd5b505afa1580156104de573d6000803e3d6000fd5b505050506040513d60608110156104f457600080fd5b5080516020909101516001600160701b0391821693501690508261051957808261051c565b81815b909250905061052c88838361069b565b60005460408051630153543560e21b815260048101849052602481018690526044810185905290519299506001600160a01b039091169163054d50d491606480820192602092909190829003018186803b15801561058957600080fd5b505afa15801561059d573d6000803e3d6000fd5b505050506040513d60208110156105b357600080fd5b505195508261062657836001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b1580156105f557600080fd5b505afa158015610609573d6000803e3d6000fd5b505050506040513d602081101561061f57600080fd5b505161068c565b836001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b15801561065f57600080fd5b505afa158015610673573d6000803e3d6000fd5b505050506040513d602081101561068957600080fd5b50515b94505050505093509350939050565b6000806106af85600263ffffffff61229216565b6000805460408051630153543560e21b8152600481018590526024810189905260448101889052905193945091926001600160a01b039091169163054d50d4916064808301926020929190829003018186803b15801561070e57600080fd5b505afa158015610722573d6000803e3d6000fd5b505050506040513d602081101561073857600080fd5b505160008054919250906001600160a01b031663ad615dec84610761898263ffffffff6122db16565b610771898763ffffffff61233516565b6040518463ffffffff1660e01b815260040180848152602001838152602001828152602001935050505060206040518083038186803b1580156107b357600080fd5b505afa1580156107c7573d6000803e3d6000fd5b505050506040513d60208110156107dd57600080fd5b505190506108076107fa828580028502816107f457fe5b04612377565b889063ffffffff61233516565b979650505050505050565b6103e8811015610869576040805162461bcd60e51b815260206004820152601a60248201527f496e7369676e69666963616e7420696e70757420616d6f756e74000000000000604482015290519081900360640190fd5b60408051636eb1769f60e11b8152336004820152306024820152905182916001600160a01b0385169163dd62ed3e91604480820192602092909190829003018186803b1580156108b857600080fd5b505afa1580156108cc573d6000803e3d6000fd5b505050506040513d60208110156108e257600080fd5b50511015610937576040805162461bcd60e51b815260206004820152601b60248201527f496e70757420746f6b656e206973206e6f7420617070726f7665640000000000604482015290519081900360640190fd5b6109526001600160a01b03831633308463ffffffff6124be16565b61095d848484610f77565b50505050565b6103e83410156109ba576040805162461bcd60e51b815260206004820152601a60248201527f496e7369676e69666963616e7420696e70757420616d6f756e74000000000000604482015290519081900360640190fd5b73b31f66aa3c1e785363f0875a1b74e27b85fd66c76001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b158015610a0957600080fd5b505af1158015610a1d573d6000803e3d6000fd5b505050506001600160a01b03821673b31f66aa3c1e785363f0875a1b74e27b85fd66c7149050610f6757604080516370a0823160e01b8152306004820152905160009173b31f66aa3c1e785363f0875a1b74e27b85fd66c7916370a0823191602480820192602092909190829003018186803b158015610a9c57600080fd5b505afa158015610ab0573d6000803e3d6000fd5b505050506040513d6020811015610ac657600080fd5b505190506000610ad5856120f9565b915050600080826001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015610b1457600080fd5b505afa158015610b28573d6000803e3d6000fd5b505050506040513d6060811015610b3e57600080fd5b5080516020909101516001600160701b0391821693501690506103e882118015610b6957506103e881115b610bba576040805162461bcd60e51b815260206004820152601f60248201527f4c6971756964697479207061697220726573657276657320746f6f206c6f7700604482015290519081900360640190fd5b6000856001600160a01b0316846001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b158015610bff57600080fd5b505afa158015610c13573d6000803e3d6000fd5b505050506040513d6020811015610c2957600080fd5b50516001600160a01b03161490508080610cb85750856001600160a01b0316846001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b158015610c8157600080fd5b505afa158015610c95573d6000803e3d6000fd5b505050506040513d6020811015610cab57600080fd5b50516001600160a01b0316145b610cf35760405162461bcd60e51b8152600401808060200182810382526029815260200180612f506029913960400191505060405180910390fd5b604080516002808252606080830184529260208301908036833701905050905073b31f66aa3c1e785363f0875a1b74e27b85fd66c781600081518110610d3557fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508681600181518110610d6357fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506000610d9087868661069b565b9050610dbe82600081518110610da257fe5b60209081029190910101516000546001600160a01b0316612518565b6000809054906101000a90046001600160a01b03166001600160a01b03166338ed1739828b8530426040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03166001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b83811015610e5f578181015183820152602001610e47565b505050509050019650505050505050600060405180830381600087803b158015610e8857600080fd5b505af1158015610e9c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015610ec557600080fd5b8101908080516040519392919084600160201b821115610ee457600080fd5b908301906020820185811115610ef957600080fd5b82518660208202830111600160201b82111715610f1557600080fd5b82525081516020918201928201910280838360005b83811015610f42578181015183820152602001610f2a565b5050505090500160405250505050610f5b8a8a8a610f77565b50505050505050610f72565b610f72838383610f77565b505050565b600080610f83856120f9565b91509150600080826001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015610fc357600080fd5b505afa158015610fd7573d6000803e3d6000fd5b505050506040513d6060811015610fed57600080fd5b5080516020909101516001600160701b0391821693501690506103e88211801561101857506103e881115b611069576040805162461bcd60e51b815260206004820152601f60248201527f4c6971756964697479207061697220726573657276657320746f6f206c6f7700604482015290519081900360640190fd5b6000856001600160a01b0316846001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b1580156110ae57600080fd5b505afa1580156110c2573d6000803e3d6000fd5b505050506040513d60208110156110d857600080fd5b50516001600160a01b031614905080806111675750856001600160a01b0316846001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b15801561113057600080fd5b505afa158015611144573d6000803e3d6000fd5b505050506040513d602081101561115a57600080fd5b50516001600160a01b0316145b6111a25760405162461bcd60e51b8152600401808060200182810382526029815260200180612f506029913960400191505060405180910390fd5b604080516002808252606080830184529260208301908036833701905050905086816000815181106111d057fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508161125f57846001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561122e57600080fd5b505afa158015611242573d6000803e3d6000fd5b505050506040513d602081101561125857600080fd5b50516112c5565b846001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b15801561129857600080fd5b505afa1580156112ac573d6000803e3d6000fd5b505050506040513d60208110156112c257600080fd5b50515b816001815181106112d257fe5b6001600160a01b03928316602091820292909201810191909152604080516370a0823160e01b815230600482015290516000938b16926370a082319260248082019391829003018186803b15801561132957600080fd5b505afa15801561133d573d6000803e3d6000fd5b505050506040513d602081101561135357600080fd5b50519050600083156113715761136a82878761069b565b905061137f565b61137c82868861069b565b90505b61138f83600081518110610da257fe5b60606000809054906101000a90046001600160a01b03166001600160a01b03166338ed1739838d8730426040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03166001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b8381101561143257818101518382015260200161141a565b505050509050019650505050505050600060405180830381600087803b15801561145b57600080fd5b505af115801561146f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561149857600080fd5b8101908080516040519392919084600160201b8211156114b757600080fd5b9083019060208201858111156114cc57600080fd5b82518660208202830111600160201b821117156114e857600080fd5b82525081516020918201928201910280838360005b838110156115155781810151838201526020016114fd565b50505050905001604052505050905061153484600181518110610da257fe5b6000805485516001600160a01b039091169063e8e33700908790849061155657fe5b60200260200101518760018151811061156b57fe5b602002602001015161159a8660008151811061158357fe5b60200260200101518961233590919063ffffffff16565b866001815181106115a757fe5b6020908102919091010151604080516001600160e01b031960e088901b1681526001600160a01b0395861660048201529390941660248401526044830191909152606482015260016084820181905260a48201523060c48201524260e482015290516101048083019260609291908290030181600087803b15801561162b57600080fd5b505af115801561163f573d6000803e3d6000fd5b505050506040513d606081101561165557600080fd5b50604001519050611666898b612518565b896001600160a01b031663b6b55f25826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156116ac57600080fd5b505af11580156116c0573d6000803e3d6000fd5b5050604080516370a0823160e01b8152306004820152905161175393503392506001600160a01b038e16916370a08231916024808301926020929190829003018186803b15801561171057600080fd5b505afa158015611724573d6000803e3d6000fd5b505050506040513d602081101561173a57600080fd5b50516001600160a01b038d16919063ffffffff6125b416565b604080516370a0823160e01b8152306004820152905161179f9133916001600160a01b038e16916370a08231916024808301926020929190829003018186803b15801561171057600080fd5b6000600160009054906101000a90046001600160a01b03166001600160a01b031663b1c6f0e98f6040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561180c57600080fd5b505afa158015611820573d6000803e3d6000fd5b505050506040513d602081101561183657600080fd5b5051604080516370a0823160e01b815233600482015290519192506001600160a01b03808416926336efd16f92918f16916370a08231916024808301926020929190829003018186803b15801561188c57600080fd5b505afa1580156118a0573d6000803e3d6000fd5b505050506040513d60208110156118b657600080fd5b5051604080516001600160e01b031960e085901b168152600481019290925233602483015251604480830192600092919082900301818387803b1580156118fc57600080fd5b505af1158015611910573d6000803e3d6000fd5b5050505061191d86612606565b5050505050505050505050505050565b6103e881565b6001546001600160a01b031681565b60008061194e846120f9565b909250905061196e6001600160a01b03851633308663ffffffff6124be16565b816001600160a01b0316632e1a7d4d846040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156119b457600080fd5b505af11580156119c8573d6000803e3d6000fd5b5050505073b31f66aa3c1e785363f0875a1b74e27b85fd66c76001600160a01b0316816001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b158015611a2357600080fd5b505afa158015611a37573d6000803e3d6000fd5b505050506040513d6020811015611a4d57600080fd5b50516001600160a01b031614801590611af0575073b31f66aa3c1e785363f0875a1b74e27b85fd66c76001600160a01b0316816001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b158015611ab857600080fd5b505afa158015611acc573d6000803e3d6000fd5b505050506040513d6020811015611ae257600080fd5b50516001600160a01b031614155b15611b0657611aff8133612897565b5050611c63565b611b108130612897565b6040805160028082526060808301845292602083019080368337019050509050816001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b158015611b6957600080fd5b505afa158015611b7d573d6000803e3d6000fd5b505050506040513d6020811015611b9357600080fd5b505181518290600090611ba257fe5b60200260200101906001600160a01b031690816001600160a01b031681525050816001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b158015611bfb57600080fd5b505afa158015611c0f573d6000803e3d6000fd5b505050506040513d6020811015611c2557600080fd5b5051815182906001908110611c3657fe5b60200260200101906001600160a01b031690816001600160a01b031681525050611c5f81612606565b5050505b5050565b600080611c73866120f9565b915091506000816001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b158015611cb257600080fd5b505afa158015611cc6573d6000803e3d6000fd5b505050506040513d6020811015611cdc57600080fd5b50516040805163d21220a760e01b815290519192506000916001600160a01b0385169163d21220a7916004808301926020929190829003018186803b158015611d2457600080fd5b505afa158015611d38573d6000803e3d6000fd5b505050506040513d6020811015611d4e57600080fd5b505190506001600160a01b038281169087161480611d7d5750856001600160a01b0316816001600160a01b0316145b611db85760405162461bcd60e51b815260040180806020018281038252602b815260200180612ea2602b913960400191505060405180910390fd5b611dd36001600160a01b03851633308a63ffffffff6124be16565b836001600160a01b0316632e1a7d4d886040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611e1957600080fd5b505af1158015611e2d573d6000803e3d6000fd5b50505050611e3b8330612897565b6000866001600160a01b0316826001600160a01b031614611e5c5781611e5e565b825b6040805160028082526060808301845293945090916020830190803683370190505090508181600081518110611e9057fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508781600181518110611ebe57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050611eee81600081518110610da257fe5b600054604080516370a0823160e01b815230600482015290516001600160a01b03928316926338ed173992908616916370a0823191602480820192602092909190829003018186803b158015611f4357600080fd5b505afa158015611f57573d6000803e3d6000fd5b505050506040513d6020811015611f6d57600080fd5b50516040516001600160e01b031960e084901b16815260048101828152602482018c90523060648301819052426084840181905260a060448501908152885160a486015288518f958a95929160c4909101906020878101910280838360005b83811015611fe4578181015183820152602001611fcc565b505050509050019650505050505050600060405180830381600087803b15801561200d57600080fd5b505af1158015612021573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561204a57600080fd5b8101908080516040519392919084600160201b82111561206957600080fd5b90830190602082018581111561207e57600080fd5b82518660208202830111600160201b8211171561209a57600080fd5b82525081516020918201928201910280838360005b838110156120c75781810151838201526020016120af565b50505050905001604052505050506120de81612606565b50505050505050505050565b6000546001600160a01b031681565b600080829150816001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561213857600080fd5b505afa15801561214c573d6000803e3d6000fd5b505050506040513d602081101561216257600080fd5b50516000546040805163c45a015560e01b815290519293506001600160a01b039091169163c45a015591600480820192602092909190829003018186803b1580156121ac57600080fd5b505afa1580156121c0573d6000803e3d6000fd5b505050506040513d60208110156121d657600080fd5b50516040805163c45a015560e01b815290516001600160a01b039283169284169163c45a0155916004808301926020929190829003018186803b15801561221c57600080fd5b505afa158015612230573d6000803e3d6000fd5b505050506040513d602081101561224657600080fd5b50516001600160a01b03161461228d5760405162461bcd60e51b8152600401808060200182810382526023815260200180612ecd6023913960400191505060405180910390fd5b915091565b60006122d483836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612a57565b9392505050565b6000828201838110156122d4576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60006122d483836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612af9565b600081612386575060006124b9565b816001600160801b821061239f5760809190911c9060401b5b6801000000000000000082106123ba5760409190911c9060201b5b600160201b82106123d05760209190911c9060101b5b6201000082106123e55760109190911c9060081b5b61010082106123f95760089190911c9060041b5b6010821061240c5760049190911c9060021b5b600882106124185760011b5b600181858161242357fe5b048201901c9050600181858161243557fe5b048201901c9050600181858161244757fe5b048201901c9050600181858161245957fe5b048201901c9050600181858161246b57fe5b048201901c9050600181858161247d57fe5b048201901c9050600181858161248f57fe5b048201901c905060008185816124a157fe5b0490508082106124b157806124b3565b815b93505050505b919050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b17905261095d908590612b53565b60408051636eb1769f60e11b81523060048201526001600160a01b03838116602483015291519184169163dd62ed3e91604480820192602092909190829003018186803b15801561256857600080fd5b505afa15801561257c573d6000803e3d6000fd5b505050506040513d602081101561259257600080fd5b5051611c6357611c636001600160a01b0383168260001963ffffffff612c0416565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610f72908490612b53565b6000805b8251811015610f725782818151811061261f57fe5b60200260200101516001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561267c57600080fd5b505afa158015612690573d6000803e3d6000fd5b505050506040513d60208110156126a657600080fd5b50519150811561288f5773b31f66aa3c1e785363f0875a1b74e27b85fd66c76001600160a01b03168382815181106126da57fe5b60200260200101516001600160a01b0316141561285e5773b31f66aa3c1e785363f0875a1b74e27b85fd66c76001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561274b57600080fd5b505af115801561275f573d6000803e3d6000fd5b505060408051600080825260208201928390528151909450339350869290819081908082805b602083106127a45780518252601f199092019160209182019101612785565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114612806576040519150601f19603f3d011682016040523d82523d6000602084013e61280b565b606091505b5050905080612858576040805162461bcd60e51b815260206004820152601460248201527310559056081d1c985b9cd9995c8819985a5b195960621b604482015290519081900360640190fd5b5061288f565b61288f338385848151811061286f57fe5b60200260200101516001600160a01b03166125b49092919063ffffffff16565b60010161260a565b604080516370a0823160e01b815230600482015290516129269184916001600160a01b038316916370a08231916024808301926020929190829003018186803b1580156128e357600080fd5b505afa1580156128f7573d6000803e3d6000fd5b505050506040513d602081101561290d57600080fd5b50516001600160a01b038516919063ffffffff6125b416565b6040805163226bf2d160e21b81526001600160a01b03838116600483015282516000938493928716926389afcb44926024808301939282900301818787803b15801561297157600080fd5b505af1158015612985573d6000803e3d6000fd5b505050506040513d604081101561299b57600080fd5b50805160209091015190925090506103e8821015612a00576040805162461bcd60e51b815260206004820152601d60248201527f526f757465723a20494e53554646494349454e545f415f414d4f554e54000000604482015290519081900360640190fd5b6103e881101561095d576040805162461bcd60e51b815260206004820152601d60248201527f526f757465723a20494e53554646494349454e545f425f414d4f554e54000000604482015290519081900360640190fd5b60008183612ae35760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612aa8578181015183820152602001612a90565b50505050905090810190601f168015612ad55780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581612aef57fe5b0495945050505050565b60008184841115612b4b5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315612aa8578181015183820152602001612a90565b505050900390565b6060612ba8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612d179092919063ffffffff16565b805190915015610f7257808060200190516020811015612bc757600080fd5b5051610f725760405162461bcd60e51b815260040180806020018281038252602a815260200180612ef0602a913960400191505060405180910390fd5b801580612c8a575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015612c5c57600080fd5b505afa158015612c70573d6000803e3d6000fd5b505050506040513d6020811015612c8657600080fd5b5051155b612cc55760405162461bcd60e51b8152600401808060200182810382526036815260200180612f1a6036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052610f72908490612b53565b6060612d268484600085612d2e565b949350505050565b6060612d3985612e9b565b612d8a576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b60208310612dc95780518252601f199092019160209182019101612daa565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114612e2b576040519150601f19603f3d011682016040523d82523d6000602084013e612e30565b606091505b50915091508115612e44579150612d269050565b805115612e545780518082602001fd5b60405162461bcd60e51b8152602060048201818152865160248401528651879391928392604401919085019080838360008315612aa8578181015183820152602001612a90565b3b15159056fe6465736972656420746f6b656e206e6f742070726573656e7420696e206c69717569646974792070616972496e636f6d70617469626c65206c6971756964697479207061697220666163746f72795361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365496e70757420746f6b656e206e6f742070726573656e7420696e206c69717569646974792070616972a264697066735822122056cd8c13e40381174b2e32fb29b15eae47e26347ac10cb01d34d9d1dd2849e6e64736f6c63430006070033

Deployed ByteCode Sourcemap

54453:5253:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48868:10;48506:42;48868:19;48861:27;;;;54453:5253;;12:1:-1;9;2:12;48474:74:0;;5:9:-1;2:2;;;27:1;24;17:12;2:2;48474:74:0;;;:::i;:::-;;;;-1:-1:-1;;;;;48474:74:0;;;;;;;;;;;;;;58867:836;;5:9:-1;2:2;;;27:1;24;17:12;2:2;58867:836:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;58867:836:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;-1:-1:-1;;;;;58867:836:0;;;;;;;;;;;;;;58167:692;;5:9:-1;2:2;;;27:1;24;17:12;2:2;58167:692:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;58167:692:0;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;51450:546;;5:9:-1;2:2;;;27:1;24;17:12;2:2;51450:546:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;51450:546:0;;;;;;;;;;;;;;;;;;;;:::i;49859:1524::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;49859:1524:0;;;;;;;;;;;;;;;;;:::i;55793:2366::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;55793:2366:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;55793:2366:0;;;;;;;;;;;;;;;;;:::i;48557:44::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;48557:44:0;;;:::i;54509:70::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;54509:70:0;;;:::i;53055:639::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;53055:639:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;53055:639:0;;;;;;;;:::i;54694:1091::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;54694:1091:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;54694:1091:0;;;;;;;;;;;;;;;;;;;;:::i;48444:21::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;48444:21:0;;;:::i;48474:74::-;48506:42;48474:74;:::o;58867:836::-;58972:20;58994:21;59017:20;59052:13;59069:24;59083:9;59069:13;:24::i;:::-;59049:44;;;59106:13;59139:7;-1:-1:-1;;;;;59122:24:0;:4;-1:-1:-1;;;;;59122:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;59122:13:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;59122:13:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;59122:13:0;-1:-1:-1;;;;;59122:24:0;;;-1:-1:-1;59122:24:0;;59165:36;;;59194:7;-1:-1:-1;;;;;59177:24:0;:4;-1:-1:-1;;;;;59177:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;59177:13:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;59177:13:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;59177:13:0;-1:-1:-1;;;;;59177:24:0;;59165:36;59157:90;;;;-1:-1:-1;;;59157:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59261:16;59279;59301:4;-1:-1:-1;;;;;59301:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;59301:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;59301:18:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;59301:18:0;;;;;;;-1:-1:-1;;;;;59260:59:0;;;;-1:-1:-1;59260:59:0;;-1:-1:-1;59353:8:0;:54;;59388:8;59398;59353:54;;;59365:8;59375;59353:54;59330:77;;-1:-1:-1;59330:77:0;-1:-1:-1;59435:52:0;59450:16;59330:77;;59435:14;:52::i;:::-;59525:6;;59514:115;;;-1:-1:-1;;;59514:115:0;;;;;;;;;;;;;;;;;;;;;;59420:67;;-1:-1:-1;;;;;;59525:6:0;;;;59514:31;;:115;;;;;;;;;;;;;;;59525:6;59514:115;;;2:2:-1;;;;27:1;24;17:12;2:2;59514:115:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;59514:115:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;59514:115:0;;-1:-1:-1;59655:8:0;:40;;59682:4;-1:-1:-1;;;;;59682:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;59682:13:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;59682:13:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;59682:13:0;59655:40;;;59666:4;-1:-1:-1;;;;;59666:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;59666:13:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;59666:13:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;59666:13:0;59655:40;59640:55;;58867:836;;;;;;;;;;;:::o;58167:692::-;58278:18;;58334;:11;58350:1;58334:18;:15;:18;:::i;:::-;58363:17;58394:6;;58383:117;;;-1:-1:-1;;;58383:117:0;;;;;;;;;;;;;;;;;;;;;;58309:43;;-1:-1:-1;58363:17:0;;-1:-1:-1;;;;;58394:6:0;;;;58383:31;;:117;;;;;;;;;;;;;;58394:6;58383:117;;;2:2:-1;;;;27:1;24;17:12;2:2;58383:117:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;58383:117:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;58383:117:0;58511:19;58544:6;;58383:117;;-1:-1:-1;58511:19:0;-1:-1:-1;;;;;58544:6:0;58533:24;58572:14;58601:28;:8;58572:14;58601:28;:12;:28;:::i;:::-;58644:23;:8;58657:9;58644:23;:12;:23;:::i;:::-;58533:145;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;58533:145:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;58533:145:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;58533:145:0;;-1:-1:-1;58702:149:0;58732:108;58533:145;58767:31;;;:43;;58533:145;58766:59;;;;;58732:15;:108::i;:::-;58702:11;;:149;:15;:149;:::i;:::-;58689:162;58167:692;-1:-1:-1;;;;;;;58167:692:0:o;51450:546::-;48597:4;51579:13;:30;;51571:69;;;;;-1:-1:-1;;;51571:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;51659:52;;;-1:-1:-1;;;51659:52:0;;51685:10;51659:52;;;;51705:4;51659:52;;;;;;51715:13;;-1:-1:-1;;;;;51659:25:0;;;;;:52;;;;;;;;;;;;;;;:25;:52;;;2:2:-1;;;;27:1;24;17:12;2:2;51659:52:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;51659:52:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;51659:52:0;:69;;51651:109;;;;;-1:-1:-1;;;51651:109:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;51801:124;-1:-1:-1;;;;;51801:32:0;;51848:10;51881:4;51901:13;51801:124;:32;:124;:::i;:::-;51936:52;51950:9;51961:17;51980:7;51936:13;:52::i;:::-;51450:546;;;;:::o;49859:1524::-;48597:4;49976:9;:26;;49968:65;;;;;-1:-1:-1;;;49968:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;48506:42;-1:-1:-1;;;;;50046:20:0;;50074:9;50046:40;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;50046:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;;;;;;;;50174:16:0;;48506:42;50174:16;;-1:-1:-1;50170:1206:0;;50224:38;;;-1:-1:-1;;;50224:38:0;;50256:4;50224:38;;;;;;50206:15;;48506:42;;50224:23;;:38;;;;;;;;;;;;;;;48506:42;50224:38;;;2:2:-1;;;;27:1;24;17:12;2:2;50224:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;50224:38:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;50224:38:0;;-1:-1:-1;50282:13:0;50299:24;50313:9;50299:13;:24::i;:::-;50279:44;;;50341:16;50359;50381:4;-1:-1:-1;;;;;50381:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;50381:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;50381:18:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;50381:18:0;;;;;;;-1:-1:-1;;;;;50340:59:0;;;;-1:-1:-1;50340:59:0;;-1:-1:-1;48597:4:0;50422:24;;:52;;;;;48597:4;50450:8;:24;50422:52;50414:96;;;;;-1:-1:-1;;;50414:96:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;50527:13;50560:7;-1:-1:-1;;;;;50543:24:0;:4;-1:-1:-1;;;;;50543:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;50543:13:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;50543:13:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;50543:13:0;-1:-1:-1;;;;;50543:24:0;;;-1:-1:-1;50543:24:0;;50590:36;;;50619:7;-1:-1:-1;;;;;50602:24:0;:4;-1:-1:-1;;;;;50602:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;50602:13:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;50602:13:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;50602:13:0;-1:-1:-1;;;;;50602:24:0;;50590:36;50582:90;;;;-1:-1:-1;;;50582:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50713:16;;;50727:1;50713:16;;;50689:21;50713:16;;;;;50689:21;50713:16;;;;;109:14:-1;50713:16:0;88:42:-1;144:17;;-1:-1;50713:16:0;50689:40;;48506:42;50744:4;50749:1;50744:7;;;;;;;;;;;;;:15;-1:-1:-1;;;;;50744:15:0;;;-1:-1:-1;;;;;50744:15:0;;;;;50784:7;50774:4;50779:1;50774:7;;;;;;;;;;;;;:17;-1:-1:-1;;;;;50774:17:0;;;-1:-1:-1;;;;;50774:17:0;;;;;50808:20;50868:43;50883:7;50892:8;50902;50868:14;:43::i;:::-;50853:58;;50935:47;50957:4;50962:1;50957:7;;;;;;;;;;;;;;;;;;50974:6;;-1:-1:-1;;;;;50974:6:0;50935:21;:47::i;:::-;51011:6;;;;;;;;;-1:-1:-1;;;;;51011:6:0;-1:-1:-1;;;;;50997:46:0;;51062:12;51093:17;51129:4;51160;51184:15;50997:217;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;50997:217:0;-1:-1:-1;;;;;50997:217:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;50997:217:0;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;50997:217:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;50997:217:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;50997:217:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;15:2;7:11;;4:2;;;31:1;28;21:12;4:2;50997:217:0;;;;;;;;;;;;;-1:-1:-1;;;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;219:3;213:10;331:9;325:2;311:12;307:21;289:16;285:44;282:59;-1:-1;;;247:12;244:29;233:116;230:2;;;362:1;359;352:12;230:2;373:25;;-1:-1;50997:217:0;;421:4:-1;412:14;;;;50997:217:0;;;;;412:14:-1;50997:217:0;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;50997:217:0;;;;;;;;;;;;51229:52;51243:9;51254:17;51273:7;51229:13;:52::i;:::-;50170:1206;;;;;;;;;;51312:52;51326:9;51337:17;51356:7;51312:13;:52::i;:::-;49859:1524;;;:::o;55793:2366::-;55907:12;55921:13;55938:24;55952:9;55938:13;:24::i;:::-;55906:56;;;;55976:16;55994;56016:4;-1:-1:-1;;;;;56016:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;56016:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56016:18:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;56016:18:0;;;;;;;-1:-1:-1;;;;;55975:59:0;;;;-1:-1:-1;55975:59:0;;-1:-1:-1;48597:4:0;56053:24;;:52;;;;;48597:4;56081:8;:24;56053:52;56045:96;;;;;-1:-1:-1;;;56045:96:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;56154:13;56187:7;-1:-1:-1;;;;;56170:24:0;:4;-1:-1:-1;;;;;56170:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;56170:13:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56170:13:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;56170:13:0;-1:-1:-1;;;;;56170:24:0;;;-1:-1:-1;56170:24:0;;56213:36;;;56242:7;-1:-1:-1;;;;;56225:24:0;:4;-1:-1:-1;;;;;56225:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;56225:13:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56225:13:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;56225:13:0;-1:-1:-1;;;;;56225:24:0;;56213:36;56205:90;;;;-1:-1:-1;;;56205:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56332:16;;;56346:1;56332:16;;;56308:21;56332:16;;;;;56308:21;56332:16;;;;;109:14:-1;56332:16:0;88:42:-1;144:17;;-1:-1;56332:16:0;56308:40;;56369:7;56359:4;56364:1;56359:7;;;;;;;;;;;;;:17;-1:-1:-1;;;;;56359:17:0;;;-1:-1:-1;;;;;56359:17:0;;;;;56397:8;:40;;56424:4;-1:-1:-1;;;;;56424:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;56424:13:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56424:13:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;56424:13:0;56397:40;;;56408:4;-1:-1:-1;;;;;56408:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;56408:13:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56408:13:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;56408:13:0;56397:40;56387:4;56392:1;56387:7;;;;;;;;-1:-1:-1;;;;;56387:50:0;;;:7;;;;;;;;;;:50;;;;56475:40;;;-1:-1:-1;;;56475:40:0;;56509:4;56475:40;;;;;;56450:22;;56475:25;;;;;:40;;;;;;;;;;;:25;:40;;;2:2:-1;;;;27:1;24;17:12;2:2;56475:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56475:40:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;56475:40:0;;-1:-1:-1;56526:20:0;56557:204;;;;56601:50;56616:14;56632:8;56642;56601:14;:50::i;:::-;56586:65;;56557:204;;;56699:50;56714:14;56730:8;56740;56699:14;:50::i;:::-;56684:65;;56557:204;56773:47;56795:4;56800:1;56795:7;;;;;;;56773:47;56831:31;56876:6;;;;;;;;;-1:-1:-1;;;;;56876:6:0;-1:-1:-1;;;;;56865:57:0;;56941:12;56972:17;57008:4;57039;57063:15;56865:228;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;56865:228:0;-1:-1:-1;;;;;56865:228:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;56865:228:0;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;56865:228:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56865:228:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;56865:228:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;15:2;7:11;;4:2;;;31:1;28;21:12;4:2;56865:228:0;;;;;;;;;;;;;-1:-1:-1;;;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;219:3;213:10;331:9;325:2;311:12;307:21;289:16;285:44;282:59;-1:-1;;;247:12;244:29;233:116;230:2;;;362:1;359;352:12;230:2;373:25;;-1:-1;56865:228:0;;421:4:-1;412:14;;;;56865:228:0;;;;;412:14:-1;56865:228:0;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;56865:228:0;;;;;;;;;;;56831:262;;57106:47;57128:4;57133:1;57128:7;;;;;;;57106:47;57169:23;57207:6;;57242:7;;-1:-1:-1;;;;;57207:6:0;;;;57196:31;;57242:4;;57169:23;;57242:7;;;;;;;;;;57264:4;57269:1;57264:7;;;;;;;;;;;;;;57286:37;57305:14;57320:1;57305:17;;;;;;;;;;;;;;57286:14;:18;;:37;;;;:::i;:::-;57338:14;57353:1;57338:17;;;;;;;;;;;;;;;;;;57196:260;;;-1:-1:-1;;;;;;57196:260:0;;;;;;;-1:-1:-1;;;;;57196:260:0;;;;;;;;;;;;;;;;;;;;;;;;;;57370:1;57196:260;;;;;;;;;;57410:4;57196:260;;;;57430:15;57196:260;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57196:260:0;;;;2:2:-1;;;;27:1;24;17:12;2:2;57196:260:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;57196:260:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;57196:260:0;;;;-1:-1:-1;57469:52:0;57499:4;57514:5;57469:21;:52::i;:::-;57532:5;-1:-1:-1;;;;;57532:13:0;;57546:15;57532:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;57532:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;57696:30:0;;;-1:-1:-1;;;57696:30:0;;57720:4;57696:30;;;;;;57665:62;;-1:-1:-1;57684:10:0;;-1:-1:-1;;;;;;57696:15:0;;;;;:30;;;;;;;;;;;;;;:15;:30;;;2:2:-1;;;;27:1;24;17:12;2:2;57696:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;57696:30:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;57696:30:0;-1:-1:-1;;;;;57665:18:0;;;:62;;:18;:62;:::i;:::-;57828:30;;;-1:-1:-1;;;57828:30:0;;57852:4;57828:30;;;;;;57797:62;;57816:10;;-1:-1:-1;;;;;57828:15:0;;;;;:30;;;;;;;;;;;;;;:15;:30;;;2:2:-1;;;;27:1;24;17:12;57797:62:0;57930:20;57967:10;;;;;;;;;-1:-1:-1;;;;;57967:10:0;-1:-1:-1;;;;;57953:34:0;;57988:9;57953:45;;;;;;;;;;;;;-1:-1:-1;;;;;57953:45:0;-1:-1:-1;;;;;57953:45:0;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;57953:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;57953:45:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;57953:45:0;58079:27;;;-1:-1:-1;;;58079:27:0;;58095:10;58079:27;;;;;;57953:45;;-1:-1:-1;;;;;;58045:33:0;;;;;;58079:15;;;;;;:27;;;;;57953:45;;58079:27;;;;;;;:15;:27;;;2:2:-1;;;;27:1;24;17:12;2:2;58079:27:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;58079:27:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;58079:27:0;58045:74;;;-1:-1:-1;;;;;;58045:74:0;;;;;;;;;;;;;;58108:10;58045:74;;;;;;;;;;-1:-1:-1;;58045:74:0;;;;;;;-1:-1:-1;58045:74:0;;;;2:2:-1;;;;27:1;24;17:12;2:2;58045:74:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;58045:74:0;;;;58132:19;58146:4;58132:13;:19::i;:::-;55793:2366;;;;;;;;;;;;;;:::o;48557:44::-;48597:4;48557:44;:::o;54509:70::-;;;-1:-1:-1;;;;;54509:70:0;;:::o;53055:639::-;53135:12;53149:13;53166:24;53180:9;53166:13;:24::i;:::-;53134:56;;-1:-1:-1;53134:56:0;-1:-1:-1;53203:77:0;-1:-1:-1;;;;;53203:34:0;;53238:10;53258:4;53265:14;53203:77;:34;:77;:::i;:::-;53291:5;-1:-1:-1;;;;;53291:14:0;;53306;53291:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;53291:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53291:30:0;;;;48506:42;-1:-1:-1;;;;;53338:22:0;:4;-1:-1:-1;;;;;53338:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;53338:13:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53338:13:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;53338:13:0;-1:-1:-1;;;;;53338:22:0;;;;;:48;;;48506:42;-1:-1:-1;;;;;53364:22:0;:4;-1:-1:-1;;;;;53364:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;53364:13:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53364:13:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;53364:13:0;-1:-1:-1;;;;;53364:22:0;;;53338:48;53334:131;;;53410:43;53435:4;53442:10;53410:16;:43::i;:::-;53403:50;;;;53334:131;53479:46;53504:4;53519;53479:16;:46::i;:::-;53564:16;;;53578:1;53564:16;;;53538:23;53564:16;;;;;53538:23;53564:16;;;;;109:14:-1;53564:16:0;88:42:-1;144:17;;-1:-1;53564:16:0;53538:42;;53603:4;-1:-1:-1;;;;;53603:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;53603:13:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53603:13:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;53603:13:0;53591:9;;:6;;53598:1;;53591:9;;;;;;;;;:25;-1:-1:-1;;;;;53591:25:0;;;-1:-1:-1;;;;;53591:25:0;;;;;53639:4;-1:-1:-1;;;;;53639:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;53639:13:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53639:13:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;53639:13:0;53627:9;;:6;;53634:1;;53627:9;;;;;;;;;;;:25;-1:-1:-1;;;;;53627:25:0;;;-1:-1:-1;;;;;53627:25:0;;;;;53665:21;53679:6;53665:13;:21::i;:::-;53055:639;;;;;;:::o;54694:1091::-;54838:12;54852:13;54869:24;54883:9;54869:13;:24::i;:::-;54837:56;;;;54904:14;54921:4;-1:-1:-1;;;;;54921:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;54921:13:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;54921:13:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;54921:13:0;54962;;;-1:-1:-1;;;54962:13:0;;;;54921;;-1:-1:-1;54945:14:0;;-1:-1:-1;;;;;54962:11:0;;;;;:13;;;;;54921;;54962;;;;;;;:11;:13;;;2:2:-1;;;;27:1;24;17:12;2:2;54962:13:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;54962:13:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;54962:13:0;;-1:-1:-1;;;;;;54994:22:0;;;;;;;;:48;;;55030:12;-1:-1:-1;;;;;55020:22:0;:6;-1:-1:-1;;;;;55020:22:0;;54994:48;54986:104;;;;-1:-1:-1;;;54986:104:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55103:65;-1:-1:-1;;;;;55103:22:0;;55126:10;55146:4;55153:14;55103:65;:22;:65;:::i;:::-;55179:5;-1:-1:-1;;;;;55179:14:0;;55194;55179:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;55179:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;55179:30:0;;;;55220:46;55245:4;55260;55220:16;:46::i;:::-;55279:17;55309:12;-1:-1:-1;;;;;55299:22:0;:6;-1:-1:-1;;;;;55299:22:0;;:40;;55333:6;55299:40;;;55324:6;55299:40;55374:16;;;55388:1;55374:16;;;55350:21;55374:16;;;;;55279:60;;-1:-1:-1;55374:16:0;;;;;;;109:14:-1;55374:16:0;88:42:-1;144:17;;-1:-1;55374:16:0;55350:40;;55411:9;55401:4;55406:1;55401:7;;;;;;;;;;;;;:19;-1:-1:-1;;;;;55401:19:0;;;-1:-1:-1;;;;;55401:19:0;;;;;55441:12;55431:4;55436:1;55431:7;;;;;;;;;;;;;:22;-1:-1:-1;;;;;55431:22:0;;;-1:-1:-1;;;;;55431:22:0;;;;;55466:47;55488:4;55493:1;55488:7;;;;;;;55466:47;55535:6;;55582:42;;;-1:-1:-1;;;55582:42:0;;55618:4;55582:42;;;;;;-1:-1:-1;;;;;55535:6:0;;;;55524:43;;55582:27;;;;;;:42;;;;;;;;;;;;;;;:27;:42;;;2:2:-1;;;;27:1;24;17:12;2:2;55582:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;55582:42:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;55582:42:0;55524:221;;-1:-1:-1;;;;;;55524:221:0;;;;;;;;;;;;;;;;;;;55699:4;55524:221;;;;;;55719:15;55524:221;;;;;;;;;;;;;;;;;;;;;55639:18;;55672:4;;55524:221;;;;;;;55582:42;55524:221;;;;;;;;-1:-1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;55524:221:0;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;55524:221:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;55524:221:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;55524:221:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;15:2;7:11;;4:2;;;31:1;28;21:12;4:2;55524:221:0;;;;;;;;;;;;;-1:-1:-1;;;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;219:3;213:10;331:9;325:2;311:12;307:21;289:16;285:44;282:59;-1:-1;;;247:12;244:29;233:116;230:2;;;362:1;359;352:12;230:2;373:25;;-1:-1;55524:221:0;;421:4:-1;412:14;;;;55524:221:0;;;;;412:14:-1;55524:221:0;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;55524:221:0;;;;;;;;;;;;55758:19;55772:4;55758:13;:19::i;:::-;54694:1091;;;;;;;;;;:::o;48444:21::-;;;-1:-1:-1;;;;;48444:21:0;;:::o;52528:289::-;52593:12;52607:13;52649:9;52634:25;;52686:5;-1:-1:-1;;;;;52686:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;52686:13:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;52686:13:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;52686:13:0;52752:6;;52743:26;;;-1:-1:-1;;;52743:26:0;;;;52686:13;;-1:-1:-1;;;;;;52752:6:0;;;;52743:24;;:26;;;;;52686:13;;52743:26;;;;;;;;52752:6;52743:26;;;2:2:-1;;;;27:1;24;17:12;2:2;52743:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;52743:26:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;52743:26:0;52725:14;;;-1:-1:-1;;;52725:14:0;;;;-1:-1:-1;;;;;52725:44:0;;;;:12;;;;;:14;;;;;52743:26;;52725:14;;;;;;;:12;:14;;;2:2:-1;;;;27:1;24;17:12;2:2;52725:14:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;52725:14:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;52725:14:0;-1:-1:-1;;;;;52725:44:0;;52717:92;;;;-1:-1:-1;;;52717:92:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52528:289;;;:::o;3306:132::-;3364:7;3391:39;3395:1;3398;3391:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;3384:46;3306:132;-1:-1:-1;;;3306:132:0:o;1005:181::-;1063:7;1095:5;;;1119:6;;;;1111:46;;;;;-1:-1:-1;;;1111:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;1469:136;1527:7;1554:43;1558:1;1561;1554:43;;;;;;;;;;;;;;;;;:3;:43::i;42385:1239::-;42433:7;42457:6;42453:20;;-1:-1:-1;42472:1:0;42465:8;;42453:20;42651:1;42675;-1:-1:-1;;;42691:41:0;;42687:107;;42756:3;42749:10;;;;;42780:2;42774:8;42687:107;42814:19;42808:2;:25;42804:90;;42857:2;42850:9;;;;;42880:2;42874:8;42804:90;-1:-1:-1;;;42908:2:0;:17;42904:82;;42949:2;42942:9;;;;;42972:2;42966:8;42904:82;43006:7;43000:2;:13;42996:77;;43037:2;43030:9;;;;;43060:1;43054:7;42996:77;43093:5;43087:2;:11;43083:74;;43122:1;43115:8;;;;;43144:1;43138:7;43083:74;43177:4;43171:2;:10;43167:73;;43205:1;43198:8;;;;;43227:1;43221:7;43167:73;43260:3;43254:2;:9;43250:49;;43286:1;43280:7;43250:49;43328:1;43322;43318;:5;;;;;;43314:1;:9;43313:16;;43309:20;;43359:1;43353;43349;:5;;;;;;43345:1;:9;43344:16;;43340:20;;43390:1;43384;43380;:5;;;;;;43376:1;:9;43375:16;;43371:20;;43421:1;43415;43411;:5;;;;;;43407:1;:9;43406:16;;43402:20;;43452:1;43446;43442;:5;;;;;;43438:1;:9;43437:16;;43433:20;;43483:1;43477;43473;:5;;;;;;43469:1;:9;43468:16;;43464:20;;43514:1;43508;43504;:5;;;;;;43500:1;:9;43499:16;;43495:20;;43563:10;43580:1;43576;:5;;;;;;43563:18;;43604:2;43600:1;:6;:15;;43613:2;43600:15;;;43609:1;43600:15;43592:24;;;;;42385:1239;;;;:::o;27062:205::-;27190:68;;;-1:-1:-1;;;;;27190:68:0;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;27190:68:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;27163:96:0;;27183:5;;27163:19;:96::i;52825:222::-;52912:47;;;-1:-1:-1;;;52912:47:0;;52944:4;52912:47;;;;-1:-1:-1;;;;;52912:47:0;;;;;;;;;:23;;;;;;:47;;;;;;;;;;;;;;;:23;:47;;;2:2:-1;;;;27:1;24;17:12;2:2;52912:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;52912:47:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;52912:47:0;52908:132;;52981:47;-1:-1:-1;;;;;52981:25:0;;53007:7;-1:-1:-1;;52981:47:0;:25;:47;:::i;26877:177::-;26987:58;;;-1:-1:-1;;;;;26987:58:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;26987:58:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;26960:86:0;;26980:5;;26960:19;:86::i;49062:680::-;49130:15;49161:9;49156:579;49176:6;:13;49172:1;:17;49156:579;;;49228:6;49235:1;49228:9;;;;;;;;;;;;;;-1:-1:-1;;;;;49221:27:0;;49257:4;49221:42;;;;;;;;;;;;;-1:-1:-1;;;;;49221:42:0;-1:-1:-1;;;;;49221:42:0;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;49221:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;49221:42:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;49221:42:0;;-1:-1:-1;49282:11:0;;49278:446;;48506:42;-1:-1:-1;;;;;49318:18:0;:6;49325:1;49318:9;;;;;;;;;;;;;;-1:-1:-1;;;;;49318:18:0;;49314:395;;;48506:42;-1:-1:-1;;;;;49361:21:0;;49383:7;49361:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;49361:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;49491:12:0;;;49415;49491;;;;;;;;;;49433:93;;49415:12;;-1:-1:-1;49433:10:0;;-1:-1:-1;49456:7:0;;49491:12;;;;;49433:93;49491:12;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;49433:93:0;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;49414:112:0;;;49557:7;49549:40;;;;;-1:-1:-1;;;49549:40:0;;;;;;;;;;;;-1:-1:-1;;;49549:40:0;;;;;;;;;;;;;;;49314:395;;;;49638:51;49669:10;49681:7;49645:6;49652:1;49645:9;;;;;;;;;;;;;;-1:-1:-1;;;;;49638:30:0;;;:51;;;;;:::i;:::-;49191:3;;49156:579;;52143:377;52247:37;;;-1:-1:-1;;;52247:37:0;;52278:4;52247:37;;;;;;52215:70;;52241:4;;-1:-1:-1;;;;;52247:22:0;;;;;:37;;;;;;;;;;;;;;:22;:37;;;2:2:-1;;;;27:1;24;17:12;2:2;52247:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;52247:37:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;52247:37:0;-1:-1:-1;;;;;52215:25:0;;;:70;;:25;:70;:::i;:::-;52333:23;;;-1:-1:-1;;;52333:23:0;;-1:-1:-1;;;;;52333:23:0;;;;;;;;;52297:15;;;;52333:19;;;;;;:23;;;;;;;;;;;52297:15;52333:19;:23;;;2:2:-1;;;;27:1;24;17:12;2:2;52333:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;52333:23:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;52333:23:0;;;;;;;;;-1:-1:-1;52333:23:0;-1:-1:-1;48597:4:0;52377:24;;;52369:66;;;;;-1:-1:-1;;;52369:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;48597:4;52454:7;:24;;52446:66;;;;;-1:-1:-1;;;52446:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;3934:278;4020:7;4055:12;4048:5;4040:28;;;;-1:-1:-1;;;4040:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;4040:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4079:9;4095:1;4091;:5;;;;;;;3934:278;-1:-1:-1;;;;;3934:278:0:o;1908:192::-;1994:7;2030:12;2022:6;;;;2014:29;;;;-1:-1:-1;;;2014:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;2014:29:0;-1:-1:-1;;;2066:5:0;;;1908:192::o;29182:761::-;29606:23;29632:69;29660:4;29632:69;;;;;;;;;;;;;;;;;29640:5;-1:-1:-1;;;;;29632:27:0;;;:69;;;;;:::i;:::-;29716:17;;29606:95;;-1:-1:-1;29716:21:0;29712:224;;29858:10;29847:30;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;29847:30:0;29839:85;;;;-1:-1:-1;;;29839:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27536:622;27906:10;;;27905:62;;-1:-1:-1;27922:39:0;;;-1:-1:-1;;;27922:39:0;;27946:4;27922:39;;;;-1:-1:-1;;;;;27922:39:0;;;;;;;;;:15;;;;;;:39;;;;;;;;;;;;;;;:15;:39;;;2:2:-1;;;;27:1;24;17:12;2:2;27922:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27922:39:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;27922:39:0;:44;27905:62;27897:152;;;;-1:-1:-1;;;27897:152:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28087:62;;;-1:-1:-1;;;;;28087:62:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;28087:62:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;28060:90:0;;28080:5;;28060:19;:90::i;13003:196::-;13106:12;13138:53;13161:6;13169:4;13175:1;13178:12;13138:22;:53::i;:::-;13131:60;13003:196;-1:-1:-1;;;;13003:196:0:o;14380:979::-;14510:12;14543:18;14554:6;14543:10;:18::i;:::-;14535:60;;;;;-1:-1:-1;;;14535:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;14669:12;14683:23;14710:6;-1:-1:-1;;;;;14710:11:0;14730:8;14741:4;14710:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;14710:36:0;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;14668:78:0;;;;14761:7;14757:595;;;14792:10;-1:-1:-1;14785:17:0;;-1:-1:-1;14785:17:0;14757:595;14906:17;;:21;14902:439;;15169:10;15163:17;15230:15;15217:10;15213:2;15209:19;15202:44;15117:148;15305:20;;-1:-1:-1;;;15305:20:0;;;;;;;;;;;;;;;;;15312:12;;15305:20;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;10085:422:0;10452:20;10491:8;;;10085:422::o

Swarm Source

ipfs://56cd8c13e40381174b2e32fb29b15eae47e26347ac10cb01d34d9d1dd2849e6e
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.