Contract 0x584f21aee241dbf21e5d3f4428e9cd9bb4890b61 1

Txn Hash Method
Block
From
To
Value [Txn Fee]
0x5d7e14dfe07f8135c493cf1f9e855dfc1a00e967b6843c8f5114fbd678f647b30x60806040226700612021-11-21 4:44:26220 days 19 hrs ago0xbd52b44c9dc5fc5c4f1f49fed5cfca10fbd052f1 IN  Create: Strategy_DAI_FTM0 FTM1.1513094
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xd666c48e4ca2c2cd510200a0a17cb065684232ed29ec96a967b3b768a625c8bf415605832022-06-28 19:46:311 day 4 hrs ago 0x584f21aee241dbf21e5d3f4428e9cd9bb4890b61 Fantom Finance: Wrapped Fantom Token2.519906254887369666 FTM
0xd666c48e4ca2c2cd510200a0a17cb065684232ed29ec96a967b3b768a625c8bf415605832022-06-28 19:46:311 day 4 hrs ago 0x584f21aee241dbf21e5d3f4428e9cd9bb4890b61 SpookySwap: Router2.524955314513204897 FTM
0xd666c48e4ca2c2cd510200a0a17cb065684232ed29ec96a967b3b768a625c8bf415605832022-06-28 19:46:311 day 4 hrs ago 0xa5ade4eac20a1f1f90a51e5eaa2852d8ea098c89 0x584f21aee241dbf21e5d3f4428e9cd9bb4890b615 FTM
0x340bf21cd73bdfb2af2d9560926763478a09b1b161c66c4a68a5011b6dfd127b389832012022-05-24 22:35:4636 days 1 hr ago 0x584f21aee241dbf21e5d3f4428e9cd9bb4890b61 Fantom Finance: Wrapped Fantom Token24.953593373301826356 FTM
0x340bf21cd73bdfb2af2d9560926763478a09b1b161c66c4a68a5011b6dfd127b389832012022-05-24 22:35:4636 days 1 hr ago 0x584f21aee241dbf21e5d3f4428e9cd9bb4890b61 SpookySwap: Router25.003504002328236149 FTM
0x340bf21cd73bdfb2af2d9560926763478a09b1b161c66c4a68a5011b6dfd127b389832012022-05-24 22:35:4636 days 1 hr ago 0xa5ade4eac20a1f1f90a51e5eaa2852d8ea098c89 0x584f21aee241dbf21e5d3f4428e9cd9bb4890b6150 FTM
0x97315f1df2566731b947da6981d1e80fbb7965fc13699c234e3e44c10e8904c5388853602022-05-23 14:31:2937 days 10 hrs ago 0x584f21aee241dbf21e5d3f4428e9cd9bb4890b61 Fantom Finance: Wrapped Fantom Token3.497995294371980528 FTM
0x97315f1df2566731b947da6981d1e80fbb7965fc13699c234e3e44c10e8904c5388853602022-05-23 14:31:2937 days 10 hrs ago 0x584f21aee241dbf21e5d3f4428e9cd9bb4890b61 SpookySwap: Router3.505003299028452826 FTM
0x97315f1df2566731b947da6981d1e80fbb7965fc13699c234e3e44c10e8904c5388853602022-05-23 14:31:2937 days 10 hrs ago 0xa5ade4eac20a1f1f90a51e5eaa2852d8ea098c89 0x584f21aee241dbf21e5d3f4428e9cd9bb4890b617 FTM
0xffbcb15203f48ca0bdaac16602dd57af9ea6c0fca8f4d4d663615c660d856453386683662022-05-20 15:48:5440 days 8 hrs ago 0x584f21aee241dbf21e5d3f4428e9cd9bb4890b61 Fantom Finance: Wrapped Fantom Token4.994994589995524279 FTM
0xffbcb15203f48ca0bdaac16602dd57af9ea6c0fca8f4d4d663615c660d856453386683662022-05-20 15:48:5440 days 8 hrs ago 0x584f21aee241dbf21e5d3f4428e9cd9bb4890b61 SpookySwap: Router5.005001188052429932 FTM
0xffbcb15203f48ca0bdaac16602dd57af9ea6c0fca8f4d4d663615c660d856453386683662022-05-20 15:48:5440 days 8 hrs ago 0xa5ade4eac20a1f1f90a51e5eaa2852d8ea098c89 0x584f21aee241dbf21e5d3f4428e9cd9bb4890b6110 FTM
0xf763e10910ce1f6ea189e9a322dec6d190bcce9ea4901ea4dfca410e947d2653386069022022-05-19 19:39:4041 days 4 hrs ago 0x584f21aee241dbf21e5d3f4428e9cd9bb4890b61 Fantom Finance: Wrapped Fantom Token4.992740909508533396 FTM
0xf763e10910ce1f6ea189e9a322dec6d190bcce9ea4901ea4dfca410e947d2653386069022022-05-19 19:39:4041 days 4 hrs ago 0x584f21aee241dbf21e5d3f4428e9cd9bb4890b61 SpookySwap: Router5.00274328561339326 FTM
0xf763e10910ce1f6ea189e9a322dec6d190bcce9ea4901ea4dfca410e947d2653386069022022-05-19 19:39:4041 days 4 hrs ago 0xa5ade4eac20a1f1f90a51e5eaa2852d8ea098c89 0x584f21aee241dbf21e5d3f4428e9cd9bb4890b6110 FTM
0xd0b882427d11c1710ca46f4d0a3be2fc4c0fd4da83d3d253973d485c955d8cc2378302382022-05-08 11:24:2452 days 13 hrs ago 0x584f21aee241dbf21e5d3f4428e9cd9bb4890b61 Fantom Finance: Wrapped Fantom Token2.738257384764116457 FTM
0xd0b882427d11c1710ca46f4d0a3be2fc4c0fd4da83d3d253973d485c955d8cc2378302382022-05-08 11:24:2452 days 13 hrs ago 0x584f21aee241dbf21e5d3f4428e9cd9bb4890b61 SpookySwap: Router2.743743955990902976 FTM
0xd0b882427d11c1710ca46f4d0a3be2fc4c0fd4da83d3d253973d485c955d8cc2378302382022-05-08 11:24:2452 days 13 hrs ago 0xa5ade4eac20a1f1f90a51e5eaa2852d8ea098c89 0x584f21aee241dbf21e5d3f4428e9cd9bb4890b614.980502 FTM
0xe8a5113e945eb388160d80d14fc74add52fdf320348b39def2939eefca570db3370846072022-04-27 16:50:3463 days 7 hrs ago 0x584f21aee241dbf21e5d3f4428e9cd9bb4890b61 Fantom Finance: Wrapped Fantom Token257.077610054755886142 FTM
0xe8a5113e945eb388160d80d14fc74add52fdf320348b39def2939eefca570db3370846072022-04-27 16:50:3463 days 7 hrs ago 0x584f21aee241dbf21e5d3f4428e9cd9bb4890b61 SpookySwap: Router257.584595966737692095 FTM
0xe8a5113e945eb388160d80d14fc74add52fdf320348b39def2939eefca570db3370846072022-04-27 16:50:3463 days 7 hrs ago 0xa5ade4eac20a1f1f90a51e5eaa2852d8ea098c89 0x584f21aee241dbf21e5d3f4428e9cd9bb4890b61515 FTM
0xd95d68eec41f896e18f0193ebc945b5afc1b21343b814c5e07ecfc2a652c2a83363832402022-04-18 16:25:0872 days 8 hrs ago 0x584f21aee241dbf21e5d3f4428e9cd9bb4890b61 Fantom Finance: Wrapped Fantom Token84.848440302415545763 FTM
0xd95d68eec41f896e18f0193ebc945b5afc1b21343b814c5e07ecfc2a652c2a83363832402022-04-18 16:25:0872 days 8 hrs ago 0x584f21aee241dbf21e5d3f4428e9cd9bb4890b61 SpookySwap: Router85.017632235890929952 FTM
0xd95d68eec41f896e18f0193ebc945b5afc1b21343b814c5e07ecfc2a652c2a83363832402022-04-18 16:25:0872 days 8 hrs ago 0xa5ade4eac20a1f1f90a51e5eaa2852d8ea098c89 0x584f21aee241dbf21e5d3f4428e9cd9bb4890b61170 FTM
0xebfb2a99d35f5f3a52bd9e62eb4d41ba3e7ed8421113fe6ecc530b58bf6f5476361631382022-04-16 0:54:5474 days 23 hrs ago 0x584f21aee241dbf21e5d3f4428e9cd9bb4890b61 Fantom Finance: Wrapped Fantom Token17.613384268567535216 FTM
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Strategy_DAI_FTM

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;


library FullMath {
    function fullMul(uint256 x, uint256 y) internal pure returns (uint256 l, uint256 h) {
        uint256 mm = mulmod(x, y, type(uint256).max);
        l = x * y;
        h = mm - l;
        if (mm < l) h -= 1;
    }

    function fullDiv(
        uint256 l,
        uint256 h,
        uint256 d
    ) private pure returns (uint256) {
        uint256 pow2 = d & (~d+1);
        d /= pow2;
        l /= pow2;
        l += h * ((~pow2+1) / pow2 + 1);
        uint256 r = 1;
        r *= 2 - d * r;
        r *= 2 - d * r;
        r *= 2 - d * r;
        r *= 2 - d * r;
        r *= 2 - d * r;
        r *= 2 - d * r;
        r *= 2 - d * r;
        r *= 2 - d * r;
        return l * r;
    }

    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 d
    ) internal pure returns (uint256) {
        (uint256 l, uint256 h) = fullMul(x, y);

        uint256 mm = mulmod(x, y, d);
        if (mm > l) h -= 1;
        l -= mm;

        if (h == 0) return l / d;

        require(h < d, 'FullMath: FULLDIV_OVERFLOW');
        return fullDiv(l, h, d);
    }
}


library FixedPoint {
    // range: [0, 2**112 - 1]
    // resolution: 1 / 2**112
    struct uq112x112 {
        uint224 _x;
    }

    // range: [0, 2**144 - 1]
    // resolution: 1 / 2**112
    struct uq144x112 {
        uint256 _x;
    }

    uint8 public constant RESOLUTION = 112;
    uint256 public constant Q112 = 0x10000000000000000000000000000; // 2**112

    // decode a UQ144x112 into a uint144 by truncating after the radix point
    function decode144(uq144x112 memory self) internal pure returns (uint144) {
        return uint144(self._x >> RESOLUTION);
    }

    // multiply a UQ112x112 by a uint, returning a UQ144x112
    // reverts on overflow
    function mul(uq112x112 memory self, uint256 y) internal pure returns (uq144x112 memory) {
        uint256 z = 0;
        require(y == 0 || (z = self._x * y) / y == self._x, 'FixedPoint::mul: overflow');
        return uq144x112(z);
    }

    // returns a UQ112x112 which represents the ratio of the numerator to the denominator
    // can be lossy
    function fraction(uint256 numerator, uint256 denominator) internal pure returns (uq112x112 memory) {
        require(denominator > 0, 'FixedPoint::fraction: division by zero');
        if (numerator == 0) return FixedPoint.uq112x112(0);

        if (numerator <= type(uint144).max) {
            uint256 result = (numerator << RESOLUTION) / denominator;
            require(result <= type(uint224).max, 'FixedPoint::fraction: overflow');
            return uq112x112(uint224(result));
        } else {
            uint256 result = FullMath.mulDiv(numerator, Q112, denominator);
            require(result <= type(uint224).max, 'FixedPoint::fraction: overflow');
            return uq112x112(uint224(result));
        }
    }
}

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

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

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

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

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

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

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

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

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

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



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


interface IWETH is IERC20 {
    function deposit() external payable;
    function transfer(address dst, uint wad) external returns (bool);
    function withdraw(uint wad) external;
}


interface IRouter {
    function factory() external view returns (address);
    function WETH() external view returns (address);

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

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


interface IPair {
    function token0() external view returns (address);
    function token1() external view returns (address);
    function price0CumulativeLast() external view returns (uint);
    function price1CumulativeLast() external view returns (uint);
    function blockTimestampLast() external view returns (uint);
    function getReserves() external view returns (uint112, uint112, uint32);
    function totalSupply() external view returns (uint256);
    function MINIMUM_LIQUIDITY() external view returns (uint256);
    function mint(address to) external returns (uint256);
}


// ------------> Important interface for farm. Must be changed for every farm <--------------
interface IFarm{
    function boo() external view returns (address);
    function deposit(uint256 _pid, uint256 _amount) external;
    function withdraw(uint256 _pid, uint256 _amount) external;
    function userInfo(uint256 _pid, address _user) external view returns (uint256, uint256);
    function poolInfo(uint256) external view returns(address lpToken, uint allocPoint, uint lastRewardBlock, uint accSpiritPerShare, uint16 depositFeeBP);
}

// library with helper methods for oracles that are concerned with computing average prices
library UniswapV2OracleLibrary {
    using FixedPoint for *;

    // helper function that returns the current block timestamp within the range of uint32, i.e. [0, 2**32 - 1]
    function currentBlockTimestamp() internal view returns (uint32) {
        return uint32(block.timestamp % 2 ** 32);
    }

    // produces the cumulative price using counterfactuals to save gas and avoid a call to sync.
    function currentCumulativePrices(
        address pair
    ) internal view returns (uint price0Cumulative, uint price1Cumulative, uint32 blockTimestamp) {
        blockTimestamp = currentBlockTimestamp();
        price0Cumulative = IPair(pair).price0CumulativeLast();
        price1Cumulative = IPair(pair).price1CumulativeLast();

        // if time has elapsed since the last update on the pair, mock the accumulated price values
        (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast) = IPair(pair).getReserves();
        if (blockTimestampLast != blockTimestamp) {
            // subtraction overflow is desired
            uint32 timeElapsed = blockTimestamp - blockTimestampLast;
            // addition overflow is desired
            // counterfactual
            price0Cumulative += uint(FixedPoint.fraction(reserve1, reserve0)._x) * timeElapsed;
            // counterfactual
            price1Cumulative += uint(FixedPoint.fraction(reserve0, reserve1)._x) * timeElapsed;
        }
    }
}


library Math {
    function min(uint x, uint y) internal pure returns (uint z) {
        z = x < y ? x : y;
    }

    // babylonian method (https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method)
    function sqrt(uint y) internal pure returns (uint z) {
        if (y > 3) {
            z = y;
            uint x = y / 2 + 1;
            while (x < z) {
                z = x;
                x = (y / x + x) / 2;
            }
        } else if (y != 0) {
            z = 1;
        }
    }
}


contract Strategy_DAI_FTM {
    // This strategy is for FTM network. DAI - FTM pair. RewardToken = "Boo"
    using SafeERC20 for IERC20;
    using Address for address;
    using FixedPoint for *;

    uint256 public constant withdrawFee = 15; // 15%
    uint256 public constant toleranceLevelPercent = 1; // 1%
    uint256 private constant PERIOD = 10 seconds;
    uint256 private constant percentCheckDifference = 5;

    uint256 public pendingFee; // in native tokens
    uint256 public pendingRewardsFee; // in reward tokens from farm
    address public constant USDT = 0x049d68029688eAbF473097a2fC38ef61633A3C7A;
    address public constant yelLiquidityRouter = 0xF491e7B69E4244ad4002BC14e878a34207E38c29;
    address public constant YELtoken = 0xD3b71117E6C1558c1553305b44988cd944e97300;
    address public constant WETH = 0x21be370D5312f44cB42ce377BC9b8a0cEF1A4C83;

    address public token0; // wftm
    address public token1; // dai
    address public vault;

    // ------------> Important constants <--------------
    uint256 public constant pid = 3;
    bool public constant hasPid = true;
    address public router = 0xF491e7B69E4244ad4002BC14e878a34207E38c29;
    address public constant lpToken = 0xe120ffBDA0d14f3Bb6d6053E90E63c572A66a428;
    address public constant farm = 0x2b2929E785374c651a81A63878Ab22742656DcDd;
    // ------------>        END          <--------------

    mapping(address => uint256) public pendingYel;
    uint private price0CumulativeLast;
    uint private price1CumulativeLast;
    uint32 private blockTimestampLast;
    uint256 public token1TWAP;
    uint256 public token0TWAP;
    uint256 public token1Price;
    uint256 public token0Price;

    event AutoCompound();
    event Earn(uint256 amount);
    event YELswapped(uint256 percent);
    event WithdrawFromStrategy(uint256 amount);
    event TakeFee(uint256 rewardsFeeInWETH, uint256 amountWETH);

    modifier onlyVault() {
        require(msg.sender == vault, "The sender is not vault");
        _;
    }

    constructor(address _vault) {
        require(_vault != address(0), "Vault can not be zero address");
        vault = _vault;
        token0 = IPair(lpToken).token0();
        token1 = IPair(lpToken).token1();

        _approveToken(lpToken, farm);
        _approveToken(WETH, router);
        _approveToken(token0, router);
        _approveToken(token1, router);

        price0CumulativeLast = IPair(lpToken).price0CumulativeLast(); // fetch the current accumulated price value (0 / 1)
        price1CumulativeLast = IPair(lpToken).price1CumulativeLast(); // fetch the current accumulated price value (0 / 1)
        (,,blockTimestampLast) = IPair(lpToken).getReserves();
    }

    receive() external payable onlyVault {
        deposit();
    }

    // ------------> Important functions for farm <--------------
    function getRewardToken() public view returns (address){
        return IFarm(farm).boo();
    }

    function _withdrawFromFarm(uint256 _amount) internal {
        IFarm(farm).withdraw(pid, _amount);
    }

    function getAmountLPFromFarm() public view returns (uint256 amount) {
        (amount,) = IFarm(farm).userInfo(pid, address(this));
    }
    
    function earn() public returns(uint256 _balance){
        _balance = getBalanceOfToken(lpToken);
        if(_balance > 0) {
            IFarm(farm).deposit(pid, _balance);
            emit Earn(getBalanceOfToken(lpToken));
        }
    }
    //  -------------------------> END <---------------------------

    // each farm has own autoCompound logic, pay attention 
    // what tokens can be returned from the farm
    function autoCompound() external {
        address[] memory path = new address[](2);
        uint256 amount = getAmountLPFromFarm();
        address rewardToken = getRewardToken();

        _approveToken(rewardToken, router);
        _approveToken(WETH, router);
        _approveToken(USDT, router);

        if (amount > 0) {
            // rewards and LP
            _withdrawFromFarm(amount);

            uint256 _balance = getBalanceOfToken(rewardToken);
            if(_balance > 0){
                path[0] = rewardToken;
                path[1] = WETH; // WFTM 
                amount = _getAmountsOut(_balance+pendingRewardsFee, path);
                if(amount > 100) {
                    _swapExactTokensForTokens(router, _balance+pendingRewardsFee, amount, path);
                    pendingRewardsFee = 0;
                } else{
                    pendingRewardsFee += _calculateAmountFee(_balance);
                }
                _takeFee();
            }
            _addLiquidityFromAllTokens();
            earn();
        }  
        emit AutoCompound();
    }

    
    function claimYel(address _receiver) public onlyVault {
        uint256 yelAmount = getPendingYel(_receiver);
        if(yelAmount > 0) {
            _transfer(YELtoken, _receiver, yelAmount);
            pendingYel[_receiver] = 0;
        }
    }

    function emergencyWithdraw(address _receiver) public onlyVault {
        uint256 amount = getAmountLPFromFarm();
        address _token = getRewardToken();
        _withdrawFromFarm(amount);
        _transfer(lpToken, _receiver, getBalanceOfToken(lpToken));
        _transfer(_token, _receiver, getBalanceOfToken(_token));
        _transfer(USDT, _receiver, getBalanceOfToken(USDT));
        _transfer(WETH, _receiver, getBalanceOfToken(WETH));
    }

    function requestWithdraw(address _receiver, uint256 _percent) public onlyVault {
        uint256 _totalLP = getAmountLPFromFarm();
        if (_totalLP > 0) {
            uint256 yelAmount = _swapToYELs(_percent);
            if(yelAmount > 0) {
                pendingYel[_receiver] += yelAmount;
            } 
            emit WithdrawFromStrategy(yelAmount);
        }
    }

    function migrate(uint256 _percent) public onlyVault {
        _swapLPtoWETH(_percent * 10 ** 12);
        _transfer(WETH, vault, getBalanceOfToken(WETH));
    }

    function deposit() public payable onlyVault returns (uint256) {
        _approveToken(token0, router);
        _approveToken(token1, router);
        _updateAveragePrices();
        // it needs to involve previous leftover funds
        _addLiquidityETH(address(this).balance);
        uint256 lpBalance = earn();
        return _getSimpleTCI(lpBalance);
    }

    function depositAsMigrate() public onlyVault {
        require(getBalanceOfToken(WETH) > 0, "Not enough WETH to make migration");
        _approveToken(token0, router);
        _approveToken(token1, router);
        _approveToken(token0, lpToken);
        _approveToken(token1, lpToken);
        _approveToken(lpToken, farm);
        _approveToken(WETH, router);
        _addLiquidityFromAllTokens();
        earn();
    }

    function getTotalCapitalInternal() public view returns (uint256) {
        return _getSimpleTCI(getAmountLPFromFarm());
    }

    function getTotalCapital() public view returns (uint256) {
        return _getSimpleTC();
    }

    function getPendingYel(address _receiver) public view returns(uint256) {
        return pendingYel[_receiver];
    }

    function getBalanceOfToken(address _token) public view returns (uint256) {
        if(_token == WETH) {
            return IERC20(_token).balanceOf(address(this)) - pendingFee;
        }
        if(_token == getRewardToken()) {
            return IERC20(_token).balanceOf(address(this)) - pendingRewardsFee;
        }
        return IERC20(_token).balanceOf(address(this));
    }

    function _getAmountsOut(uint256 _amount, address[] memory path) internal view returns (uint256){
        uint256[] memory amounts = IRouter(router).getAmountsOut(_amount, path);
        return amounts[1];
    }

    function _getTokenValues(
        uint256 _amountLP
    ) internal view returns (uint256 token0Value, uint256 token1Value) {
        (uint256 _reserve0, uint256 _reserve1,) = IPair(lpToken).getReserves();
        uint256 LPRatio = _amountLP * (10**12) / IPair(lpToken).totalSupply();
        // Result with LPRatio must be divided by (10**12)!
        token0Value = LPRatio * _reserve0 / (10**12);
        token1Value = LPRatio * _reserve1 / (10**12);
    }

    function setRouter(address _address) public onlyVault {
        require(_address != address(0), "The address can not be zero address");
        router = _address;
         _approveToken(WETH, router);
         _approveToken(token0, router);
         _approveToken(token1, router);
    }

    function withdrawUSDTFee(address _owner) public onlyVault {
        uint256 _balance = getBalanceOfToken(USDT);
        if(_balance > 0) {
            _transfer(USDT, _owner, _balance);
        }
    }

    function _transfer(address _token, address _to, uint256 _amount) internal {
        IERC20(_token).transfer(_to, _amount);
    }

    function _calculateAmountFee(uint256 amount) internal pure returns(uint256) {
        /*
        As the contract takes fee percent from the amount,
        so amount needs to multiple by percent and divide by 100

        example: amount = 50 LP, percent = 2%
        fee calculates: 50 * 2 / 100
        fee result: 1 LP
        */
        return (amount * withdrawFee) / 100;
    }

    function _approveToken(address _token, address _who) internal {
        IERC20(_token).safeApprove(_who, 0);
        IERC20(_token).safeApprove(_who, type(uint256).max);
    }

    function _takeFee() internal {
        address[] memory path = new address[](2);
        path[0] = WETH;
        path[1] = USDT;
        uint256 rewardsFeeInWETH = _calculateAmountFee(getBalanceOfToken(WETH));
        if(rewardsFeeInWETH > 0) {
            uint256 amount = _getAmountsOut(rewardsFeeInWETH + pendingFee, path);
            if(amount > 100) {
                _swapExactTokensForTokens(router, rewardsFeeInWETH + pendingFee, amount, path);
                pendingFee = 0;
                emit TakeFee(rewardsFeeInWETH, amount);
            } else {
                pendingFee += rewardsFeeInWETH;
            }
        }
    }

    function _getLiquidityAmounts(
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin
    ) internal view returns (uint amountA, uint amountB) {
        (uint reserveA, uint reserveB,) = IPair(lpToken).getReserves();
        if (reserveA == 0 && reserveB == 0) {
            (amountA, amountB) = (amountADesired, amountBDesired);
        } else {
            uint amountBOptimal = IRouter(router).quote(amountADesired, reserveA, reserveB);
            if (amountBOptimal <= amountBDesired) {
                if(amountBOptimal >= amountBMin) {
                    (amountA, amountB) = (amountADesired, amountBOptimal);
                } else {
                    (amountA, amountB) = (0, 0);
                }
            } else {
                uint amountAOptimal = IRouter(router).quote(amountBDesired, reserveB, reserveA);
                if(amountAOptimal <= amountADesired && amountAOptimal >= amountAMin) {
                    (amountA, amountB) = (amountAOptimal, amountBDesired);
                } else {
                    (amountA, amountB) = (0, 0);
                }
            }
        }
    }

    function _addLiquidity(uint256 _desired0, uint256 _desired1) internal {
        if(_canAddLiquidity(_desired0, _desired1)) {
            _transfer(token0, lpToken, _desired0);
            _transfer(token1, lpToken, _desired1);
            IPair(lpToken).mint(address(this));
        }
    }

    function _canAddLiquidity(uint256 amount0, uint256 amount1) internal view returns (bool) {
        (uint112 _reserve0, uint112 _reserve1,) = IPair(lpToken).getReserves(); // gas savings
        uint256 _totalSupply = IPair(lpToken).totalSupply();
        uint256 liquidity;
        uint256 minLiquidity = IPair(lpToken).MINIMUM_LIQUIDITY();

        if (_totalSupply == 0) {
            liquidity = Math.sqrt(amount0 * amount1) - minLiquidity;
        } else {
            liquidity = Math.min(
                amount0 * _totalSupply / _reserve0,
                amount1 * _totalSupply / _reserve1
            );
        }
        return liquidity > 0;
    }

    function _addLiquidityFromAllTokens() internal {
        _swapWETHToTokens();

        uint256 _balance0 = getBalanceOfToken(token0);
        uint256 _balance1 = getBalanceOfToken(token1);

        if(_balance0 > 100 && _balance1 > 100) {
            (uint256 amount0, uint256 amount1) = _getLiquidityAmounts(
                _balance0,
                _balance1,
                _balance0 - (_balance0*toleranceLevelPercent)/100,
                _balance1 - (_balance1*toleranceLevelPercent)/100
            );
            if(amount0 != 0 && amount1 !=0)
                _addLiquidity(amount0, amount1);
        }            
    }

    function _removeLiquidity() internal {
        _approveToken(lpToken, router);
        IRouter(router).removeLiquidity(
            token0, // tokenA
            token1, // tokenB
            getBalanceOfToken(lpToken), // liquidity
            0, // amountAmin0
            0, // amountAmin1
            address(this), // to 
            block.timestamp + 1 minutes // deadline
        );
    }

    function updateTWAP() public onlyVault {
        _updateTWAP();
    }

    function _updateAveragePrices() internal {
        _updateTWAP();
        _checkPrice();
    }

    function _updateTWAP() internal {
        (uint price0Cumulative, uint price1Cumulative, uint32 blockTimestamp) =
            UniswapV2OracleLibrary.currentCumulativePrices(address(lpToken));
        uint32 timeElapsed = blockTimestamp - blockTimestampLast; // overflow is desired

        token0TWAP = uint256(FixedPoint
        .uq112x112(uint224((price0Cumulative - price0CumulativeLast) / timeElapsed))
        .mul(1e36)
        .decode144()) / 1e18;

        token1TWAP = uint256(FixedPoint
            .uq112x112(uint224((price1Cumulative - price1CumulativeLast) / timeElapsed))
            .mul(1e36)
            .decode144()) / 1e18;

        price0CumulativeLast = price0Cumulative;
        price1CumulativeLast = price1Cumulative;
        blockTimestampLast = blockTimestamp;
    }

    function _checkPrice() internal {
        // check that price difference no more than 5 percent
        // price per one token
        token1Price = _getTokenPrice();

        string memory msgError = "Prices have more than 5 percent difference for token1";
        if(token1TWAP >= token1Price) {
            require(100 - (token1Price * 100 / token1TWAP) <= percentCheckDifference, msgError);
        } else {
            require(100 - (token1TWAP * 100 / token1Price) <= percentCheckDifference, msgError);
        }

        token0Price = _getTokenPrice1();
    }

    function _swapExactETHForTokens(address _token, uint256 _amountETH) internal {
        uint256[] memory amounts;
        address[] memory path = new address[](2);
        path[0] = WETH;
        // swap a half of msg.value to token
        if(_token != WETH) {
            path[1] = _token;
            amounts = IRouter(router).getAmountsOut(_amountETH/2, path);
            uint256 desiredAmountToken = amounts[1];
            if(desiredAmountToken > 100){
                IRouter(router).swapExactETHForTokens{value:_amountETH/2}(
                    desiredAmountToken - (desiredAmountToken*toleranceLevelPercent/100), // amountOutMin
                    path,
                    address(this),
                    block.timestamp + 1 minutes // deadline
                );
            }
        }
    }

    function _addLiquidityETH(uint256 _amountETH) internal {
        _swapExactETHForTokens(token1, _amountETH);
        __addLiquidityETH(token1, _amountETH / 2);
    }

    function __addLiquidityETH(address _token, uint256 desiredAmountETH) internal {
        uint256 desiredAmountToken = getBalanceOfToken(_token);
        (uint256 amount0, uint256 amount1) = _getLiquidityAmounts(
            desiredAmountETH,
            desiredAmountToken,
            desiredAmountETH - (desiredAmountETH*toleranceLevelPercent)/100,
            desiredAmountToken - (desiredAmountToken*toleranceLevelPercent)/100
        );
        if(amount0 != 0 && amount1 !=0 && _canAddLiquidity(amount0, amount1)) {
            _transfer(_token, lpToken, amount1);
            IWETH(WETH).deposit{value: amount0}();
            IWETH(WETH).transfer(lpToken, amount0);
            IPair(lpToken).mint(address(this));
        }
    }

    function _swapLPtoWETH(uint256 _percent) internal {
        uint256 _totalLP = getAmountLPFromFarm();
        if (_totalLP > 0) {
            _withdrawFromFarm((_percent * _totalLP) / (100 * 10 ** 12));
            address rewardToken = getRewardToken();

            _approveToken(rewardToken, router);
            _approveToken(WETH, router);

            // swap cakes to WETH
            _swapTokenToWETH(rewardToken);

            // swap LPs to token0 and token1
            _removeLiquidity();

            // swap token1 to WETH
            _swapTokenToWETH(token1);
        }
    }

    function _swapToYELs(uint256 _percent) internal returns (uint256 newYelBalance){ 
        _swapLPtoWETH(_percent);

        // swap to YEL
        uint256 _oldYelBalance = getBalanceOfToken(YELtoken);
        _approveToken(YELtoken, yelLiquidityRouter);
        _approveToken(WETH, yelLiquidityRouter);
        _swapWETHToToken(yelLiquidityRouter, YELtoken);
        // return an amount of YEL that the user can claim
        newYelBalance = getBalanceOfToken(YELtoken) - _oldYelBalance;
        emit YELswapped(newYelBalance);
    }

    function _swapTokenToWETH(address _token) internal {
        address[] memory path = new address[](2);
        uint256[] memory amounts;
        // swap _token and token1 to WETH
        path[1] = WETH;
        if(_token != WETH) {
            path[0] = _token;
            uint256 _balance = getBalanceOfToken(path[0]);
            if(_balance > 0) {
                amounts = IRouter(router).getAmountsOut(_balance, path);
                if(amounts[1] > 100) {
                    _swapExactTokensForTokens(router, _balance, amounts[1], path);
                }
            }
        }
    }

    function _swapWETHToToken(address _router, address _token) internal {
        address[] memory path = new address[](2);
        path[0] = WETH;
        path[1] = _token;
        uint256 _balanceWETH = getBalanceOfToken(WETH);
        uint256[] memory amounts = IRouter(_router).getAmountsOut(_balanceWETH, path);
        if(amounts[1] > 100) {
            _swapExactTokensForTokens(_router, _balanceWETH, amounts[1], path);  
        }
    }

    function _swapExactTokensForTokens(
        address _router,
        uint256 _amount,
        uint256 _amount2,
        address[] memory _path) internal {
        
        IRouter(_router).swapExactTokensForTokens(
            _amount, // desired out rewards
            _amount2 - (_amount2*toleranceLevelPercent)/100, // min desired WFTM
            _path,
            address(this),
            block.timestamp+1 minutes
        );
    }

    function _swapWETHToTokens() internal {
        address[] memory path = new address[](2);
        path[0] = WETH;
        
        uint256 _balance = getBalanceOfToken(WETH) / 2;
        if (_balance > 0) {
            path[1] = token1;
            uint256 amount = _getAmountsOut(_balance, path);
            if(amount > 100) {
                _swapExactTokensForTokens(router, _balance, amount, path);
            }
        }
    }

    function _getTokenPrice() internal view returns (uint256) {
        address[] memory path = new address[](2);
        path[0] = token0;
        path[1] = token1;
        return 1e36 / (_getAmountsOut(100 * 1e18, path) / 100);
    }

    function _getTokenPrice1() internal view returns (uint256) {
        address[] memory path = new address[](2);
        path[0] = token1;
        path[1] = token0;
        return 1e36 / (_getAmountsOut(100 * 1e18, path) / 100);
    }

    function _getSimpleTCI(uint256 _amount) internal view returns (uint256 tCI) {
        uint256 d = 1e18;
        if(_amount > 0) {
            // t0V - token0 value
            // t1V - token1 value
            (uint256 t0V, uint256 t1V) = _getTokenValues(_amount);

            // calculates how many wrapped tokens for token1
            tCI = _getTokenPrice() * t1V / d + t0V;
        }

        // calculates total Capital from tokens that exist in the contract
        uint256 _balance = getBalanceOfToken(token1);
        if (_balance > 0) {
            tCI += _getTokenPrice() * _balance / d;
        }

        // calculates total Capital from Wrapped tokens that exist in the contract
        tCI += getBalanceOfToken(WETH);
    }

    function _getSimpleTC() internal view returns (uint256 TC) {
        address[] memory path = new address[](2);
        uint256 _totalLP = getAmountLPFromFarm();
        path[1] = WETH;

        if(_totalLP > 0) {
            (uint256 t0V, uint256 t1V) = _getTokenValues(_totalLP);

            // calculates how many nativeToken for tokens
            if(t1V != 0) {
                path[0] = token1;
                TC = _getAmountsOut(t1V, path) + t0V;
            }
        }

        // calculates total Capital from tokens that exist on the contract
        uint256 _balance = getBalanceOfToken(token1);
        if (_balance > 0) {
            path[0] = token1;
            TC += _getAmountsOut(_balance, path);
        }

        // calculates total Capital from WETH tokens that exist on the contract
        TC += getBalanceOfToken(WETH);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_vault","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[],"name":"AutoCompound","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Earn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"rewardsFeeInWETH","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountWETH","type":"uint256"}],"name":"TakeFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"WithdrawFromStrategy","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"percent","type":"uint256"}],"name":"YELswapped","type":"event"},{"inputs":[],"name":"USDT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"YELtoken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"autoCompound","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"}],"name":"claimYel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"depositAsMigrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"earn","outputs":[{"internalType":"uint256","name":"_balance","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"farm","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAmountLPFromFarm","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"getBalanceOfToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"}],"name":"getPendingYel","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRewardToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalCapital","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalCapitalInternal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hasPid","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_percent","type":"uint256"}],"name":"migrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pendingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingRewardsFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"pendingYel","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint256","name":"_percent","type":"uint256"}],"name":"requestWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token0","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token0Price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token0TWAP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token1Price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token1TWAP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toleranceLevelPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"updateTWAP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"withdrawUSDTFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"yelLiquidityRouter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052600580546001600160a01b03191673f491e7b69e4244ad4002bc14e878a34207e38c291790553480156200003757600080fd5b50604051620048b8380380620048b88339810160408190526200005a9162000889565b6001600160a01b038116620000b65760405162461bcd60e51b815260206004820152601d60248201527f5661756c742063616e206e6f74206265207a65726f206164647265737300000060448201526064015b60405180910390fd5b600480546001600160a01b0319166001600160a01b03831617815560408051630dfe168160e01b815290516000805160206200489883398151915292630dfe168192808201926020929091829003018186803b1580156200011657600080fd5b505afa1580156200012b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000151919062000889565b600260006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600080516020620048988339815191526001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b158015620001c057600080fd5b505afa158015620001d5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001fb919062000889565b600380546001600160a01b0319166001600160a01b03929092169190911790556200024a60008051602062004898833981519152732b2929e785374c651a81a63878ab22742656dcdd6200046f565b60055462000277907321be370d5312f44cb42ce377bc9b8a0cef1a4c83906001600160a01b03166200046f565b60025460055462000295916001600160a01b0390811691166200046f565b600354600554620002b3916001600160a01b0390811691166200046f565b600080516020620048988339815191526001600160a01b0316635909c0d56040518163ffffffff1660e01b815260040160206040518083038186803b158015620002fc57600080fd5b505afa15801562000311573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003379190620008b4565b600781905550600080516020620048988339815191526001600160a01b0316635a3d54936040518163ffffffff1660e01b815260040160206040518083038186803b1580156200038657600080fd5b505afa1580156200039b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003c19190620008b4565b600881905550600080516020620048988339815191526001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b1580156200041057600080fd5b505afa15801562000425573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200044b9190620008eb565b6009805463ffffffff191663ffffffff9290921691909117905550620009eb915050565b62000495816000846001600160a01b0316620004c060201b62001294179092919060201c565b620004bc81600019846001600160a01b0316620004c060201b62001294179092919060201c565b5050565b8015806200054e5750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e9060440160206040518083038186803b1580156200051157600080fd5b505afa15801562000526573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200054c9190620008b4565b155b620005c25760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401620000ad565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b179091526200061a9185916200061f16565b505050565b60006200067b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620006fd60201b620013da179092919060201c565b8051909150156200061a57808060200190518101906200069c919062000941565b6200061a5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401620000ad565b60606200070e848460008562000718565b90505b9392505050565b6060824710156200077b5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401620000ad565b843b620007cb5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401620000ad565b600080866001600160a01b03168587604051620007e9919062000998565b60006040518083038185875af1925050503d806000811462000828576040519150601f19603f3d011682016040523d82523d6000602084013e6200082d565b606091505b509092509050620008408282866200084b565b979650505050505050565b606083156200085c57508162000711565b8251156200086d5782518084602001fd5b8160405162461bcd60e51b8152600401620000ad9190620009b6565b6000602082840312156200089c57600080fd5b81516001600160a01b03811681146200071157600080fd5b600060208284031215620008c757600080fd5b5051919050565b80516001600160701b0381168114620008e657600080fd5b919050565b6000806000606084860312156200090157600080fd5b6200090c84620008ce565b92506200091c60208501620008ce565b9150604084015163ffffffff811681146200093657600080fd5b809150509250925092565b6000602082840312156200095457600080fd5b815180151581146200071157600080fd5b60005b838110156200098257818101518382015260200162000968565b8381111562000992576000848401525b50505050565b60008251620009ac81846020870162000965565b9190910192915050565b6020815260008251806020840152620009d781604085016020870162000965565b601f01601f19169190910160400192915050565b613e9d80620009fb6000396000f3fe6080604052600436106102295760003560e01c8063a644d68511610123578063d2802be5116100ab578063f10684541161006f578063f10684541461065d578063f887ea4014610672578063fbfa77cf14610692578063fc039165146106b2578063fe566b09146106c757600080fd5b8063d2802be5146105e0578063d389800f146105f5578063d79599601461060a578063d920a90114610632578063e941fa781461064857600080fd5b8063b42a8e55116100f2578063b42a8e551461053a578063c0d7865514610570578063c54e44eb14610590578063d0e30db0146105b8578063d21220a7146105c057600080fd5b8063a644d685146104bd578063ad5c4648146104e2578063ae4bbfc914610504578063b06dd06f1461051a57600080fd5b80636d79b7e6116101b157806397091078116101755780639709107814610435578063987b04f01461045d5780639ad160e31461047d5780639b1b4d49146104925780639bea590e146104a857600080fd5b80636d79b7e61461039e5780636ff1c9bc146103b3578063818df50e146103d3578063821c05761461040057806383786f8c1461041557600080fd5b8063397a1b28116101f8578063397a1b281461030f578063454b0608146103315780635fcbd28514610351578063643090bc1461037357806369940d791461038957600080fd5b806302ee8de9146102715780630dfe16811461029957806336e9332d146102d15780633750440d146102f957600080fd5b3661026c576004546001600160a01b031633146102615760405162461bcd60e51b815260040161025890613967565b60405180910390fd5b6102696106dd565b50005b600080fd5b34801561027d57600080fd5b5061028661076f565b6040519081526020015b60405180910390f35b3480156102a557600080fd5b506002546102b9906001600160a01b031681565b6040516001600160a01b039091168152602001610290565b3480156102dd57600080fd5b506102b9732b2929e785374c651a81a63878ab22742656dcdd81565b34801561030557600080fd5b50610286600c5481565b34801561031b57600080fd5b5061032f61032a3660046139b3565b610786565b005b34801561033d57600080fd5b5061032f61034c3660046139df565b61083d565b34801561035d57600080fd5b506102b9600080516020613df383398151915281565b34801561037f57600080fd5b5061028660005481565b34801561039557600080fd5b506102b96108af565b3480156103aa57600080fd5b5061032f610936565b3480156103bf57600080fd5b5061032f6103ce3660046139f8565b610ab1565b3480156103df57600080fd5b506102866103ee3660046139f8565b60066020526000908152604090205481565b34801561040c57600080fd5b5061032f610b94565b34801561042157600080fd5b506102866104303660046139f8565b610d87565b34801561044157600080fd5b506102b973d3b71117e6c1558c1553305b44988cd944e9730081565b34801561046957600080fd5b5061032f6104783660046139f8565b610efa565b34801561048957600080fd5b50610286610f6e565b34801561049e57600080fd5b50610286600d5481565b3480156104b457600080fd5b5061032f610fff565b3480156104c957600080fd5b506104d2600181565b6040519015158152602001610290565b3480156104ee57600080fd5b506102b9600080516020613e4883398151915281565b34801561051057600080fd5b50610286600b5481565b34801561052657600080fd5b5061032f6105353660046139f8565b611033565b34801561054657600080fd5b506102866105553660046139f8565b6001600160a01b031660009081526006602052604090205490565b34801561057c57600080fd5b5061032f61058b3660046139f8565b6110b6565b34801561059c57600080fd5b506102b973049d68029688eabf473097a2fc38ef61633a3c7a81565b6102866106dd565b3480156105cc57600080fd5b506003546102b9906001600160a01b031681565b3480156105ec57600080fd5b50610286600181565b34801561060157600080fd5b506102866111b1565b34801561061657600080fd5b506102b973f491e7b69e4244ad4002bc14e878a34207e38c2981565b34801561063e57600080fd5b50610286600a5481565b34801561065457600080fd5b50610286600f81565b34801561066957600080fd5b50610286600381565b34801561067e57600080fd5b506005546102b9906001600160a01b031681565b34801561069e57600080fd5b506004546102b9906001600160a01b031681565b3480156106be57600080fd5b5061028661128a565b3480156106d357600080fd5b5061028660015481565b6004546000906001600160a01b0316331461070a5760405162461bcd60e51b815260040161025890613967565b600254600554610726916001600160a01b0390811691166113f3565b600354600554610742916001600160a01b0390811691166113f3565b61074a61141e565b6107534761142e565b600061075d6111b1565b905061076881611464565b9150505b90565b600061078161077c610f6e565b611464565b905090565b6004546001600160a01b031633146107b05760405162461bcd60e51b815260040161025890613967565b60006107ba610f6e565b905080156108385760006107cd83611527565b90508015610803576001600160a01b038416600090815260066020526040812080548392906107fd908490613a2b565b90915550505b6040518181527f748ba37f09995b0c469a5bf09f6ea468913b453f110d54f69705396278aa5e999060200160405180910390a1505b505050565b6004546001600160a01b031633146108675760405162461bcd60e51b815260040161025890613967565b61087e6108798264e8d4a51000613a43565b61164c565b6004546108ac90600080516020613e48833981519152906001600160a01b03166108a782610d87565b6116f0565b50565b6000732b2929e785374c651a81a63878ab22742656dcdd6001600160a01b0316634b3df2006040518163ffffffff1660e01b815260040160206040518083038186803b1580156108fe57600080fd5b505afa158015610912573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107819190613a62565b6004546001600160a01b031633146109605760405162461bcd60e51b815260040161025890613967565b6000610979600080516020613e48833981519152610d87565b116109d05760405162461bcd60e51b815260206004820152602160248201527f4e6f7420656e6f756768205745544820746f206d616b65206d6967726174696f6044820152603760f91b6064820152608401610258565b6002546005546109ec916001600160a01b0390811691166113f3565b600354600554610a08916001600160a01b0390811691166113f3565b600254610a2c906001600160a01b0316600080516020613df38339815191526113f3565b600354610a50906001600160a01b0316600080516020613df38339815191526113f3565b610a7c600080516020613df3833981519152732b2929e785374c651a81a63878ab22742656dcdd6113f3565b600554610aa190600080516020613e48833981519152906001600160a01b03166113f3565b610aa9611778565b6108ac6111b1565b6004546001600160a01b03163314610adb5760405162461bcd60e51b815260040161025890613967565b6000610ae5610f6e565b90506000610af16108af565b9050610afc8261183c565b610b26600080516020613df3833981519152846108a7600080516020613df3833981519152610d87565b610b3481846108a784610d87565b610b6a73049d68029688eabf473097a2fc38ef61633a3c7a846108a773049d68029688eabf473097a2fc38ef61633a3c7a610d87565b610838600080516020613e48833981519152846108a7600080516020613e48833981519152610d87565b6040805160028082526060820183526000926020830190803683370190505090506000610bbf610f6e565b90506000610bcb6108af565b600554909150610be59082906001600160a01b03166113f3565b600554610c0a90600080516020613e48833981519152906001600160a01b03166113f3565b600554610c359073049d68029688eabf473097a2fc38ef61633a3c7a906001600160a01b03166113f3565b8115610d5957610c448261183c565b6000610c4f82610d87565b90508015610d46578184600081518110610c6b57610c6b613a95565b60200260200101906001600160a01b031690816001600160a01b031681525050600080516020613e4883398151915284600181518110610cad57610cad613a95565b60200260200101906001600160a01b031690816001600160a01b031681525050610ce460015482610cde9190613a2b565b856118ab565b92506064831115610d1e57600554600154610d14916001600160a01b031690610d0d9084613a2b565b858761195c565b6000600155610d3e565b610d2781611a10565b60016000828254610d389190613a2b565b90915550505b610d46611a29565b610d4e611778565b610d566111b1565b50505b6040517ff9ede3d1cf0bada9c84393b93ca853fddbd2aa2c948305b839424fb4c39419f790600090a1505050565b60006001600160a01b038216600080516020613e488339815191521415610e33576000546040516370a0823160e01b81523060048201526001600160a01b038416906370a08231906024015b60206040518083038186803b158015610deb57600080fd5b505afa158015610dff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e239190613aab565b610e2d9190613ac4565b92915050565b610e3b6108af565b6001600160a01b0316826001600160a01b03161415610e83576001546040516370a0823160e01b81523060048201526001600160a01b038416906370a0823190602401610dd3565b6040516370a0823160e01b81523060048201526001600160a01b038316906370a082319060240160206040518083038186803b158015610ec257600080fd5b505afa158015610ed6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2d9190613aab565b6004546001600160a01b03163314610f245760405162461bcd60e51b815260040161025890613967565b6000610f4373049d68029688eabf473097a2fc38ef61633a3c7a610d87565b90508015610f6a57610f6a73049d68029688eabf473097a2fc38ef61633a3c7a83836116f0565b5050565b6040516393f1a40b60e01b815260036004820152306024820152600090732b2929e785374c651a81a63878ab22742656dcdd906393f1a40b90604401604080518083038186803b158015610fc157600080fd5b505afa158015610fd5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ff99190613adb565b50919050565b6004546001600160a01b031633146110295760405162461bcd60e51b815260040161025890613967565b611031611ba3565b565b6004546001600160a01b0316331461105d5760405162461bcd60e51b815260040161025890613967565b6001600160a01b0381166000908152600660205260409020548015610f6a5761109b73d3b71117e6c1558c1553305b44988cd944e9730083836116f0565b506001600160a01b0316600090815260066020526040812055565b6004546001600160a01b031633146110e05760405162461bcd60e51b815260040161025890613967565b6001600160a01b0381166111425760405162461bcd60e51b815260206004820152602360248201527f54686520616464726573732063616e206e6f74206265207a65726f206164647260448201526265737360e81b6064820152608401610258565b600580546001600160a01b0319166001600160a01b03831690811790915561117990600080516020613e48833981519152906113f3565b600254600554611195916001600160a01b0390811691166113f3565b6003546005546108ac916001600160a01b0390811691166113f3565b60006111ca600080516020613df3833981519152610d87565b9050801561076c57604051631c57762b60e31b81526003600482015260248101829052732b2929e785374c651a81a63878ab22742656dcdd9063e2bbb15890604401600060405180830381600087803b15801561122657600080fd5b505af115801561123a573d6000803e3d6000fd5b505050507fe9d573778e0925491fffd3b5b980fb161b898fd42d8e2dcd7c128f9de611c1bc611276600080516020613df3833981519152610d87565b60405190815260200160405180910390a190565b6000610781611cd3565b80158061131d5750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e9060440160206040518083038186803b1580156112e357600080fd5b505afa1580156112f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061131b9190613aab565b155b6113885760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b6064820152608401610258565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052610838908490611e5b565b60606113e98484600085611f2d565b90505b9392505050565b6114086001600160a01b038316826000611294565b610f6a6001600160a01b03831682600019611294565b611426611ba3565b611031612055565b600354611444906001600160a01b031682612135565b6003546108ac906001600160a01b031661145f600284613b15565b612349565b6000670de0b6b3a764000082156114b35760008061148185612523565b9150915081838261149061269b565b61149a9190613a43565b6114a49190613b15565b6114ae9190613a2b565b935050505b6003546000906114cb906001600160a01b0316610d87565b905080156114fe5781816114dd61269b565b6114e79190613a43565b6114f19190613b15565b6114fb9084613a2b565b92505b611515600080516020613e48833981519152610d87565b61151f9084613a2b565b949350505050565b60006115328261164c565b600061155173d3b71117e6c1558c1553305b44988cd944e97300610d87565b905061158573d3b71117e6c1558c1553305b44988cd944e9730073f491e7b69e4244ad4002bc14e878a34207e38c296113f3565b6115b1600080516020613e4883398151915273f491e7b69e4244ad4002bc14e878a34207e38c296113f3565b6115e373f491e7b69e4244ad4002bc14e878a34207e38c2973d3b71117e6c1558c1553305b44988cd944e97300612769565b8061160173d3b71117e6c1558c1553305b44988cd944e97300610d87565b61160b9190613ac4565b91507f75f2417fcfccb57c521bdf0059341d12df0d56ad818a71946a7c22c0410daccc8260405161163e91815260200190565b60405180910390a150919050565b6000611656610f6e565b90508015610f6a57611681655af3107a40006116728385613a43565b61167c9190613b15565b61183c565b600061168b6108af565b6005549091506116a59082906001600160a01b03166113f3565b6005546116ca90600080516020613e48833981519152906001600160a01b03166113f3565b6116d3816128ea565b6116db612a8f565b600354610838906001600160a01b03166128ea565b60405163a9059cbb60e01b81526001600160a01b0383811660048301526024820183905284169063a9059cbb90604401602060405180830381600087803b15801561173a57600080fd5b505af115801561174e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117729190613b29565b50505050565b611780612b9e565b600254600090611798906001600160a01b0316610d87565b6003549091506000906117b3906001600160a01b0316610d87565b90506064821180156117c55750606481115b15610f6a57600080611819848460646117df600184613a43565b6117e99190613b15565b6117f39088613ac4565b6064611800600189613a43565b61180a9190613b15565b6118149088613ac4565b612ca1565b915091508160001415801561182d57508015155b15611772576117728282612ed1565b604051630441a3e760e41b81526003600482015260248101829052732b2929e785374c651a81a63878ab22742656dcdd9063441a3e7090604401600060405180830381600087803b15801561189057600080fd5b505af11580156118a4573d6000803e3d6000fd5b5050505050565b60055460405163d06ca61f60e01b815260009182916001600160a01b039091169063d06ca61f906118e29087908790600401613b8f565b60006040518083038186803b1580156118fa57600080fd5b505afa15801561190e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526119369190810190613ba8565b90508060018151811061194b5761194b613a95565b602002602001015191505092915050565b6001600160a01b0384166338ed1739846064611979600187613a43565b6119839190613b15565b61198d9086613ac4565b843061199a42603c613a2b565b6040518663ffffffff1660e01b81526004016119ba959493929190613c66565b600060405180830381600087803b1580156119d457600080fd5b505af11580156119e8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526118a49190810190613ba8565b60006064611a1f600f84613a43565b610e2d9190613b15565b604080516002808252606082018352600092602083019080368337019050509050600080516020613e4883398151915281600081518110611a6c57611a6c613a95565b60200260200101906001600160a01b031690816001600160a01b03168152505073049d68029688eabf473097a2fc38ef61633a3c7a81600181518110611ab457611ab4613a95565b60200260200101906001600160a01b031690816001600160a01b0316815250506000611af5611af0600080516020613e48833981519152610d87565b611a10565b90508015610f6a576000611b1660005483611b109190613a2b565b846118ab565b90506064811115611b8857600554600054611b46916001600160a01b031690611b3f9085613a2b565b838661195c565b6000805560408051838152602081018390527fa7c0e55d8b5d8665b86e9000d34040ddf14724d539c7cb9366ccb87e511419fb910160405180910390a1505050565b81600080828254611b999190613a2b565b9091555050505050565b6000806000611bbf600080516020613df3833981519152612fa8565b6009549295509093509150600090611bdd9063ffffffff1683613ca2565b9050670de0b6b3a7640000611c40611c396ec097ce7bc90715b34b9f100000000060405180602001604052808663ffffffff166007548b611c1e9190613ac4565b611c289190613b15565b6001600160e01b03169052906131cc565b5160701c90565b6001600160901b0316611c539190613b15565b600b81905550670de0b6b3a7640000611c98611c396ec097ce7bc90715b34b9f100000000060405180602001604052808663ffffffff166008548a611c1e9190613ac4565b6001600160901b0316611cab9190613b15565b600a55506007929092556008556009805463ffffffff191663ffffffff909216919091179055565b604080516002808252606082018352600092839291906020830190803683370190505090506000611d02610f6e565b9050600080516020613e4883398151915282600181518110611d2657611d26613a95565b6001600160a01b03909216602092830291909101909101528015611db957600080611d5083612523565b9150915080600014611db65760035484516001600160a01b03909116908590600090611d7e57611d7e613a95565b60200260200101906001600160a01b031690816001600160a01b03168152505081611da982866118ab565b611db39190613a2b565b94505b50505b600354600090611dd1906001600160a01b0316610d87565b90508015611e325760035483516001600160a01b03909116908490600090611dfb57611dfb613a95565b60200260200101906001600160a01b031690816001600160a01b031681525050611e2581846118ab565b611e2f9085613a2b565b93505b611e49600080516020613e48833981519152610d87565b611e539085613a2b565b935050505090565b6000611eb0826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166113da9092919063ffffffff16565b8051909150156108385780806020019051810190611ece9190613b29565b6108385760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610258565b606082471015611f8e5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610258565b843b611fdc5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610258565b600080866001600160a01b03168587604051611ff89190613cf3565b60006040518083038185875af1925050503d8060008114612035576040519150601f19603f3d011682016040523d82523d6000602084013e61203a565b606091505b509150915061204a82828661326a565b979650505050505050565b61205d61269b565b600c819055506000604051806060016040528060358152602001613e13603591399050600c54600a54106120db576005600a54600c54606461209f9190613a43565b6120a99190613b15565b6120b4906064613ac4565b111581906120d55760405162461bcd60e51b81526004016102589190613d0f565b50612127565b6005600c54600a5460646120ef9190613a43565b6120f99190613b15565b612104906064613ac4565b111581906121255760405162461bcd60e51b81526004016102589190613d0f565b505b61212f6132a3565b600d5550565b60408051600280825260608083018452926000929190602083019080368337019050509050600080516020613e488339815191528160008151811061217c5761217c613a95565b6001600160a01b0392831660209182029290920101528416600080516020613e48833981519152146117725783816001815181106121bc576121bc613a95565b6001600160a01b0392831660209182029290920101526005541663d06ca61f6121e6600286613b15565b836040518363ffffffff1660e01b8152600401612204929190613b8f565b60006040518083038186803b15801561221c57600080fd5b505afa158015612230573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526122589190810190613ba8565b915060008260018151811061226f5761226f613a95565b6020026020010151905060648111156118a4576005546001600160a01b0316637ff36ab561229e600287613b15565b60646122ab600186613a43565b6122b59190613b15565b6122bf9085613ac4565b85306122cc42603c613a2b565b6040518663ffffffff1660e01b81526004016122eb9493929190613d42565b6000604051808303818588803b15801561230457600080fd5b505af1158015612318573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f191682016040526123419190810190613ba8565b505050505050565b600061235483610d87565b905060008061236b848460646117df600184613a43565b915091508160001415801561237f57508015155b801561239057506123908282613319565b156118a4576123ae85600080516020613df3833981519152836116f0565b600080516020613e488339815191526001600160a01b031663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b1580156123f757600080fd5b505af115801561240b573d6000803e3d6000fd5b505060405163a9059cbb60e01b8152600080516020613df3833981519152600482015260248101869052600080516020613e48833981519152935063a9059cbb92506044019050602060405180830381600087803b15801561246c57600080fd5b505af1158015612480573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124a49190613b29565b506040516335313c2160e11b8152306004820152600080516020613df383398151915290636a62784290602401602060405180830381600087803b1580156124eb57600080fd5b505af11580156124ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123419190613aab565b600080600080600080516020613df38339815191526001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561257057600080fd5b505afa158015612584573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125a89190613d8e565b506001600160701b031691506001600160701b031691506000600080516020613df38339815191526001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561260857600080fd5b505afa15801561261c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126409190613aab565b61264f8764e8d4a51000613a43565b6126599190613b15565b905064e8d4a5100061266b8483613a43565b6126759190613b15565b945064e8d4a510006126878383613a43565b6126919190613b15565b9350505050915091565b60408051600280825260608201835260009283929190602083019080368337505060025482519293506001600160a01b0316918391506000906126e0576126e0613a95565b6001600160a01b03928316602091820292909201015260035482519116908290600190811061271157612711613a95565b60200260200101906001600160a01b031690816001600160a01b031681525050606461274668056bc75e2d63100000836118ab565b6127509190613b15565b610768906ec097ce7bc90715b34b9f1000000000613b15565b604080516002808252606082018352600092602083019080368337019050509050600080516020613e48833981519152816000815181106127ac576127ac613a95565b60200260200101906001600160a01b031690816001600160a01b03168152505081816001815181106127e0576127e0613a95565b60200260200101906001600160a01b031690816001600160a01b0316815250506000612819600080516020613e48833981519152610d87565b90506000846001600160a01b031663d06ca61f83856040518363ffffffff1660e01b815260040161284b929190613b8f565b60006040518083038186803b15801561286357600080fd5b505afa158015612877573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261289f9190810190613ba8565b90506064816001815181106128b6576128b6613a95565b602002602001015111156118a4576118a48583836001815181106128dc576128dc613a95565b60200260200101518661195c565b6040805160028082526060820183526000926020830190803683370190505090506060600080516020613e488339815191528260018151811061292f5761292f613a95565b6001600160a01b0392831660209182029290920101528316600080516020613e488339815191521461083857828260008151811061296f5761296f613a95565b60200260200101906001600160a01b031690816001600160a01b03168152505060006129b4836000815181106129a7576129a7613a95565b6020026020010151610d87565b905080156117725760055460405163d06ca61f60e01b81526001600160a01b039091169063d06ca61f906129ee9084908790600401613b8f565b60006040518083038186803b158015612a0657600080fd5b505afa158015612a1a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612a429190810190613ba8565b9150606482600181518110612a5957612a59613a95565b60200260200101511115611772576005548251611772916001600160a01b0316908390859060019081106128dc576128dc613a95565b600554612ab490600080516020613df3833981519152906001600160a01b03166113f3565b6005546002546003546001600160a01b039283169263baa2abde9281169116612aea600080516020613df3833981519152610d87565b60008030612af942603c613a2b565b60405160e089901b6001600160e01b03191681526001600160a01b039788166004820152958716602487015260448601949094526064850192909252608484015290921660a482015260c481019190915260e4016040805180830381600087803b158015612b6657600080fd5b505af1158015612b7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f6a9190613adb565b604080516002808252606082018352600092602083019080368337019050509050600080516020613e4883398151915281600081518110612be157612be1613a95565b60200260200101906001600160a01b031690816001600160a01b03168152505060006002612c1c600080516020613e48833981519152610d87565b612c269190613b15565b90508015610f6a5760035482516001600160a01b039091169083906001908110612c5257612c52613a95565b60200260200101906001600160a01b031690816001600160a01b0316815250506000612c7e82846118ab565b9050606481111561083857600554610838906001600160a01b031683838661195c565b600080600080600080516020613df38339815191526001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015612cee57600080fd5b505afa158015612d02573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d269190613d8e565b506001600160701b031691506001600160701b03169150816000148015612d4b575080155b15612d5b57879350869250612ec6565b600554604051632b58577b60e21b8152600481018a905260248101849052604481018390526000916001600160a01b03169063ad615dec9060640160206040518083038186803b158015612dae57600080fd5b505afa158015612dc2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612de69190613aab565b9050878111612e0d57858110612e0157889450925082612ec4565b60009450849350612ec4565b600554604051632b58577b60e21b8152600481018a905260248101849052604481018590526000916001600160a01b03169063ad615dec9060640160206040518083038186803b158015612e6057600080fd5b505afa158015612e74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e989190613aab565b9050898111158015612eaa5750878110155b15612eba57945087935084612ec2565b600095508594505b505b505b505094509492505050565b612edb8282613319565b15610f6a57600254612f05906001600160a01b0316600080516020613df3833981519152846116f0565b600354612f2a906001600160a01b0316600080516020613df3833981519152836116f0565b6040516335313c2160e11b8152306004820152600080516020613df383398151915290636a62784290602401602060405180830381600087803b158015612f7057600080fd5b505af1158015612f84573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108389190613aab565b6000806000612fb5613526565b9050836001600160a01b0316635909c0d56040518163ffffffff1660e01b815260040160206040518083038186803b158015612ff057600080fd5b505afa158015613004573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130289190613aab565b9250836001600160a01b0316635a3d54936040518163ffffffff1660e01b815260040160206040518083038186803b15801561306357600080fd5b505afa158015613077573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061309b9190613aab565b91506000806000866001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b1580156130db57600080fd5b505afa1580156130ef573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131139190613d8e565b9250925092508363ffffffff168163ffffffff16146131c25760006131388286613ca2565b90508063ffffffff1661315d846001600160701b0316866001600160701b0316613537565b5161317191906001600160e01b0316613a43565b61317b9088613a2b565b96508063ffffffff166131a0856001600160701b0316856001600160701b0316613537565b516131b491906001600160e01b0316613a43565b6131be9087613a2b565b9550505b5050509193909250565b6040805160208101909152600081526000821580613209575083516001600160e01b0316836131fb8183613a43565b92506132079083613b15565b145b6132555760405162461bcd60e51b815260206004820152601960248201527f4669786564506f696e743a3a6d756c3a206f766572666c6f77000000000000006044820152606401610258565b60408051602081019091529081529392505050565b606083156132795750816113ec565b8251156132895782518084602001fd5b8160405162461bcd60e51b81526004016102589190613d0f565b60408051600280825260608201835260009283929190602083019080368337505060035482519293506001600160a01b0316918391506000906132e8576132e8613a95565b6001600160a01b03928316602091820292909201015260025482519116908290600190811061271157612711613a95565b6000806000600080516020613df38339815191526001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561336557600080fd5b505afa158015613379573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061339d9190613d8e565b50915091506000600080516020613df38339815191526001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156133eb57600080fd5b505afa1580156133ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134239190613aab565b9050600080600080516020613df38339815191526001600160a01b031663ba9a7a566040518163ffffffff1660e01b815260040160206040518083038186803b15801561346f57600080fd5b505afa158015613483573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134a79190613aab565b9050826134d257806134c16134bc898b613a43565b613667565b6134cb9190613ac4565b9150613519565b6135166001600160701b0386166134e9858b613a43565b6134f39190613b15565b6001600160701b038616613507868b613a43565b6135119190613b15565b6136d1565b91505b5015159695505050505050565b600061078164010000000042613dde565b604080516020810190915260008152600082116135a55760405162461bcd60e51b815260206004820152602660248201527f4669786564506f696e743a3a6672616374696f6e3a206469766973696f6e206260448201526579207a65726f60d01b6064820152608401610258565b826135bf5750604080516020810190915260008152610e2d565b6001600160901b0383116136565760006135dd83607086901b613b15565b90506001600160e01b038111156136365760405162461bcd60e51b815260206004820152601e60248201527f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f7700006044820152606401610258565b6040518060200160405280826001600160e01b0316815250915050610e2d565b60006135dd84600160701b856136e7565b600060038211156136c25750806000613681600283613b15565b61368c906001613a2b565b90505b81811015610ff9579050806002816136a78186613b15565b6136b19190613a2b565b6136bb9190613b15565b905061368f565b81156136cc575060015b919050565b60008183106136e057816113ec565b5090919050565b60008060006136f686866137a4565b915091506000848061370a5761370a613aff565b86880990508281111561372557613722600183613ac4565b91505b61372f8184613ac4565b92508161374a576137408584613b15565b93505050506113ec565b8482106137995760405162461bcd60e51b815260206004820152601a60248201527f46756c6c4d6174683a2046554c4c4449565f4f564552464c4f570000000000006044820152606401610258565b61204a8383876137e6565b6000808060001984860990506137ba8486613a43565b92506137c68382613ac4565b9150828110156137de576137db600183613ac4565b91505b509250929050565b6000806137f583196001613a2b565b831690506138038184613b15565b925061380f8186613b15565b94508061381e81196001613a2b565b6138289190613b15565b613833906001613a2b565b61383d9085613a43565b6138479086613a2b565b945060016138558185613a43565b613860906002613ac4565b61386a9082613a43565b90506138768185613a43565b613881906002613ac4565b61388b9082613a43565b90506138978185613a43565b6138a2906002613ac4565b6138ac9082613a43565b90506138b88185613a43565b6138c3906002613ac4565b6138cd9082613a43565b90506138d98185613a43565b6138e4906002613ac4565b6138ee9082613a43565b90506138fa8185613a43565b613905906002613ac4565b61390f9082613a43565b905061391b8185613a43565b613926906002613ac4565b6139309082613a43565b905061393c8185613a43565b613947906002613ac4565b6139519082613a43565b905061395d8187613a43565b9695505050505050565b60208082526017908201527f5468652073656e646572206973206e6f74207661756c74000000000000000000604082015260600190565b6001600160a01b03811681146108ac57600080fd5b600080604083850312156139c657600080fd5b82356139d18161399e565b946020939093013593505050565b6000602082840312156139f157600080fd5b5035919050565b600060208284031215613a0a57600080fd5b81356113ec8161399e565b634e487b7160e01b600052601160045260246000fd5b60008219821115613a3e57613a3e613a15565b500190565b6000816000190483118215151615613a5d57613a5d613a15565b500290565b600060208284031215613a7457600080fd5b81516113ec8161399e565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b600060208284031215613abd57600080fd5b5051919050565b600082821015613ad657613ad6613a15565b500390565b60008060408385031215613aee57600080fd5b505080516020909101519092909150565b634e487b7160e01b600052601260045260246000fd5b600082613b2457613b24613aff565b500490565b600060208284031215613b3b57600080fd5b815180151581146113ec57600080fd5b600081518084526020808501945080840160005b83811015613b845781516001600160a01b031687529582019590820190600101613b5f565b509495945050505050565b8281526040602082015260006113e96040830184613b4b565b60006020808385031215613bbb57600080fd5b825167ffffffffffffffff80821115613bd357600080fd5b818501915085601f830112613be757600080fd5b815181811115613bf957613bf9613a7f565b8060051b604051601f19603f83011681018181108582111715613c1e57613c1e613a7f565b604052918252848201925083810185019188831115613c3c57600080fd5b938501935b82851015613c5a57845184529385019392850192613c41565b98975050505050505050565b85815284602082015260a060408201526000613c8560a0830186613b4b565b6001600160a01b0394909416606083015250608001529392505050565b600063ffffffff83811690831681811015613cbf57613cbf613a15565b039392505050565b60005b83811015613ce2578181015183820152602001613cca565b838111156117725750506000910152565b60008251613d05818460208701613cc7565b9190910192915050565b6020815260008251806020840152613d2e816040850160208701613cc7565b601f01601f19169190910160400192915050565b848152608060208201526000613d5b6080830186613b4b565b6001600160a01b03949094166040830152506060015292915050565b80516001600160701b03811681146136cc57600080fd5b600080600060608486031215613da357600080fd5b613dac84613d77565b9250613dba60208501613d77565b9150604084015163ffffffff81168114613dd357600080fd5b809150509250925092565b600082613ded57613ded613aff565b50069056fe000000000000000000000000e120ffbda0d14f3bb6d6053e90e63c572a66a4285072696365732068617665206d6f7265207468616e20352070657263656e7420646966666572656e636520666f7220746f6b656e3100000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c83a2646970667358221220feab8d392617cce40194904d439604d51569d81869a195422e24067e813c7cee64736f6c63430008090033000000000000000000000000e120ffbda0d14f3bb6d6053e90e63c572a66a428000000000000000000000000a5ade4eac20a1f1f90a51e5eaa2852d8ea098c89

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

000000000000000000000000a5ade4eac20a1f1f90a51e5eaa2852d8ea098c89

-----Decoded View---------------
Arg [0] : _vault (address): 0xa5ade4eac20a1f1f90a51e5eaa2852d8ea098c89

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000a5ade4eac20a1f1f90a51e5eaa2852d8ea098c89


Deployed ByteCode Sourcemap

24606:22213:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26609:5;;-1:-1:-1;;;;;26609:5:0;26595:10;:19;26587:55;;;;-1:-1:-1;;;26587:55:0;;;;;;;:::i;:::-;;;;;;;;;27419:9:::1;:7;:9::i;:::-;;24606:22213:::0;;;;;31551:127;;;;;;;;;;;;;:::i;:::-;;;512:25:1;;;500:2;485:18;31551:127:0;;;;;;;;25501:21;;;;;;;;;;-1:-1:-1;25501:21:0;;;;-1:-1:-1;;;;;25501:21:0;;;;;;-1:-1:-1;;;;;712:32:1;;;694:51;;682:2;667:18;25501:21:0;548:203:1;25894:73:0;;;;;;;;;;;;25925:42;25894:73;;26270:26;;;;;;;;;;;;;;;;30169:387;;;;;;;;;;-1:-1:-1;30169:387:0;;;;;:::i;:::-;;:::i;:::-;;30564:163;;;;;;;;;;-1:-1:-1;30564:163:0;;;;;:::i;:::-;;:::i;25811:76::-;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;25811:76:0;;25040:25;;;;;;;;;;;;;;;;27511:98;;;;;;;;;;;;;:::i;31111:432::-;;;;;;;;;;;;;:::i;29703:458::-;;;;;;;;;;-1:-1:-1;29703:458:0;;;;;:::i;:::-;;:::i;26034:45::-;;;;;;;;;;-1:-1:-1;26034:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;28314:1114;;;;;;;;;;;;;:::i;31917:387::-;;;;;;;;;;-1:-1:-1;31917:387:0;;;;;:::i;:::-;;:::i;25335:77::-;;;;;;;;;;;;25370:42;25335:77;;33306:206;;;;;;;;;;-1:-1:-1;33306:206:0;;;;;:::i;:::-;;:::i;27731:139::-;;;;;;;;;;;;;:::i;26303:26::-;;;;;;;;;;;;;;;;38172:71;;;;;;;;;;;;;:::i;25697:34::-;;;;;;;;;;;;25727:4;25697:34;;;;;1814:14:1;;1807:22;1789:41;;1777:2;1762:18;25697:34:0;1649:187:1;25419:73:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;25419:73:0;;26238:25;;;;;;;;;;;;;;;;29442:253;;;;;;;;;;-1:-1:-1;29442:253:0;;;;;:::i;:::-;;:::i;31791:118::-;;;;;;;;;;-1:-1:-1;31791:118:0;;;;;:::i;:::-;-1:-1:-1;;;;;31880:21:0;31853:7;31880:21;;;:10;:21;;;;;;;31791:118;33006:292;;;;;;;;;;-1:-1:-1;33006:292:0;;;;;:::i;:::-;;:::i;25161:73::-;;;;;;;;;;;;25192:42;25161:73;;30735:368;;;:::i;25537:21::-;;;;;;;;;;-1:-1:-1;25537:21:0;;;;-1:-1:-1;;;;;25537:21:0;;;24867:49;;;;;;;;;;;;24915:1;24867:49;;27882:244;;;;;;;;;;;;;:::i;25241:87::-;;;;;;;;;;;;25286:42;25241:87;;26206:25;;;;;;;;;;;;;;;;24813:40;;;;;;;;;;;;24851:2;24813:40;;25659:31;;;;;;;;;;;;25689:1;25659:31;;25738:66;;;;;;;;;;-1:-1:-1;25738:66:0;;;;-1:-1:-1;;;;;25738:66:0;;;25572:20;;;;;;;;;;-1:-1:-1;25572:20:0;;;;-1:-1:-1;;;;;25572:20:0;;;31686:97;;;;;;;;;;;;;:::i;25092:32::-;;;;;;;;;;;;;;;;30735:368;26609:5;;30788:7;;-1:-1:-1;;;;;26609:5:0;26595:10;:19;26587:55;;;;-1:-1:-1;;;26587:55:0;;;;;;;:::i;:::-;30822:6:::1;::::0;30830::::1;::::0;30808:29:::1;::::0;-1:-1:-1;;;;;30822:6:0;;::::1;::::0;30830::::1;30808:13;:29::i;:::-;30862:6;::::0;30870::::1;::::0;30848:29:::1;::::0;-1:-1:-1;;;;;30862:6:0;;::::1;::::0;30870::::1;30848:13;:29::i;:::-;30888:22;:20;:22::i;:::-;30977:39;30994:21;30977:16;:39::i;:::-;31027:17;31047:6;:4;:6::i;:::-;31027:26;;31071:24;31085:9;31071:13;:24::i;:::-;31064:31;;;26653:1;30735:368:::0;:::o;31551:127::-;31607:7;31634:36;31648:21;:19;:21::i;:::-;31634:13;:36::i;:::-;31627:43;;31551:127;:::o;30169:387::-;26609:5;;-1:-1:-1;;;;;26609:5:0;26595:10;:19;26587:55;;;;-1:-1:-1;;;26587:55:0;;;;;;;:::i;:::-;30259:16:::1;30278:21;:19;:21::i;:::-;30259:40:::0;-1:-1:-1;30314:12:0;;30310:239:::1;;30343:17;30363:21;30375:8;30363:11;:21::i;:::-;30343:41:::0;-1:-1:-1;30402:13:0;;30399:87:::1;;-1:-1:-1::0;;;;;30436:21:0;::::1;;::::0;;;:10:::1;:21;::::0;;;;:34;;30461:9;;30436:21;:34:::1;::::0;30461:9;;30436:34:::1;:::i;:::-;::::0;;;-1:-1:-1;;30399:87:0::1;30506:31;::::0;512:25:1;;;30506:31:0::1;::::0;500:2:1;485:18;30506:31:0::1;;;;;;;30328:221;30310:239;30248:308;30169:387:::0;;:::o;30564:163::-;26609:5;;-1:-1:-1;;;;;26609:5:0;26595:10;:19;26587:55;;;;-1:-1:-1;;;26587:55:0;;;;;;;:::i;:::-;30627:34:::1;30641:19;:8:::0;30652::::1;30641:19;:::i;:::-;30627:13;:34::i;:::-;30688:5;::::0;30672:47:::1;::::0;-1:-1:-1;;;;;;;;;;;25450:42:0;-1:-1:-1;;;;;30688:5:0::1;30695:23;25450:42:::0;30695:17:::1;:23::i;:::-;30672:9;:47::i;:::-;30564:163:::0;:::o;27511:98::-;27558:7;25925:42;-1:-1:-1;;;;;27584:15:0;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;31111:432::-;26609:5;;-1:-1:-1;;;;;26609:5:0;26595:10;:19;26587:55;;;;-1:-1:-1;;;26587:55:0;;;;;;;:::i;:::-;31201:1:::1;31175:23;-1:-1:-1::0;;;;;;;;;;;31175:17:0::1;:23::i;:::-;:27;31167:73;;;::::0;-1:-1:-1;;;31167:73:0;;2737:2:1;31167:73:0::1;::::0;::::1;2719:21:1::0;2776:2;2756:18;;;2749:30;2815:34;2795:18;;;2788:62;-1:-1:-1;;;2866:18:1;;;2859:31;2907:19;;31167:73:0::1;2535:397:1::0;31167:73:0::1;31265:6;::::0;31273::::1;::::0;31251:29:::1;::::0;-1:-1:-1;;;;;31265:6:0;;::::1;::::0;31273::::1;31251:13;:29::i;:::-;31305:6;::::0;31313::::1;::::0;31291:29:::1;::::0;-1:-1:-1;;;;;31305:6:0;;::::1;::::0;31313::::1;31291:13;:29::i;:::-;31345:6;::::0;31331:30:::1;::::0;-1:-1:-1;;;;;31345:6:0::1;-1:-1:-1::0;;;;;;;;;;;31331:13:0::1;:30::i;:::-;31386:6;::::0;31372:30:::1;::::0;-1:-1:-1;;;;;31386:6:0::1;-1:-1:-1::0;;;;;;;;;;;31372:13:0::1;:30::i;:::-;31413:28;-1:-1:-1::0;;;;;;;;;;;25925:42:0::1;31413:13;:28::i;:::-;31472:6;::::0;31452:27:::1;::::0;-1:-1:-1;;;;;;;;;;;25450:42:0;-1:-1:-1;;;;;31472:6:0::1;31452:13;:27::i;:::-;31490:28;:26;:28::i;:::-;31529:6;:4;:6::i;29703:458::-:0;26609:5;;-1:-1:-1;;;;;26609:5:0;26595:10;:19;26587:55;;;;-1:-1:-1;;;26587:55:0;;;;;;;:::i;:::-;29777:14:::1;29794:21;:19;:21::i;:::-;29777:38;;29826:14;29843:16;:14;:16::i;:::-;29826:33;;29870:25;29888:6;29870:17;:25::i;:::-;29906:57;-1:-1:-1::0;;;;;;;;;;;29925:9:0::1;29936:26;-1:-1:-1::0;;;;;;;;;;;29936:17:0::1;:26::i;29906:57::-;29974:55;29984:6;29992:9;30003:25;30021:6;30003:17;:25::i;29974:55::-;30040:51;25192:42;30056:9;30067:23;25192:42;30067:17;:23::i;30040:51::-;30102;-1:-1:-1::0;;;;;;;;;;;30118:9:0::1;30129:23;-1:-1:-1::0;;;;;;;;;;;30129:17:0::1;:23::i;28314:1114::-:0;28382:16;;;28396:1;28382:16;;;;;;;;28358:21;;28382:16;;;;;;;;;;-1:-1:-1;28382:16:0;28358:40;;28409:14;28426:21;:19;:21::i;:::-;28409:38;;28458:19;28480:16;:14;:16::i;:::-;28536:6;;28458:38;;-1:-1:-1;28509:34:0;;28458:38;;-1:-1:-1;;;;;28536:6:0;28509:13;:34::i;:::-;28574:6;;28554:27;;-1:-1:-1;;;;;;;;;;;25450:42:0;-1:-1:-1;;;;;28574:6:0;28554:13;:27::i;:::-;28612:6;;28592:27;;25192:42;;-1:-1:-1;;;;;28612:6:0;28592:13;:27::i;:::-;28636:10;;28632:757;;28694:25;28712:6;28694:17;:25::i;:::-;28736:16;28755:30;28773:11;28755:17;:30::i;:::-;28736:49;-1:-1:-1;28803:12:0;;28800:514;;28845:11;28835:4;28840:1;28835:7;;;;;;;;:::i;:::-;;;;;;:21;-1:-1:-1;;;;;28835:21:0;;;-1:-1:-1;;;;;28835:21:0;;;;;-1:-1:-1;;;;;;;;;;;28875:4:0;28880:1;28875:7;;;;;;;;:::i;:::-;;;;;;:14;-1:-1:-1;;;;;28875:14:0;;;-1:-1:-1;;;;;28875:14:0;;;;;28926:48;28950:17;;28941:8;:26;;;;:::i;:::-;28969:4;28926:14;:48::i;:::-;28917:57;;29005:3;28996:6;:12;28993:277;;;29059:6;;;29076:17;29033:75;;-1:-1:-1;;;;;29059:6:0;;29067:26;;:8;:26;:::i;:::-;29095:6;29103:4;29033:25;:75::i;:::-;29151:1;29131:17;:21;28993:277;;;29221:29;29241:8;29221:19;:29::i;:::-;29200:17;;:50;;;;;;;:::i;:::-;;;;-1:-1:-1;;28993:277:0;29288:10;:8;:10::i;:::-;29328:28;:26;:28::i;:::-;29371:6;:4;:6::i;:::-;;28648:741;28632:757;29406:14;;;;;;;28347:1081;;;28314:1114::o;31917:387::-;31981:7;-1:-1:-1;;;;;32004:14:0;;-1:-1:-1;;;;;;;;;;;32004:14:0;32001:105;;;32084:10;;32042:39;;-1:-1:-1;;;32042:39:0;;32075:4;32042:39;;;694:51:1;-1:-1:-1;;;;;32042:24:0;;;;;667:18:1;;32042:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:52;;;;:::i;:::-;32035:59;31917:387;-1:-1:-1;;31917:387:0:o;32001:105::-;32129:16;:14;:16::i;:::-;-1:-1:-1;;;;;32119:26:0;:6;-1:-1:-1;;;;;32119:26:0;;32116:124;;;32211:17;;32169:39;;-1:-1:-1;;;32169:39:0;;32202:4;32169:39;;;694:51:1;-1:-1:-1;;;;;32169:24:0;;;;;667:18:1;;32169:39:0;548:203:1;32116:124:0;32257:39;;-1:-1:-1;;;32257:39:0;;32290:4;32257:39;;;694:51:1;-1:-1:-1;;;;;32257:24:0;;;;;667:18:1;;32257:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;33306:206::-;26609:5;;-1:-1:-1;;;;;26609:5:0;26595:10;:19;26587:55;;;;-1:-1:-1;;;26587:55:0;;;;;;;:::i;:::-;33375:16:::1;33394:23;25192:42;33394:17;:23::i;:::-;33375:42:::0;-1:-1:-1;33431:12:0;;33428:77:::1;;33460:33;25192:42;33476:6;33484:8;33460:9;:33::i;:::-;33364:148;33306:206:::0;:::o;27731:139::-;27822:40;;-1:-1:-1;;;27822:40:0;;25689:1;27822:40;;;3694:25:1;27856:4:0;3735:18:1;;;3728:60;27783:14:0;;25925:42;;27822:20;;3667:18:1;;27822:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;27810:52:0;27731:139;-1:-1:-1;27731:139:0:o;38172:71::-;26609:5;;-1:-1:-1;;;;;26609:5:0;26595:10;:19;26587:55;;;;-1:-1:-1;;;26587:55:0;;;;;;;:::i;:::-;38222:13:::1;:11;:13::i;:::-;38172:71::o:0;29442:253::-;26609:5;;-1:-1:-1;;;;;26609:5:0;26595:10;:19;26587:55;;;;-1:-1:-1;;;26587:55:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;31880:21:0;;29507:17:::1;31880:21:::0;;;:10;:21;;;;;;29565:13;;29562:126:::1;;29595:41;25370:42;29615:9;29626;29595;:41::i;:::-;-1:-1:-1::0;;;;;;29651:21:0::1;29675:1;29651:21:::0;;;:10:::1;:21;::::0;;;;:25;29442:253::o;33006:292::-;26609:5;;-1:-1:-1;;;;;26609:5:0;26595:10;:19;26587:55;;;;-1:-1:-1;;;26587:55:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;33079:22:0;::::1;33071:70;;;::::0;-1:-1:-1;;;33071:70:0;;4251:2:1;33071:70:0::1;::::0;::::1;4233:21:1::0;4290:2;4270:18;;;4263:30;4329:34;4309:18;;;4302:62;-1:-1:-1;;;4380:18:1;;;4373:33;4423:19;;33071:70:0::1;4049:399:1::0;33071:70:0::1;33152:6;:17:::0;;-1:-1:-1;;;;;;33152:17:0::1;-1:-1:-1::0;;;;;33152:17:0;::::1;::::0;;::::1;::::0;;;33181:27:::1;::::0;-1:-1:-1;;;;;;;;;;;25450:42:0;33181:13:::1;:27::i;:::-;33234:6;::::0;33242::::1;::::0;33220:29:::1;::::0;-1:-1:-1;;;;;33234:6:0;;::::1;::::0;33242::::1;33220:13;:29::i;:::-;33275:6;::::0;33283::::1;::::0;33261:29:::1;::::0;-1:-1:-1;;;;;33275:6:0;;::::1;::::0;33283::::1;33261:13;:29::i;27882:244::-:0;27913:16;27952:26;-1:-1:-1;;;;;;;;;;;27952:17:0;:26::i;:::-;27941:37;-1:-1:-1;27992:12:0;;27989:130;;28021:34;;-1:-1:-1;;;28021:34:0;;25689:1;28021:34;;;4627:25:1;4668:18;;;4661:34;;;25925:42:0;;28021:19;;4600:18:1;;28021:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28075:32;28080:26;-1:-1:-1;;;;;;;;;;;28080:17:0;:26::i;:::-;28075:32;;512:25:1;;;500:2;485:18;28075:32:0;;;;;;;27882:244;:::o;31686:97::-;31734:7;31761:14;:12;:14::i;15026:616::-;15390:10;;;15389:62;;-1:-1:-1;15406:39:0;;-1:-1:-1;;;15406:39:0;;15430:4;15406:39;;;4918:34:1;-1:-1:-1;;;;;4988:15:1;;;4968:18;;;4961:43;15406:15:0;;;;;4853:18:1;;15406:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;15389:62;15367:166;;;;-1:-1:-1;;;15367:166:0;;5217:2:1;15367:166:0;;;5199:21:1;5256:2;5236:18;;;5229:30;5295:34;5275:18;;;5268:62;-1:-1:-1;;;5346:18:1;;;5339:52;5408:19;;15367:166:0;5015:418:1;15367:166:0;15571:62;;;-1:-1:-1;;;;;5630:32:1;;15571:62:0;;;5612:51:1;5679:18;;;;5672:34;;;15571:62:0;;;;;;;;;;5585:18:1;;;;15571:62:0;;;;;;;;-1:-1:-1;;;;;15571:62:0;-1:-1:-1;;;15571:62:0;;;15544:90;;15564:5;;15544:19;:90::i;9235:229::-;9372:12;9404:52;9426:6;9434:4;9440:1;9443:12;9404:21;:52::i;:::-;9397:59;;9235:229;;;;;;:::o;34059:178::-;34132:35;-1:-1:-1;;;;;34132:26:0;;34159:4;34165:1;34132:26;:35::i;:::-;34178:51;-1:-1:-1;;;;;34178:26:0;;34205:4;-1:-1:-1;;34178:26:0;:51::i;38251:97::-;38303:13;:11;:13::i;:::-;38327;:11;:13::i;40595:168::-;40684:6;;40661:42;;-1:-1:-1;;;;;40684:6:0;40692:10;40661:22;:42::i;:::-;40732:6;;40714:41;;-1:-1:-1;;;;;40732:6:0;40740:14;40753:1;40740:10;:14;:::i;:::-;40714:17;:41::i;45175:757::-;45238:11;45274:4;45292:11;;45289:283;;45391:11;45404;45419:24;45435:7;45419:15;:24::i;:::-;45390:53;;;;45557:3;45553:1;45547:3;45528:16;:14;:16::i;:::-;:22;;;;:::i;:::-;:26;;;;:::i;:::-;:32;;;;:::i;:::-;45522:38;;45305:267;;45289:283;45697:6;;45660:16;;45679:25;;-1:-1:-1;;;;;45697:6:0;45679:17;:25::i;:::-;45660:44;-1:-1:-1;45719:12:0;;45715:83;;45785:1;45774:8;45755:16;:14;:16::i;:::-;:27;;;;:::i;:::-;:31;;;;:::i;:::-;45748:38;;;;:::i;:::-;;;45715:83;45901:23;-1:-1:-1;;;;;;;;;;;45901:17:0;:23::i;:::-;45894:30;;;;:::i;:::-;;45175:757;-1:-1:-1;;;;45175:757:0:o;42145:544::-;42202:21;42236:23;42250:8;42236:13;:23::i;:::-;42296:22;42321:27;25370:42;42321:17;:27::i;:::-;42296:52;;42359:43;25370:42;25286;42359:13;:43::i;:::-;42413:39;-1:-1:-1;;;;;;;;;;;25286:42:0;42413:13;:39::i;:::-;42463:46;25286:42;25370;42463:16;:46::i;:::-;42626:14;42596:27;25370:42;42596:17;:27::i;:::-;:44;;;;:::i;:::-;42580:60;;42656:25;42667:13;42656:25;;;;512::1;;500:2;485:18;;366:177;42656:25:0;;;;;;;;42224:465;42145:544;;;:::o;41529:608::-;41590:16;41609:21;:19;:21::i;:::-;41590:40;-1:-1:-1;41645:12:0;;41641:489;;41674:59;41717:14;41693:19;41704:8;41693;:19;:::i;:::-;41692:40;;;;:::i;:::-;41674:17;:59::i;:::-;41748:19;41770:16;:14;:16::i;:::-;41830:6;;41748:38;;-1:-1:-1;41803:34:0;;41748:38;;-1:-1:-1;;;;;41830:6:0;41803:13;:34::i;:::-;41872:6;;41852:27;;-1:-1:-1;;;;;;;;;;;25450:42:0;-1:-1:-1;;;;;41872:6:0;41852:13;:27::i;:::-;41931:29;41948:11;41931:16;:29::i;:::-;42023:18;:16;:18::i;:::-;42111:6;;42094:24;;-1:-1:-1;;;;;42111:6:0;42094:16;:24::i;33520:130::-;33605:37;;-1:-1:-1;;;33605:37:0;;-1:-1:-1;;;;;5630:32:1;;;33605:37:0;;;5612:51:1;5679:18;;;5672:34;;;33605:23:0;;;;;5585:18:1;;33605:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;33520:130;;;:::o;37102:648::-;37160:19;:17;:19::i;:::-;37230:6;;37192:17;;37212:25;;-1:-1:-1;;;;;37230:6:0;37212:17;:25::i;:::-;37286:6;;37192:45;;-1:-1:-1;37248:17:0;;37268:25;;-1:-1:-1;;;;;37286:6:0;37268:17;:25::i;:::-;37248:45;;37321:3;37309:9;:15;:34;;;;;37340:3;37328:9;:15;37309:34;37306:425;;;37361:15;;37397:227;37436:9;37464;37538:3;37505:31;24915:1;37436:9;37505:31;:::i;:::-;37504:37;;;;:::i;:::-;37492:49;;:9;:49;:::i;:::-;37606:3;37573:31;24915:1;37573:9;:31;:::i;:::-;37572:37;;;;:::i;:::-;37560:49;;:9;:49;:::i;:::-;37397:20;:227::i;:::-;37360:264;;;;37642:7;37653:1;37642:12;;:27;;;;-1:-1:-1;37658:11:0;;;37642:27;37639:80;;;37688:31;37702:7;37711;37688:13;:31::i;27617:106::-;27681:34;;-1:-1:-1;;;27681:34:0;;25689:1;27681:34;;;4627:25:1;4668:18;;;4661:34;;;25925:42:0;;27681:20;;4600:18:1;;27681:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27617:106;:::o;32312:213::-;32453:6;;32445:44;;-1:-1:-1;;;32445:44:0;;32399:7;;;;-1:-1:-1;;;;;32453:6:0;;;;32445:29;;:44;;32475:7;;32484:4;;32445:44;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;32445:44:0;;;;;;;;;;;;:::i;:::-;32418:71;;32507:7;32515:1;32507:10;;;;;;;;:::i;:::-;;;;;;;32500:17;;;32312:213;;;;:::o;43772:453::-;-1:-1:-1;;;;;43950:41:0;;;44006:7;44095:3;44063:30;24915:1;44063:8;:30;:::i;:::-;44062:36;;;;:::i;:::-;44051:47;;:8;:47;:::i;:::-;44133:5;44161:4;44181:25;:15;44197:9;44181:25;:::i;:::-;43950:267;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;43950:267:0;;;;;;;;;;;;:::i;33658:393::-;33725:7;34040:3;34016:20;24851:2;34016:6;:20;:::i;:::-;34015:28;;;;:::i;34245:655::-;34309:16;;;34323:1;34309:16;;;;;;;;34285:21;;34309:16;;;;;;;;;;-1:-1:-1;34309:16:0;34285:40;;-1:-1:-1;;;;;;;;;;;34336:4:0;34341:1;34336:7;;;;;;;;:::i;:::-;;;;;;:14;-1:-1:-1;;;;;34336:14:0;;;-1:-1:-1;;;;;34336:14:0;;;;;25192:42;34361:4;34366:1;34361:7;;;;;;;;:::i;:::-;;;;;;:14;-1:-1:-1;;;;;34361:14:0;;;-1:-1:-1;;;;;34361:14:0;;;;;34386:24;34413:44;34433:23;-1:-1:-1;;;;;;;;;;;34433:17:0;:23::i;:::-;34413:19;:44::i;:::-;34386:71;-1:-1:-1;34471:20:0;;34468:425;;34508:14;34525:51;34559:10;;34540:16;:29;;;;:::i;:::-;34571:4;34525:14;:51::i;:::-;34508:68;;34603:3;34594:6;:12;34591:291;;;34653:6;;;34680:10;34627:78;;-1:-1:-1;;;;;34653:6:0;;34661:29;;:16;:29;:::i;:::-;34692:6;34700:4;34627:25;:78::i;:::-;34737:1;34724:14;;34762:33;;;4627:25:1;;;4683:2;4668:18;;4661:34;;;34762:33:0;;4600:18:1;34762:33:0;;;;;;;30248:308:::1;30169:387:::0;;:::o;34591:291::-;34850:16;34836:10;;:30;;;;;;;:::i;:::-;;;;-1:-1:-1;;34493:400:0;34274:626;;34245:655::o;38356:810::-;38400:21;38423;38446;38484:64;-1:-1:-1;;;;;;;;;;;38484:46:0;:64::i;:::-;38597:18;;38399:149;;-1:-1:-1;38399:149:0;;-1:-1:-1;38399:149:0;-1:-1:-1;38559:18:0;;38580:35;;38597:18;;38399:149;38580:35;:::i;:::-;38559:56;;38814:4;38672:138;:116;38783:4;38672:96;;;;;;;;38755:11;38711:55;;38731:20;;38712:16;:39;;;;:::i;:::-;38711:55;;;;:::i;:::-;-1:-1:-1;;;;;38672:96:0;;;:110;;:116::i;:::-;1768:7;1499:3;1768:21;;1668:130;38672:138;-1:-1:-1;;;;;38664:147:0;:154;;;;:::i;:::-;38651:10;:167;;;;39006:4;38852:150;:124;38971:4;38852:100;;;;;;;;38939:11;38895:55;;38915:20;;38896:16;:39;;;;:::i;38852:150::-;-1:-1:-1;;;;;38844:159:0;:166;;;;:::i;:::-;38831:10;:179;-1:-1:-1;39023:20:0;:39;;;;39073:20;:39;39123:18;:35;;-1:-1:-1;;39123:35:0;;;;;;;;;;;38356:810::o;45940:876::-;46034:16;;;46048:1;46034:16;;;;;;;;45987:10;;;;46034:16;46048:1;46034:16;;;;;;;;;;-1:-1:-1;46034:16:0;46010:40;;46061:16;46080:21;:19;:21::i;:::-;46061:40;;-1:-1:-1;;;;;;;;;;;46112:4:0;46117:1;46112:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;46112:14:0;;;:7;;;;;;;;;;;:14;46142:12;;46139:292;;46172:11;46185;46200:25;46216:8;46200:15;:25::i;:::-;46171:54;;;;46304:3;46311:1;46304:8;46301:119;;46343:6;;46333:7;;-1:-1:-1;;;;;46343:6:0;;;;46333:4;;46343:6;;46333:7;;;;:::i;:::-;;;;;;:16;-1:-1:-1;;;;;46333:16:0;;;-1:-1:-1;;;;;46333:16:0;;;;;46401:3;46373:25;46388:3;46393:4;46373:14;:25::i;:::-;:31;;;;:::i;:::-;46368:36;;46301:119;46156:275;;46139:292;46556:6;;46519:16;;46538:25;;-1:-1:-1;;;;;46556:6:0;46538:17;:25::i;:::-;46519:44;-1:-1:-1;46578:12:0;;46574:112;;46617:6;;46607:7;;-1:-1:-1;;;;;46617:6:0;;;;46607:4;;46617:6;;46607:7;;;;:::i;:::-;;;;;;:16;-1:-1:-1;;;;;46607:16:0;;;-1:-1:-1;;;;;46607:16:0;;;;;46644:30;46659:8;46669:4;46644:14;:30::i;:::-;46638:36;;;;:::i;:::-;;;46574:112;46785:23;-1:-1:-1;;;;;;;;;;;46785:17:0;:23::i;:::-;46779:29;;;;:::i;:::-;;;45999:817;;;45940:876;:::o;16863:716::-;17287:23;17313:69;17341:4;17313:69;;;;;;;;;;;;;;;;;17321:5;-1:-1:-1;;;;;17313:27:0;;;:69;;;;;:::i;:::-;17397:17;;17287:95;;-1:-1:-1;17397:21:0;17393:179;;17494:10;17483:30;;;;;;;;;;;;:::i;:::-;17475:85;;;;-1:-1:-1;;;17475:85:0;;9176:2:1;17475:85:0;;;9158:21:1;9215:2;9195:18;;;9188:30;9254:34;9234:18;;;9227:62;-1:-1:-1;;;9305:18:1;;;9298:40;9355:19;;17475:85:0;8974:406:1;10355:510:0;10525:12;10583:5;10558:21;:30;;10550:81;;;;-1:-1:-1;;;10550:81:0;;9587:2:1;10550:81:0;;;9569:21:1;9626:2;9606:18;;;9599:30;9665:34;9645:18;;;9638:62;-1:-1:-1;;;9716:18:1;;;9709:36;9762:19;;10550:81:0;9385:402:1;10550:81:0;6752:20;;10642:60;;;;-1:-1:-1;;;10642:60:0;;9994:2:1;10642:60:0;;;9976:21:1;10033:2;10013:18;;;10006:30;10072:31;10052:18;;;10045:59;10121:18;;10642:60:0;9792:353:1;10642:60:0;10716:12;10730:23;10757:6;-1:-1:-1;;;;;10757:11:0;10776:5;10783:4;10757:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10715:73;;;;10806:51;10823:7;10832:10;10844:12;10806:16;:51::i;:::-;10799:58;10355:510;-1:-1:-1;;;;;;;10355:510:0:o;39174:579::-;39326:16;:14;:16::i;:::-;39312:11;:30;;;;39355:22;:80;;;;;;;;;;;;;;;;;;;39463:11;;39449:10;;:25;39446:256;;25030:1;39526:10;;39506:11;;39520:3;39506:17;;;;:::i;:::-;:30;;;;:::i;:::-;39499:38;;:3;:38;:::i;:::-;:64;;39565:8;39491:83;;;;;-1:-1:-1;;;39491:83:0;;;;;;;;:::i;:::-;;39446:256;;;25030:1;39641:11;;39622:10;;39635:3;39622:16;;;;:::i;:::-;:30;;;;:::i;:::-;39615:38;;:3;:38;:::i;:::-;:64;;39681:8;39607:83;;;;;-1:-1:-1;;;39607:83:0;;;;;;;;:::i;:::-;;39446:256;39728:17;:15;:17::i;:::-;39714:11;:31;-1:-1:-1;39174:579:0:o;39761:826::-;39908:16;;;39922:1;39908:16;;;39849:24;39908:16;;;;;39849:24;39884:21;;39908:16;39922:1;39908:16;;;;;;;;;;-1:-1:-1;39908:16:0;39884:40;;-1:-1:-1;;;;;;;;;;;39935:4:0;39940:1;39935:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;39935:14:0;;;:7;;;;;;;;;:14;40009;;-1:-1:-1;;;;;;;;;;;40009:14:0;40006:574;;40050:6;40040:4;40045:1;40040:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;40040:16:0;;;:7;;;;;;;;;:16;40089:6;;;40081:29;40111:12;40122:1;40111:10;:12;:::i;:::-;40125:4;40081:49;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;40081:49:0;;;;;;;;;;;;:::i;:::-;40071:59;;40145:26;40174:7;40182:1;40174:10;;;;;;;;:::i;:::-;;;;;;;40145:39;;40223:3;40202:18;:24;40199:370;;;40254:6;;-1:-1:-1;;;;;40254:6:0;40246:37;40290:12;40301:1;40290:10;:12;:::i;:::-;40389:3;40348:40;24915:1;40348:18;:40;:::i;:::-;:44;;;;:::i;:::-;40326:67;;:18;:67;:::i;:::-;40432:4;40467;40495:27;:15;40513:9;40495:27;:::i;:::-;40246:307;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;40246:307:0;;;;;;;;;;;;:::i;:::-;;40025:555;39838:749;;39761:826;;:::o;40771:750::-;40860:26;40889:25;40907:6;40889:17;:25::i;:::-;40860:54;-1:-1:-1;40926:15:0;;40962:255;40997:16;40860:54;41121:3;41081:38;24915:1;40997:16;41081:38;:::i;40962:255::-;40925:292;;;;41231:7;41242:1;41231:12;;:27;;;;-1:-1:-1;41247:11:0;;;41231:27;:65;;;;;41262:34;41279:7;41288;41262:16;:34::i;:::-;41228:286;;;41313:35;41323:6;-1:-1:-1;;;;;;;;;;;41340:7:0;41313:9;:35::i;:::-;-1:-1:-1;;;;;;;;;;;;;;;;41363:19:0;;41390:7;41363:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;41415:38:0;;-1:-1:-1;;;41415:38:0;;-1:-1:-1;;;;;;;;;;;41415:38:0;;;5612:51:1;5679:18;;;5672:34;;;-1:-1:-1;;;;;;;;;;;25450:42:0;-1:-1:-1;41415:20:0;;-1:-1:-1;5585:18:1;;;-1:-1:-1;41415:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;41468:34:0;;-1:-1:-1;;;41468:34:0;;41496:4;41468:34;;;694:51:1;-1:-1:-1;;;;;;;;;;;25845:42:0;41468:19;;667:18:1;;41468:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;32533:465::-;32616:19;32637;32670:17;32689;-1:-1:-1;;;;;;;;;;;;;;;;32711:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32669:70;-1:-1:-1;;;;;32669:70:0;;;-1:-1:-1;;;;;32669:70:0;;;32750:15;-1:-1:-1;;;;;;;;;;;;;;;;32791:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32768:20;:9;32781:6;32768:20;:::i;:::-;:51;;;;:::i;:::-;32750:69;-1:-1:-1;32928:6:0;32905:19;32915:9;32750:69;32905:19;:::i;:::-;:30;;;;:::i;:::-;32891:44;-1:-1:-1;32983:6:0;32960:19;32970:9;32960:7;:19;:::i;:::-;:30;;;;:::i;:::-;32946:44;;32658:340;;;32533:465;;;:::o;44686:236::-;44779:16;;;44793:1;44779:16;;;;;;;;44735:7;;;;44779:16;44793:1;44779:16;;;;;;;;-1:-1:-1;;44816:6:0;;44806:7;;;;-1:-1:-1;;;;;;44816:6:0;;44806:7;;-1:-1:-1;44816:6:0;;44806:7;;;;:::i;:::-;-1:-1:-1;;;;;44806:16:0;;;:7;;;;;;;;;:16;44843:6;;44833:7;;44843:6;;;44833:4;;44843:6;;44833:7;;;;;;:::i;:::-;;;;;;:16;-1:-1:-1;;;;;44833:16:0;;;-1:-1:-1;;;;;44833:16:0;;;;;44910:3;44875:32;44890:10;44902:4;44875:14;:32::i;:::-;:38;;;;:::i;:::-;44867:47;;:4;:47;:::i;43314:450::-;43417:16;;;43431:1;43417:16;;;;;;;;43393:21;;43417:16;;;;;;;;;;-1:-1:-1;43417:16:0;43393:40;;-1:-1:-1;;;;;;;;;;;43444:4:0;43449:1;43444:7;;;;;;;;:::i;:::-;;;;;;:14;-1:-1:-1;;;;;43444:14:0;;;-1:-1:-1;;;;;43444:14:0;;;;;43479:6;43469:4;43474:1;43469:7;;;;;;;;:::i;:::-;;;;;;:16;-1:-1:-1;;;;;43469:16:0;;;-1:-1:-1;;;;;43469:16:0;;;;;43496:20;43519:23;-1:-1:-1;;;;;;;;;;;43519:17:0;:23::i;:::-;43496:46;;43553:24;43588:7;-1:-1:-1;;;;;43580:30:0;;43611:12;43625:4;43580:50;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;43580:50:0;;;;;;;;;;;;:::i;:::-;43553:77;;43657:3;43644:7;43652:1;43644:10;;;;;;;;:::i;:::-;;;;;;;:16;43641:116;;;43677:66;43703:7;43712:12;43726:7;43734:1;43726:10;;;;;;;;:::i;:::-;;;;;;;43738:4;43677:25;:66::i;42697:609::-;42783:16;;;42797:1;42783:16;;;;;;;;42759:21;;42783:16;;;;;;;;;;-1:-1:-1;42783:16:0;42759:40;;42810:24;-1:-1:-1;;;;;;;;;;;42888:4:0;42893:1;42888:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;42888:14:0;;;:7;;;;;;;;;:14;42916;;-1:-1:-1;;;;;;;;;;;42916:14:0;42913:386;;42957:6;42947:4;42952:1;42947:7;;;;;;;;:::i;:::-;;;;;;:16;-1:-1:-1;;;;;42947:16:0;;;-1:-1:-1;;;;;42947:16:0;;;;;42978;42997:26;43015:4;43020:1;43015:7;;;;;;;;:::i;:::-;;;;;;;42997:17;:26::i;:::-;42978:45;-1:-1:-1;43041:12:0;;43038:250;;43092:6;;43084:45;;-1:-1:-1;;;43084:45:0;;-1:-1:-1;;;;;43092:6:0;;;;43084:29;;:45;;43114:8;;43124:4;;43084:45;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;43084:45:0;;;;;;;;;;;;:::i;:::-;43074:55;;43164:3;43151:7;43159:1;43151:10;;;;;;;;:::i;:::-;;;;;;;:16;43148:125;;;43218:6;;43236:10;;43192:61;;-1:-1:-1;;;;;43218:6:0;;43226:8;;43236:7;;43218:6;;43236:10;;;;;;:::i;37758:406::-;37829:6;;37806:30;;-1:-1:-1;;;;;;;;;;;25845:42:0;-1:-1:-1;;;;;37829:6:0;37806:13;:30::i;:::-;37855:6;;37893;;37924;;-1:-1:-1;;;;;37855:6:0;;;;37847:31;;37893:6;;;37924;37955:26;-1:-1:-1;;;;;;;;;;;37955:17:0;:26::i;:::-;38009:1;;38079:4;38106:27;:15;38124:9;38106:27;:::i;:::-;37847:309;;;;;;-1:-1:-1;;;;;;37847:309:0;;;-1:-1:-1;;;;;12622:15:1;;;37847:309:0;;;12604:34:1;12674:15;;;12654:18;;;12647:43;12706:18;;;12699:34;;;;12749:18;;;12742:34;;;;12792:19;;;12785:35;12857:15;;;12836:19;;;12829:44;12889:19;;;12882:35;;;;12538:19;;37847:309:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;44233:445::-;44306:16;;;44320:1;44306:16;;;;;;;;44282:21;;44306:16;;;;;;;;;;-1:-1:-1;44306:16:0;44282:40;;-1:-1:-1;;;;;;;;;;;44333:4:0;44338:1;44333:7;;;;;;;;:::i;:::-;;;;;;:14;-1:-1:-1;;;;;44333:14:0;;;-1:-1:-1;;;;;44333:14:0;;;;;44368:16;44413:1;44387:23;-1:-1:-1;;;;;;;;;;;44387:17:0;:23::i;:::-;:27;;;;:::i;:::-;44368:46;-1:-1:-1;44429:12:0;;44425:246;;44468:6;;44458:7;;-1:-1:-1;;;;;44468:6:0;;;;44458:4;;44468:6;;44458:7;;;;;;:::i;:::-;;;;;;:16;-1:-1:-1;;;;;44458:16:0;;;-1:-1:-1;;;;;44458:16:0;;;;;44489:14;44506:30;44521:8;44531:4;44506:14;:30::i;:::-;44489:47;;44563:3;44554:6;:12;44551:109;;;44613:6;;44587:57;;-1:-1:-1;;;;;44613:6:0;44621:8;44631:6;44639:4;44587:25;:57::i;34908:1201::-;35092:12;35106;35132:13;35147;-1:-1:-1;;;;;;;;;;;;;;;;35165:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35131:62;-1:-1:-1;;;;;35131:62:0;;;-1:-1:-1;;;;;35131:62:0;;;35208:8;35220:1;35208:13;:30;;;;-1:-1:-1;35225:13:0;;35208:30;35204:898;;;35277:14;;-1:-1:-1;35293:14:0;;-1:-1:-1;35204:898:0;;;35371:6;;35363:57;;-1:-1:-1;;;35363:57:0;;;;;13130:25:1;;;13171:18;;;13164:34;;;13214:18;;;13207:34;;;35341:19:0;;-1:-1:-1;;;;;35371:6:0;;35363:21;;13103:18:1;;35363:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35341:79;;35457:14;35439;:32;35435:656;;35513:10;35495:14;:28;35492:205;;35570:14;;-1:-1:-1;35586:14:0;-1:-1:-1;35586:14:0;35435:656;;35492:205;35672:1;;-1:-1:-1;35672:1:0;;-1:-1:-1;35435:656:0;;;35767:6;;35759:57;;-1:-1:-1;;;35759:57:0;;;;;13130:25:1;;;13171:18;;;13164:34;;;13214:18;;;13207:34;;;35737:19:0;;-1:-1:-1;;;;;35767:6:0;;35759:21;;13103:18:1;;35759:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35737:79;;35856:14;35838;:32;;:64;;;;;35892:10;35874:14;:28;;35838:64;35835:241;;;35949:14;-1:-1:-1;35965:14:0;;-1:-1:-1;35949:14:0;35835:241;;;36051:1;;-1:-1:-1;36051:1:0;;-1:-1:-1;35835:241:0;35718:373;35435:656;35326:776;35204:898;35120:989;;34908:1201;;;;;;;:::o;36117:296::-;36201:38;36218:9;36229;36201:16;:38::i;:::-;36198:208;;;36266:6;;36256:37;;-1:-1:-1;;;;;36266:6:0;-1:-1:-1;;;;;;;;;;;36283:9:0;36256;:37::i;:::-;36318:6;;36308:37;;-1:-1:-1;;;;;36318:6:0;-1:-1:-1;;;;;;;;;;;36335:9:0;36308;:37::i;:::-;36360:34;;-1:-1:-1;;;36360:34:0;;36388:4;36360:34;;;694:51:1;-1:-1:-1;;;;;;;;;;;25845:42:0;36360:19;;667:18:1;;36360:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;23020:1031::-;23106:21;23129;23152;23203:23;:21;:23::i;:::-;23186:40;;23262:4;-1:-1:-1;;;;;23256:32:0;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23237:53;;23326:4;-1:-1:-1;;;;;23320:32:0;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23301:53;;23469:16;23487;23505:25;23540:4;-1:-1:-1;;;;;23534:23:0;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23468:91;;;;;;23596:14;23574:36;;:18;:36;;;23570:474;;23675:18;23696:35;23713:18;23696:14;:35;:::i;:::-;23675:56;;23893:11;23842:62;;23847:39;23867:8;-1:-1:-1;;;;;23847:39:0;23877:8;-1:-1:-1;;;;;23847:39:0;:19;:39::i;:::-;:42;23842:62;;;-1:-1:-1;;;;;23842:48:0;:62;:::i;:::-;23822:82;;;;:::i;:::-;;;24021:11;23970:62;;23975:39;23995:8;-1:-1:-1;;;;;23975:39:0;24005:8;-1:-1:-1;;;;;23975:39:0;:19;:39::i;:::-;:42;23970:62;;;-1:-1:-1;;;;;23970:48:0;:62;:::i;:::-;23950:82;;;;:::i;:::-;;;23612:432;23570:474;23175:876;;;23020:1031;;;;;:::o;1896:241::-;-1:-1:-1;;;;;;;;;;;;1995:9:0;2027:6;;;:42;;-1:-1:-1;2062:7:0;;-1:-1:-1;;;;;2037:32:0;2057:1;2042:11;2057:1;2037:32;2042:11;:::i;:::-;2038:15;-1:-1:-1;2037:21:0;;2038:15;2037:21;:::i;:::-;:32;2027:42;2019:80;;;;-1:-1:-1;;;2019:80:0;;13454:2:1;2019:80:0;;;13436:21:1;13493:2;13473:18;;;13466:30;13532:27;13512:18;;;13505:55;13577:18;;2019:80:0;13252:349:1;2019:80:0;2117:12;;;;;;;;;;;;;1896:241;-1:-1:-1;;;1896:241:0:o;13041:712::-;13191:12;13220:7;13216:530;;;-1:-1:-1;13251:10:0;13244:17;;13216:530;13365:17;;:21;13361:374;;13563:10;13557:17;13624:15;13611:10;13607:2;13603:19;13596:44;13361:374;13706:12;13699:20;;-1:-1:-1;;;13699:20:0;;;;;;;;:::i;44930:237::-;45024:16;;;45038:1;45024:16;;;;;;;;44980:7;;;;45024:16;45038:1;45024:16;;;;;;;;-1:-1:-1;;45061:6:0;;45051:7;;;;-1:-1:-1;;;;;;45061:6:0;;45051:7;;-1:-1:-1;45061:6:0;;45051:7;;;;:::i;:::-;-1:-1:-1;;;;;45051:16:0;;;:7;;;;;;;;;:16;45088:6;;45078:7;;45088:6;;;45078:4;;45088:6;;45078:7;;;;;;:::i;36421:673::-;36504:4;36522:17;36541;-1:-1:-1;;;;;;;;;;;;;;;;36563:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36521:70;;;;;36617:20;-1:-1:-1;;;;;;;;;;;;;;;;36640:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36617:51;;36679:17;36707:20;-1:-1:-1;;;;;;;;;;;;;;;;36730:32:0;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36707:57;-1:-1:-1;36781:17:0;36777:279;;36858:12;36827:28;36837:17;36847:7;36837;:17;:::i;:::-;36827:9;:28::i;:::-;:43;;;;:::i;:::-;36815:55;;36777:279;;;36915:129;-1:-1:-1;;;;;36942:34:0;;:22;36952:12;36942:7;:22;:::i;:::-;:34;;;;:::i;:::-;-1:-1:-1;;;;;36995:34:0;;:22;37005:12;36995:7;:22;:::i;:::-;:34;;;;:::i;:::-;36915:8;:129::i;:::-;36903:141;;36777:279;-1:-1:-1;37073:13:0;;;36421:673;-1:-1:-1;;;;;;36421:673:0:o;22791:123::-;22847:6;22880:25;22898:7;22880:15;:25;:::i;2257:737::-;-1:-1:-1;;;;;;;;;;;;2389:1:0;2375:11;:15;2367:66;;;;-1:-1:-1;;;2367:66:0;;13925:2:1;2367:66:0;;;13907:21:1;13964:2;13944:18;;;13937:30;14003:34;13983:18;;;13976:62;-1:-1:-1;;;14054:18:1;;;14047:36;14100:19;;2367:66:0;13723:402:1;2367:66:0;2448:14;2444:50;;-1:-1:-1;2471:23:0;;;;;;;;;-1:-1:-1;2471:23:0;;2464:30;;2444:50;-1:-1:-1;;;;;2511:30:0;;2507:480;;2558:14;2575:39;2603:11;1499:3;2576:23;;;2575:39;:::i;:::-;2558:56;-1:-1:-1;;;;;;2637:27:0;;;2629:70;;;;-1:-1:-1;;;2629:70:0;;14332:2:1;2629:70:0;;;14314:21:1;14371:2;14351:18;;;14344:30;14410:32;14390:18;;;14383:60;14460:18;;2629:70:0;14130:354:1;2629:70:0;2721:26;;;;;;;;2739:6;-1:-1:-1;;;;;2721:26:0;;;;2714:33;;;;;2507:480;2780:14;2797:45;2813:9;-1:-1:-1;;;2830:11:0;2797:15;:45::i;24294:303::-;24339:6;24366:1;24362;:5;24358:232;;;-1:-1:-1;24388:1:0;24404:6;24413:5;24417:1;24388;24413:5;:::i;:::-;:9;;24421:1;24413:9;:::i;:::-;24404:18;;24437:92;24448:1;24444;:5;24437:92;;;24474:1;-1:-1:-1;24474:1:0;24512;24474;24499:5;24474:1;24499;:5;:::i;:::-;:9;;;;:::i;:::-;24498:15;;;;:::i;:::-;24494:19;;24437:92;;24358:232;24550:6;;24546:44;;-1:-1:-1;24577:1:0;24546:44;24294:303;;;:::o;24080:96::-;24132:6;24159:1;24155;:5;:13;;24167:1;24155:13;;;-1:-1:-1;24163:1:0;;24151:17;-1:-1:-1;24080:96:0:o;809:388::-;915:7;936:9;947;960:13;968:1;971;960:7;:13::i;:::-;935:38;;;;986:10;1012:1;999:15;;;;;:::i;:::-;1009:1;1006;999:15;986:28;;1034:1;1029:2;:6;1025:18;;;1037:6;1042:1;1037:6;;:::i;:::-;;;1025:18;1054:7;1059:2;1054:7;;:::i;:::-;;-1:-1:-1;1078:6:0;1074:24;;1093:5;1097:1;1093;:5;:::i;:::-;1086:12;;;;;;;1074:24;1123:1;1119;:5;1111:44;;;;-1:-1:-1;;;1111:44:0;;14691:2:1;1111:44:0;;;14673:21:1;14730:2;14710:18;;;14703:30;14769:28;14749:18;;;14742:56;14815:18;;1111:44:0;14489:350:1;1111:44:0;1173:16;1181:1;1184;1187;1173:7;:16::i;88:217::-;150:9;;;-1:-1:-1;;206:1:0;203;196:31;183:44;-1:-1:-1;242:5:0;246:1;242;:5;:::i;:::-;238:9;-1:-1:-1;262:6:0;238:9;262:2;:6;:::i;:::-;258:10;;288:1;283:2;:6;279:18;;;291:6;296:1;291:6;;:::i;:::-;;;279:18;172:133;88:217;;;;;:::o;313:488::-;419:7;;459:4;:2;;462:1;459:4;:::i;:::-;454:10;;;-1:-1:-1;475:9:0;454:10;:1;475:9;:::i;:::-;;-1:-1:-1;495:9:0;500:4;495:9;;:::i;:::-;;-1:-1:-1;537:4:0;526:7;:5;;532:1;526:7;:::i;:::-;525:16;;;;:::i;:::-;:20;;544:1;525:20;:::i;:::-;520:26;;:1;:26;:::i;:::-;515:31;;;;:::i;:::-;;-1:-1:-1;569:1:0;590:5;569:1;590;:5;:::i;:::-;586:9;;:1;:9;:::i;:::-;581:14;;;;:::i;:::-;;-1:-1:-1;615:5:0;581:14;615:1;:5;:::i;:::-;611:9;;:1;:9;:::i;:::-;606:14;;;;:::i;:::-;;-1:-1:-1;640:5:0;606:14;640:1;:5;:::i;:::-;636:9;;:1;:9;:::i;:::-;631:14;;;;:::i;:::-;;-1:-1:-1;665:5:0;631:14;665:1;:5;:::i;:::-;661:9;;:1;:9;:::i;:::-;656:14;;;;:::i;:::-;;-1:-1:-1;690:5:0;656:14;690:1;:5;:::i;:::-;686:9;;:1;:9;:::i;:::-;681:14;;;;:::i;:::-;;-1:-1:-1;715:5:0;681:14;715:1;:5;:::i;:::-;711:9;;:1;:9;:::i;:::-;706:14;;;;:::i;:::-;;-1:-1:-1;740:5:0;706:14;740:1;:5;:::i;:::-;736:9;;:1;:9;:::i;:::-;731:14;;;;:::i;:::-;;-1:-1:-1;765:5:0;731:14;765:1;:5;:::i;:::-;761:9;;:1;:9;:::i;:::-;756:14;;;;:::i;:::-;;-1:-1:-1;788:5:0;756:14;788:1;:5;:::i;:::-;781:12;313:488;-1:-1:-1;;;;;;313:488:0:o;14:347:1:-;216:2;198:21;;;255:2;235:18;;;228:30;294:25;289:2;274:18;;267:53;352:2;337:18;;14:347::o;756:131::-;-1:-1:-1;;;;;831:31:1;;821:42;;811:70;;877:1;874;867:12;892:315;960:6;968;1021:2;1009:9;1000:7;996:23;992:32;989:52;;;1037:1;1034;1027:12;989:52;1076:9;1063:23;1095:31;1120:5;1095:31;:::i;:::-;1145:5;1197:2;1182:18;;;;1169:32;;-1:-1:-1;;;892:315:1:o;1212:180::-;1271:6;1324:2;1312:9;1303:7;1299:23;1295:32;1292:52;;;1340:1;1337;1330:12;1292:52;-1:-1:-1;1363:23:1;;1212:180;-1:-1:-1;1212:180:1:o;1397:247::-;1456:6;1509:2;1497:9;1488:7;1484:23;1480:32;1477:52;;;1525:1;1522;1515:12;1477:52;1564:9;1551:23;1583:31;1608:5;1583:31;:::i;1841:127::-;1902:10;1897:3;1893:20;1890:1;1883:31;1933:4;1930:1;1923:15;1957:4;1954:1;1947:15;1973:128;2013:3;2044:1;2040:6;2037:1;2034:13;2031:39;;;2050:18;;:::i;:::-;-1:-1:-1;2086:9:1;;1973:128::o;2106:168::-;2146:7;2212:1;2208;2204:6;2200:14;2197:1;2194:21;2189:1;2182:9;2175:17;2171:45;2168:71;;;2219:18;;:::i;:::-;-1:-1:-1;2259:9:1;;2106:168::o;2279:251::-;2349:6;2402:2;2390:9;2381:7;2377:23;2373:32;2370:52;;;2418:1;2415;2408:12;2370:52;2450:9;2444:16;2469:31;2494:5;2469:31;:::i;2937:127::-;2998:10;2993:3;2989:20;2986:1;2979:31;3029:4;3026:1;3019:15;3053:4;3050:1;3043:15;3069:127;3130:10;3125:3;3121:20;3118:1;3111:31;3161:4;3158:1;3151:15;3185:4;3182:1;3175:15;3201:184;3271:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:52;;;3340:1;3337;3330:12;3292:52;-1:-1:-1;3363:16:1;;3201:184;-1:-1:-1;3201:184:1:o;3390:125::-;3430:4;3458:1;3455;3452:8;3449:34;;;3463:18;;:::i;:::-;-1:-1:-1;3500:9:1;;3390:125::o;3799:245::-;3878:6;3886;3939:2;3927:9;3918:7;3914:23;3910:32;3907:52;;;3955:1;3952;3945:12;3907:52;-1:-1:-1;;3978:16:1;;4034:2;4019:18;;;4013:25;3978:16;;4013:25;;-1:-1:-1;3799:245:1:o;5717:127::-;5778:10;5773:3;5769:20;5766:1;5759:31;5809:4;5806:1;5799:15;5833:4;5830:1;5823:15;5849:120;5889:1;5915;5905:35;;5920:18;;:::i;:::-;-1:-1:-1;5954:9:1;;5849:120::o;5974:277::-;6041:6;6094:2;6082:9;6073:7;6069:23;6065:32;6062:52;;;6110:1;6107;6100:12;6062:52;6142:9;6136:16;6195:5;6188:13;6181:21;6174:5;6171:32;6161:60;;6217:1;6214;6207:12;6256:461;6309:3;6347:5;6341:12;6374:6;6369:3;6362:19;6400:4;6429:2;6424:3;6420:12;6413:19;;6466:2;6459:5;6455:14;6487:1;6497:195;6511:6;6508:1;6505:13;6497:195;;;6576:13;;-1:-1:-1;;;;;6572:39:1;6560:52;;6632:12;;;;6667:15;;;;6608:1;6526:9;6497:195;;;-1:-1:-1;6708:3:1;;6256:461;-1:-1:-1;;;;;6256:461:1:o;6722:332::-;6929:6;6918:9;6911:25;6972:2;6967;6956:9;6952:18;6945:30;6892:4;6992:56;7044:2;7033:9;7029:18;7021:6;6992:56;:::i;7059:1105::-;7154:6;7185:2;7228;7216:9;7207:7;7203:23;7199:32;7196:52;;;7244:1;7241;7234:12;7196:52;7277:9;7271:16;7306:18;7347:2;7339:6;7336:14;7333:34;;;7363:1;7360;7353:12;7333:34;7401:6;7390:9;7386:22;7376:32;;7446:7;7439:4;7435:2;7431:13;7427:27;7417:55;;7468:1;7465;7458:12;7417:55;7497:2;7491:9;7519:2;7515;7512:10;7509:36;;;7525:18;;:::i;:::-;7571:2;7568:1;7564:10;7603:2;7597:9;7666:2;7662:7;7657:2;7653;7649:11;7645:25;7637:6;7633:38;7721:6;7709:10;7706:22;7701:2;7689:10;7686:18;7683:46;7680:72;;;7732:18;;:::i;:::-;7768:2;7761:22;7818:18;;;7852:15;;;;-1:-1:-1;7894:11:1;;;7890:20;;;7922:19;;;7919:39;;;7954:1;7951;7944:12;7919:39;7978:11;;;;7998:135;8014:6;8009:3;8006:15;7998:135;;;8080:10;;8068:23;;8031:12;;;;8111;;;;7998:135;;;8152:6;7059:1105;-1:-1:-1;;;;;;;;7059:1105:1:o;8169:574::-;8460:6;8449:9;8442:25;8503:6;8498:2;8487:9;8483:18;8476:34;8546:3;8541:2;8530:9;8526:18;8519:31;8423:4;8567:57;8619:3;8608:9;8604:19;8596:6;8567:57;:::i;:::-;-1:-1:-1;;;;;8660:32:1;;;;8655:2;8640:18;;8633:60;-1:-1:-1;8724:3:1;8709:19;8702:35;8559:65;8169:574;-1:-1:-1;;;8169:574:1:o;8748:221::-;8787:4;8816:10;8876;;;;8846;;8898:12;;;8895:38;;;8913:18;;:::i;:::-;8950:13;;8748:221;-1:-1:-1;;;8748:221:1:o;10150:258::-;10222:1;10232:113;10246:6;10243:1;10240:13;10232:113;;;10322:11;;;10316:18;10303:11;;;10296:39;10268:2;10261:10;10232:113;;;10363:6;10360:1;10357:13;10354:48;;;-1:-1:-1;;10398:1:1;10380:16;;10373:27;10150:258::o;10413:274::-;10542:3;10580:6;10574:13;10596:53;10642:6;10637:3;10630:4;10622:6;10618:17;10596:53;:::i;:::-;10665:16;;;;;10413:274;-1:-1:-1;;10413:274:1:o;10692:383::-;10841:2;10830:9;10823:21;10804:4;10873:6;10867:13;10916:6;10911:2;10900:9;10896:18;10889:34;10932:66;10991:6;10986:2;10975:9;10971:18;10966:2;10958:6;10954:15;10932:66;:::i;:::-;11059:2;11038:15;-1:-1:-1;;11034:29:1;11019:45;;;;11066:2;11015:54;;10692:383;-1:-1:-1;;10692:383:1:o;11080:502::-;11343:6;11332:9;11325:25;11386:3;11381:2;11370:9;11366:18;11359:31;11306:4;11407:57;11459:3;11448:9;11444:19;11436:6;11407:57;:::i;:::-;-1:-1:-1;;;;;11500:32:1;;;;11495:2;11480:18;;11473:60;-1:-1:-1;11564:2:1;11549:18;11542:34;11399:65;11080:502;-1:-1:-1;;11080:502:1:o;11587:188::-;11666:13;;-1:-1:-1;;;;;11708:42:1;;11698:53;;11688:81;;11765:1;11762;11755:12;11780:450;11867:6;11875;11883;11936:2;11924:9;11915:7;11911:23;11907:32;11904:52;;;11952:1;11949;11942:12;11904:52;11975:40;12005:9;11975:40;:::i;:::-;11965:50;;12034:49;12079:2;12068:9;12064:18;12034:49;:::i;:::-;12024:59;;12126:2;12115:9;12111:18;12105:25;12170:10;12163:5;12159:22;12152:5;12149:33;12139:61;;12196:1;12193;12186:12;12139:61;12219:5;12209:15;;;11780:450;;;;;:::o;13606:112::-;13638:1;13664;13654:35;;13669:18;;:::i;:::-;-1:-1:-1;13703:9:1;;13606:112::o

Swarm Source

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