Contract 0x7abb7fec89fe7e22f8d0d5657f1cf6b6d27d6aef

Txn Hash Method
Block
From
To
Value [Txn Fee]
0x29c2c5f10b4a2d636f5cc9629a295abddcf4d702f1d2cd9fc486fe50be8d076eDeposit58524122022-12-03 22:55:344 hrs 14 mins ago0x0b7f9acc002831faeb878fe9b95590898b95abd4 IN  0x7abb7fec89fe7e22f8d0d5657f1cf6b6d27d6aef0 CRO1.249970
0x791c6b91a05d921588abfddee006b38d8f37266102c17772faca4da03961f3c9Deposit58481432022-12-03 16:12:1710 hrs 57 mins ago0x58ee2f96e859ae554b539a1ddf399642d24e7440 IN  0x7abb7fec89fe7e22f8d0d5657f1cf6b6d27d6aef0 CRO1.1427806980
0x386b38e46a375096ed73e84b361f3b76329faafcb01dd3a17f7ed70e202379f9Deposit58474962022-12-03 15:10:5811 hrs 59 mins ago0x0b7f9acc002831faeb878fe9b95590898b95abd4 IN  0x7abb7fec89fe7e22f8d0d5657f1cf6b6d27d6aef0 CRO1.174970
0x9c86acfa5e60aed09e56cda64a154a5b452434ddaeb0c7749ca87d8f89f86b8fDeposit58465462022-12-03 13:40:4813 hrs 29 mins ago0x5850bf60b66ef738ee2890b328ac418becb9e5fe IN  0x7abb7fec89fe7e22f8d0d5657f1cf6b6d27d6aef0 CRO1.174970
0x12673db1c2a053b114b7936718ef3c341f3622b86775937cf42b423505135058Deposit58454832022-12-03 11:59:5015 hrs 10 mins ago0x0b7f9acc002831faeb878fe9b95590898b95abd4 IN  0x7abb7fec89fe7e22f8d0d5657f1cf6b6d27d6aef0 CRO1.174970
0x02638d9db08f1728d64748804868e7b57b3764be5e2a1c6e56c2f353c674efa8Deposit58438822022-12-03 9:27:5917 hrs 42 mins ago0x0b7f9acc002831faeb878fe9b95590898b95abd4 IN  0x7abb7fec89fe7e22f8d0d5657f1cf6b6d27d6aef0 CRO1.174970
0xa3f06a0c7b40ad4dfe4e1b04370cc43a09a8277c6ec52fa2e7805ffd9eaa5cfcAdd Rule58438692022-12-03 9:26:4517 hrs 43 mins ago0x0b7f9acc002831faeb878fe9b95590898b95abd4 IN  0x7abb7fec89fe7e22f8d0d5657f1cf6b6d27d6aef0 CRO0.631370
0x9251ff38338e7c08c7bfb492cc174fe9ff8faa4ed085d771fa0eaa970e7aeef9Deposit58438652022-12-03 9:26:2317 hrs 43 mins ago0x0b7f9acc002831faeb878fe9b95590898b95abd4 IN  0x7abb7fec89fe7e22f8d0d5657f1cf6b6d27d6aef0 CRO1.426150
0xf5a8c7e0b044281057207516c9338c7a64b709f91f904e0b94ff8ab4cfcb1179Withdraw58436662022-12-03 9:07:3218 hrs 2 mins ago0x2a26dfd02e290e9173ef657ba79a80e56fc6bea9 IN  0x7abb7fec89fe7e22f8d0d5657f1cf6b6d27d6aef0 CRO1.2628550
0x129d6a406e5ca596ee7f993511128bca8c963e5f832835527f69d4c70b315ea0Withdraw58409652022-12-03 4:51:4122 hrs 18 mins ago0x5b5907dae3f75ef140f30c5205d9b89bf88763f2 IN  0x7abb7fec89fe7e22f8d0d5657f1cf6b6d27d6aef0 CRO1.26290
0xbe14aecf13dfd6156a04d4a9343339e73ac94a95193f9edca2ab93b0fcd97109Add Rule58409312022-12-03 4:48:2622 hrs 21 mins ago0x5b5907dae3f75ef140f30c5205d9b89bf88763f2 IN  0x7abb7fec89fe7e22f8d0d5657f1cf6b6d27d6aef0 CRO0.627660
0x43bb571319da1e3a898322842f00f35cd6446ec8bbf1b01e6b9d06265437eb28Deposit58409282022-12-03 4:48:0822 hrs 22 mins ago0x5b5907dae3f75ef140f30c5205d9b89bf88763f2 IN  0x7abb7fec89fe7e22f8d0d5657f1cf6b6d27d6aef0 CRO1.351270
0x927dfc4ace0784523ff81b36f57d5f56e30412355231a04f8458cd52a7715e1bDeposit58397582022-12-03 2:57:131 day 13 mins ago0xe86ca285aed9dcadde5f59c746abdabb7f4563f7 IN  0x7abb7fec89fe7e22f8d0d5657f1cf6b6d27d6aef0 CRO1.1428720041440
0x001c7042acb8793e3cfe3124b4de4099396b42880d69e8cf838872e66339a4cbWithdraw58396042022-12-03 2:42:351 day 27 mins ago0xe95b89c402fee7b3f99c53f344b8a1d4d159b44f IN  0x7abb7fec89fe7e22f8d0d5657f1cf6b6d27d6aef0 CRO1.2282169203470
0x1950a97c49a9549a9283babc97babc394f8deba1eacb4595c30f3f075d08e1c7Deposit58395952022-12-03 2:41:441 day 28 mins ago0xe95b89c402fee7b3f99c53f344b8a1d4d159b44f IN  0x7abb7fec89fe7e22f8d0d5657f1cf6b6d27d6aef0 CRO1.2158250393860
0x9c1c8c8ffdf24832bb977b50285e95ac93b556e22f1a8dd6265d116e4bda7f54Withdraw58364512022-12-02 21:43:461 day 5 hrs ago0x57cd02bd78c9ddb2e49ac8d0c722edd6ec3293d7 IN  0x7abb7fec89fe7e22f8d0d5657f1cf6b6d27d6aef0 CRO1.26290
0x7ec11653efb5f8dc67ff178ef61c688fd48012fadf03d67edceb089a2d1886c6Add Rule58362292022-12-02 21:22:421 day 5 hrs ago0x57cd02bd78c9ddb2e49ac8d0c722edd6ec3293d7 IN  0x7abb7fec89fe7e22f8d0d5657f1cf6b6d27d6aef0 CRO0.6280950
0x5f1f19e8ef9e172de31a460b1129612117b93483122f1af911d360aea7b2cc2fDeposit58362262022-12-02 21:22:251 day 5 hrs ago0x57cd02bd78c9ddb2e49ac8d0c722edd6ec3293d7 IN  0x7abb7fec89fe7e22f8d0d5657f1cf6b6d27d6aef0 CRO1.426270
0x9bd4e1f10598f886adaf56d7c5079d5c68328a7b2c7d449c64ba4d959e722e53Deposit58362142022-12-02 21:21:161 day 5 hrs ago0x57cd02bd78c9ddb2e49ac8d0c722edd6ec3293d7 IN  0x7abb7fec89fe7e22f8d0d5657f1cf6b6d27d6aef0 CRO0.202380
0xa12d3f94f4aebcc77cc6f592bb4683eb0aa86d63e5579fde77d05250a23c6c7bAdd Rule58340242022-12-02 17:53:311 day 9 hrs ago0x238d3b817ac0a23d2e883079b034e8c6ad744683 IN  0x7abb7fec89fe7e22f8d0d5657f1cf6b6d27d6aef0 CRO0.6280350
0xf72053c75a01db095c617ebff0630ff4629cba7a8a135aa6f3f446521ae8b8c5Deposit58340212022-12-02 17:53:141 day 9 hrs ago0x238d3b817ac0a23d2e883079b034e8c6ad744683 IN  0x7abb7fec89fe7e22f8d0d5657f1cf6b6d27d6aef0 CRO1.351270
0x44baa326187071eba9f96a4f52427fe8527e72e918c544b99fe9d12ad3f7ae57Add Rule58325022022-12-02 15:29:221 day 11 hrs ago0x9cc90b2f8d049c8359255ef56530f64b2b4ecaa1 IN  0x7abb7fec89fe7e22f8d0d5657f1cf6b6d27d6aef0 CRO0.630880
0x4cc44d1f9859705f494d0b35a07d7cf113523412caada6222a35b7a0db59f919Deposit58324982022-12-02 15:28:591 day 11 hrs ago0x9cc90b2f8d049c8359255ef56530f64b2b4ecaa1 IN  0x7abb7fec89fe7e22f8d0d5657f1cf6b6d27d6aef0 CRO1.350790
0xf1812463c77515c33343255db35dd935ba31f620c15e46df6383d5bfd23a00daDeposit58315192022-12-02 13:56:221 day 13 hrs ago0x5ed2fc5eecb28bb2cb4b3018bb7db5b0b045ce32 IN  0x7abb7fec89fe7e22f8d0d5657f1cf6b6d27d6aef0 CRO1.2159174572340
0x58fb06b1bb107443a0b336fecf31768e032977dd4be615c4fd0398f21068a35cWithdraw58299862022-12-02 11:31:011 day 15 hrs ago0x6e4376f4921376eb872a41c75f2538a04259ea41 IN  0x7abb7fec89fe7e22f8d0d5657f1cf6b6d27d6aef0 CRO1.228673257717 4,864.857431345
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ConditionalLiquidity

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at cronoscan.com on 2022-01-25
*/

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

// File @openzeppelin/contracts/math/[email protected]

// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        uint256 c = a + b;
        if (c < a) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b > a) return (false, 0);
        return (true, a - b);
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, 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 (true, 0);
        uint256 c = a * b;
        if (c / a != b) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a / b);
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a % b);
    }

    /**
     * @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) {
        require(b <= a, "SafeMath: subtraction overflow");
        return a - b;
    }

    /**
     * @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) {
        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, reverting 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) {
        require(b > 0, "SafeMath: division by zero");
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting 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) {
        require(b > 0, "SafeMath: modulo by zero");
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * 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);
        return a - b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryDiv}.
     *
     * 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);
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a % b;
    }
}


// File @openzeppelin/contracts/token/ERC20/[email protected]

pragma solidity >=0.6.0 <0.8.0;

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/utils/[email protected]

pragma solidity >=0.6.2 <0.8.0;

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

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

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

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

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

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

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

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

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private 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

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


// File @openzeppelin/contracts/token/ERC20/[email protected]

pragma solidity >=0.6.0 <0.8.0;



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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/utils/[email protected]

pragma solidity >=0.6.0 <0.8.0;

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

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


// File @openzeppelin/contracts/access/[email protected]


pragma solidity >=0.6.0 <0.8.0;

/**
 * @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.
 */
abstract contract Ownable is Context {
    address private _owner;

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

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

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

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

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


// File @openzeppelin/contracts/utils/[email protected]


pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor () internal {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}


// File @openzeppelin/contracts/utils/[email protected]

pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor () internal {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}


// File contracts/interfaces/IVVSPair.sol

pragma solidity 0.6.12;

interface IVVSPair {
    function deposit(uint256 _pid, uint256 _amount) external;

    function withdraw(uint256 _pid, uint256 _amount) external;

    function kLast() external view returns (uint256);

    function totalSupply() external view returns (uint256);

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

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

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

    function token0() external view returns (address);

    function token1() external view returns (address);

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

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

    function sync() external;
}


// File contracts/libraries/VVSLibrary.sol

// Ref https://github.com/Uniswap/v2-periphery/blob/master/contracts/libraries/UniswapV2Library.sol
pragma solidity 0.6.12;


library VVSLibrary {
    using SafeMath for uint256;

    // returns sorted token addresses, used to handle return values from pairs sorted in this order
    function sortTokens(address tokenA, address tokenB)
        internal
        pure
        returns (address token0, address token1)
    {
        require(tokenA != tokenB, "VVSLibrary: IDENTICAL_ADDRESSES");
        (token0, token1) = tokenA < tokenB
            ? (tokenA, tokenB)
            : (tokenB, tokenA);
        require(token0 != address(0), "VVSLibrary: ZERO_ADDRESS");
    }

    // calculates the CREATE2 address for a pair without making any external calls
    function pairFor(
        address factory,
        address tokenA,
        address tokenB,
        bytes32 initCodehash
    ) internal pure returns (address pair) {
        (address token0, address token1) = sortTokens(tokenA, tokenB);
        pair = address(
            uint256(
                keccak256(
                    abi.encodePacked(
                        hex"ff",
                        factory,
                        keccak256(abi.encodePacked(token0, token1)),
                        initCodehash
                    )
                )
            )
        );
    }

    // fetches and sorts the reserves for a pair
    function getReserves(
        address factory,
        address tokenA,
        address tokenB,
        bytes32 initCodehash
    ) internal view returns (uint256 reserveA, uint256 reserveB) {
        (address token0, ) = sortTokens(tokenA, tokenB);
        (uint256 reserve0, uint256 reserve1, ) = IVVSPair(
            pairFor(factory, tokenA, tokenB, initCodehash)
        ).getReserves();
        (reserveA, reserveB) = tokenA == token0
            ? (reserve0, reserve1)
            : (reserve1, reserve0);
    }
}


// File contracts/interfaces/IVVSFactory.sol

pragma solidity 0.6.12;

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

    function INIT_CODE_PAIR_HASH() external view returns (bytes32);

    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(uint256) external view returns (address pair);

    function allPairsLength() external view returns (uint256);

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

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;
}


// File contracts/libraries/Babylonian.sol

// Exact copy of https://github.com/Uniswap/solidity-lib/blob/master/contracts/libraries/Babylonian.sol
pragma solidity 0.6.12;

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


// File contracts/libraries/FullMath.sol

// Exact copy of https://github.com/Uniswap/solidity-lib/blob/master/contracts/libraries/FullMath.sol
pragma solidity >=0.4.0;

// taken from https://medium.com/coinmonks/math-in-solidity-part-3-percents-and-proportions-4db014e080b1

library FullMath {
    function fullMul(uint256 x, uint256 y)
        internal
        pure
        returns (uint256 l, uint256 h)
    {
        uint256 mm = mulmod(x, y, uint256(-1));
        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;
        d /= pow2;
        l /= pow2;
        l += h * ((-pow2) / 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);
    }
}


// File contracts/libraries/VVSLiquidityMathLibrary.sol

// Ref: https://github.com/Uniswap/v2-periphery/blob/master/contracts/libraries/UniswapV2LiquidityMathLibrary.sol
pragma solidity 0.6.12;





// library containing some math for dealing with the liquidity shares of a pair, e.g. computing their exact value
// in terms of the underlying tokens
library VVSLiquidityMathLibrary {
    using SafeMath for uint256;

    // computes liquidity value given all the parameters of the pair
    function computeLiquidityValue(
        uint256 reservesA,
        uint256 reservesB,
        uint256 totalSupply,
        uint256 liquidityAmount,
        bool feeOn,
        uint256 kLast
    ) internal pure returns (uint256 tokenAAmount, uint256 tokenBAmount) {
        if (feeOn && kLast > 0) {
            uint256 rootK = Babylonian.sqrt(reservesA.mul(reservesB));
            uint256 rootKLast = Babylonian.sqrt(kLast);
            if (rootK > rootKLast) {
                uint256 numerator1 = totalSupply;
                uint256 numerator2 = rootK.sub(rootKLast);
                uint256 denominator = rootK.mul(4).add(rootKLast);
                uint256 feeLiquidity = FullMath.mulDiv(
                    numerator1,
                    numerator2,
                    denominator
                );
                totalSupply = totalSupply.add(feeLiquidity);
            }
        }
        return (
            reservesA.mul(liquidityAmount) / totalSupply,
            reservesB.mul(liquidityAmount) / totalSupply
        );
    }

    // get all current parameters from the pair and compute value of a liquidity amount
    // **note this is subject to manipulation, e.g. sandwich attacks**. prefer passing a manipulation resistant price to
    // #getLiquidityValueAfterArbitrageToPrice
    function getLiquidityValue(
        address factory,
        address tokenA,
        address tokenB,
        uint256 liquidityAmount,
        bytes32 initCodeHash
    ) internal view returns (uint256 tokenAAmount, uint256 tokenBAmount) {
        (uint256 reservesA, uint256 reservesB) = VVSLibrary.getReserves(
            factory,
            tokenA,
            tokenB,
            initCodeHash
        );
        IVVSPair pair = IVVSPair(
            VVSLibrary.pairFor(factory, tokenA, tokenB, initCodeHash)
        );
        bool feeOn = IVVSFactory(factory).feeTo() != address(0);
        uint256 kLast = feeOn ? pair.kLast() : 0;
        uint256 totalSupply = pair.totalSupply();
        return
            computeLiquidityValue(
                reservesA,
                reservesB,
                totalSupply,
                liquidityAmount,
                feeOn,
                kLast
            );
    }
}


// File contracts/interfaces/IVVSRouter.sol

pragma solidity 0.6.12;

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

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

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

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

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;
}


// File contracts/interfaces/ICraftsman.sol

pragma solidity 0.6.12;

interface ICraftsman {
    function userInfo(uint256 pid, address user)
        external
        view
        returns (uint256 amount, uint256 rewardDebt);

    function poolInfo(uint256 _pid)
        external
        view
        returns (
            address lpToken,
            uint256,
            uint256,
            uint256
        );

    function pendingVVS(uint256 _pid, address _user)
        external
        view
        returns (uint256);

    function deposit(uint256 _pid, uint256 _amount) external;

    function withdraw(uint256 _pid, uint256 _amount) external;

    function owner() external view returns (address);

    function add(
        uint256 _allocPoint,
        IERC20 _lpToken,
        bool _withUpdate
    ) external;

    function poolLength() external view returns (uint256);
}


// File contracts/ConditionalLiquidity.sol

pragma solidity 0.6.12;












contract ConditionalLiquidity is Ownable, ReentrancyGuard, Pausable {
    using SafeMath for uint256;
    using SafeERC20 for IERC20;

    IVVSFactory public immutable factory;
    IVVSRouter public immutable router;
    ICraftsman public immutable craftsman;
    IERC20 public immutable vvs;
    bytes32 public immutable INIT_CODE_PAIR_HASH;

    uint256 public constant MAX_VVS_FEE = 10000; // 100%
    uint256 public vvsTreasuryFee = 400; // 4%
    uint256 public vvsCallerFee = 100; // 1 %

    address public treasury;

    // Store how LP user have deposited. LP address -> (User address, staked)
    mapping(address => mapping(address => UserInfo)) public userInfo;

    // Store LP address to craftsman info
    mapping(address => PoolInfo) public lpPoolInfo;

    // Store whether an address is whitelisted to breakLp
    bool public breakLpWhitelistEnabled = true;
    mapping(address => bool) public breakLpWhitelist;

    // Info of each user.
    struct UserInfo {
        uint256 amount; // How many LP tokens the user has provided.
        bool hasRuleEnabled; // whether the user has rule enabled
        uint256 minToken0Amt; // how much token0 before break
        uint256 minToken1Amt; // how much token1 before break
        uint256 rewardDebt; // number of reward debt which user has claimed
    }

    struct PoolInfo {
        uint256 pid; // pid of craftsman
        uint256 accVVSPerLp; // number of VVS per Lp
    }

    event Deposit(
        address indexed user,
        address indexed lpToken,
        uint256 amount
    );
    event Withdraw(
        address indexed user,
        address indexed lpToken,
        uint256 amount
    );
    event LpRuleUpdate(
        address indexed user,
        address indexed lpToken,
        bool hasRuleEnabled,
        uint256 token0,
        uint256 token1
    );
    event LpRedeemed(
        address indexed user,
        address indexed caller,
        address indexed lpToken,
        uint256 liquidity,
        uint256 token0,
        uint256 token1
    );
    event TreasuryReward(address indexed lpToken, uint256 vvsAmount);
    event CallerReward(
        address indexed lpToken,
        address indexed user,
        uint256 vvsAmount
    );
    event PoolSet(address indexed lpToken, uint256 pid);
    event SetVVSTreasuryFee(uint256 vvsFee);
    event SetVVSCallerFee(uint256 vvsFee);
    event SetTreasury(address treasury);
    event BreakLpWhitelistAdded(address addr);
    event BreakLpWhitelistRemoved(address addr);
    event BreakLpWhitelistEnabledSet(bool enabled);
    event EmergencyWithdraw(address indexed user, address indexed lpToken, uint256 amount);

    modifier onlyVVSPair(IVVSPair _lpToken) {
        address pair = VVSLibrary.pairFor(
            address(factory),
            _lpToken.token0(),
            _lpToken.token1(),
            INIT_CODE_PAIR_HASH
        );
        require(
            pair == address(_lpToken),
            "ConditionalLiquidity: Not VVS pair"
        );
        _;
    }

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

    constructor(
        IVVSFactory _factory,
        IVVSRouter _router,
        ICraftsman _craftsman,
        IERC20 _vvs,
        address _treasury
    ) public {
        factory = _factory;
        router = _router;
        craftsman = _craftsman;
        vvs = _vvs;
        treasury = _treasury;
        INIT_CODE_PAIR_HASH = _factory.INIT_CODE_PAIR_HASH();
    }

    /**
     * @dev Set up new pool or overwrite existing lpToken pool pid
     */
    function setPoolPid(IVVSPair _lpToken, uint256 _pid)
        external
        onlyVVSPair(_lpToken)
        onlyOwner
    {
        require(_pid > 0, "ConditionalLiquidity: pid must be 1 or greater");
        PoolInfo storage pool = lpPoolInfo[address(_lpToken)];

        uint256 balance = _lpToken.balanceOf(address(this));
        uint256 pid = pool.pid;

        // Verify if pid is assigned this lpToken on craftsman
        (address craftsmanPoolLp, , , ) = craftsman.poolInfo(_pid);
        require(
            craftsmanPoolLp == address(_lpToken),
            "ConditionalLiquidity: LP token not same as craftsman"
        );

        // Scenario 1: PID does not exist previously, deposit LP craftsman
        if (pid == 0 && balance != 0) {
            _lpToken.approve(address(craftsman), balance);
            craftsman.deposit(_pid, balance);
        }

        // Scenario 2: PID exist previously - migrate to the other pid and update pool.accVVSPerLp
        if (pid != 0) {
            (uint256 _totalLp, ) = craftsman.userInfo(pid, address(this));

            if (_totalLp > 0) {
                // Update pool.accVVSPerLp so existing user can claim them later
                uint256 pendingVVS = craftsman.pendingVVS(pid, address(this));

                pool.accVVSPerLp = pool.accVVSPerLp.add(
                    pendingVVS.mul(1e12).div(_totalLp)
                );
                craftsman.withdraw(pid, _totalLp);

                // deposit all LP token in contract
                _lpToken.approve(address(craftsman), _totalLp.add(balance));
                craftsman.deposit(_pid, _totalLp.add(balance));
            }
        }

        pool.pid = _pid;
        emit PoolSet(address(_lpToken), _pid);
    }

    /**
     * @dev Deposit user's LP, remove existing rule for user
     * If amount: 0 - trigger only vvs rewards collection
     */
    function deposit(IVVSPair _lpToken, uint256 _amount)
        external
        onlyVVSPair(_lpToken)
        whenNotPaused
    {
        if (_amount > 0) {
            _lpToken.transferFrom(msg.sender, address(this), _amount);
        }

        UserInfo storage user = userInfo[address(_lpToken)][msg.sender];
        PoolInfo storage pool = lpPoolInfo[address(_lpToken)];

        uint256 pid = pool.pid;
        // pid != 0 means lp token has a craftsman pid
        if (pid != 0) {
            (uint256 _totalLp, ) = craftsman.userInfo(pid, address(this)); // get total amount staked
            uint256 pendingVVS = craftsman.pendingVVS(pid, address(this));
            if (pendingVVS > 0 && _totalLp > 0) {
                // _totalLp should be over 0 here if there is pending vvs
                pool.accVVSPerLp = pool.accVVSPerLp.add(
                    pendingVVS.mul(1e12).div(_totalLp)
                );
            }

            // deposit lp token from here into the craftsman to get pending vvs as well
            _lpToken.approve(address(craftsman), _amount);
            craftsman.deposit(pid, _amount);

            uint256 pending = user.amount.mul(pool.accVVSPerLp).div(1e12).sub(
                user.rewardDebt
            );
            if (pending > 0) {
                uint256 fee = _distributeVVSFeeToTreasury(_lpToken, pending);
                vvs.safeTransfer(msg.sender, pending.sub(fee));
            }
        }

        if (_amount > 0) {
            user.amount = user.amount.add(_amount);
            _removeRule(_lpToken, msg.sender);
        }
        user.rewardDebt = user.amount.mul(pool.accVVSPerLp).div(1e12);
        emit Deposit(msg.sender, address(_lpToken), _amount);
    }

    /**
     * @dev Withdraw user's LP, remove existing rule for user
     * If amount: 0 - trigger only vvs rewards collection
     */
    function withdraw(IVVSPair _lpToken, uint256 _amount) external {
        UserInfo storage user = userInfo[address(_lpToken)][msg.sender];
        require(
            _amount <= user.amount,
            "ConditionalLiquidity: withdraw amount > balance"
        );

        PoolInfo storage pool = lpPoolInfo[address(_lpToken)];

        uint256 pid = pool.pid;
        // pid != 0 means lp token has a craftsman pid
        if (pid != 0) {
            (uint256 _totalLp, ) = craftsman.userInfo(pid, address(this)); // get total amount staked
            uint256 pendingVVS = craftsman.pendingVVS(pid, address(this));
            if (pendingVVS > 0 && _totalLp > 0) {
                // _totalLp should be over 0 here if there is pending vvs
                pool.accVVSPerLp = pool.accVVSPerLp.add(
                    pendingVVS.mul(1e12).div(_totalLp)
                );
            }

            // withdraw lp token from craftsman to get pending vvs as well
            craftsman.withdraw(pid, _amount);

            uint256 pending = user.amount.mul(pool.accVVSPerLp).div(1e12).sub(
                user.rewardDebt
            );

            if (pending > 0) {
                uint256 fee = _distributeVVSFeeToTreasury(_lpToken, pending);
                vvs.safeTransfer(msg.sender, pending.sub(fee));
            }
        }

        if (_amount > 0) {
            user.amount = user.amount.sub(_amount);
            _lpToken.transfer(msg.sender, _amount);
            _removeRule(_lpToken, msg.sender);
        }
        user.rewardDebt = user.amount.mul(pool.accVVSPerLp).div(1e12);
        emit Withdraw(msg.sender, address(_lpToken), _amount);
    }

    /**
     * @dev Add rule for an LP. If existing rule exist, it will be replaced
     * @param _lpToken token to add rule for
     * @param _minToken0Amt min token0 amount, must be higher than current LP value
     * @param _minToken1Amt min token1 amount, must be higher than current LP value
     * @param _deadline in sec, if block timestamp is after, txn will fail
     */
    function addRule(
        IVVSPair _lpToken,
        uint256 _minToken0Amt,
        uint256 _minToken1Amt,
        uint256 _deadline
    ) external ensure(_deadline) whenNotPaused {
        UserInfo storage user = userInfo[address(_lpToken)][msg.sender];
        require(user.amount > 0, "ConditionalLiquidity: Amount is 0");

        (uint256 token0Amt, uint256 token1Amt) = VVSLiquidityMathLibrary
            .getLiquidityValue(
                address(factory),
                _lpToken.token0(),
                _lpToken.token1(),
                user.amount,
                INIT_CODE_PAIR_HASH
            );

        // Either token0 or token1 must be greater than LP current val
        require(
            token0Amt < _minToken0Amt || token1Amt < _minToken1Amt,
            "ConditionalLiquidity: token0 or token1 must be greater than LP val"
        );

        user.hasRuleEnabled = true;
        user.minToken0Amt = _minToken0Amt;
        user.minToken1Amt = _minToken1Amt;

        emit LpRuleUpdate(
            msg.sender,
            address(_lpToken),
            true,
            _minToken0Amt,
            _minToken1Amt
        );
    }

    /**
     * @dev remove previously set rule for the lp token
     * @param _lpToken address of lp token to remove rule
     */
    function removeRule(IVVSPair _lpToken) external {
        _removeRule(_lpToken, msg.sender);
    }

    /**
     * @dev Break user LP if it matches user's rule,
     * @dev Requirements: lp token0 and token1 matches user's rule
     * @param _lpToken address of lp token to break
     * @param _user address of user
     */
    function breakLp(IVVSPair _lpToken, address _user)
        external
        whenNotPaused
        nonReentrant
    {
        require(
            !breakLpWhitelistEnabled || breakLpWhitelist[msg.sender],
            "CL: Not in whitelist"
        );

        UserInfo storage user = userInfo[address(_lpToken)][_user];
        require(user.amount > 0, "ConditionalLiquidity: No LP added");
        require(user.hasRuleEnabled, "ConditionalLiquidity: No rule");

        uint256 amount = user.amount;

        PoolInfo storage pool = lpPoolInfo[address(_lpToken)];

        uint256 pid = pool.pid;
        // pid != 0 means lp token has a craftsman pid
        if (pid != 0) {
            (uint256 _totalLp, ) = craftsman.userInfo(pid, address(this)); // get total amount staked

            uint256 pendingVVS = craftsman.pendingVVS(pid, address(this));
            if (pendingVVS > 0 && _totalLp > 0) {
                // _totalLp should not be 0 over here if there is pending vvs
                pool.accVVSPerLp = pool.accVVSPerLp.add(
                    pendingVVS.mul(1e12).div(_totalLp)
                );
            }

            // deposit lp token from here into the craftsman to get pending vvs as well
            craftsman.withdraw(pid, amount);

            uint256 pending = amount.mul(pool.accVVSPerLp).div(1e12).sub(
                user.rewardDebt
            );

            if (pending > 0) {
                // fee to treasury and caller
                uint256 treasuryFee = _distributeVVSFeeToTreasury(
                    _lpToken,
                    pending
                );
                uint256 callerFee = _distributeVVSFeeToCaller(
                    _lpToken,
                    pending,
                    msg.sender
                );
                vvs.safeTransfer(
                    _user,
                    pending.sub(treasuryFee).sub(callerFee)
                );
            }
        }

        address token0 = _lpToken.token0();
        address token1 = _lpToken.token1();
        
        // Store the token0 and token1 diff in user bal 
        uint256 beforeToken0Bal = IERC20(token0).balanceOf(address(_user));
        uint256 beforeToken1Bal = IERC20(token1).balanceOf(address(_user));
        _lpToken.approve(address(router), amount);
        router.removeLiquidity(
            token0,
            token1,
            amount,
            0,
            0,
            _user,
            block.timestamp.add(600)
        );
        uint256 afterToken0Bal = IERC20(token0).balanceOf(address(_user));
        uint256 afterToken1Bal = IERC20(token1).balanceOf(address(_user));

        uint256 token0Diff = afterToken0Bal.sub(beforeToken0Bal);
        require(
            token0Diff >= user.minToken0Amt,
            "ConditionalLiquidity: token0Diff below minToken0Amt"
        );
        uint256 token1Diff = afterToken1Bal.sub(beforeToken1Bal);
        require(
            token1Diff >= user.minToken1Amt,
            "ConditionalLiquidity: token1Diff under minToken1Amt"
        );

        // revert user's rule and set amount = 0
        user.amount = 0;
        user.rewardDebt = 0;
        _removeRule(_lpToken, _user);

        emit LpRedeemed(
            _user,
            msg.sender,
            address(_lpToken),
            amount,
            token0Diff,
            token1Diff
        );
    }

    /**
     * @notice get pending VVS for the user, does not take into account of fees
     * @param _lpToken adress of lp token to check
     * @param _user address of user to check
     * @return user pending vvs
     */
    function pendingVVS(IVVSPair _lpToken, address _user)
        external
        view
        returns (uint256)
    {
        UserInfo storage user = userInfo[address(_lpToken)][_user];
        PoolInfo storage pool = lpPoolInfo[address(_lpToken)];

        uint256 pid = pool.pid;
        if (pid == 0) {
            return 0; // not staked in craftsman = 0 vvs reward
        }

        (uint256 _totalLp, ) = craftsman.userInfo(pid, address(this)); // get total amount staked
        uint256 accVVSPerLp = pool.accVVSPerLp;
        if (_totalLp != 0) {
            uint256 poolPendingVVS = craftsman.pendingVVS(pid, address(this));
            accVVSPerLp = pool.accVVSPerLp.add(
                poolPendingVVS.mul(1e12).div(_totalLp)
            );
        }

        return user.amount.mul(accVVSPerLp).div(1e12).sub(user.rewardDebt);
    }

    /**
     * @dev Only possible when contract not paused.
     */
    function pause() external onlyOwner {
        _pause();
    }

    /**
     * @dev Only possible when contract is paused.
     */
    function unpause() external onlyOwner {
        _unpause();
    }

    /**
     * @dev Update vvs treasury fee,, check that treasury + caller fee does not exceed max fee
     */
    function setVVSTreasuryFee(uint256 _vvsTreasuryFee) external onlyOwner {
        require(
            _vvsTreasuryFee.add(vvsCallerFee) <= MAX_VVS_FEE,
            "ConditionalLiquidity: fee cannot be more than MAX_VVS_FEE"
        );
        vvsTreasuryFee = _vvsTreasuryFee;

        emit SetVVSTreasuryFee(_vvsTreasuryFee);
    }

    /**
     * @dev Update vvs caller fee, check that treasury + caller fee does not exceed max fee
     */
    function setVVSCallerFee(uint256 _vvsCallerFee) external onlyOwner {
        require(
            _vvsCallerFee.add(vvsTreasuryFee) <= MAX_VVS_FEE,
            "ConditionalLiquidity: fee cannot be more than MAX_VVS_FEE"
        );
        vvsCallerFee = _vvsCallerFee;

        emit SetVVSCallerFee(_vvsCallerFee);
    }

    /*
     * @dev Update treasury
     */
    function setTreasury(address _treasury) external onlyOwner {
        treasury = _treasury;

        emit SetTreasury(_treasury);
    }

    /**
     * @dev add addresses to breakLp whitelist
     * @param addr address
     */
    function addAddressesToWhitelist(address addr) external onlyOwner {
        if (!breakLpWhitelist[addr]) {
            breakLpWhitelist[addr] = true;
            emit BreakLpWhitelistAdded(addr);
        }
    }

    /**
     * @dev remove an address from breakLp whitelist
     * @param addr address
     */
    function removeAddressFromWhitelist(address addr) external onlyOwner {
        if (breakLpWhitelist[addr]) {
            breakLpWhitelist[addr] = false;
            emit BreakLpWhitelistRemoved(addr);
        }
    }

    /**
     * @dev if true, breakLp only allow whitelist caller, else anyone can call breakLp
     */
    function setBreakLpWhitelistEnabled(bool _enabled) external onlyOwner {
        breakLpWhitelistEnabled = _enabled;
        emit BreakLpWhitelistEnabledSet(_enabled);
    }

    function _removeRule(IVVSPair _lpToken, address _user) internal {
        UserInfo storage user = userInfo[address(_lpToken)][_user];
        user.hasRuleEnabled = false;
        user.minToken0Amt = 0;
        user.minToken1Amt = 0;
        emit LpRuleUpdate(_user, address(_lpToken), false, 0, 0);
    }

    /**
     * @dev distribute vvs fee to treasury
     * @return fee sent to treasury
     */
    function _distributeVVSFeeToTreasury(IVVSPair _lpToken, uint256 _amt)
        internal
        returns (uint256)
    {
        uint256 fee = 0;
        if (_amt > 0) {
            fee = _amt.mul(vvsTreasuryFee).div(MAX_VVS_FEE);

            vvs.safeTransfer(treasury, fee);
            emit TreasuryReward(address(_lpToken), fee);
        }

        return fee;
    }

    /**
     * @dev distribute vvs fee to caller
     * @return fee sent to caller
     */
    function _distributeVVSFeeToCaller(
        IVVSPair _lpToken,
        uint256 _amt,
        address _caller
    ) internal returns (uint256) {
        uint256 fee = 0;

        if (_amt > 0) {
            fee = _amt.mul(vvsCallerFee).div(MAX_VVS_FEE);

            vvs.safeTransfer(_caller, fee);
            emit CallerReward(address(_lpToken), _caller, fee);
        }

        return fee;
    }

    /**
     * @notice withdraw without caring about rewards. EMERGENCY ONLY.
     */
    function emergencyWithdraw(IVVSPair _lpToken) public onlyVVSPair(_lpToken) {
        UserInfo storage user = userInfo[address(_lpToken)][msg.sender];
        PoolInfo storage pool = lpPoolInfo[address(_lpToken)];

        uint256 pid = pool.pid;
        uint256 amount = user.amount;
        if (pid != 0) {
            (uint256 _totalLp, ) = craftsman.userInfo(pid, address(this)); 
            uint256 pending = craftsman.pendingVVS(pid, address(this));
            uint256 remainingLp = _totalLp.sub(amount);

            // Split user's reward with the remaining stakers, however if user was 
            // the only staker, any pending vvs reward goes to the contract
            if (pending > 0 && remainingLp > 0) {
                pool.accVVSPerLp = pool.accVVSPerLp.add(
                    pending.mul(1e12).div(remainingLp)
                );
            }

            craftsman.withdraw(pid, amount);
        }

        user.amount = 0;
        user.rewardDebt = 0;

        _lpToken.transfer(msg.sender, amount);
        emit EmergencyWithdraw(msg.sender, address(_lpToken), amount);
    }
}

Contract ABI

[{"inputs":[{"internalType":"contract IVVSFactory","name":"_factory","type":"address"},{"internalType":"contract IVVSRouter","name":"_router","type":"address"},{"internalType":"contract ICraftsman","name":"_craftsman","type":"address"},{"internalType":"contract IERC20","name":"_vvs","type":"address"},{"internalType":"address","name":"_treasury","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"addr","type":"address"}],"name":"BreakLpWhitelistAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"BreakLpWhitelistEnabledSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"addr","type":"address"}],"name":"BreakLpWhitelistRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"lpToken","type":"address"},{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"vvsAmount","type":"uint256"}],"name":"CallerReward","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"lpToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"lpToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"lpToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"liquidity","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"token0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"token1","type":"uint256"}],"name":"LpRedeemed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"lpToken","type":"address"},{"indexed":false,"internalType":"bool","name":"hasRuleEnabled","type":"bool"},{"indexed":false,"internalType":"uint256","name":"token0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"token1","type":"uint256"}],"name":"LpRuleUpdate","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":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"lpToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"pid","type":"uint256"}],"name":"PoolSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"treasury","type":"address"}],"name":"SetTreasury","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"vvsFee","type":"uint256"}],"name":"SetVVSCallerFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"vvsFee","type":"uint256"}],"name":"SetVVSTreasuryFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"lpToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"vvsAmount","type":"uint256"}],"name":"TreasuryReward","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"lpToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"INIT_CODE_PAIR_HASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_VVS_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"addAddressesToWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IVVSPair","name":"_lpToken","type":"address"},{"internalType":"uint256","name":"_minToken0Amt","type":"uint256"},{"internalType":"uint256","name":"_minToken1Amt","type":"uint256"},{"internalType":"uint256","name":"_deadline","type":"uint256"}],"name":"addRule","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IVVSPair","name":"_lpToken","type":"address"},{"internalType":"address","name":"_user","type":"address"}],"name":"breakLp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"breakLpWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"breakLpWhitelistEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"craftsman","outputs":[{"internalType":"contract ICraftsman","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IVVSPair","name":"_lpToken","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IVVSPair","name":"_lpToken","type":"address"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"contract IVVSFactory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lpPoolInfo","outputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"uint256","name":"accVVSPerLp","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IVVSPair","name":"_lpToken","type":"address"},{"internalType":"address","name":"_user","type":"address"}],"name":"pendingVVS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"removeAddressFromWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IVVSPair","name":"_lpToken","type":"address"}],"name":"removeRule","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"contract IVVSRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setBreakLpWhitelistEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IVVSPair","name":"_lpToken","type":"address"},{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"setPoolPid","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_treasury","type":"address"}],"name":"setTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_vvsCallerFee","type":"uint256"}],"name":"setVVSCallerFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_vvsTreasuryFee","type":"uint256"}],"name":"setVVSTreasuryFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"hasRuleEnabled","type":"bool"},{"internalType":"uint256","name":"minToken0Amt","type":"uint256"},{"internalType":"uint256","name":"minToken1Amt","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vvs","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vvsCallerFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vvsTreasuryFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IVVSPair","name":"_lpToken","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

61012060405261019060035560646004556008805460ff191660011790553480156200002a57600080fd5b50604051620046d5380380620046d5833981810160405260a08110156200005057600080fd5b5080516020820151604083015160608401516080909401519293919290919060006200007b62000198565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600180556002805460ff191690556001600160601b0319606086811b821660805285811b821660a05284811b821660c05283901b1660e052600580546001600160a01b038381166001600160a01b03199092169190911790915560408051632c2ad12d60e11b8152905191871691635855a25a91600480820192602092909190829003018186803b1580156200015a57600080fd5b505afa1580156200016f573d6000803e3d6000fd5b505050506040513d60208110156200018657600080fd5b505161010052506200019c9350505050565b3390565b60805160601c60a05160601c60c05160601c60e05160601c610100516144436200029260003980610a81528061126352806113485250806105d15280610f07528061358052806139285250806107175280610c2b5280610cc65280610d8c5280610e4652806113f052806114705280611698528061173352806117f35280611d725280611e545280611f0e5280611f9e528061201852806120fc528061216d52806122125280612501528061259c52806126425280612f465280612fe1528061308752508061291752806129ab528061326652508061098f528061116f528061158d5280611b7d5280612caf52506144436000f3fe608060405234801561001057600080fd5b50600436106101fb5760003560e01c80636d7de7ff1161011a57806399344c8c116100ad578063edaec43c1161007c578063edaec43c14610547578063f0f442601461054f578063f2fde38b14610575578063f3fef3a31461059b578063f887ea40146105c7576101fb565b806399344c8c146104bf578063b101241e146104eb578063c45a015514610519578063df21950f14610521576101fb565b806386d331f6116100e957806386d331f61461048a5780638da5cb5b146104a75780639534e7d4146104af57806398600760146104b7576101fb565b80636d7de7ff146104155780636ff1c9bc14610454578063715018a61461047a5780638456cb5914610482576101fb565b8063422ec6b6116101925780635855a25a116101615780635855a25a146103cf5780635c975abb146103d757806361d027b3146103df57806365e18ffc146103e7576101fb565b8063422ec6b61461032f57806347e7ef241461034c578063512943111461037857806353b7a5be14610397576101fb565b806327c2bca8116101ce57806327c2bca8146102bf578063286dd3f5146102c75780632fce11bf146102ed5780633f4ba83a14610327576101fb565b806308e77344146102005780630f208beb1461022457806311b2ce021461027d5780631644923414610297575b600080fd5b6102086105cf565b604080516001600160a01b039092168252519081900360200190f35b6102526004803603604081101561023a57600080fd5b506001600160a01b03813581169160200135166105f3565b6040805195865293151560208601528484019290925260608401526080830152519081900360a00190f35b610285610631565b60408051918252519081900360200190f35b6102bd600480360360208110156102ad57600080fd5b50356001600160a01b0316610637565b005b610208610715565b6102bd600480360360208110156102dd57600080fd5b50356001600160a01b0316610739565b6103136004803603602081101561030357600080fd5b50356001600160a01b0316610814565b604080519115158252519081900360200190f35b6102bd610829565b6102bd6004803603602081101561034557600080fd5b5035610895565b6102bd6004803603604081101561036257600080fd5b506001600160a01b038135169060200135610987565b6102bd6004803603602081101561038e57600080fd5b50351515610fbb565b6102bd600480360360808110156103ad57600080fd5b506001600160a01b038135169060208101359060408101359060600135611064565b610285611346565b61031361136a565b610208611373565b610285600480360360408110156103fd57600080fd5b506001600160a01b0381358116916020013516611382565b61043b6004803603602081101561042b57600080fd5b50356001600160a01b031661156c565b6040805192835260208301919091528051918290030190f35b6102bd6004803603602081101561046a57600080fd5b50356001600160a01b0316611585565b6102bd61194f565b6102bd6119fb565b6102bd600480360360208110156104a057600080fd5b5035611a65565b610208611b57565b610285611b66565b610313611b6c565b6102bd600480360360408110156104d557600080fd5b506001600160a01b038135169060200135611b75565b6102bd6004803603604081101561050157600080fd5b506001600160a01b03813581169160200135166122e7565b610208612cad565b6102bd6004803603602081101561053757600080fd5b50356001600160a01b0316612cd1565b610285612cdb565b6102bd6004803603602081101561056557600080fd5b50356001600160a01b0316612ce1565b6102bd6004803603602081101561058b57600080fd5b50356001600160a01b0316612d97565b6102bd600480360360408110156105b157600080fd5b506001600160a01b038135169060200135612e99565b610208613264565b7f000000000000000000000000000000000000000000000000000000000000000081565b600660209081526000928352604080842090915290825290208054600182015460028301546003840154600490940154929360ff9092169290919085565b61271081565b61063f613288565b6001600160a01b0316610650611b57565b6001600160a01b031614610699576040805162461bcd60e51b815260206004820181905260248201526000805160206142da833981519152604482015290519081900360640190fd5b6001600160a01b03811660009081526009602052604090205460ff16610712576001600160a01b038116600081815260096020908152604091829020805460ff19166001179055815192835290517fc95194e1392372e7161720e07db4030980458ffabf253d521920ae57cd266c5a9281900390910190a15b50565b7f000000000000000000000000000000000000000000000000000000000000000081565b610741613288565b6001600160a01b0316610752611b57565b6001600160a01b03161461079b576040805162461bcd60e51b815260206004820181905260248201526000805160206142da833981519152604482015290519081900360640190fd5b6001600160a01b03811660009081526009602052604090205460ff1615610712576001600160a01b038116600081815260096020908152604091829020805460ff19169055815192835290517f22a43c709028f39be4efac644354086265163b8be887e73386dedd1d17c9c2579281900390910190a150565b60096020526000908152604090205460ff1681565b610831613288565b6001600160a01b0316610842611b57565b6001600160a01b03161461088b576040805162461bcd60e51b815260206004820181905260248201526000805160206142da833981519152604482015290519081900360640190fd5b61089361328c565b565b61089d613288565b6001600160a01b03166108ae611b57565b6001600160a01b0316146108f7576040805162461bcd60e51b815260206004820181905260248201526000805160206142da833981519152604482015290519081900360640190fd5b61271061090f6004548361332c90919063ffffffff16565b111561094c5760405162461bcd60e51b81526004018080602001828103825260398152602001806143456039913960400191505060405180910390fd5b60038190556040805182815290517fab4e9785eb57338c5ec2f384ca44fdc0cf271298e2f25b0af7549180d3c573bd9181900360200190a150565b816000610aa57f0000000000000000000000000000000000000000000000000000000000000000836001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b1580156109e757600080fd5b505afa1580156109fb573d6000803e3d6000fd5b505050506040513d6020811015610a1157600080fd5b50516040805163d21220a760e01b815290516001600160a01b0387169163d21220a7916004808301926020929190829003018186803b158015610a5357600080fd5b505afa158015610a67573d6000803e3d6000fd5b505050506040513d6020811015610a7d57600080fd5b50517f000000000000000000000000000000000000000000000000000000000000000061338d565b9050816001600160a01b0316816001600160a01b031614610af75760405162461bcd60e51b81526004018080602001828103825260228152602001806142766022913960400191505060405180910390fd5b610aff61136a565b15610b44576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b8215610bcc57604080516323b872dd60e01b81523360048201523060248201526044810185905290516001600160a01b038616916323b872dd9160648083019260209291908290030181600087803b158015610b9f57600080fd5b505af1158015610bb3573d6000803e3d6000fd5b505050506040513d6020811015610bc957600080fd5b50505b6001600160a01b038416600081815260066020908152604080832033845282528083209383526007909152902080548015610f3457604080516393f1a40b60e01b81526004810183905230602482015281516000926001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016926393f1a40b9260448083019392829003018186803b158015610c6d57600080fd5b505afa158015610c81573d6000803e3d6000fd5b505050506040513d6040811015610c9757600080fd5b505160408051631a20a45160e31b81526004810185905230602482015290519192506000916001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169163d1052288916044808301926020929190829003018186803b158015610d0c57600080fd5b505afa158015610d20573d6000803e3d6000fd5b505050506040513d6020811015610d3657600080fd5b505190508015801590610d495750600082115b15610d7b57610d75610d6a83610d648464e8d4a5100061342b565b90613484565b60018601549061332c565b60018501555b886001600160a01b031663095ea7b37f00000000000000000000000000000000000000000000000000000000000000008a6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015610df257600080fd5b505af1158015610e06573d6000803e3d6000fd5b505050506040513d6020811015610e1c57600080fd5b505060408051631c57762b60e31b815260048101859052602481018a905290516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169163e2bbb15891604480830192600092919082900301818387803b158015610e8d57600080fd5b505af1158015610ea1573d6000803e3d6000fd5b505050506000610ed98660040154610ed364e8d4a51000610d6489600101548b6000015461342b90919063ffffffff16565b906134eb565b90508015610f30576000610eed8b83613548565b9050610f2e33610efd84846134eb565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691906135ef565b505b5050505b8515610f52578254610f46908761332c565b8355610f528733613646565b60018201548354610f6d9164e8d4a5100091610d649161342b565b60048401556040805187815290516001600160a01b0389169133917f5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f629181900360200190a350505050505050565b610fc3613288565b6001600160a01b0316610fd4611b57565b6001600160a01b03161461101d576040805162461bcd60e51b815260206004820181905260248201526000805160206142da833981519152604482015290519081900360640190fd5b6008805482151560ff19909116811790915560408051918252517f4736c9337b5f985da5b1ce7aae6ebbcf446d8106c50e8b8b820455291e5df8d89181900360200190a150565b80428110156110ba576040805162461bcd60e51b815260206004820152601d60248201527f436f6e646974696f6e616c4c69717569646974793a2045585049524544000000604482015290519081900360640190fd5b6110c261136a565b15611107576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b6001600160a01b0385166000908152600660209081526040808320338452909152902080546111675760405162461bcd60e51b81526004018080602001828103825260218152602001806141db6021913960400191505060405180910390fd5b6000806112877f0000000000000000000000000000000000000000000000000000000000000000896001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b1580156111c757600080fd5b505afa1580156111db573d6000803e3d6000fd5b505050506040513d60208110156111f157600080fd5b50516040805163d21220a760e01b815290516001600160a01b038d169163d21220a7916004808301926020929190829003018186803b15801561123357600080fd5b505afa158015611247573d6000803e3d6000fd5b505050506040513d602081101561125d57600080fd5b505186547f00000000000000000000000000000000000000000000000000000000000000006136cd565b915091508682108061129857508581105b6112d35760405162461bcd60e51b81526004018080602001828103825260428152602001806142986042913960600191505060405180910390fd5b6001838101805460ff19168217905560028401889055600384018790556040805191825260208201899052818101889052516001600160a01b038a169133917fdea5d74782bf732c878ef9cbb34d8234b93a0e2f726e7b5389e11a666d87c5739181900360600190a35050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60025460ff1690565b6005546001600160a01b031681565b6001600160a01b0380831660008181526006602090815260408083209486168352938152838220928252600790529182208054806113c65760009350505050611566565b604080516393f1a40b60e01b81526004810183905230602482015281516000926001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016926393f1a40b9260448083019392829003018186803b15801561143257600080fd5b505afa158015611446573d6000803e3d6000fd5b505050506040513d604081101561145c57600080fd5b5051600184015490915081156115365760007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d105228885306040518363ffffffff1660e01b815260040180838152602001826001600160a01b031681526020019250505060206040518083038186803b1580156114e357600080fd5b505afa1580156114f7573d6000803e3d6000fd5b505050506040513d602081101561150d57600080fd5b5051905061153261152784610d648464e8d4a5100061342b565b60018701549061332c565b9150505b61155e8560040154610ed364e8d4a51000610d64858a6000015461342b90919063ffffffff16565b955050505050505b92915050565b6007602052600090815260409020805460019091015482565b8060006115e57f0000000000000000000000000000000000000000000000000000000000000000836001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b1580156109e757600080fd5b9050816001600160a01b0316816001600160a01b0316146116375760405162461bcd60e51b81526004018080602001828103825260228152602001806142766022913960400191505060405180910390fd5b6001600160a01b038316600081815260066020908152604080832033845282528083209383526007909152902080548254811561187b57604080516393f1a40b60e01b81526004810184905230602482015281516000926001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016926393f1a40b9260448083019392829003018186803b1580156116da57600080fd5b505afa1580156116ee573d6000803e3d6000fd5b505050506040513d604081101561170457600080fd5b505160408051631a20a45160e31b81526004810186905230602482015290519192506000916001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169163d1052288916044808301926020929190829003018186803b15801561177957600080fd5b505afa15801561178d573d6000803e3d6000fd5b505050506040513d60208110156117a357600080fd5b5051905060006117b383856134eb565b90506000821180156117c55750600081115b156117f1576117eb6117e082610d648564e8d4a5100061342b565b60018801549061332c565b60018701555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663441a3e7086866040518363ffffffff1660e01b81526004018083815260200182815260200192505050600060405180830381600087803b15801561185f57600080fd5b505af1158015611873573d6000803e3d6000fd5b505050505050505b600080855560048086018290556040805163a9059cbb60e01b8152339281019290925260248201849052516001600160a01b038a169263a9059cbb92604480820193602093909283900390910190829087803b1580156118da57600080fd5b505af11580156118ee573d6000803e3d6000fd5b505050506040513d602081101561190457600080fd5b50506040805182815290516001600160a01b0389169133917ff24ef89f38eadc1bde50701ad6e4d6d11a2dc24f7cf834a486991f38833285049181900360200190a350505050505050565b611957613288565b6001600160a01b0316611968611b57565b6001600160a01b0316146119b1576040805162461bcd60e51b815260206004820181905260248201526000805160206142da833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b611a03613288565b6001600160a01b0316611a14611b57565b6001600160a01b031614611a5d576040805162461bcd60e51b815260206004820181905260248201526000805160206142da833981519152604482015290519081900360640190fd5b610893613872565b611a6d613288565b6001600160a01b0316611a7e611b57565b6001600160a01b031614611ac7576040805162461bcd60e51b815260206004820181905260248201526000805160206142da833981519152604482015290519081900360640190fd5b612710611adf6003548361332c90919063ffffffff16565b1115611b1c5760405162461bcd60e51b81526004018080602001828103825260398152602001806143456039913960400191505060405180910390fd5b60048190556040805182815290517fdd1a3e6010da6dc3f5950607c27386b3a811a156b785703ea37b5dd926317d019181900360200190a150565b6000546001600160a01b031690565b60035481565b60085460ff1681565b816000611bd57f0000000000000000000000000000000000000000000000000000000000000000836001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b1580156109e757600080fd5b9050816001600160a01b0316816001600160a01b031614611c275760405162461bcd60e51b81526004018080602001828103825260228152602001806142766022913960400191505060405180910390fd5b611c2f613288565b6001600160a01b0316611c40611b57565b6001600160a01b031614611c89576040805162461bcd60e51b815260206004820181905260248201526000805160206142da833981519152604482015290519081900360640190fd5b60008311611cc85760405162461bcd60e51b815260040180806020018281038252602e8152602001806143e0602e913960400191505060405180910390fd5b6001600160a01b038416600081815260076020908152604080832081516370a0823160e01b815230600482015291519094926370a082319260248082019391829003018186803b158015611d1b57600080fd5b505afa158015611d2f573d6000803e3d6000fd5b505050506040513d6020811015611d4557600080fd5b5051825460408051631526fe2760e01b815260048101899052905192935090916000916001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691631526fe2791602480820192608092909190829003018186803b158015611db957600080fd5b505afa158015611dcd573d6000803e3d6000fd5b505050506040513d6080811015611de357600080fd5b505190506001600160a01b0380821690891614611e315760405162461bcd60e51b81526004018080602001828103825260348152602001806141a76034913960400191505060405180910390fd5b81158015611e3e57508215155b15611f6e57876001600160a01b031663095ea7b37f0000000000000000000000000000000000000000000000000000000000000000856040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015611eba57600080fd5b505af1158015611ece573d6000803e3d6000fd5b505050506040513d6020811015611ee457600080fd5b505060408051631c57762b60e31b8152600481018990526024810185905290516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169163e2bbb15891604480830192600092919082900301818387803b158015611f5557600080fd5b505af1158015611f69573d6000803e3d6000fd5b505050505b811561229b57604080516393f1a40b60e01b81526004810184905230602482015281516000926001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016926393f1a40b9260448083019392829003018186803b158015611fe057600080fd5b505afa158015611ff4573d6000803e3d6000fd5b505050506040513d604081101561200a57600080fd5b5051905080156122995760007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d105228885306040518363ffffffff1660e01b815260040180838152602001826001600160a01b031681526020019250505060206040518083038186803b15801561208b57600080fd5b505afa15801561209f573d6000803e3d6000fd5b505050506040513d60208110156120b557600080fd5b505190506120cf6117e083610d648464e8d4a5100061342b565b600187015560408051630441a3e760e41b8152600481018690526024810184905290516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169163441a3e7091604480830192600092919082900301818387803b15801561214357600080fd5b505af1158015612157573d6000803e3d6000fd5b5050506001600160a01b038b16905063095ea7b37f0000000000000000000000000000000000000000000000000000000000000000612196858961332c565b6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156121dc57600080fd5b505af11580156121f0573d6000803e3d6000fd5b505050506040513d602081101561220657600080fd5b50506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663e2bbb1588a612242858961332c565b6040518363ffffffff1660e01b81526004018083815260200182815260200192505050600060405180830381600087803b15801561227f57600080fd5b505af1158015612293573d6000803e3d6000fd5b50505050505b505b8684556040805188815290516001600160a01b038a16917f766454cf266311018043fed7121567eca6b8f60d59bc0262dc5f2224734128a1919081900360200190a25050505050505050565b6122ef61136a565b15612334576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b6002600154141561238c576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600260015560085460ff1615806123b257503360009081526009602052604090205460ff165b6123fa576040805162461bcd60e51b815260206004820152601460248201527310d30e88139bdd081a5b881dda1a5d195b1a5cdd60621b604482015290519081900360640190fd5b6001600160a01b038083166000908152600660209081526040808320938516835292905220805461245c5760405162461bcd60e51b81526004018080602001828103825260218152602001806142fa6021913960400191505060405180910390fd5b600181015460ff166124b5576040805162461bcd60e51b815260206004820152601d60248201527f436f6e646974696f6e616c4c69717569646974793a204e6f2072756c65000000604482015290519081900360640190fd5b80546001600160a01b03841660009081526007602052604090208054801561272e57604080516393f1a40b60e01b81526004810183905230602482015281516000926001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016926393f1a40b9260448083019392829003018186803b15801561254357600080fd5b505afa158015612557573d6000803e3d6000fd5b505050506040513d604081101561256d57600080fd5b505160408051631a20a45160e31b81526004810185905230602482015290519192506000916001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169163d1052288916044808301926020929190829003018186803b1580156125e257600080fd5b505afa1580156125f6573d6000803e3d6000fd5b505050506040513d602081101561260c57600080fd5b50519050801580159061261f5750600082115b156126405761263a610d6a83610d648464e8d4a5100061342b565b60018501555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663441a3e7084876040518363ffffffff1660e01b81526004018083815260200182815260200192505050600060405180830381600087803b1580156126ae57600080fd5b505af11580156126c2573d6000803e3d6000fd5b5050505060006126f08760040154610ed364e8d4a51000610d6489600101548b61342b90919063ffffffff16565b9050801561272a5760006127048a83613548565b905060006127138b84336138f5565b90506127278a610efd83610ed387876134eb565b50505b5050505b6000866001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561276957600080fd5b505afa15801561277d573d6000803e3d6000fd5b505050506040513d602081101561279357600080fd5b50516040805163d21220a760e01b815290519192506000916001600160a01b038a169163d21220a7916004808301926020929190829003018186803b1580156127db57600080fd5b505afa1580156127ef573d6000803e3d6000fd5b505050506040513d602081101561280557600080fd5b5051604080516370a0823160e01b81526001600160a01b038a811660048301529151929350600092918516916370a0823191602480820192602092909190829003018186803b15801561285757600080fd5b505afa15801561286b573d6000803e3d6000fd5b505050506040513d602081101561288157600080fd5b5051604080516370a0823160e01b81526001600160a01b038b811660048301529151929350600092918516916370a0823191602480820192602092909190829003018186803b1580156128d357600080fd5b505afa1580156128e7573d6000803e3d6000fd5b505050506040513d60208110156128fd57600080fd5b50516040805163095ea7b360e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018b90529151929350908c169163095ea7b3916044808201926020929091908290030181600087803b15801561297557600080fd5b505af1158015612989573d6000803e3d6000fd5b505050506040513d602081101561299f57600080fd5b50506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663baa2abde85858a6000808f6129e34261025861332c565b6040518863ffffffff1660e01b815260040180886001600160a01b03168152602001876001600160a01b03168152602001868152602001858152602001848152602001836001600160a01b031681526020018281526020019750505050505050506040805180830381600087803b158015612a5d57600080fd5b505af1158015612a71573d6000803e3d6000fd5b505050506040513d6040811015612a8757600080fd5b5050604080516370a0823160e01b81526001600160a01b038b8116600483015291516000928716916370a08231916024808301926020929190829003018186803b158015612ad457600080fd5b505afa158015612ae8573d6000803e3d6000fd5b505050506040513d6020811015612afe57600080fd5b5051604080516370a0823160e01b81526001600160a01b038d811660048301529151929350600092918716916370a0823191602480820192602092909190829003018186803b158015612b5057600080fd5b505afa158015612b64573d6000803e3d6000fd5b505050506040513d6020811015612b7a57600080fd5b505190506000612b8a83866134eb565b90508a60020154811015612bcf5760405162461bcd60e51b81526004018080602001828103825260338152602001806142226033913960400191505060405180910390fd5b6000612bdb83866134eb565b90508b60030154811015612c205760405162461bcd60e51b815260040180806020018281038252603381526020018061437e6033913960400191505060405180910390fd5b6000808d5560048d0155612c348e8e613646565b8d6001600160a01b0316336001600160a01b03168e6001600160a01b03167f1510e2ed338edee1886724f1ef221d3745a3f73bd785d64e091c3663f75de3a28e868660405180848152602001838152602001828152602001935050505060405180910390a4505060018055505050505050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6107128133613646565b60045481565b612ce9613288565b6001600160a01b0316612cfa611b57565b6001600160a01b031614612d43576040805162461bcd60e51b815260206004820181905260248201526000805160206142da833981519152604482015290519081900360640190fd5b600580546001600160a01b0383166001600160a01b0319909116811790915560408051918252517fcb7ef3e545f5cdb893f5c568ba710fe08f336375a2d9fd66e161033f8fc09ef39181900360200190a150565b612d9f613288565b6001600160a01b0316612db0611b57565b6001600160a01b031614612df9576040805162461bcd60e51b815260206004820181905260248201526000805160206142da833981519152604482015290519081900360640190fd5b6001600160a01b038116612e3e5760405162461bcd60e51b81526004018080602001828103825260268152602001806141816026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038216600090815260066020908152604080832033845290915290208054821115612efc5760405162461bcd60e51b815260040180806020018281038252602f8152602001806143b1602f913960400191505060405180910390fd5b6001600160a01b03831660009081526007602052604090208054801561316357604080516393f1a40b60e01b81526004810183905230602482015281516000926001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016926393f1a40b9260448083019392829003018186803b158015612f8857600080fd5b505afa158015612f9c573d6000803e3d6000fd5b505050506040513d6040811015612fb257600080fd5b505160408051631a20a45160e31b81526004810185905230602482015290519192506000916001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169163d1052288916044808301926020929190829003018186803b15801561302757600080fd5b505afa15801561303b573d6000803e3d6000fd5b505050506040513d602081101561305157600080fd5b5051905080158015906130645750600082115b156130855761307f610d6a83610d648464e8d4a5100061342b565b60018501555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663441a3e7084886040518363ffffffff1660e01b81526004018083815260200182815260200192505050600060405180830381600087803b1580156130f357600080fd5b505af1158015613107573d6000803e3d6000fd5b5050505060006131398660040154610ed364e8d4a51000610d6489600101548b6000015461342b90919063ffffffff16565b9050801561315f57600061314d8983613548565b905061315d33610efd84846134eb565b505b5050505b83156131fd57825461317590856134eb565b83556040805163a9059cbb60e01b81523360048201526024810186905290516001600160a01b0387169163a9059cbb9160448083019260209291908290030181600087803b1580156131c657600080fd5b505af11580156131da573d6000803e3d6000fd5b505050506040513d60208110156131f057600080fd5b506131fd90508533613646565b600182015483546132189164e8d4a5100091610d649161342b565b60048401556040805185815290516001600160a01b0387169133917f9b1bfa7fa9ee420a16e124f794c35ac9f90472acc99140eb2f6447c714cad8eb9181900360200190a35050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b3390565b61329461136a565b6132dc576040805162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015290519081900360640190fd5b6002805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa61330f613288565b604080516001600160a01b039092168252519081900360200190a1565b600082820183811015613386576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b600080600061339c86866139a3565b604080516bffffffffffffffffffffffff19606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501206001600160f81b031960688401529b90941b9093166069840152607d830199909952609d808301969096528851808303909601865260bd9091019097525050815191909401209392505050565b60008261343a57506000611566565b8282028284828161344757fe5b04146133865760405162461bcd60e51b81526004018080602001828103825260218152602001806142556021913960400191505060405180910390fd5b60008082116134da576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b8183816134e357fe5b049392505050565b600082821115613542576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b60008082156133865761356c612710610d646003548661342b90919063ffffffff16565b6005549091506135a9906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169116836135ef565b6040805182815290516001600160a01b038616917fff6190303c5c985e8b644f9acb97f3b6cdbc78c041a86260c174c11a03c1dbe5919081900360200190a29392505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052613641908490613a97565b505050565b6001600160a01b03808316600081815260066020908152604080832094861680845294825280832060018101805460ff191690556002810184905560038101849055815184815292830184905282820193909352519193917fdea5d74782bf732c878ef9cbb34d8234b93a0e2f726e7b5389e11a666d87c5739181900360600190a3505050565b6000806000806136df89898988613b48565b9150915060006136f18a8a8a8961338d565b90506000806001600160a01b03168b6001600160a01b031663017e7e586040518163ffffffff1660e01b815260040160206040518083038186803b15801561373857600080fd5b505afa15801561374c573d6000803e3d6000fd5b505050506040513d602081101561376257600080fd5b50516001600160a01b03161415905060008161377f5760006137e5565b826001600160a01b0316637464fc3d6040518163ffffffff1660e01b815260040160206040518083038186803b1580156137b857600080fd5b505afa1580156137cc573d6000803e3d6000fd5b505050506040513d60208110156137e257600080fd5b50515b90506000836001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561382257600080fd5b505afa158015613836573d6000803e3d6000fd5b505050506040513d602081101561384c57600080fd5b5051905061385e8686838d8787613c18565b975097505050505050509550959350505050565b61387a61136a565b156138bf576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b6002805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861330f613288565b600080831561399b57613919612710610d646004548761342b90919063ffffffff16565b905061394f6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001684836135ef565b826001600160a01b0316856001600160a01b03167f41a64d2c893c8a4d76e68fae28dd786f4c3d704b2e7733302789c3ac6ae5b543836040518082815260200191505060405180910390a35b949350505050565b600080826001600160a01b0316846001600160a01b03161415613a0d576040805162461bcd60e51b815260206004820152601f60248201527f5656534c6962726172793a204944454e544943414c5f41444452455353455300604482015290519081900360640190fd5b826001600160a01b0316846001600160a01b031610613a2d578284613a30565b83835b90925090506001600160a01b038216613a90576040805162461bcd60e51b815260206004820152601860248201527f5656534c6962726172793a205a45524f5f414444524553530000000000000000604482015290519081900360640190fd5b9250929050565b6060613aec826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613cd89092919063ffffffff16565b80519091501561364157808060200190516020811015613b0b57600080fd5b50516136415760405162461bcd60e51b815260040180806020018281038252602a81526020018061431b602a913960400191505060405180910390fd5b6000806000613b5786866139a3565b509050600080613b698989898961338d565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015613ba157600080fd5b505afa158015613bb5573d6000803e3d6000fd5b505050506040513d6060811015613bcb57600080fd5b5080516020909101516dffffffffffffffffffffffffffff91821693501690506001600160a01b0388811690841614613c05578082613c08565b81815b909a909950975050505050505050565b600080838015613c285750600083115b15613ca3576000613c41613c3c8a8a61342b565b613ce7565b90506000613c4e85613ce7565b905080821115613ca057876000613c6584846134eb565b90506000613c7e84613c7887600461342b565b9061332c565b90506000613c8d848484613e2f565b9050613c998c8261332c565b9b50505050505b50505b85613cae898761342b565b81613cb557fe5b0486613cc1898861342b565b81613cc857fe5b0491509150965096945050505050565b606061399b8484600085613ee8565b600081613cf657506000613e2a565b816001600160801b8210613d0f5760809190911c9060401b5b680100000000000000008210613d2a5760409190911c9060201b5b6401000000008210613d415760209190911c9060101b5b620100008210613d565760109190911c9060081b5b6101008210613d6a5760089190911c9060041b5b60108210613d7d5760049190911c9060021b5b60088210613d895760011b5b6001818581613d9457fe5b048201901c90506001818581613da657fe5b048201901c90506001818581613db857fe5b048201901c90506001818581613dca57fe5b048201901c90506001818581613ddc57fe5b048201901c90506001818581613dee57fe5b048201901c90506001818581613e0057fe5b048201901c90506000818581613e1257fe5b049050808210613e225780613e24565b815b93505050505b919050565b6000806000613e3e8686614039565b9150915060008480613e4c57fe5b868809905082811115613e60576001820391505b918290039181613e7e57848381613e7357fe5b049350505050613386565b848210613ed2576040805162461bcd60e51b815260206004820152601a60248201527f46756c6c4d6174683a2046554c4c4449565f4f564552464c4f57000000000000604482015290519081900360640190fd5b613edd838387614066565b979650505050505050565b606082471015613f295760405162461bcd60e51b81526004018080602001828103825260268152602001806141fc6026913960400191505060405180910390fd5b613f32856140d6565b613f83576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b60208310613fc25780518252601f199092019160209182019101613fa3565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114614024576040519150601f19603f3d011682016040523d82523d6000602084013e614029565b606091505b5091509150613edd8282866140dc565b600080806000198486099050838502925082810391508281101561405e576001820391505b509250929050565b6000818103821680838161407657fe5b04925080858161408257fe5b04945080816000038161409157fe5b60028581038087028203028087028203028087028203028087028203028087028203028087028203029586029003909402930460010193909302939093010292915050565b3b151590565b606083156140eb575081613386565b8251156140fb5782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561414557818101518382015260200161412d565b50505050905090810190601f1680156141725780820380516001836020036101000a031916815260200191505b509250505060405180910390fdfe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373436f6e646974696f6e616c4c69717569646974793a204c5020746f6b656e206e6f742073616d65206173206372616674736d616e436f6e646974696f6e616c4c69717569646974793a20416d6f756e742069732030416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c436f6e646974696f6e616c4c69717569646974793a20746f6b656e30446966662062656c6f77206d696e546f6b656e30416d74536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77436f6e646974696f6e616c4c69717569646974793a204e6f74205656532070616972436f6e646974696f6e616c4c69717569646974793a20746f6b656e30206f7220746f6b656e31206d7573742062652067726561746572207468616e204c502076616c4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572436f6e646974696f6e616c4c69717569646974793a204e6f204c502061646465645361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564436f6e646974696f6e616c4c69717569646974793a206665652063616e6e6f74206265206d6f7265207468616e204d41585f5656535f464545436f6e646974696f6e616c4c69717569646974793a20746f6b656e314469666620756e646572206d696e546f6b656e31416d74436f6e646974696f6e616c4c69717569646974793a20776974686472617720616d6f756e74203e2062616c616e6365436f6e646974696f6e616c4c69717569646974793a20706964206d7573742062652031206f722067726561746572a264697066735822122041569b4dcd020d11bb2190f187523d2105ec036a20cfceb716cf5da4bef96cac64736f6c634300060c00330000000000000000000000003b44b2a187a7b3824131f8db5a74194d0a42fc15000000000000000000000000145863eb42cf62847a6ca784e6416c1682b1b2ae000000000000000000000000dccd6455ae04b03d785f12196b492b18129564bc0000000000000000000000002d03bece6747adc00e1a131bba1469c15fd11e03000000000000000000000000e09f3b486c6d45cf7017d5d45dfb3ab35f8a51b8

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

0000000000000000000000003b44b2a187a7b3824131f8db5a74194d0a42fc15000000000000000000000000145863eb42cf62847a6ca784e6416c1682b1b2ae000000000000000000000000dccd6455ae04b03d785f12196b492b18129564bc0000000000000000000000002d03bece6747adc00e1a131bba1469c15fd11e03000000000000000000000000e09f3b486c6d45cf7017d5d45dfb3ab35f8a51b8

-----Decoded View---------------
Arg [0] : _factory (address): 0x3b44b2a187a7b3824131f8db5a74194d0a42fc15
Arg [1] : _router (address): 0x145863eb42cf62847a6ca784e6416c1682b1b2ae
Arg [2] : _craftsman (address): 0xdccd6455ae04b03d785f12196b492b18129564bc
Arg [3] : _vvs (address): 0x2d03bece6747adc00e1a131bba1469c15fd11e03
Arg [4] : _treasury (address): 0xe09f3b486c6d45cf7017d5d45dfb3ab35f8a51b8

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000003b44b2a187a7b3824131f8db5a74194d0a42fc15
Arg [1] : 000000000000000000000000145863eb42cf62847a6ca784e6416c1682b1b2ae
Arg [2] : 000000000000000000000000dccd6455ae04b03d785f12196b492b18129564bc
Arg [3] : 0000000000000000000000002d03bece6747adc00e1a131bba1469c15fd11e03
Arg [4] : 000000000000000000000000e09f3b486c6d45cf7017d5d45dfb3ab35f8a51b8


Deployed ByteCode Sourcemap

42924:20791:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43195:27;;;:::i;:::-;;;;-1:-1:-1;;;;;43195:27:0;;;;;;;;;;;;;;43548:64;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;43548:64:0;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43282:43;;;:::i;:::-;;;;;;;;;;;;;;;;60329:216;;;;;;;;;;;;;;;;-1:-1:-1;60329:216:0;-1:-1:-1;;;;;60329:216:0;;:::i;:::-;;43151:37;;;:::i;60653:221::-;;;;;;;;;;;;;;;;-1:-1:-1;60653:221:0;-1:-1:-1;;;;;60653:221:0;;:::i;43827:48::-;;;;;;;;;;;;;;;;-1:-1:-1;43827:48:0;-1:-1:-1;;;;;43827:48:0;;:::i;:::-;;;;;;;;;;;;;;;;;;59059:67;;;:::i;59248:340::-;;;;;;;;;;;;;;;;-1:-1:-1;59248:340:0;;:::i;48578:1766::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;48578:1766:0;;;;;;;;:::i;60988:175::-;;;;;;;;;;;;;;;;-1:-1:-1;60988:175:0;;;;:::i;52589:1193::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;52589:1193:0;;;;;;;;;;;;;;;;;;:::i;43229:44::-;;;:::i;26567:86::-;;;:::i;43437:23::-;;;:::i;57973:866::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;57973:866:0;;;;;;;;;;:::i;43664:46::-;;;;;;;;;;;;;;;;-1:-1:-1;43664:46:0;-1:-1:-1;;;;;43664:46:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;62582:1130;;;;;;;;;;;;;;;;-1:-1:-1;62582:1130:0;-1:-1:-1;;;;;62582:1130:0;;:::i;24920:148::-;;;:::i;58918:63::-;;;:::i;59707:328::-;;;;;;;;;;;;;;;;-1:-1:-1;59707:328:0;;:::i;24269:87::-;;;:::i;43340:35::-;;;:::i;43778:42::-;;;:::i;46649:1782::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;46649:1782:0;;;;;;;;:::i;54262:3473::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;54262:3473:0;;;;;;;;;;:::i;43067:36::-;;;:::i;53924:100::-;;;;;;;;;;;;;;;;-1:-1:-1;53924:100:0;-1:-1:-1;;;;;53924:100:0;;:::i;43388:33::-;;;:::i;60089:138::-;;;;;;;;;;;;;;;;-1:-1:-1;60089:138:0;-1:-1:-1;;;;;60089:138:0;;:::i;25223:244::-;;;;;;;;;;;;;;;;-1:-1:-1;25223:244:0;-1:-1:-1;;;;;25223:244:0;;:::i;50492:1702::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;50492:1702:0;;;;;;;;:::i;43110:34::-;;;:::i;43195:27::-;;;:::o;43548:64::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;43282:43::-;43320:5;43282:43;:::o;60329:216::-;24500:12;:10;:12::i;:::-;-1:-1:-1;;;;;24489:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;24489:23:0;;24481:68;;;;;-1:-1:-1;;;24481:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;24481:68:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;60411:22:0;::::1;;::::0;;;:16:::1;:22;::::0;;;;;::::1;;60406:132;;-1:-1:-1::0;;;;;60450:22:0;::::1;;::::0;;;:16:::1;:22;::::0;;;;;;;;:29;;-1:-1:-1;;60450:29:0::1;60475:4;60450:29;::::0;;60499:27;;;;;;;::::1;::::0;;;;;;;;::::1;60406:132;60329:216:::0;:::o;43151:37::-;;;:::o;60653:221::-;24500:12;:10;:12::i;:::-;-1:-1:-1;;;;;24489:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;24489:23:0;;24481:68;;;;;-1:-1:-1;;;24481:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;24481:68:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;60737:22:0;::::1;;::::0;;;:16:::1;:22;::::0;;;;;::::1;;60733:134;;;-1:-1:-1::0;;;;;60776:22:0;::::1;60801:5;60776:22:::0;;;:16:::1;:22;::::0;;;;;;;;:30;;-1:-1:-1;;60776:30:0::1;::::0;;60826:29;;;;;;;::::1;::::0;;;;;;;;::::1;60653:221:::0;:::o;43827:48::-;;;;;;;;;;;;;;;:::o;59059:67::-;24500:12;:10;:12::i;:::-;-1:-1:-1;;;;;24489:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;24489:23:0;;24481:68;;;;;-1:-1:-1;;;24481:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;24481:68:0;;;;;;;;;;;;;;;59108:10:::1;:8;:10::i;:::-;59059:67::o:0;59248:340::-;24500:12;:10;:12::i;:::-;-1:-1:-1;;;;;24489:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;24489:23:0;;24481:68;;;;;-1:-1:-1;;;24481:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;24481:68:0;;;;;;;;;;;;;;;43320:5:::1;59352:33;59372:12;;59352:15;:19;;:33;;;;:::i;:::-;:48;;59330:155;;;;-1:-1:-1::0;;;59330:155:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59496:14;:32:::0;;;59546:34:::1;::::0;;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;59248:340:::0;:::o;48578:1766::-;48670:8;45712:12;45727:158;45768:7;45791:8;-1:-1:-1;;;;;45791:15:0;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45791:17:0;45823;;;-1:-1:-1;;;45823:17:0;;;;-1:-1:-1;;;;;45823:15:0;;;;;:17;;;;;45791;;45823;;;;;;;:15;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45823:17:0;45855:19;45727:18;:158::i;:::-;45712:173;;45934:8;-1:-1:-1;;;;;45918:25:0;:4;-1:-1:-1;;;;;45918:25:0;;45896:109;;;;-1:-1:-1;;;45896:109:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26893:8:::1;:6;:8::i;:::-;26892:9;26884:38;;;::::0;;-1:-1:-1;;;26884:38:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;26884:38:0;;;;;;;;;;;;;::::1;;48723:11:::0;;48719:101:::2;;48751:57;::::0;;-1:-1:-1;;;48751:57:0;;48773:10:::2;48751:57;::::0;::::2;::::0;48793:4:::2;48751:57:::0;;;;;;;;;;;;-1:-1:-1;;;;;48751:21:0;::::2;::::0;::::2;::::0;:57;;;;;::::2;::::0;;;;;;;;-1:-1:-1;48751:21:0;:57;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;;48719:101:0::2;-1:-1:-1::0;;;;;48856:27:0;::::2;48832:21;48856:27:::0;;;:8:::2;:27;::::0;;;;;;;48884:10:::2;48856:39:::0;;;;;;;48930:29;;;:10:::2;:29:::0;;;;;48986:8;;49065;;49061:999:::2;;49113:38;::::0;;-1:-1:-1;;;49113:38:0;;::::2;::::0;::::2;::::0;;;49145:4:::2;49113:38:::0;;;;;;49091:16:::2;::::0;-1:-1:-1;;;;;49113:9:0::2;:18;::::0;::::2;::::0;:38;;;;;;;;;;;:18;:38;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;49113:38:0;;49214:40;;-1:-1:-1;;;49214:40:0;;::::2;::::0;::::2;::::0;;;49248:4:::2;49214:40:::0;;;;;;49113:38;;-1:-1:-1;49193:18:0::2;::::0;-1:-1:-1;;;;;49214:9:0::2;:20;::::0;::::2;::::0;:40;;;;;49113:38:::2;::::0;49214:40;;;;;;;:20;:40;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;49214:40:0;;-1:-1:-1;49273:14:0;;;;;:30:::2;;;49302:1;49291:8;:12;49273:30;49269:261;;;49418:96;49461:34;49486:8:::0;49461:20:::2;:10:::0;49476:4:::2;49461:14;:20::i;:::-;:24:::0;::::2;:34::i;:::-;49418:16;::::0;::::2;::::0;;:20:::2;:96::i;:::-;49399:16;::::0;::::2;:115:::0;49269:261:::2;49635:8;-1:-1:-1::0;;;;;49635:16:0::2;;49660:9;49672:7;49635:45;;;;;;;;;;;;;-1:-1:-1::0;;;;;49635:45:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;;49695:31:0::2;::::0;;-1:-1:-1;;;49695:31:0;;::::2;::::0;::::2;::::0;;;;;;;;;;;-1:-1:-1;;;;;49695:9:0::2;:17;::::0;::::2;::::0;:31;;;;;-1:-1:-1;;49695:31:0;;;;;;;-1:-1:-1;49695:17:0;:31;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;49743:15;49761:96;49827:4;:15;;;49761:43;49799:4;49761:33;49777:4;:16;;;49761:4;:11;;;:15;;:33;;;;:::i;:43::-;:47:::0;::::2;:96::i;:::-;49743:114:::0;-1:-1:-1;49876:11:0;;49872:177:::2;;49908:11;49922:46;49950:8;49960:7;49922:27;:46::i;:::-;49908:60:::0;-1:-1:-1;49987:46:0::2;50004:10;50016:16;:7:::0;49908:60;50016:11:::2;:16::i;:::-;-1:-1:-1::0;;;;;49987:3:0::2;:16;::::0;:46;:16:::2;:46::i;:::-;49872:177;;49061:999;;;;50076:11:::0;;50072:130:::2;;50118:11:::0;;:24:::2;::::0;50134:7;50118:15:::2;:24::i;:::-;50104:38:::0;;50157:33:::2;50169:8:::0;50179:10:::2;50157:11;:33::i;:::-;50246:16;::::0;::::2;::::0;50230:11;;:43:::2;::::0;50268:4:::2;::::0;50230:33:::2;::::0;:15:::2;:33::i;:43::-;50212:15;::::0;::::2;:61:::0;50289:47:::2;::::0;;;;;;;-1:-1:-1;;;;;50289:47:0;::::2;::::0;50297:10:::2;::::0;50289:47:::2;::::0;;;;::::2;::::0;;::::2;26933:1;;;48578:1766:::0;;;;:::o;60988:175::-;24500:12;:10;:12::i;:::-;-1:-1:-1;;;;;24489:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;24489:23:0;;24481:68;;;;;-1:-1:-1;;;24481:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;24481:68:0;;;;;;;;;;;;;;;61069:23:::1;:34:::0;;;::::1;;-1:-1:-1::0;;61069:34:0;;::::1;::::0;::::1;::::0;;;61119:36:::1;::::0;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;60988:175:::0;:::o;52589:1193::-;52749:9;46098:15;46086:8;:27;;46078:69;;;;;-1:-1:-1;;;46078:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;26893:8:::1;:6;:8::i;:::-;26892:9;26884:38;;;::::0;;-1:-1:-1;;;26884:38:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;26884:38:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;52809:27:0;::::2;52785:21;52809:27:::0;;;:8:::2;:27;::::0;;;;;;;52837:10:::2;52809:39:::0;;;;;;;52867:11;;52859:61:::2;;;;-1:-1:-1::0;;;52859:61:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52934:17;52953::::0;52974:245:::2;53056:7;53083:8;-1:-1:-1::0;;;;;53083:15:0::2;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;53083:17:0;53119::::2;::::0;;-1:-1:-1;;;53119:17:0;;;;-1:-1:-1;;;;;53119:15:0;::::2;::::0;::::2;::::0;:17:::2;::::0;;::::2;::::0;53083::::2;::::0;53119;;;;;;;:15;:17;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;53119:17:0;53155:11;;53185:19:::2;52974:55;:245::i;:::-;52933:286;;;;53338:13;53326:9;:25;:54;;;;53367:13;53355:9;:25;53326:54;53304:170;;;;-1:-1:-1::0;;;53304:170:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53509:4;53487:19:::0;;::::2;:26:::0;;-1:-1:-1;;53487:26:0::2;::::0;::::2;::::0;;53524:17:::2;::::0;::::2;:33:::0;;;53568:17:::2;::::0;::::2;:33:::0;;;53619:155:::2;::::0;;;;;::::2;::::0;::::2;::::0;;;;;;;;;;-1:-1:-1;;;;;53619:155:0;::::2;::::0;53646:10:::2;::::0;53619:155:::2;::::0;;;;;;;::::2;26933:1;;;52589:1193:::0;;;;;:::o;43229:44::-;;;:::o;26567:86::-;26638:7;;;;26567:86;:::o;43437:23::-;;;-1:-1:-1;;;;;43437:23:0;;:::o;57973:866::-;-1:-1:-1;;;;;58126:27:0;;;58077:7;58126:27;;;:8;:27;;;;;;;;:34;;;;;;;;;;;58195:29;;;:10;:29;;;;;58251:8;;58274;58270:91;;58306:1;58299:8;;;;;;;58270:91;58396:38;;;-1:-1:-1;;;58396:38:0;;;;;;;;58428:4;58396:38;;;;;;58374:16;;-1:-1:-1;;;;;58396:9:0;:18;;;;:38;;;;;;;;;;;:18;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58396:38:0;58494:16;;;;58396:38;;-1:-1:-1;58525:13:0;;58521:232;;58555:22;58580:9;-1:-1:-1;;;;;58580:20:0;;58601:3;58614:4;58580:40;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;58580:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58580:40:0;;-1:-1:-1;58649:92:0;58688:38;58717:8;58688:24;58580:40;58707:4;58688:18;:24::i;:38::-;58649:16;;;;;:20;:92::i;:::-;58635:106;;58521:232;;58772:59;58815:4;:15;;;58772:38;58805:4;58772:28;58788:11;58772:4;:11;;;:15;;:28;;;;:::i;:59::-;58765:66;;;;;;;57973:866;;;;;:::o;43664:46::-;;;;;;;;;;;;;;;;;;;:::o;62582:1130::-;62647:8;45712:12;45727:158;45768:7;45791:8;-1:-1:-1;;;;;45791:15:0;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45727:158;45712:173;;45934:8;-1:-1:-1;;;;;45918:25:0;:4;-1:-1:-1;;;;;45918:25:0;;45896:109;;;;-1:-1:-1;;;45896:109:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;62692:27:0;::::1;62668:21;62692:27:::0;;;:8:::1;:27;::::0;;;;;;;62720:10:::1;62692:39:::0;;;;;;;62766:29;;;:10:::1;:29:::0;;;;;62822:8;;62858:11;;62884:8;;62880:645:::1;;62932:38;::::0;;-1:-1:-1;;;62932:38:0;;::::1;::::0;::::1;::::0;;;62964:4:::1;62932:38:::0;;;;;;62910:16:::1;::::0;-1:-1:-1;;;;;62932:9:0::1;:18;::::0;::::1;::::0;:38;;;;;;;;;;;:18;:38;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;62932:38:0;;63004:40;;-1:-1:-1;;;63004:40:0;;::::1;::::0;::::1;::::0;;;63038:4:::1;63004:40:::0;;;;;;62932:38;;-1:-1:-1;62986:15:0::1;::::0;-1:-1:-1;;;;;63004:9:0::1;:20;::::0;::::1;::::0;:40;;;;;62932:38:::1;::::0;63004:40;;;;;;;:20;:40;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;63004:40:0;;-1:-1:-1;63059:19:0::1;63081:20;:8:::0;63094:6;63081:12:::1;:20::i;:::-;63059:42;;63294:1;63284:7;:11;:30;;;;;63313:1;63299:11;:15;63284:30;63280:186;;;63354:96;63397:34;63419:11:::0;63397:17:::1;:7:::0;63409:4:::1;63397:11;:17::i;:34::-;63354:16;::::0;::::1;::::0;;:20:::1;:96::i;:::-;63335:16;::::0;::::1;:115:::0;63280:186:::1;63482:9;-1:-1:-1::0;;;;;63482:18:0::1;;63501:3;63506:6;63482:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;62880:645;;;;63551:1;63537:15:::0;;;63563::::1;::::0;;::::1;:19:::0;;;63595:37:::1;::::0;;-1:-1:-1;;;63595:37:0;;63613:10:::1;63595:37:::0;;::::1;::::0;;;;;;;;;;;-1:-1:-1;;;;;63595:17:0;::::1;::::0;::::1;::::0;:37;;;;;::::1;::::0;;;;;;;;;;;;:17;:37;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;63648:56:0::1;::::0;;;;;;;-1:-1:-1;;;;;63648:56:0;::::1;::::0;63666:10:::1;::::0;63648:56:::1;::::0;;;;63595:37:::1;63648:56:::0;;::::1;46016:1;;;;62582:1130:::0;;;:::o;24920:148::-;24500:12;:10;:12::i;:::-;-1:-1:-1;;;;;24489:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;24489:23:0;;24481:68;;;;;-1:-1:-1;;;24481:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;24481:68:0;;;;;;;;;;;;;;;25027:1:::1;25011:6:::0;;24990:40:::1;::::0;-1:-1:-1;;;;;25011:6:0;;::::1;::::0;24990:40:::1;::::0;25027:1;;24990:40:::1;25058:1;25041:19:::0;;-1:-1:-1;;;;;;25041:19:0::1;::::0;;24920:148::o;58918:63::-;24500:12;:10;:12::i;:::-;-1:-1:-1;;;;;24489:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;24489:23:0;;24481:68;;;;;-1:-1:-1;;;24481:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;24481:68:0;;;;;;;;;;;;;;;58965:8:::1;:6;:8::i;59707:328::-:0;24500:12;:10;:12::i;:::-;-1:-1:-1;;;;;24489:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;24489:23:0;;24481:68;;;;;-1:-1:-1;;;24481:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;24481:68:0;;;;;;;;;;;;;;;43320:5:::1;59807:33;59825:14;;59807:13;:17;;:33;;;;:::i;:::-;:48;;59785:155;;;;-1:-1:-1::0;;;59785:155:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59951:12;:28:::0;;;59997:30:::1;::::0;;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;59707:328:::0;:::o;24269:87::-;24315:7;24342:6;-1:-1:-1;;;;;24342:6:0;24269:87;:::o;43340:35::-;;;;:::o;43778:42::-;;;;;;:::o;46649:1782::-;46741:8;45712:12;45727:158;45768:7;45791:8;-1:-1:-1;;;;;45791:15:0;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45727:158;45712:173;;45934:8;-1:-1:-1;;;;;45918:25:0;:4;-1:-1:-1;;;;;45918:25:0;;45896:109;;;;-1:-1:-1;;;45896:109:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24500:12:::1;:10;:12::i;:::-;-1:-1:-1::0;;;;;24489:23:0::1;:7;:5;:7::i;:::-;-1:-1:-1::0;;;;;24489:23:0::1;;24481:68;;;::::0;;-1:-1:-1;;;24481:68:0;;::::1;;::::0;::::1;::::0;;;;;;;-1:-1:-1;;;;;;;;;;;24481:68:0;;;;;;;;;;;;;::::1;;46801:1:::2;46794:4;:8;46786:67;;;;-1:-1:-1::0;;;46786:67:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;46888:29:0;::::2;46864:21;46888:29:::0;;;:10:::2;:29;::::0;;;;;;;46948:33;;-1:-1:-1;;;46948:33:0;;46975:4:::2;46948:33;::::0;::::2;::::0;;;46888:29;;;46948:18:::2;::::0;:33;;;;;;;;;;;46888:29;46948:33;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;46948:33:0;47006:8;;47125:24:::2;::::0;;-1:-1:-1;;;47125:24:0;;::::2;::::0;::::2;::::0;;;;;46948:33;;-1:-1:-1;47006:8:0;;46992:11:::2;::::0;-1:-1:-1;;;;;47125:9:0::2;:18;::::0;::::2;::::0;:24;;;;;::::2;::::0;;;;;;;;;:18;:24;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;47125:24:0;;-1:-1:-1;;;;;;47182:36:0;;::::2;::::0;;::::2;;47160:138;;;;-1:-1:-1::0;;;47160:138:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47391:8:::0;;:24;::::2;;;-1:-1:-1::0;47403:12:0;;::::2;47391:24;47387:149;;;47432:8;-1:-1:-1::0;;;;;47432:16:0::2;;47457:9;47469:7;47432:45;;;;;;;;;;;;;-1:-1:-1::0;;;;;47432:45:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;;47492:32:0::2;::::0;;-1:-1:-1;;;47492:32:0;;::::2;::::0;::::2;::::0;;;;;;;;;;;-1:-1:-1;;;;;47492:9:0::2;:17;::::0;::::2;::::0;:32;;;;;-1:-1:-1;;47492:32:0;;;;;;;-1:-1:-1;47492:17:0;:32;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;47387:149;47652:8:::0;;47648:700:::2;;47700:38;::::0;;-1:-1:-1;;;47700:38:0;;::::2;::::0;::::2;::::0;;;47732:4:::2;47700:38:::0;;;;;;47678:16:::2;::::0;-1:-1:-1;;;;;47700:9:0::2;:18;::::0;::::2;::::0;:38;;;;;;;;;;;:18;:38;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;47700:38:0;;-1:-1:-1;47759:12:0;;47755:582:::2;;47874:18;47895:9;-1:-1:-1::0;;;;;47895:20:0::2;;47916:3;47929:4;47895:40;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;47895:40:0::2;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;47895:40:0;;-1:-1:-1;47975:96:0::2;48018:34;48043:8:::0;48018:20:::2;47895:40:::0;48033:4:::2;48018:14;:20::i;47975:96::-;47956:16;::::0;::::2;:115:::0;48090:33:::2;::::0;;-1:-1:-1;;;48090:33:0;;::::2;::::0;::::2;::::0;;;;;;;;;;;-1:-1:-1;;;;;48090:9:0::2;:18;::::0;::::2;::::0;:33;;;;;-1:-1:-1;;48090:33:0;;;;;;;-1:-1:-1;48090:18:0;:33;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;;;;;;;48197:16:0;::::2;::::0;-1:-1:-1;48197:16:0::2;48222:9;48234:21;:8:::0;48247:7;48234:12:::2;:21::i;:::-;48197:59;;;;;;;;;;;;;-1:-1:-1::0;;;;;48197:59:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;;;;;;;48275:9:0::2;:17;;48293:4:::0;48299:21:::2;:8:::0;48312:7;48299:12:::2;:21::i;:::-;48275:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;47755:582;;47648:700;;48360:15:::0;;;48391:32:::2;::::0;;;;;;;-1:-1:-1;;;;;48391:32:0;::::2;::::0;::::2;::::0;;;;;::::2;::::0;;::::2;24560:1;;;;46649:1782:::0;;;;:::o;54262:3473::-;26893:8;:6;:8::i;:::-;26892:9;26884:38;;;;;-1:-1:-1;;;26884:38:0;;;;;;;;;;;;-1:-1:-1;;;26884:38:0;;;;;;;;;;;;;;;29509:1:::1;30115:7;;:19;;30107:63;;;::::0;;-1:-1:-1;;;30107:63:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;29509:1;30248:7;:18:::0;54415:23:::2;::::0;::::2;;54414:24;::::0;:56:::2;;-1:-1:-1::0;54459:10:0::2;54442:28;::::0;;;:16:::2;:28;::::0;;;;;::::2;;54414:56;54392:126;;;::::0;;-1:-1:-1;;;54392:126:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;54392:126:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;54555:27:0;;::::2;54531:21;54555:27:::0;;;:8:::2;:27;::::0;;;;;;;:34;;::::2;::::0;;;;;;54608:11;;54600:61:::2;;;;-1:-1:-1::0;;;54600:61:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54680:19;::::0;::::2;::::0;::::2;;54672:61;;;::::0;;-1:-1:-1;;;54672:61:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;54763:11:::0;;-1:-1:-1;;;;;54811:29:0;::::2;54746:14;54811:29:::0;;;:10:::2;:29;::::0;;;;54867:8;;54946;;54942:1314:::2;;54994:38;::::0;;-1:-1:-1;;;54994:38:0;;::::2;::::0;::::2;::::0;;;55026:4:::2;54994:38:::0;;;;;;54972:16:::2;::::0;-1:-1:-1;;;;;54994:9:0::2;:18;::::0;::::2;::::0;:38;;;;;;;;;;;:18;:38;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;54994:38:0;;55097:40;;-1:-1:-1;;;55097:40:0;;::::2;::::0;::::2;::::0;;;55131:4:::2;55097:40:::0;;;;;;54994:38;;-1:-1:-1;55076:18:0::2;::::0;-1:-1:-1;;;;;55097:9:0::2;:20;::::0;::::2;::::0;:40;;;;;54994:38:::2;::::0;55097:40;;;;;;;:20;:40;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;55097:40:0;;-1:-1:-1;55156:14:0;;;;;:30:::2;;;55185:1;55174:8;:12;55156:30;55152:265;;;55305:96;55348:34;55373:8:::0;55348:20:::2;:10:::0;55363:4:::2;55348:14;:20::i;55305:96::-;55286:16;::::0;::::2;:115:::0;55152:265:::2;55522:9;-1:-1:-1::0;;;;;55522:18:0::2;;55541:3;55546:6;55522:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;55570:15;55588:91;55649:4;:15;;;55588:38;55621:4;55588:28;55599:4;:16;;;55588:6;:10;;:28;;;;:::i;:91::-;55570:109:::0;-1:-1:-1;55700:11:0;;55696:549:::2;;55779:19;55801:107;55851:8;55882:7;55801:27;:107::i;:::-;55779:129;;55927:17;55947:138;55995:8;56026:7;56056:10;55947:25;:138::i;:::-;55927:158:::0;-1:-1:-1;56104:125:0::2;56143:5:::0;56171:39:::2;55927:158:::0;56171:24:::2;:7:::0;56183:11;56171::::2;:24::i;56104:125::-;55696:549;;;54942:1314;;;;56268:14;56285:8;-1:-1:-1::0;;;;;56285:15:0::2;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;56285:17:0;56330::::2;::::0;;-1:-1:-1;;;56330:17:0;;;;56285;;-1:-1:-1;56313:14:0::2;::::0;-1:-1:-1;;;;;56330:15:0;::::2;::::0;::::2;::::0;:17:::2;::::0;;::::2;::::0;56285::::2;::::0;56330;;;;;;;:15;:17;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;56330:17:0;56452:40:::2;::::0;;-1:-1:-1;;;56452:40:0;;-1:-1:-1;;;;;56452:40:0;;::::2;;::::0;::::2;::::0;;;56330:17;;-1:-1:-1;56426:23:0::2;::::0;56452:24;;::::2;::::0;::::2;::::0;:40;;;;;56330:17:::2;::::0;56452:40;;;;;;;;:24;:40;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;56452:40:0;56529::::2;::::0;;-1:-1:-1;;;56529:40:0;;-1:-1:-1;;;;;56529:40:0;;::::2;;::::0;::::2;::::0;;;56452;;-1:-1:-1;56503:23:0::2;::::0;56529:24;;::::2;::::0;::::2;::::0;:40;;;;;56452::::2;::::0;56529;;;;;;;;:24;:40;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;56529:40:0;56580:41:::2;::::0;;-1:-1:-1;;;56580:41:0;;-1:-1:-1;;;;;56605:6:0::2;56580:41:::0;::::2;;::::0;::::2;::::0;;;;;;;;;56529:40;;-1:-1:-1;56580:16:0;;::::2;::::0;::::2;::::0;:41;;;;;56529:40:::2;::::0;56580:41;;;;;;;;-1:-1:-1;56580:16:0;:41;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;;;;;;;56632:6:0::2;:22;;56669:6:::0;56690;56711;56732:1:::2;::::0;56764:5;56784:24:::2;:15;56804:3;56784:19;:24::i;:::-;56632:187;;;;;;;;;;;;;-1:-1:-1::0;;;;;56632:187:0::2;;;;;;-1:-1:-1::0;;;;;56632:187:0::2;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;56632:187:0::2;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;;56632:187:0;56855:40;;-1:-1:-1;;;56855:40:0;;-1:-1:-1;;;;;56855:40:0;;::::2;;::::0;::::2;::::0;;;56830:22:::2;::::0;56855:24;::::2;::::0;::::2;::::0;:40;;;;;56632:187:::2;::::0;56855:40;;;;;;;:24;:40;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;56855:40:0;56931::::2;::::0;;-1:-1:-1;;;56931:40:0;;-1:-1:-1;;;;;56931:40:0;;::::2;;::::0;::::2;::::0;;;56855;;-1:-1:-1;56906:22:0::2;::::0;56931:24;;::::2;::::0;::::2;::::0;:40;;;;;56855::::2;::::0;56931;;;;;;;;:24;:40;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;56931:40:0;;-1:-1:-1;56984:18:0::2;57005:35;:14:::0;57024:15;57005:18:::2;:35::i;:::-;56984:56;;57087:4;:17;;;57073:10;:31;;57051:132;;;;-1:-1:-1::0;;;57051:132:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57194:18;57215:35;:14:::0;57234:15;57215:18:::2;:35::i;:::-;57194:56;;57297:4;:17;;;57283:10;:31;;57261:132;;;;-1:-1:-1::0;;;57261:132:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57470:1;57456:15:::0;;;57482::::2;::::0;::::2;:19:::0;57512:28:::2;57524:8:::0;57534:5;57512:11:::2;:28::i;:::-;57636:8;-1:-1:-1::0;;;;;57558:169:0::2;57603:10;-1:-1:-1::0;;;;;57558:169:0::2;57583:5;-1:-1:-1::0;;;;;57558:169:0::2;;57660:6;57681:10;57706;57558:169;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;29465:1:0::1;30427:22:::0;;-1:-1:-1;;;;;;;;;;;;54262:3473:0:o;43067:36::-;;;:::o;53924:100::-;53983:33;53995:8;54005:10;53983:11;:33::i;43388:::-;;;;:::o;60089:138::-;24500:12;:10;:12::i;:::-;-1:-1:-1;;;;;24489:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;24489:23:0;;24481:68;;;;;-1:-1:-1;;;24481:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;24481:68:0;;;;;;;;;;;;;;;60159:8:::1;:20:::0;;-1:-1:-1;;;;;60159:20:0;::::1;-1:-1:-1::0;;;;;;60159:20:0;;::::1;::::0;::::1;::::0;;;60197:22:::1;::::0;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;60089:138:::0;:::o;25223:244::-;24500:12;:10;:12::i;:::-;-1:-1:-1;;;;;24489:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;24489:23:0;;24481:68;;;;;-1:-1:-1;;;24481:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;24481:68:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;25312:22:0;::::1;25304:73;;;;-1:-1:-1::0;;;25304:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25414:6;::::0;;25393:38:::1;::::0;-1:-1:-1;;;;;25393:38:0;;::::1;::::0;25414:6;::::1;::::0;25393:38:::1;::::0;::::1;25442:6;:17:::0;;-1:-1:-1;;;;;;25442:17:0::1;-1:-1:-1::0;;;;;25442:17:0;;;::::1;::::0;;;::::1;::::0;;25223:244::o;50492:1702::-;-1:-1:-1;;;;;50590:27:0;;50566:21;50590:27;;;:8;:27;;;;;;;;50618:10;50590:39;;;;;;;50673:11;;50662:22;;;50640:119;;;;-1:-1:-1;;;50640:119:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;50796:29:0;;50772:21;50796:29;;;:10;:29;;;;;50852:8;;50931;;50927:929;;50979:38;;;-1:-1:-1;;;50979:38:0;;;;;;;;51011:4;50979:38;;;;;;50957:16;;-1:-1:-1;;;;;50979:9:0;:18;;;;:38;;;;;;;;;;;:18;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50979:38:0;;51080:40;;-1:-1:-1;;;51080:40:0;;;;;;;;51114:4;51080:40;;;;;;50979:38;;-1:-1:-1;51059:18:0;;-1:-1:-1;;;;;51080:9:0;:20;;;;:40;;;;;50979:38;;51080:40;;;;;;;:20;:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51080:40:0;;-1:-1:-1;51139:14:0;;;;;:30;;;51168:1;51157:8;:12;51139:30;51135:261;;;51284:96;51327:34;51352:8;51327:20;:10;51342:4;51327:14;:20::i;51284:96::-;51265:16;;;:115;51135:261;51488:9;-1:-1:-1;;;;;51488:18:0;;51507:3;51512:7;51488:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51537:15;51555:96;51621:4;:15;;;51555:43;51593:4;51555:33;51571:4;:16;;;51555:4;:11;;;:15;;:33;;;;:::i;:96::-;51537:114;-1:-1:-1;51672:11:0;;51668:177;;51704:11;51718:46;51746:8;51756:7;51718:27;:46::i;:::-;51704:60;-1:-1:-1;51783:46:0;51800:10;51812:16;:7;51704:60;51812:11;:16::i;51783:46::-;51668:177;;50927:929;;;;51872:11;;51868:183;;51914:11;;:24;;51930:7;51914:15;:24::i;:::-;51900:38;;51953;;;-1:-1:-1;;;51953:38:0;;51971:10;51953:38;;;;;;;;;;;;-1:-1:-1;;;;;51953:17:0;;;;;:38;;;;;;;;;;;;;;51900:11;51953:17;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52006:33:0;;-1:-1:-1;52018:8:0;52028:10;52006:11;:33::i;:::-;52095:16;;;;52079:11;;:43;;52117:4;;52079:33;;:15;:33::i;:43::-;52061:15;;;:61;52138:48;;;;;;;;-1:-1:-1;;;;;52138:48:0;;;52147:10;;52138:48;;;;;;;;;50492:1702;;;;;:::o;43110:34::-;;;:::o;22798:106::-;22886:10;22798:106;:::o;27626:120::-;27170:8;:6;:8::i;:::-;27162:41;;;;;-1:-1:-1;;;27162:41:0;;;;;;;;;;;;-1:-1:-1;;;27162:41:0;;;;;;;;;;;;;;;27685:7:::1;:15:::0;;-1:-1:-1;;27685:15:0::1;::::0;;27716:22:::1;27725:12;:10;:12::i;:::-;27716:22;::::0;;-1:-1:-1;;;;;27716:22:0;;::::1;::::0;;;;;;;::::1;::::0;;::::1;27626:120::o:0;2898:179::-;2956:7;2988:5;;;3012:6;;;;3004:46;;;;;-1:-1:-1;;;3004:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;3068:1;2898:179;-1:-1:-1;;;2898:179:0:o;32348:607::-;32502:12;32528:14;32544;32562:26;32573:6;32581;32562:10;:26::i;:::-;32807:32;;;-1:-1:-1;;32807:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32797:43;;;;;;-1:-1:-1;;;;;;32686:216:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;32654:267:0;;;;;;;;32348:607;-1:-1:-1;;;32348:607:0:o;3777:220::-;3835:7;3859:6;3855:20;;-1:-1:-1;3874:1:0;3867:8;;3855:20;3898:5;;;3902:1;3898;:5;:1;3922:5;;;;;:10;3914:56;;;;-1:-1:-1;;;3914:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4475:153;4533:7;4565:1;4561;:5;4553:44;;;;;-1:-1:-1;;;4553:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;4619:1;4615;:5;;;;;;;4475:153;-1:-1:-1;;;4475:153:0:o;3360:158::-;3418:7;3451:1;3446;:6;;3438:49;;;;;-1:-1:-1;;;3438:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3505:5:0;;;3360:158::o;61588:381::-;61694:7;;61749:8;;61745:194;;61780:41;43320:5;61780:24;61789:14;;61780:4;:8;;:24;;;;:::i;:41::-;61855:8;;61774:47;;-1:-1:-1;61838:31:0;;-1:-1:-1;;;;;61838:3:0;:16;;;61855:8;61774:47;61838:16;:31::i;:::-;61889:38;;;;;;;;-1:-1:-1;;;;;61889:38:0;;;;;;;;;;;;;61958:3;61588:381;-1:-1:-1;;;61588:381:0:o;19085:177::-;19195:58;;;-1:-1:-1;;;;;19195:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19195:58:0;-1:-1:-1;;;19195:58:0;;;19168:86;;19188:5;;19168:19;:86::i;:::-;19085:177;;;:::o;61171:310::-;-1:-1:-1;;;;;61270:27:0;;;61246:21;61270:27;;;:8;:27;;;;;;;;:34;;;;;;;;;;;;61315:19;;;:27;;-1:-1:-1;;61315:27:0;;;61353:17;;;:21;;;61385:17;;;:21;;;61422:51;;;;;;;;;;;;;;;;;;;61270:34;;;61422:51;;;;;;;;;61171:310;;;:::o;39478:947::-;39676:20;39698;39732:17;39751;39772:124;39809:7;39831:6;39852;39873:12;39772:22;:124::i;:::-;39731:165;;;;39907:13;39946:57;39965:7;39974:6;39982;39990:12;39946:18;:57::i;:::-;39907:107;;40025:10;40078:1;-1:-1:-1;;;;;40038:42:0;40050:7;-1:-1:-1;;;;;40038:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40038:28:0;-1:-1:-1;;;;;40038:42:0;;;;-1:-1:-1;40091:13:0;40038:42;40107:24;;40130:1;40107:24;;;40115:4;-1:-1:-1;;;;;40115:10:0;;:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40115:12:0;40107:24;40091:40;;40142:19;40164:4;-1:-1:-1;;;;;40164:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40164:18:0;;-1:-1:-1;40213:204:0;40253:9;40281;40164:18;40339:15;40373:5;40397;40213:21;:204::i;:::-;40193:224;;;;;;;;;;39478:947;;;;;;;;:::o;27367:118::-;26893:8;:6;:8::i;:::-;26892:9;26884:38;;;;;-1:-1:-1;;;26884:38:0;;;;;;;;;;;;-1:-1:-1;;;26884:38:0;;;;;;;;;;;;;;;27427:7:::1;:14:::0;;-1:-1:-1;;27427:14:0::1;27437:4;27427:14;::::0;;27457:20:::1;27464:12;:10;:12::i;62072:413::-:0;62209:7;;62261:8;;62257:198;;62292:39;43320:5;62292:22;62301:12;;62292:4;:8;;:22;;;;:::i;:39::-;62286:45;-1:-1:-1;62348:30:0;-1:-1:-1;;;;;62348:3:0;:16;62365:7;62286:45;62348:16;:30::i;:::-;62430:7;-1:-1:-1;;;;;62398:45:0;62419:8;-1:-1:-1;;;;;62398:45:0;;62439:3;62398:45;;;;;;;;;;;;;;;;;;62257:198;62474:3;62072:413;-1:-1:-1;;;;62072:413:0:o;31861:395::-;31963:14;31979;32029:6;-1:-1:-1;;;;;32019:16:0;:6;-1:-1:-1;;;;;32019:16:0;;;32011:60;;;;;-1:-1:-1;;;32011:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;32110:6;-1:-1:-1;;;;;32101:15:0;:6;-1:-1:-1;;;;;32101:15:0;;:79;;32165:6;32173;32101:79;;;32133:6;32141;32101:79;32082:98;;-1:-1:-1;32082:98:0;-1:-1:-1;;;;;;32199:20:0;;32191:57;;;;;-1:-1:-1;;;32191:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;31861:395;;;;;:::o;21390:761::-;21814:23;21840:69;21868:4;21840:69;;;;;;;;;;;;;;;;;21848:5;-1:-1:-1;;;;;21840:27:0;;;:69;;;;;:::i;:::-;21924:17;;21814:95;;-1:-1:-1;21924:21:0;21920:224;;22066:10;22055:30;;;;;;;;;;;;;;;-1:-1:-1;22055:30:0;22047:85;;;;-1:-1:-1;;;22047:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33013:528;33171:16;33189;33219:14;33239:26;33250:6;33258;33239:10;:26::i;:::-;33218:47;;;33277:16;33295;33340:46;33348:7;33357:6;33365;33373:12;33340:7;:46::i;:::-;-1:-1:-1;;;;;33317:92:0;;:94;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33317:94:0;;;;;;;33276:135;;;;;-1:-1:-1;33276:135:0;;-1:-1:-1;;;;;;33445:16:0;;;;;;;:88;;33514:8;33524;33445:88;;;33478:8;33488;33445:88;33422:111;;;;-1:-1:-1;33013:528:0;-1:-1:-1;;;;;;;;33013:528:0:o;38141:1070::-;38367:20;38389;38426:5;:18;;;;;38443:1;38435:5;:9;38426:18;38422:635;;;38461:13;38477:41;38493:24;:9;38507;38493:13;:24::i;:::-;38477:15;:41::i;:::-;38461:57;;38533:17;38553:22;38569:5;38553:15;:22::i;:::-;38533:42;;38602:9;38594:5;:17;38590:456;;;38653:11;38632:18;38704:20;:5;38714:9;38704;:20::i;:::-;38683:41;-1:-1:-1;38743:19:0;38765:27;38782:9;38765:12;:5;38775:1;38765:9;:12::i;:::-;:16;;:27::i;:::-;38743:49;;38811:20;38834:134;38872:10;38905;38938:11;38834:15;:134::i;:::-;38811:157;-1:-1:-1;39001:29:0;:11;38811:157;39001:15;:29::i;:::-;38987:43;;38590:456;;;;;38422:635;;;39122:11;39089:30;:9;39103:15;39089:13;:30::i;:::-;:44;;;;;;39181:11;39148:30;:9;39162:15;39148:13;:30::i;:::-;:44;;;;;;39067:136;;;;38141:1070;;;;;;;;;:::o;14076:195::-;14179:12;14211:52;14233:6;14241:4;14247:1;14250:12;14211:21;:52::i;34942:1239::-;34990:7;35014:6;35010:20;;-1:-1:-1;35029:1:0;35022:8;;35010:20;35208:1;35232;-1:-1:-1;;;35248:41:0;;35244:107;;35313:3;35306:10;;;;;35337:2;35331:8;35244:107;35371:19;35365:2;:25;35361:90;;35414:2;35407:9;;;;;35437:2;35431:8;35361:90;35471:11;35465:2;:17;35461:82;;35506:2;35499:9;;;;;35529:2;35523:8;35461:82;35563:7;35557:2;:13;35553:77;;35594:2;35587:9;;;;;35617:1;35611:7;35553:77;35650:5;35644:2;:11;35640:74;;35679:1;35672:8;;;;;35701:1;35695:7;35640:74;35734:4;35728:2;:10;35724:73;;35762:1;35755:8;;;;;35784:1;35778:7;35724:73;35817:3;35811:2;:9;35807:49;;35843:1;35837:7;35807:49;35885:1;35879;35875;:5;;;;;;35871:1;:9;35870:16;;35866:20;;35916:1;35910;35906;:5;;;;;;35902:1;:9;35901:16;;35897:20;;35947:1;35941;35937;:5;;;;;;35933:1;:9;35932:16;;35928:20;;35978:1;35972;35968;:5;;;;;;35964:1;:9;35963:16;;35959:20;;36009:1;36003;35999;:5;;;;;;35995:1;:9;35994:16;;35990:20;;36040:1;36034;36030;:5;;;;;;36026:1;:9;36025:16;;36021:20;;36071:1;36065;36061;:5;;;;;;36057:1;:9;36056:16;;36052:20;;36120:10;36137:1;36133;:5;;;;;;36120:18;;36161:2;36157:1;:6;:15;;36170:2;36157:15;;;36166:1;36157:15;36149:24;;;;;34942:1239;;;;:::o;37238:388::-;37344:7;37365:9;37376;37389:13;37397:1;37400;37389:7;:13::i;:::-;37364:38;;;;37415:10;37441:1;37428:15;;;;;37438:1;37435;37428:15;37415:28;;37463:1;37458:2;:6;37454:18;;;37471:1;37466:6;;;;37454:18;37483:7;;;;;37507:6;37503:24;;37526:1;37522;:5;;;;;;37515:12;;;;;;;37503:24;37552:1;37548;:5;37540:44;;;;;-1:-1:-1;;;37540:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;37602:16;37610:1;37613;37616;37602:7;:16::i;:::-;37595:23;37238:388;-1:-1:-1;;;;;;;37238:388:0:o;15128:530::-;15255:12;15313:5;15288:21;:30;;15280:81;;;;-1:-1:-1;;;15280:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15380:18;15391:6;15380:10;:18::i;:::-;15372:60;;;;;-1:-1:-1;;;15372:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;15506:12;15520:23;15547:6;-1:-1:-1;;;;;15547:11:0;15567:5;15575:4;15547:33;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;15547:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15505:75;;;;15598:52;15616:7;15625:10;15637:12;15598:17;:52::i;36497:243::-;36586:9;;;-1:-1:-1;;36647:1:0;36644;36637:25;36624:38;;36681:1;36677;:5;36673:9;;36702:1;36697:2;:6;36693:10;;36723:1;36718:2;:6;36714:18;;;36731:1;36726:6;;;;36714:18;36497:243;;;;;;:::o;36748:482::-;36854:7;36893:2;;;36889:6;;;36894:1;36889:6;36906:9;;;;;;;36931:4;36926:9;;;;;;;;;36966:4;36958;36957:5;;36956:14;;;;;37015:1;:9;;;37044:5;;;37040:9;;37035:14;37069:5;;;37065:9;;37060:14;37094:5;;;37090:9;;37085:14;37119:5;;;37115:9;;37110:14;37144:5;;;37140:9;;37135:14;37169:5;;;37165:9;;37160:14;37194:5;;;37190:9;;37185:14;;;36956;;36973:1;36956:18;36951:24;;;;36946:29;;;;37217:5;;36748:482;-1:-1:-1;;36748:482:0:o;11158:422::-;11525:20;11564:8;;;11158:422::o;17668:742::-;17783:12;17812:7;17808:595;;;-1:-1:-1;17843:10:0;17836:17;;17808:595;17957:17;;:21;17953:439;;18220:10;18214:17;18281:15;18268:10;18264:2;18260:19;18253:44;18168:148;18363:12;18356:20;;-1:-1:-1;;;18356:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Swarm Source

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