Contract 0x19e0fb459feecb00fe77654e674c83143682a13d

Txn Hash Method
Block
From
To
Value [Txn Fee]
0xfa357ef0d8b138872a9f3e83910e9f2630554f32951eaca582b5cbb004691ee6Convert Multiple195882292022-09-06 4:44:0020 days 10 hrs ago0x67f43878dd36d65e15c7faf84aaa47e77d69cc35 IN  0x19e0fb459feecb00fe77654e674c83143682a13d0 AVAX0.09443798 26
0x7d434e715eb5c17208b39c8edeb8d1b07ca76e10a023b43b02a40ad8dda7c310Convert Multiple178938392022-07-28 3:21:4360 days 11 hrs ago0x67f43878dd36d65e15c7faf84aaa47e77d69cc35 IN  0x19e0fb459feecb00fe77654e674c83143682a13d0 AVAX0.094409094 26
0xea62a6ba682f7d4f980542c44e96cc6df4ffdb218c3d8ea8619d780fbf3113fcConvert Multiple165917312022-06-27 16:23:2890 days 22 hrs ago0x67f43878dd36d65e15c7faf84aaa47e77d69cc35 IN  0x19e0fb459feecb00fe77654e674c83143682a13d0 AVAX0.094214432 26
0xbfd796609c0b6783b5992edd4580a2dc3af149da1b84214b5b49c27189976faaConvert Multiple160523852022-06-15 5:45:38103 days 9 hrs ago0x67f43878dd36d65e15c7faf84aaa47e77d69cc35 IN  0x19e0fb459feecb00fe77654e674c83143682a13d0 AVAX0.094428932 26
0xb17effe5dd79d701590974f5e8b082052b8c6f4dc7af037ab67c9f4691f6855bConvert Multiple154650892022-06-01 15:34:38116 days 23 hrs ago0x67f43878dd36d65e15c7faf84aaa47e77d69cc35 IN  0x19e0fb459feecb00fe77654e674c83143682a13d0 AVAX0.094457272 26
0x6471ba65767a26665a13e286f4db535a17ec97f0d0e763b2271e797ffcde8d8fConvert Multiple150784922022-05-23 16:01:54125 days 23 hrs ago0x67f43878dd36d65e15c7faf84aaa47e77d69cc35 IN  0x19e0fb459feecb00fe77654e674c83143682a13d0 AVAX0.094411382 26
0x68a5bef6d49207d790df5c50bafbdd4fa0dd5e0fd98ca6a04c44f6f90ad39002Convert Multiple146580922022-05-13 21:53:30135 days 17 hrs ago0x67f43878dd36d65e15c7faf84aaa47e77d69cc35 IN  0x19e0fb459feecb00fe77654e674c83143682a13d0 AVAX0.10251805 25
0x41bad27487036b7abdd1d10aa72813f4cdd0094c509f463cf7eba5af7e6b8ba3Convert Multiple142226762022-05-03 14:32:05146 days 42 mins ago0x67f43878dd36d65e15c7faf84aaa47e77d69cc35 IN  0x19e0fb459feecb00fe77654e674c83143682a13d0 AVAX0.408038764482 99.541679602
0xa178c8670e7a5a1b1c46d48d882f2418a9e6cced30cb90f4423b4c9205c45405Convert Multiple139725502022-04-27 15:50:46151 days 23 hrs ago0x67f43878dd36d65e15c7faf84aaa47e77d69cc35 IN  0x19e0fb459feecb00fe77654e674c83143682a13d0 AVAX0.404535668794 98.321671587
0xbf8fc23b8a52de934ea8ef2cbf86d3d86244d7da09f8e1372a84318b81b447edConvert Multiple134193992022-04-14 18:42:50164 days 20 hrs ago0x67f43878dd36d65e15c7faf84aaa47e77d69cc35 IN  0x19e0fb459feecb00fe77654e674c83143682a13d0 AVAX0.279170362811 76.746811126
0xf1db89d98a3e0252ed5d15de5ab3a8003b27e79eddd9b7f0c9aaebecb8f18efcConvert Multiple130750312022-04-06 17:27:23172 days 21 hrs ago0x67f43878dd36d65e15c7faf84aaa47e77d69cc35 IN  0x19e0fb459feecb00fe77654e674c83143682a13d0 AVAX0.431878413676 118.946622184
0xd65e3821776cb128bed41b74f00719a2763a71106dd4611983e4689693bcb550Convert Multiple128202872022-03-31 16:16:15178 days 22 hrs ago0x67f43878dd36d65e15c7faf84aaa47e77d69cc35 IN  0x19e0fb459feecb00fe77654e674c83143682a13d0 AVAX0.403054600675 110.810506348
0xbcc86e3c3ded6290380141a0e8d1cd9d79c10b98607df8b69c86973bbedec6c2Convert Multiple126988632022-03-28 19:48:25181 days 19 hrs ago0x67f43878dd36d65e15c7faf84aaa47e77d69cc35 IN  0x19e0fb459feecb00fe77654e674c83143682a13d0 AVAX0.41442742122 114.033540598
0x66c980051c39289f8b5c06aec84fd8d4d52184bf1a4cf54f28912c0e8e82fce1Convert Multiple124888742022-03-23 21:13:08186 days 18 hrs ago0x67f43878dd36d65e15c7faf84aaa47e77d69cc35 IN  0x19e0fb459feecb00fe77654e674c83143682a13d0 AVAX0.271168580033 74.73645046
0xd35b84f7fcfd6e84418c8d5189455ba82a41002f89ebb3ae96600f53fabbab05Convert Multiple123988842022-03-21 17:45:18188 days 21 hrs ago0x67f43878dd36d65e15c7faf84aaa47e77d69cc35 IN  0x19e0fb459feecb00fe77654e674c83143682a13d0 AVAX0.373119327275 90.867924499
0x8ca35e9e8ac44bb1a8bd3f6f5061896cc4d9673ad7c1c6a916087b084bdae92cConvert Multiple122299272022-03-17 16:32:59192 days 22 hrs ago0x67f43878dd36d65e15c7faf84aaa47e77d69cc35 IN  0x19e0fb459feecb00fe77654e674c83143682a13d0 AVAX0.551274835373 134.144099525
0xd89aea4c04b3dfd94200128e745cd8aa6e172d45f575a4888b9e13efa9314b80Convert Multiple121516782022-03-15 18:48:07194 days 20 hrs ago0x67f43878dd36d65e15c7faf84aaa47e77d69cc35 IN  0x19e0fb459feecb00fe77654e674c83143682a13d0 AVAX0.212720547195 51.679443285
0x177343c4bc42fe75a54548ce473952986199a648a4ce9be308fa69deb01ff0a1Convert Multiple119828752022-03-11 18:34:54198 days 20 hrs ago0x67f43878dd36d65e15c7faf84aaa47e77d69cc35 IN  0x19e0fb459feecb00fe77654e674c83143682a13d0 AVAX0.263583577345 64.031287244
0xfbbaf0ee0ba7f096f4a64fb2fe97e34641926de6964d87621a7f2f35eae53cb0Convert Multiple119013682022-03-09 19:29:09200 days 19 hrs ago0x67f43878dd36d65e15c7faf84aaa47e77d69cc35 IN  0x19e0fb459feecb00fe77654e674c83143682a13d0 AVAX0.186966959802 45.597771656
0x808ec96e4c3235641557c0cc3a3653cd77f000be714df4654ff1142008fe81baConvert Multiple118756102022-03-09 5:03:34201 days 10 hrs ago0x67f43878dd36d65e15c7faf84aaa47e77d69cc35 IN  0x19e0fb459feecb00fe77654e674c83143682a13d0 AVAX0.1027502 25
0x9c8d860230f33102fa89f011462d49c70b84552db5563dfc28082fb2de4851edConvert Multiple118283282022-03-08 2:28:48202 days 12 hrs ago0x67f43878dd36d65e15c7faf84aaa47e77d69cc35 IN  0x19e0fb459feecb00fe77654e674c83143682a13d0 AVAX0.103299418299 25.136296018
0xfef403a76276ad6013bebe554a11618d3dd090a2a8177d091f6d105a390c8a4fConvert Multiple116447102022-03-03 19:56:44206 days 19 hrs ago0x67f43878dd36d65e15c7faf84aaa47e77d69cc35 IN  0x19e0fb459feecb00fe77654e674c83143682a13d0 AVAX0.256393079863 70.379248394
0x72b4da0118084c643c0ec7ecbb9fbee8155b1bb02d2b3c436e1076244b3bf964Convert Multiple115529762022-03-01 16:20:08208 days 22 hrs ago0x67f43878dd36d65e15c7faf84aaa47e77d69cc35 IN  0x19e0fb459feecb00fe77654e674c83143682a13d0 AVAX0.261371356838 71.75221329
0x35d2aec0467695ab81fb97e757324787ff71120625d6bbf408931bc2186b2050Convert Multiple113991822022-02-26 1:15:34212 days 13 hrs ago0x67f43878dd36d65e15c7faf84aaa47e77d69cc35 IN  0x19e0fb459feecb00fe77654e674c83143682a13d0 AVAX0.18169555 50
0x91c3f9b93c8f9ad53bb50a2f21921e2f59169a77a1da1a1b6c402b01f39230feConvert Multiple112610432022-02-22 18:44:25215 days 20 hrs ago0x67f43878dd36d65e15c7faf84aaa47e77d69cc35 IN  0x19e0fb459feecb00fe77654e674c83143682a13d0 AVAX0.555233195394 152.557044844
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
LakeOfHaku

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at snowtrace.io on 2022-02-09
*/

/**
 *Submitted for verification at snowtrace.io on 2022-01-11
*/

// SPDX-License-Identifier: MIT

// P1 - P3: OK
pragma solidity 0.6.12;


/**
 * @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) {
        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly { codehash := extcodehash(account) }
        return (codehash != accountHash && codehash != 0x0);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

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

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

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

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

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () internal {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

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

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

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


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

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

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

    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);

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

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

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

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

    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);

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

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

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function price0CumulativeLast() external view returns (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);

    function mint(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;

    function initialize(address, address) external;
}

interface IUniswapV2Factory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);

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

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

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}

// LakeOfHaku is MasterChef's left hand and kinda a wizard. He can brew Haku from pretty much anything!
// This contract handles "serving up" rewards for xHaku holders by trading tokens collected from fees for Haku.

// T1 - T4: OK
contract LakeOfHaku is Ownable {
    using SafeMath for uint256;
    using SafeERC20 for IERC20;

    IUniswapV2Factory public immutable factory;

    address public immutable xhaku;
    address private immutable haku;
    address private immutable wftm;
    uint public devCut = 0;  // in basis points aka parts per 10,000 so 5000 is 50%, cap of 50%, default is 0
    address public devAddr;

    // set of addresses that can perform certain functions
    mapping(address => bool) public isAuth;
    address[] public authorized;
    bool public anyAuth = false;

    modifier onlyAuth() {
        require(isAuth[msg.sender] || anyAuth, "LakeOfHaku: FORBIDDEN");
        _;
    }

    // V1 - V5: OK
    mapping(address => address) internal _bridges;

    event SetDevAddr(address _addr);
    event SetDevCut(uint _amount);
    event LogBridgeSet(address indexed token, address indexed bridge);
    event LogConvert(
        address indexed server,
        address indexed token0,
        address indexed token1,
        uint256 amount0,
        uint256 amount1,
        uint256 amountHAKU
    );

    constructor(
        address _factory,
        address _xhaku,
        address _haku,
        address _wftm
    ) public {
        factory = IUniswapV2Factory(_factory);
        xhaku = _xhaku;
        haku = _haku;
        wftm = _wftm;
        devAddr = msg.sender;
        isAuth[msg.sender] = true;
        authorized.push(msg.sender);
    }
    // Begin Owner functions
    function addAuth(address _auth) external onlyOwner {
        isAuth[_auth] = true;
        authorized.push(_auth);
    }

    function revokeAuth(address _auth) external onlyOwner {
        isAuth[_auth] = false;
    }

    // setting anyAuth to true allows anyone to call functions protected by onlyAuth
    function setAnyAuth(bool access) external onlyOwner {
        anyAuth = access;
    }

    function setBridge(address token, address bridge) external onlyOwner {
        // Checks
        require(
            token != haku && token != wftm && token != bridge,
            "LakeOfHaku: Invalid bridge"
        );

        // Effects
        _bridges[token] = bridge;
        emit LogBridgeSet(token, bridge);
    }

    function setDevCut(uint _amount) external onlyOwner {
        require(_amount <= 5000, "setDevCut: cut too high");
        devCut = _amount;
        
        emit SetDevCut(_amount);
    }

    function setDevAddr(address _addr) external onlyOwner {
        require(_addr != address(0), "setDevAddr, address cannot be zero address");
        devAddr = _addr;

        emit SetDevAddr(_addr);
    }
    // End owner functions

    function bridgeFor(address token) public view returns (address bridge) {
        bridge = _bridges[token];
        if (bridge == address(0)) {
            bridge = wftm;
        }
    }

    // C6: It's not a fool proof solution, but it prevents flash loans, so here it's ok to use tx.origin
    modifier onlyEOA() {
        // Try to make flash-loan exploit harder to do by only allowing externally owned addresses.
        require(msg.sender == tx.origin, "LakeOfHaku: must use EOA");
        _;
    }

    // F1 - F10: OK
    // F3: _convert is separate to save gas by only checking the 'onlyEOA' modifier once in case of convertMultiple
    // F6: There is an exploit to add lots of HAKU to the xhaku, run convert, then remove the HAKU again.
    //     As the size of the Hakuxhaku has grown, this requires large amounts of funds and isn't super profitable anymore
    //     The onlyEOA modifier prevents this being done with a flash loan.
    // C1 - C24: OK
    function convert(address token0, address token1) external onlyEOA() onlyAuth() {
        _convert(token0, token1);
    }

    // F1 - F10: OK, see convert
    // C1 - C24: OK
    // C3: Loop is under control of the caller
    function convertMultiple(
        address[] calldata token0,
        address[] calldata token1
    ) external onlyEOA() onlyAuth() {
        // TODO: This can be optimized a fair bit, but this is safer and simpler for now
        uint256 len = token0.length;
        for (uint256 i = 0; i < len; i++) {
            _convert(token0[i], token1[i]);
        }
    }

    // F1 - F10: OK
    // C1- C24: OK
    function _convert(address token0, address token1) internal {
        uint256 amount0;
        uint256 amount1;

        // handle case where non-LP tokens need to be converted
        if(token0 == token1) {
            amount0 = IERC20(token0).balanceOf(address(this));
            amount1 = 0;
        }
        else {

            IUniswapV2Pair pair = IUniswapV2Pair(factory.getPair(token0, token1));
            require(address(pair) != address(0), "LakeOfHaku: Invalid pair");

            IERC20(address(pair)).safeTransfer(
                address(pair),
                pair.balanceOf(address(this))
            );

            // take balance of tokens in this contract before burning the pair, incase there are already some here
            uint tok0bal = IERC20(token0).balanceOf(address(this));
            uint tok1bal = IERC20(token1).balanceOf(address(this));

            pair.burn(address(this));

            // subtract old balance of tokens from new balance
            // the return values of pair.burn cant be trusted due to transfer tax tokens
            amount0 = IERC20(token0).balanceOf(address(this)).sub(tok0bal);
            amount1 = IERC20(token1).balanceOf(address(this)).sub(tok1bal);
            
        }
        emit LogConvert(
            msg.sender,
            token0,
            token1,
            amount0,
            amount1,
            _convertStep(token0, token1, amount0, amount1)
        );
    }

    // F1 - F10: OK
    // C1 - C24: OK
    // All safeTransfer, _swap, _toHAKU, _convertStep: X1 - X5: OK
    function _convertStep(
        address token0,
        address token1,
        uint256 amount0,
        uint256 amount1
    ) internal returns (uint256 hakuOut) {
        // Interactions
        if (token0 == token1) {
            uint256 amount = amount0.add(amount1);
            if (token0 == haku) {
                IERC20(haku).safeTransfer(xhaku, amount);
                hakuOut = amount;
            } else if (token0 == wftm) {
                hakuOut = _toHAKU(wftm, amount);
            } else {
                address bridge = bridgeFor(token0);
                amount = _swap(token0, bridge, amount, address(this));
                hakuOut = _convertStep(bridge, bridge, amount, 0);
            }
        } else if (token0 == haku) {
            // eg. HAKU - ETH
            IERC20(haku).safeTransfer(xhaku, amount0);
            hakuOut = _toHAKU(token1, amount1).add(amount0);
        } else if (token1 == haku) {
            // eg. USDT - HAKU
            IERC20(haku).safeTransfer(xhaku, amount1);
            hakuOut = _toHAKU(token0, amount0).add(amount1);
        } else if (token0 == wftm) {
            // eg. ETH - USDC
            hakuOut = _toHAKU(
                wftm,
                _swap(token1, wftm, amount1, address(this)).add(amount0)
            );
        } else if (token1 == wftm) {
            // eg. USDT - ETH
            hakuOut = _toHAKU(
                wftm,
                _swap(token0, wftm, amount0, address(this)).add(amount1)
            );
        } else {
            // eg. MIC - USDT
            address bridge0 = bridgeFor(token0);
            address bridge1 = bridgeFor(token1);
            if (bridge0 == token1) {
                // eg. MIC - USDT - and bridgeFor(MIC) = USDT
                hakuOut = _convertStep(
                    bridge0,
                    token1,
                    _swap(token0, bridge0, amount0, address(this)),
                    amount1
                );
            } else if (bridge1 == token0) {
                // eg. WBTC - DSD - and bridgeFor(DSD) = WBTC
                hakuOut = _convertStep(
                    token0,
                    bridge1,
                    amount0,
                    _swap(token1, bridge1, amount1, address(this))
                );
            } else {
                hakuOut = _convertStep(
                    bridge0,
                    bridge1, // eg. USDT - DSD - and bridgeFor(DSD) = WBTC
                    _swap(token0, bridge0, amount0, address(this)),
                    _swap(token1, bridge1, amount1, address(this))
                );
            }
        }
    }

    // F1 - F10: OK
    // C1 - C24: OK
    // All safeTransfer, swap: X1 - X5: OK
    function _swap(
        address fromToken,
        address toToken,
        uint256 amountIn,
        address to
    ) internal returns (uint256 amountOut) {
        // Checks
        // X1 - X5: OK
        IUniswapV2Pair pair =
            IUniswapV2Pair(factory.getPair(fromToken, toToken));
        require(address(pair) != address(0), "LakeOfHaku: Cannot convert");

        (uint256 reserve0, uint256 reserve1, ) = pair.getReserves();
        (uint reserveInput, uint reserveOutput) = fromToken == pair.token0() ? (reserve0, reserve1) : (reserve1, reserve0);
        IERC20(fromToken).safeTransfer(address(pair), amountIn);
        uint amountInput = IERC20(fromToken).balanceOf(address(pair)).sub(reserveInput); // calculate amount that was transferred, this accounts for transfer taxes

        amountOut = getAmountOut(amountInput, reserveInput, reserveOutput);
        (uint amount0Out, uint amount1Out) = fromToken == pair.token0() ? (uint(0), amountOut) : (amountOut, uint(0));
        pair.swap(amount0Out, amount1Out, to, new bytes(0));        
    }

    // F1 - F10: OK
    // C1 - C24: OK
    function _toHAKU(address token, uint256 amountIn)
        internal
        returns (uint256 amountOut)
    {   
        uint256 amount = amountIn;
        if (devCut > 0) {
            amount = amount.mul(devCut).div(10000);
            IERC20(token).safeTransfer(devAddr, amount);
            amount = amountIn.sub(amount);
        }
        amountOut = _swap(token, haku, amount, xhaku);
    }

    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) internal pure returns (uint amountOut) {
        require(amountIn > 0, 'LakeOfHaku: INSUFFICIENT_INPUT_AMOUNT');
        require(reserveIn > 0 && reserveOut > 0, 'LakeOfHaku: INSUFFICIENT_LIQUIDITY');
        uint amountInWithFee = amountIn.mul(998);
        uint numerator = amountInWithFee.mul(reserveOut);
        uint denominator = reserveIn.mul(1000).add(amountInWithFee);
        amountOut = numerator / denominator;
    }
}

Contract ABI

[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_xhaku","type":"address"},{"internalType":"address","name":"_haku","type":"address"},{"internalType":"address","name":"_wftm","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"bridge","type":"address"}],"name":"LogBridgeSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"server","type":"address"},{"indexed":true,"internalType":"address","name":"token0","type":"address"},{"indexed":true,"internalType":"address","name":"token1","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountHAKU","type":"uint256"}],"name":"LogConvert","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_addr","type":"address"}],"name":"SetDevAddr","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"SetDevCut","type":"event"},{"inputs":[{"internalType":"address","name":"_auth","type":"address"}],"name":"addAuth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"anyAuth","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"authorized","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"bridgeFor","outputs":[{"internalType":"address","name":"bridge","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token0","type":"address"},{"internalType":"address","name":"token1","type":"address"}],"name":"convert","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"token0","type":"address[]"},{"internalType":"address[]","name":"token1","type":"address[]"}],"name":"convertMultiple","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devCut","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"contract IUniswapV2Factory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isAuth","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_auth","type":"address"}],"name":"revokeAuth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"access","type":"bool"}],"name":"setAnyAuth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"bridge","type":"address"}],"name":"setBridge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"setDevAddr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setDevCut","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"xhaku","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

61010060405260006001556000600560006101000a81548160ff0219169083151502179055503480156200003257600080fd5b5060405162003ab838038062003ab8833981810160405260808110156200005857600080fd5b81019080805190602001909291908051906020019092919080519060200190929190805190602001909291905050506000620000996200031960201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3508373ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b815250508273ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff1660601b815250508173ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff1660601b815250508073ffffffffffffffffffffffffffffffffffffffff1660e08173ffffffffffffffffffffffffffffffffffffffff1660601b8152505033600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506004339080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505062000321565b600033905090565b60805160601c60a05160601c60c05160601c60e05160601c6136e7620003d160003980610fea528061125a528061226c52806122c352806124e8528061253f528061256852806125aa5280612601528061262a525080610f9352806121a5528061221e5280612324528061239d5280612406528061247f5280612a3952508061190152806121fc528061237b528061245d5280612a5b5250806114085280611a0b5280612a8d52506136e76000f3fe608060405234801561001057600080fd5b50600436106101215760003560e01c80639c286837116100ad578063da09c72c11610071578063da09c72c14610544578063dbcc106d14610578578063f2fde38b146105a6578063f8171dfa146105ea578063f942bbbf1461062e57610121565b80639c286837146103bc5780639d22ae8c146103da578063a761a9391461043e578063bd1b820c146104ac578063c45a01551461051057610121565b8063313a3a98116100f4578063313a3a98146102c65780635422224e146102f65780636ebb64a21461033a578063715018a61461037e5780638da5cb5b1461038857610121565b80630d48669a146101265780631d01548e1461017e5780632520e7ff1461019e578063303e6aa4146101f8575b600080fd5b6101526004803603602081101561013c57600080fd5b8101908080359060200190929190505050610662565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61018661069e565b60405180821515815260200191505060405180910390f35b6101e0600480360360208110156101b457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506106b1565b60405180821515815260200191505060405180910390f35b6102c46004803603604081101561020e57600080fd5b810190808035906020019064010000000081111561022b57600080fd5b82018360208201111561023d57600080fd5b8035906020019184602083028401116401000000008311171561025f57600080fd5b90919293919293908035906020019064010000000081111561028057600080fd5b82018360208201111561029257600080fd5b803590602001918460208302840111640100000000831117156102b457600080fd5b90919293919293905050506106d1565b005b6102f4600480360360208110156102dc57600080fd5b810190808035151590602001909291905050506108ca565b005b6103386004803603602081101561030c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506109af565b005b61037c6004803603602081101561035057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610b35565b005b610386610d14565b005b610390610e9a565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6103c4610ec3565b6040518082815260200191505060405180910390f35b61043c600480360360408110156103f057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610ec9565b005b6104806004803603602081101561045457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506111bf565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61050e600480360360408110156104c257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611281565b005b610518611406565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61054c61142a565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6105a46004803603602081101561058e57600080fd5b8101908080359060200190929190505050611450565b005b6105e8600480360360208110156105bc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506115d1565b005b61062c6004803603602081101561060057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506117dc565b005b6106366118ff565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6004818154811061066f57fe5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600560009054906101000a900460ff1681565b60036020528060005260406000206000915054906101000a900460ff1681565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610772576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f4c616b654f6648616b753a206d7573742075736520454f41000000000000000081525060200191505060405180910390fd5b600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806107d65750600560009054906101000a900460ff165b610848576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4c616b654f6648616b753a20464f5242494444454e000000000000000000000081525060200191505060405180910390fd5b600084849050905060005b818110156108c2576108b586868381811061086a57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1685858481811061089357fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff16611923565b8080600101915050610853565b505050505050565b6108d2612062565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610992576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600560006101000a81548160ff02191690831515021790555050565b6109b7612062565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610a77576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506004819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610b3d612062565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610bfd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610c83576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a81526020018061365e602a913960400191505060405180910390fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f45c73fc162405abe4471c4228f0797176ac32cb9f7be4a25a67cbd1dda6d007e81604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b610d1c612062565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610ddc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60015481565b610ed1612062565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610f91576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415801561103957507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b801561107157508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b6110e3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f4c616b654f6648616b753a20496e76616c69642062726964676500000000000081525060200191505060405180910390fd5b80600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f2e103aa707acc565f9a1547341914802b2bfe977fd79c595209f248ae4b0061360405160405180910390a35050565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561127c577f000000000000000000000000000000000000000000000000000000000000000090505b919050565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611322576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f4c616b654f6648616b753a206d7573742075736520454f41000000000000000081525060200191505060405180910390fd5b600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806113865750600560009054906101000a900460ff165b6113f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4c616b654f6648616b753a20464f5242494444454e000000000000000000000081525060200191505060405180910390fd5b6114028282611923565b5050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611458612062565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611518576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b611388811115611590576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f7365744465764375743a2063757420746f6f206869676800000000000000000081525060200191505060405180910390fd5b806001819055507f914990c75916d406c148e7fca9308486d7806a77c0ef66119c9329add5885d2e816040518082815260200191505060405180910390a150565b6115d9612062565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611699576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561171f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806135d06026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6117e4612062565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146118a4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611a07578373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156119c157600080fd5b505afa1580156119d5573d6000803e3d6000fd5b505050506040513d60208110156119eb57600080fd5b8101908080519060200190929190505050915060009050611fc5565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663e6a4390586866040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b158015611aae57600080fd5b505afa158015611ac2573d6000803e3d6000fd5b505050506040513d6020811015611ad857600080fd5b81019080805190602001909291905050509050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b8e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f4c616b654f6648616b753a20496e76616c69642070616972000000000000000081525060200191505060405180910390fd5b611c5a818273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611bf957600080fd5b505afa158015611c0d573d6000803e3d6000fd5b505050506040513d6020811015611c2357600080fd5b81019080805190602001909291905050508373ffffffffffffffffffffffffffffffffffffffff1661206a9092919063ffffffff16565b60008573ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611cc357600080fd5b505afa158015611cd7573d6000803e3d6000fd5b505050506040513d6020811015611ced57600080fd5b8101908080519060200190929190505050905060008573ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611d6957600080fd5b505afa158015611d7d573d6000803e3d6000fd5b505050506040513d6020811015611d9357600080fd5b810190808051906020019092919050505090508273ffffffffffffffffffffffffffffffffffffffff166389afcb44306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1681526020019150506040805180830381600087803b158015611e0e57600080fd5b505af1158015611e22573d6000803e3d6000fd5b505050506040513d6040811015611e3857600080fd5b8101908080519060200190929190805190602001909291905050505050611f09828873ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611ec057600080fd5b505afa158015611ed4573d6000803e3d6000fd5b505050506040513d6020811015611eea57600080fd5b810190808051906020019092919050505061210c90919063ffffffff16565b9450611fbf818773ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611f7657600080fd5b505afa158015611f8a573d6000803e3d6000fd5b505050506040513d6020811015611fa057600080fd5b810190808051906020019092919050505061210c90919063ffffffff16565b93505050505b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fd06b1d7ed79b664d17472c6f6997b929f1abe463ccccb4e5b6a0038f2f730c1585856120398a8a8a8a612156565b60405180848152602001838152602001828152602001935050505060405180910390a450505050565b600033905090565b6121078363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061275d565b505050565b600061214e83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061284c565b905092915050565b60008373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156123225760006121a1838561290c90919063ffffffff16565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16141561226a576122627f0000000000000000000000000000000000000000000000000000000000000000827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1661206a9092919063ffffffff16565b80915061231c565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614156122ef576122e87f000000000000000000000000000000000000000000000000000000000000000082612994565b915061231b565b60006122fa876111bf565b905061230887828430612a88565b91506123178182846000612156565b9250505b5b50612755565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612404576123e17f0000000000000000000000000000000000000000000000000000000000000000847f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1661206a9092919063ffffffff16565b6123fd836123ef8685612994565b61290c90919063ffffffff16565b9050612754565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156124e6576124c37f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1661206a9092919063ffffffff16565b6124df826124d18786612994565b61290c90919063ffffffff16565b9050612753565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156125a8576125a17f000000000000000000000000000000000000000000000000000000000000000061259c8561258e887f00000000000000000000000000000000000000000000000000000000000000008830612a88565b61290c90919063ffffffff16565b612994565b9050612752565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561266a576126637f000000000000000000000000000000000000000000000000000000000000000061265e84612650897f00000000000000000000000000000000000000000000000000000000000000008930612a88565b61290c90919063ffffffff16565b612994565b9050612751565b6000612675866111bf565b90506000612682866111bf565b90508573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156126d6576126cf82876126c98a868a30612a88565b87612156565b925061274e565b8673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156127285761272187828761271c8a868a30612a88565b612156565b925061274d565b61274a82826127398a868a30612a88565b6127458a868a30612a88565b612156565b92505b5b50505b5b5b5b5b949350505050565b60606127bf826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166130a09092919063ffffffff16565b9050600081511115612847578080602001905160208110156127e057600080fd5b8101908080519060200190929190505050612846576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180613688602a913960400191505060405180910390fd5b5b505050565b60008383111582906128f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156128be5780820151818401526020810190506128a3565b50505050905090810190601f1680156128eb5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b60008082840190508381101561298a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b60008082905060006001541115612a33576129ce6127106129c0600154846130b890919063ffffffff16565b61313e90919063ffffffff16565b9050612a1d600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16828673ffffffffffffffffffffffffffffffffffffffff1661206a9092919063ffffffff16565b612a30818461210c90919063ffffffff16565b90505b612a7f847f0000000000000000000000000000000000000000000000000000000000000000837f0000000000000000000000000000000000000000000000000000000000000000612a88565b91505092915050565b6000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663e6a4390587876040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b158015612b3057600080fd5b505afa158015612b44573d6000803e3d6000fd5b505050506040513d6020811015612b5a57600080fd5b81019080805190602001909291905050509050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612c10576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f4c616b654f6648616b753a2043616e6e6f7420636f6e7665727400000000000081525060200191505060405180910390fd5b6000808273ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015612c5957600080fd5b505afa158015612c6d573d6000803e3d6000fd5b505050506040513d6060811015612c8357600080fd5b81019080805190602001909291908051906020019092919080519060200190929190505050506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff1691506000808473ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b158015612d1657600080fd5b505afa158015612d2a573d6000803e3d6000fd5b505050506040513d6020811015612d4057600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff1614612d8a578284612d8d565b83835b91509150612dbc85898c73ffffffffffffffffffffffffffffffffffffffff1661206a9092919063ffffffff16565b6000612e72838c73ffffffffffffffffffffffffffffffffffffffff166370a08231896040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612e2957600080fd5b505afa158015612e3d573d6000803e3d6000fd5b505050506040513d6020811015612e5357600080fd5b810190808051906020019092919050505061210c90919063ffffffff16565b9050612e7f818484613188565b96506000808773ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b158015612eca57600080fd5b505afa158015612ede573d6000803e3d6000fd5b505050506040513d6020811015612ef457600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff168d73ffffffffffffffffffffffffffffffffffffffff1614612f3f57886000612f43565b6000895b915091508773ffffffffffffffffffffffffffffffffffffffff1663022c0d9f83838d600067ffffffffffffffff81118015612f7e57600080fd5b506040519080825280601f01601f191660200182016040528015612fb15781602001600182028036833780820191505090505b506040518563ffffffff1660e01b8152600401808581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561302957808201518184015260208101905061300e565b50505050905090810190601f1680156130565780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b15801561307857600080fd5b505af115801561308c573d6000803e3d6000fd5b505050505050505050505050949350505050565b60606130af84846000856132b8565b90509392505050565b6000808314156130cb5760009050613138565b60008284029050828482816130dc57fe5b0414613133576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806136186021913960400191505060405180910390fd5b809150505b92915050565b600061318083836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506134be565b905092915050565b60008084116131e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806136396025913960400191505060405180910390fd5b6000831180156131f25750600082115b613247576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806135f66022913960400191505060405180910390fd5b600061325e6103e6866130b890919063ffffffff16565b9050600061327584836130b890919063ffffffff16565b905060006132a0836132926103e8896130b890919063ffffffff16565b61290c90919063ffffffff16565b90508082816132ab57fe5b0493505050509392505050565b60606132c385613584565b613335576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b602083106133855780518252602082019150602081019050602083039250613362565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146133e7576040519150601f19603f3d011682016040523d82523d6000602084013e6133ec565b606091505b509150915081156134015780925050506134b6565b6000815111156134145780518082602001fd5b836040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561347b578082015181840152602081019050613460565b50505050905090810190601f1680156134a85780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b949350505050565b6000808311829061356a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561352f578082015181840152602081019050613514565b50505050905090810190601f16801561355c5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161357657fe5b049050809150509392505050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f91508082141580156135c657506000801b8214155b9250505091905056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734c616b654f6648616b753a20494e53554646494349454e545f4c4951554944495459536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774c616b654f6648616b753a20494e53554646494349454e545f494e5055545f414d4f554e54736574446576416464722c20616464726573732063616e6e6f74206265207a65726f20616464726573735361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220ec76435b560ccfd6ab61bfd9d0e457db29e11d6f636f5a6bbba5f7998cdd2b4b64736f6c634300060c00330000000000000000000000002db46feb38c57a6621bca4d97820e1fc1de40f41000000000000000000000000a95c238b5a72f481f6abd50f951f01891130b441000000000000000000000000695fa794d59106cebd40ab5f5ca19f458c723829000000000000000000000000b31f66aa3c1e785363f0875a1b74e27b85fd66c7

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

0000000000000000000000002db46feb38c57a6621bca4d97820e1fc1de40f41000000000000000000000000a95c238b5a72f481f6abd50f951f01891130b441000000000000000000000000695fa794d59106cebd40ab5f5ca19f458c723829000000000000000000000000b31f66aa3c1e785363f0875a1b74e27b85fd66c7

-----Decoded View---------------
Arg [0] : _factory (address): 0x2db46feb38c57a6621bca4d97820e1fc1de40f41
Arg [1] : _xhaku (address): 0xa95c238b5a72f481f6abd50f951f01891130b441
Arg [2] : _haku (address): 0x695fa794d59106cebd40ab5f5ca19f458c723829
Arg [3] : _wftm (address): 0xb31f66aa3c1e785363f0875a1b74e27b85fd66c7

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000002db46feb38c57a6621bca4d97820e1fc1de40f41
Arg [1] : 000000000000000000000000a95c238b5a72f481f6abd50f951f01891130b441
Arg [2] : 000000000000000000000000695fa794d59106cebd40ab5f5ca19f458c723829
Arg [3] : 000000000000000000000000b31f66aa3c1e785363f0875a1b74e27b85fd66c7


Deployed ByteCode Sourcemap

25543:10813:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26058:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;26092;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;26013:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;29498:371;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;27395:87;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;27076:123;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;28031:208;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;20504:148;;;:::i;:::-;;19862:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;25811:22;;;:::i;:::-;;;;;;;;;;;;;;;;;;;27490:332;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;28275:190;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;29265:122;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;25649:42;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;25922:22;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;27830:193;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;20807:244;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;27207:94;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;25700:30;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;26058:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;26092:::-;;;;;;;;;;;;;:::o;26013:38::-;;;;;;;;;;;;;;;;;;;;;;:::o;29498:371::-;28732:9;28718:23;;:10;:23;;;28710:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26167:6:::1;:18;26174:10;26167:18;;;;;;;;;;;;;;;;;;;;;;;;;:29;;;;26189:7;;;;;;;;;;;26167:29;26159:63;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;29733:11:::2;29747:6;;:13;;29733:27;;29776:9;29771:91;29795:3;29791:1;:7;29771:91;;;29820:30;29829:6;;29836:1;29829:9;;;;;;;;;;;;;;;29840:6;;29847:1;29840:9;;;;;;;;;;;;;;;29820:8;:30::i;:::-;29800:3;;;;;;;29771:91;;;;26233:1;29498:371:::0;;;;:::o;27395:87::-;20084:12;:10;:12::i;:::-;20074:22;;:6;;;;;;;;;;:22;;;20066:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27468:6:::1;27458:7;;:16;;;;;;;;;;;;;;;;;;27395:87:::0;:::o;27076:123::-;20084:12;:10;:12::i;:::-;20074:22;;:6;;;;;;;;;;:22;;;20066:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27154:4:::1;27138:6;:13;27145:5;27138:13;;;;;;;;;;;;;;;;:20;;;;;;;;;;;;;;;;;;27169:10;27185:5;27169:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27076:123:::0;:::o;28031:208::-;20084:12;:10;:12::i;:::-;20074:22;;:6;;;;;;;;;;:22;;;20066:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28121:1:::1;28104:19;;:5;:19;;;;28096:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28191:5;28181:7;;:15;;;;;;;;;;;;;;;;;;28214:17;28225:5;28214:17;;;;;;;;;;;;;;;;;;;;28031:208:::0;:::o;20504:148::-;20084:12;:10;:12::i;:::-;20074:22;;:6;;;;;;;;;;:22;;;20066:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20611:1:::1;20574:40;;20595:6;::::0;::::1;;;;;;;;20574:40;;;;;;;;;;;;20642:1;20625:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;20504:148::o:0;19862:79::-;19900:7;19927:6;;;;;;;;;;;19920:13;;19862:79;:::o;25811:22::-;;;;:::o;27490:332::-;20084:12;:10;:12::i;:::-;20074:22;;:6;;;;;;;;;;:22;;;20066:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27620:4:::1;27611:13;;:5;:13;;;;:30;;;;;27637:4;27628:13;;:5;:13;;;;27611:30;:49;;;;;27654:6;27645:15;;:5;:15;;;;27611:49;27589:125;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;27765:6;27747:8;:15;27756:5;27747:15;;;;;;;;;;;;;;;;:24;;;;;;;;;;;;;;;;;;27807:6;27787:27;;27800:5;27787:27;;;;;;;;;;;;27490:332:::0;;:::o;28275:190::-;28330:14;28366:8;:15;28375:5;28366:15;;;;;;;;;;;;;;;;;;;;;;;;;28357:24;;28414:1;28396:20;;:6;:20;;;28392:66;;;28442:4;28433:13;;28392:66;28275:190;;;:::o;29265:122::-;28732:9;28718:23;;:10;:23;;;28710:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26167:6:::1;:18;26174:10;26167:18;;;;;;;;;;;;;;;;;;;;;;;;;:29;;;;26189:7;;;;;;;;;;;26167:29;26159:63;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;29355:24:::2;29364:6;29372;29355:8;:24::i;:::-;29265:122:::0;;:::o;25649:42::-;;;:::o;25922:22::-;;;;;;;;;;;;;:::o;27830:193::-;20084:12;:10;:12::i;:::-;20074:22;;:6;;;;;;;;;;:22;;;20066:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27912:4:::1;27901:7;:15;;27893:51;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;27964:7;27955:6;:16;;;;27997:18;28007:7;27997:18;;;;;;;;;;;;;;;;;;27830:193:::0;:::o;20807:244::-;20084:12;:10;:12::i;:::-;20074:22;;:6;;;;;;;;;;:22;;;20066:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20916:1:::1;20896:22;;:8;:22;;;;20888:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21006:8;20977:38;;20998:6;::::0;::::1;;;;;;;;20977:38;;;;;;;;;;;;21035:8;21026:6;::::0;:17:::1;;;;;;;;;;;;;;;;;;20807:244:::0;:::o;27207:94::-;20084:12;:10;:12::i;:::-;20074:22;;:6;;;;;;;;;;:22;;;20066:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27288:5:::1;27272:6;:13;27279:5;27272:13;;;;;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;27207:94:::0;:::o;25700:30::-;;;:::o;29918:1487::-;29988:15;30014;30120:6;30110:16;;:6;:16;;;30107:1082;;;30160:6;30153:24;;;30186:4;30153:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30143:49;;30217:1;30207:11;;30107:1082;;;30262:19;30299:7;:15;;;30315:6;30323;30299:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30262:69;;30379:1;30354:27;;30362:4;30354:27;;;;30346:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30427:129;30488:4;30512;:14;;;30535:4;30512:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30442:4;30427:34;;;;:129;;;;;:::i;:::-;30689:12;30711:6;30704:24;;;30737:4;30704:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30689:54;;30758:12;30780:6;30773:24;;;30806:4;30773:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30758:54;;30829:4;:9;;;30847:4;30829:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31034:52;31078:7;31041:6;31034:24;;;31067:4;31034:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:43;;:52;;;;:::i;:::-;31024:62;;31111:52;31155:7;31118:6;31111:24;;;31144:4;31111:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:43;;:52;;;;:::i;:::-;31101:62;;30107:1082;;;;31275:6;31204:193;;31254:6;31204:193;;31229:10;31204:193;;;31296:7;31318;31340:46;31353:6;31361;31369:7;31378;31340:12;:46::i;:::-;31204:193;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29918:1487;;;;:::o;18500:106::-;18553:15;18588:10;18581:17;;18500:106;:::o;9584:177::-;9667:86;9687:5;9717:23;;;9742:2;9746:5;9694:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9667:19;:86::i;:::-;9584:177;;;:::o;13961:136::-;14019:7;14046:43;14050:1;14053;14046:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;14039:50;;13961:136;;;;:::o;31523:2684::-;31672:15;31739:6;31729:16;;:6;:16;;;31725:2475;;;31762:14;31779:20;31791:7;31779;:11;;:20;;;;:::i;:::-;31762:37;;31828:4;31818:14;;:6;:14;;;31814:437;;;31853:40;31879:5;31886:6;31860:4;31853:25;;;;:40;;;;;:::i;:::-;31922:6;31912:16;;31814:437;;;31964:4;31954:14;;:6;:14;;;31950:301;;;31999:21;32007:4;32013:6;31999:7;:21::i;:::-;31989:31;;31950:301;;;32061:14;32078:17;32088:6;32078:9;:17::i;:::-;32061:34;;32123:44;32129:6;32137;32145;32161:4;32123:5;:44::i;:::-;32114:53;;32196:39;32209:6;32217;32225;32233:1;32196:12;:39::i;:::-;32186:49;;31950:301;;31814:437;31725:2475;;;;32282:4;32272:14;;:6;:14;;;32268:1932;;;32334:41;32360:5;32367:7;32341:4;32334:25;;;;:41;;;;;:::i;:::-;32400:37;32429:7;32400:24;32408:6;32416:7;32400;:24::i;:::-;:28;;:37;;;;:::i;:::-;32390:47;;32268:1932;;;32469:4;32459:14;;:6;:14;;;32455:1745;;;32522:41;32548:5;32555:7;32529:4;32522:25;;;;:41;;;;;:::i;:::-;32588:37;32617:7;32588:24;32596:6;32604:7;32588;:24::i;:::-;:28;;:37;;;;:::i;:::-;32578:47;;32455:1745;;;32657:4;32647:14;;:6;:14;;;32643:1557;;;32719:120;32745:4;32768:56;32816:7;32768:43;32774:6;32782:4;32788:7;32805:4;32768:5;:43::i;:::-;:47;;:56;;;;:::i;:::-;32719:7;:120::i;:::-;32709:130;;32643:1557;;;32871:4;32861:14;;:6;:14;;;32857:1343;;;32933:120;32959:4;32982:56;33030:7;32982:43;32988:6;32996:4;33002:7;33019:4;32982:5;:43::i;:::-;:47;;:56;;;;:::i;:::-;32933:7;:120::i;:::-;32923:130;;32857:1343;;;33117:15;33135:17;33145:6;33135:9;:17::i;:::-;33117:35;;33167:15;33185:17;33195:6;33185:9;:17::i;:::-;33167:35;;33232:6;33221:17;;:7;:17;;;33217:972;;;33332:189;33367:7;33397:6;33426:46;33432:6;33440:7;33449;33466:4;33426:5;:46::i;:::-;33495:7;33332:12;:189::i;:::-;33322:199;;33217:972;;;33558:6;33547:17;;:7;:17;;;33543:646;;;33658:189;33693:6;33722:7;33752;33782:46;33788:6;33796:7;33805;33822:4;33782:5;:46::i;:::-;33658:12;:189::i;:::-;33648:199;;33543:646;;;33898:275;33933:7;33963;34039:46;34045:6;34053:7;34062;34079:4;34039:5;:46::i;:::-;34108;34114:6;34122:7;34131;34148:4;34108:5;:46::i;:::-;33898:12;:275::i;:::-;33888:285;;33543:646;33217:972;32857:1343;;;32643:1557;32455:1745;32268:1932;31725:2475;31523:2684;;;;;;:::o;11889:761::-;12313:23;12339:69;12367:4;12339:69;;;;;;;;;;;;;;;;;12347:5;12339:27;;;;:69;;;;;:::i;:::-;12313:95;;12443:1;12423:10;:17;:21;12419:224;;;12565:10;12554:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12546:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12419:224;11889:761;;;:::o;14400:192::-;14486:7;14519:1;14514;:6;;14522:12;14506:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14546:9;14562:1;14558;:5;14546:17;;14583:1;14576:8;;;14400:192;;;;;:::o;13497:181::-;13555:7;13575:9;13591:1;13587;:5;13575:17;;13616:1;13611;:6;;13603:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13669:1;13662:8;;;13497:181;;;;:::o;35434:406::-;35520:17;35558:14;35575:8;35558:25;;35607:1;35598:6;;:10;35594:183;;;35634:29;35657:5;35634:18;35645:6;;35634;:10;;:18;;;;:::i;:::-;:22;;:29;;;;:::i;:::-;35625:38;;35678:43;35705:7;;;;;;;;;;;35714:6;35685:5;35678:26;;;;:43;;;;;:::i;:::-;35745:20;35758:6;35745:8;:12;;:20;;;;:::i;:::-;35736:29;;35594:183;35799:33;35805:5;35812:4;35818:6;35826:5;35799;:33::i;:::-;35787:45;;35434:406;;;;;:::o;34301:1083::-;34443:17;34516:19;34566:7;:15;;;34582:9;34593:7;34566:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34516:86;;34646:1;34621:27;;34629:4;34621:27;;;;34613:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34693:16;34711;34733:4;:16;;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34692:59;;;;;;;;;34763:17;34782:18;34817:4;:11;;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34804:26;;:9;:26;;;:72;;34857:8;34867;34804:72;;;34834:8;34844;34804:72;34762:114;;;;34887:55;34926:4;34933:8;34894:9;34887:30;;;;:55;;;;;:::i;:::-;34953:16;34972:60;35019:12;34979:9;34972:27;;;35008:4;34972:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:46;;:60;;;;:::i;:::-;34953:79;;35132:54;35145:11;35158:12;35172:13;35132:12;:54::i;:::-;35120:66;;35198:15;35215;35247:4;:11;;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35234:26;;:9;:26;;;:72;;35287:9;35303:1;35234:72;;;35269:1;35273:9;35234:72;35197:109;;;;35317:4;:9;;;35327:10;35339;35351:2;35365:1;35355:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35317:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34301:1083;;;;;;;;;;;;;;:::o;6662:196::-;6765:12;6797:53;6820:6;6828:4;6834:1;6837:12;6797:22;:53::i;:::-;6790:60;;6662:196;;;;;:::o;14851:471::-;14909:7;15159:1;15154;:6;15150:47;;;15184:1;15177:8;;;;15150:47;15209:9;15225:1;15221;:5;15209:17;;15254:1;15249;15245;:5;;;;;;:10;15237:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15313:1;15306:8;;;14851:471;;;;;:::o;15798:132::-;15856:7;15883:39;15887:1;15890;15883:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;15876:46;;15798:132;;;;:::o;35848:505::-;35941:14;35987:1;35976:8;:12;35968:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36061:1;36049:9;:13;:31;;;;;36079:1;36066:10;:14;36049:31;36041:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36130:20;36153:17;36166:3;36153:8;:12;;:17;;;;:::i;:::-;36130:40;;36181:14;36198:31;36218:10;36198:15;:19;;:31;;;;:::i;:::-;36181:48;;36240:16;36259:40;36283:15;36259:19;36273:4;36259:9;:13;;:19;;;;:::i;:::-;:23;;:40;;;;:::i;:::-;36240:59;;36334:11;36322:9;:23;;;;;;36310:35;;35848:505;;;;;;;;:::o;8039:979::-;8169:12;8202:18;8213:6;8202:10;:18::i;:::-;8194:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8328:12;8342:23;8369:6;:11;;8389:8;8400:4;8369:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8327:78;;;;8420:7;8416:595;;;8451:10;8444:17;;;;;;8416:595;8585:1;8565:10;:17;:21;8561:439;;;8828:10;8822:17;8889:15;8876:10;8872:2;8868:19;8861:44;8776:148;8971:12;8964:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8039:979;;;;;;;:::o;16426:278::-;16512:7;16544:1;16540;:5;16547:12;16532:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16571:9;16587:1;16583;:5;;;;;;16571:17;;16695:1;16688:8;;;16426:278;;;;;:::o;3547:619::-;3607:4;3869:16;3896:19;3918:66;3896:88;;;;4087:7;4075:20;4063:32;;4127:11;4115:8;:23;;:42;;;;;4154:3;4142:15;;:8;:15;;4115:42;4107:51;;;;3547:619;;;:::o

Swarm Source

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