ETH Price: $3,444.36 (+1.56%)
Gas: 4 Gwei

Token

Galaxy Fox (GFOX)
 

Overview

Max Total Supply

5,000,000,000 GFOX

Holders

3,751 ( 0.293%)

Market

Price

$0.00 @ 0.000000 ETH (+3.13%)

Onchain Market Cap

$1,998,217.76

Circulating Supply Market Cap

$0.00

Other Info

Token Contract (WITH 18 Decimals)

Balance
440,682.251990011387576833 GFOX

Value
$176.12 ( ~0.0511328690480491 Eth) [0.0088%]
0x8e3745eedae50728df35350b6a2ea0323a967d01
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Galaxy Fox is an exciting web3 platform that features a unique meme coin called Galaxy Fox ($GFOX), captivating NFTs, a staking platform, and thrilling play-to-earn gaming ecosystem.

Market

Volume (24H):$11,542.40
Market Capitalization:$0.00
Circulating Supply:0.00 GFOX
Market Data Source: Coinmarketcap

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
GalaxyFox

Compiler Version
v0.8.23+commit.f704f362

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license, Audited

Contract Source Code (Solidity)Audit Report

/**
 *Submitted for verification at Etherscan.io on 2024-01-25
*/

// SPDX-License-Identifier: MIT
pragma solidity 0.8.23;

string constant NAME = "Galaxy Fox";

string constant SYMBOL = "GFOX";

uint256 constant INITIAL_SUPPLY = 5000000000 * 10 ** 18;

uint16 constant BUY_TAX_LIQUIDIY = 200;

// 2%
uint16 constant BUY_TAX_MARKETING = 200;

// 2%
uint16 constant BUY_TAX_ECOSYSTEM = 200;

// 2%
uint16 constant SELL_TAX_LIQUIDIY = 200;

// 2%
uint16 constant SELL_TAX_MARKETING = 200;

// 2%
uint16 constant SELL_TAX_ECOSYSTEM = 200;

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

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

    /**
     * @dev Returns the value of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

    /**
     * @dev Moves a `value` amount of 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 value) 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 a `value` amount of tokens 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 value) external returns (bool);

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to` using the
     * allowance mechanism. `value` 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 value
    ) external returns (bool);
}

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

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

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

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

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

    function _contextSuffixLength() internal view virtual returns (uint256) {
        return 0;
    }
}

interface IERC20Errors {
    /**
     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param balance Current balance for the interacting account.
     * @param needed Minimum amount required to perform a transfer.
     */
    error ERC20InsufficientBalance(
        address sender,
        uint256 balance,
        uint256 needed
    );

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC20InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC20InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers.
     * @param spender Address that may be allowed to operate on tokens without being their owner.
     * @param allowance Amount of tokens a `spender` is allowed to operate with.
     * @param needed Minimum amount required to perform a transfer.
     */
    error ERC20InsufficientAllowance(
        address spender,
        uint256 allowance,
        uint256 needed
    );

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC20InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `spender` to be approved. Used in approvals.
     * @param spender Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC20InvalidSpender(address spender);
}

//
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/ERC20.sol)
/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * The default value of {decimals} is 18. To change this, you should override
 * this function so it returns a different value.
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 */
abstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors {
    mapping(address account => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the default value returned by this function, unless
     * it's overridden.
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual returns (uint8) {
        return 18;
    }

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

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `value`.
     */
    function transfer(address to, uint256 value) public virtual returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, value);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(
        address owner,
        address spender
    ) public view virtual returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `value` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(
        address spender,
        uint256 value
    ) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, value);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `value`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `value`.
     */
    function transferFrom(
        address from,
        address to,
        uint256 value
    ) public virtual returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, value);
        _transfer(from, to, value);
        return true;
    }

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead.
     */
    function _transfer(address from, address to, uint256 value) internal {
        if (from == address(0)) {
            revert ERC20InvalidSender(address(0));
        }
        if (to == address(0)) {
            revert ERC20InvalidReceiver(address(0));
        }
        _update(from, to, value);
    }

    /**
     * @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from`
     * (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding
     * this function.
     *
     * Emits a {Transfer} event.
     */
    function _update(address from, address to, uint256 value) internal virtual {
        if (from == address(0)) {
            // Overflow check required: The rest of the code assumes that totalSupply never overflows
            _totalSupply += value;
        } else {
            uint256 fromBalance = _balances[from];
            if (fromBalance < value) {
                revert ERC20InsufficientBalance(from, fromBalance, value);
            }
            unchecked {
                // Overflow not possible: value <= fromBalance <= totalSupply.
                _balances[from] = fromBalance - value;
            }
        }

        if (to == address(0)) {
            unchecked {
                // Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply.
                _totalSupply -= value;
            }
        } else {
            unchecked {
                // Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256.
                _balances[to] += value;
            }
        }

        emit Transfer(from, to, value);
    }

    /**
     * @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0).
     * Relies on the `_update` mechanism
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead.
     */
    function _mint(address account, uint256 value) internal {
        if (account == address(0)) {
            revert ERC20InvalidReceiver(address(0));
        }
        _update(address(0), account, value);
    }

    /**
     * @dev Destroys a `value` amount of tokens from `account`, lowering the total supply.
     * Relies on the `_update` mechanism.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead
     */
    function _burn(address account, uint256 value) internal {
        if (account == address(0)) {
            revert ERC20InvalidSender(address(0));
        }
        _update(account, address(0), value);
    }

    /**
     * @dev Sets `value` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     *
     * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.
     */
    function _approve(address owner, address spender, uint256 value) internal {
        _approve(owner, spender, value, true);
    }

    /**
     * @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event.
     *
     * By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by
     * `_spendAllowance` during the `transferFrom` operation set the flag to false. This saves gas by not emitting any
     * `Approval` event during `transferFrom` operations.
     *
     * Anyone who wishes to continue emitting `Approval` events on the`transferFrom` operation can force the flag to
     * true using the following override:
     * ```
     * function _approve(address owner, address spender, uint256 value, bool) internal virtual override {
     *     super._approve(owner, spender, value, true);
     * }
     * ```
     *
     * Requirements are the same as {_approve}.
     */
    function _approve(
        address owner,
        address spender,
        uint256 value,
        bool emitEvent
    ) internal virtual {
        if (owner == address(0)) {
            revert ERC20InvalidApprover(address(0));
        }
        if (spender == address(0)) {
            revert ERC20InvalidSpender(address(0));
        }
        _allowances[owner][spender] = value;
        if (emitEvent) {
            emit Approval(owner, spender, value);
        }
    }

    /**
     * @dev Updates `owner` s allowance for `spender` based on spent `value`.
     *
     * Does not update the allowance value in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Does not emit an {Approval} event.
     */
    function _spendAllowance(
        address owner,
        address spender,
        uint256 value
    ) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            if (currentAllowance < value) {
                revert ERC20InsufficientAllowance(
                    spender,
                    currentAllowance,
                    value
                );
            }
            unchecked {
                _approve(owner, spender, currentAllowance - value, false);
            }
        }
    }
}

interface IERC20Permit {
    /**
     * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,
     * given ``owner``'s signed approval.
     *
     * IMPORTANT: The same issues {IERC20-approve} has related to transaction
     * ordering also apply here.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `deadline` must be a timestamp in the future.
     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
     * over the EIP712-formatted function arguments.
     * - the signature must use ``owner``'s current nonce (see {nonces}).
     *
     * For more information on the signature format, see the
     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
     * section].
     *
     * CAUTION: See Security Considerations above.
     */
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    /**
     * @dev Returns the current nonce for `owner`. This value must be
     * included whenever a signature is generated for {permit}.
     *
     * Every successful call to {permit} increases ``owner``'s nonce by one. This
     * prevents a signature from being used multiple times.
     */
    function nonces(address owner) external view returns (uint256);

    /**
     * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
     */
    // solhint-disable-next-line func-name-mixedcase
    function DOMAIN_SEPARATOR() external view returns (bytes32);
}

library Address {
    /**
     * @dev The ETH balance of the account is not enough to perform the operation.
     */
    error AddressInsufficientBalance(address account);

    /**
     * @dev There's no code at `target` (it is not a contract).
     */
    error AddressEmptyCode(address target);

    /**
     * @dev A call to an address target failed. The target may have reverted.
     */
    error FailedInnerCall();

    /**
     * @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://consensys.net/diligence/blog/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.8.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        if (address(this).balance < amount) {
            revert AddressInsufficientBalance(address(this));
        }

        (bool success, ) = recipient.call{value: amount}("");
        if (!success) {
            revert FailedInnerCall();
        }
    }

    /**
     * @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 or custom error, it is bubbled
     * up by this function (like regular Solidity function calls). However, if
     * the call reverted with no returned reason, this function reverts with a
     * {FailedInnerCall} error.
     *
     * 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.
     */
    function functionCall(
        address target,
        bytes memory data
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0);
    }

    /**
     * @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`.
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        if (address(this).balance < value) {
            revert AddressInsufficientBalance(address(this));
        }
        (bool success, bytes memory returndata) = target.call{value: value}(
            data
        );
        return verifyCallResultFromTarget(target, success, returndata);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     */
    function functionStaticCall(
        address target,
        bytes memory data
    ) internal view returns (bytes memory) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, success, returndata);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     */
    function functionDelegateCall(
        address target,
        bytes memory data
    ) internal returns (bytes memory) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata);
    }

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target
     * was not a contract or bubbling up the revert reason (falling back to {FailedInnerCall}) in case of an
     * unsuccessful call.
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata
    ) internal view returns (bytes memory) {
        if (!success) {
            _revert(returndata);
        } else {
            // only check if target is a contract if the call was successful and the return data is empty
            // otherwise we already know that it was a contract
            if (returndata.length == 0 && target.code.length == 0) {
                revert AddressEmptyCode(target);
            }
            return returndata;
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the
     * revert reason or with a default {FailedInnerCall} error.
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata
    ) internal pure returns (bytes memory) {
        if (!success) {
            _revert(returndata);
        } else {
            return returndata;
        }
    }

    /**
     * @dev Reverts with returndata if present. Otherwise reverts with {FailedInnerCall}.
     */
    function _revert(bytes memory returndata) private pure {
        // 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
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert FailedInnerCall();
        }
    }
}

//
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/utils/SafeERC20.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;

    /**
     * @dev An operation with an ERC20 token failed.
     */
    error SafeERC20FailedOperation(address token);

    /**
     * @dev Indicates a failed `decreaseAllowance` request.
     */
    error SafeERC20FailedDecreaseAllowance(
        address spender,
        uint256 currentAllowance,
        uint256 requestedDecrease
    );

    /**
     * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,
     * non-reverting calls are assumed to be successful.
     */
    function safeTransfer(IERC20 token, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));
    }

    /**
     * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the
     * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.
     */
    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(
            token,
            abi.encodeCall(token.transferFrom, (from, to, value))
        );
    }

    /**
     * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,
     * non-reverting calls are assumed to be successful.
     */
    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 oldAllowance = token.allowance(address(this), spender);
        forceApprove(token, spender, oldAllowance + value);
    }

    /**
     * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no
     * value, non-reverting calls are assumed to be successful.
     */
    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 requestedDecrease
    ) internal {
        unchecked {
            uint256 currentAllowance = token.allowance(address(this), spender);
            if (currentAllowance < requestedDecrease) {
                revert SafeERC20FailedDecreaseAllowance(
                    spender,
                    currentAllowance,
                    requestedDecrease
                );
            }
            forceApprove(token, spender, currentAllowance - requestedDecrease);
        }
    }

    /**
     * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,
     * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval
     * to be set to zero before setting it to a non-zero value, such as USDT.
     */
    function forceApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        bytes memory approvalCall = abi.encodeCall(
            token.approve,
            (spender, value)
        );

        if (!_callOptionalReturnBool(token, approvalCall)) {
            _callOptionalReturn(
                token,
                abi.encodeCall(token.approve, (spender, 0))
            );
            _callOptionalReturn(token, approvalCall);
        }
    }

    /**
     * @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);
        if (returndata.length != 0 && !abi.decode(returndata, (bool))) {
            revert SafeERC20FailedOperation(address(token));
        }
    }

    /**
     * @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).
     *
     * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead.
     */
    function _callOptionalReturnBool(
        IERC20 token,
        bytes memory data
    ) private returns (bool) {
        // 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 cannot use {Address-functionCall} here since this should return false
        // and not revert is the subcall reverts.

        (bool success, bytes memory returndata) = address(token).call(data);
        return
            success &&
            (returndata.length == 0 || abi.decode(returndata, (bool))) &&
            address(token).code.length > 0;
    }
}

//
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.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.
 *
 * The initial owner is set to the address provided by the deployer. 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;

    /**
     * @dev The caller account is not authorized to perform an operation.
     */
    error OwnableUnauthorizedAccount(address account);

    /**
     * @dev The owner is not a valid owner account. (eg. `address(0)`)
     */
    error OwnableInvalidOwner(address owner);

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

    /**
     * @dev Initializes the contract setting the address provided by the deployer as the initial owner.
     */
    constructor(address initialOwner) {
        if (initialOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(initialOwner);
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        if (owner() != _msgSender()) {
            revert OwnableUnauthorizedAccount(_msgSender());
        }
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby disabling 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 {
        if (newOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _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);
    }
}

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

    function WETH() external pure returns (address);

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

    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    )
        external
        payable
        returns (uint amountToken, uint amountETH, uint liquidity);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    function decimals() external pure returns (uint8);

    function totalSupply() external view returns (uint);

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

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

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

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

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

    function DOMAIN_SEPARATOR() external view returns (bytes32);

    function PERMIT_TYPEHASH() external pure returns (bytes32);

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

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

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

    function MINIMUM_LIQUIDITY() external pure returns (uint);

    function factory() external view returns (address);

    function token0() external view returns (address);

    function token1() external view returns (address);

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

    function price0CumulativeLast() external view returns (uint);

    function price1CumulativeLast() external view returns (uint);

    function kLast() external view returns (uint);

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

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

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

    function skim(address to) external;

    function sync() external;

    function initialize(address, address) external;
}

//
// Uncomment this line to use console.log
// import "hardhat/console.sol";

// 5%
uint256 constant TAX_BASE = 10000;

uint256 constant MAX_TAX = 2000;

// 20%
uint256 constant DAY = 1 days;

struct Tax {
    uint16 liquidity;
    uint16 marketing;
    uint16 ecosystem;
}

interface IUniFactory {
    function createPair(
        address tokenA,
        address tokenB
    ) external returns (address pair);
}

contract GalaxyFox is ERC20, Ownable {
    using SafeERC20 for IERC20;

    Tax public buyTax =
        Tax(BUY_TAX_LIQUIDIY, BUY_TAX_MARKETING, BUY_TAX_ECOSYSTEM); // 6 bytes
    Tax public sellTax =
        Tax(SELL_TAX_LIQUIDIY, SELL_TAX_MARKETING, SELL_TAX_ECOSYSTEM); // 6 bytes

    address payable public liquidityHolder; // 20 bytes
    address payable public marketingHolder; // 20 bytes
    address payable public ecosystemHolder; // 20 bytes
    bool public taxEnabled = false;

    IUniFactory public immutable uniFactory; // 20 bytes
    IUniswapV2Router02 public immutable uniRouter; // 20 bytes
    address public immutable weth; // 20 bytes
    address public immutable uniPair; // 20 bytes

    mapping(address => bool) public isExcludedFromFee;

    mapping(address => bool) public isPair;

    mapping(address => mapping(uint256 => uint256)) public volume;
    mapping(address => bool) public isExcludedFromDailyVolume;

    uint256 public maxDailyVolume = INITIAL_SUPPLY / 1000;

    uint256 public liquidityReserves;
    uint256 public miniBeforeLiquify;

    event TaxEnabled(bool enabled);
    event ExeededFromFee(address account, bool excluded);
    event Pair(address pair, bool isPair);
    event EcosystemHolder(address oldHolder, address holder);
    event MarketingHolder(address oldHolder, address holder);
    event LiquidityHolder(address oldHolder, address holder);
    event SellTaxChanged(uint16 liquidity, uint16 marketing, uint16 ecosystem);
    event BuyTaxChanged(uint16 liquidity, uint16 marketing, uint16 ecosystem);
    event ExcludedFromDailyVolume(address account, bool excluded);
    event MaxDailyVolumeChanged(uint256 maxDailyVolume);
    event MiniBeforeLiquifyChanged(uint256 miniBeforeLiquifyArg);

    constructor(
        // to allow for easy testing/deploy on behalf of someone else
        address _ownerArg,
        address payable _ecosystemHolder,
        address payable _marketingHolder,
        address payable _liquidityHolder,
        IUniswapV2Router02 _uniswapV2Router,
        IUniFactory _uniswapV2Factory
    ) ERC20(NAME, SYMBOL) Ownable(_ownerArg) {
        _mint(_ownerArg, INITIAL_SUPPLY);

        require(
            _ecosystemHolder != address(0),
            "GalaxyFox: ecosystem holder is the zero address"
        );
        ecosystemHolder = _ecosystemHolder;
        require(
            _marketingHolder != address(0),
            "GalaxyFox: marketing holder is the zero address"
        );
        marketingHolder = _marketingHolder;
        require(
            _liquidityHolder != address(0),
            "GalaxyFox: liquidity holder is the zero address"
        );
        liquidityHolder = _liquidityHolder;

        uniRouter = _uniswapV2Router;
        uniFactory = _uniswapV2Factory;

        weth = _uniswapV2Router.WETH();

        // Create a uniswap pair for this new token
        uniPair = _uniswapV2Factory.createPair(address(this), weth);

        // approve token transfer to cover all future transfereFrom calls
        _approve(address(this), address(_uniswapV2Router), type(uint256).max);

        isPair[uniPair] = true;

        isExcludedFromFee[address(this)] = true;

        isExcludedFromFee[_ownerArg] = true;

        isExcludedFromDailyVolume[_ownerArg] = true;

        isExcludedFromDailyVolume[uniPair] = true;

        isExcludedFromDailyVolume[address(this)] = true;
    }

    receive() external payable {
        // only receive from router
        require(msg.sender == address(uniRouter), "Invalid sender");
    }

    /**
     * @notice Transfers tokens to a recipient
     * @param recipient address to send the tokens to
     * @param amount  amount of tokens to send
     */
    function transfer(
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _customTransfer(_msgSender(), recipient, amount);
        return true;
    }

    /**
     * @notice Transfers tokens from a sender to a recipient (requires approval)
     * @param sender address to send the tokens from
     * @param recipient address to send the tokens to
     * @param amount  amount of tokens to send
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        uint256 allowance = allowance(sender, _msgSender());
        require(amount <= allowance, "Transfer amount exceeds allowance");

        // overflow is checked above
        unchecked {
            // decrease allowance if not max approved
            if (allowance < type(uint256).max)
                _approve(sender, _msgSender(), allowance - amount, true);
        }

        _customTransfer(sender, recipient, amount);

        return true;
    }

    function _customTransfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal {
        if (sender != uniPair) _liquify();

        if (
            !taxEnabled ||
            isExcludedFromFee[sender] ||
            isExcludedFromFee[recipient] ||
            (!isPair[recipient] && !isPair[sender]) ||
            inswap == 1
        ) {
            _transfer(sender, recipient, amount);
        } else {
            Tax memory tax = isPair[recipient] ? buyTax : sellTax;

            // buy
            uint256 marketingTax = (amount * tax.marketing) / TAX_BASE;
            uint256 ecosystemTax = (amount * tax.ecosystem) / TAX_BASE;
            uint256 liquidityTax = (amount * tax.liquidity) / TAX_BASE;

            if (ecosystemTax > 0)
                _transfer(sender, ecosystemHolder, ecosystemTax);
            if (marketingTax > 0)
                _transfer(sender, marketingHolder, marketingTax);

            _transfer(
                sender,
                recipient,
                amount - marketingTax - ecosystemTax - liquidityTax
            );

            if (liquidityTax > 0) {
                liquidityReserves += liquidityTax;
                _transfer(sender, address(this), liquidityTax);
            }
        }

        // DAY is constant so no division by 0
        // volume can't overflow if we reached this point (balance check)
        unchecked {
            // loss of precision is wanted here
            uint256 period = block.timestamp / DAY;

            volume[sender][period] += amount;
            require(
                volume[sender][period] <= maxDailyVolume ||
                    isExcludedFromDailyVolume[sender],
                "GalaxyFox: max daily volume exceeded"
            );
        }
    }

    /**
     * @notice Enable or disable taxes
     * @param taxEnabledArg true to enable tax, false to disable
     */
    function setTaxEnabled(bool taxEnabledArg) public onlyOwner {
        require(taxEnabled != taxEnabledArg, "GalaxyFox: already set");
        taxEnabled = taxEnabledArg;

        emit TaxEnabled(taxEnabledArg);
    }

    /**
     * @notice Sets the minimum amount of tokens that must be in the contract before liquifying
     * @param miniBeforeLiquifyArg  The minimum amount of tokens that must be in the contract before liquifying
     */
    function setMiniBeforeLiquify(
        uint256 miniBeforeLiquifyArg
    ) public onlyOwner {
        require(
            miniBeforeLiquifyArg != miniBeforeLiquify,
            "GalaxyFox: already set"
        );
        miniBeforeLiquify = miniBeforeLiquifyArg;

        emit MiniBeforeLiquifyChanged(miniBeforeLiquifyArg);
    }

    /**
     * @notice sets whether an address is excluded  from fees or not
     * @param account The address to exclude/include from fees
     * @param excluded  true to exclude, false to include
     */
    function setExcludedFromFee(
        address account,
        bool excluded
    ) public onlyOwner {
        require(
            isExcludedFromFee[account] != excluded,
            "GalaxyFox: already set"
        );
        isExcludedFromFee[account] = excluded;

        emit ExeededFromFee(account, excluded);
    }

    /**
     *  @notice declare if an address is an lp pair or not
     * @param pair address of the LP Pool
     * @param isPairArg  true if the address is a pair, false otherwise
     */
    function setPair(address pair, bool isPairArg) public onlyOwner {
        require(isPair[pair] != isPairArg, "GalaxyFox: already set");
        isPair[pair] = isPairArg;

        emit Pair(pair, isPairArg);
    }

    /**
     * @dev sets the ecosystem holder address
     * @param _ecosystemHolder The address of the ecosystem holder
     */
    function setEcosystemHolder(
        address payable _ecosystemHolder
    ) public onlyOwner {
        require(_ecosystemHolder != ecosystemHolder, "GalaxyFox: already set");
        require(_ecosystemHolder != address(0), "GalaxyFox: zero address");
        ecosystemHolder = _ecosystemHolder;

        emit EcosystemHolder(ecosystemHolder, _ecosystemHolder);
    }

    /**
     * @dev Sets the marketing holder address
     * @param _marketingHolder The address of the marketing holder
     */
    function setMarketingHolder(
        address payable _marketingHolder
    ) public onlyOwner {
        require(_marketingHolder != marketingHolder, "GalaxyFox: already set");
        require(_marketingHolder != address(0), "GalaxyFox: zero address");
        marketingHolder = _marketingHolder;

        emit MarketingHolder(marketingHolder, _marketingHolder);
    }

    /**
     * @dev Sets the liquidity holder address
     * @param _liquidityHolder The address of the liquidity holder
     */
    function setLiquidityHolder(
        address payable _liquidityHolder
    ) public onlyOwner {
        require(_liquidityHolder != liquidityHolder, "GalaxyFox: already set");
        require(_liquidityHolder != address(0), "GalaxyFox: zero address");
        liquidityHolder = _liquidityHolder;
        emit LiquidityHolder(liquidityHolder, _liquidityHolder);
    }

    /**
     * @dev Changes the tax on buys
     * @param _liquidity liquidity tax in basis points
     * @param _marketing marketing tax in basis points
     * @param _ecosystem ecosystem tax in basis points
     */
    function setSellTax(
        uint16 _liquidity,
        uint16 _marketing,
        uint16 _ecosystem
    ) public onlyOwner {
        require(
            _liquidity + _marketing + _ecosystem <= MAX_TAX,
            "GalaxyFox: tax too high"
        );
        sellTax = Tax(_liquidity, _marketing, _ecosystem);

        emit SellTaxChanged(_liquidity, _marketing, _ecosystem);
    }

    /**
     * @dev Changes the tax on sells
     * @param _liquidity liquidity tax in basis points
     * @param _marketing marketing tax in basis points
     * @param _ecosystem ecosystem tax in basis points
     */
    function setBuyTax(
        uint16 _liquidity,
        uint16 _marketing,
        uint16 _ecosystem
    ) public onlyOwner {
        require(
            _liquidity + _marketing + _ecosystem <= MAX_TAX,
            "GalaxyFox: tax too high"
        );
        buyTax = Tax(_liquidity, _marketing, _ecosystem);

        emit BuyTaxChanged(_liquidity, _marketing, _ecosystem);
    }

    /**
     * @notice Burns tokens from the caller
     * @param amount amount of tokens to burn
     */
    function burn(uint256 amount) public {
        _burn(msg.sender, amount);
    }

    /**
     * @notice Recovers lost tokens or ETH, doesn't include the liquidity reserves
     * @param tokenAddress address of the token to recover
     */
    function recoverLostTokens(address tokenAddress) public onlyOwner {
        if (tokenAddress != address(this)) {
            uint256 tokenAmount = tokenAddress != address(0)
                ? IERC20(tokenAddress).balanceOf(address(this))
                : address(this).balance;

            if (tokenAmount > 0 && tokenAddress != address(0)) {
                IERC20(tokenAddress).safeTransfer(msg.sender, tokenAmount);
            } else if (tokenAmount > 0) {
                (bool success, ) = payable(msg.sender).call{value: tokenAmount}(
                    ""
                );
                require(success, "Failed to send Ether");
            }
        } else {
            uint256 tokenAmount = balanceOf(address(this)) - liquidityReserves;
            _transfer(address(this), msg.sender, tokenAmount);
        }
    }

    /**
     * @notice Sets whether an address is excluded from maxDailyVolume or not
     * @param account account to be included/excluded from maxDailyVolume
     * @param excluded true to exclude, false to include
     */
    function setExludedFromDailyVolume(
        address account,
        bool excluded
    ) public onlyOwner {
        require(
            isExcludedFromDailyVolume[account] != excluded,
            "GalaxyFox: already set"
        );
        isExcludedFromDailyVolume[account] = excluded;

        emit ExcludedFromDailyVolume(account, excluded);
    }

    /**
     * @notice Sets the max daily volume max is 0.1% of the total supply
     * @param maxDailyVolumeArg The new max daily volume
     */
    function setMaxDailyVolume(uint256 maxDailyVolumeArg) public onlyOwner {
        require(maxDailyVolumeArg != maxDailyVolume, "GalaxyFox: already set");
        // require that the max daily volume is at least 0.1% of the total supply
        require(
            maxDailyVolumeArg >= totalSupply() / 1000,
            "GalaxyFox: max daily volume too low"
        );
        maxDailyVolume = maxDailyVolumeArg;

        emit MaxDailyVolumeChanged(maxDailyVolumeArg);
    }

    // using uint256 is cheaper than using bool
    // because there will be no extra work to read it
    // sunce when used we always return it back to 0
    // it will trigger a refund
    uint256 inswap = 0;

    /**
     * @notice creates lp from the liquidity reserves
     */
    function liquify() external onlyOwner {
        _liquify();
    }

    function _liquify() private {
        if (inswap == 1) return;

        if (liquidityReserves > miniBeforeLiquify) {
            inswap = 1;
            // get reserves from pair
            (uint256 reserves0, uint256 reserves1, ) = IUniswapV2Pair(uniPair)
                .getReserves();

            // Check Uniswap library sortTokens (token0 < token1)
            uint256 tokenReserves = address(this) < weth
                ? reserves0
                : reserves1;

            // swap capped at 10% of the reserves which is tecnically 5% because we only swap half
            uint256 maxToSwap = (tokenReserves * 10) / 100;

            uint256 toswap = liquidityReserves > maxToSwap
                ? maxToSwap
                : liquidityReserves;

            uint256 half = toswap / 2;
            // avoids precision loss
            uint256 otherHalf = toswap - half;

            _swapTokensForEth(half);

            uint256 newBalance = address(this).balance;

            _addLiquidity(otherHalf, newBalance);

            liquidityReserves -= toswap;
            inswap = 0;
        }
    }

    function _swapTokensForEth(uint256 tokenAmount) internal {
        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = weth;

        // make the swap safely, do not revert if swap fails
        try
            uniRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
                tokenAmount,
                0, // accept any amount of ETH
                path,
                address(this),
                block.timestamp
            )
        {} catch {}
    }

    function _addLiquidity(uint256 tokenAmount, uint256 ethAmount) internal {
        // do not revert if addlp fails
        try
            uniRouter.addLiquidityETH{value: ethAmount}(
                address(this),
                tokenAmount,
                0,
                0,
                liquidityHolder,
                block.timestamp
            )
        {} catch {}
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_ownerArg","type":"address"},{"internalType":"address payable","name":"_ecosystemHolder","type":"address"},{"internalType":"address payable","name":"_marketingHolder","type":"address"},{"internalType":"address payable","name":"_liquidityHolder","type":"address"},{"internalType":"contract IUniswapV2Router02","name":"_uniswapV2Router","type":"address"},{"internalType":"contract IUniFactory","name":"_uniswapV2Factory","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"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":"uint16","name":"liquidity","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"marketing","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"ecosystem","type":"uint16"}],"name":"BuyTaxChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldHolder","type":"address"},{"indexed":false,"internalType":"address","name":"holder","type":"address"}],"name":"EcosystemHolder","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"excluded","type":"bool"}],"name":"ExcludedFromDailyVolume","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"excluded","type":"bool"}],"name":"ExeededFromFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldHolder","type":"address"},{"indexed":false,"internalType":"address","name":"holder","type":"address"}],"name":"LiquidityHolder","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldHolder","type":"address"},{"indexed":false,"internalType":"address","name":"holder","type":"address"}],"name":"MarketingHolder","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"maxDailyVolume","type":"uint256"}],"name":"MaxDailyVolumeChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"miniBeforeLiquifyArg","type":"uint256"}],"name":"MiniBeforeLiquifyChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"pair","type":"address"},{"indexed":false,"internalType":"bool","name":"isPair","type":"bool"}],"name":"Pair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"liquidity","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"marketing","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"ecosystem","type":"uint16"}],"name":"SellTaxChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"TaxEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"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":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"buyTax","outputs":[{"internalType":"uint16","name":"liquidity","type":"uint16"},{"internalType":"uint16","name":"marketing","type":"uint16"},{"internalType":"uint16","name":"ecosystem","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ecosystemHolder","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isExcludedFromDailyVolume","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isPair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityHolder","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityReserves","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquify","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"marketingHolder","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxDailyVolume","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"miniBeforeLiquify","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"recoverLostTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellTax","outputs":[{"internalType":"uint16","name":"liquidity","type":"uint16"},{"internalType":"uint16","name":"marketing","type":"uint16"},{"internalType":"uint16","name":"ecosystem","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_liquidity","type":"uint16"},{"internalType":"uint16","name":"_marketing","type":"uint16"},{"internalType":"uint16","name":"_ecosystem","type":"uint16"}],"name":"setBuyTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_ecosystemHolder","type":"address"}],"name":"setEcosystemHolder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"setExcludedFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"setExludedFromDailyVolume","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_liquidityHolder","type":"address"}],"name":"setLiquidityHolder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_marketingHolder","type":"address"}],"name":"setMarketingHolder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxDailyVolumeArg","type":"uint256"}],"name":"setMaxDailyVolume","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"miniBeforeLiquifyArg","type":"uint256"}],"name":"setMiniBeforeLiquify","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"isPairArg","type":"bool"}],"name":"setPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_liquidity","type":"uint16"},{"internalType":"uint16","name":"_marketing","type":"uint16"},{"internalType":"uint16","name":"_ecosystem","type":"uint16"}],"name":"setSellTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"taxEnabledArg","type":"bool"}],"name":"setTaxEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"uniFactory","outputs":[{"internalType":"contract IUniFactory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniRouter","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"volume","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"weth","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c86101008190526101208190526101408190526006805464c800c800c865ffffffffffff1991821681179092556101c06040526101608390526101808390526101a09290925260078054909216179055600a805460ff60a01b19169055620000776103e86b1027e72f1f128130880000006200073a565b600f555f6012553480156200008a575f80fd5b5060405162002dea38038062002dea833981016040819052620000ad9162000772565b856040518060400160405280600a81526020016908ec2d8c2f0f2408cdef60b31b8152506040518060400160405280600481526020016308e8c9eb60e31b8152508160039081620000ff91906200089f565b5060046200010e82826200089f565b5050506001600160a01b0381166200014057604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6200014b8162000491565b5062000164866b1027e72f1f12813088000000620004e2565b6001600160a01b038516620001d45760405162461bcd60e51b815260206004820152602f60248201527f47616c617879466f783a2065636f73797374656d20686f6c646572206973207460448201526e6865207a65726f206164647265737360881b606482015260840162000137565b600a80546001600160a01b0319166001600160a01b038781169190911790915584166200025c5760405162461bcd60e51b815260206004820152602f60248201527f47616c617879466f783a206d61726b6574696e6720686f6c646572206973207460448201526e6865207a65726f206164647265737360881b606482015260840162000137565b600980546001600160a01b0319166001600160a01b03868116919091179091558316620002e45760405162461bcd60e51b815260206004820152602f60248201527f47616c617879466f783a206c697175696469747920686f6c646572206973207460448201526e6865207a65726f206164647265737360881b606482015260840162000137565b600880546001600160a01b0319166001600160a01b038581169190911790915582811660a0819052908216608052604080516315ab88c960e31b8152905163ad5c4648916004808201926020929091908290030181865afa1580156200034c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200037291906200096b565b6001600160a01b0390811660c08190526040516364e329cb60e11b815230600482015260248101919091529082169063c9c65396906044016020604051808303815f875af1158015620003c7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620003ed91906200096b565b6001600160a01b031660e0526200040730835f196200051e565b505060e0516001600160a01b039081165f818152600c602090815260408083208054600160ff19918216811790925530808652600b855283862080548316841790559a90961684528184208054871682179055600e9092528083208054861683179055928252828220805485168217905596815220805490911690941790935550620009b6915050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b0382166200050d5760405163ec442f0560e01b81525f600482015260240162000137565b6200051a5f838362000532565b5050565b6200052d838383600162000661565b505050565b6001600160a01b03831662000560578060025f82825462000554919062000990565b90915550620005d29050565b6001600160a01b0383165f9081526020819052604090205481811015620005b45760405163391434e360e21b81526001600160a01b0385166004820152602481018290526044810183905260640162000137565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b038216620005f0576002805482900390556200060e565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200065491815260200190565b60405180910390a3505050565b6001600160a01b0384166200068c5760405163e602df0560e01b81525f600482015260240162000137565b6001600160a01b038316620006b757604051634a1406b160e11b81525f600482015260240162000137565b6001600160a01b038085165f90815260016020908152604080832093871683529290522082905580156200073457826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516200072b91815260200190565b60405180910390a35b50505050565b5f826200075557634e487b7160e01b5f52601260045260245ffd5b500490565b6001600160a01b03811681146200076f575f80fd5b50565b5f805f805f8060c0878903121562000788575f80fd5b865162000795816200075a565b6020880151909650620007a8816200075a565b6040880151909550620007bb816200075a565b6060880151909450620007ce816200075a565b6080880151909350620007e1816200075a565b60a0880151909250620007f4816200075a565b809150509295509295509295565b634e487b7160e01b5f52604160045260245ffd5b600181811c908216806200082b57607f821691505b6020821081036200084a57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156200052d57805f5260205f20601f840160051c81016020851015620008775750805b601f840160051c820191505b8181101562000898575f815560010162000883565b5050505050565b81516001600160401b03811115620008bb57620008bb62000802565b620008d381620008cc845462000816565b8462000850565b602080601f83116001811462000909575f8415620008f15750858301515b5f19600386901b1c1916600185901b17855562000963565b5f85815260208120601f198616915b82811015620009395788860151825594840194600190910190840162000918565b50858210156200095757878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f602082840312156200097c575f80fd5b815162000989816200075a565b9392505050565b80820180821115620009b057634e487b7160e01b5f52601160045260245ffd5b92915050565b60805160a05160c05160e0516123cf62000a1b5f395f81816103e901528181611527015261197d01525f818161043401528181611a170152611ca601525f81816102670152818161069e01528181611cfd0152611daf01525f6105fb01526123cf5ff3fe608060405260043610610257575f3560e01c806386a22eff1161013f578063c6af580b116100b3578063d8286d7911610078578063d8286d791461081e578063dd62ed3e1461083d578063e5e31b1314610881578063e78f6ceb146108af578063ee8ce789146108ce578063f2fde38b146108ed575f80fd5b8063c6af580b14610787578063c9a88338146107a6578063cb9598c3146107c5578063cc1776d3146107d9578063cec1b34414610809575f80fd5b8063a572c78b11610104578063a572c78b146106c0578063a70c1aba146106df578063a9059cbb14610715578063b9e8ce2c14610734578063c169306e14610753578063c26a564514610768575f80fd5b806386a22eff1461061d578063870bd30b1461063c5780638da5cb5b1461065c57806395d89b4114610679578063a0e47bf61461068d575f80fd5b806342966c68116101d657806356da87bc1161019b57806356da87bc146105455780635c3f2f4a146105645780636612e66f1461058357806370a08231146105a2578063715018a6146105d657806376771d4b146105ea575f80fd5b806342966c6814610456578063435fff271461047557806344f1ca37146104945780634f7041a5146104c25780635342acb414610517575f80fd5b806318160ddd1161021c57806318160ddd1461038a57806323b872dd1461039e578063313ce567146103bd57806332972e46146103d85780633fc8cef314610423575f80fd5b806306fdde03146102d057806307df2f18146102fa578063095ea7b31461031d5780630c3266641461034c5780631472c83d1461036b575f80fd5b366102cc57336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146102ca5760405162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b21039b2b73232b960911b60448201526064015b60405180910390fd5b005b5f80fd5b3480156102db575f80fd5b506102e461090c565b6040516102f19190611f48565b60405180910390f35b348015610305575f80fd5b5061030f600f5481565b6040519081526020016102f1565b348015610328575f80fd5b5061033c610337366004611f8e565b61099c565b60405190151581526020016102f1565b348015610357575f80fd5b506102ca610366366004611fb8565b6109b5565b348015610376575f80fd5b506102ca610385366004611fe5565b610a1a565b348015610395575f80fd5b5060025461030f565b3480156103a9575f80fd5b5061033c6103b8366004612025565b610b1a565b3480156103c8575f80fd5b50604051601281526020016102f1565b3480156103e3575f80fd5b5061040b7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016102f1565b34801561042e575f80fd5b5061040b7f000000000000000000000000000000000000000000000000000000000000000081565b348015610461575f80fd5b506102ca610470366004611fb8565b610bb2565b348015610480575f80fd5b506102ca61048f366004612063565b610bbf565b34801561049f575f80fd5b5061033c6104ae366004612063565b600e6020525f908152604090205460ff1681565b3480156104cd575f80fd5b506006546104f29061ffff808216916201000081048216916401000000009091041683565b6040805161ffff948516815292841660208401529216918101919091526060016102f1565b348015610522575f80fd5b5061033c610531366004612063565b600b6020525f908152604090205460ff1681565b348015610550575f80fd5b506102ca61055f366004611fe5565b610c70565b34801561056f575f80fd5b506102ca61057e366004611fb8565b610d67565b34801561058e575f80fd5b506102ca61059d36600461208b565b610e36565b3480156105ad575f80fd5b5061030f6105bc366004612063565b6001600160a01b03165f9081526020819052604090205490565b3480156105e1575f80fd5b506102ca610ee0565b3480156105f5575f80fd5b5061040b7f000000000000000000000000000000000000000000000000000000000000000081565b348015610628575f80fd5b506102ca61063736600461208b565b610ef3565b348015610647575f80fd5b50600a5461033c90600160a01b900460ff1681565b348015610667575f80fd5b506005546001600160a01b031661040b565b348015610684575f80fd5b506102e4610f95565b348015610698575f80fd5b5061040b7f000000000000000000000000000000000000000000000000000000000000000081565b3480156106cb575f80fd5b5060085461040b906001600160a01b031681565b3480156106ea575f80fd5b5061030f6106f9366004611f8e565b600d60209081525f928352604080842090915290825290205481565b348015610720575f80fd5b5061033c61072f366004611f8e565b610fa4565b34801561073f575f80fd5b506102ca61074e366004612063565b610fb9565b34801561075e575f80fd5b5061030f60115481565b348015610773575f80fd5b5060095461040b906001600160a01b031681565b348015610792575f80fd5b506102ca6107a13660046120c2565b611143565b3480156107b1575f80fd5b506102ca6107c0366004612063565b6111ca565b3480156107d0575f80fd5b506102ca61127b565b3480156107e4575f80fd5b506007546104f29061ffff808216916201000081048216916401000000009091041683565b348015610814575f80fd5b5061030f60105481565b348015610829575f80fd5b50600a5461040b906001600160a01b031681565b348015610848575f80fd5b5061030f6108573660046120dd565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b34801561088c575f80fd5b5061033c61089b366004612063565b600c6020525f908152604090205460ff1681565b3480156108ba575f80fd5b506102ca6108c936600461208b565b61128b565b3480156108d9575f80fd5b506102ca6108e8366004612063565b61132d565b3480156108f8575f80fd5b506102ca610907366004612063565b6113de565b60606003805461091b90612109565b80601f016020809104026020016040519081016040528092919081815260200182805461094790612109565b80156109925780601f1061096957610100808354040283529160200191610992565b820191905f5260205f20905b81548152906001019060200180831161097557829003601f168201915b5050505050905090565b5f336109a9818585611418565b60019150505b92915050565b6109bd611425565b60115481036109de5760405162461bcd60e51b81526004016102c190612141565b60118190556040518181527fe67e4ad89b973bf2fae6c1b3c3b2773e9c25d2ec1eb05eb37a6eb494a0122e1d906020015b60405180910390a150565b610a22611425565b6107d081610a308486612185565b610a3a9190612185565b61ffff161115610a865760405162461bcd60e51b815260206004820152601760248201527608ec2d8c2f0f28cdef07440e8c2f040e8dede40d0d2ced604b1b60448201526064016102c1565b604080516060808201835261ffff86811680845286821660208086018290529287169486018590526006805463ffffffff191683176201000083021765ffff0000000019166401000000008702179055855191825291810191909152928301919091527f24e45e298f32af538a5d4e1fed903ae9ed92fe19f7e0bf21ebbebb55e2ac424191015b60405180910390a1505050565b5f80610b268533610857565b905080831115610b825760405162461bcd60e51b815260206004820152602160248201527f5472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636044820152606560f81b60648201526084016102c1565b5f19811015610b9a57610b9a85338584036001611452565b610ba5858585611525565b60019150505b9392505050565b610bbc3382611825565b50565b610bc7611425565b6009546001600160a01b0390811690821603610bf55760405162461bcd60e51b81526004016102c190612141565b6001600160a01b038116610c1b5760405162461bcd60e51b81526004016102c1906121a7565b600980546001600160a01b0319166001600160a01b0383169081179091556040805182815260208101929092527fd64d9347eb205df6c87314d366a4395d7e0abe3ddf2b1aada45992bd35880f969101610a0f565b610c78611425565b6107d081610c868486612185565b610c909190612185565b61ffff161115610cdc5760405162461bcd60e51b815260206004820152601760248201527608ec2d8c2f0f28cdef07440e8c2f040e8dede40d0d2ced604b1b60448201526064016102c1565b604080516060808201835261ffff86811680845286821660208086018290529287169486018590526007805463ffffffff191683176201000083021765ffff0000000019166401000000008702179055855191825291810191909152928301919091527f7b2ba3c0360c4a8fadbd496c0e80fdade44b389b7a7f859678daa06def09430d9101610b0d565b610d6f611425565b600f548103610d905760405162461bcd60e51b81526004016102c190612141565b6103e8610d9c60025490565b610da691906121de565b811015610e015760405162461bcd60e51b815260206004820152602360248201527f47616c617879466f783a206d6178206461696c7920766f6c756d6520746f6f206044820152626c6f7760e81b60648201526084016102c1565b600f8190556040518181527ff7395978b671c0c395531979e2d0271383027646278868275e4a6ea786fb835790602001610a0f565b610e3e611425565b6001600160a01b0382165f908152600b602052604090205481151560ff909116151503610e7d5760405162461bcd60e51b81526004016102c190612141565b6001600160a01b0382165f818152600b6020908152604091829020805460ff19168515159081179091558251938452908301527f9f4f589ceb417a14ba902c1dc85dccd9c09dcbfe6422b8f85f01a94955f6920a91015b60405180910390a15050565b610ee8611425565b610ef15f611859565b565b610efb611425565b6001600160a01b0382165f908152600c602052604090205481151560ff909116151503610f3a5760405162461bcd60e51b81526004016102c190612141565b6001600160a01b0382165f818152600c6020908152604091829020805460ff19168515159081179091558251938452908301527fcd9591ba5f72df9031bde1e48a0cb86ae47760110b36b9b69ab2730bf57ab3579101610ed4565b60606004805461091b90612109565b5f610fb0338484611525565b50600192915050565b610fc1611425565b6001600160a01b0381163014611119575f6001600160a01b038216610fe6574761104c565b6040516370a0823160e01b81523060048201526001600160a01b038316906370a0823190602401602060405180830381865afa158015611028573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061104c91906121fd565b90505f8111801561106557506001600160a01b03821615155b156110825761107e6001600160a01b03831633836118aa565b5050565b801561107e576040515f90339083908381818185875af1925050503d805f81146110c7576040519150601f19603f3d011682016040523d82523d5f602084013e6110cc565b606091505b50509050806111145760405162461bcd60e51b81526020600482015260146024820152732330b4b632b2103a379039b2b7321022ba3432b960611b60448201526064016102c1565b505050565b601054305f90815260208190526040812054909161113691612214565b905061107e3033836118fc565b61114b611425565b801515600a60149054906101000a900460ff1615150361117d5760405162461bcd60e51b81526004016102c190612141565b600a8054821515600160a01b0260ff60a01b199091161790556040517f5bb2376cf656637e70e36c01d3da25685bf3b353f18681b8a5e48c7b2effe13390610a0f90831515815260200190565b6111d2611425565b6008546001600160a01b03908116908216036112005760405162461bcd60e51b81526004016102c190612141565b6001600160a01b0381166112265760405162461bcd60e51b81526004016102c1906121a7565b600880546001600160a01b0319166001600160a01b0383169081179091556040805182815260208101929092527fea1204643e42072ee8d3e7fa0b0ee2acd4d81330c5b6944ebb5e4b84e83a23019101610a0f565b611283611425565b610ef1611959565b611293611425565b6001600160a01b0382165f908152600e602052604090205481151560ff9091161515036112d25760405162461bcd60e51b81526004016102c190612141565b6001600160a01b0382165f818152600e6020908152604091829020805460ff19168515159081179091558251938452908301527f64187f0942d70c898df934114314164934b824a0cfc00f3a1017d04906f35ba59101610ed4565b611335611425565b600a546001600160a01b03908116908216036113635760405162461bcd60e51b81526004016102c190612141565b6001600160a01b0381166113895760405162461bcd60e51b81526004016102c1906121a7565b600a80546001600160a01b0319166001600160a01b0383169081179091556040805182815260208101929092527ffbad7c7fc3034d0c4aed9fb20b4fd0197bd14a41a8c2d814f9d06507f3d92eb29101610a0f565b6113e6611425565b6001600160a01b03811661140f57604051631e4fbdf760e01b81525f60048201526024016102c1565b610bbc81611859565b6111148383836001611452565b6005546001600160a01b03163314610ef15760405163118cdaa760e01b81523360048201526024016102c1565b6001600160a01b03841661147b5760405163e602df0560e01b81525f60048201526024016102c1565b6001600160a01b0383166114a457604051634a1406b160e11b81525f60048201526024016102c1565b6001600160a01b038085165f908152600160209081526040808320938716835292905220829055801561151f57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161151691815260200190565b60405180910390a35b50505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b03161461156657611566611959565b600a54600160a01b900460ff16158061159657506001600160a01b0383165f908152600b602052604090205460ff165b806115b857506001600160a01b0382165f908152600b602052604090205460ff165b806115fe57506001600160a01b0382165f908152600c602052604090205460ff161580156115fe57506001600160a01b0383165f908152600c602052604090205460ff16155b8061160b57506012546001145b156116205761161b8383836118fc565b611776565b6001600160a01b0382165f908152600c602052604081205460ff16611646576007611649565b60065b60408051606081018252915461ffff808216845262010000820481166020850181905264010000000090920416918301919091529091505f90612710906116909085612227565b61169a91906121de565b90505f612710836040015161ffff16856116b49190612227565b6116be91906121de565b90505f612710845f015161ffff16866116d79190612227565b6116e191906121de565b9050811561170157600a546117019088906001600160a01b0316846118fc565b821561171f5760095461171f9088906001600160a01b0316856118fc565b61174987878385611730888b612214565b61173a9190612214565b6117449190612214565b6118fc565b8015611771578060105f828254611760919061223e565b9091555061177190508730836118fc565b505050505b6001600160a01b0383165f908152600d6020908152604080832062015180420480855292529091208054830190819055600f541015806117cd57506001600160a01b0384165f908152600e602052604090205460ff165b61151f5760405162461bcd60e51b8152602060048201526024808201527f47616c617879466f783a206d6178206461696c7920766f6c756d6520657863656044820152631959195960e21b60648201526084016102c1565b6001600160a01b03821661184e57604051634b637e8f60e11b81525f60048201526024016102c1565b61107e825f83611aca565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611114908490611bf0565b6001600160a01b03831661192557604051634b637e8f60e11b81525f60048201526024016102c1565b6001600160a01b03821661194e5760405163ec442f0560e01b81525f60048201526024016102c1565b611114838383611aca565b60125460010361196557565b6011546010541115610ef15760016012819055505f807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa1580156119d7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119fb9190612267565b506001600160701b0391821693501690505f6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163010611a435781611a45565b825b90505f6064611a5583600a612227565b611a5f91906121de565b90505f8160105411611a7357601054611a75565b815b90505f611a836002836121de565b90505f611a908284612214565b9050611a9b82611c51565b47611aa68282611d6d565b8360105f828254611ab79190612214565b90915550505f6012555050505050505050565b6001600160a01b038316611af4578060025f828254611ae9919061223e565b90915550611b649050565b6001600160a01b0383165f9081526020819052604090205481811015611b465760405163391434e360e21b81526001600160a01b038516600482015260248101829052604481018390526064016102c1565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b038216611b8057600280548290039055611b9e565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611be391815260200190565b60405180910390a3505050565b5f611c046001600160a01b03841683611e24565b905080515f14158015611c28575080806020019051810190611c2691906122b3565b155b1561111457604051635274afe760e01b81526001600160a01b03841660048201526024016102c1565b6040805160028082526060820183525f9260208301908036833701905050905030815f81518110611c8457611c846122ce565b60200260200101906001600160a01b031690816001600160a01b0316815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110611cd857611cd86122ce565b6001600160a01b03928316602091820292909201015260405163791ac94760e01b81527f00000000000000000000000000000000000000000000000000000000000000009091169063791ac94790611d3c9085905f908690309042906004016122e2565b5f604051808303815f87803b158015611d53575f80fd5b505af1925050508015611d64575060015b1561107e575050565b60085460405163f305d71960e01b8152306004820152602481018490525f6044820181905260648201526001600160a01b0391821660848201524260a48201527f00000000000000000000000000000000000000000000000000000000000000009091169063f305d71990839060c40160606040518083038185885af193505050508015611e18575060408051601f3d908101601f19168201909252611e1591810190612353565b60015b1561107e575050505050565b6060610bab83835f845f80856001600160a01b03168486604051611e48919061237e565b5f6040518083038185875af1925050503d805f8114611e82576040519150601f19603f3d011682016040523d82523d5f602084013e611e87565b606091505b5091509150611e97868383611ea1565b9695505050505050565b606082611eb657611eb182611efd565b610bab565b8151158015611ecd57506001600160a01b0384163b155b15611ef657604051639996b31560e01b81526001600160a01b03851660048201526024016102c1565b5080610bab565b805115611f0d5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f5b83811015611f40578181015183820152602001611f28565b50505f910152565b602081525f8251806020840152611f66816040850160208701611f26565b601f01601f19169190910160400192915050565b6001600160a01b0381168114610bbc575f80fd5b5f8060408385031215611f9f575f80fd5b8235611faa81611f7a565b946020939093013593505050565b5f60208284031215611fc8575f80fd5b5035919050565b803561ffff81168114611fe0575f80fd5b919050565b5f805f60608486031215611ff7575f80fd5b61200084611fcf565b925061200e60208501611fcf565b915061201c60408501611fcf565b90509250925092565b5f805f60608486031215612037575f80fd5b833561204281611f7a565b9250602084013561205281611f7a565b929592945050506040919091013590565b5f60208284031215612073575f80fd5b8135610bab81611f7a565b8015158114610bbc575f80fd5b5f806040838503121561209c575f80fd5b82356120a781611f7a565b915060208301356120b78161207e565b809150509250929050565b5f602082840312156120d2575f80fd5b8135610bab8161207e565b5f80604083850312156120ee575f80fd5b82356120f981611f7a565b915060208301356120b781611f7a565b600181811c9082168061211d57607f821691505b60208210810361213b57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526016908201527511d85b185e1e519bde0e88185b1c9958591e481cd95d60521b604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b61ffff8181168382160190808211156121a0576121a0612171565b5092915050565b60208082526017908201527f47616c617879466f783a207a65726f2061646472657373000000000000000000604082015260600190565b5f826121f857634e487b7160e01b5f52601260045260245ffd5b500490565b5f6020828403121561220d575f80fd5b5051919050565b818103818111156109af576109af612171565b80820281158282048414176109af576109af612171565b808201808211156109af576109af612171565b80516001600160701b0381168114611fe0575f80fd5b5f805f60608486031215612279575f80fd5b61228284612251565b925061229060208501612251565b9150604084015163ffffffff811681146122a8575f80fd5b809150509250925092565b5f602082840312156122c3575f80fd5b8151610bab8161207e565b634e487b7160e01b5f52603260045260245ffd5b5f60a08201878352602087602085015260a0604085015281875180845260c0860191506020890193505f5b818110156123325784516001600160a01b03168352938301939183019160010161230d565b50506001600160a01b03969096166060850152505050608001529392505050565b5f805f60608486031215612365575f80fd5b8351925060208401519150604084015190509250925092565b5f825161238f818460208701611f26565b919091019291505056fea2646970667358221220183a02c078f663bcdb2ae338660573d04bf4ed0b31f9d2e2b0a8d0ccfb310c6564736f6c634300081700330000000000000000000000004e6647a2bda8dfe75316a72e73586ecd24d0e7000000000000000000000000004e6647a2bda8dfe75316a72e73586ecd24d0e7000000000000000000000000004e6647a2bda8dfe75316a72e73586ecd24d0e7000000000000000000000000004e6647a2bda8dfe75316a72e73586ecd24d0e7000000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d0000000000000000000000005c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f

Deployed Bytecode

0x608060405260043610610257575f3560e01c806386a22eff1161013f578063c6af580b116100b3578063d8286d7911610078578063d8286d791461081e578063dd62ed3e1461083d578063e5e31b1314610881578063e78f6ceb146108af578063ee8ce789146108ce578063f2fde38b146108ed575f80fd5b8063c6af580b14610787578063c9a88338146107a6578063cb9598c3146107c5578063cc1776d3146107d9578063cec1b34414610809575f80fd5b8063a572c78b11610104578063a572c78b146106c0578063a70c1aba146106df578063a9059cbb14610715578063b9e8ce2c14610734578063c169306e14610753578063c26a564514610768575f80fd5b806386a22eff1461061d578063870bd30b1461063c5780638da5cb5b1461065c57806395d89b4114610679578063a0e47bf61461068d575f80fd5b806342966c68116101d657806356da87bc1161019b57806356da87bc146105455780635c3f2f4a146105645780636612e66f1461058357806370a08231146105a2578063715018a6146105d657806376771d4b146105ea575f80fd5b806342966c6814610456578063435fff271461047557806344f1ca37146104945780634f7041a5146104c25780635342acb414610517575f80fd5b806318160ddd1161021c57806318160ddd1461038a57806323b872dd1461039e578063313ce567146103bd57806332972e46146103d85780633fc8cef314610423575f80fd5b806306fdde03146102d057806307df2f18146102fa578063095ea7b31461031d5780630c3266641461034c5780631472c83d1461036b575f80fd5b366102cc57336001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d16146102ca5760405162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b21039b2b73232b960911b60448201526064015b60405180910390fd5b005b5f80fd5b3480156102db575f80fd5b506102e461090c565b6040516102f19190611f48565b60405180910390f35b348015610305575f80fd5b5061030f600f5481565b6040519081526020016102f1565b348015610328575f80fd5b5061033c610337366004611f8e565b61099c565b60405190151581526020016102f1565b348015610357575f80fd5b506102ca610366366004611fb8565b6109b5565b348015610376575f80fd5b506102ca610385366004611fe5565b610a1a565b348015610395575f80fd5b5060025461030f565b3480156103a9575f80fd5b5061033c6103b8366004612025565b610b1a565b3480156103c8575f80fd5b50604051601281526020016102f1565b3480156103e3575f80fd5b5061040b7f00000000000000000000000092ee0df7f6b0674cabc9bfc64873786fa7be82d081565b6040516001600160a01b0390911681526020016102f1565b34801561042e575f80fd5b5061040b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b348015610461575f80fd5b506102ca610470366004611fb8565b610bb2565b348015610480575f80fd5b506102ca61048f366004612063565b610bbf565b34801561049f575f80fd5b5061033c6104ae366004612063565b600e6020525f908152604090205460ff1681565b3480156104cd575f80fd5b506006546104f29061ffff808216916201000081048216916401000000009091041683565b6040805161ffff948516815292841660208401529216918101919091526060016102f1565b348015610522575f80fd5b5061033c610531366004612063565b600b6020525f908152604090205460ff1681565b348015610550575f80fd5b506102ca61055f366004611fe5565b610c70565b34801561056f575f80fd5b506102ca61057e366004611fb8565b610d67565b34801561058e575f80fd5b506102ca61059d36600461208b565b610e36565b3480156105ad575f80fd5b5061030f6105bc366004612063565b6001600160a01b03165f9081526020819052604090205490565b3480156105e1575f80fd5b506102ca610ee0565b3480156105f5575f80fd5b5061040b7f0000000000000000000000005c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f81565b348015610628575f80fd5b506102ca61063736600461208b565b610ef3565b348015610647575f80fd5b50600a5461033c90600160a01b900460ff1681565b348015610667575f80fd5b506005546001600160a01b031661040b565b348015610684575f80fd5b506102e4610f95565b348015610698575f80fd5b5061040b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b3480156106cb575f80fd5b5060085461040b906001600160a01b031681565b3480156106ea575f80fd5b5061030f6106f9366004611f8e565b600d60209081525f928352604080842090915290825290205481565b348015610720575f80fd5b5061033c61072f366004611f8e565b610fa4565b34801561073f575f80fd5b506102ca61074e366004612063565b610fb9565b34801561075e575f80fd5b5061030f60115481565b348015610773575f80fd5b5060095461040b906001600160a01b031681565b348015610792575f80fd5b506102ca6107a13660046120c2565b611143565b3480156107b1575f80fd5b506102ca6107c0366004612063565b6111ca565b3480156107d0575f80fd5b506102ca61127b565b3480156107e4575f80fd5b506007546104f29061ffff808216916201000081048216916401000000009091041683565b348015610814575f80fd5b5061030f60105481565b348015610829575f80fd5b50600a5461040b906001600160a01b031681565b348015610848575f80fd5b5061030f6108573660046120dd565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b34801561088c575f80fd5b5061033c61089b366004612063565b600c6020525f908152604090205460ff1681565b3480156108ba575f80fd5b506102ca6108c936600461208b565b61128b565b3480156108d9575f80fd5b506102ca6108e8366004612063565b61132d565b3480156108f8575f80fd5b506102ca610907366004612063565b6113de565b60606003805461091b90612109565b80601f016020809104026020016040519081016040528092919081815260200182805461094790612109565b80156109925780601f1061096957610100808354040283529160200191610992565b820191905f5260205f20905b81548152906001019060200180831161097557829003601f168201915b5050505050905090565b5f336109a9818585611418565b60019150505b92915050565b6109bd611425565b60115481036109de5760405162461bcd60e51b81526004016102c190612141565b60118190556040518181527fe67e4ad89b973bf2fae6c1b3c3b2773e9c25d2ec1eb05eb37a6eb494a0122e1d906020015b60405180910390a150565b610a22611425565b6107d081610a308486612185565b610a3a9190612185565b61ffff161115610a865760405162461bcd60e51b815260206004820152601760248201527608ec2d8c2f0f28cdef07440e8c2f040e8dede40d0d2ced604b1b60448201526064016102c1565b604080516060808201835261ffff86811680845286821660208086018290529287169486018590526006805463ffffffff191683176201000083021765ffff0000000019166401000000008702179055855191825291810191909152928301919091527f24e45e298f32af538a5d4e1fed903ae9ed92fe19f7e0bf21ebbebb55e2ac424191015b60405180910390a1505050565b5f80610b268533610857565b905080831115610b825760405162461bcd60e51b815260206004820152602160248201527f5472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636044820152606560f81b60648201526084016102c1565b5f19811015610b9a57610b9a85338584036001611452565b610ba5858585611525565b60019150505b9392505050565b610bbc3382611825565b50565b610bc7611425565b6009546001600160a01b0390811690821603610bf55760405162461bcd60e51b81526004016102c190612141565b6001600160a01b038116610c1b5760405162461bcd60e51b81526004016102c1906121a7565b600980546001600160a01b0319166001600160a01b0383169081179091556040805182815260208101929092527fd64d9347eb205df6c87314d366a4395d7e0abe3ddf2b1aada45992bd35880f969101610a0f565b610c78611425565b6107d081610c868486612185565b610c909190612185565b61ffff161115610cdc5760405162461bcd60e51b815260206004820152601760248201527608ec2d8c2f0f28cdef07440e8c2f040e8dede40d0d2ced604b1b60448201526064016102c1565b604080516060808201835261ffff86811680845286821660208086018290529287169486018590526007805463ffffffff191683176201000083021765ffff0000000019166401000000008702179055855191825291810191909152928301919091527f7b2ba3c0360c4a8fadbd496c0e80fdade44b389b7a7f859678daa06def09430d9101610b0d565b610d6f611425565b600f548103610d905760405162461bcd60e51b81526004016102c190612141565b6103e8610d9c60025490565b610da691906121de565b811015610e015760405162461bcd60e51b815260206004820152602360248201527f47616c617879466f783a206d6178206461696c7920766f6c756d6520746f6f206044820152626c6f7760e81b60648201526084016102c1565b600f8190556040518181527ff7395978b671c0c395531979e2d0271383027646278868275e4a6ea786fb835790602001610a0f565b610e3e611425565b6001600160a01b0382165f908152600b602052604090205481151560ff909116151503610e7d5760405162461bcd60e51b81526004016102c190612141565b6001600160a01b0382165f818152600b6020908152604091829020805460ff19168515159081179091558251938452908301527f9f4f589ceb417a14ba902c1dc85dccd9c09dcbfe6422b8f85f01a94955f6920a91015b60405180910390a15050565b610ee8611425565b610ef15f611859565b565b610efb611425565b6001600160a01b0382165f908152600c602052604090205481151560ff909116151503610f3a5760405162461bcd60e51b81526004016102c190612141565b6001600160a01b0382165f818152600c6020908152604091829020805460ff19168515159081179091558251938452908301527fcd9591ba5f72df9031bde1e48a0cb86ae47760110b36b9b69ab2730bf57ab3579101610ed4565b60606004805461091b90612109565b5f610fb0338484611525565b50600192915050565b610fc1611425565b6001600160a01b0381163014611119575f6001600160a01b038216610fe6574761104c565b6040516370a0823160e01b81523060048201526001600160a01b038316906370a0823190602401602060405180830381865afa158015611028573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061104c91906121fd565b90505f8111801561106557506001600160a01b03821615155b156110825761107e6001600160a01b03831633836118aa565b5050565b801561107e576040515f90339083908381818185875af1925050503d805f81146110c7576040519150601f19603f3d011682016040523d82523d5f602084013e6110cc565b606091505b50509050806111145760405162461bcd60e51b81526020600482015260146024820152732330b4b632b2103a379039b2b7321022ba3432b960611b60448201526064016102c1565b505050565b601054305f90815260208190526040812054909161113691612214565b905061107e3033836118fc565b61114b611425565b801515600a60149054906101000a900460ff1615150361117d5760405162461bcd60e51b81526004016102c190612141565b600a8054821515600160a01b0260ff60a01b199091161790556040517f5bb2376cf656637e70e36c01d3da25685bf3b353f18681b8a5e48c7b2effe13390610a0f90831515815260200190565b6111d2611425565b6008546001600160a01b03908116908216036112005760405162461bcd60e51b81526004016102c190612141565b6001600160a01b0381166112265760405162461bcd60e51b81526004016102c1906121a7565b600880546001600160a01b0319166001600160a01b0383169081179091556040805182815260208101929092527fea1204643e42072ee8d3e7fa0b0ee2acd4d81330c5b6944ebb5e4b84e83a23019101610a0f565b611283611425565b610ef1611959565b611293611425565b6001600160a01b0382165f908152600e602052604090205481151560ff9091161515036112d25760405162461bcd60e51b81526004016102c190612141565b6001600160a01b0382165f818152600e6020908152604091829020805460ff19168515159081179091558251938452908301527f64187f0942d70c898df934114314164934b824a0cfc00f3a1017d04906f35ba59101610ed4565b611335611425565b600a546001600160a01b03908116908216036113635760405162461bcd60e51b81526004016102c190612141565b6001600160a01b0381166113895760405162461bcd60e51b81526004016102c1906121a7565b600a80546001600160a01b0319166001600160a01b0383169081179091556040805182815260208101929092527ffbad7c7fc3034d0c4aed9fb20b4fd0197bd14a41a8c2d814f9d06507f3d92eb29101610a0f565b6113e6611425565b6001600160a01b03811661140f57604051631e4fbdf760e01b81525f60048201526024016102c1565b610bbc81611859565b6111148383836001611452565b6005546001600160a01b03163314610ef15760405163118cdaa760e01b81523360048201526024016102c1565b6001600160a01b03841661147b5760405163e602df0560e01b81525f60048201526024016102c1565b6001600160a01b0383166114a457604051634a1406b160e11b81525f60048201526024016102c1565b6001600160a01b038085165f908152600160209081526040808320938716835292905220829055801561151f57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161151691815260200190565b60405180910390a35b50505050565b7f00000000000000000000000092ee0df7f6b0674cabc9bfc64873786fa7be82d06001600160a01b0316836001600160a01b03161461156657611566611959565b600a54600160a01b900460ff16158061159657506001600160a01b0383165f908152600b602052604090205460ff165b806115b857506001600160a01b0382165f908152600b602052604090205460ff165b806115fe57506001600160a01b0382165f908152600c602052604090205460ff161580156115fe57506001600160a01b0383165f908152600c602052604090205460ff16155b8061160b57506012546001145b156116205761161b8383836118fc565b611776565b6001600160a01b0382165f908152600c602052604081205460ff16611646576007611649565b60065b60408051606081018252915461ffff808216845262010000820481166020850181905264010000000090920416918301919091529091505f90612710906116909085612227565b61169a91906121de565b90505f612710836040015161ffff16856116b49190612227565b6116be91906121de565b90505f612710845f015161ffff16866116d79190612227565b6116e191906121de565b9050811561170157600a546117019088906001600160a01b0316846118fc565b821561171f5760095461171f9088906001600160a01b0316856118fc565b61174987878385611730888b612214565b61173a9190612214565b6117449190612214565b6118fc565b8015611771578060105f828254611760919061223e565b9091555061177190508730836118fc565b505050505b6001600160a01b0383165f908152600d6020908152604080832062015180420480855292529091208054830190819055600f541015806117cd57506001600160a01b0384165f908152600e602052604090205460ff165b61151f5760405162461bcd60e51b8152602060048201526024808201527f47616c617879466f783a206d6178206461696c7920766f6c756d6520657863656044820152631959195960e21b60648201526084016102c1565b6001600160a01b03821661184e57604051634b637e8f60e11b81525f60048201526024016102c1565b61107e825f83611aca565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611114908490611bf0565b6001600160a01b03831661192557604051634b637e8f60e11b81525f60048201526024016102c1565b6001600160a01b03821661194e5760405163ec442f0560e01b81525f60048201526024016102c1565b611114838383611aca565b60125460010361196557565b6011546010541115610ef15760016012819055505f807f00000000000000000000000092ee0df7f6b0674cabc9bfc64873786fa7be82d06001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa1580156119d7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119fb9190612267565b506001600160701b0391821693501690505f6001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2163010611a435781611a45565b825b90505f6064611a5583600a612227565b611a5f91906121de565b90505f8160105411611a7357601054611a75565b815b90505f611a836002836121de565b90505f611a908284612214565b9050611a9b82611c51565b47611aa68282611d6d565b8360105f828254611ab79190612214565b90915550505f6012555050505050505050565b6001600160a01b038316611af4578060025f828254611ae9919061223e565b90915550611b649050565b6001600160a01b0383165f9081526020819052604090205481811015611b465760405163391434e360e21b81526001600160a01b038516600482015260248101829052604481018390526064016102c1565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b038216611b8057600280548290039055611b9e565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611be391815260200190565b60405180910390a3505050565b5f611c046001600160a01b03841683611e24565b905080515f14158015611c28575080806020019051810190611c2691906122b3565b155b1561111457604051635274afe760e01b81526001600160a01b03841660048201526024016102c1565b6040805160028082526060820183525f9260208301908036833701905050905030815f81518110611c8457611c846122ce565b60200260200101906001600160a01b031690816001600160a01b0316815250507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281600181518110611cd857611cd86122ce565b6001600160a01b03928316602091820292909201015260405163791ac94760e01b81527f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d9091169063791ac94790611d3c9085905f908690309042906004016122e2565b5f604051808303815f87803b158015611d53575f80fd5b505af1925050508015611d64575060015b1561107e575050565b60085460405163f305d71960e01b8152306004820152602481018490525f6044820181905260648201526001600160a01b0391821660848201524260a48201527f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d9091169063f305d71990839060c40160606040518083038185885af193505050508015611e18575060408051601f3d908101601f19168201909252611e1591810190612353565b60015b1561107e575050505050565b6060610bab83835f845f80856001600160a01b03168486604051611e48919061237e565b5f6040518083038185875af1925050503d805f8114611e82576040519150601f19603f3d011682016040523d82523d5f602084013e611e87565b606091505b5091509150611e97868383611ea1565b9695505050505050565b606082611eb657611eb182611efd565b610bab565b8151158015611ecd57506001600160a01b0384163b155b15611ef657604051639996b31560e01b81526001600160a01b03851660048201526024016102c1565b5080610bab565b805115611f0d5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f5b83811015611f40578181015183820152602001611f28565b50505f910152565b602081525f8251806020840152611f66816040850160208701611f26565b601f01601f19169190910160400192915050565b6001600160a01b0381168114610bbc575f80fd5b5f8060408385031215611f9f575f80fd5b8235611faa81611f7a565b946020939093013593505050565b5f60208284031215611fc8575f80fd5b5035919050565b803561ffff81168114611fe0575f80fd5b919050565b5f805f60608486031215611ff7575f80fd5b61200084611fcf565b925061200e60208501611fcf565b915061201c60408501611fcf565b90509250925092565b5f805f60608486031215612037575f80fd5b833561204281611f7a565b9250602084013561205281611f7a565b929592945050506040919091013590565b5f60208284031215612073575f80fd5b8135610bab81611f7a565b8015158114610bbc575f80fd5b5f806040838503121561209c575f80fd5b82356120a781611f7a565b915060208301356120b78161207e565b809150509250929050565b5f602082840312156120d2575f80fd5b8135610bab8161207e565b5f80604083850312156120ee575f80fd5b82356120f981611f7a565b915060208301356120b781611f7a565b600181811c9082168061211d57607f821691505b60208210810361213b57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526016908201527511d85b185e1e519bde0e88185b1c9958591e481cd95d60521b604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b61ffff8181168382160190808211156121a0576121a0612171565b5092915050565b60208082526017908201527f47616c617879466f783a207a65726f2061646472657373000000000000000000604082015260600190565b5f826121f857634e487b7160e01b5f52601260045260245ffd5b500490565b5f6020828403121561220d575f80fd5b5051919050565b818103818111156109af576109af612171565b80820281158282048414176109af576109af612171565b808201808211156109af576109af612171565b80516001600160701b0381168114611fe0575f80fd5b5f805f60608486031215612279575f80fd5b61228284612251565b925061229060208501612251565b9150604084015163ffffffff811681146122a8575f80fd5b809150509250925092565b5f602082840312156122c3575f80fd5b8151610bab8161207e565b634e487b7160e01b5f52603260045260245ffd5b5f60a08201878352602087602085015260a0604085015281875180845260c0860191506020890193505f5b818110156123325784516001600160a01b03168352938301939183019160010161230d565b50506001600160a01b03969096166060850152505050608001529392505050565b5f805f60608486031215612365575f80fd5b8351925060208401519150604084015190509250925092565b5f825161238f818460208701611f26565b919091019291505056fea2646970667358221220183a02c078f663bcdb2ae338660573d04bf4ed0b31f9d2e2b0a8d0ccfb310c6564736f6c63430008170033

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

0000000000000000000000004e6647a2bda8dfe75316a72e73586ecd24d0e7000000000000000000000000004e6647a2bda8dfe75316a72e73586ecd24d0e7000000000000000000000000004e6647a2bda8dfe75316a72e73586ecd24d0e7000000000000000000000000004e6647a2bda8dfe75316a72e73586ecd24d0e7000000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d0000000000000000000000005c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f

-----Decoded View---------------
Arg [0] : _ownerArg (address): 0x4e6647a2bda8dfe75316a72E73586eCD24d0e700
Arg [1] : _ecosystemHolder (address): 0x4e6647a2bda8dfe75316a72E73586eCD24d0e700
Arg [2] : _marketingHolder (address): 0x4e6647a2bda8dfe75316a72E73586eCD24d0e700
Arg [3] : _liquidityHolder (address): 0x4e6647a2bda8dfe75316a72E73586eCD24d0e700
Arg [4] : _uniswapV2Router (address): 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
Arg [5] : _uniswapV2Factory (address): 0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000004e6647a2bda8dfe75316a72e73586ecd24d0e700
Arg [1] : 0000000000000000000000004e6647a2bda8dfe75316a72e73586ecd24d0e700
Arg [2] : 0000000000000000000000004e6647a2bda8dfe75316a72e73586ecd24d0e700
Arg [3] : 0000000000000000000000004e6647a2bda8dfe75316a72e73586ecd24d0e700
Arg [4] : 0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d
Arg [5] : 0000000000000000000000005c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f


Deployed Bytecode Sourcemap

43124:16425:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46697:10;-1:-1:-1;;;;;46719:9:0;46697:32;;46689:59;;;;-1:-1:-1;;;46689:59:0;;216:2:1;46689:59:0;;;198:21:1;255:2;235:18;;;228:30;-1:-1:-1;;;274:18:1;;;267:44;328:18;;46689:59:0;;;;;;;;;43124:16425;;;;;7758:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44093:53;;;;;;;;;;;;;;;;;;;1159:25:1;;;1147:2;1132:18;44093:53:0;1013:177:1;10076:215:0;;;;;;;;;;-1:-1:-1;10076:215:0;;;;;:::i;:::-;;:::i;:::-;;;1816:14:1;;1809:22;1791:41;;1779:2;1764:18;10076:215:0;1651:187:1;50467:340:0;;;;;;;;;;-1:-1:-1;50467:340:0;;;;;:::i;:::-;;:::i;54176:392::-;;;;;;;;;;-1:-1:-1;54176:392:0;;;;;:::i;:::-;;:::i;8860:99::-;;;;;;;;;;-1:-1:-1;8939:12:0;;8860:99;;47404:621;;;;;;;;;;-1:-1:-1;47404:621:0;;;;;:::i;:::-;;:::i;8711:84::-;;;;;;;;;;-1:-1:-1;8711:84:0;;8785:2;3128:36:1;;3116:2;3101:18;8711:84:0;2986:184:1;43801:32:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3339:32:1;;;3321:51;;3309:2;3294:18;43801:32:0;3175:203:1;43753:29:0;;;;;;;;;;;;;;;54686:81;;;;;;;;;;-1:-1:-1;54686:81:0;;;;;:::i;:::-;;:::i;52431:374::-;;;;;;;;;;-1:-1:-1;52431:374:0;;;;;:::i;:::-;;:::i;44027:57::-;;;;;;;;;;-1:-1:-1;44027:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;43203:88;;;;;;;;;;-1:-1:-1;43203:88:0;;;;;;;;;;;;;;;;;;;;;;;;;;4101:6:1;4134:15;;;4116:34;;4186:15;;;4181:2;4166:18;;4159:43;4238:15;;4218:18;;;4211:43;;;;4079:2;4064:18;43203:88:0;3895:365:1;43854:49:0;;;;;;;;;;-1:-1:-1;43854:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;53549:395;;;;;;;;;;-1:-1:-1;53549:395:0;;;;;:::i;:::-;;:::i;56546:483::-;;;;;;;;;;-1:-1:-1;56546:483:0;;;;;:::i;:::-;;:::i;51026:330::-;;;;;;;;;;-1:-1:-1;51026:330:0;;;;;:::i;:::-;;:::i;9022:118::-;;;;;;;;;;-1:-1:-1;9022:118:0;;;;;:::i;:::-;-1:-1:-1;;;;;9114:18:0;9087:7;9114:18;;;;;;;;;;;;9022:118;33858:103;;;;;;;;;;;;;:::i;43631:39::-;;;;;;;;;;;;;;;51558:217;;;;;;;;;;-1:-1:-1;51558:217:0;;;;;:::i;:::-;;:::i;43592:30::-;;;;;;;;;;-1:-1:-1;43592:30:0;;;;-1:-1:-1;;;43592:30:0;;;;;;33183:87;;;;;;;;;;-1:-1:-1;33256:6:0;;-1:-1:-1;;;;;33256:6:0;33183:87;;7968:95;;;;;;;;;;;;;:::i;43689:45::-;;;;;;;;;;;;;;;43421:38;;;;;;;;;;-1:-1:-1;43421:38:0;;;;-1:-1:-1;;;;;43421:38:0;;;43959:61;;;;;;;;;;-1:-1:-1;43959:61:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;46933:206;;;;;;;;;;-1:-1:-1;46933:206:0;;;;;:::i;:::-;;:::i;54937:851::-;;;;;;;;;;-1:-1:-1;54937:851:0;;;;;:::i;:::-;;:::i;44194:32::-;;;;;;;;;;;;;;;;43478:38;;;;;;;;;;-1:-1:-1;43478:38:0;;;;-1:-1:-1;;;;;43478:38:0;;;50010:221;;;;;;;;;;-1:-1:-1;50010:221:0;;;;;:::i;:::-;;:::i;52946:372::-;;;;;;;;;;-1:-1:-1;52946:372:0;;;;;:::i;:::-;;:::i;57328:67::-;;;;;;;;;;;;;:::i;43309:92::-;;;;;;;;;;-1:-1:-1;43309:92:0;;;;;;;;;;;;;;;;;;;;;;44155:32;;;;;;;;;;;;;;;;43535:38;;;;;;;;;;-1:-1:-1;43535:38:0;;;;-1:-1:-1;;;;;43535:38:0;;;9590:167;;;;;;;;;;-1:-1:-1;9590:167:0;;;;;:::i;:::-;-1:-1:-1;;;;;9722:18:0;;;9695:7;9722:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;9590:167;43912:38;;;;;;;;;;-1:-1:-1;43912:38:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;56026:362;;;;;;;;;;-1:-1:-1;56026:362:0;;;;;:::i;:::-;;:::i;51916:374::-;;;;;;;;;;-1:-1:-1;51916:374:0;;;;;:::i;:::-;;:::i;34116:220::-;;;;;;;;;;-1:-1:-1;34116:220:0;;;;;:::i;:::-;;:::i;7758:91::-;7803:13;7836:5;7829:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7758:91;:::o;10076:215::-;10174:4;3782:10;10230:31;3782:10;10246:7;10255:5;10230:8;:31::i;:::-;10279:4;10272:11;;;10076:215;;;;;:::o;50467:340::-;33069:13;:11;:13::i;:::-;50617:17:::1;;50593:20;:41:::0;50571:113:::1;;;;-1:-1:-1::0;;;50571:113:0::1;;;;;;;:::i;:::-;50695:17;:40:::0;;;50753:46:::1;::::0;1159:25:1;;;50753:46:0::1;::::0;1147:2:1;1132:18;50753:46:0::1;;;;;;;;50467:340:::0;:::o;54176:392::-;33069:13;:11;:13::i;:::-;42840:4:::1;54362:10:::0;54336:23:::1;54349:10:::0;54336;:23:::1;:::i;:::-;:36;;;;:::i;:::-;:47;;;;54314:120;;;::::0;-1:-1:-1;;;54314:120:0;;7344:2:1;54314:120:0::1;::::0;::::1;7326:21:1::0;7383:2;7363:18;;;7356:30;-1:-1:-1;;;7402:18:1;;;7395:53;7465:18;;54314:120:0::1;7142:347:1::0;54314:120:0::1;54454:39;::::0;;::::1;::::0;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;::::1;;::::0;;::::1;::::0;;;;;::::1;::::0;;;;;;54445:6:::1;:48:::0;;-1:-1:-1;;54445:48:0;;;;;::::1;;-1:-1:-1::0;;54445:48:0::1;::::0;;::::1;;::::0;;54511:49;;4116:34:1;;;4166:18;;;4159:43;;;;4218:18;;;4211:43;;;;54511:49:0::1;::::0;4064:18:1;54511:49:0::1;;;;;;;;54176:392:::0;;;:::o;47404:621::-;47544:4;;47581:31;47591:6;3782:10;9590:167;:::i;47581:31::-;47561:51;;47641:9;47631:6;:19;;47623:65;;;;-1:-1:-1;;;47623:65:0;;7696:2:1;47623:65:0;;;7678:21:1;7735:2;7715:18;;;7708:30;7774:34;7754:18;;;7747:62;-1:-1:-1;;;7825:18:1;;;7818:31;7866:19;;47623:65:0;7494:397:1;47623:65:0;-1:-1:-1;;47823:9:0;:29;47819:108;;;47871:56;47880:6;3782:10;47914:6;47902:9;:18;47922:4;47871:8;:56::i;:::-;47951:42;47967:6;47975:9;47986:6;47951:15;:42::i;:::-;48013:4;48006:11;;;47404:621;;;;;;:::o;54686:81::-;54734:25;54740:10;54752:6;54734:5;:25::i;:::-;54686:81;:::o;52431:374::-;33069:13;:11;:13::i;:::-;52565:15:::1;::::0;-1:-1:-1;;;;;52565:15:0;;::::1;52545:35:::0;;::::1;::::0;52537:70:::1;;;;-1:-1:-1::0;;;52537:70:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;52626:30:0;::::1;52618:66;;;;-1:-1:-1::0;;;52618:66:0::1;;;;;;;:::i;:::-;52695:15;:34:::0;;-1:-1:-1;;;;;;52695:34:0::1;-1:-1:-1::0;;;;;52695:34:0;::::1;::::0;;::::1;::::0;;;52747:50:::1;::::0;;8476:34:1;;;8541:2;8526:18;;8519:43;;;;52747:50:0::1;::::0;8411:18:1;52747:50:0::1;8248:320:1::0;53549:395:0;33069:13;:11;:13::i;:::-;42840:4:::1;53736:10:::0;53710:23:::1;53723:10:::0;53710;:23:::1;:::i;:::-;:36;;;;:::i;:::-;:47;;;;53688:120;;;::::0;-1:-1:-1;;;53688:120:0;;7344:2:1;53688:120:0::1;::::0;::::1;7326:21:1::0;7383:2;7363:18;;;7356:30;-1:-1:-1;;;7402:18:1;;;7395:53;7465:18;;53688:120:0::1;7142:347:1::0;53688:120:0::1;53829:39;::::0;;::::1;::::0;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;::::1;;::::0;;::::1;::::0;;;;;::::1;::::0;;;;;;53819:7:::1;:49:::0;;-1:-1:-1;;53819:49:0;;;;;::::1;;-1:-1:-1::0;;53819:49:0::1;::::0;;::::1;;::::0;;53886:50;;4116:34:1;;;4166:18;;;4159:43;;;;4218:18;;;4211:43;;;;53886:50:0::1;::::0;4064:18:1;53886:50:0::1;3895:365:1::0;56546:483:0;33069:13;:11;:13::i;:::-;56657:14:::1;;56636:17;:35:::0;56628:70:::1;;;;-1:-1:-1::0;;;56628:70:0::1;;;;;;;:::i;:::-;56851:4;56835:13;8939:12:::0;;;8860:99;56835:13:::1;:20;;;;:::i;:::-;56814:17;:41;;56792:126;;;::::0;-1:-1:-1;;;56792:126:0;;9129:2:1;56792:126:0::1;::::0;::::1;9111:21:1::0;9168:2;9148:18;;;9141:30;9207:34;9187:18;;;9180:62;-1:-1:-1;;;9258:18:1;;;9251:33;9301:19;;56792:126:0::1;8927:399:1::0;56792:126:0::1;56929:14;:34:::0;;;56981:40:::1;::::0;1159:25:1;;;56981:40:0::1;::::0;1147:2:1;1132:18;56981:40:0::1;1013:177:1::0;51026:330:0;33069:13;:11;:13::i;:::-;-1:-1:-1;;;;;51161:26:0;::::1;;::::0;;;:17:::1;:26;::::0;;;;;:38;::::1;;:26;::::0;;::::1;:38;;::::0;51139:110:::1;;;;-1:-1:-1::0;;;51139:110:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;51260:26:0;::::1;;::::0;;;:17:::1;:26;::::0;;;;;;;;:37;;-1:-1:-1;;51260:37:0::1;::::0;::::1;;::::0;;::::1;::::0;;;51315:33;;9499:51:1;;;9566:18;;;9559:50;51315:33:0::1;::::0;9472:18:1;51315:33:0::1;;;;;;;;51026:330:::0;;:::o;33858:103::-;33069:13;:11;:13::i;:::-;33923:30:::1;33950:1;33923:18;:30::i;:::-;33858:103::o:0;51558:217::-;33069:13;:11;:13::i;:::-;-1:-1:-1;;;;;51641:12:0;::::1;;::::0;;;:6:::1;:12;::::0;;;;;:25;::::1;;:12;::::0;;::::1;:25;;::::0;51633:60:::1;;;;-1:-1:-1::0;;;51633:60:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;51704:12:0;::::1;;::::0;;;:6:::1;:12;::::0;;;;;;;;:24;;-1:-1:-1;;51704:24:0::1;::::0;::::1;;::::0;;::::1;::::0;;;51746:21;;9499:51:1;;;9566:18;;;9559:50;51746:21:0::1;::::0;9472:18:1;51746:21:0::1;9331:284:1::0;7968:95:0;8015:13;8048:7;8041:14;;;;;:::i;46933:206::-;47044:4;47061:48;3782:10;47091:9;47102:6;47061:15;:48::i;:::-;-1:-1:-1;47127:4:0;46933:206;;;;:::o;54937:851::-;33069:13;:11;:13::i;:::-;-1:-1:-1;;;;;55018:29:0;::::1;55042:4;55018:29;55014:767;;55064:19;-1:-1:-1::0;;;;;55086:26:0;::::1;:132;;55197:21;55086:132;;;55132:45;::::0;-1:-1:-1;;;55132:45:0;;55171:4:::1;55132:45;::::0;::::1;3321:51:1::0;-1:-1:-1;;;;;55132:30:0;::::1;::::0;::::1;::::0;3294:18:1;;55132:45:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55064:154;;55253:1;55239:11;:15;:45;;;;-1:-1:-1::0;;;;;;55258:26:0;::::1;::::0;::::1;55239:45;55235:372;;;55305:58;-1:-1:-1::0;;;;;55305:33:0;::::1;55339:10;55351:11:::0;55305:33:::1;:58::i;:::-;55049:569;54686:81:::0;:::o;55235:372::-:1;55389:15:::0;;55385:222:::1;;55444:88;::::0;55426:12:::1;::::0;55452:10:::1;::::0;55476:11;;55426:12;55444:88;55426:12;55444:88;55476:11;55452:10;55444:88:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55425:107;;;55559:7;55551:40;;;::::0;-1:-1:-1;;;55551:40:0;;10221:2:1;55551:40:0::1;::::0;::::1;10203:21:1::0;10260:2;10240:18;;;10233:30;-1:-1:-1;;;10279:18:1;;;10272:50;10339:18;;55551:40:0::1;10019:344:1::0;55551:40:0::1;55406:201;55049:569;54686:81:::0;:::o;55014:767::-:1;55688:17;::::0;55679:4:::1;55639:19;9114:18:::0;;;;;;;;;;;55639:19;;55661:44:::1;::::0;::::1;:::i;:::-;55639:66;;55720:49;55738:4;55745:10;55757:11;55720:9;:49::i;50010:221::-:0;33069:13;:11;:13::i;:::-;50103::::1;50089:27;;:10;;;;;;;;;;;:27;;::::0;50081:62:::1;;;;-1:-1:-1::0;;;50081:62:0::1;;;;;;;:::i;:::-;50154:10;:26:::0;;;::::1;;-1:-1:-1::0;;;50154:26:0::1;-1:-1:-1::0;;;;50154:26:0;;::::1;;::::0;;50198:25:::1;::::0;::::1;::::0;::::1;::::0;50167:13;1816:14:1;1809:22;1791:41;;1779:2;1764:18;;1651:187;52946:372:0;33069:13;:11;:13::i;:::-;53080:15:::1;::::0;-1:-1:-1;;;;;53080:15:0;;::::1;53060:35:::0;;::::1;::::0;53052:70:::1;;;;-1:-1:-1::0;;;53052:70:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;53141:30:0;::::1;53133:66;;;;-1:-1:-1::0;;;53133:66:0::1;;;;;;;:::i;:::-;53210:15;:34:::0;;-1:-1:-1;;;;;;53210:34:0::1;-1:-1:-1::0;;;;;53210:34:0;::::1;::::0;;::::1;::::0;;;53260:50:::1;::::0;;8476:34:1;;;8541:2;8526:18;;8519:43;;;;53260:50:0::1;::::0;8411:18:1;53260:50:0::1;8248:320:1::0;57328:67:0;33069:13;:11;:13::i;:::-;57377:10:::1;:8;:10::i;56026:362::-:0;33069:13;:11;:13::i;:::-;-1:-1:-1;;;;;56168:34:0;::::1;;::::0;;;:25:::1;:34;::::0;;;;;:46;::::1;;:34;::::0;;::::1;:46;;::::0;56146:118:::1;;;;-1:-1:-1::0;;;56146:118:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;56275:34:0;::::1;;::::0;;;:25:::1;:34;::::0;;;;;;;;:45;;-1:-1:-1;;56275:45:0::1;::::0;::::1;;::::0;;::::1;::::0;;;56338:42;;9499:51:1;;;9566:18;;;9559:50;56338:42:0::1;::::0;9472:18:1;56338:42:0::1;9331:284:1::0;51916:374:0;33069:13;:11;:13::i;:::-;52050:15:::1;::::0;-1:-1:-1;;;;;52050:15:0;;::::1;52030:35:::0;;::::1;::::0;52022:70:::1;;;;-1:-1:-1::0;;;52022:70:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;52111:30:0;::::1;52103:66;;;;-1:-1:-1::0;;;52103:66:0::1;;;;;;;:::i;:::-;52180:15;:34:::0;;-1:-1:-1;;;;;;52180:34:0::1;-1:-1:-1::0;;;;;52180:34:0;::::1;::::0;;::::1;::::0;;;52232:50:::1;::::0;;8476:34:1;;;8541:2;8526:18;;8519:43;;;;52232:50:0::1;::::0;8411:18:1;52232:50:0::1;8248:320:1::0;34116:220:0;33069:13;:11;:13::i;:::-;-1:-1:-1;;;;;34201:22:0;::::1;34197:93;;34247:31;::::0;-1:-1:-1;;;34247:31:0;;34275:1:::1;34247:31;::::0;::::1;3321:51:1::0;3294:18;;34247:31:0::1;3175:203:1::0;34197:93:0::1;34300:28;34319:8;34300:18;:28::i;14962:130::-:0;15047:37;15056:5;15063:7;15072:5;15079:4;15047:8;:37::i;33348:166::-;33256:6;;-1:-1:-1;;;;;33256:6:0;3782:10;33408:23;33404:103;;33455:40;;-1:-1:-1;;;33455:40:0;;3782:10;33455:40;;;3321:51:1;3294:18;;33455:40:0;3175:203:1;15943:486:0;-1:-1:-1;;;;;16099:19:0;;16095:91;;16142:32;;-1:-1:-1;;;16142:32:0;;16171:1;16142:32;;;3321:51:1;3294:18;;16142:32:0;3175:203:1;16095:91:0;-1:-1:-1;;;;;16200:21:0;;16196:92;;16245:31;;-1:-1:-1;;;16245:31:0;;16273:1;16245:31;;;3321:51:1;3294:18;;16245:31:0;3175:203:1;16196:92:0;-1:-1:-1;;;;;16298:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;:35;;;16344:78;;;;16395:7;-1:-1:-1;;;;;16379:31:0;16388:5;-1:-1:-1;;;;;16379:31:0;;16404:5;16379:31;;;;1159:25:1;;1147:2;1132:18;;1013:177;16379:31:0;;;;;;;;16344:78;15943:486;;;;:::o;48033:1845::-;48177:7;-1:-1:-1;;;;;48167:17:0;:6;-1:-1:-1;;;;;48167:17:0;;48163:33;;48186:10;:8;:10::i;:::-;48228;;-1:-1:-1;;;48228:10:0;;;;48227:11;;:53;;-1:-1:-1;;;;;;48255:25:0;;;;;;:17;:25;;;;;;;;48227:53;:98;;;-1:-1:-1;;;;;;48297:28:0;;;;;;:17;:28;;;;;;;;48227:98;:154;;;-1:-1:-1;;;;;;48344:17:0;;;;;;:6;:17;;;;;;;;48343:18;:37;;;;-1:-1:-1;;;;;;48366:14:0;;;;;;:6;:14;;;;;;;;48365:15;48343:37;48227:182;;;;48398:6;;48408:1;48398:11;48227:182;48209:1143;;;48436:36;48446:6;48454:9;48465:6;48436:9;:36::i;:::-;48209:1143;;;-1:-1:-1;;;;;48522:17:0;;48505:14;48522:17;;;:6;:17;;;;;;;;:36;;48551:7;48522:36;;;48542:6;48522:36;48505:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42803:5:0;;48619:22;;:6;:22;:::i;:::-;48618:35;;;;:::i;:::-;48595:58;;48668:20;42803:5;48701:3;:13;;;48692:22;;:6;:22;;;;:::i;:::-;48691:35;;;;:::i;:::-;48668:58;;48741:20;42803:5;48774:3;:13;;;48765:22;;:6;:22;;;;:::i;:::-;48764:35;;;;:::i;:::-;48741:58;-1:-1:-1;48820:16:0;;48816:87;;48873:15;;48855:48;;48865:6;;-1:-1:-1;;;;;48873:15:0;48890:12;48855:9;:48::i;:::-;48922:16;;48918:87;;48975:15;;48957:48;;48967:6;;-1:-1:-1;;;;;48975:15:0;48992:12;48957:9;:48::i;:::-;49022:147;49050:6;49075:9;49142:12;49127;49103:21;49112:12;49103:6;:21;:::i;:::-;:36;;;;:::i;:::-;:51;;;;:::i;:::-;49022:9;:147::i;:::-;49190:16;;49186:155;;49248:12;49227:17;;:33;;;;;;;:::i;:::-;;;;-1:-1:-1;49279:46:0;;-1:-1:-1;49289:6:0;49305:4;49312:12;49279:9;:46::i;:::-;48490:862;;;;48209:1143;-1:-1:-1;;;;;49616:14:0;;49561;49616;;;:6;:14;;;;;;;;42880:6;49578:15;:21;49616:22;;;;;;;;:32;;;;;;;;49715:14;;-1:-1:-1;49689:40:0;;:98;;-1:-1:-1;;;;;;49754:33:0;;;;;;:25;:33;;;;;;;;49689:98;49663:196;;;;-1:-1:-1;;;49663:196:0;;11006:2:1;49663:196:0;;;10988:21:1;11045:2;11025:18;;;11018:30;11084:34;11064:18;;;11057:62;-1:-1:-1;;;11135:18:1;;;11128:34;11179:19;;49663:196:0;10804:400:1;14198:211:0;-1:-1:-1;;;;;14269:21:0;;14265:91;;14314:30;;-1:-1:-1;;;14314:30:0;;14341:1;14314:30;;;3321:51:1;3294:18;;14314:30:0;3175:203:1;14265:91:0;14366:35;14374:7;14391:1;14395:5;14366:7;:35::i;34496:191::-;34589:6;;;-1:-1:-1;;;;;34606:17:0;;;-1:-1:-1;;;;;;34606:17:0;;;;;;;34639:40;;34589:6;;;34606:17;34589:6;;34639:40;;34570:16;;34639:40;34559:128;34496:191;:::o;26607:162::-;26717:43;;;-1:-1:-1;;;;;11401:32:1;;26717:43:0;;;11383:51:1;11450:18;;;;11443:34;;;26717:43:0;;;;;;;;;;11356:18:1;;;;26717:43:0;;;;;;;;-1:-1:-1;;;;;26717:43:0;-1:-1:-1;;;26717:43:0;;;26690:71;;26710:5;;26690:19;:71::i;11537:308::-;-1:-1:-1;;;;;11621:18:0;;11617:88;;11663:30;;-1:-1:-1;;;11663:30:0;;11690:1;11663:30;;;3321:51:1;3294:18;;11663:30:0;3175:203:1;11617:88:0;-1:-1:-1;;;;;11719:16:0;;11715:88;;11759:32;;-1:-1:-1;;;11759:32:0;;11788:1;11759:32;;;3321:51:1;3294:18;;11759:32:0;3175:203:1;11715:88:0;11813:24;11821:4;11827:2;11831:5;11813:7;:24::i;57403:1141::-;57446:6;;57456:1;57446:11;57442:24;;57403:1141::o;57442:24::-;57502:17;;57482;;:37;57478:1059;;;57545:1;57536:6;:10;;;;57601:17;57620;57658:7;-1:-1:-1;;;;;57643:53:0;;:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;57600:98:0;;;;-1:-1:-1;57600:98:0;;-1:-1:-1;57782:21:0;-1:-1:-1;;;;;57822:4:0;57806:20;57814:4;57806:20;:78;;57875:9;57806:78;;;57846:9;57806:78;57782:102;-1:-1:-1;58001:17:0;58044:3;58022:18;57782:102;58038:2;58022:18;:::i;:::-;58021:26;;;;:::i;:::-;58001:46;;58064:14;58101:9;58081:17;;:29;:95;;58159:17;;58081:95;;;58130:9;58081:95;58064:112;-1:-1:-1;58193:12:0;58208:10;58217:1;58064:112;58208:10;:::i;:::-;58193:25;-1:-1:-1;58271:17:0;58291:13;58193:25;58291:6;:13;:::i;:::-;58271:33;;58321:23;58339:4;58321:17;:23::i;:::-;58382:21;58420:36;58434:9;58382:21;58420:13;:36::i;:::-;58494:6;58473:17;;:27;;;;;;;:::i;:::-;;;;-1:-1:-1;;58524:1:0;58515:6;:10;-1:-1:-1;;;;;;;;57403:1141:0:o;12169:1135::-;-1:-1:-1;;;;;12259:18:0;;12255:552;;12413:5;12397:12;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;12255:552:0;;-1:-1:-1;12255:552:0;;-1:-1:-1;;;;;12473:15:0;;12451:19;12473:15;;;;;;;;;;;12507:19;;;12503:117;;;12554:50;;-1:-1:-1;;;12554:50:0;;-1:-1:-1;;;;;12356:32:1;;12554:50:0;;;12338:51:1;12405:18;;;12398:34;;;12448:18;;;12441:34;;;12311:18;;12554:50:0;12136:345:1;12503:117:0;-1:-1:-1;;;;;12743:15:0;;:9;:15;;;;;;;;;;12761:19;;;;12743:37;;12255:552;-1:-1:-1;;;;;12823:16:0;;12819:435;;12989:12;:21;;;;;;;12819:435;;;-1:-1:-1;;;;;13205:13:0;;:9;:13;;;;;;;;;;:22;;;;;;12819:435;13286:2;-1:-1:-1;;;;;13271:25:0;13280:4;-1:-1:-1;;;;;13271:25:0;;13290:5;13271:25;;;;1159::1;;1147:2;1132:18;;1013:177;13271:25:0;;;;;;;;12169:1135;;;:::o;29768:638::-;30192:23;30218:33;-1:-1:-1;;;;;30218:27:0;;30246:4;30218:27;:33::i;:::-;30192:59;;30266:10;:17;30287:1;30266:22;;:57;;;;;30304:10;30293:30;;;;;;;;;;;;:::i;:::-;30292:31;30266:57;30262:137;;;30347:40;;-1:-1:-1;;;30347:40:0;;-1:-1:-1;;;;;3339:32:1;;30347:40:0;;;3321:51:1;3294:18;;30347:40:0;3175:203:1;58552:589:0;58704:16;;;58718:1;58704:16;;;;;;;;58680:21;;58704:16;;;;;;;;;;-1:-1:-1;58704:16:0;58680:40;;58749:4;58731;58736:1;58731:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;58731:23:0;;;-1:-1:-1;;;;;58731:23:0;;;;;58775:4;58765;58770:1;58765:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;58765:14:0;;;:7;;;;;;;;;:14;58871:242;;-1:-1:-1;;;58871:242:0;;:9;:60;;;;;;:242;;58950:11;;58980:1;;59028:4;;59059;;59083:15;;58871:242;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58854:280;;;58609:532;58552:589;:::o;59149:397::-;59454:15;;59290:228;;-1:-1:-1;;;59290:228:0;;59360:4;59290:228;;;14334:34:1;14384:18;;;14377:34;;;59414:1:0;14427:18:1;;;14420:34;;;14470:18;;;14463:34;-1:-1:-1;;;;;59454:15:0;;;14513:19:1;;;14506:44;59488:15:0;14566:19:1;;;14559:35;59290:9:0;:25;;;;;;59323:9;;14268:19:1;;59290:228:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59290:228:0;;;;;;;;-1:-1:-1;;59290:228:0;;;;;;;;;;;;:::i;:::-;;;59273:266;;;;;;59149:397;;:::o;21643:178::-;21743:12;21775:38;21797:6;21805:4;21811:1;21743:12;22435;22449:23;22476:6;-1:-1:-1;;;;;22476:11:0;22495:5;22516:4;22476:55;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22434:97;;;;22549:55;22576:6;22584:7;22593:10;22549:26;:55::i;:::-;22542:62;22156:456;-1:-1:-1;;;;;;22156:456:0:o;23740:597::-;23888:12;23918:7;23913:417;;23942:19;23950:10;23942:7;:19::i;:::-;23913:417;;;24170:17;;:22;:49;;;;-1:-1:-1;;;;;;24196:18:0;;;:23;24170:49;24166:121;;;24247:24;;-1:-1:-1;;;24247:24:0;;-1:-1:-1;;;;;3339:32:1;;24247:24:0;;;3321:51:1;3294:18;;24247:24:0;3175:203:1;24166:121:0;-1:-1:-1;24308:10:0;24301:17;;24915:528;25048:17;;:21;25044:392;;25280:10;25274:17;25337:15;25324:10;25320:2;25316:19;25309:44;25044:392;25407:17;;-1:-1:-1;;;25407:17:0;;;;;;;;;;;357:250:1;442:1;452:113;466:6;463:1;460:13;452:113;;;542:11;;;536:18;523:11;;;516:39;488:2;481:10;452:113;;;-1:-1:-1;;599:1:1;581:16;;574:27;357:250::o;612:396::-;761:2;750:9;743:21;724:4;793:6;787:13;836:6;831:2;820:9;816:18;809:34;852:79;924:6;919:2;908:9;904:18;899:2;891:6;887:15;852:79;:::i;:::-;992:2;971:15;-1:-1:-1;;967:29:1;952:45;;;;999:2;948:54;;612:396;-1:-1:-1;;612:396:1:o;1195:131::-;-1:-1:-1;;;;;1270:31:1;;1260:42;;1250:70;;1316:1;1313;1306:12;1331:315;1399:6;1407;1460:2;1448:9;1439:7;1435:23;1431:32;1428:52;;;1476:1;1473;1466:12;1428:52;1515:9;1502:23;1534:31;1559:5;1534:31;:::i;:::-;1584:5;1636:2;1621:18;;;;1608:32;;-1:-1:-1;;;1331:315:1:o;1843:180::-;1902:6;1955:2;1943:9;1934:7;1930:23;1926:32;1923:52;;;1971:1;1968;1961:12;1923:52;-1:-1:-1;1994:23:1;;1843:180;-1:-1:-1;1843:180:1:o;2028:159::-;2095:20;;2155:6;2144:18;;2134:29;;2124:57;;2177:1;2174;2167:12;2124:57;2028:159;;;:::o;2192:328::-;2266:6;2274;2282;2335:2;2323:9;2314:7;2310:23;2306:32;2303:52;;;2351:1;2348;2341:12;2303:52;2374:28;2392:9;2374:28;:::i;:::-;2364:38;;2421:37;2454:2;2443:9;2439:18;2421:37;:::i;:::-;2411:47;;2477:37;2510:2;2499:9;2495:18;2477:37;:::i;:::-;2467:47;;2192:328;;;;;:::o;2525:456::-;2602:6;2610;2618;2671:2;2659:9;2650:7;2646:23;2642:32;2639:52;;;2687:1;2684;2677:12;2639:52;2726:9;2713:23;2745:31;2770:5;2745:31;:::i;:::-;2795:5;-1:-1:-1;2852:2:1;2837:18;;2824:32;2865:33;2824:32;2865:33;:::i;:::-;2525:456;;2917:7;;-1:-1:-1;;;2971:2:1;2956:18;;;;2943:32;;2525:456::o;3383:255::-;3450:6;3503:2;3491:9;3482:7;3478:23;3474:32;3471:52;;;3519:1;3516;3509:12;3471:52;3558:9;3545:23;3577:31;3602:5;3577:31;:::i;4265:118::-;4351:5;4344:13;4337:21;4330:5;4327:32;4317:60;;4373:1;4370;4363:12;4388:382;4453:6;4461;4514:2;4502:9;4493:7;4489:23;4485:32;4482:52;;;4530:1;4527;4520:12;4482:52;4569:9;4556:23;4588:31;4613:5;4588:31;:::i;:::-;4638:5;-1:-1:-1;4695:2:1;4680:18;;4667:32;4708:30;4667:32;4708:30;:::i;:::-;4757:7;4747:17;;;4388:382;;;;;:::o;5462:241::-;5518:6;5571:2;5559:9;5550:7;5546:23;5542:32;5539:52;;;5587:1;5584;5577:12;5539:52;5626:9;5613:23;5645:28;5667:5;5645:28;:::i;5708:388::-;5776:6;5784;5837:2;5825:9;5816:7;5812:23;5808:32;5805:52;;;5853:1;5850;5843:12;5805:52;5892:9;5879:23;5911:31;5936:5;5911:31;:::i;:::-;5961:5;-1:-1:-1;6018:2:1;6003:18;;5990:32;6031:33;5990:32;6031:33;:::i;6101:380::-;6180:1;6176:12;;;;6223;;;6244:61;;6298:4;6290:6;6286:17;6276:27;;6244:61;6351:2;6343:6;6340:14;6320:18;6317:38;6314:161;;6397:10;6392:3;6388:20;6385:1;6378:31;6432:4;6429:1;6422:15;6460:4;6457:1;6450:15;6314:161;;6101:380;;;:::o;6486:346::-;6688:2;6670:21;;;6727:2;6707:18;;;6700:30;-1:-1:-1;;;6761:2:1;6746:18;;6739:52;6823:2;6808:18;;6486:346::o;6837:127::-;6898:10;6893:3;6889:20;6886:1;6879:31;6929:4;6926:1;6919:15;6953:4;6950:1;6943:15;6969:168;7036:6;7062:10;;;7074;;;7058:27;;7097:11;;;7094:37;;;7111:18;;:::i;:::-;7094:37;6969:168;;;;:::o;7896:347::-;8098:2;8080:21;;;8137:2;8117:18;;;8110:30;8176:25;8171:2;8156:18;;8149:53;8234:2;8219:18;;7896:347::o;8705:217::-;8745:1;8771;8761:132;;8815:10;8810:3;8806:20;8803:1;8796:31;8850:4;8847:1;8840:15;8878:4;8875:1;8868:15;8761:132;-1:-1:-1;8907:9:1;;8705:217::o;9620:184::-;9690:6;9743:2;9731:9;9722:7;9718:23;9714:32;9711:52;;;9759:1;9756;9749:12;9711:52;-1:-1:-1;9782:16:1;;9620:184;-1:-1:-1;9620:184:1:o;10368:128::-;10435:9;;;10456:11;;;10453:37;;;10470:18;;:::i;10501:168::-;10574:9;;;10605;;10622:15;;;10616:22;;10602:37;10592:71;;10643:18;;:::i;10674:125::-;10739:9;;;10760:10;;;10757:36;;;10773:18;;:::i;11488:188::-;11567:13;;-1:-1:-1;;;;;11609:42:1;;11599:53;;11589:81;;11666:1;11663;11656:12;11681:450;11768:6;11776;11784;11837:2;11825:9;11816:7;11812:23;11808:32;11805:52;;;11853:1;11850;11843:12;11805:52;11876:40;11906:9;11876:40;:::i;:::-;11866:50;;11935:49;11980:2;11969:9;11965:18;11935:49;:::i;:::-;11925:59;;12027:2;12016:9;12012:18;12006:25;12071:10;12064:5;12060:22;12053:5;12050:33;12040:61;;12097:1;12094;12087:12;12040:61;12120:5;12110:15;;;11681:450;;;;;:::o;12486:245::-;12553:6;12606:2;12594:9;12585:7;12581:23;12577:32;12574:52;;;12622:1;12619;12612:12;12574:52;12654:9;12648:16;12673:28;12695:5;12673:28;:::i;12868:127::-;12929:10;12924:3;12920:20;12917:1;12910:31;12960:4;12957:1;12950:15;12984:4;12981:1;12974:15;13000:980;13262:4;13310:3;13299:9;13295:19;13341:6;13330:9;13323:25;13367:2;13405:6;13400:2;13389:9;13385:18;13378:34;13448:3;13443:2;13432:9;13428:18;13421:31;13472:6;13507;13501:13;13538:6;13530;13523:22;13576:3;13565:9;13561:19;13554:26;;13615:2;13607:6;13603:15;13589:29;;13636:1;13646:195;13660:6;13657:1;13654:13;13646:195;;;13725:13;;-1:-1:-1;;;;;13721:39:1;13709:52;;13816:15;;;;13781:12;;;;13757:1;13675:9;13646:195;;;-1:-1:-1;;;;;;;13897:32:1;;;;13892:2;13877:18;;13870:60;-1:-1:-1;;;13961:3:1;13946:19;13939:35;13858:3;13000:980;-1:-1:-1;;;13000:980:1:o;14605:306::-;14693:6;14701;14709;14762:2;14750:9;14741:7;14737:23;14733:32;14730:52;;;14778:1;14775;14768:12;14730:52;14807:9;14801:16;14791:26;;14857:2;14846:9;14842:18;14836:25;14826:35;;14901:2;14890:9;14886:18;14880:25;14870:35;;14605:306;;;;;:::o;14916:287::-;15045:3;15083:6;15077:13;15099:66;15158:6;15153:3;15146:4;15138:6;15134:17;15099:66;:::i;:::-;15181:16;;;;;14916:287;-1:-1:-1;;14916:287:1:o

Swarm Source

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