ETH Price: $3,171.56 (+2.08%)

Token

EdFi (EdFi)
 

Overview

Max Total Supply

1,000,000,000 EdFi

Holders

361

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
0.897162291896173827 EdFi

Value
$0.00
0x7c68e26e76b5bd8ec28ae32c7ce2a8b12f95e8bf
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

EdFi aims to become an educational ecosystem for all things crypto. EdFi aims to provide the tools for Web3 Education and become a leader in this category.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
EdFi

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-05-11
*/

// SPDX-License-Identifier: MIT
/**
 * @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 `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, 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 `from` to `to` 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 from,
        address to,
        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);
}


// Dependency file: @openzeppelin/contracts/utils/math/SafeMath.sol

// OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol)

// pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
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) {
        unchecked {
            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) {
        unchecked {
            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) {
        unchecked {
            // 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) {
        unchecked {
            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) {
        unchecked {
            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) {
        return a + b;
    }

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

    /**
     * @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.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        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) {
        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) {
        unchecked {
            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.
     *
     * 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) {
        unchecked {
            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) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}


// Dependency file: @openzeppelin/contracts/utils/Context.sol

// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

// pragma solidity ^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 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) {
        return msg.sender;
    }

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


// Dependency file: @openzeppelin/contracts/access/Ownable.sol

// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

// pragma solidity ^0.8.0;

// import "@openzeppelin/contracts/utils/Context.sol";

/**
 * @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() {
        _transferOwnership(_msgSender());
    }

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

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

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

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

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


// Dependency file: @openzeppelin/contracts/utils/Address.sol

// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

// pragma solidity ^0.8.1;

/**
 * @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
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

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

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

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


// Dependency file: contracts/interfaces/IUniswapV2Factory.sol

// pragma solidity >=0.5.0;

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

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


// Dependency file: contracts/interfaces/IUniswapV2Pair.sol

// pragma solidity >=0.5.0;

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

    function name() external pure returns (string memory);

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

    function decimals() external pure returns (uint8);

    function totalSupply() external view returns (uint256);

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

    function allowance(address owner, address spender)
        external
        view
        returns (uint256);

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

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

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

    function DOMAIN_SEPARATOR() external view returns (bytes32);

    function PERMIT_TYPEHASH() external pure returns (bytes32);

    function nonces(address owner) external view returns (uint256);

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

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

    function MINIMUM_LIQUIDITY() external pure returns (uint256);

    function factory() external view returns (address);

    function token0() external view returns (address);

    function token1() external view returns (address);

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

    function price0CumulativeLast() external view returns (uint256);

    function price1CumulativeLast() external view returns (uint256);

    function kLast() external view returns (uint256);

    function mint(address to) external returns (uint256 liquidity);

    function burn(address to)
        external
        returns (uint256 amount0, uint256 amount1);

    function swap(
        uint256 amount0Out,
        uint256 amount1Out,
        address to,
        bytes calldata data
    ) external;

    function skim(address to) external;

    function sync() external;

    function initialize(address, address) external;
}


// Dependency file: contracts/interfaces/IUniswapV2Router01.sol

// pragma solidity >=0.6.2;

interface IUniswapV2Router01 {
    function factory() external pure returns (address);

    function WETH() external pure returns (address);

    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 addLiquidityETH(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    )
        external
        payable
        returns (
            uint256 amountToken,
            uint256 amountETH,
            uint256 liquidity
        );

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

    function removeLiquidityETH(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountToken, uint256 amountETH);

    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETHWithPermit(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountToken, uint256 amountETH);

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

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

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

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

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

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

    function quote(
        uint256 amountA,
        uint256 reserveA,
        uint256 reserveB
    ) external pure returns (uint256 amountB);

    function getAmountOut(
        uint256 amountIn,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountOut);

    function getAmountIn(
        uint256 amountOut,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountIn);

    function getAmountsOut(uint256 amountIn, address[] calldata path)
        external
        view
        returns (uint256[] memory amounts);

    function getAmountsIn(uint256 amountOut, address[] calldata path)
        external
        view
        returns (uint256[] memory amounts);
}


// Dependency file: contracts/interfaces/IUniswapV2Router02.sol

// pragma solidity >=0.6.2;

// import "contracts/interfaces/IUniswapV2Router01.sol";

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountETH);

    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountETH);

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

    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable;

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


// Dependency file: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol

// OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol)

// pragma solidity ^0.8.0;

// import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
// import "@openzeppelin/contracts/utils/Address.sol";

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

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

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

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

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

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

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

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


// Dependency file: contracts/parts/Withdrawable.sol


// pragma solidity ^0.8.9;

// import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
// import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";

abstract contract Withdrawable {
    using SafeERC20 for IERC20;
    using Address for address;

    event WithdrawToken(address token, address recipient, uint256 amount);
    event Withdraw(address recipient, uint256 amount);

    function _deliverFunds(
        address _recipient,
        uint256 _value,
        string memory _message
    ) internal {
        (bool sent, ) = payable(_recipient).call{value: _value}("");

        require(sent, _message);
    }

    function _deliverTokens(
        address _token,
        address _recipient,
        uint256 _value
    ) internal {
        IERC20(_token).safeTransfer(_recipient, _value);
    }

    function _withdraw(address _recipient, uint256 _amount) internal virtual {
        require(_recipient != address(0x0), "Withdraw: address is zero");
        require(
            _amount <= address(this).balance,
            "Withdraw: not enought ETH balance"
        );

        _afterWithdraw(_recipient, _amount);

        _deliverFunds(_recipient, _amount, "Withdraw: Can't send ETH");
        emit Withdraw(_recipient, _amount);
    }

    function _afterWithdraw(address _recipient, uint256 _amount)
        internal
        virtual
    {}

    function _withdrawToken(
        address _token,
        address _recipient,
        uint256 _amount
    ) internal virtual {
        require(_recipient != address(0x0), "Withdraw: address is zero");
        require(
            _amount <= IERC20(_token).balanceOf(address(this)),
            "Withdraw: not enought token balance"
        );

        IERC20(_token).safeTransfer(_recipient, _amount);

        _afterWithdrawToken(_token, _recipient, _amount);

        emit WithdrawToken(_token, _recipient, _amount);
    }

    function _afterWithdrawToken(
        address _token,
        address _recipient,
        uint256 _amount
    ) internal virtual {}
}


// Root file: contracts/EdFi.sol

pragma solidity ^0.8.0;

// import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
// import "@openzeppelin/contracts/utils/math/SafeMath.sol";
// import "@openzeppelin/contracts/access/Ownable.sol";
// import "@openzeppelin/contracts/utils/Address.sol";
// import "contracts/interfaces/IUniswapV2Factory.sol";
// import "contracts/interfaces/IUniswapV2Pair.sol";
// import "contracts/interfaces/IUniswapV2Router02.sol";
// import "contracts/parts/Withdrawable.sol";

contract EdFi is Context, IERC20, Withdrawable, Ownable {
    using SafeMath for uint256;
    using Address for address;

    // dead address
    address internal constant DEAD_ADDRESS =
        0x000000000000000000000000000000000000dEaD;

    uint256 internal constant PRECISION = 1 ether;

    //user balances multiplied reward
    mapping(address => uint256) private _rOwned;

    //user original balances
    mapping(address => uint256) private _tOwned;

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

    //bots
    mapping(address => bool) private _isSniper;

    address[] private _confirmedSnipers;

    //excluded from fees
    mapping(address => bool) private _isExcludedFee;

    //excluded from rewards
    mapping(address => bool) private _isExcludedReward;

    //excluded array
    address[] private _excluded;

    string private constant _name = "EdFi";
    string private constant _symbol = "EdFi";
    uint8 private constant _decimals = 18;

    //max uint256
    uint256 private constant MAX = ~uint256(0);

    //total supply
    uint256 private constant _tTotal = 1_000_000_000 ether;

    //total with rewards
    uint256 private _rTotal = (MAX - (MAX % _tTotal));

    //total fees
    uint256 private _tFeeTotal;

    //Fees

    //reflection fee
    uint256 public reflectionFee;
    uint256 private _previousReflectFee;

    //treasury fee
    uint256 public treasuryFee;
    uint256 private _previousTreasuryFee;

    //Liquify fee
    uint256 public liquidityFee;
    uint256 private _previousLiquidityFee;

    //fee rate for minimum fees balance
    uint256 public feeRate;

    //launch time
    uint256 public launchTime;

    //uint256

    IUniswapV2Router02 public uniswapRouter;
    address public uniswapPair;
    mapping(address => bool) private _isUniswapPair;

    address public treasuryWallet;

    //burn address
    address public buybackReceiver = DEAD_ADDRESS;

    bool private _isSelling;
    bool private _tradingOpen;
    bool private _transferOpen;

    bool private _takeFeeOnTransferEnabled;
    bool private _takeFeeOnBuyEnabled;
    bool private _takeFeeOnSellEnabled;

    uint256 public maxSellAmount = 5 ether;

    mapping(address => bool) public authorized;

    modifier isAuthorized() {
        require(
            (authorized[_msgSender()] || owner() == _msgSender()),
            "EdFi Token: not authorized user"
        );
        _;
    }

    event SwapETHForTokens(address whereTo, uint256 amountIn, address[] path);
    event SwapTokensForETH(uint256 amountIn, address[] path);
    event SwapAndLiquify(uint256 ETHAddedForLp, uint256 tokensAddedForLp);
    event Authorized(address user, bool isAuth);

    constructor() {
        //mint to tokens to sender
        _rOwned[_msgSender()] = _rTotal;
        emit Transfer(address(0), _msgSender(), _tTotal);
    }

    function init(
        address _routerAddress,
        address _treasuryAddress,
        uint256 _reflectionFee,
        uint256 _treasuryFee,
        uint256 _liquidityFee,
        uint256 _feeRate
    ) external onlyOwner {
        treasuryWallet = _treasuryAddress;

        IUniswapV2Router02 _uniswapRouter = IUniswapV2Router02(
            _routerAddress
        );
        uniswapPair = IUniswapV2Factory(_uniswapRouter.factory())
            .createPair(address(this), _uniswapRouter.WETH());

        uniswapRouter = _uniswapRouter;

        //exclude owner from fees
        _isExcludedFee[owner()] = true;

        //exclude this contract from fees
        _isExcludedFee[address(this)] = true;

        require(
            _reflectionFee <= 100 &&
            _treasuryFee <= 100 &&
            _liquidityFee <= 100 &&
            _feeRate <= 100,
            "fee cannot exceed 100%"
        );

        reflectionFee = _reflectionFee;
        _previousReflectFee = reflectionFee;

        treasuryFee = _treasuryFee;
        _previousTreasuryFee = treasuryFee;

        liquidityFee = _liquidityFee;
        _previousLiquidityFee = liquidityFee;

        feeRate = _feeRate;
    }

    /// @notice start trading
    function openTrading() external onlyOwner {
        _tradingOpen = true;
        _transferOpen = true;
        launchTime = block.timestamp;

        _takeFeeOnTransferEnabled = false;
        _takeFeeOnBuyEnabled = true;
        _takeFeeOnSellEnabled = true;
    }

    function authorize(address _user, bool _isAuth) external onlyOwner {
        authorized[_user] = _isAuth;

        emit Authorized(_user, _isAuth);
    }

    /// @notice token name
    function name() external pure returns (string memory) {
        return _name;
    }

    /// @notice symbol
    function symbol() external pure returns (string memory) {
        return _symbol;
    }

    /// @notice decimals
    function decimals() external pure returns (uint8) {
        return _decimals;
    }

    /// @notice total supply
    function totalSupply() external pure override returns (uint256) {
        return _tTotal;
    }

    /// @notice balance of
    function balanceOf(address account) public view override returns (uint256) {
        if (_isExcludedReward[account]) return _tOwned[account];
        return tokenFromReflection(_rOwned[account]); //return tokens with reflection
    }

    function transfer(address recipient, uint256 amount)
        external
        override
        returns (bool)
    {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    function allowance(address owner, address spender)
        external
        view
        override
        returns (uint256)
    {
        return _allowances[owner][spender];
    }

    function approve(address spender, uint256 amount)
        external
        override
        returns (bool)
    {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(
            sender,
            _msgSender(),
            _allowances[sender][_msgSender()].sub(
                amount,
                "BEP20: transfer amount exceeds allowance"
            )
        );
        return true;
    }

    function increaseAllowance(address spender, uint256 addedValue)
        external
        virtual
        returns (bool)
    {
        _approve(
            _msgSender(),
            spender,
            _allowances[_msgSender()][spender].add(addedValue)
        );
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue)
        external
        virtual
        returns (bool)
    {
        _approve(
            _msgSender(),
            spender,
            _allowances[_msgSender()][spender].sub(
                subtractedValue,
                "BEP20: decreased allowance below zero"
            )
        );
        return true;
    }

    ///@notice total fees
    function totalFees() external view returns (uint256) {
        return _tFeeTotal;
    }

    ///@notice get amount with deduction fees or no
    function reflectionFromToken(uint256 tAmount, bool deductTransferFee)
        external
        view
        returns (uint256)
    {
        require(tAmount <= _tTotal, "Amount must be less than supply");
        if (!deductTransferFee) {
            (uint256 rAmount, , , , , ) = _getValues(tAmount);
            return rAmount;
        } else {
            (, uint256 rTransferAmount, , , , ) = _getValues(tAmount);
            return rTransferAmount;
        }
    }

    ///@notice get tokens from reflection
    function tokenFromReflection(uint256 rAmount)
        public
        view
        returns (uint256)
    {
        require(
            rAmount <= _rTotal,
            "Amount must be less than total reflections"
        );
        uint256 currentRate = _getRate();
        return rAmount.div(currentRate);
    }

    function excludeFromReward(address account) external onlyOwner {
        require(!_isExcludedReward[account], "Account is already excluded");
        if (_rOwned[account] > 0) {
            _tOwned[account] = tokenFromReflection(_rOwned[account]);
        }
        _isExcludedReward[account] = true;
        _excluded.push(account);
    }

    function includeInReward(address account) external onlyOwner {
        require(_isExcludedReward[account], "Account is already included");
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (_excluded[i] == account) {
                _excluded[i] = _excluded[_excluded.length - 1];
                _tOwned[account] = 0;
                _isExcludedReward[account] = false;
                _excluded.pop();
                break;
            }
        }
    }

    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) private {
        require(owner != address(0), "BEP20: approve from the zero address");
        require(spender != address(0), "BEP20: approve to the zero address");

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

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) private {
        require(from != address(0), "BEP20: transfer from the zero address");
        require(to != address(0), "BEP20: transfer to the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");
        require(!_isSniper[to], "Stop sniping!");
        require(!_isSniper[from], "Stop sniping!");
        require(!_isSniper[_msgSender()], "Stop sniping!");
        require(
            _transferOpen || from == owner(),
            "transferring tokens is not currently allowed"
        );

        bool takeFee = true;

        bool isBuying;
        bool isSelling;

        // buy
        if (
            (from == uniswapPair || _isUniswapPair[from]) &&
            to != address(uniswapRouter) &&
            _tradingOpen
        ) {
            isBuying = true;

            // normal buy, check for snipers
            if (!isExcludedFromFee(to)) {
                require(_tradingOpen, "Trading not yet enabled.");

                // antibot
                if (block.timestamp == launchTime) {
                    _isSniper[to] = true;
                    _confirmedSnipers.push(to);
                }
            }

            if (!_takeFeeOnBuyEnabled) {
                takeFee = false;
            }
        }

        // sell or transfer
        if (
            _tradingOpen &&
            from != uniswapPair &&
            !_isUniswapPair[from] &&
            from != address(uniswapRouter)
        ) {
            //if sell check max amount
            if (
                to == uniswapPair ||
                _isUniswapPair[to] ||
                to == address(uniswapRouter)
            ) {
                isSelling = true;

                if (!_takeFeeOnSellEnabled) {
                    takeFee = false;
                }

                (uint256 reserve0, uint256 reserve1, ) = IUniswapV2Pair(
                    uniswapPair
                ).getReserves();

                (reserve0, reserve1) = IUniswapV2Pair(uniswapPair)
                    .token0() == address(this)
                    ? (reserve0, reserve1)
                    : (reserve1, reserve0);

                uint256 estimatedEquivalentETH = uniswapRouter.getAmountOut(
                    amount,
                    reserve0,
                    reserve1
                );

                require(
                    estimatedEquivalentETH <= maxSellAmount,
                    "the amount of the sale is more than the available one"
                );
            }
        }

        if (!isSelling && !isBuying && !_takeFeeOnTransferEnabled) {
            takeFee = false;
        }

        if ((isExcludedFromFee(from) || isExcludedFromFee(to))) {
            takeFee = false;
        }

        _tokenTransfer(from, to, amount, takeFee);
    }

    function distribute() external isAuthorized {
        uint256 _contractTokenBalance = balanceOf(address(this));

        if (_contractTokenBalance > 0) {
            uint256 maxSwapAmount = balanceOf(uniswapPair)
                .mul(feeRate)
                .mul(PRECISION)
                .div(100)
                .div(PRECISION);

            if (_contractTokenBalance > maxSwapAmount) {
                _contractTokenBalance = maxSwapAmount;
            }
            _distribute(_contractTokenBalance);
        }
    }

    function _distribute(uint256 _contractTokenBalance) private {
        uint256 ETHBalanceBefore = address(this).balance;

        uint256 _liquidityFeeTotal = _liquidityFeeAggregate(); //get fees without reflection fee

        uint256 liquidityFeeBalance = _contractTokenBalance
            .mul(liquidityFee)
            .div(_liquidityFeeTotal);

        _contractTokenBalance = _contractTokenBalance - liquidityFeeBalance;

        _distributeForETH(_contractTokenBalance);

        uint256 ETHBalanceAfter = address(this).balance;
        uint256 ETHBalanceUpdate = ETHBalanceAfter.sub(ETHBalanceBefore);

        // send ETH to treasury address
        uint256 treasuryETHBalance = ETHBalanceUpdate;

        if (treasuryETHBalance > 0) {
            _deliverFunds(
                treasuryWallet,
                treasuryETHBalance,
                "Cant send ETH to wallet"
            );
        }

        if (liquidityFeeBalance > 0) {
            _liquifyTokens(liquidityFeeBalance);
        }
    }

    function _liquifyTokens(uint256 amount) private {
        // split the contract balance into halves
        uint256 half = amount.div(2);
        uint256 otherHalf = amount.sub(half);

        if (otherHalf > balanceOf(address(this))) {
            otherHalf = balanceOf(address(this));
        }

        uint256 initialBalance = address(this).balance;

        _distributeForETH(half);

        uint256 newBalance = address(this).balance.sub(initialBalance);

        _addLiquidity(otherHalf, newBalance);
    }

    function _addLiquidity(uint256 _tokenAmount, uint256 _ETHAmount) internal {
        // approve token transfer to cover all possible scenarios
        _approve(address(this), address(uniswapRouter), _tokenAmount);

        (bool success, ) = payable(address(uniswapRouter)).call{
            value: _ETHAmount
        }(
            abi.encodeWithSignature(
                "addLiquidityETH(address,uint256,uint256,uint256,address,uint256)",
                address(this),
                _tokenAmount,
                0, // slippage is unavoidable
                0, // slippage is unavoidable,
                buybackReceiver,
                block.timestamp
            )
        );

        if (success) {
            emit SwapAndLiquify(_ETHAmount, _tokenAmount);
        }
    }

    function _distributeForETH(uint256 tokenAmount) private {
        // generate the uniswap pair path of token -> wETH
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapRouter.WETH();

        _approve(address(this), address(uniswapRouter), tokenAmount);

        (bool success, ) = payable(address(uniswapRouter)).call(
            abi.encodeWithSignature(
                "swapExactTokensForETHSupportingFeeOnTransferTokens(uint256,uint256,address[],address,uint256)",
                tokenAmount,
                0, // accept any amount of ETH
                path,
                address(this), // the contract
                block.timestamp
            )
        );
        if (success) {
            emit SwapTokensForETH(tokenAmount, path);
        }
    }

    function _tokenTransfer(
        address sender,
        address recipient,
        uint256 amount,
        bool takeFee
    ) private {
        if (!takeFee) {
            _removeAllFee();
        }

        if (_isExcludedReward[sender] && !_isExcludedReward[recipient]) {
            _transferFromExcluded(sender, recipient, amount);
        } else if (!_isExcludedReward[sender] && _isExcludedReward[recipient]) {
            _transferToExcluded(sender, recipient, amount);
        } else if (_isExcludedReward[sender] && _isExcludedReward[recipient]) {
            _transferBothExcluded(sender, recipient, amount);
        } else {
            _transferStandard(sender, recipient, amount);
        }

        if (!takeFee) _restoreAllFee();
    }

    function _transferStandard(
        address sender,
        address recipient,
        uint256 tAmount
    ) private {
        (
            uint256 rAmount,
            uint256 rTransferAmount,
            uint256 rFee,
            uint256 tTransferAmount,
            uint256 tFee,
            uint256 tLiquidity
        ) = _getValues(tAmount);

        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _takeLiquidity(tLiquidity);

        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferToExcluded(
        address sender,
        address recipient,
        uint256 tAmount
    ) private {
        (
            uint256 rAmount,
            uint256 rTransferAmount,
            uint256 rFee,
            uint256 tTransferAmount,
            uint256 tFee,
            uint256 tLiquidity
        ) = _getValues(tAmount);

        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _takeLiquidity(tLiquidity);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferFromExcluded(
        address sender,
        address recipient,
        uint256 tAmount
    ) private {
        (
            uint256 rAmount,
            uint256 rTransferAmount,
            uint256 rFee,
            uint256 tTransferAmount,
            uint256 tFee,
            uint256 tLiquidity
        ) = _getValues(tAmount);

        _tOwned[sender] = _tOwned[sender].sub(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _takeLiquidity(tLiquidity);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferBothExcluded(
        address sender,
        address recipient,
        uint256 tAmount
    ) private {
        (
            uint256 rAmount,
            uint256 rTransferAmount,
            uint256 rFee,
            uint256 tTransferAmount,
            uint256 tFee,
            uint256 tLiquidity
        ) = _getValues(tAmount);
        _tOwned[sender] = _tOwned[sender].sub(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _takeLiquidity(tLiquidity);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _reflectFee(uint256 rFee, uint256 tFee) private {
        _rTotal = _rTotal.sub(rFee);
        _tFeeTotal = _tFeeTotal.add(tFee);
    }

    function _getValues(uint256 tAmount)
        private
        view
        returns (
            uint256,
            uint256,
            uint256,
            uint256,
            uint256,
            uint256
        )
    {
        (
            uint256 tTransferAmount,
            uint256 tFee,
            uint256 tLiquidity
        ) = _getTValues(tAmount);
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRValues(
            tAmount,
            tFee,
            tLiquidity,
            _getRate()
        );
        return (
            rAmount,
            rTransferAmount,
            rFee,
            tTransferAmount,
            tFee,
            tLiquidity
        );
    }

    function _getTValues(uint256 tAmount)
        private
        view
        returns (
            uint256,
            uint256,
            uint256
        )
    {
        uint256 tFee = _calculateReflectFee(tAmount);
        uint256 tLiquidity = _calculateLiquidityFee(tAmount);
        uint256 tTransferAmount = tAmount.sub(tFee).sub(tLiquidity);
        return (tTransferAmount, tFee, tLiquidity);
    }

    function _getRValues(
        uint256 tAmount,
        uint256 tFee,
        uint256 tLiquidity,
        uint256 currentRate
    )
        private
        pure
        returns (
            uint256,
            uint256,
            uint256
        )
    {
        uint256 rAmount = tAmount.mul(currentRate);
        uint256 rFee = tFee.mul(currentRate);
        uint256 rLiquidity = tLiquidity.mul(currentRate);
        uint256 rTransferAmount = rAmount.sub(rFee).sub(rLiquidity);
        return (rAmount, rTransferAmount, rFee);
    }

    function _getRate() private view returns (uint256) {
        (uint256 rSupply, uint256 tSupply) = _getCurrentSupply();
        return rSupply.div(tSupply);
    }

    function _getCurrentSupply() private view returns (uint256, uint256) {
        uint256 rSupply = _rTotal;
        uint256 tSupply = _tTotal;
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (
                _rOwned[_excluded[i]] > rSupply ||
                _tOwned[_excluded[i]] > tSupply
            ) return (_rTotal, _tTotal);
            rSupply = rSupply.sub(_rOwned[_excluded[i]]);
            tSupply = tSupply.sub(_tOwned[_excluded[i]]);
        }
        if (rSupply < _rTotal.div(_tTotal)) return (_rTotal, _tTotal);
        return (rSupply, tSupply);
    }

    function _takeLiquidity(uint256 tLiquidity) private {
        uint256 currentRate = _getRate();
        uint256 rLiquidity = tLiquidity.mul(currentRate);
        _rOwned[address(this)] = _rOwned[address(this)].add(rLiquidity);
        if (_isExcludedReward[address(this)])
            _tOwned[address(this)] = _tOwned[address(this)].add(tLiquidity);
    }

    function _calculateReflectFee(uint256 _amount)
        private
        view
        returns (uint256)
    {
        return
            _amount.mul(reflectionFee).mul(PRECISION).div(100).div(PRECISION);
    }

    function _liquidityFeeAggregate() private view returns (uint256) {
        return treasuryFee.add(liquidityFee);
    }

    function _calculateLiquidityFee(uint256 _amount)
        private
        view
        returns (uint256)
    {
        return
            _amount.mul(_liquidityFeeAggregate()).mul(PRECISION).div(100).div(
                PRECISION
            );
    }

    function _removeAllFee() private {
        if (reflectionFee == 0 && treasuryFee == 0 && liquidityFee == 0) return;

        _previousReflectFee = reflectionFee;
        _previousTreasuryFee = treasuryFee;
        _previousLiquidityFee = liquidityFee;

        reflectionFee = 0;
        treasuryFee = 0;
        liquidityFee = 0;
    }

    function _restoreAllFee() private {
        reflectionFee = _previousReflectFee;
        treasuryFee = _previousTreasuryFee;
        liquidityFee = _previousLiquidityFee;
    }

    function getSellSlippage(address seller) external view returns (uint256) {
        uint256 feeAgg = treasuryFee.add(reflectionFee).add(liquidityFee);

        return isExcludedFromFee(seller) ? 0 : feeAgg;
    }

    function isuniswapPair(address _pair) external view returns (bool) {
        if (_pair == uniswapPair) return true;
        return _isUniswapPair[_pair];
    }

    function takeFeeOnTransferEnabled() external view returns (bool) {
        return _takeFeeOnTransferEnabled;
    }

    function takeFeeOnBuyEnabled() external view returns (bool) {
        return _takeFeeOnBuyEnabled;
    }

    function takeFeeOnSellEnabled() external view returns (bool) {
        return _takeFeeOnSellEnabled;
    }

    function isExcludedFromFee(address account) public view returns (bool) {
        return _isExcludedFee[account];
    }

    function isExcludedFromReward(address account)
        external
        view
        returns (bool)
    {
        return _isExcludedReward[account];
    }

    function excludeFromFee(address account) external onlyOwner {
        _isExcludedFee[account] = true;
    }

    function includeInFee(address account) external onlyOwner {
        _isExcludedFee[account] = false;
    }

    function setReflectionFeePercent(uint256 _newFee) external onlyOwner {
        require(_newFee <= 100, "fee cannot exceed 100%");
        reflectionFee = _newFee;
    }

    function setTreasuryFeePercent(uint256 _newFee) external onlyOwner {
        require(_newFee <= 100, "fee cannot exceed 100%");
        treasuryFee = _newFee;
    }

    function setLiquidityFeePercent(uint256 _newFee) external onlyOwner {
        require(_newFee <= 100, "fee cannot exceed 100%");
        liquidityFee = _newFee;
    }

    function setTreasuryAddress(address _treasuryWallet) external onlyOwner {
        treasuryWallet = payable(_treasuryWallet);
    }

    function setTakeFeeOnBuyEnabled(bool _enabled) external onlyOwner {
        _takeFeeOnBuyEnabled = _enabled;
    }

    function setTakeFeeOnSellEnabled(bool _enabled) external onlyOwner {
        _takeFeeOnSellEnabled = _enabled;
    }

    function setTakeFeeOnTransferEnabled(bool _enabled) external onlyOwner {
        _takeFeeOnTransferEnabled = _enabled;
    }

    function setMaxSellAmount(uint256 _maxSellAmount) external onlyOwner {
        maxSellAmount = _maxSellAmount;
    }

    function setuniswapRouter(address _uniswapRouterAddress)
        external
        onlyOwner
    {
        uniswapRouter = IUniswapV2Router02(_uniswapRouterAddress);
    }

    function setBuybackReceiver(address _receiver) external onlyOwner {
        buybackReceiver = _receiver;
    }

    function adduniswapPair(address _pair) external onlyOwner {
        _isUniswapPair[_pair] = true;
    }

    function removeuniswapPair(address _pair) external onlyOwner {
        _isUniswapPair[_pair] = false;
    }

    function setCanTransfer(bool _canTransfer) external onlyOwner {
        _transferOpen = _canTransfer;
    }

    function isRemovedSniper(address account) external view returns (bool) {
        return _isSniper[account];
    }

    function removeSniper(address account) external onlyOwner {
        require(
            account != address(uniswapRouter),
            "We can not blacklist Uniswap"
        );
        require(!_isSniper[account], "Account is already blacklisted");
        _isSniper[account] = true;
        _confirmedSnipers.push(account);
    }

    function amnestySniper(address account) external onlyOwner {
        require(_isSniper[account], "Account is not blacklisted");
        for (uint256 i = 0; i < _confirmedSnipers.length; i++) {
            if (_confirmedSnipers[i] == account) {
                _confirmedSnipers[i] = _confirmedSnipers[
                    _confirmedSnipers.length - 1
                ];
                _isSniper[account] = false;
                _confirmedSnipers.pop();
                break;
            }
        }
    }

    function setFeeRate(uint256 _rate) external onlyOwner {
        feeRate = _rate;
    }

    // to recieve ETH from uniswapRouter when swaping
    receive() external payable {}

    /// @notice management function
    function withdrawToken(address _token, address _recipient)
        external
        virtual
        onlyOwner
    {
        uint256 amount = IERC20(_token).balanceOf(address(this));

        _withdrawToken(_token, _recipient, amount);
        _afterWithdrawToken(_token, _recipient, amount);
    }

    /// @notice management function
    function withdrawSomeToken(
        address _token,
        address _recipient,
        uint256 _amount
    ) public virtual onlyOwner {
        _withdrawToken(_token, _recipient, _amount);
        _afterWithdrawToken(_token, _recipient, _amount);
    }

    ///@notice withdraw all ETH.
    function withdraw() external virtual onlyOwner {
        _withdraw(_msgSender(), address(this).balance);
    }

    ///@notice withdraw some ETH
    function withdrawSome(address _recipient, uint256 _amount)
        external
        virtual
        onlyOwner
    {
        _withdraw(_recipient, _amount);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"bool","name":"isAuth","type":"bool"}],"name":"Authorized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"ETHAddedForLp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensAddedForLp","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"whereTo","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"path","type":"address[]"}],"name":"SwapETHForTokens","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"path","type":"address[]"}],"name":"SwapTokensForETH","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"WithdrawToken","type":"event"},{"inputs":[{"internalType":"address","name":"_pair","type":"address"}],"name":"adduniswapPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"amnestySniper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"bool","name":"_isAuth","type":"bool"}],"name":"authorize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"authorized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buybackReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"distribute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"seller","type":"address"}],"name":"getSellSlippage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_routerAddress","type":"address"},{"internalType":"address","name":"_treasuryAddress","type":"address"},{"internalType":"uint256","name":"_reflectionFee","type":"uint256"},{"internalType":"uint256","name":"_treasuryFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_feeRate","type":"uint256"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromReward","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isRemovedSniper","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_pair","type":"address"}],"name":"isuniswapPair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launchTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSellAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"openTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reflectionFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"},{"internalType":"bool","name":"deductTransferFee","type":"bool"}],"name":"reflectionFromToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeSniper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_pair","type":"address"}],"name":"removeuniswapPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"}],"name":"setBuybackReceiver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_canTransfer","type":"bool"}],"name":"setCanTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rate","type":"uint256"}],"name":"setFeeRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newFee","type":"uint256"}],"name":"setLiquidityFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSellAmount","type":"uint256"}],"name":"setMaxSellAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newFee","type":"uint256"}],"name":"setReflectionFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setTakeFeeOnBuyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setTakeFeeOnSellEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setTakeFeeOnTransferEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_treasuryWallet","type":"address"}],"name":"setTreasuryAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newFee","type":"uint256"}],"name":"setTreasuryFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_uniswapRouterAddress","type":"address"}],"name":"setuniswapRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"takeFeeOnBuyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"takeFeeOnSellEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"takeFeeOnTransferEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"rAmount","type":"uint256"}],"name":"tokenFromReflection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasuryFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"treasuryWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapRouter","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawSome","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawSomeToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_recipient","type":"address"}],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526200001e6b033b2e3c9fd0803ce800000060001962000117565b6200002c906000196200013a565b600955601780546001600160a01b03191661dead179055674563918244f400006018553480156200005c57600080fd5b506200006833620000c7565b6009543360008181526001602090815260408083209490945592516b033b2e3c9fd0803ce80000008152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a362000162565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000826200013557634e487b7160e01b600052601260045260246000fd5b500690565b818103818111156200015c57634e487b7160e01b600052601160045260246000fd5b92915050565b613f9180620001726000396000f3fe6080604052600436106103c75760003560e01c806366d602ae116101f2578063a457c2d71161010d578063d9fff755116100a0578063e4fc6b6d1161006f578063e4fc6b6d14610b79578063e99c9d0914610b8e578063ea2f0b3714610bae578063f2fde38b14610bce57600080fd5b8063d9fff75514610ad4578063dc6571eb14610af3578063dce0333614610b13578063dd62ed3e14610b3357600080fd5b8063c816841b116100dc578063c816841b14610a69578063c9567bf914610a89578063cc32d17614610a9e578063d74611bc14610ab457600080fd5b8063a457c2d7146109d9578063a9059cbb146109f9578063b918161114610a19578063c1051d8f14610a4957600080fd5b80638da5cb5b1161018557806396d386e41161015457806396d386e41461096e57806396eced441461098e578063978bbdb9146109ad57806398118cb4146109c357600080fd5b80638da5cb5b146109105780638ee88c531461092e5780638ef588fc1461094e57806395d89b41146103d357600080fd5b806375ae267d116101c157806375ae267d1461088b578063790ca413146108ab57806383ad7994146108c157806388f82020146108d757600080fd5b806366d602ae1461082057806370a0823114610836578063715018a614610856578063735de9f71461086b57600080fd5b806339509351116102e25780634d8d9efa116102755780635af3832a116102445780635af3832a14610787578063610d5b19146107a757806361ec6830146107e05780636605bfda1461080057600080fd5b80634d8d9efa1461070857806352390c02146107275780635342acb41461074757806356e1221c1461076757600080fd5b80634549b039116102b15780634549b0391461068857806345596e2e146106a85780634626402b146106c8578063489931f0146106e857600080fd5b806339509351146106135780633aeac4e1146106335780633ccfd60b14610653578063437823ec1461066857600080fd5b80632b51c7c01161035a57806333251a0b1161032957806333251a0b14610593578063340c8cc0146105b35780633491218c146105d35780633685d419146105f357600080fd5b80632b51c7c0146105175780632d1fb389146105375780632d83811914610557578063313ce5671461057757600080fd5b806318160ddd1161039657806318160ddd146104805780631df59e2f1461049f5780631f7ede2b146104d757806323b872dd146104f757600080fd5b806306fdde03146103d3578063095ea7b31461040f5780630b2a808c1461043f57806313114a9d1461046157600080fd5b366103ce57005b600080fd5b3480156103df57600080fd5b5060408051808201825260048152634564466960e01b602082015290516104069190613a56565b60405180910390f35b34801561041b57600080fd5b5061042f61042a366004613a9e565b610bee565b6040519015158152602001610406565b34801561044b57600080fd5b5061045f61045a366004613aca565b610c05565b005b34801561046d57600080fd5b50600a545b604051908152602001610406565b34801561048c57600080fd5b506b033b2e3c9fd0803ce8000000610472565b3480156104ab57600080fd5b506017546104bf906001600160a01b031681565b6040516001600160a01b039091168152602001610406565b3480156104e357600080fd5b5061045f6104f2366004613ae7565b610dbb565b34801561050357600080fd5b5061042f610512366004613b00565b610e0b565b34801561052357600080fd5b5061045f610532366004613b00565b610e75565b34801561054357600080fd5b5061045f610552366004613b4f565b610eaf565b34801561056357600080fd5b50610472610572366004613ae7565b610f3d565b34801561058357600080fd5b5060405160128152602001610406565b34801561059f57600080fd5b5061045f6105ae366004613aca565b610fba565b3480156105bf57600080fd5b5061045f6105ce366004613a9e565b611111565b3480156105df57600080fd5b5061045f6105ee366004613b88565b611145565b3480156105ff57600080fd5b5061045f61060e366004613aca565b61118d565b34801561061f57600080fd5b5061042f61062e366004613a9e565b611319565b34801561063f57600080fd5b5061045f61064e366004613ba5565b61134f565b34801561065f57600080fd5b5061045f6113f1565b34801561067457600080fd5b5061045f610683366004613aca565b611427565b34801561069457600080fd5b506104726106a3366004613bd3565b611475565b3480156106b457600080fd5b5061045f6106c3366004613ae7565b61150c565b3480156106d457600080fd5b506016546104bf906001600160a01b031681565b3480156106f457600080fd5b5061045f610703366004613aca565b61153b565b34801561071457600080fd5b50601754600160b81b900460ff1661042f565b34801561073357600080fd5b5061045f610742366004613aca565b611589565b34801561075357600080fd5b5061042f610762366004613aca565b6116dc565b34801561077357600080fd5b5061045f610782366004613ae7565b6116fa565b34801561079357600080fd5b5061042f6107a2366004613aca565b61174a565b3480156107b357600080fd5b5061042f6107c2366004613aca565b6001600160a01b031660009081526004602052604090205460ff1690565b3480156107ec57600080fd5b5061045f6107fb366004613b88565b61178a565b34801561080c57600080fd5b5061045f61081b366004613aca565b6117d2565b34801561082c57600080fd5b5061047260185481565b34801561084257600080fd5b50610472610851366004613aca565b61181e565b34801561086257600080fd5b5061045f61187d565b34801561087757600080fd5b506013546104bf906001600160a01b031681565b34801561089757600080fd5b5061045f6108a6366004613b88565b6118b1565b3480156108b757600080fd5b5061047260125481565b3480156108cd57600080fd5b50610472600b5481565b3480156108e357600080fd5b5061042f6108f2366004613aca565b6001600160a01b031660009081526007602052604090205460ff1690565b34801561091c57600080fd5b506000546001600160a01b03166104bf565b34801561093a57600080fd5b5061045f610949366004613ae7565b6118f9565b34801561095a57600080fd5b5061045f610969366004613aca565b611949565b34801561097a57600080fd5b5061045f610989366004613b88565b611995565b34801561099a57600080fd5b50601754600160c81b900460ff1661042f565b3480156109b957600080fd5b5061047260115481565b3480156109cf57600080fd5b50610472600f5481565b3480156109e557600080fd5b5061042f6109f4366004613a9e565b6119dd565b348015610a0557600080fd5b5061042f610a14366004613a9e565b611a2c565b348015610a2557600080fd5b5061042f610a34366004613aca565b60196020526000908152604090205460ff1681565b348015610a5557600080fd5b5061045f610a64366004613bf8565b611a39565b348015610a7557600080fd5b506014546104bf906001600160a01b031681565b348015610a9557600080fd5b5061045f611ca1565b348015610aaa57600080fd5b50610472600d5481565b348015610ac057600080fd5b5061045f610acf366004613aca565b611cec565b348015610ae057600080fd5b50601754600160c01b900460ff1661042f565b348015610aff57600080fd5b50610472610b0e366004613aca565b611d37565b348015610b1f57600080fd5b5061045f610b2e366004613aca565b611d7b565b348015610b3f57600080fd5b50610472610b4e366004613ba5565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b348015610b8557600080fd5b5061045f611dc7565b348015610b9a57600080fd5b5061045f610ba9366004613ae7565b611eb7565b348015610bba57600080fd5b5061045f610bc9366004613aca565b611ee6565b348015610bda57600080fd5b5061045f610be9366004613aca565b611f31565b6000610bfb338484611fc9565b5060015b92915050565b6000546001600160a01b03163314610c385760405162461bcd60e51b8152600401610c2f90613c51565b60405180910390fd5b6001600160a01b03811660009081526004602052604090205460ff16610ca05760405162461bcd60e51b815260206004820152601a60248201527f4163636f756e74206973206e6f7420626c61636b6c69737465640000000000006044820152606401610c2f565b60005b600554811015610db757816001600160a01b031660058281548110610cca57610cca613c86565b6000918252602090912001546001600160a01b031603610da55760058054610cf490600190613cb2565b81548110610d0457610d04613c86565b600091825260209091200154600580546001600160a01b039092169183908110610d3057610d30613c86565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600490915260409020805460ff191690556005805480610d7f57610d7f613cc5565b600082815260209020810160001990810180546001600160a01b03191690550190555050565b80610daf81613cdb565b915050610ca3565b5050565b6000546001600160a01b03163314610de55760405162461bcd60e51b8152600401610c2f90613c51565b6064811115610e065760405162461bcd60e51b8152600401610c2f90613cf4565b600b55565b6000610e188484846120ed565b610e6a8433610e6585604051806060016040528060288152602001613f0f602891396001600160a01b038a16600090815260036020908152604080832033845290915290205491906127f8565b611fc9565b5060015b9392505050565b6000546001600160a01b03163314610e9f5760405162461bcd60e51b8152600401610c2f90613c51565b610eaa838383612824565b505050565b6000546001600160a01b03163314610ed95760405162461bcd60e51b8152600401610c2f90613c51565b6001600160a01b038216600081815260196020908152604091829020805460ff19168515159081179091558251938452908301527f4c0079b9bcd37cd5d29a13938effd97c881798cbc6bd52a3026a29d94b27d1bf91015b60405180910390a15050565b6000600954821115610fa45760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610c2f565b6000610fae61299e565b9050610e6e83826129c1565b6000546001600160a01b03163314610fe45760405162461bcd60e51b8152600401610c2f90613c51565b6013546001600160a01b03908116908216036110425760405162461bcd60e51b815260206004820152601c60248201527f57652063616e206e6f7420626c61636b6c69737420556e6973776170000000006044820152606401610c2f565b6001600160a01b03811660009081526004602052604090205460ff16156110ab5760405162461bcd60e51b815260206004820152601e60248201527f4163636f756e7420697320616c726561647920626c61636b6c697374656400006044820152606401610c2f565b6001600160a01b03166000818152600460205260408120805460ff191660019081179091556005805491820181559091527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00180546001600160a01b0319169091179055565b6000546001600160a01b0316331461113b5760405162461bcd60e51b8152600401610c2f90613c51565b610db782826129cd565b6000546001600160a01b0316331461116f5760405162461bcd60e51b8152600401610c2f90613c51565b60178054911515600160c01b0260ff60c01b19909216919091179055565b6000546001600160a01b031633146111b75760405162461bcd60e51b8152600401610c2f90613c51565b6001600160a01b03811660009081526007602052604090205460ff1661121f5760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c726561647920696e636c7564656400000000006044820152606401610c2f565b60005b600854811015610db757816001600160a01b03166008828154811061124957611249613c86565b6000918252602090912001546001600160a01b031603611307576008805461127390600190613cb2565b8154811061128357611283613c86565b600091825260209091200154600880546001600160a01b0390921691839081106112af576112af613c86565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600282526040808220829055600790925220805460ff191690556008805480610d7f57610d7f613cc5565b8061131181613cdb565b915050611222565b3360008181526003602090815260408083206001600160a01b03871684529091528120549091610bfb918590610e659086612af8565b6000546001600160a01b031633146113795760405162461bcd60e51b8152600401610c2f90613c51565b6040516370a0823160e01b81523060048201526000906001600160a01b038416906370a0823190602401602060405180830381865afa1580156113c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113e49190613d24565b9050610eaa838383612824565b6000546001600160a01b0316331461141b5760405162461bcd60e51b8152600401610c2f90613c51565b61142533476129cd565b565b6000546001600160a01b031633146114515760405162461bcd60e51b8152600401610c2f90613c51565b6001600160a01b03166000908152600660205260409020805460ff19166001179055565b60006b033b2e3c9fd0803ce80000008311156114d35760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c79006044820152606401610c2f565b816114f25760006114e384612b04565b50939550610bff945050505050565b60006114fd84612b04565b50929550610bff945050505050565b6000546001600160a01b031633146115365760405162461bcd60e51b8152600401610c2f90613c51565b601155565b6000546001600160a01b031633146115655760405162461bcd60e51b8152600401610c2f90613c51565b6001600160a01b03166000908152601560205260409020805460ff19166001179055565b6000546001600160a01b031633146115b35760405162461bcd60e51b8152600401610c2f90613c51565b6001600160a01b03811660009081526007602052604090205460ff161561161c5760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610c2f565b6001600160a01b03811660009081526001602052604090205415611676576001600160a01b03811660009081526001602052604090205461165c90610f3d565b6001600160a01b0382166000908152600260205260409020555b6001600160a01b03166000818152600760205260408120805460ff191660019081179091556008805491820181559091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b0319169091179055565b6001600160a01b031660009081526006602052604090205460ff1690565b6000546001600160a01b031633146117245760405162461bcd60e51b8152600401610c2f90613c51565b60648111156117455760405162461bcd60e51b8152600401610c2f90613cf4565b600d55565b6014546000906001600160a01b039081169083160361176b57506001919050565b506001600160a01b031660009081526015602052604090205460ff1690565b6000546001600160a01b031633146117b45760405162461bcd60e51b8152600401610c2f90613c51565b60178054911515600160b81b0260ff60b81b19909216919091179055565b6000546001600160a01b031633146117fc5760405162461bcd60e51b8152600401610c2f90613c51565b601680546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03811660009081526007602052604081205460ff161561185b57506001600160a01b031660009081526002602052604090205490565b6001600160a01b038216600090815260016020526040902054610bff90610f3d565b6000546001600160a01b031633146118a75760405162461bcd60e51b8152600401610c2f90613c51565b6114256000612b53565b6000546001600160a01b031633146118db5760405162461bcd60e51b8152600401610c2f90613c51565b60178054911515600160b01b0260ff60b01b19909216919091179055565b6000546001600160a01b031633146119235760405162461bcd60e51b8152600401610c2f90613c51565b60648111156119445760405162461bcd60e51b8152600401610c2f90613cf4565b600f55565b6000546001600160a01b031633146119735760405162461bcd60e51b8152600401610c2f90613c51565b601780546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146119bf5760405162461bcd60e51b8152600401610c2f90613c51565b60178054911515600160c81b0260ff60c81b19909216919091179055565b6000610bfb3384610e6585604051806060016040528060258152602001613f37602591393360009081526003602090815260408083206001600160a01b038d16845290915290205491906127f8565b6000610bfb3384846120ed565b6000546001600160a01b03163314611a635760405162461bcd60e51b8152600401610c2f90613c51565b84601660006101000a8154816001600160a01b0302191690836001600160a01b031602179055506000869050806001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611acd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611af19190613d3d565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b3e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b629190613d3d565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015611baf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bd39190613d3d565b601480546001600160a01b03199081166001600160a01b03938416179091556013805490911683831617905560008054909116815260066020526040808220805460ff199081166001908117909255308452919092208054909116909117905560648511801590611c45575060648411155b8015611c52575060648311155b8015611c5f575060648211155b611c7b5760405162461bcd60e51b8152600401610c2f90613cf4565b50600b849055600c93909355600d829055600e91909155600f8190556010556011555050565b6000546001600160a01b03163314611ccb5760405162461bcd60e51b8152600401610c2f90613c51565b601780544260125564ffffffffff60a81b191664010100010160a81b179055565b6000546001600160a01b03163314611d165760405162461bcd60e51b8152600401610c2f90613c51565b6001600160a01b03166000908152601560205260409020805460ff19169055565b600080611d5d600f54611d57600b54600d54612af890919063ffffffff16565b90612af8565b9050611d68836116dc565b611d725780610e6e565b60009392505050565b6000546001600160a01b03163314611da55760405162461bcd60e51b8152600401610c2f90613c51565b601380546001600160a01b0319166001600160a01b0392909216919091179055565b3360009081526019602052604090205460ff1680611def57506000546001600160a01b031633145b611e3b5760405162461bcd60e51b815260206004820152601f60248201527f4564466920546f6b656e3a206e6f7420617574686f72697a65642075736572006044820152606401610c2f565b6000611e463061181e565b90508015611eb4576000611e9d670de0b6b3a7640000611e976064611e97670de0b6b3a7640000611e91601154611e91601460009054906101000a90046001600160a01b031661181e565b90612ba3565b906129c1565b905080821115611eab578091505b610db782612baf565b50565b6000546001600160a01b03163314611ee15760405162461bcd60e51b8152600401610c2f90613c51565b601855565b6000546001600160a01b03163314611f105760405162461bcd60e51b8152600401610c2f90613c51565b6001600160a01b03166000908152600660205260409020805460ff19169055565b6000546001600160a01b03163314611f5b5760405162461bcd60e51b8152600401610c2f90613c51565b6001600160a01b038116611fc05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c2f565b611eb481612b53565b6001600160a01b03831661202b5760405162461bcd60e51b8152602060048201526024808201527f42455032303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610c2f565b6001600160a01b03821661208c5760405162461bcd60e51b815260206004820152602260248201527f42455032303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610c2f565b6001600160a01b0383811660008181526003602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166121515760405162461bcd60e51b815260206004820152602560248201527f42455032303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610c2f565b6001600160a01b0382166121b35760405162461bcd60e51b815260206004820152602360248201527f42455032303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610c2f565b600081116122155760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610c2f565b6001600160a01b03821660009081526004602052604090205460ff161561224e5760405162461bcd60e51b8152600401610c2f90613d5a565b6001600160a01b03831660009081526004602052604090205460ff16156122875760405162461bcd60e51b8152600401610c2f90613d5a565b3360009081526004602052604090205460ff16156122b75760405162461bcd60e51b8152600401610c2f90613d5a565b601754600160b01b900460ff16806122dc57506000546001600160a01b038481169116145b61233d5760405162461bcd60e51b815260206004820152602c60248201527f7472616e7366657272696e6720746f6b656e73206973206e6f7420637572726560448201526b1b9d1b1e48185b1b1bddd95960a21b6064820152608401610c2f565b60145460019060009081906001600160a01b038781169116148061237957506001600160a01b03861660009081526015602052604090205460ff165b801561239357506013546001600160a01b03868116911614155b80156123a85750601754600160a81b900460ff165b1561249c57600191506123ba856116dc565b61248657601754600160a81b900460ff166124175760405162461bcd60e51b815260206004820152601860248201527f54726164696e67206e6f742079657420656e61626c65642e00000000000000006044820152606401610c2f565b6012544203612486576001600160a01b0385166000818152600460205260408120805460ff191660019081179091556005805491820181559091527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00180546001600160a01b03191690911790555b601754600160c01b900460ff1661249c57600092505b601754600160a81b900460ff1680156124c357506014546001600160a01b03878116911614155b80156124e857506001600160a01b03861660009081526015602052604090205460ff16155b801561250257506013546001600160a01b03878116911614155b15612796576014546001600160a01b038681169116148061253b57506001600160a01b03851660009081526015602052604090205460ff165b8061255357506013546001600160a01b038681169116145b156127965750601754600190600160c81b900460ff1661257257600092505b600080601460009054906101000a90046001600160a01b03166001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa1580156125c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125ec9190613d9d565b506001600160701b031691506001600160701b03169150306001600160a01b0316601460009054906101000a90046001600160a01b03166001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015612660573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126849190613d3d565b6001600160a01b03161461269957808261269c565b81815b601354604051630153543560e21b8152600481018a905260248101849052604481018390529294509092506000916001600160a01b039091169063054d50d490606401602060405180830381865afa1580156126fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127209190613d24565b90506018548111156127925760405162461bcd60e51b815260206004820152603560248201527f74686520616d6f756e74206f66207468652073616c65206973206d6f7265207460448201527468616e2074686520617661696c61626c65206f6e6560581b6064820152608401610c2f565b5050505b801580156127a2575081155b80156127b85750601754600160b81b900460ff16155b156127c257600092505b6127cb866116dc565b806127da57506127da856116dc565b156127e457600092505b6127f086868686612c68565b505050505050565b6000818484111561281c5760405162461bcd60e51b8152600401610c2f9190613a56565b505050900390565b6001600160a01b0382166128765760405162461bcd60e51b815260206004820152601960248201527857697468647261773a2061646472657373206973207a65726f60381b6044820152606401610c2f565b6040516370a0823160e01b81523060048201526001600160a01b038416906370a0823190602401602060405180830381865afa1580156128ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128de9190613d24565b8111156129395760405162461bcd60e51b815260206004820152602360248201527f57697468647261773a206e6f7420656e6f7567687420746f6b656e2062616c616044820152626e636560e81b6064820152608401610c2f565b61294d6001600160a01b0384168383612d99565b604080516001600160a01b038086168252841660208201529081018290527f037238854fe57fbf51f09946f854fc3916fe83938d6521f09bd05463839f1304906060015b60405180910390a1505050565b60008060006129ab612deb565b90925090506129ba82826129c1565b9250505090565b6000610e6e8284613ded565b6001600160a01b038216612a1f5760405162461bcd60e51b815260206004820152601960248201527857697468647261773a2061646472657373206973207a65726f60381b6044820152606401610c2f565b47811115612a795760405162461bcd60e51b815260206004820152602160248201527f57697468647261773a206e6f7420656e6f75676874204554482062616c616e636044820152606560f81b6064820152608401610c2f565b612ab982826040518060400160405280601881526020017f57697468647261773a2043616e27742073656e64204554480000000000000000815250612f93565b604080516001600160a01b0384168152602081018390527f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a94243649101610f31565b6000610e6e8284613e0f565b6000806000806000806000806000612b1b8a613010565b9250925092506000806000612b398d8686612b3461299e565b613052565b919f909e50909c50959a5093985091965092945050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000610e6e8284613e22565b476000612bba6130a2565b90506000612bd782611e97600f5487612ba390919063ffffffff16565b9050612be38185613cb2565b9350612bee846130c0565b476000612bfb8286613286565b9050808015612c505760165460408051808201909152601781527f43616e742073656e642045544820746f2077616c6c65740000000000000000006020820152612c50916001600160a01b0316908390612f93565b8315612c5f57612c5f84613292565b50505050505050565b80612c7557612c756132ed565b6001600160a01b03841660009081526007602052604090205460ff168015612cb657506001600160a01b03831660009081526007602052604090205460ff16155b15612ccb57612cc6848484613332565b612d77565b6001600160a01b03841660009081526007602052604090205460ff16158015612d0c57506001600160a01b03831660009081526007602052604090205460ff165b15612d1c57612cc6848484613458565b6001600160a01b03841660009081526007602052604090205460ff168015612d5c57506001600160a01b03831660009081526007602052604090205460ff165b15612d6c57612cc6848484613501565b612d77848484613574565b80612d9357612d93600c54600b55600e54600d55601054600f55565b50505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610eaa9084906135b8565b60095460009081906b033b2e3c9fd0803ce8000000825b600854811015612f5057826001600060088481548110612e2457612e24613c86565b60009182526020808320909101546001600160a01b031683528201929092526040019020541180612e8f5750816002600060088481548110612e6857612e68613c86565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b15612eae575050600954936b033b2e3c9fd0803ce80000009350915050565b612ef46001600060088481548110612ec857612ec8613c86565b60009182526020808320909101546001600160a01b031683528201929092526040019020548490613286565b9250612f3c6002600060088481548110612f1057612f10613c86565b60009182526020808320909101546001600160a01b031683528201929092526040019020548390613286565b915080612f4881613cdb565b915050612e02565b50600954612f6a906b033b2e3c9fd0803ce80000006129c1565b821015612f8a575050600954926b033b2e3c9fd0803ce800000092509050565b90939092509050565b6000836001600160a01b03168360405160006040518083038185875af1925050503d8060008114612fe0576040519150601f19603f3d011682016040523d82523d6000602084013e612fe5565b606091505b505090508082906130095760405162461bcd60e51b8152600401610c2f9190613a56565b5050505050565b60008060008061301f8561368a565b9050600061302c866136be565b905060006130448261303e8986613286565b90613286565b979296509094509092505050565b60008080806130618886612ba3565b9050600061306f8887612ba3565b9050600061307d8888612ba3565b9050600061308f8261303e8686613286565b939b939a50919850919650505050505050565b60006130bb600f54600d54612af890919063ffffffff16565b905090565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106130f5576130f5613c86565b6001600160a01b03928316602091820292909201810191909152601354604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa15801561314e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131729190613d3d565b8160018151811061318557613185613c86565b6001600160a01b0392831660209182029290920101526013546131ab9130911684611fc9565b6013546040516000916001600160a01b0316906131d49085908490869030904290602401613e7d565b60408051601f198184030181529181526020820180516001600160e01b031663791ac94760e01b179052516132099190613ebc565b6000604051808303816000865af19150503d8060008114613246576040519150601f19603f3d011682016040523d82523d6000602084013e61324b565b606091505b505090508015610eaa577f32cde87eb454f3a0b875ab23547023107cfad454363ec88ba5695e2c24aa52a78383604051612991929190613ed8565b6000610e6e8284613cb2565b600061329f8260026129c1565b905060006132ad8383613286565b90506132b83061181e565b8111156132cb576132c83061181e565b90505b476132d5836130c0565b60006132e14783613286565b905061300983826136ef565b600b541580156132fd5750600d54155b80156133095750600f54155b1561331057565b600b8054600c55600d8054600e55600f80546010556000928390559082905555565b60008060008060008061334487612b04565b6001600160a01b038f16600090815260026020526040902054959b509399509197509550935091506133769088613286565b6001600160a01b038a166000908152600260209081526040808320939093556001905220546133a59087613286565b6001600160a01b03808b1660009081526001602052604080822093909355908a16815220546133d49086612af8565b6001600160a01b0389166000908152600160205260409020556133f681613805565b613400848361388d565b876001600160a01b0316896001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8560405161344591815260200190565b60405180910390a3505050505050505050565b60008060008060008061346a87612b04565b6001600160a01b038f16600090815260016020526040902054959b5093995091975095509350915061349c9087613286565b6001600160a01b03808b16600090815260016020908152604080832094909455918b168152600290915220546134d29084612af8565b6001600160a01b0389166000908152600260209081526040808320939093556001905220546133d49086612af8565b60008060008060008061351387612b04565b6001600160a01b038f16600090815260026020526040902054959b509399509197509550935091506135459088613286565b6001600160a01b038a1660009081526002602090815260408083209390935560019052205461349c9087613286565b60008060008060008061358687612b04565b6001600160a01b038f16600090815260016020526040902054959b509399509197509550935091506133a59087613286565b600061360d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166138b19092919063ffffffff16565b805190915015610eaa578080602001905181019061362b9190613ef1565b610eaa5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610c2f565b6000610bff670de0b6b3a7640000611e976064611e97670de0b6b3a7640000611e91600b5489612ba390919063ffffffff16565b6000610bff670de0b6b3a7640000611e976064611e97670de0b6b3a7640000611e916136e86130a2565b8990612ba3565b6013546137079030906001600160a01b031684611fc9565b60135460175460405130602482015260448101859052600060648201819052608482018190526001600160a01b0392831660a48301524260c4830152929190911690839060e40160408051601f198184030181529181526020820180516001600160e01b031663f305d71960e01b179052516137839190613ebc565b60006040518083038185875af1925050503d80600081146137c0576040519150601f19603f3d011682016040523d82523d6000602084013e6137c5565b606091505b505090508015610eaa5760408051838152602081018590527f28fc98272ce761178794ad6768050fea1648e07f1e2ffe15afd3a290f83814869101612991565b600061380f61299e565b9050600061381d8383612ba3565b3060009081526001602052604090205490915061383a9082612af8565b3060009081526001602090815260408083209390935560079052205460ff1615610eaa57306000908152600260205260409020546138789084612af8565b30600090815260026020526040902055505050565b60095461389a9083613286565b600955600a546138aa9082612af8565b600a555050565b60606138c084846000856138c8565b949350505050565b6060824710156139295760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610c2f565b6001600160a01b0385163b6139805760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610c2f565b600080866001600160a01b0316858760405161399c9190613ebc565b60006040518083038185875af1925050503d80600081146139d9576040519150601f19603f3d011682016040523d82523d6000602084013e6139de565b606091505b50915091506139ee8282866139f9565b979650505050505050565b60608315613a08575081610e6e565b825115613a185782518084602001fd5b8160405162461bcd60e51b8152600401610c2f9190613a56565b60005b83811015613a4d578181015183820152602001613a35565b50506000910152565b6020815260008251806020840152613a75816040850160208701613a32565b601f01601f19169190910160400192915050565b6001600160a01b0381168114611eb457600080fd5b60008060408385031215613ab157600080fd5b8235613abc81613a89565b946020939093013593505050565b600060208284031215613adc57600080fd5b8135610e6e81613a89565b600060208284031215613af957600080fd5b5035919050565b600080600060608486031215613b1557600080fd5b8335613b2081613a89565b92506020840135613b3081613a89565b929592945050506040919091013590565b8015158114611eb457600080fd5b60008060408385031215613b6257600080fd5b8235613b6d81613a89565b91506020830135613b7d81613b41565b809150509250929050565b600060208284031215613b9a57600080fd5b8135610e6e81613b41565b60008060408385031215613bb857600080fd5b8235613bc381613a89565b91506020830135613b7d81613a89565b60008060408385031215613be657600080fd5b823591506020830135613b7d81613b41565b60008060008060008060c08789031215613c1157600080fd5b8635613c1c81613a89565b95506020870135613c2c81613a89565b95989597505050506040840135936060810135936080820135935060a0909101359150565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b81810381811115610bff57610bff613c9c565b634e487b7160e01b600052603160045260246000fd5b600060018201613ced57613ced613c9c565b5060010190565b6020808252601690820152756665652063616e6e6f7420657863656564203130302560501b604082015260600190565b600060208284031215613d3657600080fd5b5051919050565b600060208284031215613d4f57600080fd5b8151610e6e81613a89565b6020808252600d908201526c53746f7020736e6970696e672160981b604082015260600190565b80516001600160701b0381168114613d9857600080fd5b919050565b600080600060608486031215613db257600080fd5b613dbb84613d81565b9250613dc960208501613d81565b9150604084015163ffffffff81168114613de257600080fd5b809150509250925092565b600082613e0a57634e487b7160e01b600052601260045260246000fd5b500490565b80820180821115610bff57610bff613c9c565b8082028115828204841417610bff57610bff613c9c565b600081518084526020808501945080840160005b83811015613e725781516001600160a01b031687529582019590820190600101613e4d565b509495945050505050565b85815260ff8516602082015260a060408201526000613e9f60a0830186613e39565b6001600160a01b0394909416606083015250608001529392505050565b60008251613ece818460208701613a32565b9190910192915050565b8281526040602082015260006138c06040830184613e39565b600060208284031215613f0357600080fd5b8151610e6e81613b4156fe42455032303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636542455032303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212205fd9e0358af49c6dea1e05c1726e9165f994b289b9f8bcde57313ad07e18840964736f6c63430008120033

Deployed Bytecode

0x6080604052600436106103c75760003560e01c806366d602ae116101f2578063a457c2d71161010d578063d9fff755116100a0578063e4fc6b6d1161006f578063e4fc6b6d14610b79578063e99c9d0914610b8e578063ea2f0b3714610bae578063f2fde38b14610bce57600080fd5b8063d9fff75514610ad4578063dc6571eb14610af3578063dce0333614610b13578063dd62ed3e14610b3357600080fd5b8063c816841b116100dc578063c816841b14610a69578063c9567bf914610a89578063cc32d17614610a9e578063d74611bc14610ab457600080fd5b8063a457c2d7146109d9578063a9059cbb146109f9578063b918161114610a19578063c1051d8f14610a4957600080fd5b80638da5cb5b1161018557806396d386e41161015457806396d386e41461096e57806396eced441461098e578063978bbdb9146109ad57806398118cb4146109c357600080fd5b80638da5cb5b146109105780638ee88c531461092e5780638ef588fc1461094e57806395d89b41146103d357600080fd5b806375ae267d116101c157806375ae267d1461088b578063790ca413146108ab57806383ad7994146108c157806388f82020146108d757600080fd5b806366d602ae1461082057806370a0823114610836578063715018a614610856578063735de9f71461086b57600080fd5b806339509351116102e25780634d8d9efa116102755780635af3832a116102445780635af3832a14610787578063610d5b19146107a757806361ec6830146107e05780636605bfda1461080057600080fd5b80634d8d9efa1461070857806352390c02146107275780635342acb41461074757806356e1221c1461076757600080fd5b80634549b039116102b15780634549b0391461068857806345596e2e146106a85780634626402b146106c8578063489931f0146106e857600080fd5b806339509351146106135780633aeac4e1146106335780633ccfd60b14610653578063437823ec1461066857600080fd5b80632b51c7c01161035a57806333251a0b1161032957806333251a0b14610593578063340c8cc0146105b35780633491218c146105d35780633685d419146105f357600080fd5b80632b51c7c0146105175780632d1fb389146105375780632d83811914610557578063313ce5671461057757600080fd5b806318160ddd1161039657806318160ddd146104805780631df59e2f1461049f5780631f7ede2b146104d757806323b872dd146104f757600080fd5b806306fdde03146103d3578063095ea7b31461040f5780630b2a808c1461043f57806313114a9d1461046157600080fd5b366103ce57005b600080fd5b3480156103df57600080fd5b5060408051808201825260048152634564466960e01b602082015290516104069190613a56565b60405180910390f35b34801561041b57600080fd5b5061042f61042a366004613a9e565b610bee565b6040519015158152602001610406565b34801561044b57600080fd5b5061045f61045a366004613aca565b610c05565b005b34801561046d57600080fd5b50600a545b604051908152602001610406565b34801561048c57600080fd5b506b033b2e3c9fd0803ce8000000610472565b3480156104ab57600080fd5b506017546104bf906001600160a01b031681565b6040516001600160a01b039091168152602001610406565b3480156104e357600080fd5b5061045f6104f2366004613ae7565b610dbb565b34801561050357600080fd5b5061042f610512366004613b00565b610e0b565b34801561052357600080fd5b5061045f610532366004613b00565b610e75565b34801561054357600080fd5b5061045f610552366004613b4f565b610eaf565b34801561056357600080fd5b50610472610572366004613ae7565b610f3d565b34801561058357600080fd5b5060405160128152602001610406565b34801561059f57600080fd5b5061045f6105ae366004613aca565b610fba565b3480156105bf57600080fd5b5061045f6105ce366004613a9e565b611111565b3480156105df57600080fd5b5061045f6105ee366004613b88565b611145565b3480156105ff57600080fd5b5061045f61060e366004613aca565b61118d565b34801561061f57600080fd5b5061042f61062e366004613a9e565b611319565b34801561063f57600080fd5b5061045f61064e366004613ba5565b61134f565b34801561065f57600080fd5b5061045f6113f1565b34801561067457600080fd5b5061045f610683366004613aca565b611427565b34801561069457600080fd5b506104726106a3366004613bd3565b611475565b3480156106b457600080fd5b5061045f6106c3366004613ae7565b61150c565b3480156106d457600080fd5b506016546104bf906001600160a01b031681565b3480156106f457600080fd5b5061045f610703366004613aca565b61153b565b34801561071457600080fd5b50601754600160b81b900460ff1661042f565b34801561073357600080fd5b5061045f610742366004613aca565b611589565b34801561075357600080fd5b5061042f610762366004613aca565b6116dc565b34801561077357600080fd5b5061045f610782366004613ae7565b6116fa565b34801561079357600080fd5b5061042f6107a2366004613aca565b61174a565b3480156107b357600080fd5b5061042f6107c2366004613aca565b6001600160a01b031660009081526004602052604090205460ff1690565b3480156107ec57600080fd5b5061045f6107fb366004613b88565b61178a565b34801561080c57600080fd5b5061045f61081b366004613aca565b6117d2565b34801561082c57600080fd5b5061047260185481565b34801561084257600080fd5b50610472610851366004613aca565b61181e565b34801561086257600080fd5b5061045f61187d565b34801561087757600080fd5b506013546104bf906001600160a01b031681565b34801561089757600080fd5b5061045f6108a6366004613b88565b6118b1565b3480156108b757600080fd5b5061047260125481565b3480156108cd57600080fd5b50610472600b5481565b3480156108e357600080fd5b5061042f6108f2366004613aca565b6001600160a01b031660009081526007602052604090205460ff1690565b34801561091c57600080fd5b506000546001600160a01b03166104bf565b34801561093a57600080fd5b5061045f610949366004613ae7565b6118f9565b34801561095a57600080fd5b5061045f610969366004613aca565b611949565b34801561097a57600080fd5b5061045f610989366004613b88565b611995565b34801561099a57600080fd5b50601754600160c81b900460ff1661042f565b3480156109b957600080fd5b5061047260115481565b3480156109cf57600080fd5b50610472600f5481565b3480156109e557600080fd5b5061042f6109f4366004613a9e565b6119dd565b348015610a0557600080fd5b5061042f610a14366004613a9e565b611a2c565b348015610a2557600080fd5b5061042f610a34366004613aca565b60196020526000908152604090205460ff1681565b348015610a5557600080fd5b5061045f610a64366004613bf8565b611a39565b348015610a7557600080fd5b506014546104bf906001600160a01b031681565b348015610a9557600080fd5b5061045f611ca1565b348015610aaa57600080fd5b50610472600d5481565b348015610ac057600080fd5b5061045f610acf366004613aca565b611cec565b348015610ae057600080fd5b50601754600160c01b900460ff1661042f565b348015610aff57600080fd5b50610472610b0e366004613aca565b611d37565b348015610b1f57600080fd5b5061045f610b2e366004613aca565b611d7b565b348015610b3f57600080fd5b50610472610b4e366004613ba5565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b348015610b8557600080fd5b5061045f611dc7565b348015610b9a57600080fd5b5061045f610ba9366004613ae7565b611eb7565b348015610bba57600080fd5b5061045f610bc9366004613aca565b611ee6565b348015610bda57600080fd5b5061045f610be9366004613aca565b611f31565b6000610bfb338484611fc9565b5060015b92915050565b6000546001600160a01b03163314610c385760405162461bcd60e51b8152600401610c2f90613c51565b60405180910390fd5b6001600160a01b03811660009081526004602052604090205460ff16610ca05760405162461bcd60e51b815260206004820152601a60248201527f4163636f756e74206973206e6f7420626c61636b6c69737465640000000000006044820152606401610c2f565b60005b600554811015610db757816001600160a01b031660058281548110610cca57610cca613c86565b6000918252602090912001546001600160a01b031603610da55760058054610cf490600190613cb2565b81548110610d0457610d04613c86565b600091825260209091200154600580546001600160a01b039092169183908110610d3057610d30613c86565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600490915260409020805460ff191690556005805480610d7f57610d7f613cc5565b600082815260209020810160001990810180546001600160a01b03191690550190555050565b80610daf81613cdb565b915050610ca3565b5050565b6000546001600160a01b03163314610de55760405162461bcd60e51b8152600401610c2f90613c51565b6064811115610e065760405162461bcd60e51b8152600401610c2f90613cf4565b600b55565b6000610e188484846120ed565b610e6a8433610e6585604051806060016040528060288152602001613f0f602891396001600160a01b038a16600090815260036020908152604080832033845290915290205491906127f8565b611fc9565b5060015b9392505050565b6000546001600160a01b03163314610e9f5760405162461bcd60e51b8152600401610c2f90613c51565b610eaa838383612824565b505050565b6000546001600160a01b03163314610ed95760405162461bcd60e51b8152600401610c2f90613c51565b6001600160a01b038216600081815260196020908152604091829020805460ff19168515159081179091558251938452908301527f4c0079b9bcd37cd5d29a13938effd97c881798cbc6bd52a3026a29d94b27d1bf91015b60405180910390a15050565b6000600954821115610fa45760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610c2f565b6000610fae61299e565b9050610e6e83826129c1565b6000546001600160a01b03163314610fe45760405162461bcd60e51b8152600401610c2f90613c51565b6013546001600160a01b03908116908216036110425760405162461bcd60e51b815260206004820152601c60248201527f57652063616e206e6f7420626c61636b6c69737420556e6973776170000000006044820152606401610c2f565b6001600160a01b03811660009081526004602052604090205460ff16156110ab5760405162461bcd60e51b815260206004820152601e60248201527f4163636f756e7420697320616c726561647920626c61636b6c697374656400006044820152606401610c2f565b6001600160a01b03166000818152600460205260408120805460ff191660019081179091556005805491820181559091527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00180546001600160a01b0319169091179055565b6000546001600160a01b0316331461113b5760405162461bcd60e51b8152600401610c2f90613c51565b610db782826129cd565b6000546001600160a01b0316331461116f5760405162461bcd60e51b8152600401610c2f90613c51565b60178054911515600160c01b0260ff60c01b19909216919091179055565b6000546001600160a01b031633146111b75760405162461bcd60e51b8152600401610c2f90613c51565b6001600160a01b03811660009081526007602052604090205460ff1661121f5760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c726561647920696e636c7564656400000000006044820152606401610c2f565b60005b600854811015610db757816001600160a01b03166008828154811061124957611249613c86565b6000918252602090912001546001600160a01b031603611307576008805461127390600190613cb2565b8154811061128357611283613c86565b600091825260209091200154600880546001600160a01b0390921691839081106112af576112af613c86565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600282526040808220829055600790925220805460ff191690556008805480610d7f57610d7f613cc5565b8061131181613cdb565b915050611222565b3360008181526003602090815260408083206001600160a01b03871684529091528120549091610bfb918590610e659086612af8565b6000546001600160a01b031633146113795760405162461bcd60e51b8152600401610c2f90613c51565b6040516370a0823160e01b81523060048201526000906001600160a01b038416906370a0823190602401602060405180830381865afa1580156113c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113e49190613d24565b9050610eaa838383612824565b6000546001600160a01b0316331461141b5760405162461bcd60e51b8152600401610c2f90613c51565b61142533476129cd565b565b6000546001600160a01b031633146114515760405162461bcd60e51b8152600401610c2f90613c51565b6001600160a01b03166000908152600660205260409020805460ff19166001179055565b60006b033b2e3c9fd0803ce80000008311156114d35760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c79006044820152606401610c2f565b816114f25760006114e384612b04565b50939550610bff945050505050565b60006114fd84612b04565b50929550610bff945050505050565b6000546001600160a01b031633146115365760405162461bcd60e51b8152600401610c2f90613c51565b601155565b6000546001600160a01b031633146115655760405162461bcd60e51b8152600401610c2f90613c51565b6001600160a01b03166000908152601560205260409020805460ff19166001179055565b6000546001600160a01b031633146115b35760405162461bcd60e51b8152600401610c2f90613c51565b6001600160a01b03811660009081526007602052604090205460ff161561161c5760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610c2f565b6001600160a01b03811660009081526001602052604090205415611676576001600160a01b03811660009081526001602052604090205461165c90610f3d565b6001600160a01b0382166000908152600260205260409020555b6001600160a01b03166000818152600760205260408120805460ff191660019081179091556008805491820181559091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b0319169091179055565b6001600160a01b031660009081526006602052604090205460ff1690565b6000546001600160a01b031633146117245760405162461bcd60e51b8152600401610c2f90613c51565b60648111156117455760405162461bcd60e51b8152600401610c2f90613cf4565b600d55565b6014546000906001600160a01b039081169083160361176b57506001919050565b506001600160a01b031660009081526015602052604090205460ff1690565b6000546001600160a01b031633146117b45760405162461bcd60e51b8152600401610c2f90613c51565b60178054911515600160b81b0260ff60b81b19909216919091179055565b6000546001600160a01b031633146117fc5760405162461bcd60e51b8152600401610c2f90613c51565b601680546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03811660009081526007602052604081205460ff161561185b57506001600160a01b031660009081526002602052604090205490565b6001600160a01b038216600090815260016020526040902054610bff90610f3d565b6000546001600160a01b031633146118a75760405162461bcd60e51b8152600401610c2f90613c51565b6114256000612b53565b6000546001600160a01b031633146118db5760405162461bcd60e51b8152600401610c2f90613c51565b60178054911515600160b01b0260ff60b01b19909216919091179055565b6000546001600160a01b031633146119235760405162461bcd60e51b8152600401610c2f90613c51565b60648111156119445760405162461bcd60e51b8152600401610c2f90613cf4565b600f55565b6000546001600160a01b031633146119735760405162461bcd60e51b8152600401610c2f90613c51565b601780546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146119bf5760405162461bcd60e51b8152600401610c2f90613c51565b60178054911515600160c81b0260ff60c81b19909216919091179055565b6000610bfb3384610e6585604051806060016040528060258152602001613f37602591393360009081526003602090815260408083206001600160a01b038d16845290915290205491906127f8565b6000610bfb3384846120ed565b6000546001600160a01b03163314611a635760405162461bcd60e51b8152600401610c2f90613c51565b84601660006101000a8154816001600160a01b0302191690836001600160a01b031602179055506000869050806001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611acd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611af19190613d3d565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b3e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b629190613d3d565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015611baf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bd39190613d3d565b601480546001600160a01b03199081166001600160a01b03938416179091556013805490911683831617905560008054909116815260066020526040808220805460ff199081166001908117909255308452919092208054909116909117905560648511801590611c45575060648411155b8015611c52575060648311155b8015611c5f575060648211155b611c7b5760405162461bcd60e51b8152600401610c2f90613cf4565b50600b849055600c93909355600d829055600e91909155600f8190556010556011555050565b6000546001600160a01b03163314611ccb5760405162461bcd60e51b8152600401610c2f90613c51565b601780544260125564ffffffffff60a81b191664010100010160a81b179055565b6000546001600160a01b03163314611d165760405162461bcd60e51b8152600401610c2f90613c51565b6001600160a01b03166000908152601560205260409020805460ff19169055565b600080611d5d600f54611d57600b54600d54612af890919063ffffffff16565b90612af8565b9050611d68836116dc565b611d725780610e6e565b60009392505050565b6000546001600160a01b03163314611da55760405162461bcd60e51b8152600401610c2f90613c51565b601380546001600160a01b0319166001600160a01b0392909216919091179055565b3360009081526019602052604090205460ff1680611def57506000546001600160a01b031633145b611e3b5760405162461bcd60e51b815260206004820152601f60248201527f4564466920546f6b656e3a206e6f7420617574686f72697a65642075736572006044820152606401610c2f565b6000611e463061181e565b90508015611eb4576000611e9d670de0b6b3a7640000611e976064611e97670de0b6b3a7640000611e91601154611e91601460009054906101000a90046001600160a01b031661181e565b90612ba3565b906129c1565b905080821115611eab578091505b610db782612baf565b50565b6000546001600160a01b03163314611ee15760405162461bcd60e51b8152600401610c2f90613c51565b601855565b6000546001600160a01b03163314611f105760405162461bcd60e51b8152600401610c2f90613c51565b6001600160a01b03166000908152600660205260409020805460ff19169055565b6000546001600160a01b03163314611f5b5760405162461bcd60e51b8152600401610c2f90613c51565b6001600160a01b038116611fc05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c2f565b611eb481612b53565b6001600160a01b03831661202b5760405162461bcd60e51b8152602060048201526024808201527f42455032303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610c2f565b6001600160a01b03821661208c5760405162461bcd60e51b815260206004820152602260248201527f42455032303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610c2f565b6001600160a01b0383811660008181526003602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166121515760405162461bcd60e51b815260206004820152602560248201527f42455032303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610c2f565b6001600160a01b0382166121b35760405162461bcd60e51b815260206004820152602360248201527f42455032303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610c2f565b600081116122155760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610c2f565b6001600160a01b03821660009081526004602052604090205460ff161561224e5760405162461bcd60e51b8152600401610c2f90613d5a565b6001600160a01b03831660009081526004602052604090205460ff16156122875760405162461bcd60e51b8152600401610c2f90613d5a565b3360009081526004602052604090205460ff16156122b75760405162461bcd60e51b8152600401610c2f90613d5a565b601754600160b01b900460ff16806122dc57506000546001600160a01b038481169116145b61233d5760405162461bcd60e51b815260206004820152602c60248201527f7472616e7366657272696e6720746f6b656e73206973206e6f7420637572726560448201526b1b9d1b1e48185b1b1bddd95960a21b6064820152608401610c2f565b60145460019060009081906001600160a01b038781169116148061237957506001600160a01b03861660009081526015602052604090205460ff165b801561239357506013546001600160a01b03868116911614155b80156123a85750601754600160a81b900460ff165b1561249c57600191506123ba856116dc565b61248657601754600160a81b900460ff166124175760405162461bcd60e51b815260206004820152601860248201527f54726164696e67206e6f742079657420656e61626c65642e00000000000000006044820152606401610c2f565b6012544203612486576001600160a01b0385166000818152600460205260408120805460ff191660019081179091556005805491820181559091527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00180546001600160a01b03191690911790555b601754600160c01b900460ff1661249c57600092505b601754600160a81b900460ff1680156124c357506014546001600160a01b03878116911614155b80156124e857506001600160a01b03861660009081526015602052604090205460ff16155b801561250257506013546001600160a01b03878116911614155b15612796576014546001600160a01b038681169116148061253b57506001600160a01b03851660009081526015602052604090205460ff165b8061255357506013546001600160a01b038681169116145b156127965750601754600190600160c81b900460ff1661257257600092505b600080601460009054906101000a90046001600160a01b03166001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa1580156125c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125ec9190613d9d565b506001600160701b031691506001600160701b03169150306001600160a01b0316601460009054906101000a90046001600160a01b03166001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015612660573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126849190613d3d565b6001600160a01b03161461269957808261269c565b81815b601354604051630153543560e21b8152600481018a905260248101849052604481018390529294509092506000916001600160a01b039091169063054d50d490606401602060405180830381865afa1580156126fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127209190613d24565b90506018548111156127925760405162461bcd60e51b815260206004820152603560248201527f74686520616d6f756e74206f66207468652073616c65206973206d6f7265207460448201527468616e2074686520617661696c61626c65206f6e6560581b6064820152608401610c2f565b5050505b801580156127a2575081155b80156127b85750601754600160b81b900460ff16155b156127c257600092505b6127cb866116dc565b806127da57506127da856116dc565b156127e457600092505b6127f086868686612c68565b505050505050565b6000818484111561281c5760405162461bcd60e51b8152600401610c2f9190613a56565b505050900390565b6001600160a01b0382166128765760405162461bcd60e51b815260206004820152601960248201527857697468647261773a2061646472657373206973207a65726f60381b6044820152606401610c2f565b6040516370a0823160e01b81523060048201526001600160a01b038416906370a0823190602401602060405180830381865afa1580156128ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128de9190613d24565b8111156129395760405162461bcd60e51b815260206004820152602360248201527f57697468647261773a206e6f7420656e6f7567687420746f6b656e2062616c616044820152626e636560e81b6064820152608401610c2f565b61294d6001600160a01b0384168383612d99565b604080516001600160a01b038086168252841660208201529081018290527f037238854fe57fbf51f09946f854fc3916fe83938d6521f09bd05463839f1304906060015b60405180910390a1505050565b60008060006129ab612deb565b90925090506129ba82826129c1565b9250505090565b6000610e6e8284613ded565b6001600160a01b038216612a1f5760405162461bcd60e51b815260206004820152601960248201527857697468647261773a2061646472657373206973207a65726f60381b6044820152606401610c2f565b47811115612a795760405162461bcd60e51b815260206004820152602160248201527f57697468647261773a206e6f7420656e6f75676874204554482062616c616e636044820152606560f81b6064820152608401610c2f565b612ab982826040518060400160405280601881526020017f57697468647261773a2043616e27742073656e64204554480000000000000000815250612f93565b604080516001600160a01b0384168152602081018390527f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a94243649101610f31565b6000610e6e8284613e0f565b6000806000806000806000806000612b1b8a613010565b9250925092506000806000612b398d8686612b3461299e565b613052565b919f909e50909c50959a5093985091965092945050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000610e6e8284613e22565b476000612bba6130a2565b90506000612bd782611e97600f5487612ba390919063ffffffff16565b9050612be38185613cb2565b9350612bee846130c0565b476000612bfb8286613286565b9050808015612c505760165460408051808201909152601781527f43616e742073656e642045544820746f2077616c6c65740000000000000000006020820152612c50916001600160a01b0316908390612f93565b8315612c5f57612c5f84613292565b50505050505050565b80612c7557612c756132ed565b6001600160a01b03841660009081526007602052604090205460ff168015612cb657506001600160a01b03831660009081526007602052604090205460ff16155b15612ccb57612cc6848484613332565b612d77565b6001600160a01b03841660009081526007602052604090205460ff16158015612d0c57506001600160a01b03831660009081526007602052604090205460ff165b15612d1c57612cc6848484613458565b6001600160a01b03841660009081526007602052604090205460ff168015612d5c57506001600160a01b03831660009081526007602052604090205460ff165b15612d6c57612cc6848484613501565b612d77848484613574565b80612d9357612d93600c54600b55600e54600d55601054600f55565b50505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610eaa9084906135b8565b60095460009081906b033b2e3c9fd0803ce8000000825b600854811015612f5057826001600060088481548110612e2457612e24613c86565b60009182526020808320909101546001600160a01b031683528201929092526040019020541180612e8f5750816002600060088481548110612e6857612e68613c86565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b15612eae575050600954936b033b2e3c9fd0803ce80000009350915050565b612ef46001600060088481548110612ec857612ec8613c86565b60009182526020808320909101546001600160a01b031683528201929092526040019020548490613286565b9250612f3c6002600060088481548110612f1057612f10613c86565b60009182526020808320909101546001600160a01b031683528201929092526040019020548390613286565b915080612f4881613cdb565b915050612e02565b50600954612f6a906b033b2e3c9fd0803ce80000006129c1565b821015612f8a575050600954926b033b2e3c9fd0803ce800000092509050565b90939092509050565b6000836001600160a01b03168360405160006040518083038185875af1925050503d8060008114612fe0576040519150601f19603f3d011682016040523d82523d6000602084013e612fe5565b606091505b505090508082906130095760405162461bcd60e51b8152600401610c2f9190613a56565b5050505050565b60008060008061301f8561368a565b9050600061302c866136be565b905060006130448261303e8986613286565b90613286565b979296509094509092505050565b60008080806130618886612ba3565b9050600061306f8887612ba3565b9050600061307d8888612ba3565b9050600061308f8261303e8686613286565b939b939a50919850919650505050505050565b60006130bb600f54600d54612af890919063ffffffff16565b905090565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106130f5576130f5613c86565b6001600160a01b03928316602091820292909201810191909152601354604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa15801561314e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131729190613d3d565b8160018151811061318557613185613c86565b6001600160a01b0392831660209182029290920101526013546131ab9130911684611fc9565b6013546040516000916001600160a01b0316906131d49085908490869030904290602401613e7d565b60408051601f198184030181529181526020820180516001600160e01b031663791ac94760e01b179052516132099190613ebc565b6000604051808303816000865af19150503d8060008114613246576040519150601f19603f3d011682016040523d82523d6000602084013e61324b565b606091505b505090508015610eaa577f32cde87eb454f3a0b875ab23547023107cfad454363ec88ba5695e2c24aa52a78383604051612991929190613ed8565b6000610e6e8284613cb2565b600061329f8260026129c1565b905060006132ad8383613286565b90506132b83061181e565b8111156132cb576132c83061181e565b90505b476132d5836130c0565b60006132e14783613286565b905061300983826136ef565b600b541580156132fd5750600d54155b80156133095750600f54155b1561331057565b600b8054600c55600d8054600e55600f80546010556000928390559082905555565b60008060008060008061334487612b04565b6001600160a01b038f16600090815260026020526040902054959b509399509197509550935091506133769088613286565b6001600160a01b038a166000908152600260209081526040808320939093556001905220546133a59087613286565b6001600160a01b03808b1660009081526001602052604080822093909355908a16815220546133d49086612af8565b6001600160a01b0389166000908152600160205260409020556133f681613805565b613400848361388d565b876001600160a01b0316896001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8560405161344591815260200190565b60405180910390a3505050505050505050565b60008060008060008061346a87612b04565b6001600160a01b038f16600090815260016020526040902054959b5093995091975095509350915061349c9087613286565b6001600160a01b03808b16600090815260016020908152604080832094909455918b168152600290915220546134d29084612af8565b6001600160a01b0389166000908152600260209081526040808320939093556001905220546133d49086612af8565b60008060008060008061351387612b04565b6001600160a01b038f16600090815260026020526040902054959b509399509197509550935091506135459088613286565b6001600160a01b038a1660009081526002602090815260408083209390935560019052205461349c9087613286565b60008060008060008061358687612b04565b6001600160a01b038f16600090815260016020526040902054959b509399509197509550935091506133a59087613286565b600061360d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166138b19092919063ffffffff16565b805190915015610eaa578080602001905181019061362b9190613ef1565b610eaa5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610c2f565b6000610bff670de0b6b3a7640000611e976064611e97670de0b6b3a7640000611e91600b5489612ba390919063ffffffff16565b6000610bff670de0b6b3a7640000611e976064611e97670de0b6b3a7640000611e916136e86130a2565b8990612ba3565b6013546137079030906001600160a01b031684611fc9565b60135460175460405130602482015260448101859052600060648201819052608482018190526001600160a01b0392831660a48301524260c4830152929190911690839060e40160408051601f198184030181529181526020820180516001600160e01b031663f305d71960e01b179052516137839190613ebc565b60006040518083038185875af1925050503d80600081146137c0576040519150601f19603f3d011682016040523d82523d6000602084013e6137c5565b606091505b505090508015610eaa5760408051838152602081018590527f28fc98272ce761178794ad6768050fea1648e07f1e2ffe15afd3a290f83814869101612991565b600061380f61299e565b9050600061381d8383612ba3565b3060009081526001602052604090205490915061383a9082612af8565b3060009081526001602090815260408083209390935560079052205460ff1615610eaa57306000908152600260205260409020546138789084612af8565b30600090815260026020526040902055505050565b60095461389a9083613286565b600955600a546138aa9082612af8565b600a555050565b60606138c084846000856138c8565b949350505050565b6060824710156139295760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610c2f565b6001600160a01b0385163b6139805760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610c2f565b600080866001600160a01b0316858760405161399c9190613ebc565b60006040518083038185875af1925050503d80600081146139d9576040519150601f19603f3d011682016040523d82523d6000602084013e6139de565b606091505b50915091506139ee8282866139f9565b979650505050505050565b60608315613a08575081610e6e565b825115613a185782518084602001fd5b8160405162461bcd60e51b8152600401610c2f9190613a56565b60005b83811015613a4d578181015183820152602001613a35565b50506000910152565b6020815260008251806020840152613a75816040850160208701613a32565b601f01601f19169190910160400192915050565b6001600160a01b0381168114611eb457600080fd5b60008060408385031215613ab157600080fd5b8235613abc81613a89565b946020939093013593505050565b600060208284031215613adc57600080fd5b8135610e6e81613a89565b600060208284031215613af957600080fd5b5035919050565b600080600060608486031215613b1557600080fd5b8335613b2081613a89565b92506020840135613b3081613a89565b929592945050506040919091013590565b8015158114611eb457600080fd5b60008060408385031215613b6257600080fd5b8235613b6d81613a89565b91506020830135613b7d81613b41565b809150509250929050565b600060208284031215613b9a57600080fd5b8135610e6e81613b41565b60008060408385031215613bb857600080fd5b8235613bc381613a89565b91506020830135613b7d81613a89565b60008060408385031215613be657600080fd5b823591506020830135613b7d81613b41565b60008060008060008060c08789031215613c1157600080fd5b8635613c1c81613a89565b95506020870135613c2c81613a89565b95989597505050506040840135936060810135936080820135935060a0909101359150565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b81810381811115610bff57610bff613c9c565b634e487b7160e01b600052603160045260246000fd5b600060018201613ced57613ced613c9c565b5060010190565b6020808252601690820152756665652063616e6e6f7420657863656564203130302560501b604082015260600190565b600060208284031215613d3657600080fd5b5051919050565b600060208284031215613d4f57600080fd5b8151610e6e81613a89565b6020808252600d908201526c53746f7020736e6970696e672160981b604082015260600190565b80516001600160701b0381168114613d9857600080fd5b919050565b600080600060608486031215613db257600080fd5b613dbb84613d81565b9250613dc960208501613d81565b9150604084015163ffffffff81168114613de257600080fd5b809150509250925092565b600082613e0a57634e487b7160e01b600052601260045260246000fd5b500490565b80820180821115610bff57610bff613c9c565b8082028115828204841417610bff57610bff613c9c565b600081518084526020808501945080840160005b83811015613e725781516001600160a01b031687529582019590820190600101613e4d565b509495945050505050565b85815260ff8516602082015260a060408201526000613e9f60a0830186613e39565b6001600160a01b0394909416606083015250608001529392505050565b60008251613ece818460208701613a32565b9190910192915050565b8281526040602082015260006138c06040830184613e39565b600060208284031215613f0357600080fd5b8151610e6e81613b4156fe42455032303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636542455032303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212205fd9e0358af49c6dea1e05c1726e9165f994b289b9f8bcde57313ad07e18840964736f6c63430008120033

Deployed Bytecode Sourcemap

38413:29416:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43158:85;;;;;;;;;;-1:-1:-1;43230:5:0;;;;;;;;;;;-1:-1:-1;;;43230:5:0;;;;43158:85;;;;43230:5;43158:85;:::i;:::-;;;;;;;;44301:195;;;;;;;;;;-1:-1:-1;44301:195:0;;;;;:::i;:::-;;:::i;:::-;;;1291:14:1;;1284:22;1266:41;;1254:2;1239:18;44301:195:0;1126:187:1;66100:519:0;;;;;;;;;;-1:-1:-1;66100:519:0;;;;;:::i;:::-;;:::i;:::-;;45707:89;;;;;;;;;;-1:-1:-1;45778:10:0;;45707:89;;;1716:25:1;;;1704:2;1689:18;45707:89:0;1570:177:1;43521:97:0;;;;;;;;;;-1:-1:-1;39584:19:0;43521:97;;40396:45;;;;;;;;;;-1:-1:-1;40396:45:0;;;;-1:-1:-1;;;;;40396:45:0;;;;;;-1:-1:-1;;;;;1916:32:1;;;1898:51;;1886:2;1871:18;40396:45:0;1752:203:1;63799:171:0;;;;;;;;;;-1:-1:-1;63799:171:0;;;;;:::i;:::-;;:::i;44504:448::-;;;;;;;;;;-1:-1:-1;44504:448:0;;;;;:::i;:::-;;:::i;67203:260::-;;;;;;;;;;-1:-1:-1;67203:260:0;;;;;:::i;:::-;;:::i;42965:157::-;;;;;;;;;;-1:-1:-1;42965:157:0;;;;;:::i;:::-;;:::i;46389:322::-;;;;;;;;;;-1:-1:-1;46389:322:0;;;;;:::i;:::-;;:::i;43398:85::-;;;;;;;;;;-1:-1:-1;43398:85:0;;39448:2;3258:36:1;;3246:2;3231:18;43398:85:0;3116:184:1;65753:339:0;;;;;;;;;;-1:-1:-1;65753:339:0;;;;;:::i;:::-;;:::i;67659:167::-;;;;;;;;;;-1:-1:-1;67659:167:0;;;;;:::i;:::-;;:::i;64470:116::-;;;;;;;;;;-1:-1:-1;64470:116:0;;;;;:::i;:::-;;:::i;47073:489::-;;;;;;;;;;-1:-1:-1;47073:489:0;;;;;:::i;:::-;;:::i;44960:302::-;;;;;;;;;;-1:-1:-1;44960:302:0;;;;;:::i;:::-;;:::i;66852:306::-;;;;;;;;;;-1:-1:-1;66852:306:0;;;;;:::i;:::-;;:::i;67505:112::-;;;;;;;;;;;;;:::i;63566:109::-;;;;;;;;;;-1:-1:-1;63566:109:0;;;;;:::i;:::-;;:::i;45857:481::-;;;;;;;;;;-1:-1:-1;45857:481:0;;;;;:::i;:::-;;:::i;66627:88::-;;;;;;;;;;-1:-1:-1;66627:88:0;;;;;:::i;:::-;;:::i;40338:29::-;;;;;;;;;;-1:-1:-1;40338:29:0;;;;-1:-1:-1;;;;;40338:29:0;;;65283:105;;;;;;;;;;-1:-1:-1;65283:105:0;;;;;:::i;:::-;;:::i;62916:116::-;;;;;;;;;;-1:-1:-1;62999:25:0;;-1:-1:-1;;;62999:25:0;;;;62916:116;;46719:346;;;;;;;;;;-1:-1:-1;46719:346:0;;;;;:::i;:::-;;:::i;63270:120::-;;;;;;;;;;-1:-1:-1;63270:120:0;;;;;:::i;:::-;;:::i;63978:167::-;;;;;;;;;;-1:-1:-1;63978:167:0;;;;;:::i;:::-;;:::i;62746:162::-;;;;;;;;;;-1:-1:-1;62746:162:0;;;;;:::i;:::-;;:::i;65630:115::-;;;;;;;;;;-1:-1:-1;65630:115:0;;;;;:::i;:::-;-1:-1:-1;;;;;65719:18:0;65695:4;65719:18;;;:9;:18;;;;;;;;;65630:115;64720:126;;;;;;;;;;-1:-1:-1;64720:126:0;;;;;:::i;:::-;;:::i;64330:132::-;;;;;;;;;;-1:-1:-1;64330:132:0;;;;;:::i;:::-;;:::i;40675:38::-;;;;;;;;;;;;;;;;43654:236;;;;;;;;;;-1:-1:-1;43654:236:0;;;;;:::i;:::-;;:::i;12479:103::-;;;;;;;;;;;;;:::i;40203:39::-;;;;;;;;;;-1:-1:-1;40203:39:0;;;;-1:-1:-1;;;;;40203:39:0;;;65513:109;;;;;;;;;;-1:-1:-1;65513:109:0;;;;;:::i;:::-;;:::i;40152:25::-;;;;;;;;;;;;;;;;39785:28;;;;;;;;;;;;;;;;63398:160;;;;;;;;;;-1:-1:-1;63398:160:0;;;;;:::i;:::-;-1:-1:-1;;;;;63524:26:0;63495:4;63524:26;;;:17;:26;;;;;;;;;63398:160;11828:87;;;;;;;;;;-1:-1:-1;11874:7:0;11901:6;-1:-1:-1;;;;;11901:6:0;11828:87;;64153:169;;;;;;;;;;-1:-1:-1;64153:169:0;;;;;:::i;:::-;;:::i;65163:112::-;;;;;;;;;;-1:-1:-1;65163:112:0;;;;;:::i;:::-;;:::i;64594:118::-;;;;;;;;;;-1:-1:-1;64594:118:0;;;;;:::i;:::-;;:::i;63154:108::-;;;;;;;;;;-1:-1:-1;63233:21:0;;-1:-1:-1;;;63233:21:0;;;;63154:108;;40102:22;;;;;;;;;;;;;;;;39981:27;;;;;;;;;;;;;;;;45270:402;;;;;;;;;;-1:-1:-1;45270:402:0;;;;;:::i;:::-;;:::i;43898:201::-;;;;;;;;;;-1:-1:-1;43898:201:0;;;;;:::i;:::-;;:::i;40722:42::-;;;;;;;;;;-1:-1:-1;40722:42:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;41408:1237;;;;;;;;;;-1:-1:-1;41408:1237:0;;;;;:::i;:::-;;:::i;40249:26::-;;;;;;;;;;-1:-1:-1;40249:26:0;;;;-1:-1:-1;;;;;40249:26:0;;;42684:273;;;;;;;;;;;;;:::i;39884:26::-;;;;;;;;;;;;;;;;65396:109;;;;;;;;;;-1:-1:-1;65396:109:0;;;;;:::i;:::-;;:::i;63040:106::-;;;;;;;;;;-1:-1:-1;63118:20:0;;-1:-1:-1;;;63118:20:0;;;;63040:106;;62523:215;;;;;;;;;;-1:-1:-1;62523:215:0;;;;;:::i;:::-;;:::i;64980:175::-;;;;;;;;;;-1:-1:-1;64980:175:0;;;;;:::i;:::-;;:::i;44107:186::-;;;;;;;;;;-1:-1:-1;44107:186:0;;;;;:::i;:::-;-1:-1:-1;;;;;44258:18:0;;;44226:7;44258:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;44107:186;50937:539;;;;;;;;;;;;;:::i;64854:118::-;;;;;;;;;;-1:-1:-1;64854:118:0;;;;;:::i;:::-;;:::i;63683:108::-;;;;;;;;;;-1:-1:-1;63683:108:0;;;;;:::i;:::-;;:::i;12737:201::-;;;;;;;;;;-1:-1:-1;12737:201:0;;;;;:::i;:::-;;:::i;44301:195::-;44405:4;44427:39;10562:10;44450:7;44459:6;44427:8;:39::i;:::-;-1:-1:-1;44484:4:0;44301:195;;;;;:::o;66100:519::-;11874:7;11901:6;-1:-1:-1;;;;;11901:6:0;10562:10;12048:23;12040:68;;;;-1:-1:-1;;;12040:68:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;66178:18:0;::::1;;::::0;;;:9:::1;:18;::::0;;;;;::::1;;66170:57;;;::::0;-1:-1:-1;;;66170:57:0;;5724:2:1;66170:57:0::1;::::0;::::1;5706:21:1::0;5763:2;5743:18;;;5736:30;5802:28;5782:18;;;5775:56;5848:18;;66170:57:0::1;5522:350:1::0;66170:57:0::1;66243:9;66238:374;66262:17;:24:::0;66258:28;::::1;66238:374;;;66336:7;-1:-1:-1::0;;;;;66312:31:0::1;:17;66330:1;66312:20;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;66312:20:0::1;:31:::0;66308:293:::1;;66387:17;66427:24:::0;;:28:::1;::::0;66454:1:::1;::::0;66427:28:::1;:::i;:::-;66387:87;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;66364:17:::1;:20:::0;;-1:-1:-1;;;;;66387:87:0;;::::1;::::0;66382:1;;66364:20;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;;::::1;:110:::0;;-1:-1:-1;;;;;;66364:110:0::1;-1:-1:-1::0;;;;;66364:110:0;;::::1;;::::0;;66493:18;;::::1;::::0;;:9:::1;:18:::0;;;;;;:26;;-1:-1:-1;;66493:26:0::1;::::0;;66538:17:::1;:23:::0;;;::::1;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;-1:-1:-1;;66538:23:0;;;;;-1:-1:-1;;;;;;66538:23:0::1;::::0;;;;;66238:374:::1;66100:519:::0;:::o;66308:293::-:1;66288:3:::0;::::1;::::0;::::1;:::i;:::-;;;;66238:374;;;;66100:519:::0;:::o;63799:171::-;11874:7;11901:6;-1:-1:-1;;;;;11901:6:0;10562:10;12048:23;12040:68;;;;-1:-1:-1;;;12040:68:0;;;;;;;:::i;:::-;63898:3:::1;63887:7;:14;;63879:49;;;;-1:-1:-1::0;;;63879:49:0::1;;;;;;;:::i;:::-;63939:13;:23:::0;63799:171::o;44504:448::-;44638:4;44655:36;44665:6;44673:9;44684:6;44655:9;:36::i;:::-;44702:220;44725:6;10562:10;44773:138;44829:6;44773:138;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;44773:19:0;;;;;;:11;:19;;;;;;;;10562:10;44773:33;;;;;;;;;;:37;:138::i;:::-;44702:8;:220::i;:::-;-1:-1:-1;44940:4:0;44504:448;;;;;;:::o;67203:260::-;11874:7;11901:6;-1:-1:-1;;;;;11901:6:0;10562:10;12048:23;12040:68;;;;-1:-1:-1;;;12040:68:0;;;;;;;:::i;:::-;67353:43:::1;67368:6;67376:10;67388:7;67353:14;:43::i;:::-;67203:260:::0;;;:::o;42965:157::-;11874:7;11901:6;-1:-1:-1;;;;;11901:6:0;10562:10;12048:23;12040:68;;;;-1:-1:-1;;;12040:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;43043:17:0;::::1;;::::0;;;:10:::1;:17;::::0;;;;;;;;:27;;-1:-1:-1;;43043:27:0::1;::::0;::::1;;::::0;;::::1;::::0;;;43088:26;;7065:51:1;;;7132:18;;;7125:50;43088:26:0::1;::::0;7038:18:1;43088:26:0::1;;;;;;;;42965:157:::0;;:::o;46389:322::-;46483:7;46541;;46530;:18;;46508:110;;;;-1:-1:-1;;;46508:110:0;;7388:2:1;46508:110:0;;;7370:21:1;7427:2;7407:18;;;7400:30;7466:34;7446:18;;;7439:62;-1:-1:-1;;;7517:18:1;;;7510:40;7567:19;;46508:110:0;7186:406:1;46508:110:0;46629:19;46651:10;:8;:10::i;:::-;46629:32;-1:-1:-1;46679:24:0;:7;46629:32;46679:11;:24::i;65753:339::-;11874:7;11901:6;-1:-1:-1;;;;;11901:6:0;10562:10;12048:23;12040:68;;;;-1:-1:-1;;;12040:68:0;;;;;;;:::i;:::-;65863:13:::1;::::0;-1:-1:-1;;;;;65863:13:0;;::::1;65844:33:::0;;::::1;::::0;65822:111:::1;;;::::0;-1:-1:-1;;;65822:111:0;;7799:2:1;65822:111:0::1;::::0;::::1;7781:21:1::0;7838:2;7818:18;;;7811:30;7877;7857:18;;;7850:58;7925:18;;65822:111:0::1;7597:352:1::0;65822:111:0::1;-1:-1:-1::0;;;;;65953:18:0;::::1;;::::0;;;:9:::1;:18;::::0;;;;;::::1;;65952:19;65944:62;;;::::0;-1:-1:-1;;;65944:62:0;;8156:2:1;65944:62:0::1;::::0;::::1;8138:21:1::0;8195:2;8175:18;;;8168:30;8234:32;8214:18;;;8207:60;8284:18;;65944:62:0::1;7954:354:1::0;65944:62:0::1;-1:-1:-1::0;;;;;66017:18:0::1;;::::0;;;:9:::1;:18;::::0;;;;:25;;-1:-1:-1;;66017:25:0::1;66038:4;66017:25:::0;;::::1;::::0;;;66053:17:::1;:31:::0;;;;::::1;::::0;;;;;;::::1;::::0;;-1:-1:-1;;;;;;66053:31:0::1;::::0;;::::1;::::0;;65753:339::o;67659:167::-;11874:7;11901:6;-1:-1:-1;;;;;11901:6:0;10562:10;12048:23;12040:68;;;;-1:-1:-1;;;12040:68:0;;;;;;;:::i;:::-;67788:30:::1;67798:10;67810:7;67788:9;:30::i;64470:116::-:0;11874:7;11901:6;-1:-1:-1;;;;;11901:6:0;10562:10;12048:23;12040:68;;;;-1:-1:-1;;;12040:68:0;;;;;;;:::i;:::-;64547:20:::1;:31:::0;;;::::1;;-1:-1:-1::0;;;64547:31:0::1;-1:-1:-1::0;;;;64547:31:0;;::::1;::::0;;;::::1;::::0;;64470:116::o;47073:489::-;11874:7;11901:6;-1:-1:-1;;;;;11901:6:0;10562:10;12048:23;12040:68;;;;-1:-1:-1;;;12040:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;47153:26:0;::::1;;::::0;;;:17:::1;:26;::::0;;;;;::::1;;47145:66;;;::::0;-1:-1:-1;;;47145:66:0;;8515:2:1;47145:66:0::1;::::0;::::1;8497:21:1::0;8554:2;8534:18;;;8527:30;8593:29;8573:18;;;8566:57;8640:18;;47145:66:0::1;8313:351:1::0;47145:66:0::1;47227:9;47222:333;47246:9;:16:::0;47242:20;::::1;47222:333;;;47304:7;-1:-1:-1::0;;;;;47288:23:0::1;:9;47298:1;47288:12;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;47288:12:0::1;:23:::0;47284:260:::1;;47347:9;47357:16:::0;;:20:::1;::::0;47376:1:::1;::::0;47357:20:::1;:::i;:::-;47347:31;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;47332:9:::1;:12:::0;;-1:-1:-1;;;;;47347:31:0;;::::1;::::0;47342:1;;47332:12;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;;::::1;:46:::0;;-1:-1:-1;;;;;;47332:46:0::1;-1:-1:-1::0;;;;;47332:46:0;;::::1;;::::0;;47397:16;;::::1;::::0;;:7:::1;:16:::0;;;;;;:20;;;47436:17:::1;:26:::0;;;;:34;;-1:-1:-1;;47436:34:0::1;::::0;;47489:9:::1;:15:::0;;;::::1;;;;:::i;47284:260::-;47264:3:::0;::::1;::::0;::::1;:::i;:::-;;;;47222:333;;44960:302:::0;10562:10;45077:4;45171:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;45171:34:0;;;;;;;;;;45077:4;;45099:133;;45149:7;;45171:50;;45210:10;45171:38;:50::i;66852:306::-;11874:7;11901:6;-1:-1:-1;;;;;11901:6:0;10562:10;12048:23;12040:68;;;;-1:-1:-1;;;12040:68:0;;;;;;;:::i;:::-;66998:39:::1;::::0;-1:-1:-1;;;66998:39:0;;67031:4:::1;66998:39;::::0;::::1;1898:51:1::0;66981:14:0::1;::::0;-1:-1:-1;;;;;66998:24:0;::::1;::::0;::::1;::::0;1871:18:1;;66998:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;66981:56;;67050:42;67065:6;67073:10;67085:6;67050:14;:42::i;67505:112::-:0;11874:7;11901:6;-1:-1:-1;;;;;11901:6:0;10562:10;12048:23;12040:68;;;;-1:-1:-1;;;12040:68:0;;;;;;;:::i;:::-;67563:46:::1;10562:10:::0;67587:21:::1;67563:9;:46::i;:::-;67505:112::o:0;63566:109::-;11874:7;11901:6;-1:-1:-1;;;;;11901:6:0;10562:10;12048:23;12040:68;;;;-1:-1:-1;;;12040:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;63637:23:0::1;;::::0;;;:14:::1;:23;::::0;;;;:30;;-1:-1:-1;;63637:30:0::1;63663:4;63637:30;::::0;;63566:109::o;45857:481::-;45977:7;39584:19;46010:7;:18;;46002:62;;;;-1:-1:-1;;;46002:62:0;;9060:2:1;46002:62:0;;;9042:21:1;9099:2;9079:18;;;9072:30;9138:33;9118:18;;;9111:61;9189:18;;46002:62:0;8858:355:1;46002:62:0;46080:17;46075:256;;46115:15;46144:19;46155:7;46144:10;:19::i;:::-;-1:-1:-1;46114:49:0;;-1:-1:-1;46178:14:0;;-1:-1:-1;;;;;46178:14:0;46075:256;46228:23;46263:19;46274:7;46263:10;:19::i;:::-;-1:-1:-1;46225:57:0;;-1:-1:-1;46297:22:0;;-1:-1:-1;;;;;46297:22:0;66627:88;11874:7;11901:6;-1:-1:-1;;;;;11901:6:0;10562:10;12048:23;12040:68;;;;-1:-1:-1;;;12040:68:0;;;;;;;:::i;:::-;66692:7:::1;:15:::0;66627:88::o;65283:105::-;11874:7;11901:6;-1:-1:-1;;;;;11901:6:0;10562:10;12048:23;12040:68;;;;-1:-1:-1;;;12040:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;65352:21:0::1;;::::0;;;:14:::1;:21;::::0;;;;:28;;-1:-1:-1;;65352:28:0::1;65376:4;65352:28;::::0;;65283:105::o;46719:346::-;11874:7;11901:6;-1:-1:-1;;;;;11901:6:0;10562:10;12048:23;12040:68;;;;-1:-1:-1;;;12040:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;46802:26:0;::::1;;::::0;;;:17:::1;:26;::::0;;;;;::::1;;46801:27;46793:67;;;::::0;-1:-1:-1;;;46793:67:0;;9420:2:1;46793:67:0::1;::::0;::::1;9402:21:1::0;9459:2;9439:18;;;9432:30;9498:29;9478:18;;;9471:57;9545:18;;46793:67:0::1;9218:351:1::0;46793:67:0::1;-1:-1:-1::0;;;;;46875:16:0;::::1;46894:1;46875:16:::0;;;:7:::1;:16;::::0;;;;;:20;46871:109:::1;;-1:-1:-1::0;;;;;46951:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;46931:37:::1;::::0;:19:::1;:37::i;:::-;-1:-1:-1::0;;;;;46912:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;:56;46871:109:::1;-1:-1:-1::0;;;;;46990:26:0::1;;::::0;;;:17:::1;:26;::::0;;;;:33;;-1:-1:-1;;46990:33:0::1;47019:4;46990:33:::0;;::::1;::::0;;;47034:9:::1;:23:::0;;;;::::1;::::0;;;;;;::::1;::::0;;-1:-1:-1;;;;;;47034:23:0::1;::::0;;::::1;::::0;;46719:346::o;63270:120::-;-1:-1:-1;;;;;63359:23:0;63335:4;63359:23;;;:14;:23;;;;;;;;;63270:120::o;63978:167::-;11874:7;11901:6;-1:-1:-1;;;;;11901:6:0;10562:10;12048:23;12040:68;;;;-1:-1:-1;;;12040:68:0;;;;;;;:::i;:::-;64075:3:::1;64064:7;:14;;64056:49;;;;-1:-1:-1::0;;;64056:49:0::1;;;;;;;:::i;:::-;64116:11;:21:::0;63978:167::o;62746:162::-;62837:11;;62807:4;;-1:-1:-1;;;;;62837:11:0;;;62828:20;;;;62824:37;;-1:-1:-1;62857:4:0;;62746:162;-1:-1:-1;62746:162:0:o;62824:37::-;-1:-1:-1;;;;;;62879:21:0;;;;;:14;:21;;;;;;;;;62746:162::o;64720:126::-;11874:7;11901:6;-1:-1:-1;;;;;11901:6:0;10562:10;12048:23;12040:68;;;;-1:-1:-1;;;12040:68:0;;;;;;;:::i;:::-;64802:25:::1;:36:::0;;;::::1;;-1:-1:-1::0;;;64802:36:0::1;-1:-1:-1::0;;;;64802:36:0;;::::1;::::0;;;::::1;::::0;;64720:126::o;64330:132::-;11874:7;11901:6;-1:-1:-1;;;;;11901:6:0;10562:10;12048:23;12040:68;;;;-1:-1:-1;;;12040:68:0;;;;;;;:::i;:::-;64413:14:::1;:41:::0;;-1:-1:-1;;;;;;64413:41:0::1;-1:-1:-1::0;;;;;64413:41:0;;;::::1;::::0;;;::::1;::::0;;64330:132::o;43654:236::-;-1:-1:-1;;;;;43744:26:0;;43720:7;43744:26;;;:17;:26;;;;;;;;43740:55;;;-1:-1:-1;;;;;;43779:16:0;;;;;:7;:16;;;;;;;43654:236::o;43740:55::-;-1:-1:-1;;;;;43833:16:0;;;;;;:7;:16;;;;;;43813:37;;:19;:37::i;12479:103::-;11874:7;11901:6;-1:-1:-1;;;;;11901:6:0;10562:10;12048:23;12040:68;;;;-1:-1:-1;;;12040:68:0;;;;;;;:::i;:::-;12544:30:::1;12571:1;12544:18;:30::i;65513:109::-:0;11874:7;11901:6;-1:-1:-1;;;;;11901:6:0;10562:10;12048:23;12040:68;;;;-1:-1:-1;;;12040:68:0;;;;;;;:::i;:::-;65586:13:::1;:28:::0;;;::::1;;-1:-1:-1::0;;;65586:28:0::1;-1:-1:-1::0;;;;65586:28:0;;::::1;::::0;;;::::1;::::0;;65513:109::o;64153:169::-;11874:7;11901:6;-1:-1:-1;;;;;11901:6:0;10562:10;12048:23;12040:68;;;;-1:-1:-1;;;12040:68:0;;;;;;;:::i;:::-;64251:3:::1;64240:7;:14;;64232:49;;;;-1:-1:-1::0;;;64232:49:0::1;;;;;;;:::i;:::-;64292:12;:22:::0;64153:169::o;65163:112::-;11874:7;11901:6;-1:-1:-1;;;;;11901:6:0;10562:10;12048:23;12040:68;;;;-1:-1:-1;;;12040:68:0;;;;;;;:::i;:::-;65240:15:::1;:27:::0;;-1:-1:-1;;;;;;65240:27:0::1;-1:-1:-1::0;;;;;65240:27:0;;;::::1;::::0;;;::::1;::::0;;65163:112::o;64594:118::-;11874:7;11901:6;-1:-1:-1;;;;;11901:6:0;10562:10;12048:23;12040:68;;;;-1:-1:-1;;;12040:68:0;;;;;;;:::i;:::-;64672:21:::1;:32:::0;;;::::1;;-1:-1:-1::0;;;64672:32:0::1;-1:-1:-1::0;;;;64672:32:0;;::::1;::::0;;;::::1;::::0;;64594:118::o;45270:402::-;45392:4;45414:228;10562:10;45464:7;45486:145;45543:15;45486:145;;;;;;;;;;;;;;;;;10562:10;45486:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;45486:34:0;;;;;;;;;;;;:38;:145::i;43898:201::-;44005:4;44027:42;10562:10;44051:9;44062:6;44027:9;:42::i;41408:1237::-;11874:7;11901:6;-1:-1:-1;;;;;11901:6:0;10562:10;12048:23;12040:68;;;;-1:-1:-1;;;12040:68:0;;;;;;;:::i;:::-;41667:16:::1;41650:14;;:33;;;;;-1:-1:-1::0;;;;;41650:33:0::1;;;;;-1:-1:-1::0;;;;;41650:33:0::1;;;;;;41696;41765:14;41696:94;;41833:14;-1:-1:-1::0;;;;;41833:22:0::1;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;41815:68:0::1;;41892:4;41899:14;-1:-1:-1::0;;;;;41899:19:0::1;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41815:106;::::0;-1:-1:-1;;;;;;41815:106:0::1;::::0;;;;;;-1:-1:-1;;;;;10060:15:1;;;41815:106:0::1;::::0;::::1;10042:34:1::0;10112:15;;10092:18;;;10085:43;9977:18;;41815:106:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41801:11;:120:::0;;-1:-1:-1;;;;;;41801:120:0;;::::1;-1:-1:-1::0;;;;;41801:120:0;;::::1;;::::0;;;41934:13:::1;:30:::0;;;;::::1;::::0;;::::1;;::::0;;-1:-1:-1;11901:6:0;;;;;42012:23;;:14:::1;:23;::::0;;;;;:30;;-1:-1:-1;;42012:30:0;;::::1;-1:-1:-1::0;42012:30:0;;::::1;::::0;;;42121:4:::1;42098:29:::0;;;;;;:36;;;;::::1;::::0;;::::1;::::0;;42187:3:::1;42169:21:::0;::::1;::::0;::::1;::::0;:57:::1;;;42223:3;42207:12;:19;;42169:57;:94;;;;;42260:3;42243:13;:20;;42169:94;:126;;;;;42292:3;42280:8;:15;;42169:126;42147:198;;;;-1:-1:-1::0;;;42147:198:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;42358:13:0::1;:30:::0;;;42399:19:::1;:35:::0;;;;42447:11:::1;:26:::0;;;42484:20:::1;:34:::0;;;;42531:12:::1;:28:::0;;;42570:21:::1;:36:::0;42619:7:::1;:18:::0;-1:-1:-1;;41408:1237:0:o;42684:273::-;11874:7;11901:6;-1:-1:-1;;;;;11901:6:0;10562:10;12048:23;12040:68;;;;-1:-1:-1;;;12040:68:0;;;;;;;:::i;:::-;42737:12:::1;:19:::0;;42811:15:::1;42798:10;:28:::0;-1:-1:-1;;;;42921:28:0;-1:-1:-1;;;42921:28:0;;;42684:273::o;65396:109::-;11874:7;11901:6;-1:-1:-1;;;;;11901:6:0;10562:10;12048:23;12040:68;;;;-1:-1:-1;;;12040:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;65468:21:0::1;65492:5;65468:21:::0;;;:14:::1;:21;::::0;;;;:29;;-1:-1:-1;;65468:29:0::1;::::0;;65396:109::o;62523:215::-;62587:7;62607:14;62624:48;62659:12;;62624:30;62640:13;;62624:11;;:15;;:30;;;;:::i;:::-;:34;;:48::i;:::-;62607:65;;62692:25;62710:6;62692:17;:25::i;:::-;:38;;62724:6;62692:38;;;62720:1;62685:45;62523:215;-1:-1:-1;;;62523:215:0:o;64980:175::-;11874:7;11901:6;-1:-1:-1;;;;;11901:6:0;10562:10;12048:23;12040:68;;;;-1:-1:-1;;;12040:68:0;;;;;;;:::i;:::-;65090:13:::1;:57:::0;;-1:-1:-1;;;;;;65090:57:0::1;-1:-1:-1::0;;;;;65090:57:0;;;::::1;::::0;;;::::1;::::0;;64980:175::o;50937:539::-;10562:10;40831:24;;;;:10;:24;;;;;;;;;:51;;-1:-1:-1;11874:7:0;11901:6;-1:-1:-1;;;;;11901:6:0;10562:10;40859:23;40831:51;40808:134;;;;-1:-1:-1;;;40808:134:0;;10341:2:1;40808:134:0;;;10323:21:1;10380:2;10360:18;;;10353:30;10419:33;10399:18;;;10392:61;10470:18;;40808:134:0;10139:355:1;40808:134:0;50992:29:::1;51024:24;51042:4;51024:9;:24::i;:::-;50992:56:::0;-1:-1:-1;51065:25:0;;51061:408:::1;;51107:21;51131:146;38703:7;51131:113;51240:3;51131:86;38703:7;51131:53;51176:7;;51131:22;51141:11;;;;;;;;;-1:-1:-1::0;;;;;51141:11:0::1;51131:9;:22::i;:::-;:44:::0;::::1;:53::i;:86::-;:108:::0;::::1;:113::i;:146::-;51107:170;;51322:13;51298:21;:37;51294:115;;;51380:13;51356:37;;51294:115;51423:34;51435:21;51423:11;:34::i;51061:408::-;50981:495;50937:539::o:0;64854:118::-;11874:7;11901:6;-1:-1:-1;;;;;11901:6:0;10562:10;12048:23;12040:68;;;;-1:-1:-1;;;12040:68:0;;;;;;;:::i;:::-;64934:13:::1;:30:::0;64854:118::o;63683:108::-;11874:7;11901:6;-1:-1:-1;;;;;11901:6:0;10562:10;12048:23;12040:68;;;;-1:-1:-1;;;12040:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;63752:23:0::1;63778:5;63752:23:::0;;;:14:::1;:23;::::0;;;;:31;;-1:-1:-1;;63752:31:0::1;::::0;;63683:108::o;12737:201::-;11874:7;11901:6;-1:-1:-1;;;;;11901:6:0;10562:10;12048:23;12040:68;;;;-1:-1:-1;;;12040:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;12826:22:0;::::1;12818:73;;;::::0;-1:-1:-1;;;12818:73:0;;10701:2:1;12818:73:0::1;::::0;::::1;10683:21:1::0;10740:2;10720:18;;;10713:30;10779:34;10759:18;;;10752:62;-1:-1:-1;;;10830:18:1;;;10823:36;10876:19;;12818:73:0::1;10499:402:1::0;12818:73:0::1;12902:28;12921:8;12902:18;:28::i;47570:371::-:0;-1:-1:-1;;;;;47697:19:0;;47689:68;;;;-1:-1:-1;;;47689:68:0;;11108:2:1;47689:68:0;;;11090:21:1;11147:2;11127:18;;;11120:30;11186:34;11166:18;;;11159:62;-1:-1:-1;;;11237:18:1;;;11230:34;11281:19;;47689:68:0;10906:400:1;47689:68:0;-1:-1:-1;;;;;47776:21:0;;47768:68;;;;-1:-1:-1;;;47768:68:0;;11513:2:1;47768:68:0;;;11495:21:1;11552:2;11532:18;;;11525:30;11591:34;11571:18;;;11564:62;-1:-1:-1;;;11642:18:1;;;11635:32;11684:19;;47768:68:0;11311:398:1;47768:68:0;-1:-1:-1;;;;;47849:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;47901:32;;1716:25:1;;;47901:32:0;;1689:18:1;47901:32:0;;;;;;;47570:371;;;:::o;47949:2980::-;-1:-1:-1;;;;;48071:18:0;;48063:68;;;;-1:-1:-1;;;48063:68:0;;11916:2:1;48063:68:0;;;11898:21:1;11955:2;11935:18;;;11928:30;11994:34;11974:18;;;11967:62;-1:-1:-1;;;12045:18:1;;;12038:35;12090:19;;48063:68:0;11714:401:1;48063:68:0;-1:-1:-1;;;;;48150:16:0;;48142:64;;;;-1:-1:-1;;;48142:64:0;;12322:2:1;48142:64:0;;;12304:21:1;12361:2;12341:18;;;12334:30;12400:34;12380:18;;;12373:62;-1:-1:-1;;;12451:18:1;;;12444:33;12494:19;;48142:64:0;12120:399:1;48142:64:0;48234:1;48225:6;:10;48217:64;;;;-1:-1:-1;;;48217:64:0;;12726:2:1;48217:64:0;;;12708:21:1;12765:2;12745:18;;;12738:30;12804:34;12784:18;;;12777:62;-1:-1:-1;;;12855:18:1;;;12848:39;12904:19;;48217:64:0;12524:405:1;48217:64:0;-1:-1:-1;;;;;48301:13:0;;;;;;:9;:13;;;;;;;;48300:14;48292:40;;;;-1:-1:-1;;;48292:40:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;48352:15:0;;;;;;:9;:15;;;;;;;;48351:16;48343:42;;;;-1:-1:-1;;;48343:42:0;;;;;;;:::i;:::-;10562:10;48405:23;;;;:9;:23;;;;;;;;48404:24;48396:50;;;;-1:-1:-1;;;48396:50:0;;;;;;;:::i;:::-;48479:13;;-1:-1:-1;;;48479:13:0;;;;;:32;;-1:-1:-1;11874:7:0;11901:6;-1:-1:-1;;;;;48496:15:0;;;11901:6;;48496:15;48479:32;48457:126;;;;-1:-1:-1;;;48457:126:0;;13478:2:1;48457:126:0;;;13460:21:1;13517:2;13497:18;;;13490:30;13556:34;13536:18;;;13529:62;-1:-1:-1;;;13607:18:1;;;13600:42;13659:19;;48457:126:0;13276:408:1;48457:126:0;48722:11;;48611:4;;48596:12;;;;-1:-1:-1;;;;;48714:19:0;;;48722:11;;48714:19;;:43;;-1:-1:-1;;;;;;48737:20:0;;;;;;:14;:20;;;;;;;;48714:43;48713:90;;;;-1:-1:-1;48789:13:0;;-1:-1:-1;;;;;48775:28:0;;;48789:13;;48775:28;;48713:90;:119;;;;-1:-1:-1;48820:12:0;;-1:-1:-1;;;48820:12:0;;;;48713:119;48695:653;;;48870:4;48859:15;;48942:21;48960:2;48942:17;:21::i;:::-;48937:307;;48992:12;;-1:-1:-1;;;48992:12:0;;;;48984:49;;;;-1:-1:-1;;;48984:49:0;;13891:2:1;48984:49:0;;;13873:21:1;13930:2;13910:18;;;13903:30;13969:26;13949:18;;;13942:54;14013:18;;48984:49:0;13689:348:1;48984:49:0;49105:10;;49086:15;:29;49082:147;;-1:-1:-1;;;;;49140:13:0;;;;;;:9;:13;;;;;:20;;-1:-1:-1;;49140:20:0;49156:4;49140:20;;;;;;49183:17;:26;;;;;;;;;;;;;;-1:-1:-1;;;;;;49183:26:0;;;;;;49082:147;49265:20;;-1:-1:-1;;;49265:20:0;;;;49260:77;;49316:5;49306:15;;49260:77;49407:12;;-1:-1:-1;;;49407:12:0;;;;:48;;;;-1:-1:-1;49444:11:0;;-1:-1:-1;;;;;49436:19:0;;;49444:11;;49436:19;;49407:48;:86;;;;-1:-1:-1;;;;;;49473:20:0;;;;;;:14;:20;;;;;;;;49472:21;49407:86;:133;;;;-1:-1:-1;49526:13:0;;-1:-1:-1;;;;;49510:30:0;;;49526:13;;49510:30;;49407:133;49389:1256;;;49635:11;;-1:-1:-1;;;;;49629:17:0;;;49635:11;;49629:17;;:56;;-1:-1:-1;;;;;;49667:18:0;;;;;;:14;:18;;;;;;;;49629:56;:105;;;-1:-1:-1;49720:13:0;;-1:-1:-1;;;;;49706:28:0;;;49720:13;;49706:28;49629:105;49607:1027;;;-1:-1:-1;49811:21:0;;49781:4;;-1:-1:-1;;;49811:21:0;;;;49806:86;;49867:5;49857:15;;49806:86;49913:16;49931;49990:11;;;;;;;;;-1:-1:-1;;;;;49990:11:0;-1:-1:-1;;;;;49953:79:0;;:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49912:122;-1:-1:-1;;;;;49912:122:0;;;-1:-1:-1;;;;;49912:122:0;;;50148:4;-1:-1:-1;;;;;50078:75:0;50093:11;;;;;;;;;-1:-1:-1;;;;;50093:11:0;-1:-1:-1;;;;;50078:56:0;;:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;50078:75:0;;:163;;50222:8;50232;50078:163;;;50178:8;50188;50078:163;50295:13;;:136;;-1:-1:-1;;;50295:136:0;;;;;14892:25:1;;;14933:18;;;14926:34;;;14976:18;;;14969:34;;;50055:186:0;;-1:-1:-1;50055:186:0;;-1:-1:-1;50262:30:0;;-1:-1:-1;;;;;50295:13:0;;;;:26;;14865:18:1;;50295:136:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50262:169;;50508:13;;50482:22;:39;;50452:166;;;;-1:-1:-1;;;50452:166:0;;15216:2:1;50452:166:0;;;15198:21:1;15255:2;15235:18;;;15228:30;15294:34;15274:18;;;15267:62;-1:-1:-1;;;15345:18:1;;;15338:51;15406:19;;50452:166:0;15014:417:1;50452:166:0;49750:884;;;49607:1027;50662:9;50661:10;:23;;;;;50676:8;50675:9;50661:23;:53;;;;-1:-1:-1;50689:25:0;;-1:-1:-1;;;50689:25:0;;;;50688:26;50661:53;50657:101;;;50741:5;50731:15;;50657:101;50775:23;50793:4;50775:17;:23::i;:::-;:48;;;;50802:21;50820:2;50802:17;:21::i;:::-;50770:98;;;50851:5;50841:15;;50770:98;50880:41;50895:4;50901:2;50905:6;50913:7;50880:14;:41::i;:::-;48052:2877;;;47949:2980;;;:::o;7903:240::-;8023:7;8084:12;8076:6;;;;8068:29;;;;-1:-1:-1;;;8068:29:0;;;;;;;;:::i;:::-;-1:-1:-1;;;8119:5:0;;;7903:240::o;37205:539::-;-1:-1:-1;;;;;37352:26:0;;37344:64;;;;-1:-1:-1;;;37344:64:0;;15638:2:1;37344:64:0;;;15620:21:1;15677:2;15657:18;;;15650:30;-1:-1:-1;;;15696:18:1;;;15689:55;15761:18;;37344:64:0;15436:349:1;37344:64:0;37452:39;;-1:-1:-1;;;37452:39:0;;37485:4;37452:39;;;1898:51:1;-1:-1:-1;;;;;37452:24:0;;;;;1871:18:1;;37452:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37441:7;:50;;37419:135;;;;-1:-1:-1;;;37419:135:0;;15992:2:1;37419:135:0;;;15974:21:1;16031:2;16011:18;;;16004:30;16070:34;16050:18;;;16043:62;-1:-1:-1;;;16121:18:1;;;16114:33;16164:19;;37419:135:0;15790:399:1;37419:135:0;37567:48;-1:-1:-1;;;;;37567:27:0;;37595:10;37607:7;37567:27;:48::i;:::-;37694:42;;;-1:-1:-1;;;;;16452:15:1;;;16434:34;;16504:15;;16499:2;16484:18;;16477:43;16536:18;;;16529:34;;;37694:42:0;;16384:2:1;16369:18;37694:42:0;;;;;;;;37205:539;;;:::o;60210:164::-;60252:7;60273:15;60290;60309:19;:17;:19::i;:::-;60272:56;;-1:-1:-1;60272:56:0;-1:-1:-1;60346:20:0;60272:56;;60346:11;:20::i;:::-;60339:27;;;;60210:164;:::o;6761:98::-;6819:7;6846:5;6850:1;6846;:5;:::i;36636:450::-;-1:-1:-1;;;;;36728:26:0;;36720:64;;;;-1:-1:-1;;;36720:64:0;;15638:2:1;36720:64:0;;;15620:21:1;15677:2;15657:18;;;15650:30;-1:-1:-1;;;15696:18:1;;;15689:55;15761:18;;36720:64:0;15436:349:1;36720:64:0;36828:21;36817:7;:32;;36795:115;;;;-1:-1:-1;;;36795:115:0;;16998:2:1;36795:115:0;;;16980:21:1;17037:2;17017:18;;;17010:30;17076:34;17056:18;;;17049:62;-1:-1:-1;;;17127:18:1;;;17120:31;17168:19;;36795:115:0;16796:397:1;36795:115:0;36971:62;36985:10;36997:7;36971:62;;;;;;;;;;;;;;;;;:13;:62::i;:::-;37049:29;;;-1:-1:-1;;;;;17390:32:1;;17372:51;;17454:2;17439:18;;17432:34;;;37049:29:0;;17345:18:1;37049:29:0;17198:274:1;5624:98:0;5682:7;5709:5;5713:1;5709;:5;:::i;58472:742::-;58572:7;58594;58616;58638;58660;58682;58732:23;58770:12;58797:18;58829:20;58841:7;58829:11;:20::i;:::-;58717:132;;;;;;58861:15;58878:23;58903:12;58919:113;58945:7;58967:4;58986:10;59011;:8;:10::i;:::-;58919:11;:113::i;:::-;58860:172;;;;-1:-1:-1;58860:172:0;;-1:-1:-1;59136:15:0;;-1:-1:-1;59166:4:0;;-1:-1:-1;59185:10:0;;-1:-1:-1;58472:742:0;;-1:-1:-1;;;;;58472:742:0:o;13098:191::-;13172:16;13191:6;;-1:-1:-1;;;;;13208:17:0;;;-1:-1:-1;;;;;;13208:17:0;;;;;;13241:40;;13191:6;;;;;;;13241:40;;13172:16;13241:40;13161:128;13098:191;:::o;6362:98::-;6420:7;6447:5;6451:1;6447;:5;:::i;51484:1040::-;51582:21;51555:24;51645;:22;:24::i;:::-;51616:53;;51716:27;51746:91;51818:18;51746:53;51786:12;;51746:21;:39;;:53;;;;:::i;:91::-;51716:121;-1:-1:-1;51874:43:0;51716:121;51874:21;:43;:::i;:::-;51850:67;;51930:40;51948:21;51930:17;:40::i;:::-;52009:21;51983:23;52068:37;52009:21;52088:16;52068:19;:37::i;:::-;52041:64;-1:-1:-1;52041:64:0;52221:22;;52217:197;;52292:14;;52260:142;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;52292:14:0;;52325:18;;52260:13;:142::i;:::-;52430:23;;52426:91;;52470:35;52485:19;52470:14;:35::i;:::-;51544:980;;;;;;51484:1040;:::o;54731:772::-;54887:7;54882:56;;54911:15;:13;:15::i;:::-;-1:-1:-1;;;;;54954:25:0;;;;;;:17;:25;;;;;;;;:58;;;;-1:-1:-1;;;;;;54984:28:0;;;;;;:17;:28;;;;;;;;54983:29;54954:58;54950:503;;;55029:48;55051:6;55059:9;55070:6;55029:21;:48::i;:::-;54950:503;;;-1:-1:-1;;;;;55100:25:0;;;;;;:17;:25;;;;;;;;55099:26;:58;;;;-1:-1:-1;;;;;;55129:28:0;;;;;;:17;:28;;;;;;;;55099:58;55095:358;;;55174:46;55194:6;55202:9;55213:6;55174:19;:46::i;55095:358::-;-1:-1:-1;;;;;55242:25:0;;;;;;:17;:25;;;;;;;;:57;;;;-1:-1:-1;;;;;;55271:28:0;;;;;;:17;:28;;;;;;;;55242:57;55238:215;;;55316:48;55338:6;55346:9;55357:6;55316:21;:48::i;55238:215::-;55397:44;55415:6;55423:9;55434:6;55397:17;:44::i;:::-;55470:7;55465:30;;55479:16;62396:19;;62380:13;:35;62440:20;;62426:11;:34;62486:21;;62471:12;:36;62335:180;55479:16;54731:772;;;;:::o;32437:211::-;32581:58;;;-1:-1:-1;;;;;17390:32:1;;32581:58:0;;;17372:51:1;17439:18;;;;17432:34;;;32581:58:0;;;;;;;;;;17345:18:1;;;;32581:58:0;;;;;;;;-1:-1:-1;;;;;32581:58:0;-1:-1:-1;;;32581:58:0;;;32554:86;;32574:5;;32554:19;:86::i;60382:605::-;60480:7;;60433;;;;39584:19;60433:7;60534:338;60558:9;:16;60554:20;;60534:338;;;60642:7;60618;:21;60626:9;60636:1;60626:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;60626:12:0;60618:21;;;;;;;;;;;;;:31;;:83;;;60694:7;60670;:21;60678:9;60688:1;60678:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;60678:12:0;60670:21;;;;;;;;;;;;;:31;60618:83;60596:146;;;-1:-1:-1;;60725:7:0;;;39584:19;;-1:-1:-1;60382:605:0;-1:-1:-1;;60382:605:0:o;60596:146::-;60767:34;60779:7;:21;60787:9;60797:1;60787:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;60787:12:0;60779:21;;;;;;;;;;;;;60767:7;;:11;:34::i;:::-;60757:44;;60826:34;60838:7;:21;60846:9;60856:1;60846:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;60846:12:0;60838:21;;;;;;;;;;;;;60826:7;;:11;:34::i;:::-;60816:44;-1:-1:-1;60576:3:0;;;;:::i;:::-;;;;60534:338;;;-1:-1:-1;60896:7:0;;:20;;39584:19;60896:11;:20::i;:::-;60886:7;:30;60882:61;;;-1:-1:-1;;60926:7:0;;;39584:19;;-1:-1:-1;60382:605:0;-1:-1:-1;60382:605:0:o;60882:61::-;60962:7;;60971;;-1:-1:-1;60382:605:0;-1:-1:-1;60382:605:0:o;36195:240::-;36333:9;36356:10;-1:-1:-1;;;;;36348:24:0;36380:6;36348:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36332:59;;;36412:4;36418:8;36404:23;;;;;-1:-1:-1;;;36404:23:0;;;;;;;;:::i;:::-;;36321:114;36195:240;;;:::o;59222:418::-;59323:7;59345;59367;59402:12;59417:29;59438:7;59417:20;:29::i;:::-;59402:44;;59457:18;59478:31;59501:7;59478:22;:31::i;:::-;59457:52;-1:-1:-1;59520:23:0;59546:33;59457:52;59546:17;:7;59558:4;59546:11;:17::i;:::-;:21;;:33::i;:::-;59520:59;59615:4;;-1:-1:-1;59621:10:0;;-1:-1:-1;59222:418:0;;-1:-1:-1;;;59222:418:0:o;59648:554::-;59847:7;;;;59944:24;:7;59956:11;59944;:24::i;:::-;59926:42;-1:-1:-1;59979:12:0;59994:21;:4;60003:11;59994:8;:21::i;:::-;59979:36;-1:-1:-1;60026:18:0;60047:27;:10;60062:11;60047:14;:27::i;:::-;60026:48;-1:-1:-1;60085:23:0;60111:33;60026:48;60111:17;:7;60123:4;60111:11;:17::i;:33::-;60163:7;;;;-1:-1:-1;60189:4:0;;-1:-1:-1;59648:554:0;;-1:-1:-1;;;;;;;59648:554:0:o;61586:120::-;61642:7;61669:29;61685:12;;61669:11;;:15;;:29;;;;:::i;:::-;61662:36;;61586:120;:::o;53881:842::-;54032:16;;;54046:1;54032:16;;;;;;;;54008:21;;54032:16;;;;;;;;;;-1:-1:-1;54032:16:0;54008:40;;54077:4;54059;54064:1;54059:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;54059:23:0;;;:7;;;;;;;;;;:23;;;;54103:13;;:20;;;-1:-1:-1;;;54103:20:0;;;;:13;;;;;:18;;:20;;;;;54059:7;;54103:20;;;;;:13;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54093:4;54098:1;54093:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;54093:30:0;;;:7;;;;;;;;;:30;54168:13;;54136:60;;54153:4;;54168:13;54184:11;54136:8;:60::i;:::-;54244:13;;54279:335;;54210:12;;-1:-1:-1;;;;;54244:13:0;;54279:335;;54435:11;;54210:12;;54513:4;;54544;;54584:15;;54279:335;;;:::i;:::-;;;;-1:-1:-1;;54279:335:0;;;;;;;;;;;;;;-1:-1:-1;;;;;54279:335:0;-1:-1:-1;;;54279:335:0;;;54228:397;;;54279:335;54228:397;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54209:416;;;54640:7;54636:80;;;54669:35;54686:11;54699:4;54669:35;;;;;;;:::i;6005:98::-;6063:7;6090:5;6094:1;6090;:5;:::i;52532:529::-;52642:12;52657:13;:6;52668:1;52657:10;:13::i;:::-;52642:28;-1:-1:-1;52681:17:0;52701:16;:6;52642:28;52701:10;:16::i;:::-;52681:36;;52746:24;52764:4;52746:9;:24::i;:::-;52734:9;:36;52730:105;;;52799:24;52817:4;52799:9;:24::i;:::-;52787:36;;52730:105;52872:21;52906:23;52924:4;52906:17;:23::i;:::-;52942:18;52963:41;:21;52989:14;52963:25;:41::i;:::-;52942:62;;53017:36;53031:9;53042:10;53017:13;:36::i;61981:346::-;62029:13;;:18;:38;;;;-1:-1:-1;62051:11:0;;:16;62029:38;:59;;;;-1:-1:-1;62071:12:0;;:17;62029:59;62025:72;;;61981:346::o;62025:72::-;62131:13;;;62109:19;:35;62178:11;;;62155:20;:34;62224:12;;;62200:21;:36;-1:-1:-1;62249:17:0;;;;62277:15;;;;62303:16;61981:346::o;56856:688::-;57007:15;57037:23;57075:12;57102:23;57140:12;57167:18;57199:19;57210:7;57199:10;:19::i;:::-;-1:-1:-1;;;;;57249:15:0;;;;;;:7;:15;;;;;;56992:226;;-1:-1:-1;56992:226:0;;-1:-1:-1;56992:226:0;;-1:-1:-1;56992:226:0;-1:-1:-1;56992:226:0;-1:-1:-1;56992:226:0;-1:-1:-1;57249:28:0;;57269:7;57249:19;:28::i;:::-;-1:-1:-1;;;;;57231:15:0;;;;;;:7;:15;;;;;;;;:46;;;;57306:7;:15;;;;:28;;57326:7;57306:19;:28::i;:::-;-1:-1:-1;;;;;57288:15:0;;;;;;;:7;:15;;;;;;:46;;;;57366:18;;;;;;;:39;;57389:15;57366:22;:39::i;:::-;-1:-1:-1;;;;;57345:18:0;;;;;;:7;:18;;;;;:60;57416:26;57431:10;57416:14;:26::i;:::-;57453:23;57465:4;57471;57453:11;:23::i;:::-;57509:9;-1:-1:-1;;;;;57492:44:0;57501:6;-1:-1:-1;;;;;57492:44:0;;57520:15;57492:44;;;;1716:25:1;;1704:2;1689:18;;1570:177;57492:44:0;;;;;;;;56981:563;;;;;;56856:688;;;:::o;56148:700::-;56297:15;56327:23;56365:12;56392:23;56430:12;56457:18;56489:19;56500:7;56489:10;:19::i;:::-;-1:-1:-1;;;;;56539:15:0;;;;;;:7;:15;;;;;;56282:226;;-1:-1:-1;56282:226:0;;-1:-1:-1;56282:226:0;;-1:-1:-1;56282:226:0;-1:-1:-1;56282:226:0;-1:-1:-1;56282:226:0;-1:-1:-1;56539:28:0;;56282:226;56539:19;:28::i;:::-;-1:-1:-1;;;;;56521:15:0;;;;;;;:7;:15;;;;;;;;:46;;;;56599:18;;;;;:7;:18;;;;;:39;;56622:15;56599:22;:39::i;:::-;-1:-1:-1;;;;;56578:18:0;;;;;;:7;:18;;;;;;;;:60;;;;56670:7;:18;;;;:39;;56693:15;56670:22;:39::i;57552:757::-;57703:15;57733:23;57771:12;57798:23;57836:12;57863:18;57895:19;57906:7;57895:10;:19::i;:::-;-1:-1:-1;;;;;57943:15:0;;;;;;:7;:15;;;;;;57688:226;;-1:-1:-1;57688:226:0;;-1:-1:-1;57688:226:0;;-1:-1:-1;57688:226:0;-1:-1:-1;57688:226:0;-1:-1:-1;57688:226:0;-1:-1:-1;57943:28:0;;57963:7;57943:19;:28::i;:::-;-1:-1:-1;;;;;57925:15:0;;;;;;:7;:15;;;;;;;;:46;;;;58000:7;:15;;;;:28;;58020:7;58000:19;:28::i;55511:629::-;55658:15;55688:23;55726:12;55753:23;55791:12;55818:18;55850:19;55861:7;55850:10;:19::i;:::-;-1:-1:-1;;;;;55900:15:0;;;;;;:7;:15;;;;;;55643:226;;-1:-1:-1;55643:226:0;;-1:-1:-1;55643:226:0;;-1:-1:-1;55643:226:0;-1:-1:-1;55643:226:0;-1:-1:-1;55643:226:0;-1:-1:-1;55900:28:0;;55643:226;55900:19;:28::i;35010:716::-;35434:23;35460:69;35488:4;35460:69;;;;;;;;;;;;;;;;;35468:5;-1:-1:-1;;;;;35460:27:0;;;:69;;;;;:::i;:::-;35544:17;;35434:95;;-1:-1:-1;35544:21:0;35540:179;;35641:10;35630:30;;;;;;;;;;;;:::i;:::-;35622:85;;;;-1:-1:-1;;;35622:85:0;;20265:2:1;35622:85:0;;;20247:21:1;20304:2;20284:18;;;20277:30;20343:34;20323:18;;;20316:62;-1:-1:-1;;;20394:18:1;;;20387:40;20444:19;;35622:85:0;20063:406:1;61364:214:0;61460:7;61505:65;38703:7;61505:50;61551:3;61505:41;38703:7;61505:26;61517:13;;61505:7;:11;;:26;;;;:::i;61714:259::-;61812:7;61857:108;38703:7;61857:61;61914:3;61857:52;38703:7;61857:37;61869:24;:22;:24::i;:::-;61857:7;;:11;:37::i;53069:804::-;53253:13;;53221:61;;53238:4;;-1:-1:-1;;;;;53253:13:0;53269:12;53221:8;:61::i;:::-;53330:13;;53693:15;;53408:349;;53543:4;53408:349;;;20811:34:1;20861:18;;;20854:34;;;53296:12:0;20904:18:1;;;20897:45;;;20958:18;;;20951:45;;;-1:-1:-1;;;;;53693:15:0;;;21012:19:1;;;21005:44;53727:15:0;21065:19:1;;;21058:35;53296:12:0;53330:13;;;;;53372:10;;20745:19:1;;53408:349:0;;;-1:-1:-1;;53408:349:0;;;;;;;;;;;;;;-1:-1:-1;;;;;53408:349:0;-1:-1:-1;;;53408:349:0;;;53314:454;;;53408:349;53314:454;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53295:473;;;53785:7;53781:85;;;53814:40;;;21278:25:1;;;21334:2;21319:18;;21312:34;;;53814:40:0;;21251:18:1;53814:40:0;21104:248:1;60995:361:0;61058:19;61080:10;:8;:10::i;:::-;61058:32;-1:-1:-1;61101:18:0;61122:27;:10;61058:32;61122:14;:27::i;:::-;61201:4;61185:22;;;;:7;:22;;;;;;61101:48;;-1:-1:-1;61185:38:0;;61101:48;61185:26;:38::i;:::-;61176:4;61160:22;;;;:7;:22;;;;;;;;:63;;;;61238:17;:32;;;;;;61234:114;;;61326:4;61310:22;;;;:7;:22;;;;;;:38;;61337:10;61310:26;:38::i;:::-;61301:4;61285:22;;;;:7;:22;;;;;:63;61047:309;;60995:361;:::o;58317:147::-;58395:7;;:17;;58407:4;58395:11;:17::i;:::-;58385:7;:27;58436:10;;:20;;58451:4;58436:14;:20::i;:::-;58423:10;:33;-1:-1:-1;;58317:147:0:o;17288:229::-;17425:12;17457:52;17479:6;17487:4;17493:1;17496:12;17457:21;:52::i;:::-;17450:59;17288:229;-1:-1:-1;;;;17288:229:0:o;18408:510::-;18578:12;18636:5;18611:21;:30;;18603:81;;;;-1:-1:-1;;;18603:81:0;;21559:2:1;18603:81:0;;;21541:21:1;21598:2;21578:18;;;21571:30;21637:34;21617:18;;;21610:62;-1:-1:-1;;;21688:18:1;;;21681:36;21734:19;;18603:81:0;21357:402:1;18603:81:0;-1:-1:-1;;;;;14838:19:0;;;18695:60;;;;-1:-1:-1;;;18695:60:0;;21966:2:1;18695:60:0;;;21948:21:1;22005:2;21985:18;;;21978:30;22044:31;22024:18;;;22017:59;22093:18;;18695:60:0;21764:353:1;18695:60:0;18769:12;18783:23;18810:6;-1:-1:-1;;;;;18810:11:0;18829:5;18836:4;18810:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18768:73;;;;18859:51;18876:7;18885:10;18897:12;18859:16;:51::i;:::-;18852:58;18408:510;-1:-1:-1;;;;;;;18408:510:0:o;21094:712::-;21244:12;21273:7;21269:530;;;-1:-1:-1;21304:10:0;21297:17;;21269:530;21418:17;;:21;21414:374;;21616:10;21610:17;21677:15;21664:10;21660:2;21656:19;21649:44;21414:374;21759:12;21752:20;;-1:-1:-1;;;21752:20:0;;;;;;;;:::i;14:250:1:-;99:1;109:113;123:6;120:1;117:13;109:113;;;199:11;;;193:18;180:11;;;173:39;145:2;138:10;109:113;;;-1:-1:-1;;256:1:1;238:16;;231:27;14:250::o;269:396::-;418:2;407:9;400:21;381:4;450:6;444:13;493:6;488:2;477:9;473:18;466:34;509:79;581:6;576:2;565:9;561:18;556:2;548:6;544:15;509:79;:::i;:::-;649:2;628:15;-1:-1:-1;;624:29:1;609:45;;;;656:2;605:54;;269:396;-1:-1:-1;;269:396:1:o;670:131::-;-1:-1:-1;;;;;745:31:1;;735:42;;725:70;;791:1;788;781:12;806:315;874:6;882;935:2;923:9;914:7;910:23;906:32;903:52;;;951:1;948;941:12;903:52;990:9;977:23;1009:31;1034:5;1009:31;:::i;:::-;1059:5;1111:2;1096:18;;;;1083:32;;-1:-1:-1;;;806:315:1:o;1318:247::-;1377:6;1430:2;1418:9;1409:7;1405:23;1401:32;1398:52;;;1446:1;1443;1436:12;1398:52;1485:9;1472:23;1504:31;1529:5;1504:31;:::i;1960:180::-;2019:6;2072:2;2060:9;2051:7;2047:23;2043:32;2040:52;;;2088:1;2085;2078:12;2040:52;-1:-1:-1;2111:23:1;;1960:180;-1:-1:-1;1960:180:1:o;2145:456::-;2222:6;2230;2238;2291:2;2279:9;2270:7;2266:23;2262:32;2259:52;;;2307:1;2304;2297:12;2259:52;2346:9;2333:23;2365:31;2390:5;2365:31;:::i;:::-;2415:5;-1:-1:-1;2472:2:1;2457:18;;2444:32;2485:33;2444:32;2485:33;:::i;:::-;2145:456;;2537:7;;-1:-1:-1;;;2591:2:1;2576:18;;;;2563:32;;2145:456::o;2606:118::-;2692:5;2685:13;2678:21;2671:5;2668:32;2658:60;;2714:1;2711;2704:12;2729:382;2794:6;2802;2855:2;2843:9;2834:7;2830:23;2826:32;2823:52;;;2871:1;2868;2861:12;2823:52;2910:9;2897:23;2929:31;2954:5;2929:31;:::i;:::-;2979:5;-1:-1:-1;3036:2:1;3021:18;;3008:32;3049:30;3008:32;3049:30;:::i;:::-;3098:7;3088:17;;;2729:382;;;;;:::o;3305:241::-;3361:6;3414:2;3402:9;3393:7;3389:23;3385:32;3382:52;;;3430:1;3427;3420:12;3382:52;3469:9;3456:23;3488:28;3510:5;3488:28;:::i;3551:388::-;3619:6;3627;3680:2;3668:9;3659:7;3655:23;3651:32;3648:52;;;3696:1;3693;3686:12;3648:52;3735:9;3722:23;3754:31;3779:5;3754:31;:::i;:::-;3804:5;-1:-1:-1;3861:2:1;3846:18;;3833:32;3874:33;3833:32;3874:33;:::i;3944:309::-;4009:6;4017;4070:2;4058:9;4049:7;4045:23;4041:32;4038:52;;;4086:1;4083;4076:12;4038:52;4122:9;4109:23;4099:33;;4182:2;4171:9;4167:18;4154:32;4195:28;4217:5;4195:28;:::i;4493:663::-;4597:6;4605;4613;4621;4629;4637;4690:3;4678:9;4669:7;4665:23;4661:33;4658:53;;;4707:1;4704;4697:12;4658:53;4746:9;4733:23;4765:31;4790:5;4765:31;:::i;:::-;4815:5;-1:-1:-1;4872:2:1;4857:18;;4844:32;4885:33;4844:32;4885:33;:::i;:::-;4493:663;;4937:7;;-1:-1:-1;;;;4991:2:1;4976:18;;4963:32;;5042:2;5027:18;;5014:32;;5093:3;5078:19;;5065:33;;-1:-1:-1;5145:3:1;5130:19;;;5117:33;;-1:-1:-1;4493:663:1:o;5161:356::-;5363:2;5345:21;;;5382:18;;;5375:30;5441:34;5436:2;5421:18;;5414:62;5508:2;5493:18;;5161:356::o;5877:127::-;5938:10;5933:3;5929:20;5926:1;5919:31;5969:4;5966:1;5959:15;5993:4;5990:1;5983:15;6009:127;6070:10;6065:3;6061:20;6058:1;6051:31;6101:4;6098:1;6091:15;6125:4;6122:1;6115:15;6141:128;6208:9;;;6229:11;;;6226:37;;;6243:18;;:::i;6274:127::-;6335:10;6330:3;6326:20;6323:1;6316:31;6366:4;6363:1;6356:15;6390:4;6387:1;6380:15;6406:135;6445:3;6466:17;;;6463:43;;6486:18;;:::i;:::-;-1:-1:-1;6533:1:1;6522:13;;6406:135::o;6546:346::-;6748:2;6730:21;;;6787:2;6767:18;;;6760:30;-1:-1:-1;;;6821:2:1;6806:18;;6799:52;6883:2;6868:18;;6546:346::o;8669:184::-;8739:6;8792:2;8780:9;8771:7;8767:23;8763:32;8760:52;;;8808:1;8805;8798:12;8760:52;-1:-1:-1;8831:16:1;;8669:184;-1:-1:-1;8669:184:1:o;9574:251::-;9644:6;9697:2;9685:9;9676:7;9672:23;9668:32;9665:52;;;9713:1;9710;9703:12;9665:52;9745:9;9739:16;9764:31;9789:5;9764:31;:::i;12934:337::-;13136:2;13118:21;;;13175:2;13155:18;;;13148:30;-1:-1:-1;;;13209:2:1;13194:18;;13187:43;13262:2;13247:18;;12934:337::o;14042:188::-;14121:13;;-1:-1:-1;;;;;14163:42:1;;14153:53;;14143:81;;14220:1;14217;14210:12;14143:81;14042:188;;;:::o;14235:450::-;14322:6;14330;14338;14391:2;14379:9;14370:7;14366:23;14362:32;14359:52;;;14407:1;14404;14397:12;14359:52;14430:40;14460:9;14430:40;:::i;:::-;14420:50;;14489:49;14534:2;14523:9;14519:18;14489:49;:::i;:::-;14479:59;;14581:2;14570:9;14566:18;14560:25;14625:10;14618:5;14614:22;14607:5;14604:33;14594:61;;14651:1;14648;14641:12;14594:61;14674:5;14664:15;;;14235:450;;;;;:::o;16574:217::-;16614:1;16640;16630:132;;16684:10;16679:3;16675:20;16672:1;16665:31;16719:4;16716:1;16709:15;16747:4;16744:1;16737:15;16630:132;-1:-1:-1;16776:9:1;;16574:217::o;17477:125::-;17542:9;;;17563:10;;;17560:36;;;17576:18;;:::i;17607:168::-;17680:9;;;17711;;17728:15;;;17722:22;;17708:37;17698:71;;17749:18;;:::i;18122:461::-;18175:3;18213:5;18207:12;18240:6;18235:3;18228:19;18266:4;18295:2;18290:3;18286:12;18279:19;;18332:2;18325:5;18321:14;18353:1;18363:195;18377:6;18374:1;18371:13;18363:195;;;18442:13;;-1:-1:-1;;;;;18438:39:1;18426:52;;18498:12;;;;18533:15;;;;18474:1;18392:9;18363:195;;;-1:-1:-1;18574:3:1;;18122:461;-1:-1:-1;;;;;18122:461:1:o;18588:591::-;18885:6;18874:9;18867:25;18940:4;18932:6;18928:17;18923:2;18912:9;18908:18;18901:45;18982:3;18977:2;18966:9;18962:18;18955:31;18848:4;19003:57;19055:3;19044:9;19040:19;19032:6;19003:57;:::i;:::-;-1:-1:-1;;;;;19096:32:1;;;;19091:2;19076:18;;19069:60;-1:-1:-1;19160:3:1;19145:19;19138:35;18995:65;18588:591;-1:-1:-1;;;18588:591:1:o;19184:287::-;19313:3;19351:6;19345:13;19367:66;19426:6;19421:3;19414:4;19406:6;19402:17;19367:66;:::i;:::-;19449:16;;;;;19184:287;-1:-1:-1;;19184:287:1:o;19476:332::-;19683:6;19672:9;19665:25;19726:2;19721;19710:9;19706:18;19699:30;19646:4;19746:56;19798:2;19787:9;19783:18;19775:6;19746:56;:::i;19813:245::-;19880:6;19933:2;19921:9;19912:7;19908:23;19904:32;19901:52;;;19949:1;19946;19939:12;19901:52;19981:9;19975:16;20000:28;20022:5;20000:28;:::i

Swarm Source

ipfs://5fd9e0358af49c6dea1e05c1726e9165f994b289b9f8bcde57313ad07e188409
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.