Contract 0xA5aDE4EAC20a1F1f90a51E5eaA2852D8ea098C89 2

Txn Hash Method
Block
From
To
Value [Txn Fee]
0xd666c48e4ca2c2cd510200a0a17cb065684232ed29ec96a967b3b768a625c8bfDeposit415605832022-06-28 19:46:315 hrs 1 min ago0x9424fe3384934c291bf68a0f0ac57ab124586e4d IN  0xa5ade4eac20a1f1f90a51e5eaa2852d8ea098c895 FTM0.007021791043
0x3dad4ecc82277e3c20d6811afd6c6c6154401703b090e59adeef74e05e4e57e2Update TWAP415567072022-06-28 18:30:046 hrs 17 mins ago0x4e5b3043feb9f939448e2f791a66c4ea65a315a8 IN  0xa5ade4eac20a1f1f90a51e5eaa2852d8ea098c890 FTM0.000798486339
0xc52cf48e652550924f33971b4d37ad12cbbd9ed1d2a403cec55e15c9a0c698daUpdate TWAP415566702022-06-28 18:29:256 hrs 18 mins ago0x4e5b3043feb9f939448e2f791a66c4ea65a315a8 IN  0xa5ade4eac20a1f1f90a51e5eaa2852d8ea098c890 FTM0.000870841879
0x2cda27e925c5ca4143e461189fa134e501790dc9358b1fe898b3f153c0f7e73fUpdate TWAP412347882022-06-24 15:07:344 days 9 hrs ago0x4e5b3043feb9f939448e2f791a66c4ea65a315a8 IN  0xa5ade4eac20a1f1f90a51e5eaa2852d8ea098c890 FTM0.013299717831
0x6427de194f36c05b6c4d47a156d51c58c85ffafe90cb3f259367ad140938f09dUpdate TWAP412347752022-06-24 15:07:144 days 9 hrs ago0x4e5b3043feb9f939448e2f791a66c4ea65a315a8 IN  0xa5ade4eac20a1f1f90a51e5eaa2852d8ea098c890 FTM0.028241281921
0x919322d255ddbddbee1bf8a7a5a10cf65c6e95215e7acf6ee594afa29dfb4028Update TWAP409515752022-06-20 18:12:118 days 6 hrs ago0x4e5b3043feb9f939448e2f791a66c4ea65a315a8 IN  0xa5ade4eac20a1f1f90a51e5eaa2852d8ea098c890 FTM0.256216825814
0xd1cb8857b4576a5ca8a33a018014322d484fa5471496a26b0b059b102875a432Update TWAP409515232022-06-20 18:11:158 days 6 hrs ago0x4e5b3043feb9f939448e2f791a66c4ea65a315a8 IN  0xa5ade4eac20a1f1f90a51e5eaa2852d8ea098c890 FTM0.004200433637
0x0cb1571be2a7713fcfd6699c3974d6c7c9c7bd0fc2d6fae427625cb8a51ee3eeUpdate TWAP407357552022-06-17 18:59:0411 days 5 hrs ago0x4e5b3043feb9f939448e2f791a66c4ea65a315a8 IN  0xa5ade4eac20a1f1f90a51e5eaa2852d8ea098c890 FTM0.003695402959
0xb125587333b000fc06cbdf699a4e98d7af1c476721cca033578610db507cdf81Update TWAP407355312022-06-17 18:54:3711 days 5 hrs ago0x4e5b3043feb9f939448e2f791a66c4ea65a315a8 IN  0xa5ade4eac20a1f1f90a51e5eaa2852d8ea098c890 FTM0.004670862394
0xa201e9efc2b7ff2bb32706cf02c009afcd511519abc54f66e12749cb5c50dfe6Update TWAP405780982022-06-15 14:02:4313 days 10 hrs ago0x4e5b3043feb9f939448e2f791a66c4ea65a315a8 IN  0xa5ade4eac20a1f1f90a51e5eaa2852d8ea098c890 FTM0.013114480968
0xd38078edfdb15aafe61a658ff35fc3e0de82b4a4a3cb894a76f49b4d4140a50dUpdate TWAP405780622022-06-15 14:01:5813 days 10 hrs ago0x4e5b3043feb9f939448e2f791a66c4ea65a315a8 IN  0xa5ade4eac20a1f1f90a51e5eaa2852d8ea098c890 FTM0.013207554574
0xe45412e23f422ec2ac61f3644426a1d268353d9031a44d78f3b27622d4c8e006Claim Yel404304732022-06-13 13:58:3215 days 10 hrs ago0xbb01412c5ff077e35d2b19819cad9e6ee28b09d8 IN  0xa5ade4eac20a1f1f90a51e5eaa2852d8ea098c890 FTM0.882429687
0xa42586db26ed2bf3efe74d92fc835492db70e663635d8c85a59502d39e02b213Request Withdraw404303792022-06-13 13:56:4315 days 10 hrs ago0xbb01412c5ff077e35d2b19819cad9e6ee28b09d8 IN  0xa5ade4eac20a1f1f90a51e5eaa2852d8ea098c890 FTM1.090057821901
0x536f69bc2eb84907a46eace795ae63fb4e096a66020d7fcd7655decd87ba18e7Update TWAP400740252022-06-08 15:51:2020 days 8 hrs ago0x4e5b3043feb9f939448e2f791a66c4ea65a315a8 IN  0xa5ade4eac20a1f1f90a51e5eaa2852d8ea098c890 FTM0.00496444222
0x83caf9b011bd76a33a5d7a62e541498cedabe010ba16c21901667dc1c4f48b94Update TWAP400739632022-06-08 15:49:4720 days 8 hrs ago0x4e5b3043feb9f939448e2f791a66c4ea65a315a8 IN  0xa5ade4eac20a1f1f90a51e5eaa2852d8ea098c890 FTM0.009554843875
0x42cfe74f4aee5c75721db95e4ffc97f527afc3f0e6a0ca6d0009e5af7bb86121Update TWAP397111562022-06-03 19:20:5525 days 5 hrs ago0x4e5b3043feb9f939448e2f791a66c4ea65a315a8 IN  0xa5ade4eac20a1f1f90a51e5eaa2852d8ea098c890 FTM0.001131278043
0x2c66bbf4d13e7f364fbfd6199bcc0a08f9c833b05f91953741848593950a1cbfUpdate TWAP397110822022-06-03 19:19:4225 days 5 hrs ago0x4e5b3043feb9f939448e2f791a66c4ea65a315a8 IN  0xa5ade4eac20a1f1f90a51e5eaa2852d8ea098c890 FTM0.007323513891
0x3b31775f2798bb18972c4c83f9521e419e414eb6072670b68c2ae044800dc20dClaim Yel394684532022-05-31 12:54:2728 days 11 hrs ago0x4e83362442b8d1bec281594cea3050c8eb01311c IN  0xa5ade4eac20a1f1f90a51e5eaa2852d8ea098c890 FTM0.118604742514
0xf2e1ec15d700fc313e5f280601aaf41f2c461a29430015151310a6ee83b02eabRequest Withdraw394683942022-05-31 12:53:0228 days 11 hrs ago0x4e83362442b8d1bec281594cea3050c8eb01311c IN  0xa5ade4eac20a1f1f90a51e5eaa2852d8ea098c890 FTM0.168181679679
0xa8954fa208df67a65a9d7083846d8d49e9ee26f3ca01a4b47ec9674402a15eb8Update TWAP392636302022-05-28 18:04:0831 days 6 hrs ago0x4e5b3043feb9f939448e2f791a66c4ea65a315a8 IN  0xa5ade4eac20a1f1f90a51e5eaa2852d8ea098c890 FTM0.001184653738
0xb58ff19b3c8dbe30cc3b94a82e23133fe7b28e1a01f30378dc235995e1b106e4Update TWAP392635772022-05-28 18:03:1731 days 6 hrs ago0x4e5b3043feb9f939448e2f791a66c4ea65a315a8 IN  0xa5ade4eac20a1f1f90a51e5eaa2852d8ea098c890 FTM0.001153341453
0x6c2f8ccfbdd9c50429fffb0b32b4d3a3fd63b716f994f4a6abd79320ee826d90Update TWAP390221392022-05-25 11:04:2534 days 13 hrs ago0x4e5b3043feb9f939448e2f791a66c4ea65a315a8 IN  0xa5ade4eac20a1f1f90a51e5eaa2852d8ea098c890 FTM0.48153908321
0x43ea03b9a52522b21ab879a6e2b68f460e3c1974138742e62e0f8095fa71c58cUpdate TWAP390221262022-05-25 11:04:0434 days 13 hrs ago0x4e5b3043feb9f939448e2f791a66c4ea65a315a8 IN  0xa5ade4eac20a1f1f90a51e5eaa2852d8ea098c890 FTM0.48153908321
0x340bf21cd73bdfb2af2d9560926763478a09b1b161c66c4a68a5011b6dfd127bDeposit389832012022-05-24 22:35:4635 days 2 hrs ago0x386d1ab0d50764e135b10247574264bec20f3e03 IN  0xa5ade4eac20a1f1f90a51e5eaa2852d8ea098c8950 FTM0.16446948
0x97315f1df2566731b947da6981d1e80fbb7965fc13699c234e3e44c10e8904c5Deposit388853602022-05-23 14:31:2936 days 10 hrs ago0xc00a6614b8030ce216302016e11c6b4140b5e499 IN  0xa5ade4eac20a1f1f90a51e5eaa2852d8ea098c897 FTM3.470499
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xd666c48e4ca2c2cd510200a0a17cb065684232ed29ec96a967b3b768a625c8bf415605832022-06-28 19:46:315 hrs 1 min ago 0xa5ade4eac20a1f1f90a51e5eaa2852d8ea098c89 0x584f21aee241dbf21e5d3f4428e9cd9bb4890b615 FTM
0x340bf21cd73bdfb2af2d9560926763478a09b1b161c66c4a68a5011b6dfd127b389832012022-05-24 22:35:4635 days 2 hrs ago 0xa5ade4eac20a1f1f90a51e5eaa2852d8ea098c89 0x584f21aee241dbf21e5d3f4428e9cd9bb4890b6150 FTM
0x97315f1df2566731b947da6981d1e80fbb7965fc13699c234e3e44c10e8904c5388853602022-05-23 14:31:2936 days 10 hrs ago 0xa5ade4eac20a1f1f90a51e5eaa2852d8ea098c89 0x584f21aee241dbf21e5d3f4428e9cd9bb4890b617 FTM
0xffbcb15203f48ca0bdaac16602dd57af9ea6c0fca8f4d4d663615c660d856453386683662022-05-20 15:48:5439 days 8 hrs ago 0xa5ade4eac20a1f1f90a51e5eaa2852d8ea098c89 0x584f21aee241dbf21e5d3f4428e9cd9bb4890b6110 FTM
0xf763e10910ce1f6ea189e9a322dec6d190bcce9ea4901ea4dfca410e947d2653386069022022-05-19 19:39:4040 days 5 hrs ago 0xa5ade4eac20a1f1f90a51e5eaa2852d8ea098c89 0x584f21aee241dbf21e5d3f4428e9cd9bb4890b6110 FTM
0xd0b882427d11c1710ca46f4d0a3be2fc4c0fd4da83d3d253973d485c955d8cc2378302382022-05-08 11:24:2451 days 13 hrs ago 0xa5ade4eac20a1f1f90a51e5eaa2852d8ea098c89 0x584f21aee241dbf21e5d3f4428e9cd9bb4890b614.980502 FTM
0xe8a5113e945eb388160d80d14fc74add52fdf320348b39def2939eefca570db3370846072022-04-27 16:50:3462 days 7 hrs ago 0xa5ade4eac20a1f1f90a51e5eaa2852d8ea098c89 0x584f21aee241dbf21e5d3f4428e9cd9bb4890b61515 FTM
0xd95d68eec41f896e18f0193ebc945b5afc1b21343b814c5e07ecfc2a652c2a83363832402022-04-18 16:25:0871 days 8 hrs ago 0xa5ade4eac20a1f1f90a51e5eaa2852d8ea098c89 0x584f21aee241dbf21e5d3f4428e9cd9bb4890b61170 FTM
0xebfb2a99d35f5f3a52bd9e62eb4d41ba3e7ed8421113fe6ecc530b58bf6f5476361631382022-04-16 0:54:5473 days 23 hrs ago 0xa5ade4eac20a1f1f90a51e5eaa2852d8ea098c89 0x584f21aee241dbf21e5d3f4428e9cd9bb4890b6135 FTM
0x7cb8b570b430d40284ff21606e93e6c2e65ab14f06f751d87eb6ceb5b031d69f355641302022-04-08 18:09:2781 days 6 hrs ago 0xa5ade4eac20a1f1f90a51e5eaa2852d8ea098c89 0x584f21aee241dbf21e5d3f4428e9cd9bb4890b61300 FTM
0x7cb8b570b430d40284ff21606e93e6c2e65ab14f06f751d87eb6ceb5b031d69f355641302022-04-08 18:09:2781 days 6 hrs ago 0xe5b882839614343187cbe976d9307196cafc077c 0xa5ade4eac20a1f1f90a51e5eaa2852d8ea098c89300 FTM
0xac472341ab9ad7d4f96fd744e90a264c885d88ac87f9107c61a851ca8070bd54353161942022-04-05 17:52:1584 days 6 hrs ago 0xa5ade4eac20a1f1f90a51e5eaa2852d8ea098c89 0x584f21aee241dbf21e5d3f4428e9cd9bb4890b61200 FTM
0xac472341ab9ad7d4f96fd744e90a264c885d88ac87f9107c61a851ca8070bd54353161942022-04-05 17:52:1584 days 6 hrs ago 0xe0d01c4ec8150d54b1a39df3d8e4cae036467128 0xa5ade4eac20a1f1f90a51e5eaa2852d8ea098c89200 FTM
0xbfc6eaf9e34227b4c2706c06b16f8eb608cb6f1e574d0306f107f19649d7f4a6352889672022-04-05 10:11:4284 days 14 hrs ago 0xa5ade4eac20a1f1f90a51e5eaa2852d8ea098c89 0x584f21aee241dbf21e5d3f4428e9cd9bb4890b61900 FTM
0xbfc6eaf9e34227b4c2706c06b16f8eb608cb6f1e574d0306f107f19649d7f4a6352889672022-04-05 10:11:4284 days 14 hrs ago 0x8eaadd95dc24374a473595bad4599f491ff82fa3 0xa5ade4eac20a1f1f90a51e5eaa2852d8ea098c89900 FTM
0x0cb9686af462459f0c0b824ac95b0a44796934c0cde9d2c47ed67502790773df352887812022-04-05 10:08:4184 days 14 hrs ago 0xa5ade4eac20a1f1f90a51e5eaa2852d8ea098c89 0x584f21aee241dbf21e5d3f4428e9cd9bb4890b61100 FTM
0x0cb9686af462459f0c0b824ac95b0a44796934c0cde9d2c47ed67502790773df352887812022-04-05 10:08:4184 days 14 hrs ago 0x8eaadd95dc24374a473595bad4599f491ff82fa3 0xa5ade4eac20a1f1f90a51e5eaa2852d8ea098c89100 FTM
0xb59fe4c5bb1b63f0234e1dccf4ccf7cd69e4090ddf4382b4dd40aa1a882a5407350557252022-04-02 16:03:4687 days 8 hrs ago 0xa5ade4eac20a1f1f90a51e5eaa2852d8ea098c89 0x584f21aee241dbf21e5d3f4428e9cd9bb4890b615 FTM
0xb59fe4c5bb1b63f0234e1dccf4ccf7cd69e4090ddf4382b4dd40aa1a882a5407350557252022-04-02 16:03:4687 days 8 hrs ago 0x3ea7942aa893474e9d368c3b38b254de807bc217 0xa5ade4eac20a1f1f90a51e5eaa2852d8ea098c895 FTM
0x5d817580874ea390be657ceea7e2b6867b58bf62147e365f9ead38cfa9f532d8350226312022-04-02 6:31:2987 days 18 hrs ago 0xa5ade4eac20a1f1f90a51e5eaa2852d8ea098c89 0x584f21aee241dbf21e5d3f4428e9cd9bb4890b61100 FTM
0x5d817580874ea390be657ceea7e2b6867b58bf62147e365f9ead38cfa9f532d8350226312022-04-02 6:31:2987 days 18 hrs ago 0xe5b882839614343187cbe976d9307196cafc077c 0xa5ade4eac20a1f1f90a51e5eaa2852d8ea098c89100 FTM
0xb26b1bd21aa4300e5f4c675ddcf1e19f93ca309de2350eda9aec2ea7941c4d3e348454772022-03-31 2:51:2689 days 21 hrs ago 0xa5ade4eac20a1f1f90a51e5eaa2852d8ea098c89 0x584f21aee241dbf21e5d3f4428e9cd9bb4890b6110 FTM
0xb26b1bd21aa4300e5f4c675ddcf1e19f93ca309de2350eda9aec2ea7941c4d3e348454772022-03-31 2:51:2689 days 21 hrs ago 0x66e207d158d59073c93ff7c098729abd2ec53285 0xa5ade4eac20a1f1f90a51e5eaa2852d8ea098c8910 FTM
0x0e47a117eb6855f1e08d4e609115b7a1fb173adbbf04f037a31d993405670fa0348001542022-03-30 14:07:5190 days 10 hrs ago 0xa5ade4eac20a1f1f90a51e5eaa2852d8ea098c89 0x584f21aee241dbf21e5d3f4428e9cd9bb4890b6174 FTM
0x0e47a117eb6855f1e08d4e609115b7a1fb173adbbf04f037a31d993405670fa0348001542022-03-30 14:07:5190 days 10 hrs ago 0xd94e49c486a243dfa514e68136e32c412fb23a7e 0xa5ade4eac20a1f1f90a51e5eaa2852d8ea098c8974 FTM
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
VaultH2O

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at FtmScan.com on 2021-11-21
*/

// SPDX-License-Identifier: MIT

pragma solidity =0.8.9;


interface IERC20Simplified {
    /**
     * @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 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);
}


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


interface IERC20MetadataS is IERC20Simplified {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}


interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

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;
        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");

        (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");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        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

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

library SafeERC20 {
    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'
        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) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            uint256 newAllowance = oldAllowance - value;
            _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
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}


contract ERC20Simplified is Context, IERC20Simplified, IERC20MetadataS {
    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    function name() public view virtual override returns (string memory) {
        return _name;
    }

    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

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

    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

        emit Transfer(account, address(0), amount);
    }
}


contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override 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 this function is
     * overridden;
     *
     * 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 virtual override returns (uint8) {
        return 18;
    }

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

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual 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);

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
        unchecked {
            _approve(sender, _msgSender(), currentAllowance - amount);
        }

        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] + 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) {
        uint256 currentAllowance = _allowances[_msgSender()][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(_msgSender(), spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `sender` to `recipient`.
     *
     * This 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);

        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[sender] = senderBalance - amount;
        }
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(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:
     *
     * - `account` 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 += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

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

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(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 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 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 {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been 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 _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}


library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}


interface IStrategy {
    function WETH() external view returns (address);
    function router() external view returns (address);
    function lpToken() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function farm() external view returns (address);
    function pid() external view returns (uint256);
    function hasPid() external view returns (bool);
    function getTotalCapitalInternal() external view returns (uint256);
    function getTotalCapital() external view returns (uint256);
    function getAmountLPFromFarm() external view returns (uint256);
    function getPendingYel(address) external view returns (uint256);
    function claimYel(address) external;
    function setRouter(address) external;
    function requestWithdraw(address, uint256) external;
    function withdrawUSDTFee(address) external;
    function emergencyWithdraw(address) external;
    function autoCompound() external;
    function deposit() external payable returns (uint256);
    function depositAsMigrate() external;
    function migrate(uint256) external;
    function updateTWAP() external;
    function token1TWAP() external view returns (uint256);
    function token0TWAP() external view returns (uint256);
    function token1Price() external view returns (uint256);
    function token0Price() external view returns (uint256);
}

contract VaultH2O is ERC20Simplified, Ownable {
    using SafeERC20 for IERC20;
    using Address for address;

    mapping(address => uint256) private requestBlock;
    mapping(uint256 => bool) public nameExist;
    mapping(uint256 => address) public strategies;
    mapping(address => bool) public strategyExist;

    uint256 public constant REQUIRED_NUMBER_OF_BLOCKS = 10;
    uint256 public NUMBER_OF_BLOCKS_BTW_TX = 2;
    uint256 public lastExecutableBlockByOwner;
    uint256 public lastExecutableBlockAfterDeposit;
    uint256 public depositLimitMIN;
    uint256 public defaultStrategyID = 0;
    uint256 public depositLimit;
    address public governance;

    // string messages
    string DIFFERENCE_BLOCK_ERROR = "Difference of blocks is less than REQUIRED_NUMBER_OF_BLOCKS";
    string NO_STRATEGY_ERROR = "There is no strategy";
    string STRATEGY_DOES_NOT_EXIST = "The Name of strategy with this ID does not exist";

    uint256[] private names;
    
    event DepositToVault(uint256 amount);
    event RequestYelFromStrategies();
    event PartialMigrate(uint256 amount);
    event Migrate(uint256 amount);

    constructor() ERC20Simplified("EQ Shares H2O", "EQS") {
        depositLimit = 1000 * 10 ** 18;
        depositLimitMIN = 1 * 10 ** 17; // 0.1
        governance = 0x4e5b3043FEB9f939448e2F791a66C4EA65A315a8;
    }

    receive() external payable {
        deposit();
    }

    modifier onlyOwnerOrGovernance() {
        require(
            owner() == _msgSender() || governance == _msgSender(),
            "The sender is not the owner or governance"
        );
        _;
    }

    modifier onlyGovernance() {
        require(governance == _msgSender(), "The sender is not governance");
        _;
    }

    modifier whenNotBlocked() {
        uint256 currentBlock = block.number;
        if(requestBlock[msg.sender] == 0) {
            _;
            requestBlock[msg.sender] = currentBlock;
        } else {
            if(_isNotBlockedByTime()) {
                _;
                requestBlock[msg.sender] = currentBlock;
            } else {
                revert(DIFFERENCE_BLOCK_ERROR);
            }
        }
    }

    modifier notBlocked() {
        _checkBlockedByTime();
        _executableAfterUpdate();
        _;
    }

    modifier executableAfterUpdate() {
        _executableAfterUpdate();
        _;
    }

    function deposit() public payable notBlocked {
        require(
            block.number - lastExecutableBlockAfterDeposit > NUMBER_OF_BLOCKS_BTW_TX,
            "NUMBER_OF_BLOCKS_BTW_TX blocks is required between deposit"
        );
        require(msg.value >= depositLimitMIN, "Funds should be >= than depositLimitMIN");
        autoCompound();
        _checkDeposit(getTotalCapital(), msg.value);
        require(names.length != 0, NO_STRATEGY_ERROR);
        uint256 shares;
        uint256 totalCapitalInternal = getTotalCapitalInternal();
        uint256 depositorCapitalValue = IStrategy(currentStrategy()).deposit{value: msg.value}();
        if (totalCapitalInternal == 0 || totalSupply() == 0) {
            shares = depositorCapitalValue;
        } else {
            uint256 FTMperShare = totalCapitalInternal * (10**12) / totalSupply();
            shares = depositorCapitalValue * (10**12) / FTMperShare;
        }
        _mint(msg.sender, shares);
        lastExecutableBlockAfterDeposit = block.number;
        emit DepositToVault(depositorCapitalValue);
    }

    function requestWithdraw(uint256 _shares) public whenNotBlocked {
        require(names.length != 0, NO_STRATEGY_ERROR);
        require(totalSupply() != 0, "Total share value is zero");
        require(_shares > 0, "Amount of shares can not be a zero value");
        autoCompound();
        uint256 percent = _shares * 100 * 10**12 / totalSupply();
        require(_shares <= totalSupply(), "Percent can not be more than 100");
        _burn(msg.sender, _shares);
        _requestYelFromStrategies(msg.sender, percent);
        emit RequestYelFromStrategies();
    }

    function claimYel() public notBlocked {
        autoCompound();
        uint256 _YELamount = 0;
        uint256 _YELamountTotal = 0;
        for (uint256 i; i < names.length; i++) {
            _YELamount = IStrategy(strategies[names[i]]).getPendingYel(msg.sender);
            if(_YELamount > 0) {
                IStrategy(strategies[names[i]]).claimYel(msg.sender);
                _YELamountTotal += _YELamount;
            }
        }
        require(_YELamountTotal > 0, "You don't have any pending YEL");
    }

    function setDefaultStrategy(uint256 _nameID) public onlyOwnerOrGovernance {
        _checkParameters(_nameID);
        defaultStrategyID = _nameID;
    }

    function getPendingYel(address _address) public view returns (uint256 _YELamount) {
        for (uint256 i; i < names.length; i++) {
            _YELamount += IStrategy(strategies[names[i]]).getPendingYel(_address);
        }
    }

    function getRemainingBlocks(address _address) public view returns (uint256) {
        // just double check if the user uses the contract at the first time
        if (requestBlock[_address] == 0) {
            return 0;
        }
        uint256 amountFromLast = block.number - requestBlock[_address];
        if (amountFromLast >= REQUIRED_NUMBER_OF_BLOCKS)
            return 0;
        else
            return REQUIRED_NUMBER_OF_BLOCKS - amountFromLast;
    }

    function nameIDs() public view returns (uint256[] memory) {
        return names;
    }

    function nameIDLength() public view returns(uint256) {
        return names.length;
    }

    function currentStrategy() public view returns (address) {
        require(names.length > 0, "This vault does not have any strategies");
        return strategies[defaultStrategyID];
    }

    function strategyInfo(uint256 _nameID) public view returns (
        address _router,
        address _lpToken,
        address _token1,
        address _token0,
        address _farm,
        string memory _pid,
        uint256 _totalLP,
        uint256 _totalCapital,
        uint256 _totalCapitalInternal) {
        require(nameExist[_nameID], STRATEGY_DOES_NOT_EXIST);
        _router = IStrategy(strategies[_nameID]).router();
        _lpToken = IStrategy(strategies[_nameID]).lpToken();
        _token1 = IStrategy(strategies[_nameID]).token1();
        _token0 = IStrategy(strategies[_nameID]).token0();
        _farm = IStrategy(strategies[_nameID]).farm();
        if(IStrategy(strategies[_nameID]).hasPid()) {
            _pid = Strings.toString(IStrategy(strategies[_nameID]).pid());
        } else {
            _pid = "No pid";
        }
        _totalCapital = IStrategy(strategies[_nameID]).getTotalCapital();
        _totalCapitalInternal = IStrategy(strategies[_nameID]).getTotalCapitalInternal();
        _totalLP = IStrategy(strategies[_nameID]).getAmountLPFromFarm();
    }

    function strategyInfo2(uint256 _nameID) public view returns (
        uint256 _token1TWAP,
        uint256 _token0TWAP,
        uint256 _token1Price,
        uint256 _token0Price) {
        require(nameExist[_nameID], STRATEGY_DOES_NOT_EXIST);
        address _strategy = strategies[_nameID];
        _token1TWAP = IStrategy(_strategy).token1TWAP();
        _token0TWAP = IStrategy(_strategy).token0TWAP();
        _token1Price = IStrategy(_strategy).token1Price();
        _token0Price = IStrategy(_strategy).token0Price();
    }

    function autoCompound() public executableAfterUpdate {
        require(names.length != 0, NO_STRATEGY_ERROR);
        for (uint256 i = 0; i < names.length; i++) {
            IStrategy(strategies[names[i]]).autoCompound();
        }
    }


    function getTotalCapital() public view returns (uint256 totalCapital) {
        require(names.length != 0, NO_STRATEGY_ERROR);
        for (uint256 i = 0; i < names.length; i++) {
            totalCapital += IStrategy(strategies[names[i]]).getTotalCapital();
        }
    }

    function getTotalCapitalInternal() public view returns (uint256 totalCapital) {
        require(names.length != 0, NO_STRATEGY_ERROR);
        for (uint256 i = 0; i < names.length; i++) {
            totalCapital += IStrategy(strategies[names[i]]).getTotalCapitalInternal();
        }
    }

    function withdrawFee() onlyOwner public {
        for(uint256 i = 0; i < names.length; i++) {
            IStrategy(strategies[names[i]]).withdrawUSDTFee(msg.sender);
        }
    }

    function setNumberOfBlocksBtwTX(uint256 _amount) onlyOwner public {
        NUMBER_OF_BLOCKS_BTW_TX = _amount;
    }

    function updateTWAP() onlyOwner public {
        for(uint256 i = 0; i < names.length; i++) {
            IStrategy(strategies[names[i]]).updateTWAP();
        }
        lastExecutableBlockByOwner = block.number;
    }

    function emergencyWithdraw() public onlyGovernance {
        for (uint256 i; i < names.length; i++) {
            IStrategy(strategies[names[i]]).emergencyWithdraw(msg.sender);
        }
    }

    function setGovernance(address _governance) external onlyOwner {
        require(
            _governance != address(0),
            "Government can not be a zero address"
        );
        governance = _governance;
    }

    function setDepositLimit(uint256 _amount) external onlyOwnerOrGovernance {
        depositLimit = _amount;
    }

    function addStrategy(address _newStrategy, uint256 _nameID) public onlyOwnerOrGovernance {
        require(_newStrategy != address(0), "The strategy can not be a zero address");
        require(strategies[_nameID] == address(0), "This strategy is not empty");
        require(!strategyExist[_newStrategy], "This strategy already exists");
        if (!nameExist[_nameID]) {
            names.push(_nameID);
            nameExist[_nameID] = true;
            strategyExist[_newStrategy] = true;
        }
        strategies[_nameID] = _newStrategy;
    }

    function removeStrategy(uint256 _nameID) public onlyOwnerOrGovernance {
        _checkParameters(_nameID);
        require(
            strategies[_nameID] != currentStrategy(),
            "Can not remove the current strategy"
        );
        require(IStrategy(strategies[_nameID]).getTotalCapitalInternal() == 0,
            "Total capital internal is not zero"
        );
        require(IStrategy(strategies[_nameID]).getTotalCapital() == 0,
            "Total capital is not zero"
        );

        // continue removing strategy
        nameExist[_nameID] = false;
        strategyExist[strategies[_nameID]] = false;
        strategies[_nameID] = address(0);
        if(names.length != 1) {
            for(uint256 i = 0; i < names.length; i++){
                if(names[i] == _nameID) {
                    if(i != names.length-1) {
                        names[i] = names[names.length-1];
                    }
                    names.pop();
                }
            }
        } else {
            names.pop();
        }
    }

    function setRouterForStrategy(address _newRouter, uint256 _nameID) public onlyOwnerOrGovernance {
        _checkParameters(_nameID);
        require(_newRouter != address(0), "Router can not be a zero address");
        IStrategy(strategies[_nameID]).setRouter(_newRouter);
    }

    function migrate(
        uint256 _nameIdFrom,
        uint256 _amountInPercent,
        uint256 _nameIdTo) public onlyOwnerOrGovernance {
        _migrate(_nameIdFrom, _amountInPercent, _nameIdTo);
    }

    function withdrawSuddenTokens(address _token) public onlyOwner {
        IERC20(_token).transfer(payable(msg.sender), IERC20(_token).balanceOf(address(this)));
    }

    function _executableAfterUpdate() internal view {
        require(
            block.number - lastExecutableBlockByOwner > NUMBER_OF_BLOCKS_BTW_TX,
            "NUMBER_OF_BLOCKS_BTW_TX blocks is required"
        );
    }

    function _checkParameters(uint256 _nameID) internal view {
        require(names.length > 1, "Not enough strategies");
        require(nameExist[_nameID], STRATEGY_DOES_NOT_EXIST);
    }

    function _isNotBlockedByTime() internal view returns (bool) {
        return block.number - requestBlock[msg.sender] >= REQUIRED_NUMBER_OF_BLOCKS;
    }

    function _checkBlockedByTime() internal view {
        require(_isNotBlockedByTime(), DIFFERENCE_BLOCK_ERROR);
    }

    function _migrate(uint256 _nameIdFrom, uint256 _amountInPercent, uint256 _nameIdTo) internal {
        // TODO: return error if totalCapital on strategy 0 
        _checkParameters(_nameIdFrom);
        require(nameExist[_nameIdTo], "The _nameIdTo value does not exist");
        require(
            _amountInPercent > 0 && _amountInPercent <= 100,
            "The _amountInPercent value sould be more than 0 and less than 100"
        );
        autoCompound();
        address WETH = IStrategy(strategies[_nameIdFrom]).WETH();
        // take Native Tokens from old strategy
        IStrategy(strategies[_nameIdFrom]).migrate(_amountInPercent);
        uint256 _balance = IERC20(WETH).balanceOf(address(this));
        if(_balance > 0){
            // put Native Tokens to new strategy
            IERC20(WETH).safeTransfer(strategies[_nameIdTo], _balance);
            IStrategy(strategies[_nameIdTo]).depositAsMigrate();
        }
        emit PartialMigrate(_amountInPercent);
    }

    function _requestYelFromStrategies(address _receiver, uint256 _percent) internal {
        for (uint256 i; i < names.length; i++) {
            IStrategy(strategies[names[i]]).requestWithdraw(_receiver, _percent);
        }
    }

    function _checkDeposit(uint256 _totalCapital, uint256 _depositValue) internal view {
        require(_totalCapital + _depositValue <= depositLimit, "Deposit is limited by contract");
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"DepositToVault","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Migrate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PartialMigrate","type":"event"},{"anonymous":false,"inputs":[],"name":"RequestYelFromStrategies","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"NUMBER_OF_BLOCKS_BTW_TX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REQUIRED_NUMBER_OF_BLOCKS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newStrategy","type":"address"},{"internalType":"uint256","name":"_nameID","type":"uint256"}],"name":"addStrategy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"autoCompound","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimYel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentStrategy","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"defaultStrategyID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"depositLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"depositLimitMIN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"getPendingYel","outputs":[{"internalType":"uint256","name":"_YELamount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"getRemainingBlocks","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalCapital","outputs":[{"internalType":"uint256","name":"totalCapital","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalCapitalInternal","outputs":[{"internalType":"uint256","name":"totalCapital","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governance","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastExecutableBlockAfterDeposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastExecutableBlockByOwner","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nameIdFrom","type":"uint256"},{"internalType":"uint256","name":"_amountInPercent","type":"uint256"},{"internalType":"uint256","name":"_nameIdTo","type":"uint256"}],"name":"migrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"nameExist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nameIDLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nameIDs","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nameID","type":"uint256"}],"name":"removeStrategy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_shares","type":"uint256"}],"name":"requestWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nameID","type":"uint256"}],"name":"setDefaultStrategy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setDepositLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_governance","type":"address"}],"name":"setGovernance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setNumberOfBlocksBtwTX","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newRouter","type":"address"},{"internalType":"uint256","name":"_nameID","type":"uint256"}],"name":"setRouterForStrategy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"strategies","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"strategyExist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nameID","type":"uint256"}],"name":"strategyInfo","outputs":[{"internalType":"address","name":"_router","type":"address"},{"internalType":"address","name":"_lpToken","type":"address"},{"internalType":"address","name":"_token1","type":"address"},{"internalType":"address","name":"_token0","type":"address"},{"internalType":"address","name":"_farm","type":"address"},{"internalType":"string","name":"_pid","type":"string"},{"internalType":"uint256","name":"_totalLP","type":"uint256"},{"internalType":"uint256","name":"_totalCapital","type":"uint256"},{"internalType":"uint256","name":"_totalCapitalInternal","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nameID","type":"uint256"}],"name":"strategyInfo2","outputs":[{"internalType":"uint256","name":"_token1TWAP","type":"uint256"},{"internalType":"uint256","name":"_token0TWAP","type":"uint256"},{"internalType":"uint256","name":"_token1Price","type":"uint256"},{"internalType":"uint256","name":"_token0Price","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"updateTWAP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"withdrawSuddenTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6002600a556000600e5560e0604052603b60808181529062003c2c60a03980516200003391601191602090910190620001e2565b506040805180820190915260148082527f5468657265206973206e6f20737472617465677900000000000000000000000060209092019182526200007a91601291620001e2565b5060405180606001604052806030815260200162003c67603091398051620000ab91601391602090910190620001e2565b50348015620000b957600080fd5b506040518060400160405280600d81526020016c4551205368617265732048324f60981b8152506040518060400160405280600381526020016245515360e81b815250816003908051906020019062000114929190620001e2565b5080516200012a906004906020840190620001e2565b50505062000147620001416200018c60201b60201c565b62000190565b683635c9adc5dea00000600f5567016345785d8a0000600d55601080546001600160a01b031916734e5b3043feb9f939448e2f791a66c4ea65a315a8179055620002c5565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620001f09062000288565b90600052602060002090601f0160209004810192826200021457600085556200025f565b82601f106200022f57805160ff19168380011785556200025f565b828001600101855582156200025f579182015b828111156200025f57825182559160200191906001019062000242565b506200026d92915062000271565b5090565b5b808211156200026d576000815560010162000272565b600181811c908216806200029d57607f821691505b60208210811415620002bf57634e487b7160e01b600052602260045260246000fd5b50919050565b61395780620002d56000396000f3fe60806040526004361061026b5760003560e01c8063ab033ea911610144578063d0e30db0116100b6578063e941fa781161007a578063e941fa7814610736578063ecf708581461074b578063f2fde38b14610761578063f705c03b14610781578063f921215d146107a1578063fc039165146107c157600080fd5b8063d0e30db014610693578063d574ea3d1461069b578063d84dbb1c146106d1578063db2e21bc14610701578063e1a4877a1461071657600080fd5b8063bb91c33911610108578063bb91c339146105d2578063bdc8144b14610607578063c03601cc14610627578063c0cbbca61461063d578063c6cf43861461065d578063c9411e221461067357600080fd5b8063ab033ea914610527578063b032cf6c14610547578063b070a44f1461055d578063b42a8e5514610572578063b44d0b9f1461059257600080fd5b80635eb674b6116101dd578063745400c9116101a1578063745400c91461048a578063821c0576146104aa57806388c95018146104bf5780638da5cb5b146104df57806395d89b41146104fd5780639bea590e1461051257600080fd5b80635eb674b6146103f557806366f2b1a7146104155780636a1ceb2d1461042a57806370a082311461043f578063715018a61461047557600080fd5b80632d73fc081161022f5780632d73fc081461033e5780632d751e0814610354578063313ce5671461036957806351a5cc5b1461038557806354b35d001461039b5780635aa6e675146103bd57600080fd5b806302ee8de91461027f57806305131172146102a757806306fdde03146102c757806318160ddd146102e95780631c7b048d146102fe57600080fd5b3661027a576102786107d6565b005b600080fd5b34801561028b57600080fd5b50610294610a3d565b6040519081526020015b60405180910390f35b3480156102b357600080fd5b506102786102c23660046134aa565b610b47565b3480156102d357600080fd5b506102dc610c74565b60405161029e9190613523565b3480156102f557600080fd5b50600254610294565b34801561030a57600080fd5b5061032e6103193660046134aa565b60096020526000908152604090205460ff1681565b604051901515815260200161029e565b34801561034a57600080fd5b50610294600c5481565b34801561036057600080fd5b50601454610294565b34801561037557600080fd5b506040516012815260200161029e565b34801561039157600080fd5b50610294600e5481565b3480156103a757600080fd5b506103b0610d06565b60405161029e9190613536565b3480156103c957600080fd5b506010546103dd906001600160a01b031681565b6040516001600160a01b03909116815260200161029e565b34801561040157600080fd5b5061027861041036600461357a565b610d5d565b34801561042157600080fd5b50610294600a81565b34801561043657600080fd5b506103dd610e6b565b34801561044b57600080fd5b5061029461045a3660046134aa565b6001600160a01b031660009081526020819052604090205490565b34801561048157600080fd5b50610278610eec565b34801561049657600080fd5b506102786104a53660046135a6565b610f22565b3480156104b657600080fd5b50610278611139565b3480156104cb57600080fd5b506102786104da3660046135bf565b61121e565b3480156104eb57600080fd5b506005546001600160a01b03166103dd565b34801561050957600080fd5b506102dc61126d565b34801561051e57600080fd5b5061027861127c565b34801561053357600080fd5b506102786105423660046134aa565b611363565b34801561055357600080fd5b50610294600a5481565b34801561056957600080fd5b50610278611411565b34801561057e57600080fd5b5061029461058d3660046134aa565b6115f1565b34801561059e57600080fd5b506105b26105ad3660046135a6565b6116d3565b60408051948552602085019390935291830152606082015260800161029e565b3480156105de57600080fd5b506105f26105ed3660046135a6565b6118f6565b60405161029e999897969594939291906135eb565b34801561061357600080fd5b506102786106223660046135a6565b611ecc565b34801561063357600080fd5b50610294600d5481565b34801561064957600080fd5b506102786106583660046135a6565b611f10565b34801561066957600080fd5b50610294600b5481565b34801561067f57600080fd5b5061027861068e36600461357a565b6122de565b6102786107d6565b3480156106a757600080fd5b506103dd6106b63660046135a6565b6008602052600090815260409020546001600160a01b031681565b3480156106dd57600080fd5b5061032e6106ec3660046135a6565b60076020526000908152604090205460ff1681565b34801561070d57600080fd5b50610278612502565b34801561072257600080fd5b506102946107313660046134aa565b61260c565b34801561074257600080fd5b50610278612679565b34801561075757600080fd5b50610294600f5481565b34801561076d57600080fd5b5061027861077c3660046134aa565b612753565b34801561078d57600080fd5b5061027861079c3660046135a6565b6127eb565b3480156107ad57600080fd5b506102786107bc3660046135a6565b612838565b3480156107cd57600080fd5b50610294612867565b6107de61296d565b6107e6612995565b600a54600c546107f69043613669565b1161086e5760405162461bcd60e51b815260206004820152603a60248201527f4e554d4245525f4f465f424c4f434b535f4254575f545820626c6f636b73206960448201527f73207265717569726564206265747765656e206465706f73697400000000000060648201526084015b60405180910390fd5b600d543410156108d05760405162461bcd60e51b815260206004820152602760248201527f46756e64732073686f756c64206265203e3d207468616e206465706f7369744c60448201526634b6b4ba26a4a760c91b6064820152608401610865565b6108d8611139565b6108e96108e3612867565b34612a05565b60145460129061090c5760405162461bcd60e51b815260040161086591906136b5565b50600080610918610a3d565b90506000610924610e6b565b6001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016020604051808303818588803b15801561095e57600080fd5b505af1158015610972573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610997919061375d565b90508115806109a65750600254155b156109b3578092506109f7565b60006109be60025490565b6109cd8464e8d4a51000613776565b6109d791906137ab565b9050806109e98364e8d4a51000613776565b6109f391906137ab565b9350505b610a013384612a60565b43600c556040518181527f5c77db97122dd8c9d62f829c415e3e3a2c5ff855518cff951750ce07fa0cd4e39060200160405180910390a1505050565b601454600090601290610a635760405162461bcd60e51b815260040161086591906136b5565b5060005b601454811015610b43576008600060148381548110610a8857610a886137bf565b9060005260206000200154815260200190815260200160002060009054906101000a90046001600160a01b03166001600160a01b03166302ee8de96040518163ffffffff1660e01b815260040160206040518083038186803b158015610aed57600080fd5b505afa158015610b01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b25919061375d565b610b2f90836137d5565b915080610b3b816137ed565b915050610a67565b5090565b6005546001600160a01b03163314610b715760405162461bcd60e51b815260040161086590613808565b6040516370a0823160e01b81523060048201526001600160a01b0382169063a9059cbb90339083906370a082319060240160206040518083038186803b158015610bba57600080fd5b505afa158015610bce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bf2919061375d565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b158015610c3857600080fd5b505af1158015610c4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c70919061383d565b5050565b606060038054610c8390613680565b80601f0160208091040260200160405190810160405280929190818152602001828054610caf90613680565b8015610cfc5780601f10610cd157610100808354040283529160200191610cfc565b820191906000526020600020905b815481529060010190602001808311610cdf57829003601f168201915b5050505050905090565b60606014805480602002602001604051908101604052809291908181526020018280548015610cfc57602002820191906000526020600020905b815481526020019060010190808311610d40575050505050905090565b6005546001600160a01b0316331480610d8057506010546001600160a01b031633145b610d9c5760405162461bcd60e51b81526004016108659061385f565b610da581612b3f565b6001600160a01b038216610dfb5760405162461bcd60e51b815260206004820181905260248201527f526f757465722063616e206e6f742062652061207a65726f20616464726573736044820152606401610865565b6000818152600860205260409081902054905163c0d7865560e01b81526001600160a01b0384811660048301529091169063c0d7865590602401600060405180830381600087803b158015610e4f57600080fd5b505af1158015610e63573d6000803e3d6000fd5b505050505050565b601454600090610ecd5760405162461bcd60e51b815260206004820152602760248201527f54686973207661756c7420646f6573206e6f74206861766520616e79207374726044820152666174656769657360c81b6064820152608401610865565b50600e546000908152600860205260409020546001600160a01b031690565b6005546001600160a01b03163314610f165760405162461bcd60e51b815260040161086590613808565b610f206000612bbb565b565b3360009081526006602052604090205443906110ee57601454601290610f5b5760405162461bcd60e51b815260040161086591906136b5565b50600254610fab5760405162461bcd60e51b815260206004820152601960248201527f546f74616c2073686172652076616c7565206973207a65726f000000000000006044820152606401610865565b6000821161100c5760405162461bcd60e51b815260206004820152602860248201527f416d6f756e74206f66207368617265732063616e206e6f742062652061207a65604482015267726f2076616c756560c01b6064820152608401610865565b611014611139565b600061101f60025490565b61102a846064613776565b6110399064e8d4a51000613776565b61104391906137ab565b905061104e60025490565b83111561109d5760405162461bcd60e51b815260206004820181905260248201527f50657263656e742063616e206e6f74206265206d6f7265207468616e203130306044820152606401610865565b6110a73384612c0d565b6110b13382612d5b565b6040517f9b03fe2597ba68323093f58db21a496f6639cdfb717bfc837078f99f41acf38e90600090a1503360009081526006602052604090205550565b6110f6612e14565b1561111e57601454601290610f5b5760405162461bcd60e51b815260040161086591906136b5565b601160405162461bcd60e51b815260040161086591906136b5565b611141612995565b6014546012906111645760405162461bcd60e51b815260040161086591906136b5565b5060005b60145481101561121b576008600060148381548110611189576111896137bf565b9060005260206000200154815260200190815260200160002060009054906101000a90046001600160a01b03166001600160a01b031663821c05766040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156111f057600080fd5b505af1158015611204573d6000803e3d6000fd5b505050508080611213906137ed565b915050611168565b50565b6005546001600160a01b031633148061124157506010546001600160a01b031633145b61125d5760405162461bcd60e51b81526004016108659061385f565b611268838383612e38565b505050565b606060048054610c8390613680565b6005546001600160a01b031633146112a65760405162461bcd60e51b815260040161086590613808565b60005b60145481101561135c5760086000601483815481106112ca576112ca6137bf565b9060005260206000200154815260200190815260200160002060009054906101000a90046001600160a01b03166001600160a01b0316639bea590e6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561133157600080fd5b505af1158015611345573d6000803e3d6000fd5b505050508080611354906137ed565b9150506112a9565b5043600b55565b6005546001600160a01b0316331461138d5760405162461bcd60e51b815260040161086590613808565b6001600160a01b0381166113ef5760405162461bcd60e51b8152602060048201526024808201527f476f7665726e6d656e742063616e206e6f742062652061207a65726f206164646044820152637265737360e01b6064820152608401610865565b601080546001600160a01b0319166001600160a01b0392909216919091179055565b61141961296d565b611421612995565b611429611139565b60008060005b6014548110156115a0576008600060148381548110611450576114506137bf565b6000918252602080832091909101548352820192909252604090810190912054905163b42a8e5560e01b81523360048201526001600160a01b039091169063b42a8e559060240160206040518083038186803b1580156114af57600080fd5b505afa1580156114c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114e7919061375d565b9250821561158e576008600060148381548110611506576115066137bf565b6000918252602080832091909101548352820192909252604090810190912054905163b06dd06f60e01b81523360048201526001600160a01b039091169063b06dd06f90602401600060405180830381600087803b15801561156757600080fd5b505af115801561157b573d6000803e3d6000fd5b50505050828261158b91906137d5565b91505b80611598816137ed565b91505061142f565b5060008111610c705760405162461bcd60e51b815260206004820152601e60248201527f596f7520646f6e2774206861766520616e792070656e64696e672059454c00006044820152606401610865565b6000805b6014548110156116cd576008600060148381548110611616576116166137bf565b6000918252602080832091909101548352820192909252604090810190912054905163b42a8e5560e01b81526001600160a01b0385811660048301529091169063b42a8e559060240160206040518083038186803b15801561167757600080fd5b505afa15801561168b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116af919061375d565b6116b990836137d5565b9150806116c5816137ed565b9150506115f5565b50919050565b60008181526007602052604081205481908190819060139060ff1661170b5760405162461bcd60e51b815260040161086591906136b5565b5060008581526008602090815260409182902054825163d920a90160e01b815292516001600160a01b0390911692839263d920a90192600480840193829003018186803b15801561175b57600080fd5b505afa15801561176f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611793919061375d565b9450806001600160a01b031663ae4bbfc96040518163ffffffff1660e01b815260040160206040518083038186803b1580156117ce57600080fd5b505afa1580156117e2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611806919061375d565b9350806001600160a01b0316633750440d6040518163ffffffff1660e01b815260040160206040518083038186803b15801561184157600080fd5b505afa158015611855573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611879919061375d565b9250806001600160a01b0316639b1b4d496040518163ffffffff1660e01b815260040160206040518083038186803b1580156118b457600080fd5b505afa1580156118c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118ec919061375d565b9150509193509193565b600081815260076020526040812054819081908190819060609082908190819060139060ff166119395760405162461bcd60e51b815260040161086591906136b5565b5060008a8152600860209081526040918290205482516303e21fa960e61b815292516001600160a01b039091169263f887ea40926004808301939192829003018186803b15801561198957600080fd5b505afa15801561199d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119c191906138a8565b60008b815260086020908152604091829020548251635fcbd28560e01b81529251939c506001600160a01b031692635fcbd285926004808201939291829003018186803b158015611a1157600080fd5b505afa158015611a25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a4991906138a8565b60008b81526008602090815260409182902054825163d21220a760e01b81529251939b506001600160a01b03169263d21220a7926004808201939291829003018186803b158015611a9957600080fd5b505afa158015611aad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ad191906138a8565b60008b815260086020908152604091829020548251630dfe168160e01b81529251939a506001600160a01b031692630dfe1681926004808201939291829003018186803b158015611b2157600080fd5b505afa158015611b35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b5991906138a8565b60008b8152600860209081526040918290205482516336e9332d60e01b815292519399506001600160a01b0316926336e9332d926004808201939291829003018186803b158015611ba957600080fd5b505afa158015611bbd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611be191906138a8565b60008b81526008602090815260409182902054825163a644d68560e01b815292519398506001600160a01b03169263a644d685926004808201939291829003018186803b158015611c3157600080fd5b505afa158015611c45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c69919061383d565b15611d045760008a815260086020908152604091829020548251633c41a11560e21b81529251611cfd936001600160a01b039092169263f10684549260048082019391829003018186803b158015611cc057600080fd5b505afa158015611cd4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cf8919061375d565b613177565b9350611d26565b60405180604001604052806006815260200165139bc81c1a5960d21b81525093505b60008a81526008602090815260409182902054825163fc03916560e01b815292516001600160a01b039091169263fc039165926004808301939192829003018186803b158015611d7557600080fd5b505afa158015611d89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dad919061375d565b60008b8152600860209081526040918290205482516302ee8de960e01b815292519395506001600160a01b0316926302ee8de9926004808201939291829003018186803b158015611dfd57600080fd5b505afa158015611e11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e35919061375d565b60008b815260086020908152604091829020548251639ad160e360e01b815292519394506001600160a01b031692639ad160e3926004808201939291829003018186803b158015611e8557600080fd5b505afa158015611e99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ebd919061375d565b92509193959799909294969850565b6005546001600160a01b0316331480611eef57506010546001600160a01b031633145b611f0b5760405162461bcd60e51b81526004016108659061385f565b600f55565b6005546001600160a01b0316331480611f3357506010546001600160a01b031633145b611f4f5760405162461bcd60e51b81526004016108659061385f565b611f5881612b3f565b611f60610e6b565b6000828152600860205260409020546001600160a01b0390811691161415611fd65760405162461bcd60e51b815260206004820152602360248201527f43616e206e6f742072656d6f7665207468652063757272656e7420737472617460448201526265677960e81b6064820152608401610865565b6000818152600860209081526040918290205482516302ee8de960e01b815292516001600160a01b03909116926302ee8de9926004808301939192829003018186803b15801561202557600080fd5b505afa158015612039573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061205d919061375d565b156120b55760405162461bcd60e51b815260206004820152602260248201527f546f74616c206361706974616c20696e7465726e616c206973206e6f74207a65604482015261726f60f01b6064820152608401610865565b60008181526008602090815260409182902054825163fc03916560e01b815292516001600160a01b039091169263fc039165926004808301939192829003018186803b15801561210457600080fd5b505afa158015612118573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061213c919061375d565b156121895760405162461bcd60e51b815260206004820152601960248201527f546f74616c206361706974616c206973206e6f74207a65726f000000000000006044820152606401610865565b6000818152600760209081526040808320805460ff19908116909155600880845282852080546001600160a01b031686526009855292852080549092169091559284905291905280546001600160a01b03191690556014546001146122b45760005b601454811015610c70578160148281548110612209576122096137bf565b906000526020600020015414156122a25760145461222990600190613669565b811461227a576014805461223f90600190613669565b8154811061224f5761224f6137bf565b90600052602060002001546014828154811061226d5761226d6137bf565b6000918252602090912001555b601480548061228b5761228b6138c5565b600190038181906000526020600020016000905590555b806122ac816137ed565b9150506121eb565b60148054806122c5576122c56138c5565b6001900381819060005260206000200160009055905550565b6005546001600160a01b031633148061230157506010546001600160a01b031633145b61231d5760405162461bcd60e51b81526004016108659061385f565b6001600160a01b0382166123825760405162461bcd60e51b815260206004820152602660248201527f5468652073747261746567792063616e206e6f742062652061207a65726f206160448201526564647265737360d01b6064820152608401610865565b6000818152600860205260409020546001600160a01b0316156123e75760405162461bcd60e51b815260206004820152601a60248201527f54686973207374726174656779206973206e6f7420656d7074790000000000006044820152606401610865565b6001600160a01b03821660009081526009602052604090205460ff16156124505760405162461bcd60e51b815260206004820152601c60248201527f5468697320737472617465677920616c726561647920657869737473000000006044820152606401610865565b60008181526007602052604090205460ff166124d4576014805460018181019092557fce6d7b5282bd9a3661ae061feed1dbda4e52ab073b1f9285be6e155d9c38d4ec018290556000828152600760209081526040808320805460ff1990811686179091556001600160a01b03871684526009909252909120805490911690911790555b600090815260086020526040902080546001600160a01b0319166001600160a01b0392909216919091179055565b6010546001600160a01b0316331461255c5760405162461bcd60e51b815260206004820152601c60248201527f5468652073656e646572206973206e6f7420676f7665726e616e6365000000006044820152606401610865565b60005b60145481101561121b576008600060148381548110612580576125806137bf565b60009182526020808320919091015483528201929092526040908101909120549051631bfc726f60e21b81523360048201526001600160a01b0390911690636ff1c9bc90602401600060405180830381600087803b1580156125e157600080fd5b505af11580156125f5573d6000803e3d6000fd5b505050508080612604906137ed565b91505061255f565b6001600160a01b03811660009081526006602052604081205461263157506000919050565b6001600160a01b0382166000908152600660205260408120546126549043613669565b9050600a81106126675750600092915050565b61267281600a613669565b9392505050565b6005546001600160a01b031633146126a35760405162461bcd60e51b815260040161086590613808565b60005b60145481101561121b5760086000601483815481106126c7576126c76137bf565b60009182526020808320919091015483528201929092526040908101909120549051630987b04f60e41b81523360048201526001600160a01b039091169063987b04f090602401600060405180830381600087803b15801561272857600080fd5b505af115801561273c573d6000803e3d6000fd5b50505050808061274b906137ed565b9150506126a6565b6005546001600160a01b0316331461277d5760405162461bcd60e51b815260040161086590613808565b6001600160a01b0381166127e25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610865565b61121b81612bbb565b6005546001600160a01b031633148061280e57506010546001600160a01b031633145b61282a5760405162461bcd60e51b81526004016108659061385f565b61283381612b3f565b600e55565b6005546001600160a01b031633146128625760405162461bcd60e51b815260040161086590613808565b600a55565b60145460009060129061288d5760405162461bcd60e51b815260040161086591906136b5565b5060005b601454811015610b435760086000601483815481106128b2576128b26137bf565b9060005260206000200154815260200190815260200160002060009054906101000a90046001600160a01b03166001600160a01b031663fc0391656040518163ffffffff1660e01b815260040160206040518083038186803b15801561291757600080fd5b505afa15801561292b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061294f919061375d565b61295990836137d5565b915080612965816137ed565b915050612891565b612975612e14565b60119061121b5760405162461bcd60e51b815260040161086591906136b5565b600a54600b546129a59043613669565b11610f205760405162461bcd60e51b815260206004820152602a60248201527f4e554d4245525f4f465f424c4f434b535f4254575f545820626c6f636b7320696044820152691cc81c995c5d5a5c995960b21b6064820152608401610865565b600f54612a1282846137d5565b1115610c705760405162461bcd60e51b815260206004820152601e60248201527f4465706f736974206973206c696d6974656420627920636f6e747261637400006044820152606401610865565b6001600160a01b038216612ab65760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610865565b8060026000828254612ac891906137d5565b90915550506001600160a01b03821660009081526020819052604081208054839290612af59084906137d5565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b601454600110612b895760405162461bcd60e51b81526020600482015260156024820152744e6f7420656e6f756768207374726174656769657360581b6044820152606401610865565b60008181526007602052604090205460139060ff16610c705760405162461bcd60e51b815260040161086591906136b5565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216612c6d5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610865565b6001600160a01b03821660009081526020819052604090205481811015612ce15760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610865565b6001600160a01b0383166000908152602081905260408120838303905560028054849290612d10908490613669565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b60005b601454811015611268576008600060148381548110612d7f57612d7f6137bf565b6000918252602080832091909101548352820192909252604090810190912054905163072f436560e31b81526001600160a01b038581166004830152602482018590529091169063397a1b2890604401600060405180830381600087803b158015612de957600080fd5b505af1158015612dfd573d6000803e3d6000fd5b505050508080612e0c906137ed565b915050612d5e565b33600090815260066020526040812054600a90612e319043613669565b1015905090565b612e4183612b3f565b60008181526007602052604090205460ff16612eaa5760405162461bcd60e51b815260206004820152602260248201527f546865205f6e616d654964546f2076616c756520646f6573206e6f74206578696044820152611cdd60f21b6064820152608401610865565b600082118015612ebb575060648211155b612f375760405162461bcd60e51b815260206004820152604160248201527f546865205f616d6f756e74496e50657263656e742076616c756520736f756c6460448201527f206265206d6f7265207468616e203020616e64206c657373207468616e2031306064820152600360fc1b608482015260a401610865565b612f3f611139565b60008381526008602090815260408083205481516315ab88c960e31b815291516001600160a01b039091169263ad5c46489260048082019391829003018186803b158015612f8c57600080fd5b505afa158015612fa0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fc491906138a8565b600085815260086020526040908190205490516308a960c160e31b8152600481018690529192506001600160a01b03169063454b060890602401600060405180830381600087803b15801561301857600080fd5b505af115801561302c573d6000803e3d6000fd5b50506040516370a0823160e01b8152306004820152600092506001600160a01b03841691506370a082319060240160206040518083038186803b15801561307257600080fd5b505afa158015613086573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130aa919061375d565b9050801561313d576000838152600860205260409020546130d8906001600160a01b0384811691168361327d565b6000838152600860205260408082205481516336bcdbf360e11b815291516001600160a01b0390911692636d79b7e6926004808201939182900301818387803b15801561312457600080fd5b505af1158015613138573d6000803e3d6000fd5b505050505b6040518481527ff62d3ca87d830abd296c5769ca4ad2d1e22910c4754d33689394d55287c033369060200160405180910390a15050505050565b60608161319b5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156131c557806131af816137ed565b91506131be9050600a836137ab565b915061319f565b60008167ffffffffffffffff8111156131e0576131e06138db565b6040519080825280601f01601f19166020018201604052801561320a576020820181803683370190505b5090505b84156132755761321f600183613669565b915061322c600a866138f1565b6132379060306137d5565b60f81b81838151811061324c5761324c6137bf565b60200101906001600160f81b031916908160001a90535061326e600a866137ab565b945061320e565b949350505050565b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908401526112689286929160009161330d91851690849061338a565b805190915015611268578080602001905181019061332b919061383d565b6112685760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610865565b6060613275848460008585843b6133e35760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610865565b600080866001600160a01b031685876040516133ff9190613905565b60006040518083038185875af1925050503d806000811461343c576040519150601f19603f3d011682016040523d82523d6000602084013e613441565b606091505b509150915061345182828661345c565b979650505050505050565b6060831561346b575081612672565b82511561347b5782518084602001fd5b8160405162461bcd60e51b81526004016108659190613523565b6001600160a01b038116811461121b57600080fd5b6000602082840312156134bc57600080fd5b813561267281613495565b60005b838110156134e25781810151838201526020016134ca565b838111156134f1576000848401525b50505050565b6000815180845261350f8160208601602086016134c7565b601f01601f19169290920160200192915050565b60208152600061267260208301846134f7565b6020808252825182820181905260009190848201906040850190845b8181101561356e57835183529284019291840191600101613552565b50909695505050505050565b6000806040838503121561358d57600080fd5b823561359881613495565b946020939093013593505050565b6000602082840312156135b857600080fd5b5035919050565b6000806000606084860312156135d457600080fd5b505081359360208301359350604090920135919050565b6001600160a01b038a811682528981166020830152888116604083015287811660608301528616608082015261012060a08201819052600090613630838201886134f7565b60c0840196909652505060e0810192909252610100909101529695505050505050565b634e487b7160e01b600052601160045260246000fd5b60008282101561367b5761367b613653565b500390565b600181811c9082168061369457607f821691505b602082108114156116cd57634e487b7160e01b600052602260045260246000fd5b600060208083526000845481600182811c9150808316806136d757607f831692505b8583108114156136f557634e487b7160e01b85526022600452602485fd5b87860183815260200181801561371257600181146137235761374e565b60ff1986168252878201965061374e565b60008b81526020902060005b868110156137485781548482015290850190890161372f565b83019750505b50949998505050505050505050565b60006020828403121561376f57600080fd5b5051919050565b600081600019048311821515161561379057613790613653565b500290565b634e487b7160e01b600052601260045260246000fd5b6000826137ba576137ba613795565b500490565b634e487b7160e01b600052603260045260246000fd5b600082198211156137e8576137e8613653565b500190565b600060001982141561380157613801613653565b5060010190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60006020828403121561384f57600080fd5b8151801515811461267257600080fd5b60208082526029908201527f5468652073656e646572206973206e6f7420746865206f776e6572206f7220676040820152686f7665726e616e636560b81b606082015260800190565b6000602082840312156138ba57600080fd5b815161267281613495565b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b60008261390057613900613795565b500690565b600082516139178184602087016134c7565b919091019291505056fea2646970667358221220b38aa27e0f0c8f3125627fe81d09efc26f0670f22ce39700c704bba1de8500a164736f6c63430008090033446966666572656e6365206f6620626c6f636b73206973206c657373207468616e2052455155495245445f4e554d4245525f4f465f424c4f434b53546865204e616d65206f662073747261746567792077697468207468697320494420646f6573206e6f74206578697374

Deployed ByteCode Sourcemap

33503:14092:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34925:9;:7;:9::i;:::-;33503:14092;;;;;41674:295;;;;;;;;;;;;;:::i;:::-;;;160:25:1;;;148:2;133:18;41674:295:0;;;;;;;;45251:167;;;;;;;;;;-1:-1:-1;45251:167:0;;;;;:::i;:::-;;:::i;18029:100::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;18350:108::-;;;;;;;;;;-1:-1:-1;18438:12:0;;18350:108;;33778:45;;;;;;;;;;-1:-1:-1;33778:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1655:14:1;;1648:22;1630:41;;1618:2;1603:18;33778:45:0;1490:187:1;33990:46:0;;;;;;;;;;;;;;;;39162:91;;;;;;;;;;-1:-1:-1;39233:5:0;:12;39162:91;;18249:93;;;;;;;;;;-1:-1:-1;18249:93:0;;18332:2;1824:36:1;;1812:2;1797:18;18249:93:0;1682:184:1;34080:36:0;;;;;;;;;;;;;;;;39065:89;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;34157:25::-;;;;;;;;;;-1:-1:-1;34157:25:0;;;;-1:-1:-1;;;;;34157:25:0;;;;;;-1:-1:-1;;;;;2672:32:1;;;2654:51;;2642:2;2627:18;34157:25:0;2508:203:1;44743:283:0;;;;;;;;;;-1:-1:-1;44743:283:0;;;;;:::i;:::-;;:::i;33832:54::-;;;;;;;;;;;;33884:2;33832:54;;39261:191;;;;;;;;;;;;;:::i;18466:127::-;;;;;;;;;;-1:-1:-1;18466:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;18567:18:0;18540:7;18567:18;;;;;;;;;;;;18466:127;13428:103;;;;;;;;;;;;;:::i;37055:578::-;;;;;;;;;;-1:-1:-1;37055:578:0;;;;;:::i;:::-;;:::i;41134:243::-;;;;;;;;;;;;;:::i;45034:209::-;;;;;;;;;;-1:-1:-1;45034:209:0;;;;;:::i;:::-;;:::i;12777:87::-;;;;;;;;;;-1:-1:-1;12850:6:0;;-1:-1:-1;;;;;12850:6:0;12777:87;;18137:104;;;;;;;;;;;;;:::i;42297:222::-;;;;;;;;;;;;;:::i;42731:228::-;;;;;;;;;;-1:-1:-1;42731:228:0;;;;;:::i;:::-;;:::i;33893:42::-;;;;;;;;;;;;;;;;37641:529;;;;;;;;;;;;;:::i;38342:235::-;;;;;;;;;;-1:-1:-1;38342:235:0;;;;;:::i;:::-;;:::i;40585:541::-;;;;;;;;;;-1:-1:-1;40585:541:0;;;;;:::i;:::-;;:::i;:::-;;;;3773:25:1;;;3829:2;3814:18;;3807:34;;;;3857:18;;;3850:34;3915:2;3900:18;;3893:34;3760:3;3745:19;40585:541:0;3542:391:1;39460:1117:0;;;;;;;;;;-1:-1:-1;39460:1117:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;:::i;42967:114::-;;;;;;;;;;-1:-1:-1;42967:114:0;;;;;:::i;:::-;;:::i;34043:30::-;;;;;;;;;;;;;;;;43660:1075;;;;;;;;;;-1:-1:-1;43660:1075:0;;;;;:::i;:::-;;:::i;33942:41::-;;;;;;;;;;;;;;;;43089:563;;;;;;;;;;-1:-1:-1;43089:563:0;;;;;:::i;:::-;;:::i;35948:1099::-;;;:::i;33726:45::-;;;;;;;;;;-1:-1:-1;33726:45:0;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;33726:45:0;;;33678:41;;;;;;;;;;-1:-1:-1;33678:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;42527:196;;;;;;;;;;;;;:::i;38585:472::-;;;;;;;;;;-1:-1:-1;38585:472:0;;;;;:::i;:::-;;:::i;41977:186::-;;;;;;;;;;;;;:::i;34123:27::-;;;;;;;;;;;;;;;;13686:201;;;;;;;;;;-1:-1:-1;13686:201:0;;;;;:::i;:::-;;:::i;38178:156::-;;;;;;;;;;-1:-1:-1;38178:156:0;;;;;:::i;:::-;;:::i;42171:118::-;;;;;;;;;;-1:-1:-1;42171:118:0;;;;;:::i;:::-;;:::i;41387:279::-;;;;;;;;;;;;;:::i;35948:1099::-;35768:21;:19;:21::i;:::-;35800:24;:22;:24::i;:::-;36075:23:::1;::::0;36041:31:::1;::::0;36026:46:::1;::::0;:12:::1;:46;:::i;:::-;:72;36004:180;;;::::0;-1:-1:-1;;;36004:180:0;;5305:2:1;36004:180:0::1;::::0;::::1;5287:21:1::0;5344:2;5324:18;;;5317:30;5383:34;5363:18;;;5356:62;5454:28;5434:18;;;5427:56;5500:19;;36004:180:0::1;;;;;;;;;36216:15;;36203:9;:28;;36195:80;;;::::0;-1:-1:-1;;;36195:80:0;;5732:2:1;36195:80:0::1;::::0;::::1;5714:21:1::0;5771:2;5751:18;;;5744:30;5810:34;5790:18;;;5783:62;-1:-1:-1;;;5861:18:1;;;5854:37;5908:19;;36195:80:0::1;5530:403:1::0;36195:80:0::1;36286:14;:12;:14::i;:::-;36311:43;36325:17;:15;:17::i;:::-;36344:9;36311:13;:43::i;:::-;36373:5;:12:::0;36392:17:::1;::::0;36365:45:::1;;;;-1:-1:-1::0;;;36365:45:0::1;;;;;;;;:::i;:::-;;36421:14;36446:28:::0;36477:25:::1;:23;:25::i;:::-;36446:56;;36513:29;36555:17;:15;:17::i;:::-;-1:-1:-1::0;;;;;36545:36:0::1;;36589:9;36545:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36513:88:::0;-1:-1:-1;36616:25:0;;;:47:::1;;-1:-1:-1::0;18438:12:0;;36645:18;36616:47:::1;36612:282;;;36689:21;36680:30;;36612:282;;;36743:19;36799:13;18438:12:::0;;;18350:108;36799:13:::1;36765:31;:20:::0;36789:6:::1;36765:31;:::i;:::-;:47;;;;:::i;:::-;36743:69:::0;-1:-1:-1;36743:69:0;36836:32:::1;:21:::0;36861:6:::1;36836:32;:::i;:::-;:46;;;;:::i;:::-;36827:55;;36728:166;36612:282;36904:25;36910:10;36922:6;36904:5;:25::i;:::-;36974:12;36940:31;:46:::0;37002:37:::1;::::0;160:25:1;;;37002:37:0::1;::::0;148:2:1;133:18;37002:37:0::1;;;;;;;35993:1054;;;35948:1099::o:0;41674:295::-;41771:5;:12;41730:20;;41790:17;;41763:45;;;;-1:-1:-1;;;41763:45:0;;;;;;;;:::i;:::-;;41824:9;41819:143;41843:5;:12;41839:16;;41819:143;;;41903:10;:20;41914:5;41920:1;41914:8;;;;;;;;:::i;:::-;;;;;;;;;41903:20;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;41903:20:0;-1:-1:-1;;;;;41893:55:0;;:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41877:73;;;;:::i;:::-;;-1:-1:-1;41857:3:0;;;;:::i;:::-;;;;41819:143;;;;41674:295;:::o;45251:167::-;12850:6;;-1:-1:-1;;;;;12850:6:0;12231:10;12997:23;12989:68;;;;-1:-1:-1;;;12989:68:0;;;;;;;:::i;:::-;45370:39:::1;::::0;-1:-1:-1;;;45370:39:0;;45403:4:::1;45370:39;::::0;::::1;2654:51:1::0;-1:-1:-1;;;;;45325:23:0;::::1;::::0;::::1;::::0;45357:10:::1;::::0;45325:23;;45370:24:::1;::::0;2627:18:1;;45370:39:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45325:85;::::0;-1:-1:-1;;;;;;45325:85:0::1;::::0;;;;;;-1:-1:-1;;;;;9225:32:1;;;45325:85:0::1;::::0;::::1;9207:51:1::0;9274:18;;;9267:34;9180:18;;45325:85:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;45251:167:::0;:::o;18029:100::-;18083:13;18116:5;18109:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18029:100;:::o;39065:89::-;39105:16;39141:5;39134:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39065:89;:::o;44743:283::-;12850:6;;-1:-1:-1;;;;;12850:6:0;12231:10;35016:23;;:53;;-1:-1:-1;35043:10:0;;-1:-1:-1;;;;;35043:10:0;12231;35043:26;35016:53;34994:144;;;;-1:-1:-1;;;34994:144:0;;;;;;;:::i;:::-;44850:25:::1;44867:7;44850:16;:25::i;:::-;-1:-1:-1::0;;;;;44894:24:0;::::1;44886:69;;;::::0;-1:-1:-1;;;44886:69:0;;10206:2:1;44886:69:0::1;::::0;::::1;10188:21:1::0;;;10225:18;;;10218:30;10284:34;10264:18;;;10257:62;10336:18;;44886:69:0::1;10004:356:1::0;44886:69:0::1;44976:19;::::0;;;:10:::1;:19;::::0;;;;;;;44966:52;;-1:-1:-1;;;44966:52:0;;-1:-1:-1;;;;;2672:32:1;;;44966:52:0::1;::::0;::::1;2654:51:1::0;44976:19:0;;::::1;::::0;44966:40:::1;::::0;2627:18:1;;44966:52:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;44743:283:::0;;:::o;39261:191::-;39337:5;:12;39309:7;;39329:68;;;;-1:-1:-1;;;39329:68:0;;10567:2:1;39329:68:0;;;10549:21:1;10606:2;10586:18;;;10579:30;10645:34;10625:18;;;10618:62;-1:-1:-1;;;10696:18:1;;;10689:37;10743:19;;39329:68:0;10365:403:1;39329:68:0;-1:-1:-1;39426:17:0;;39415:29;;;;:10;:29;;;;;;-1:-1:-1;;;;;39415:29:0;;39261:191::o;13428:103::-;12850:6;;-1:-1:-1;;;;;12850:6:0;12231:10;12997:23;12989:68;;;;-1:-1:-1;;;12989:68:0;;;;;;;:::i;:::-;13493:30:::1;13520:1;13493:18;:30::i;:::-;13428:103::o:0;37055:578::-;35397:10;35335:20;35384:24;;;:12;:24;;;;;;35358:12;;35381:339;;37138:5:::1;:12:::0;37157:17:::1;::::0;37130:45:::1;;;;-1:-1:-1::0;;;37130:45:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;18438:12:0;;37186:56:::1;;;::::0;-1:-1:-1;;;37186:56:0;;10975:2:1;37186:56:0::1;::::0;::::1;10957:21:1::0;11014:2;10994:18;;;10987:30;11053:27;11033:18;;;11026:55;11098:18;;37186:56:0::1;10773:349:1::0;37186:56:0::1;37271:1;37261:7;:11;37253:64;;;::::0;-1:-1:-1;;;37253:64:0;;11329:2:1;37253:64:0::1;::::0;::::1;11311:21:1::0;11368:2;11348:18;;;11341:30;11407:34;11387:18;;;11380:62;-1:-1:-1;;;11458:18:1;;;11451:38;11506:19;;37253:64:0::1;11127:404:1::0;37253:64:0::1;37328:14;:12;:14::i;:::-;37353:15;37396:13;18438:12:::0;;;18350:108;37396:13:::1;37371;:7:::0;37381:3:::1;37371:13;:::i;:::-;:22;::::0;37387:6:::1;37371:22;:::i;:::-;:38;;;;:::i;:::-;37353:56;;37439:13;18438:12:::0;;;18350:108;37439:13:::1;37428:7;:24;;37420:69;;;::::0;-1:-1:-1;;;37420:69:0;;11738:2:1;37420:69:0::1;::::0;::::1;11720:21:1::0;;;11757:18;;;11750:30;11816:34;11796:18;;;11789:62;11868:18;;37420:69:0::1;11536:356:1::0;37420:69:0::1;37500:26;37506:10;37518:7;37500:5;:26::i;:::-;37537:46;37563:10;37575:7;37537:25;:46::i;:::-;37599:26;::::0;::::1;::::0;;;::::1;-1:-1:-1::0;35459:10:0;35446:24;;;;:12;:24;;;;;:39;-1:-1:-1;45251:167:0:o;35381:339::-;35521:21;:19;:21::i;:::-;35518:191;;;37138:5:::1;:12:::0;37157:17:::1;::::0;37130:45:::1;;;;-1:-1:-1::0;;;37130:45:0::1;;;;;;;;:::i;35518:191::-:0;35670:22;35663:30;;-1:-1:-1;;;35663:30:0;;;;;;;;:::i;41134:243::-;35896:24;:22;:24::i;:::-;41206:5:::1;:12:::0;41225:17:::1;::::0;41198:45:::1;;;;-1:-1:-1::0;;;41198:45:0::1;;;;;;;;:::i;:::-;;41259:9;41254:116;41278:5;:12:::0;41274:16;::::1;41254:116;;;41322:10;:20;41333:5;41339:1;41333:8;;;;;;;;:::i;:::-;;;;;;;;;41322:20;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;41322:20:0::1;-1:-1:-1::0;;;;;41312:44:0::1;;:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;41292:3;;;;;:::i;:::-;;;;41254:116;;;;41134:243::o:0;45034:209::-;12850:6;;-1:-1:-1;;;;;12850:6:0;12231:10;35016:23;;:53;;-1:-1:-1;35043:10:0;;-1:-1:-1;;;;;35043:10:0;12231;35043:26;35016:53;34994:144;;;;-1:-1:-1;;;34994:144:0;;;;;;;:::i;:::-;45185:50:::1;45194:11;45207:16;45225:9;45185:8;:50::i;:::-;45034:209:::0;;;:::o;18137:104::-;18193:13;18226:7;18219:14;;;;;:::i;42297:222::-;12850:6;;-1:-1:-1;;;;;12850:6:0;12231:10;12997:23;12989:68;;;;-1:-1:-1;;;12989:68:0;;;;;;;:::i;:::-;42351:9:::1;42347:113;42370:5;:12:::0;42366:16;::::1;42347:113;;;42414:10;:20;42425:5;42431:1;42425:8;;;;;;;;:::i;:::-;;;;;;;;;42414:20;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;42414:20:0::1;-1:-1:-1::0;;;;;42404:42:0::1;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;42384:3;;;;;:::i;:::-;;;;42347:113;;;-1:-1:-1::0;42499:12:0::1;42470:26;:41:::0;42297:222::o;42731:228::-;12850:6;;-1:-1:-1;;;;;12850:6:0;12231:10;12997:23;12989:68;;;;-1:-1:-1;;;12989:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;42827:25:0;::::1;42805:111;;;::::0;-1:-1:-1;;;42805:111:0;;12099:2:1;42805:111:0::1;::::0;::::1;12081:21:1::0;12138:2;12118:18;;;12111:30;12177:34;12157:18;;;12150:62;-1:-1:-1;;;12228:18:1;;;12221:34;12272:19;;42805:111:0::1;11897:400:1::0;42805:111:0::1;42927:10;:24:::0;;-1:-1:-1;;;;;;42927:24:0::1;-1:-1:-1::0;;;;;42927:24:0;;;::::1;::::0;;;::::1;::::0;;42731:228::o;37641:529::-;35768:21;:19;:21::i;:::-;35800:24;:22;:24::i;:::-;37690:14:::1;:12;:14::i;:::-;37715:18;37748:23:::0;37791:9:::1;37786:304;37806:5;:12:::0;37802:16;::::1;37786:304;;;37863:10;:20;37874:5;37880:1;37874:8;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;;::::1;::::0;37863:20;;;::::1;::::0;;;;;;;;;;;;37853:57;;-1:-1:-1;;;37853:57:0;;37899:10:::1;37853:57;::::0;::::1;2654:51:1::0;-1:-1:-1;;;;;37863:20:0;;::::1;::::0;37853:45:::1;::::0;2627:18:1;;37853:57:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37840:70:::0;-1:-1:-1;37928:14:0;;37925:154:::1;;37973:10;:20;37984:5;37990:1;37984:8;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;;::::1;::::0;37973:20;;;::::1;::::0;;;;;;;;;;;;37963:52;;-1:-1:-1;;;37963:52:0;;38004:10:::1;37963:52;::::0;::::1;2654:51:1::0;-1:-1:-1;;;;;37973:20:0;;::::1;::::0;37963:40:::1;::::0;2627:18:1;;37963:52:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;38053:10;38034:29;;;;;:::i;:::-;;;37925:154;37820:3:::0;::::1;::::0;::::1;:::i;:::-;;;;37786:304;;;;38126:1;38108:15;:19;38100:62;;;::::0;-1:-1:-1;;;38100:62:0;;12504:2:1;38100:62:0::1;::::0;::::1;12486:21:1::0;12543:2;12523:18;;;12516:30;12582:32;12562:18;;;12555:60;12632:18;;38100:62:0::1;12302:354:1::0;38342:235:0;38404:18;38440:9;38435:135;38455:5;:12;38451:16;;38435:135;;;38513:10;:20;38524:5;38530:1;38524:8;;;;;;;;:::i;:::-;;;;;;;;;;;;;;38513:20;;;;;;;;;;;;;;;;38503:55;;-1:-1:-1;;;38503:55:0;;-1:-1:-1;;;;;2672:32:1;;;38503:55:0;;;2654:51:1;38513:20:0;;;;38503:45;;2627:18:1;;38503:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38489:69;;;;:::i;:::-;;-1:-1:-1;38469:3:0;;;;:::i;:::-;;;;38435:135;;;;38342:235;;;:::o;40585:541::-;40656:19;40788:18;;;:9;:18;;;;;;40656:19;;;;;;40808:23;;40788:18;;40780:52;;;;-1:-1:-1;;;40780:52:0;;;;;;;;:::i;:::-;-1:-1:-1;40843:17:0;40863:19;;;:10;:19;;;;;;;;;;40907:33;;-1:-1:-1;;;40907:33:0;;;;-1:-1:-1;;;;;40863:19:0;;;;;;40907:31;;:33;;;;;;;;;;40863:19;40907:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40893:47;;40975:9;-1:-1:-1;;;;;40965:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40951:47;;41034:9;-1:-1:-1;;;;;41024:32:0;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41009:49;;41094:9;-1:-1:-1;;;;;41084:32:0;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41069:49;;40769:357;40585:541;;;;;:::o;39460:1117::-;39530:15;39797:18;;;:9;:18;;;;;;39530:15;;;;;;;;39659:18;;39530:15;;;;;;39817:23;;39797:18;;39789:52;;;;-1:-1:-1;;;39789:52:0;;;;;;;;:::i;:::-;-1:-1:-1;39872:19:0;;;;:10;:19;;;;;;;;;;39862:39;;-1:-1:-1;;;39862:39:0;;;;-1:-1:-1;;;;;39872:19:0;;;;39862:37;;:39;;;;;39872:19;;39862:39;;;;;39872:19;39862:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39933:19;;;;:10;:19;;;;;;;;;;39923:40;;-1:-1:-1;;;39923:40:0;;;;39852:49;;-1:-1:-1;;;;;;39933:19:0;;39923:38;;:40;;;;;39933:19;39923:40;;;;;;39933:19;39923:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39994:19;;;;:10;:19;;;;;;;;;;39984:39;;-1:-1:-1;;;39984:39:0;;;;39912:51;;-1:-1:-1;;;;;;39994:19:0;;39984:37;;:39;;;;;39994:19;39984:39;;;;;;39994:19;39984:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40054:19;;;;:10;:19;;;;;;;;;;40044:39;;-1:-1:-1;;;40044:39:0;;;;39974:49;;-1:-1:-1;;;;;;40054:19:0;;40044:37;;:39;;;;;40054:19;40044:39;;;;;;40054:19;40044:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40112:19;;;;:10;:19;;;;;;;;;;40102:37;;-1:-1:-1;;;40102:37:0;;;;40034:49;;-1:-1:-1;;;;;;40112:19:0;;40102:35;;:37;;;;;40112:19;40102:37;;;;;;40112:19;40102:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40163:19;;;;:10;:19;;;;;;;;;;40153:39;;-1:-1:-1;;;40153:39:0;;;;40094:45;;-1:-1:-1;;;;;;40163:19:0;;40153:37;;:39;;;;;40163:19;40153:39;;;;;;40163:19;40153:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40150:180;;;40243:19;;;;:10;:19;;;;;;;;;;40233:36;;-1:-1:-1;;;40233:36:0;;;;40216:54;;-1:-1:-1;;;;;40243:19:0;;;;40233:34;;:36;;;;;;;;;;;40243:19;40233:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40216:16;:54::i;:::-;40209:61;;40150:180;;;40303:15;;;;;;;;;;;;;-1:-1:-1;;;40303:15:0;;;;;40150:180;40366:19;;;;:10;:19;;;;;;;;;;40356:48;;-1:-1:-1;;;40356:48:0;;;;-1:-1:-1;;;;;40366:19:0;;;;40356:46;;:48;;;;;40366:19;;40356:48;;;;;40366:19;40356:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40449:19;;;;:10;:19;;;;;;;;;;40439:56;;-1:-1:-1;;;40439:56:0;;;;40340:64;;-1:-1:-1;;;;;;40449:19:0;;40439:54;;:56;;;;;40449:19;40439:56;;;;;;40449:19;40439:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40527:19;;;;:10;:19;;;;;;;;;;40517:52;;-1:-1:-1;;;40517:52:0;;;;40415:80;;-1:-1:-1;;;;;;40527:19:0;;40517:50;;:52;;;;;40527:19;40517:52;;;;;;40527:19;40517:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40506:63;;39460:1117;;;;;;;;;;;:::o;42967:114::-;12850:6;;-1:-1:-1;;;;;12850:6:0;12231:10;35016:23;;:53;;-1:-1:-1;35043:10:0;;-1:-1:-1;;;;;35043:10:0;12231;35043:26;35016:53;34994:144;;;;-1:-1:-1;;;34994:144:0;;;;;;;:::i;:::-;43051:12:::1;:22:::0;42967:114::o;43660:1075::-;12850:6;;-1:-1:-1;;;;;12850:6:0;12231:10;35016:23;;:53;;-1:-1:-1;35043:10:0;;-1:-1:-1;;;;;35043:10:0;12231;35043:26;35016:53;34994:144;;;;-1:-1:-1;;;34994:144:0;;;;;;;:::i;:::-;43741:25:::1;43758:7;43741:16;:25::i;:::-;43822:17;:15;:17::i;:::-;43799:19;::::0;;;:10:::1;:19;::::0;;;;;-1:-1:-1;;;;;43799:19:0;;::::1;:40:::0;::::1;;;43777:125;;;::::0;-1:-1:-1;;;43777:125:0;;13119:2:1;43777:125:0::1;::::0;::::1;13101:21:1::0;13158:2;13138:18;;;13131:30;13197:34;13177:18;;;13170:62;-1:-1:-1;;;13248:18:1;;;13241:33;13291:19;;43777:125:0::1;12917:399:1::0;43777:125:0::1;43931:19;::::0;;;:10:::1;:19;::::0;;;;;;;;;43921:56;;-1:-1:-1;;;43921:56:0;;;;-1:-1:-1;;;;;43931:19:0;;::::1;::::0;43921:54:::1;::::0;:56:::1;::::0;;::::1;::::0;43931:19;;43921:56;;;;;43931:19;43921:56;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:61:::0;43913:131:::1;;;::::0;-1:-1:-1;;;43913:131:0;;13523:2:1;43913:131:0::1;::::0;::::1;13505:21:1::0;13562:2;13542:18;;;13535:30;13601:34;13581:18;;;13574:62;-1:-1:-1;;;13652:18:1;;;13645:32;13694:19;;43913:131:0::1;13321:398:1::0;43913:131:0::1;44073:19;::::0;;;:10:::1;:19;::::0;;;;;;;;;44063:48;;-1:-1:-1;;;44063:48:0;;;;-1:-1:-1;;;;;44073:19:0;;::::1;::::0;44063:46:::1;::::0;:48:::1;::::0;;::::1;::::0;44073:19;;44063:48;;;;;44073:19;44063:48;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:53:::0;44055:114:::1;;;::::0;-1:-1:-1;;;44055:114:0;;13926:2:1;44055:114:0::1;::::0;::::1;13908:21:1::0;13965:2;13945:18;;;13938:30;14004:27;13984:18;;;13977:55;14049:18;;44055:114:0::1;13724:349:1::0;44055:114:0::1;44242:5;44221:18:::0;;;:9:::1;:18;::::0;;;;;;;:26;;-1:-1:-1;;44221:26:0;;::::1;::::0;;;44272:10:::1;:19:::0;;;;;;;;-1:-1:-1;;;;;44272:19:0::1;44258:34:::0;;:13:::1;:34:::0;;;;;:42;;;;::::1;::::0;;;44311:19;;;;;;;:32;;-1:-1:-1;;;;;;44311:32:0::1;::::0;;44357:5:::1;:12:::0;44221:26;44357:17:::1;44354:374;;44395:9;44391:282;44414:5;:12:::0;44410:16;::::1;44391:282;;;44466:7;44454:5;44460:1;44454:8;;;;;;;;:::i;:::-;;;;;;;;;:19;44451:207;;;44506:5;:12:::0;:14:::1;::::0;44519:1:::1;::::0;44506:14:::1;:::i;:::-;44501:1;:19;44498:107;;44560:5;44566:12:::0;;:14:::1;::::0;44579:1:::1;::::0;44566:14:::1;:::i;:::-;44560:21;;;;;;;;:::i;:::-;;;;;;;;;44549:5;44555:1;44549:8;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;:32:::0;44498:107:::1;44627:5;:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;44451:207;44428:3:::0;::::1;::::0;::::1;:::i;:::-;;;;44391:282;;44354:374;44705:5;:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;43660:1075:::0;:::o;43089:563::-;12850:6;;-1:-1:-1;;;;;12850:6:0;12231:10;35016:23;;:53;;-1:-1:-1;35043:10:0;;-1:-1:-1;;;;;35043:10:0;12231;35043:26;35016:53;34994:144;;;;-1:-1:-1;;;34994:144:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;43197:26:0;::::1;43189:77;;;::::0;-1:-1:-1;;;43189:77:0;;14412:2:1;43189:77:0::1;::::0;::::1;14394:21:1::0;14451:2;14431:18;;;14424:30;14490:34;14470:18;;;14463:62;-1:-1:-1;;;14541:18:1;;;14534:36;14587:19;;43189:77:0::1;14210:402:1::0;43189:77:0::1;43316:1;43285:19:::0;;;:10:::1;:19;::::0;;;;;-1:-1:-1;;;;;43285:19:0::1;:33:::0;43277:72:::1;;;::::0;-1:-1:-1;;;43277:72:0;;14819:2:1;43277:72:0::1;::::0;::::1;14801:21:1::0;14858:2;14838:18;;;14831:30;14897:28;14877:18;;;14870:56;14943:18;;43277:72:0::1;14617:350:1::0;43277:72:0::1;-1:-1:-1::0;;;;;43369:27:0;::::1;;::::0;;;:13:::1;:27;::::0;;;;;::::1;;43368:28;43360:69;;;::::0;-1:-1:-1;;;43360:69:0;;15174:2:1;43360:69:0::1;::::0;::::1;15156:21:1::0;15213:2;15193:18;;;15186:30;15252;15232:18;;;15225:58;15300:18;;43360:69:0::1;14972:352:1::0;43360:69:0::1;43445:18;::::0;;;:9:::1;:18;::::0;;;;;::::1;;43440:160;;43480:5;:19:::0;;::::1;::::0;;::::1;::::0;;;;::::1;::::0;;;-1:-1:-1;43514:18:0;;;:9:::1;43480:19;43514:18:::0;;;;;;;:25;;-1:-1:-1;;43514:25:0;;::::1;::::0;::::1;::::0;;;-1:-1:-1;;;;;43554:27:0;::::1;::::0;;:13:::1;:27:::0;;;;;;:34;;;;::::1;::::0;;::::1;::::0;;43440:160:::1;43610:19;::::0;;;:10:::1;:19;::::0;;;;:34;;-1:-1:-1;;;;;;43610:34:0::1;-1:-1:-1::0;;;;;43610:34:0;;;::::1;::::0;;;::::1;::::0;;43089:563::o;42527:196::-;35211:10;;-1:-1:-1;;;;;35211:10:0;12231;35211:26;35203:67;;;;-1:-1:-1;;;35203:67:0;;15531:2:1;35203:67:0;;;15513:21:1;15570:2;15550:18;;;15543:30;15609;15589:18;;;15582:58;15657:18;;35203:67:0;15329:352:1;35203:67:0;42594:9:::1;42589:127;42609:5;:12:::0;42605:16;::::1;42589:127;;;42653:10;:20;42664:5;42670:1;42664:8;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;;::::1;::::0;42653:20;;;::::1;::::0;;;;;;;;;;;;42643:61;;-1:-1:-1;;;42643:61:0;;42693:10:::1;42643:61;::::0;::::1;2654:51:1::0;-1:-1:-1;;;;;42653:20:0;;::::1;::::0;42643:49:::1;::::0;2627:18:1;;42643:61:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;42623:3;;;;;:::i;:::-;;;;42589:127;;38585:472:::0;-1:-1:-1;;;;;38754:22:0;;38652:7;38754:22;;;:12;:22;;;;;;38750:68;;-1:-1:-1;38805:1:0;;38585:472;-1:-1:-1;38585:472:0:o;38750:68::-;-1:-1:-1;;;;;38868:22:0;;38828;38868;;;:12;:22;;;;;;38853:37;;:12;:37;:::i;:::-;38828:62;;33884:2;38905:14;:43;38901:148;;-1:-1:-1;38970:1:0;;38585:472;-1:-1:-1;;38585:472:0:o;38901:148::-;39007:42;39035:14;33884:2;39007:42;:::i;:::-;39000:49;38585:472;-1:-1:-1;;;38585:472:0:o;41977:186::-;12850:6;;-1:-1:-1;;;;;12850:6:0;12231:10;12997:23;12989:68;;;;-1:-1:-1;;;12989:68:0;;;;;;;:::i;:::-;42032:9:::1;42028:128;42051:5;:12:::0;42047:16;::::1;42028:128;;;42095:10;:20;42106:5;42112:1;42106:8;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;;::::1;::::0;42095:20;;;::::1;::::0;;;;;;;;;;;;42085:59;;-1:-1:-1;;;42085:59:0;;42133:10:::1;42085:59;::::0;::::1;2654:51:1::0;-1:-1:-1;;;;;42095:20:0;;::::1;::::0;42085:47:::1;::::0;2627:18:1;;42085:59:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;42065:3;;;;;:::i;:::-;;;;42028:128;;13686:201:::0;12850:6;;-1:-1:-1;;;;;12850:6:0;12231:10;12997:23;12989:68;;;;-1:-1:-1;;;12989:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;13775:22:0;::::1;13767:73;;;::::0;-1:-1:-1;;;13767:73:0;;15888:2:1;13767:73:0::1;::::0;::::1;15870:21:1::0;15927:2;15907:18;;;15900:30;15966:34;15946:18;;;15939:62;-1:-1:-1;;;16017:18:1;;;16010:36;16063:19;;13767:73:0::1;15686:402:1::0;13767:73:0::1;13851:28;13870:8;13851:18;:28::i;38178:156::-:0;12850:6;;-1:-1:-1;;;;;12850:6:0;12231:10;35016:23;;:53;;-1:-1:-1;35043:10:0;;-1:-1:-1;;;;;35043:10:0;12231;35043:26;35016:53;34994:144;;;;-1:-1:-1;;;34994:144:0;;;;;;;:::i;:::-;38263:25:::1;38280:7;38263:16;:25::i;:::-;38299:17;:27:::0;38178:156::o;42171:118::-;12850:6;;-1:-1:-1;;;;;12850:6:0;12231:10;12997:23;12989:68;;;;-1:-1:-1;;;12989:68:0;;;;;;;:::i;:::-;42248:23:::1;:33:::0;42171:118::o;41387:279::-;41476:5;:12;41435:20;;41495:17;;41468:45;;;;-1:-1:-1;;;41468:45:0;;;;;;;;:::i;:::-;;41529:9;41524:135;41548:5;:12;41544:16;;41524:135;;;41608:10;:20;41619:5;41625:1;41619:8;;;;;;;;:::i;:::-;;;;;;;;;41608:20;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;41608:20:0;-1:-1:-1;;;;;41598:47:0;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41582:65;;;;:::i;:::-;;-1:-1:-1;41562:3:0;;;;:::i;:::-;;;;41524:135;;46019:118;46083:21;:19;:21::i;:::-;46106:22;46075:54;;;;;-1:-1:-1;;;46075:54:0;;;;;;;;:::i;45426:226::-;45551:23;;45522:26;;45507:41;;:12;:41;:::i;:::-;:67;45485:159;;;;-1:-1:-1;;;45485:159:0;;16295:2:1;45485:159:0;;;16277:21:1;16334:2;16314:18;;;16307:30;16373:34;16353:18;;;16346:62;-1:-1:-1;;;16424:18:1;;;16417:40;16474:19;;45485:159:0;16093:406:1;47402:190:0;47537:12;;47504:29;47520:13;47504;:29;:::i;:::-;:45;;47496:88;;;;-1:-1:-1;;;47496:88:0;;16706:2:1;47496:88:0;;;16688:21:1;16745:2;16725:18;;;16718:30;16784:32;16764:18;;;16757:60;16834:18;;47496:88:0;16504:354:1;18601:276:0;-1:-1:-1;;;;;18685:21:0;;18677:65;;;;-1:-1:-1;;;18677:65:0;;17065:2:1;18677:65:0;;;17047:21:1;17104:2;17084:18;;;17077:30;17143:33;17123:18;;;17116:61;17194:18;;18677:65:0;16863:355:1;18677:65:0;18771:6;18755:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;18788:18:0;;:9;:18;;;;;;;;;;:28;;18810:6;;18788:9;:28;;18810:6;;18788:28;:::i;:::-;;;;-1:-1:-1;;18832:37:0;;160:25:1;;;-1:-1:-1;;;;;18832:37:0;;;18849:1;;18832:37;;148:2:1;133:18;18832:37:0;;;;;;;18601:276;;:::o;45660:189::-;45736:5;:12;45751:1;-1:-1:-1;45728:50:0;;;;-1:-1:-1;;;45728:50:0;;17425:2:1;45728:50:0;;;17407:21:1;17464:2;17444:18;;;17437:30;-1:-1:-1;;;17483:18:1;;;17476:51;17544:18;;45728:50:0;17223:345:1;45728:50:0;45797:18;;;;:9;:18;;;;;;45817:23;;45797:18;;45789:52;;;;-1:-1:-1;;;45789:52:0;;;;;;;;:::i;14047:191::-;14140:6;;;-1:-1:-1;;;;;14157:17:0;;;-1:-1:-1;;;;;;14157:17:0;;;;;;;14190:40;;14140:6;;;14157:17;14140:6;;14190:40;;14121:16;;14190:40;14110:128;14047:191;:::o;18885:468::-;-1:-1:-1;;;;;18969:21:0;;18961:67;;;;-1:-1:-1;;;18961:67:0;;17775:2:1;18961:67:0;;;17757:21:1;17814:2;17794:18;;;17787:30;17853:34;17833:18;;;17826:62;-1:-1:-1;;;17904:18:1;;;17897:31;17945:19;;18961:67:0;17573:397:1;18961:67:0;-1:-1:-1;;;;;19066:18:0;;19041:22;19066:18;;;;;;;;;;;19103:24;;;;19095:71;;;;-1:-1:-1;;;19095:71:0;;18177:2:1;19095:71:0;;;18159:21:1;18216:2;18196:18;;;18189:30;18255:34;18235:18;;;18228:62;-1:-1:-1;;;18306:18:1;;;18299:32;18348:19;;19095:71:0;17975:398:1;19095:71:0;-1:-1:-1;;;;;19202:18:0;;:9;:18;;;;;;;;;;19223:23;;;19202:44;;19268:12;:22;;19240:6;;19202:9;19268:22;;19240:6;;19268:22;:::i;:::-;;;;-1:-1:-1;;19308:37:0;;160:25:1;;;19334:1:0;;-1:-1:-1;;;;;19308:37:0;;;;;148:2:1;133:18;19308:37:0;;;;;;;18950:403;18885:468;;:::o;47161:233::-;47258:9;47253:134;47273:5;:12;47269:16;;47253:134;;;47317:10;:20;47328:5;47334:1;47328:8;;;;;;;;:::i;:::-;;;;;;;;;;;;;;47317:20;;;;;;;;;;;;;;;;47307:68;;-1:-1:-1;;;47307:68:0;;-1:-1:-1;;;;;9225:32:1;;;47307:68:0;;;9207:51:1;9274:18;;;9267:34;;;47317:20:0;;;;47307:47;;9180:18:1;;47307:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47287:3;;;;;:::i;:::-;;;;47253:134;;45857:154;45963:10;45911:4;45950:24;;;:12;:24;;;;;;33884:2;;45935:39;;:12;:39;:::i;:::-;:68;;45928:75;;45857:154;:::o;46145:1008::-;46311:29;46328:11;46311:16;:29::i;:::-;46359:20;;;;:9;:20;;;;;;;;46351:67;;;;-1:-1:-1;;;46351:67:0;;18859:2:1;46351:67:0;;;18841:21:1;18898:2;18878:18;;;18871:30;18937:34;18917:18;;;18910:62;-1:-1:-1;;;18988:18:1;;;18981:32;19030:19;;46351:67:0;18657:398:1;46351:67:0;46470:1;46451:16;:20;:47;;;;;46495:3;46475:16;:23;;46451:47;46429:162;;;;-1:-1:-1;;;46429:162:0;;19262:2:1;46429:162:0;;;19244:21:1;19301:2;19281:18;;;19274:30;19340:34;19320:18;;;19313:62;19411:34;19391:18;;;19384:62;-1:-1:-1;;;19462:19:1;;;19455:32;19504:19;;46429:162:0;19060:469:1;46429:162:0;46602:14;:12;:14::i;:::-;46627:12;46652:23;;;:10;:23;;;;;;;;;46642:41;;-1:-1:-1;;;46642:41:0;;;;-1:-1:-1;;;;;46652:23:0;;;;46642:39;;:41;;;;;;;;;;;46652:23;46642:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46753:23;;;;:10;:23;;;;;;;;46743:60;;-1:-1:-1;;;46743:60:0;;;;;160:25:1;;;46627:56:0;;-1:-1:-1;;;;;;46753:23:0;;46743:42;;133:18:1;;46743:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;46833:37:0;;-1:-1:-1;;;46833:37:0;;46864:4;46833:37;;;2654:51:1;46814:16:0;;-1:-1:-1;;;;;;46833:22:0;;;-1:-1:-1;46833:22:0;;2627:18:1;;46833:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46814:56;-1:-1:-1;46884:12:0;;46881:217;;46988:21;;;;:10;:21;;;;;;46962:58;;-1:-1:-1;;;;;46962:25:0;;;;46988:21;47011:8;46962:25;:58::i;:::-;47045:21;;;;:10;:21;;;;;;;47035:51;;-1:-1:-1;;;47035:51:0;;;;-1:-1:-1;;;;;47045:21:0;;;;47035:49;;:51;;;;;;;;;;;47045:21;;47035:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46881:217;47113:32;;160:25:1;;;47113:32:0;;148:2:1;133:18;47113:32:0;;;;;;;46238:915;;46145:1008;;;:::o;30293:723::-;30349:13;30570:10;30566:53;;-1:-1:-1;;30597:10:0;;;;;;;;;;;;-1:-1:-1;;;30597:10:0;;;;;30293:723::o;30566:53::-;30644:5;30629:12;30685:78;30692:9;;30685:78;;30718:8;;;;:::i;:::-;;-1:-1:-1;30741:10:0;;-1:-1:-1;30749:2:0;30741:10;;:::i;:::-;;;30685:78;;;30773:19;30805:6;30795:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30795:17:0;;30773:39;;30823:154;30830:10;;30823:154;;30857:11;30867:1;30857:11;;:::i;:::-;;-1:-1:-1;30926:10:0;30934:2;30926:5;:10;:::i;:::-;30913:24;;:2;:24;:::i;:::-;30900:39;;30883:6;30890;30883:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;30883:56:0;;;;;;;;-1:-1:-1;30954:11:0;30963:2;30954:11;;:::i;:::-;;;30823:154;;;31001:6;30293:723;-1:-1:-1;;;;30293:723:0:o;14304:211::-;14448:58;;;-1:-1:-1;;;;;9225:32:1;;;14448:58:0;;;9207:51:1;9274:18;;;;9267:34;;;14448:58:0;;;;;;;;;;9180:18:1;;;;14448:58:0;;;;;;;;-1:-1:-1;;;;;14448:58:0;-1:-1:-1;;;14448:58:0;;;17327:69;;;;;;;;;;;;;;;;14421:86;;14441:5;;14448:58;-1:-1:-1;;17327:69:0;;:27;;;14448:58;;17327:27;:69::i;:::-;17411:17;;17301:95;;-1:-1:-1;17411:21:0;17407:179;;17508:10;17497:30;;;;;;;;;;;;:::i;:::-;17489:85;;;;-1:-1:-1;;;17489:85:0;;19985:2:1;17489:85:0;;;19967:21:1;20024:2;20004:18;;;19997:30;20063:34;20043:18;;;20036:62;-1:-1:-1;;;20114:18:1;;;20107:40;20164:19;;17489:85:0;19783:406:1;7593:229:0;7730:12;7762:52;7784:6;7792:4;7798:1;7801:12;7730;5110:20;;9000:60;;;;-1:-1:-1;;;9000:60:0;;20803:2:1;9000:60:0;;;20785:21:1;20842:2;20822:18;;;20815:30;20881:31;20861:18;;;20854:59;20930:18;;9000:60:0;20601:353:1;9000:60:0;9074:12;9088:23;9115:6;-1:-1:-1;;;;;9115:11:0;9134:5;9141:4;9115:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9073:73;;;;9164:51;9181:7;9190:10;9202:12;9164:16;:51::i;:::-;9157:58;8713:510;-1:-1:-1;;;;;;;8713:510:0:o;11399:712::-;11549:12;11578:7;11574:530;;;-1:-1:-1;11609:10:0;11602:17;;11574:530;11723:17;;:21;11719:374;;11921:10;11915:17;11982:15;11969:10;11965:2;11961:19;11954:44;11719:374;12064:12;12057:20;;-1:-1:-1;;;12057:20:0;;;;;;;;:::i;196:131:1:-;-1:-1:-1;;;;;271:31:1;;261:42;;251:70;;317:1;314;307:12;332:247;391:6;444:2;432:9;423:7;419:23;415:32;412:52;;;460:1;457;450:12;412:52;499:9;486:23;518:31;543:5;518:31;:::i;739:258::-;811:1;821:113;835:6;832:1;829:13;821:113;;;911:11;;;905:18;892:11;;;885:39;857:2;850:10;821:113;;;952:6;949:1;946:13;943:48;;;987:1;978:6;973:3;969:16;962:27;943:48;;739:258;;;:::o;1002:::-;1044:3;1082:5;1076:12;1109:6;1104:3;1097:19;1125:63;1181:6;1174:4;1169:3;1165:14;1158:4;1151:5;1147:16;1125:63;:::i;:::-;1242:2;1221:15;-1:-1:-1;;1217:29:1;1208:39;;;;1249:4;1204:50;;1002:258;-1:-1:-1;;1002:258:1:o;1265:220::-;1414:2;1403:9;1396:21;1377:4;1434:45;1475:2;1464:9;1460:18;1452:6;1434:45;:::i;1871:632::-;2042:2;2094:21;;;2164:13;;2067:18;;;2186:22;;;2013:4;;2042:2;2265:15;;;;2239:2;2224:18;;;2013:4;2308:169;2322:6;2319:1;2316:13;2308:169;;;2383:13;;2371:26;;2452:15;;;;2417:12;;;;2344:1;2337:9;2308:169;;;-1:-1:-1;2494:3:1;;1871:632;-1:-1:-1;;;;;;1871:632:1:o;2716:315::-;2784:6;2792;2845:2;2833:9;2824:7;2820:23;2816:32;2813:52;;;2861:1;2858;2851:12;2813:52;2900:9;2887:23;2919:31;2944:5;2919:31;:::i;:::-;2969:5;3021:2;3006:18;;;;2993:32;;-1:-1:-1;;;2716:315:1:o;3036:180::-;3095:6;3148:2;3136:9;3127:7;3123:23;3119:32;3116:52;;;3164:1;3161;3154:12;3116:52;-1:-1:-1;3187:23:1;;3036:180;-1:-1:-1;3036:180:1:o;3221:316::-;3298:6;3306;3314;3367:2;3355:9;3346:7;3342:23;3338:32;3335:52;;;3383:1;3380;3373:12;3335:52;-1:-1:-1;;3406:23:1;;;3476:2;3461:18;;3448:32;;-1:-1:-1;3527:2:1;3512:18;;;3499:32;;3221:316;-1:-1:-1;3221:316:1:o;3938:898::-;-1:-1:-1;;;;;4371:15:1;;;4353:34;;4423:15;;;4418:2;4403:18;;4396:43;4475:15;;;4470:2;4455:18;;4448:43;4527:15;;;4522:2;4507:18;;4500:43;4580:15;;4574:3;4559:19;;4552:44;4303:3;4333;4612:19;;4605:31;;;4274:4;;4653:45;4679:18;;;4671:6;4653:45;:::i;:::-;4729:3;4714:19;;4707:35;;;;-1:-1:-1;;4773:3:1;4758:19;;4751:35;;;;4817:3;4802:19;;;4795:35;4645:53;3938:898;-1:-1:-1;;;;;;3938:898:1:o;4841:127::-;4902:10;4897:3;4893:20;4890:1;4883:31;4933:4;4930:1;4923:15;4957:4;4954:1;4947:15;4973:125;5013:4;5041:1;5038;5035:8;5032:34;;;5046:18;;:::i;:::-;-1:-1:-1;5083:9:1;;4973:125::o;5938:380::-;6017:1;6013:12;;;;6060;;;6081:61;;6135:4;6127:6;6123:17;6113:27;;6081:61;6188:2;6180:6;6177:14;6157:18;6154:38;6151:161;;;6234:10;6229:3;6225:20;6222:1;6215:31;6269:4;6266:1;6259:15;6297:4;6294:1;6287:15;6449:1186;6558:4;6587:2;6616;6605:9;6598:21;6639:1;6672:6;6666:13;6702:3;6724:1;6752:9;6748:2;6744:18;6734:28;;6812:2;6801:9;6797:18;6834;6824:61;;6878:4;6870:6;6866:17;6856:27;;6824:61;6931:2;6923:6;6920:14;6900:18;6897:38;6894:165;;;-1:-1:-1;;;6958:33:1;;7014:4;7011:1;7004:15;7044:4;6965:3;7032:17;6894:165;7115:18;;;671:19;;;723:4;714:14;7158:18;7185:100;;;;7299:1;7294:315;;;;7151:458;;7185:100;-1:-1:-1;;7218:24:1;;7206:37;;7263:12;;;;-1:-1:-1;7185:100:1;;7294:315;6396:1;6389:14;;;6433:4;6420:18;;7389:1;7403:165;7417:6;7414:1;7411:13;7403:165;;;7495:14;;7482:11;;;7475:35;7538:16;;;;7432:10;;7403:165;;;7588:11;;;-1:-1:-1;;7151:458:1;-1:-1:-1;7626:3:1;;6449:1186;-1:-1:-1;;;;;;;;;6449:1186:1:o;7640:184::-;7710:6;7763:2;7751:9;7742:7;7738:23;7734:32;7731:52;;;7779:1;7776;7769:12;7731:52;-1:-1:-1;7802:16:1;;7640:184;-1:-1:-1;7640:184:1:o;7829:168::-;7869:7;7935:1;7931;7927:6;7923:14;7920:1;7917:21;7912:1;7905:9;7898:17;7894:45;7891:71;;;7942:18;;:::i;:::-;-1:-1:-1;7982:9:1;;7829:168::o;8002:127::-;8063:10;8058:3;8054:20;8051:1;8044:31;8094:4;8091:1;8084:15;8118:4;8115:1;8108:15;8134:120;8174:1;8200;8190:35;;8205:18;;:::i;:::-;-1:-1:-1;8239:9:1;;8134:120::o;8259:127::-;8320:10;8315:3;8311:20;8308:1;8301:31;8351:4;8348:1;8341:15;8375:4;8372:1;8365:15;8391:128;8431:3;8462:1;8458:6;8455:1;8452:13;8449:39;;;8468:18;;:::i;:::-;-1:-1:-1;8504:9:1;;8391:128::o;8524:135::-;8563:3;-1:-1:-1;;8584:17:1;;8581:43;;;8604:18;;:::i;:::-;-1:-1:-1;8651:1:1;8640:13;;8524:135::o;8664:356::-;8866:2;8848:21;;;8885:18;;;8878:30;8944:34;8939:2;8924:18;;8917:62;9011:2;8996:18;;8664:356::o;9312:277::-;9379:6;9432:2;9420:9;9411:7;9407:23;9403:32;9400:52;;;9448:1;9445;9438:12;9400:52;9480:9;9474:16;9533:5;9526:13;9519:21;9512:5;9509:32;9499:60;;9555:1;9552;9545:12;9594:405;9796:2;9778:21;;;9835:2;9815:18;;;9808:30;9874:34;9869:2;9854:18;;9847:62;-1:-1:-1;;;9940:2:1;9925:18;;9918:39;9989:3;9974:19;;9594:405::o;12661:251::-;12731:6;12784:2;12772:9;12763:7;12759:23;12755:32;12752:52;;;12800:1;12797;12790:12;12752:52;12832:9;12826:16;12851:31;12876:5;12851:31;:::i;14078:127::-;14139:10;14134:3;14130:20;14127:1;14120:31;14170:4;14167:1;14160:15;14194:4;14191:1;14184:15;19534:127;19595:10;19590:3;19586:20;19583:1;19576:31;19626:4;19623:1;19616:15;19650:4;19647:1;19640:15;19666:112;19698:1;19724;19714:35;;19729:18;;:::i;:::-;-1:-1:-1;19763:9:1;;19666:112::o;20959:274::-;21088:3;21126:6;21120:13;21142:53;21188:6;21183:3;21176:4;21168:6;21164:17;21142:53;:::i;:::-;21211:16;;;;;20959:274;-1:-1:-1;;20959:274:1:o

Swarm Source

ipfs://b38aa27e0f0c8f3125627fe81d09efc26f0670f22ce39700c704bba1de8500a1
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Validator ID :
0 FTM

Amount Staked
0

Amount Delegated
0

Staking Total
0

Staking Start Epoch
0

Staking Start Time
0

Proof of Importance
0

Origination Score
0

Validation Score
0

Active
0

Online
0

Downtime
0 s
Address Amount claimed Rewards Created On Epoch Created On
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.