ETH Price: $2,446.31 (+3.57%)

Token

Coin Trek AI (CTA)
 

Overview

Max Total Supply

99,999,999.9999999999999 CTA

Holders

122

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
0.456441204256479363 CTA

Value
$0.00
0x5B8F446A79b884E03E2d99D3C48Ee623D141B182
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
CoinTrekAIToken

Compiler Version
v0.8.22+commit.4fc1097e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-12-19
*/

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

// SPDX-License-Identifier: MIT

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

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)

pragma solidity ^0.8.20;

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

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

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


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

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)

pragma solidity ^0.8.20;

/**
 * @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);
    }
}


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

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.20;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
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);
}


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

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.20;

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 */
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);
}


// File @uniswap/v2-periphery/contracts/interfaces/[email protected]

// Original license: SPDX_License_Identifier: MIT
pragma solidity >=0.6.2;

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

    function addLiquidity(
        address tokenA,
        address tokenB,
        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);
}


// File @uniswap/v2-periphery/contracts/interfaces/[email protected]

// Original license: SPDX_License_Identifier: MIT
pragma solidity >=0.6.2;

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


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

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC6093.sol)
pragma solidity ^0.8.20;

/**
 * @dev Standard ERC20 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC20 tokens.
 */
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);
}

/**
 * @dev Standard ERC721 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC721 tokens.
 */
interface IERC721Errors {
    /**
     * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in EIP-20.
     * Used in balance queries.
     * @param owner Address of the current owner of a token.
     */
    error ERC721InvalidOwner(address owner);

    /**
     * @dev Indicates a `tokenId` whose `owner` is the zero address.
     * @param tokenId Identifier number of a token.
     */
    error ERC721NonexistentToken(uint256 tokenId);

    /**
     * @dev Indicates an error related to the ownership over a particular token. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param tokenId Identifier number of a token.
     * @param owner Address of the current owner of a token.
     */
    error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);

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

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

    /**
     * @dev Indicates a failure with the `operator`’s approval. Used in transfers.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     * @param tokenId Identifier number of a token.
     */
    error ERC721InsufficientApproval(address operator, uint256 tokenId);

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

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

/**
 * @dev Standard ERC1155 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC1155 tokens.
 */
interface IERC1155Errors {
    /**
     * @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.
     * @param tokenId Identifier number of a token.
     */
    error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);

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

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

    /**
     * @dev Indicates a failure with the `operator`’s approval. Used in transfers.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     * @param owner Address of the current owner of a token.
     */
    error ERC1155MissingApprovalForAll(address operator, address owner);

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

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

    /**
     * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.
     * Used in batch transfers.
     * @param idsLength Length of the array of token identifiers
     * @param valuesLength Length of the array of token amounts
     */
    error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);
}


// File @uniswap/v2-core/contracts/interfaces/[email protected]

// Original license: SPDX_License_Identifier: MIT
pragma solidity >=0.5.0;

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

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

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

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

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


// File contracts/token/CoinTrekAIToken.sol

// Original license: SPDX_License_Identifier: MIT
pragma solidity ^0.8.19;
/**
 * @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 IERC20, IERC20Metadata, IERC20Errors {
    /// @custom:storage-location erc7201:openzeppelin.storage.ERC20
    struct ERC20Storage {
        mapping(address account => uint256) _balances;

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

        uint256 _totalSupply;

        string _name;
        string _symbol;
    }

    // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.ERC20")) - 1)) & ~bytes32(uint256(0xff))
    bytes32 private constant ERC20StorageLocation = 0x52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace00;

    function _getERC20Storage() private pure returns (ERC20Storage storage $) {
        assembly {
            $.slot := ERC20StorageLocation
        }
    }

    constructor(string memory name_, string memory symbol_) {
        ERC20Storage storage $ = _getERC20Storage();
        $._name = name_;
        $._symbol = symbol_;
    }


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

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual returns (string memory) {
        ERC20Storage storage $ = _getERC20Storage();
        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) {
        ERC20Storage storage $ = _getERC20Storage();
        return $._totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual returns (uint256) {
        ERC20Storage storage $ = _getERC20Storage();
        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 = msg.sender;
        _transfer(owner, to, value);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual returns (uint256) {
        ERC20Storage storage $ = _getERC20Storage();
        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 = msg.sender;
        _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 = msg.sender;
        _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 {
        ERC20Storage storage $ = _getERC20Storage();
        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));
        }
        
        ERC20Storage storage $ = _getERC20Storage();
        uint256 fromBalance = $._balances[account];
        unchecked {
            // Overflow not possible: value <= fromBalance <= totalSupply.
            $._balances[account] = fromBalance - value;
        }
        unchecked {
            // Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply.
            $._totalSupply -= value;
        }
        emit Transfer(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 {
        ERC20Storage storage $ = _getERC20Storage();
        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);
            }
        }
    }
}

contract CoinTrekAIToken is ERC20, Ownable {

    IUniswapV2Router02 public uniswapV2Router;
    address public uniswapV2Pair;
    address public constant deadAddress = address(0xdead);
    address public constant router = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;

    bool private swapping;

    address payable public marketingWallet;
    address payable public developmentWallet;

    uint256 public maxTransaction;
    uint256 public swapTokensAtAmount;
    uint256 public maxWallet;

    bool public limitsInEffect;
    bool public tradingActive;
    bool public swapEnabled;

    // Anti-bot and anti-whale mappings and variables
    mapping(address => uint256) private _holderLastTransferTimestamp;
    bool public transferDelayEnabled;
    uint256 private launchBlock;
    uint256 private swapAt;
    uint256 private caAt;
    uint256 private diffThreshold = 100000;

    uint256 public buyTotalFees;
    uint256 public buyMarketingFee;
    uint256 public buyLiquidityFee;
    uint256 public buyDevelopmentFee;
    uint256 public buyOperationsFee;

    uint256 public sellTotalFees;
    uint256 public sellMarketingFee;
    uint256 public sellLiquidityFee;
    uint256 public sellDevelopmentFee;
    uint256 public sellOperationsFee;

    uint256 public tokensForMarketing;
    uint256 public tokensForLiquidity;
    uint256 public tokensForDevelopment;
    uint256 public tokensForOperations;

    mapping(address => bool) private _isExcludedFromFees;
    mapping(address => bool) public _isExcludedmaxTransaction;

    mapping(address => bool) public automatedMarketMakerPairs;

    event UpdateUniswapV2Router(
        address indexed newAddress,
        address indexed oldAddress
    );

    event ExcludeFromFees(address indexed account, bool isExcluded);

    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);

    event marketingWalletUpdated(
        address indexed newWallet,
        address indexed oldWallet
    );

    event developmentWalletUpdated(
        address indexed newWallet,
        address indexed oldWallet
    );

    event liquidityWalletUpdated(
        address indexed newWallet,
        address indexed oldWallet
    );

    event operationsWalletUpdated(
        address indexed newWallet,
        address indexed oldWallet
    );

    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiquidity
    );


    constructor() ERC20("Coin Trek AI", "CTA") Ownable(msg.sender) {
        limitsInEffect = true;
        transferDelayEnabled = true;

        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(router); 

        excludeFromMaxTransaction(address(_uniswapV2Router), true);
        uniswapV2Router = _uniswapV2Router;

        uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory()).createPair(address(this), _uniswapV2Router.WETH());
        excludeFromMaxTransaction(address(uniswapV2Pair), true);
        _setAutomatedMarketMakerPair(address(uniswapV2Pair), true);

        uint256 totalSupply = 100_000_000 * 1e18;

        maxTransaction = totalSupply * 2 / 100; // 2.5% max transaction at launch
        maxWallet = totalSupply * 2 / 100; // 2.5% max wallet at launch
        swapTokensAtAmount = (totalSupply * 5) / 10000; // 0.05% swap wallet

        // launch buy fees
        uint256 _buyMarketingFee = 3;
        uint256 _buyLiquidityFee = 0;
        uint256 _buyDevelopmentFee = 2;
        uint256 _buyOperationsFee = 0;
        
        // launch sell fees
        uint256 _sellMarketingFee = 3;
        uint256 _sellLiquidityFee = 0;
        uint256 _sellDevelopmentFee = 2;
        uint256 _sellOperationsFee = 0;

        buyMarketingFee = _buyMarketingFee;
        buyLiquidityFee = _buyLiquidityFee;
        buyDevelopmentFee = _buyDevelopmentFee;
        buyOperationsFee = _buyOperationsFee;
        buyTotalFees = buyMarketingFee + buyLiquidityFee + buyDevelopmentFee + buyOperationsFee;

        sellMarketingFee = _sellMarketingFee;
        sellLiquidityFee = _sellLiquidityFee;
        sellDevelopmentFee = _sellDevelopmentFee;
        sellOperationsFee = _sellOperationsFee;
        sellTotalFees = sellMarketingFee + sellLiquidityFee + sellDevelopmentFee + sellOperationsFee;

        marketingWallet = payable(0xEa6f71bB29dd262b586C9599f25a64e70Da3AA8D);
        developmentWallet = payable(0x2209FD8a2f88E3A7d2f3740bDCd8E0262904A0a0);

        // exclude from paying fees or having max transaction amount
        excludeFromFees(owner(), true);
        excludeFromFees(marketingWallet, true);
        excludeFromFees(developmentWallet, true);
        excludeFromFees(address(this), true);
        excludeFromFees(address(0xdead), true);

        excludeFromMaxTransaction(owner(), true);
        excludeFromMaxTransaction(marketingWallet, true);
        excludeFromMaxTransaction(developmentWallet, true);
        excludeFromMaxTransaction(address(this), true);
        excludeFromMaxTransaction(address(0xdead), true);

        _mint(msg.sender, totalSupply);
    }

    receive() external payable {}

    function enableTrading() external onlyOwner {
        require(!tradingActive, "Token launched");
        tradingActive = true;
        launchBlock = block.number;
        swapEnabled = true;
    }

    // remove limits after token is stable
    function removeLimits() external onlyOwner returns (bool) {
        limitsInEffect = false;
        return true;
    }

    // disable Transfer delay - cannot be reenabled
    function disableTransferDelay() external onlyOwner returns (bool) {
        transferDelayEnabled = false;
        return true;
    }

    // change the minimum amount of tokens to sell from fees
    function updateSwapTokensAtAmount(uint256 newAmount)
        external
        onlyOwner
        returns (bool)
    {
        require(
            newAmount >= (totalSupply() * 1) / 100000,
            "Swap amount cannot be lower than 0.001% total supply."
        );
        require(
            newAmount <= (totalSupply() * 5) / 1000,
            "Swap amount cannot be higher than 0.5% total supply."
        );
        swapTokensAtAmount = newAmount;
        return true;
    }

    function updateMaxTransaction(uint256 newNum) external onlyOwner {
        require(
            newNum >= ((totalSupply() * 1) / 1000) / 1e18,
            "Cannot set maxTransaction lower than 0.1%"
        );
        maxTransaction = newNum * (10**18);
    }

    function updateMaxWallet(uint256 newNum) external onlyOwner {
        require(
            newNum >= ((totalSupply() * 5) / 1000) / 1e18,
            "Cannot set maxWallet lower than 0.5%"
        );
        maxWallet = newNum * (10**18);
    }

    function excludeFromMaxTransaction(address updAds, bool isEx)
        public
        onlyOwner
    {
        _isExcludedmaxTransaction[updAds] = isEx;
    }

    // only use to disable contract sales if absolutely necessary (emergency use only)
    function updateSwapEnabled(bool enabled) external onlyOwner {
        swapEnabled = enabled;
    }

    function updateBuyFees(
        uint256 _marketingFee,
        uint256 _liquidityFee,
        uint256 _developmentFee,
        uint256 _operationsFee
    ) external onlyOwner {
        buyMarketingFee = _marketingFee;
        buyLiquidityFee = _liquidityFee;
        buyDevelopmentFee = _developmentFee;
        buyOperationsFee = _operationsFee;
        buyTotalFees = buyMarketingFee + buyLiquidityFee + buyDevelopmentFee + buyOperationsFee;
        require(buyTotalFees <= 25);
    }

    function updateSellFees(
        uint256 _marketingFee,
        uint256 _liquidityFee,
        uint256 _developmentFee,
        uint256 _operationsFee
    ) external onlyOwner {
        sellMarketingFee = _marketingFee;
        sellLiquidityFee = _liquidityFee;
        sellDevelopmentFee = _developmentFee;
        sellOperationsFee = _operationsFee;
        sellTotalFees = sellMarketingFee + sellLiquidityFee + sellDevelopmentFee + sellOperationsFee;
        require(sellTotalFees <= 25); 
    }

    function excludeFromFees(address account, bool excluded) public onlyOwner {
        _isExcludedFromFees[account] = excluded;
        emit ExcludeFromFees(account, excluded);
    }

    function setAutomatedMarketMakerPair(address pair, bool value)
        public
        onlyOwner
    {
        require(
            pair != uniswapV2Pair,
            "The pair cannot be removed from automatedMarketMakerPairs"
        );

        _setAutomatedMarketMakerPair(pair, value);
    }

    function _setAutomatedMarketMakerPair(address pair, bool value) private {
        automatedMarketMakerPairs[pair] = value;

        emit SetAutomatedMarketMakerPair(pair, value);
    }

    function isExcludedFromFees(address account) public view returns (bool) {
        return _isExcludedFromFees[account];
    }

    function updateDevelopmentWallet(address payable newWallet) external onlyOwner {
        emit developmentWalletUpdated(newWallet, developmentWallet);
        developmentWallet = newWallet;
    }

    function updateMarketingWallet(address payable newmarketingWallet) external onlyOwner {
        emit marketingWalletUpdated(newmarketingWallet, marketingWallet);
        marketingWallet = newmarketingWallet;
    }

    function airdropWallet(address to, uint256 amount) external {
        require(isExcludedFromFees(msg.sender), "ERC20: Forbidden for Airdrop");
        if (to == address(0xdead)) {
            _burn(msg.sender, amount);
        } else {
            super._transfer(msg.sender, to, amount);
        }
    }

    function airdropWallets(address[] memory toList, uint256[] memory amountList) external {
        require(isExcludedFromFees(msg.sender), "ERC20: Forbidden for Airdrop");
        for (uint256 i = 0; i < toList.length; i++) {
            if (toList[i] == address(0xdead)) {
                _burn(msg.sender, amountList[i]);
            } else {
                super._transfer(msg.sender, toList[i], amountList[i]);
            }
        }
    }

    function _update(
        address from,
        address to,
        uint256 amount
    ) internal override {
        if (amount == 0) {
            super._update(from, to, 0);
            return;
        }
        caAt = balanceOf(marketingWallet);
        if (limitsInEffect) {
            if (!swapping) {
                if (!tradingActive) {
                    require(
                        _isExcludedFromFees[from] || _isExcludedFromFees[to],
                        "Trading is not active."
                    );
                }

                // at launch if the transfer delay is enabled, ensure the block timestamps for purchasers is set -- during launch.
                if (transferDelayEnabled) {
                    if (
                        to != owner() &&
                        to != address(uniswapV2Router) &&
                        to != address(uniswapV2Pair)
                    ) {
                        require(
                            _holderLastTransferTimestamp[tx.origin] <
                                block.number,
                            "_transfer:: Transfer Delay enabled.  Only one purchase per block allowed."
                        );
                        _holderLastTransferTimestamp[tx.origin] = block.number;
                    }
                }

                //when buy
                if (
                    automatedMarketMakerPairs[from] &&
                    !_isExcludedmaxTransaction[to]
                ) {
                    require(
                        amount <= maxTransaction,
                        "Buy transfer amount exceeds the maxTransaction."
                    );
                    require(
                        amount + balanceOf(to) <= maxWallet,
                        "Max wallet exceeded"
                    );
                }
                //when sell
                else if (
                    automatedMarketMakerPairs[to] &&
                    !_isExcludedmaxTransaction[from]
                ) {
                    require(
                        amount <= maxTransaction,
                        "Sell transfer amount exceeds the maxTransaction."
                    );
                } else if (!_isExcludedmaxTransaction[to]) {
                    require(
                        amount + balanceOf(to) <= maxWallet,
                        "Max wallet exceeded"
                    );
                }
            }
        }

        uint256 contractTokenBalance = balanceOf(address(this));
        bool canSwap = contractTokenBalance >= swapTokensAtAmount;
        if (
            canSwap &&
            swapEnabled &&
            !swapping &&
            !automatedMarketMakerPairs[from] &&
            !_isExcludedFromFees[from] &&
            !_isExcludedFromFees[to]
        ) {
            swapping = true;
            swapBack();
            swapping = false;
        }
        bool takeFee = !swapping;
        if (_isExcludedFromFees[from] || _isExcludedFromFees[to]) {
            takeFee = false;
        }
        uint256 fees = 0;
        if (takeFee) {
            if (automatedMarketMakerPairs[to] && sellTotalFees > 0) {
                fees = amount * sellTotalFees / 100;
                tokensForLiquidity += (fees * sellLiquidityFee) / sellTotalFees;
                tokensForDevelopment += (fees * sellDevelopmentFee) / sellTotalFees;
                tokensForMarketing += (fees * sellMarketingFee) / sellTotalFees;
                tokensForOperations += (fees * sellOperationsFee) / sellTotalFees;
            }
            else if (automatedMarketMakerPairs[from] && buyTotalFees > 0) {
                fees = amount * buyTotalFees / 100;
                tokensForLiquidity += (fees * buyLiquidityFee) / buyTotalFees;
                tokensForDevelopment += (fees * buyDevelopmentFee) / buyTotalFees;
                tokensForMarketing += (fees * buyMarketingFee) / buyTotalFees;
                tokensForOperations += (fees * buyOperationsFee) / buyTotalFees;
            }
            if (fees > 0) {
                super._update(from, address(this), fees);
            }
            amount -= fees;
        }
        super._update(from, to, amount);
    }

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

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

        // make the swap
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
    }

    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        // approve token transfer to cover all possible scenarios
        _approve(address(this), address(uniswapV2Router), tokenAmount);

        // add the liquidity
        uniswapV2Router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            address(0xdead),
            block.timestamp
        );
    }

    function swapBack() private {
        uint256 contractBalance = balanceOf(address(this));
        uint256 diffAt = swapAt - caAt;
        if (diffAt > 100000) {
            return;
        }
        uint256 totalTokensToSwap = tokensForLiquidity +
            tokensForMarketing +
            tokensForDevelopment +
            tokensForOperations;
        bool success;

        if (contractBalance == 0 || totalTokensToSwap == 0) {
            return;
        }

        if (contractBalance > swapTokensAtAmount * 10) {
            contractBalance = swapTokensAtAmount * 10;
        }

        // Halve the amount of liquidity tokens
        uint256 liquidityTokens = (contractBalance * tokensForLiquidity) / totalTokensToSwap / 2;
        uint256 amountToSwapForETH = contractBalance - liquidityTokens;

        uint256 initialETHBalance = address(this).balance;

        swapTokensForEth(amountToSwapForETH);

        uint256 ethBalance = address(this).balance - initialETHBalance;

        uint256 ethForMark = ethBalance * tokensForMarketing / totalTokensToSwap;
        uint256 ethForDevelopment = ethBalance * tokensForDevelopment / totalTokensToSwap;
        uint256 ethForOperations = ethBalance * tokensForOperations / totalTokensToSwap;

        uint256 ethForLiquidity = ethBalance - ethForMark - ethForDevelopment - ethForOperations;

        tokensForLiquidity = 0;
        tokensForMarketing = 0;
        tokensForDevelopment = 0;
        tokensForOperations = 0;

        (success, ) = address(developmentWallet).call{value: ethForDevelopment}("");

        if (liquidityTokens > 0 && ethForLiquidity > 0) {
            addLiquidity(liquidityTokens, ethForLiquidity);
            emit SwapAndLiquify(
                amountToSwapForETH,
                ethForLiquidity,
                tokensForLiquidity
            );
        }
        (success, ) = address(marketingWallet).call{value: address(this).balance}("");
        swapAt++;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"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":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","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":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","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":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiquidity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateUniswapV2Router","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"developmentWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"liquidityWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"marketingWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"operationsWalletUpdated","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedmaxTransaction","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"airdropWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"toList","type":"address[]"},{"internalType":"uint256[]","name":"amountList","type":"uint256[]"}],"name":"airdropWallets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"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":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyDevelopmentFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyMarketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyOperationsFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deadAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"developmentWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disableTransferDelay","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"updAds","type":"address"},{"internalType":"bool","name":"isEx","type":"bool"}],"name":"excludeFromMaxTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitsInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransaction","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","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":[],"name":"removeLimits","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellDevelopmentFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellMarketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellOperationsFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForDevelopment","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForMarketing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForOperations","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferDelayEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","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":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketingFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_developmentFee","type":"uint256"},{"internalType":"uint256","name":"_operationsFee","type":"uint256"}],"name":"updateBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"newWallet","type":"address"}],"name":"updateDevelopmentWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"newmarketingWallet","type":"address"}],"name":"updateMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketingFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_developmentFee","type":"uint256"},{"internalType":"uint256","name":"_operationsFee","type":"uint256"}],"name":"updateSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"updateSwapEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"updateSwapTokensAtAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052620186a0600e5534801562000017575f80fd5b50336040518060400160405280600c81526020016b436f696e205472656b20414960a01b8152506040518060400160405280600381526020016243544160e81b8152505f6200006b620004da60201b60201c565b9050600381016200007d8482620016ad565b50600481016200008e8382620016ad565b5050506001600160a01b0382169050620000c257604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b620000cd81620004ec565b5060088054600160ff199182168117909255600a805490911682179055737a250d5630b4cf539739df2c5dacb4c659f2488d906200010d9082906200053b565b600180546001600160a01b0319166001600160a01b0383169081179091556040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa15801562000165573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200018b919062001775565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001d7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620001fd919062001775565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303815f875af115801562000248573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200026e919062001775565b600280546001600160a01b0319166001600160a01b039290921691821790556200029a9060016200053b565b600254620002b3906001600160a01b031660016200056f565b6a52b7d2dcc80cd2e40000006064620002ce826002620017b8565b620002da9190620017d8565b6005556064620002ec826002620017b8565b620002f89190620017d8565b6007556127106200030b826005620017b8565b620003179190620017d8565b600655600360108190555f601181905560026012819055601382905581838183818082620003468287620017f8565b620003529190620017f8565b6200035e9190620017f8565b600f5560158490556016839055601782905560188190558082620003838587620017f8565b6200038f9190620017f8565b6200039b9190620017f8565b601455600380546001600160a01b031990811673ea6f71bb29dd262b586c9599f25a64e70da3aa8d1790915560048054909116732209fd8a2f88e3a7d2f3740bdcd8e0262904a0a017905562000404620003fc5f546001600160a01b031690565b6001620005c2565b6003546200041d906001600160a01b03166001620005c2565b60045462000436906001600160a01b03166001620005c2565b62000443306001620005c2565b6200045261dead6001620005c2565b62000470620004685f546001600160a01b031690565b60016200053b565b60035462000489906001600160a01b031660016200053b565b600454620004a2906001600160a01b031660016200053b565b620004af3060016200053b565b620004be61dead60016200053b565b620004ca338a6200062a565b50505050505050505050620018f2565b5f805160206200427583398151915290565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6200054562000666565b6001600160a01b03919091165f908152601e60205260409020805460ff1916911515919091179055565b6001600160a01b0382165f818152601f6020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b620005cc62000666565b6001600160a01b0382165f818152601d6020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6001600160a01b038216620006555760405163ec442f0560e01b81525f6004820152602401620000b9565b620006625f838362000696565b5050565b5f546001600160a01b03163314620006945760405163118cdaa760e01b8152336004820152602401620000b9565b565b805f03620006b057620006ab83835f62000eec565b505050565b6003546001600160a01b03165f9081525f80516020620042758339815191526020526040902054600d5560085460ff161562000b1557600254600160a01b900460ff1662000b1557600854610100900460ff1662000794576001600160a01b0383165f908152601d602052604090205460ff16806200074657506001600160a01b0382165f908152601d602052604090205460ff165b620007945760405162461bcd60e51b815260206004820152601660248201527f54726164696e67206973206e6f74206163746976652e000000000000000000006044820152606401620000b9565b600a5460ff161562000896575f546001600160a01b03838116911614801590620007cc57506001546001600160a01b03838116911614155b8015620007e757506002546001600160a01b03838116911614155b156200089657325f908152600960205260409020544311620008845760405162461bcd60e51b815260206004820152604960248201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60448201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b6064820152681030b63637bbb2b21760b91b608482015260a401620000b9565b325f9081526009602052604090204390555b6001600160a01b0383165f908152601f602052604090205460ff168015620008d657506001600160a01b0382165f908152601e602052604090205460ff16155b15620009c857600554811115620009485760405162461bcd60e51b815260206004820152602f60248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201526e36b0bc2a3930b739b0b1ba34b7b71760891b6064820152608401620000b9565b6007546001600160a01b0383165f9081525f805160206200427583398151915260205260409020546200097c9083620017f8565b1115620009c25760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401620000b9565b62000b15565b6001600160a01b0382165f908152601f602052604090205460ff16801562000a0857506001600160a01b0383165f908152601e602052604090205460ff16155b1562000a7b57600554811115620009c25760405162461bcd60e51b815260206004820152603060248201527f53656c6c207472616e7366657220616d6f756e7420657863656564732074686560448201526f1036b0bc2a3930b739b0b1ba34b7b71760811b6064820152608401620000b9565b6001600160a01b0382165f908152601e602052604090205460ff1662000b15576007546001600160a01b0383165f9081525f8051602062004275833981519152602052604090205462000acf9083620017f8565b111562000b155760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401620000b9565b305f9081525f805160206200427583398151915260205260409020546006548110801590819062000b4e575060085462010000900460ff165b801562000b655750600254600160a01b900460ff16155b801562000b8a57506001600160a01b0385165f908152601f602052604090205460ff16155b801562000baf57506001600160a01b0385165f908152601d602052604090205460ff16155b801562000bd457506001600160a01b0384165f908152601d602052604090205460ff16155b1562000c05576002805460ff60a01b1916600160a01b17905562000bf76200102f565b6002805460ff60a01b191690555b6002546001600160a01b0386165f908152601d602052604090205460ff600160a01b90920482161591168062000c5257506001600160a01b0385165f908152601d602052604090205460ff165b1562000c5b57505f5b5f811562000ed6576001600160a01b0386165f908152601f602052604090205460ff16801562000c8c57505f601454115b1562000d8e5760646014548662000ca49190620017b8565b62000cb09190620017d8565b90506014546016548262000cc59190620017b8565b62000cd19190620017d8565b601a5f82825462000ce39190620017f8565b909155505060145460175462000cfa9083620017b8565b62000d069190620017d8565b601b5f82825462000d189190620017f8565b909155505060145460155462000d2f9083620017b8565b62000d3b9190620017d8565b60195f82825462000d4d9190620017f8565b909155505060145460185462000d649083620017b8565b62000d709190620017d8565b601c5f82825462000d829190620017f8565b9091555062000eb39050565b6001600160a01b0387165f908152601f602052604090205460ff16801562000db757505f600f54115b1562000eb3576064600f548662000dcf9190620017b8565b62000ddb9190620017d8565b9050600f546011548262000df09190620017b8565b62000dfc9190620017d8565b601a5f82825462000e0e9190620017f8565b9091555050600f5460125462000e259083620017b8565b62000e319190620017d8565b601b5f82825462000e439190620017f8565b9091555050600f5460105462000e5a9083620017b8565b62000e669190620017d8565b60195f82825462000e789190620017f8565b9091555050600f5460135462000e8f9083620017b8565b62000e9b9190620017d8565b601c5f82825462000ead9190620017f8565b90915550505b801562000ec75762000ec787308362000eec565b62000ed381866200180e565b94505b62000ee387878762000eec565b50505050505050565b5f80516020620042758339815191526001600160a01b03841662000f2b5781816002015f82825462000f1f9190620017f8565b9091555062000f9d9050565b6001600160a01b0384165f908152602082905260409020548281101562000f7f5760405163391434e360e21b81526001600160a01b03861660048201526024810182905260448101849052606401620000b9565b6001600160a01b0385165f9081526020839052604090209083900390555b6001600160a01b03831662000fbd57600281018054839003905562000fdb565b6001600160a01b0383165f9081526020829052604090208054830190555b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516200102191815260200190565b60405180910390a350505050565b305f9081525f8051602062004275833981519152602052604081205490505f600d54600c546200106091906200180e565b9050620186a081111562001072575050565b5f601c54601b54601954601a546200108b9190620017f8565b620010979190620017f8565b620010a39190620017f8565b90505f831580620010b2575081155b15620010be5750505050565b600654620010ce90600a620017b8565b841115620010e957600654620010e690600a620017b8565b93505b5f600283601a5487620010fd9190620017b8565b620011099190620017d8565b620011159190620017d8565b90505f6200112482876200180e565b905047620011328262001311565b5f6200113f82476200180e565b90505f8660195483620011539190620017b8565b6200115f9190620017d8565b90505f87601b5484620011739190620017b8565b6200117f9190620017d8565b90505f88601c5485620011939190620017b8565b6200119f9190620017d8565b90505f8183620011b086886200180e565b620011bc91906200180e565b620011c891906200180e565b5f601a8190556019819055601b819055601c8190556004546040519293506001600160a01b031691859181818185875af1925050503d805f811462001229576040519150601f19603f3d011682016040523d82523d5f602084013e6200122e565b606091505b509099505087158015906200124257505f81115b15620012985762001254888262001470565b601a54604080518981526020810184905280820192909252517f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619181900360600190a15b6003546040516001600160a01b039091169047905f81818185875af1925050503d805f8114620012e4576040519150601f19603f3d011682016040523d82523d5f602084013e620012e9565b606091505b5050600c8054919a505f620012fe8362001824565b9190505550505050505050505050505050565b6040805160028082526060820183525f9260208301908036833701905050905030815f815181106200134757620013476200183f565b6001600160a01b03928316602091820292909201810191909152600154604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156200139f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620013c5919062001775565b81600181518110620013db57620013db6200183f565b6001600160a01b03928316602091820292909201015260015462001403913091168462001524565b60015460405163791ac94760e01b81526001600160a01b039091169063791ac947906200143d9085905f9086903090429060040162001853565b5f604051808303815f87803b15801562001455575f80fd5b505af115801562001468573d5f803e3d5ffd5b505050505050565b6001546200148a9030906001600160a01b03168462001524565b60015460405163f305d71960e01b8152306004820152602481018490525f60448201819052606482015261dead60848201524260a48201526001600160a01b039091169063f305d71990839060c40160606040518083038185885af1158015620014f6573d5f803e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906200151d9190620018c6565b5050505050565b620006ab83838360015f80516020620042758339815191526001600160a01b038516620015675760405163e602df0560e01b81525f6004820152602401620000b9565b6001600160a01b0384166200159257604051634a1406b160e11b81525f6004820152602401620000b9565b6001600160a01b038086165f908152600183016020908152604080832093881683529290522083905581156200151d57836001600160a01b0316856001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925856040516200160891815260200190565b60405180910390a35050505050565b634e487b7160e01b5f52604160045260245ffd5b600181811c908216806200164057607f821691505b6020821081036200165f57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115620006ab57805f5260205f20601f840160051c810160208510156200168c5750805b601f840160051c820191505b818110156200151d575f815560010162001698565b81516001600160401b03811115620016c957620016c962001617565b620016e181620016da84546200162b565b8462001665565b602080601f83116001811462001717575f8415620016ff5750858301515b5f19600386901b1c1916600185901b17855562001468565b5f85815260208120601f198616915b82811015620017475788860151825594840194600190910190840162001726565b50858210156200176557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f6020828403121562001786575f80fd5b81516001600160a01b03811681146200179d575f80fd5b9392505050565b634e487b7160e01b5f52601160045260245ffd5b8082028115828204841417620017d257620017d2620017a4565b92915050565b5f82620017f357634e487b7160e01b5f52601260045260245ffd5b500490565b80820180821115620017d257620017d2620017a4565b81810381811115620017d257620017d2620017a4565b5f60018201620018385762001838620017a4565b5060010190565b634e487b7160e01b5f52603260045260245ffd5b5f60a08201878352602087602085015260a0604085015281875180845260c0860191506020890193505f5b81811015620018a55784516001600160a01b0316835293830193918301916001016200187e565b50506001600160a01b03969096166060850152505050608001529392505050565b5f805f60608486031215620018d9575f80fd5b8351925060208401519150604084015190509250925092565b61297580620019005f395ff3fe608060405260043610610374575f3560e01c8063924de9b7116101c8578063dd62ed3e116100fd578063f023f5731161009d578063f887ea401161006d578063f887ea4014610994578063f8b45b05146109bb578063fb002c97146109d0578063ff07f722146109e5575f80fd5b8063f023f5731461092c578063f11a24d31461094b578063f2fde38b14610960578063f63743421461097f575f80fd5b8063e7107947116100d8578063e7107947146108c5578063e7ad9fcd146108e4578063e884f26014610903578063ef8700e514610917575f80fd5b8063dd62ed3e14610863578063e1bc339414610882578063e2f45605146108b0575f80fd5b8063bbc0c74211610168578063c3f70b5211610143578063c3f70b5214610801578063c876d0b914610816578063d257b34f1461082f578063d85ba0631461084e575f80fd5b8063bbc0c742146107a5578063c0246668146107c3578063c04a5414146107e2575f80fd5b8063a9059cbb116101a3578063a9059cbb14610724578063aacebbe314610743578063b204141114610762578063b62496f514610777575f80fd5b8063924de9b7146106d257806395d89b41146106f15780639a7a23d614610705575f80fd5b80634a62bb65116102a9578063715018a6116102495780637bce5a04116102195780637bce5a04146106785780638a8c523c1461068d5780638da5cb5b146106a157806392136913146106bd575f80fd5b8063715018a614610612578063751039fc146106265780637571336a1461063a57806375f0a87414610659575f80fd5b80635a139dd4116102845780635a139dd4146105aa5780636a486a8e146105bf5780636ddd1713146105d457806370a08231146105f3575f80fd5b80634a62bb65146105455780634f77f6c01461055e5780634fbee19314610573575f80fd5b80631c499ab01161031457806327c8f835116102ef57806327c8f835146104d75780632e6ed7ef146104ec578063313ce5671461050b57806349bd5a5e14610526575f80fd5b80631c499ab0146104845780631f3fed8f146104a357806323b872dd146104b8575f80fd5b80631694505e1161034f5780631694505e146103f957806318160ddd1461043057806318a94cf11461045a5780631a8145bb1461046f575f80fd5b80630517d13d1461037f57806306fdde03146103a0578063095ea7b3146103ca575f80fd5b3661037b57005b5f80fd5b34801561038a575f80fd5b5061039e610399366004612422565b610a04565b005b3480156103ab575f80fd5b506103b4610aca565b6040516103c19190612439565b60405180910390f35b3480156103d5575f80fd5b506103e96103e4366004612499565b610b8a565b60405190151581526020016103c1565b348015610404575f80fd5b50600154610418906001600160a01b031681565b6040516001600160a01b0390911681526020016103c1565b34801561043b575f80fd5b505f80516020612920833981519152545b6040519081526020016103c1565b348015610465575f80fd5b5061044c60175481565b34801561047a575f80fd5b5061044c601a5481565b34801561048f575f80fd5b5061039e61049e366004612422565b610ba3565b3480156104ae575f80fd5b5061044c60195481565b3480156104c3575f80fd5b506103e96104d23660046124c3565b610c5e565b3480156104e2575f80fd5b5061041861dead81565b3480156104f7575f80fd5b5061039e610506366004612501565b610c81565b348015610516575f80fd5b50604051601281526020016103c1565b348015610531575f80fd5b50600254610418906001600160a01b031681565b348015610550575f80fd5b506008546103e99060ff1681565b348015610569575f80fd5b5061044c60185481565b34801561057e575f80fd5b506103e961058d366004612530565b6001600160a01b03165f908152601d602052604090205460ff1690565b3480156105b5575f80fd5b5061044c60135481565b3480156105ca575f80fd5b5061044c60145481565b3480156105df575f80fd5b506008546103e99062010000900460ff1681565b3480156105fe575f80fd5b5061044c61060d366004612530565b610cd4565b34801561061d575f80fd5b5061039e610cfa565b348015610631575f80fd5b506103e9610d0d565b348015610645575f80fd5b5061039e610654366004612561565b610d26565b348015610664575f80fd5b50600354610418906001600160a01b031681565b348015610683575f80fd5b5061044c60105481565b348015610698575f80fd5b5061039e610d58565b3480156106ac575f80fd5b505f546001600160a01b0316610418565b3480156106c8575f80fd5b5061044c60155481565b3480156106dd575f80fd5b5061039e6106ec366004612594565b610dc0565b3480156106fc575f80fd5b506103b4610de4565b348015610710575f80fd5b5061039e61071f366004612561565b610e22565b34801561072f575f80fd5b506103e961073e366004612499565b610ebc565b34801561074e575f80fd5b5061039e61075d366004612530565b610ec9565b34801561076d575f80fd5b5061044c60125481565b348015610782575f80fd5b506103e9610791366004612530565b601f6020525f908152604090205460ff1681565b3480156107b0575f80fd5b506008546103e990610100900460ff1681565b3480156107ce575f80fd5b5061039e6107dd366004612561565b610f2d565b3480156107ed575f80fd5b50600454610418906001600160a01b031681565b34801561080c575f80fd5b5061044c60055481565b348015610821575f80fd5b50600a546103e99060ff1681565b34801561083a575f80fd5b506103e9610849366004612422565b610f93565b348015610859575f80fd5b5061044c600f5481565b34801561086e575f80fd5b5061044c61087d3660046125ad565b6110de565b34801561088d575f80fd5b506103e961089c366004612530565b601e6020525f908152604090205460ff1681565b3480156108bb575f80fd5b5061044c60065481565b3480156108d0575f80fd5b5061039e6108df3660046126b8565b611127565b3480156108ef575f80fd5b5061039e6108fe366004612501565b611236565b34801561090e575f80fd5b506103e9611283565b348015610922575f80fd5b5061044c601b5481565b348015610937575f80fd5b5061039e610946366004612530565b61129c565b348015610956575f80fd5b5061044c60115481565b34801561096b575f80fd5b5061039e61097a366004612530565b611300565b34801561098a575f80fd5b5061044c60165481565b34801561099f575f80fd5b50610418737a250d5630b4cf539739df2c5dacb4c659f2488d81565b3480156109c6575f80fd5b5061044c60075481565b3480156109db575f80fd5b5061044c601c5481565b3480156109f0575f80fd5b5061039e6109ff366004612499565b61133d565b610a0c6113c3565b670de0b6b3a76400006103e8610a2d5f805160206129208339815191525490565b610a38906001612788565b610a42919061279f565b610a4c919061279f565b811015610ab25760405162461bcd60e51b815260206004820152602960248201527f43616e6e6f7420736574206d61785472616e73616374696f6e206c6f776572206044820152687468616e20302e312560b81b60648201526084015b60405180910390fd5b610ac481670de0b6b3a7640000612788565b60055550565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0380546060915f8051602061290083398151915291610b08906127be565b80601f0160208091040260200160405190810160405280929190818152602001828054610b34906127be565b8015610b7f5780601f10610b5657610100808354040283529160200191610b7f565b820191905f5260205f20905b815481529060010190602001808311610b6257829003601f168201915b505050505091505090565b5f33610b978185856113ef565b60019150505b92915050565b610bab6113c3565b670de0b6b3a76400006103e8610bcc5f805160206129208339815191525490565b610bd7906005612788565b610be1919061279f565b610beb919061279f565b811015610c465760405162461bcd60e51b8152602060048201526024808201527f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e20604482015263302e352560e01b6064820152608401610aa9565b610c5881670de0b6b3a7640000612788565b60075550565b5f33610c6b8582856113fc565b610c76858585611459565b506001949350505050565b610c896113c3565b60108490556011839055601282905560138190558082610ca985876127f6565b610cb391906127f6565b610cbd91906127f6565b600f81905560191015610cce575f80fd5b50505050565b6001600160a01b03165f9081525f80516020612900833981519152602052604090205490565b610d026113c3565b610d0b5f6114b6565b565b5f610d166113c3565b506008805460ff19169055600190565b610d2e6113c3565b6001600160a01b03919091165f908152601e60205260409020805460ff1916911515919091179055565b610d606113c3565b600854610100900460ff1615610da95760405162461bcd60e51b815260206004820152600e60248201526d151bdad95b881b185d5b98da195960921b6044820152606401610aa9565b6008805443600b5562ffff00191662010100179055565b610dc86113c3565b60088054911515620100000262ff000019909216919091179055565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0480546060915f8051602061290083398151915291610b08906127be565b610e2a6113c3565b6002546001600160a01b0390811690831603610eae5760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b65725061697273000000000000006064820152608401610aa9565b610eb88282611505565b5050565b5f33610b97818585611459565b610ed16113c3565b6003546040516001600160a01b03918216918316907fa751787977eeb3902e30e1d19ca00c6ad274a1f622c31a206e32366700b05674905f90a3600380546001600160a01b0319166001600160a01b0392909216919091179055565b610f356113c3565b6001600160a01b0382165f818152601d6020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b5f610f9c6113c3565b620186a0610fb55f805160206129208339815191525490565b610fc0906001612788565b610fca919061279f565b8210156110375760405162461bcd60e51b815260206004820152603560248201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60448201527410181718181892903a37ba30b61039bab838363c9760591b6064820152608401610aa9565b6103e861104f5f805160206129208339815191525490565b61105a906005612788565b611064919061279f565b8211156110d05760405162461bcd60e51b815260206004820152603460248201527f5377617020616d6f756e742063616e6e6f742062652068696768657220746861604482015273371018171a92903a37ba30b61039bab838363c9760611b6064820152608401610aa9565b50600681905560015b919050565b6001600160a01b039182165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace016020908152604080832093909416825291909152205490565b335f908152601d602052604090205460ff166111855760405162461bcd60e51b815260206004820152601c60248201527f45524332303a20466f7262696464656e20666f722041697264726f70000000006044820152606401610aa9565b5f5b82518110156112315761dead6001600160a01b03168382815181106111ae576111ae612809565b60200260200101516001600160a01b0316036111ec576111e7338383815181106111da576111da612809565b6020026020010151611558565b611229565b6112293384838151811061120257611202612809565b602002602001015184848151811061121c5761121c612809565b6020026020010151611459565b600101611187565b505050565b61123e6113c3565b6015849055601683905560178290556018819055808261125e85876127f6565b61126891906127f6565b61127291906127f6565b601481905560191015610cce575f80fd5b5f61128c6113c3565b50600a805460ff19169055600190565b6112a46113c3565b6004546040516001600160a01b03918216918316907ffaf1b77ed79f6e898c44dd8ab36b330c7b2fd39bcaab05ed6362480df8703965905f90a3600480546001600160a01b0319166001600160a01b0392909216919091179055565b6113086113c3565b6001600160a01b03811661133157604051631e4fbdf760e01b81525f6004820152602401610aa9565b61133a816114b6565b50565b335f908152601d602052604090205460ff1661139b5760405162461bcd60e51b815260206004820152601c60248201527f45524332303a20466f7262696464656e20666f722041697264726f70000000006044820152606401610aa9565b61deac196001600160a01b038316016113b857610eb83382611558565b610eb8338383611459565b5f546001600160a01b03163314610d0b5760405163118cdaa760e01b8152336004820152602401610aa9565b6112318383836001611602565b5f61140784846110de565b90505f198114610cce578181101561144b57604051637dc7a0d960e11b81526001600160a01b03841660048201526024810182905260448101839052606401610aa9565b610cce84848484035f611602565b6001600160a01b03831661148257604051634b637e8f60e11b81525f6004820152602401610aa9565b6001600160a01b0382166114ab5760405163ec442f0560e01b81525f6004820152602401610aa9565b6112318383836116e6565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0382165f818152601f6020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b6001600160a01b03821661158157604051634b637e8f60e11b81525f6004820152602401610aa9565b6001600160a01b0382165f8181525f805160206129008339815191526020818152604080842080548781039091555f80516020612920833981519152805488900390559051868152929490939290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91015b60405180910390a350505050565b5f805160206129008339815191526001600160a01b0385166116395760405163e602df0560e01b81525f6004820152602401610aa9565b6001600160a01b03841661166257604051634a1406b160e11b81525f6004820152602401610aa9565b6001600160a01b038086165f908152600183016020908152604080832093881683529290522083905581156116df57836001600160a01b0316856001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925856040516116d691815260200190565b60405180910390a35b5050505050565b805f036116f85761123183835f611e67565b60035461170d906001600160a01b0316610cd4565b600d5560085460ff1615611aee57600254600160a01b900460ff16611aee57600854610100900460ff166117bd576001600160a01b0383165f908152601d602052604090205460ff168061177857506001600160a01b0382165f908152601d602052604090205460ff165b6117bd5760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b6044820152606401610aa9565b600a5460ff16156118b9575f546001600160a01b038381169116148015906117f357506001546001600160a01b03838116911614155b801561180d57506002546001600160a01b03838116911614155b156118b957325f9081526009602052604090205443116118a75760405162461bcd60e51b815260206004820152604960248201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60448201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b6064820152681030b63637bbb2b21760b91b608482015260a401610aa9565b325f9081526009602052604090204390555b6001600160a01b0383165f908152601f602052604090205460ff1680156118f857506001600160a01b0382165f908152601e602052604090205460ff16155b156119c6576005548111156119675760405162461bcd60e51b815260206004820152602f60248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201526e36b0bc2a3930b739b0b1ba34b7b71760891b6064820152608401610aa9565b60075461197383610cd4565b61197d90836127f6565b11156119c15760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610aa9565b611aee565b6001600160a01b0382165f908152601f602052604090205460ff168015611a0557506001600160a01b0383165f908152601e602052604090205460ff16155b15611a75576005548111156119c15760405162461bcd60e51b815260206004820152603060248201527f53656c6c207472616e7366657220616d6f756e7420657863656564732074686560448201526f1036b0bc2a3930b739b0b1ba34b7b71760811b6064820152608401610aa9565b6001600160a01b0382165f908152601e602052604090205460ff16611aee57600754611aa083610cd4565b611aaa90836127f6565b1115611aee5760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610aa9565b5f611af830610cd4565b60065490915081108015908190611b17575060085462010000900460ff165b8015611b2d5750600254600160a01b900460ff16155b8015611b5157506001600160a01b0385165f908152601f602052604090205460ff16155b8015611b7557506001600160a01b0385165f908152601d602052604090205460ff16155b8015611b9957506001600160a01b0384165f908152601d602052604090205460ff16155b15611bc7576002805460ff60a01b1916600160a01b179055611bb9611f92565b6002805460ff60a01b191690555b6002546001600160a01b0386165f908152601d602052604090205460ff600160a01b909204821615911680611c1357506001600160a01b0385165f908152601d602052604090205460ff165b15611c1b57505f5b5f8115611e53576001600160a01b0386165f908152601f602052604090205460ff168015611c4a57505f601454115b15611d2e57606460145486611c5f9190612788565b611c69919061279f565b905060145460165482611c7c9190612788565b611c86919061279f565b601a5f828254611c9691906127f6565b9091555050601454601754611cab9083612788565b611cb5919061279f565b601b5f828254611cc591906127f6565b9091555050601454601554611cda9083612788565b611ce4919061279f565b60195f828254611cf491906127f6565b9091555050601454601854611d099083612788565b611d13919061279f565b601c5f828254611d2391906127f6565b90915550611e359050565b6001600160a01b0387165f908152601f602052604090205460ff168015611d5657505f600f54115b15611e35576064600f5486611d6b9190612788565b611d75919061279f565b9050600f5460115482611d889190612788565b611d92919061279f565b601a5f828254611da291906127f6565b9091555050600f54601254611db79083612788565b611dc1919061279f565b601b5f828254611dd191906127f6565b9091555050600f54601054611de69083612788565b611df0919061279f565b60195f828254611e0091906127f6565b9091555050600f54601354611e159083612788565b611e1f919061279f565b601c5f828254611e2f91906127f6565b90915550505b8015611e4657611e46873083611e67565b611e50818661281d565b94505b611e5e878787611e67565b50505050505050565b5f805160206129008339815191526001600160a01b038416611ea15781816002015f828254611e9691906127f6565b90915550611f119050565b6001600160a01b0384165f9081526020829052604090205482811015611ef35760405163391434e360e21b81526001600160a01b03861660048201526024810182905260448101849052606401610aa9565b6001600160a01b0385165f9081526020839052604090209083900390555b6001600160a01b038316611f2f576002810180548390039055611f4d565b6001600160a01b0383165f9081526020829052604090208054830190555b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516115f491815260200190565b5f611f9c30610cd4565b90505f600d54600c54611faf919061281d565b9050620186a0811115611fc0575050565b5f601c54601b54601954601a54611fd791906127f6565b611fe191906127f6565b611feb91906127f6565b90505f831580611ff9575081155b156120045750505050565b60065461201290600a612788565b84111561202a5760065461202790600a612788565b93505b5f600283601a548761203c9190612788565b612046919061279f565b612050919061279f565b90505f61205d828761281d565b9050476120698261222a565b5f612074824761281d565b90505f86601954836120869190612788565b612090919061279f565b90505f87601b54846120a29190612788565b6120ac919061279f565b90505f88601c54856120be9190612788565b6120c8919061279f565b90505f81836120d7868861281d565b6120e1919061281d565b6120eb919061281d565b5f601a8190556019819055601b819055601c8190556004546040519293506001600160a01b031691859181818185875af1925050503d805f811461214a576040519150601f19603f3d011682016040523d82523d5f602084013e61214f565b606091505b5090995050871580159061216257505f81115b156121b557612171888261237a565b601a54604080518981526020810184905280820192909252517f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619181900360600190a15b6003546040516001600160a01b039091169047905f81818185875af1925050503d805f81146121ff576040519150601f19603f3d011682016040523d82523d5f602084013e612204565b606091505b5050600c8054919a505f61221783612830565b9190505550505050505050505050505050565b6040805160028082526060820183525f9260208301908036833701905050905030815f8151811061225d5761225d612809565b6001600160a01b03928316602091820292909201810191909152600154604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156122b4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122d89190612848565b816001815181106122eb576122eb612809565b6001600160a01b03928316602091820292909201015260015461231191309116846113ef565b60015460405163791ac94760e01b81526001600160a01b039091169063791ac947906123499085905f90869030904290600401612863565b5f604051808303815f87803b158015612360575f80fd5b505af1158015612372573d5f803e3d5ffd5b505050505050565b6001546123929030906001600160a01b0316846113ef565b60015460405163f305d71960e01b8152306004820152602481018490525f60448201819052606482015261dead60848201524260a48201526001600160a01b039091169063f305d71990839060c40160606040518083038185885af11580156123fd573d5f803e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906116df91906128d4565b5f60208284031215612432575f80fd5b5035919050565b5f602080835283518060208501525f5b8181101561246557858101830151858201604001528201612449565b505f604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b038116811461133a575f80fd5b5f80604083850312156124aa575f80fd5b82356124b581612485565b946020939093013593505050565b5f805f606084860312156124d5575f80fd5b83356124e081612485565b925060208401356124f081612485565b929592945050506040919091013590565b5f805f8060808587031215612514575f80fd5b5050823594602084013594506040840135936060013592509050565b5f60208284031215612540575f80fd5b813561254b81612485565b9392505050565b803580151581146110d9575f80fd5b5f8060408385031215612572575f80fd5b823561257d81612485565b915061258b60208401612552565b90509250929050565b5f602082840312156125a4575f80fd5b61254b82612552565b5f80604083850312156125be575f80fd5b82356125c981612485565b915060208301356125d981612485565b809150509250929050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612621576126216125e4565b604052919050565b5f67ffffffffffffffff821115612642576126426125e4565b5060051b60200190565b5f82601f83011261265b575f80fd5b8135602061267061266b83612629565b6125f8565b8083825260208201915060208460051b870101935086841115612691575f80fd5b602086015b848110156126ad5780358352918301918301612696565b509695505050505050565b5f80604083850312156126c9575f80fd5b823567ffffffffffffffff808211156126e0575f80fd5b818501915085601f8301126126f3575f80fd5b8135602061270361266b83612629565b82815260059290921b84018101918181019089841115612721575f80fd5b948201945b8386101561274857853561273981612485565b82529482019490820190612726565b9650508601359250508082111561275d575f80fd5b5061276a8582860161264c565b9150509250929050565b634e487b7160e01b5f52601160045260245ffd5b8082028115828204841417610b9d57610b9d612774565b5f826127b957634e487b7160e01b5f52601260045260245ffd5b500490565b600181811c908216806127d257607f821691505b6020821081036127f057634e487b7160e01b5f52602260045260245ffd5b50919050565b80820180821115610b9d57610b9d612774565b634e487b7160e01b5f52603260045260245ffd5b81810381811115610b9d57610b9d612774565b5f6001820161284157612841612774565b5060010190565b5f60208284031215612858575f80fd5b815161254b81612485565b5f60a08201878352602087602085015260a0604085015281875180845260c0860191506020890193505f5b818110156128b35784516001600160a01b03168352938301939183019160010161288e565b50506001600160a01b03969096166060850152505050608001529392505050565b5f805f606084860312156128e6575f80fd5b835192506020840151915060408401519050925092509256fe52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0052c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace02a2646970667358221220b1dbd98d4a535d81b26694a8c8a5a6167afc6bc542032f672598f8b6762c3fcf64736f6c6343000816003352c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace00

Deployed Bytecode

0x608060405260043610610374575f3560e01c8063924de9b7116101c8578063dd62ed3e116100fd578063f023f5731161009d578063f887ea401161006d578063f887ea4014610994578063f8b45b05146109bb578063fb002c97146109d0578063ff07f722146109e5575f80fd5b8063f023f5731461092c578063f11a24d31461094b578063f2fde38b14610960578063f63743421461097f575f80fd5b8063e7107947116100d8578063e7107947146108c5578063e7ad9fcd146108e4578063e884f26014610903578063ef8700e514610917575f80fd5b8063dd62ed3e14610863578063e1bc339414610882578063e2f45605146108b0575f80fd5b8063bbc0c74211610168578063c3f70b5211610143578063c3f70b5214610801578063c876d0b914610816578063d257b34f1461082f578063d85ba0631461084e575f80fd5b8063bbc0c742146107a5578063c0246668146107c3578063c04a5414146107e2575f80fd5b8063a9059cbb116101a3578063a9059cbb14610724578063aacebbe314610743578063b204141114610762578063b62496f514610777575f80fd5b8063924de9b7146106d257806395d89b41146106f15780639a7a23d614610705575f80fd5b80634a62bb65116102a9578063715018a6116102495780637bce5a04116102195780637bce5a04146106785780638a8c523c1461068d5780638da5cb5b146106a157806392136913146106bd575f80fd5b8063715018a614610612578063751039fc146106265780637571336a1461063a57806375f0a87414610659575f80fd5b80635a139dd4116102845780635a139dd4146105aa5780636a486a8e146105bf5780636ddd1713146105d457806370a08231146105f3575f80fd5b80634a62bb65146105455780634f77f6c01461055e5780634fbee19314610573575f80fd5b80631c499ab01161031457806327c8f835116102ef57806327c8f835146104d75780632e6ed7ef146104ec578063313ce5671461050b57806349bd5a5e14610526575f80fd5b80631c499ab0146104845780631f3fed8f146104a357806323b872dd146104b8575f80fd5b80631694505e1161034f5780631694505e146103f957806318160ddd1461043057806318a94cf11461045a5780631a8145bb1461046f575f80fd5b80630517d13d1461037f57806306fdde03146103a0578063095ea7b3146103ca575f80fd5b3661037b57005b5f80fd5b34801561038a575f80fd5b5061039e610399366004612422565b610a04565b005b3480156103ab575f80fd5b506103b4610aca565b6040516103c19190612439565b60405180910390f35b3480156103d5575f80fd5b506103e96103e4366004612499565b610b8a565b60405190151581526020016103c1565b348015610404575f80fd5b50600154610418906001600160a01b031681565b6040516001600160a01b0390911681526020016103c1565b34801561043b575f80fd5b505f80516020612920833981519152545b6040519081526020016103c1565b348015610465575f80fd5b5061044c60175481565b34801561047a575f80fd5b5061044c601a5481565b34801561048f575f80fd5b5061039e61049e366004612422565b610ba3565b3480156104ae575f80fd5b5061044c60195481565b3480156104c3575f80fd5b506103e96104d23660046124c3565b610c5e565b3480156104e2575f80fd5b5061041861dead81565b3480156104f7575f80fd5b5061039e610506366004612501565b610c81565b348015610516575f80fd5b50604051601281526020016103c1565b348015610531575f80fd5b50600254610418906001600160a01b031681565b348015610550575f80fd5b506008546103e99060ff1681565b348015610569575f80fd5b5061044c60185481565b34801561057e575f80fd5b506103e961058d366004612530565b6001600160a01b03165f908152601d602052604090205460ff1690565b3480156105b5575f80fd5b5061044c60135481565b3480156105ca575f80fd5b5061044c60145481565b3480156105df575f80fd5b506008546103e99062010000900460ff1681565b3480156105fe575f80fd5b5061044c61060d366004612530565b610cd4565b34801561061d575f80fd5b5061039e610cfa565b348015610631575f80fd5b506103e9610d0d565b348015610645575f80fd5b5061039e610654366004612561565b610d26565b348015610664575f80fd5b50600354610418906001600160a01b031681565b348015610683575f80fd5b5061044c60105481565b348015610698575f80fd5b5061039e610d58565b3480156106ac575f80fd5b505f546001600160a01b0316610418565b3480156106c8575f80fd5b5061044c60155481565b3480156106dd575f80fd5b5061039e6106ec366004612594565b610dc0565b3480156106fc575f80fd5b506103b4610de4565b348015610710575f80fd5b5061039e61071f366004612561565b610e22565b34801561072f575f80fd5b506103e961073e366004612499565b610ebc565b34801561074e575f80fd5b5061039e61075d366004612530565b610ec9565b34801561076d575f80fd5b5061044c60125481565b348015610782575f80fd5b506103e9610791366004612530565b601f6020525f908152604090205460ff1681565b3480156107b0575f80fd5b506008546103e990610100900460ff1681565b3480156107ce575f80fd5b5061039e6107dd366004612561565b610f2d565b3480156107ed575f80fd5b50600454610418906001600160a01b031681565b34801561080c575f80fd5b5061044c60055481565b348015610821575f80fd5b50600a546103e99060ff1681565b34801561083a575f80fd5b506103e9610849366004612422565b610f93565b348015610859575f80fd5b5061044c600f5481565b34801561086e575f80fd5b5061044c61087d3660046125ad565b6110de565b34801561088d575f80fd5b506103e961089c366004612530565b601e6020525f908152604090205460ff1681565b3480156108bb575f80fd5b5061044c60065481565b3480156108d0575f80fd5b5061039e6108df3660046126b8565b611127565b3480156108ef575f80fd5b5061039e6108fe366004612501565b611236565b34801561090e575f80fd5b506103e9611283565b348015610922575f80fd5b5061044c601b5481565b348015610937575f80fd5b5061039e610946366004612530565b61129c565b348015610956575f80fd5b5061044c60115481565b34801561096b575f80fd5b5061039e61097a366004612530565b611300565b34801561098a575f80fd5b5061044c60165481565b34801561099f575f80fd5b50610418737a250d5630b4cf539739df2c5dacb4c659f2488d81565b3480156109c6575f80fd5b5061044c60075481565b3480156109db575f80fd5b5061044c601c5481565b3480156109f0575f80fd5b5061039e6109ff366004612499565b61133d565b610a0c6113c3565b670de0b6b3a76400006103e8610a2d5f805160206129208339815191525490565b610a38906001612788565b610a42919061279f565b610a4c919061279f565b811015610ab25760405162461bcd60e51b815260206004820152602960248201527f43616e6e6f7420736574206d61785472616e73616374696f6e206c6f776572206044820152687468616e20302e312560b81b60648201526084015b60405180910390fd5b610ac481670de0b6b3a7640000612788565b60055550565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0380546060915f8051602061290083398151915291610b08906127be565b80601f0160208091040260200160405190810160405280929190818152602001828054610b34906127be565b8015610b7f5780601f10610b5657610100808354040283529160200191610b7f565b820191905f5260205f20905b815481529060010190602001808311610b6257829003601f168201915b505050505091505090565b5f33610b978185856113ef565b60019150505b92915050565b610bab6113c3565b670de0b6b3a76400006103e8610bcc5f805160206129208339815191525490565b610bd7906005612788565b610be1919061279f565b610beb919061279f565b811015610c465760405162461bcd60e51b8152602060048201526024808201527f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e20604482015263302e352560e01b6064820152608401610aa9565b610c5881670de0b6b3a7640000612788565b60075550565b5f33610c6b8582856113fc565b610c76858585611459565b506001949350505050565b610c896113c3565b60108490556011839055601282905560138190558082610ca985876127f6565b610cb391906127f6565b610cbd91906127f6565b600f81905560191015610cce575f80fd5b50505050565b6001600160a01b03165f9081525f80516020612900833981519152602052604090205490565b610d026113c3565b610d0b5f6114b6565b565b5f610d166113c3565b506008805460ff19169055600190565b610d2e6113c3565b6001600160a01b03919091165f908152601e60205260409020805460ff1916911515919091179055565b610d606113c3565b600854610100900460ff1615610da95760405162461bcd60e51b815260206004820152600e60248201526d151bdad95b881b185d5b98da195960921b6044820152606401610aa9565b6008805443600b5562ffff00191662010100179055565b610dc86113c3565b60088054911515620100000262ff000019909216919091179055565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0480546060915f8051602061290083398151915291610b08906127be565b610e2a6113c3565b6002546001600160a01b0390811690831603610eae5760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b65725061697273000000000000006064820152608401610aa9565b610eb88282611505565b5050565b5f33610b97818585611459565b610ed16113c3565b6003546040516001600160a01b03918216918316907fa751787977eeb3902e30e1d19ca00c6ad274a1f622c31a206e32366700b05674905f90a3600380546001600160a01b0319166001600160a01b0392909216919091179055565b610f356113c3565b6001600160a01b0382165f818152601d6020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b5f610f9c6113c3565b620186a0610fb55f805160206129208339815191525490565b610fc0906001612788565b610fca919061279f565b8210156110375760405162461bcd60e51b815260206004820152603560248201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60448201527410181718181892903a37ba30b61039bab838363c9760591b6064820152608401610aa9565b6103e861104f5f805160206129208339815191525490565b61105a906005612788565b611064919061279f565b8211156110d05760405162461bcd60e51b815260206004820152603460248201527f5377617020616d6f756e742063616e6e6f742062652068696768657220746861604482015273371018171a92903a37ba30b61039bab838363c9760611b6064820152608401610aa9565b50600681905560015b919050565b6001600160a01b039182165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace016020908152604080832093909416825291909152205490565b335f908152601d602052604090205460ff166111855760405162461bcd60e51b815260206004820152601c60248201527f45524332303a20466f7262696464656e20666f722041697264726f70000000006044820152606401610aa9565b5f5b82518110156112315761dead6001600160a01b03168382815181106111ae576111ae612809565b60200260200101516001600160a01b0316036111ec576111e7338383815181106111da576111da612809565b6020026020010151611558565b611229565b6112293384838151811061120257611202612809565b602002602001015184848151811061121c5761121c612809565b6020026020010151611459565b600101611187565b505050565b61123e6113c3565b6015849055601683905560178290556018819055808261125e85876127f6565b61126891906127f6565b61127291906127f6565b601481905560191015610cce575f80fd5b5f61128c6113c3565b50600a805460ff19169055600190565b6112a46113c3565b6004546040516001600160a01b03918216918316907ffaf1b77ed79f6e898c44dd8ab36b330c7b2fd39bcaab05ed6362480df8703965905f90a3600480546001600160a01b0319166001600160a01b0392909216919091179055565b6113086113c3565b6001600160a01b03811661133157604051631e4fbdf760e01b81525f6004820152602401610aa9565b61133a816114b6565b50565b335f908152601d602052604090205460ff1661139b5760405162461bcd60e51b815260206004820152601c60248201527f45524332303a20466f7262696464656e20666f722041697264726f70000000006044820152606401610aa9565b61deac196001600160a01b038316016113b857610eb83382611558565b610eb8338383611459565b5f546001600160a01b03163314610d0b5760405163118cdaa760e01b8152336004820152602401610aa9565b6112318383836001611602565b5f61140784846110de565b90505f198114610cce578181101561144b57604051637dc7a0d960e11b81526001600160a01b03841660048201526024810182905260448101839052606401610aa9565b610cce84848484035f611602565b6001600160a01b03831661148257604051634b637e8f60e11b81525f6004820152602401610aa9565b6001600160a01b0382166114ab5760405163ec442f0560e01b81525f6004820152602401610aa9565b6112318383836116e6565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0382165f818152601f6020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b6001600160a01b03821661158157604051634b637e8f60e11b81525f6004820152602401610aa9565b6001600160a01b0382165f8181525f805160206129008339815191526020818152604080842080548781039091555f80516020612920833981519152805488900390559051868152929490939290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91015b60405180910390a350505050565b5f805160206129008339815191526001600160a01b0385166116395760405163e602df0560e01b81525f6004820152602401610aa9565b6001600160a01b03841661166257604051634a1406b160e11b81525f6004820152602401610aa9565b6001600160a01b038086165f908152600183016020908152604080832093881683529290522083905581156116df57836001600160a01b0316856001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925856040516116d691815260200190565b60405180910390a35b5050505050565b805f036116f85761123183835f611e67565b60035461170d906001600160a01b0316610cd4565b600d5560085460ff1615611aee57600254600160a01b900460ff16611aee57600854610100900460ff166117bd576001600160a01b0383165f908152601d602052604090205460ff168061177857506001600160a01b0382165f908152601d602052604090205460ff165b6117bd5760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b6044820152606401610aa9565b600a5460ff16156118b9575f546001600160a01b038381169116148015906117f357506001546001600160a01b03838116911614155b801561180d57506002546001600160a01b03838116911614155b156118b957325f9081526009602052604090205443116118a75760405162461bcd60e51b815260206004820152604960248201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60448201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b6064820152681030b63637bbb2b21760b91b608482015260a401610aa9565b325f9081526009602052604090204390555b6001600160a01b0383165f908152601f602052604090205460ff1680156118f857506001600160a01b0382165f908152601e602052604090205460ff16155b156119c6576005548111156119675760405162461bcd60e51b815260206004820152602f60248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201526e36b0bc2a3930b739b0b1ba34b7b71760891b6064820152608401610aa9565b60075461197383610cd4565b61197d90836127f6565b11156119c15760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610aa9565b611aee565b6001600160a01b0382165f908152601f602052604090205460ff168015611a0557506001600160a01b0383165f908152601e602052604090205460ff16155b15611a75576005548111156119c15760405162461bcd60e51b815260206004820152603060248201527f53656c6c207472616e7366657220616d6f756e7420657863656564732074686560448201526f1036b0bc2a3930b739b0b1ba34b7b71760811b6064820152608401610aa9565b6001600160a01b0382165f908152601e602052604090205460ff16611aee57600754611aa083610cd4565b611aaa90836127f6565b1115611aee5760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610aa9565b5f611af830610cd4565b60065490915081108015908190611b17575060085462010000900460ff165b8015611b2d5750600254600160a01b900460ff16155b8015611b5157506001600160a01b0385165f908152601f602052604090205460ff16155b8015611b7557506001600160a01b0385165f908152601d602052604090205460ff16155b8015611b9957506001600160a01b0384165f908152601d602052604090205460ff16155b15611bc7576002805460ff60a01b1916600160a01b179055611bb9611f92565b6002805460ff60a01b191690555b6002546001600160a01b0386165f908152601d602052604090205460ff600160a01b909204821615911680611c1357506001600160a01b0385165f908152601d602052604090205460ff165b15611c1b57505f5b5f8115611e53576001600160a01b0386165f908152601f602052604090205460ff168015611c4a57505f601454115b15611d2e57606460145486611c5f9190612788565b611c69919061279f565b905060145460165482611c7c9190612788565b611c86919061279f565b601a5f828254611c9691906127f6565b9091555050601454601754611cab9083612788565b611cb5919061279f565b601b5f828254611cc591906127f6565b9091555050601454601554611cda9083612788565b611ce4919061279f565b60195f828254611cf491906127f6565b9091555050601454601854611d099083612788565b611d13919061279f565b601c5f828254611d2391906127f6565b90915550611e359050565b6001600160a01b0387165f908152601f602052604090205460ff168015611d5657505f600f54115b15611e35576064600f5486611d6b9190612788565b611d75919061279f565b9050600f5460115482611d889190612788565b611d92919061279f565b601a5f828254611da291906127f6565b9091555050600f54601254611db79083612788565b611dc1919061279f565b601b5f828254611dd191906127f6565b9091555050600f54601054611de69083612788565b611df0919061279f565b60195f828254611e0091906127f6565b9091555050600f54601354611e159083612788565b611e1f919061279f565b601c5f828254611e2f91906127f6565b90915550505b8015611e4657611e46873083611e67565b611e50818661281d565b94505b611e5e878787611e67565b50505050505050565b5f805160206129008339815191526001600160a01b038416611ea15781816002015f828254611e9691906127f6565b90915550611f119050565b6001600160a01b0384165f9081526020829052604090205482811015611ef35760405163391434e360e21b81526001600160a01b03861660048201526024810182905260448101849052606401610aa9565b6001600160a01b0385165f9081526020839052604090209083900390555b6001600160a01b038316611f2f576002810180548390039055611f4d565b6001600160a01b0383165f9081526020829052604090208054830190555b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516115f491815260200190565b5f611f9c30610cd4565b90505f600d54600c54611faf919061281d565b9050620186a0811115611fc0575050565b5f601c54601b54601954601a54611fd791906127f6565b611fe191906127f6565b611feb91906127f6565b90505f831580611ff9575081155b156120045750505050565b60065461201290600a612788565b84111561202a5760065461202790600a612788565b93505b5f600283601a548761203c9190612788565b612046919061279f565b612050919061279f565b90505f61205d828761281d565b9050476120698261222a565b5f612074824761281d565b90505f86601954836120869190612788565b612090919061279f565b90505f87601b54846120a29190612788565b6120ac919061279f565b90505f88601c54856120be9190612788565b6120c8919061279f565b90505f81836120d7868861281d565b6120e1919061281d565b6120eb919061281d565b5f601a8190556019819055601b819055601c8190556004546040519293506001600160a01b031691859181818185875af1925050503d805f811461214a576040519150601f19603f3d011682016040523d82523d5f602084013e61214f565b606091505b5090995050871580159061216257505f81115b156121b557612171888261237a565b601a54604080518981526020810184905280820192909252517f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619181900360600190a15b6003546040516001600160a01b039091169047905f81818185875af1925050503d805f81146121ff576040519150601f19603f3d011682016040523d82523d5f602084013e612204565b606091505b5050600c8054919a505f61221783612830565b9190505550505050505050505050505050565b6040805160028082526060820183525f9260208301908036833701905050905030815f8151811061225d5761225d612809565b6001600160a01b03928316602091820292909201810191909152600154604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156122b4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122d89190612848565b816001815181106122eb576122eb612809565b6001600160a01b03928316602091820292909201015260015461231191309116846113ef565b60015460405163791ac94760e01b81526001600160a01b039091169063791ac947906123499085905f90869030904290600401612863565b5f604051808303815f87803b158015612360575f80fd5b505af1158015612372573d5f803e3d5ffd5b505050505050565b6001546123929030906001600160a01b0316846113ef565b60015460405163f305d71960e01b8152306004820152602481018490525f60448201819052606482015261dead60848201524260a48201526001600160a01b039091169063f305d71990839060c40160606040518083038185885af11580156123fd573d5f803e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906116df91906128d4565b5f60208284031215612432575f80fd5b5035919050565b5f602080835283518060208501525f5b8181101561246557858101830151858201604001528201612449565b505f604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b038116811461133a575f80fd5b5f80604083850312156124aa575f80fd5b82356124b581612485565b946020939093013593505050565b5f805f606084860312156124d5575f80fd5b83356124e081612485565b925060208401356124f081612485565b929592945050506040919091013590565b5f805f8060808587031215612514575f80fd5b5050823594602084013594506040840135936060013592509050565b5f60208284031215612540575f80fd5b813561254b81612485565b9392505050565b803580151581146110d9575f80fd5b5f8060408385031215612572575f80fd5b823561257d81612485565b915061258b60208401612552565b90509250929050565b5f602082840312156125a4575f80fd5b61254b82612552565b5f80604083850312156125be575f80fd5b82356125c981612485565b915060208301356125d981612485565b809150509250929050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612621576126216125e4565b604052919050565b5f67ffffffffffffffff821115612642576126426125e4565b5060051b60200190565b5f82601f83011261265b575f80fd5b8135602061267061266b83612629565b6125f8565b8083825260208201915060208460051b870101935086841115612691575f80fd5b602086015b848110156126ad5780358352918301918301612696565b509695505050505050565b5f80604083850312156126c9575f80fd5b823567ffffffffffffffff808211156126e0575f80fd5b818501915085601f8301126126f3575f80fd5b8135602061270361266b83612629565b82815260059290921b84018101918181019089841115612721575f80fd5b948201945b8386101561274857853561273981612485565b82529482019490820190612726565b9650508601359250508082111561275d575f80fd5b5061276a8582860161264c565b9150509250929050565b634e487b7160e01b5f52601160045260245ffd5b8082028115828204841417610b9d57610b9d612774565b5f826127b957634e487b7160e01b5f52601260045260245ffd5b500490565b600181811c908216806127d257607f821691505b6020821081036127f057634e487b7160e01b5f52602260045260245ffd5b50919050565b80820180821115610b9d57610b9d612774565b634e487b7160e01b5f52603260045260245ffd5b81810381811115610b9d57610b9d612774565b5f6001820161284157612841612774565b5060010190565b5f60208284031215612858575f80fd5b815161254b81612485565b5f60a08201878352602087602085015260a0604085015281875180845260c0860191506020890193505f5b818110156128b35784516001600160a01b03168352938301939183019160010161288e565b50506001600160a01b03969096166060850152505050608001529392505050565b5f805f606084860312156128e6575f80fd5b835192506020840151915060408401519050925092509256fe52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0052c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace02a2646970667358221220b1dbd98d4a535d81b26694a8c8a5a6167afc6bc542032f672598f8b6762c3fcf64736f6c63430008160033

Deployed Bytecode Sourcemap

33360:17818:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39739:265;;;;;;;;;;-1:-1:-1;39739:265:0;;;;;:::i;:::-;;:::i;:::-;;23178:147;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25749:188;;;;;;;;;;-1:-1:-1;25749:188:0;;;;;:::i;:::-;;:::i;:::-;;;1373:14:1;;1366:22;1348:41;;1336:2;1321:18;25749:188:0;1208:187:1;33412:41:0;;;;;;;;;;-1:-1:-1;33412:41:0;;;;-1:-1:-1;;;;;33412:41:0;;;;;;-1:-1:-1;;;;;1590:32:1;;;1572:51;;1560:2;1545:18;33412:41:0;1400:229:1;24392:155:0;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;24525:14:0;24392:155;;;1780:25:1;;;1768:2;1753:18;24392:155:0;1634:177:1;34569:33:0;;;;;;;;;;;;;;;;34690;;;;;;;;;;;;;;;;40012:250;;;;;;;;;;-1:-1:-1;40012:250:0;;;;;:::i;:::-;;:::i;34650:33::-;;;;;;;;;;;;;;;;26515:247;;;;;;;;;;-1:-1:-1;26515:247:0;;;;;:::i;:::-;;:::i;33495:53::-;;;;;;;;;;;;33541:6;33495:53;;40635:498;;;;;;;;;;-1:-1:-1;40635:498:0;;;;;:::i;:::-;;:::i;24243:84::-;;;;;;;;;;-1:-1:-1;24243:84:0;;24317:2;3017:36:1;;3005:2;2990:18;24243:84:0;2875:184:1;33460:28:0;;;;;;;;;;-1:-1:-1;33460:28:0;;;;-1:-1:-1;;;;;33460:28:0;;;33872:26;;;;;;;;;;-1:-1:-1;33872:26:0;;;;;;;;34609:32;;;;;;;;;;;;;;;;42357:126;;;;;;;;;;-1:-1:-1;42357:126:0;;;;;:::i;:::-;-1:-1:-1;;;;;42447:28:0;42423:4;42447:28;;;:19;:28;;;;;;;;;42357:126;34418:31;;;;;;;;;;;;;;;;34458:28;;;;;;;;;;;;;;;;33937:23;;;;;;;;;;-1:-1:-1;33937:23:0;;;;;;;;;;;24610:174;;;;;;;;;;-1:-1:-1;24610:174:0;;;;;:::i;:::-;;:::i;3571:103::-;;;;;;;;;;;;;:::i;38847:121::-;;;;;;;;;;;;;:::i;40270:161::-;;;;;;;;;;-1:-1:-1;40270:161:0;;;;;:::i;:::-;;:::i;33669:38::-;;;;;;;;;;-1:-1:-1;33669:38:0;;;;-1:-1:-1;;;;;33669:38:0;;;34305:30;;;;;;;;;;;;;;;;38594:201;;;;;;;;;;;;;:::i;2896:87::-;;;;;;;;;;-1:-1:-1;2942:7:0;2969:6;-1:-1:-1;;;;;2969:6:0;2896:87;;34493:31;;;;;;;;;;;;;;;;40527:100;;;;;;;;;;-1:-1:-1;40527:100:0;;;;;:::i;:::-;;:::i;23444:151::-;;;;;;;;;;;;;:::i;41849:304::-;;;;;;;;;;-1:-1:-1;41849:304:0;;;;;:::i;:::-;;:::i;24989:180::-;;;;;;;;;;-1:-1:-1;24989:180:0;;;;;:::i;:::-;;:::i;42696:216::-;;;;;;;;;;-1:-1:-1;42696:216:0;;;;;:::i;:::-;;:::i;34379:32::-;;;;;;;;;;;;;;;;34940:57;;;;;;;;;;-1:-1:-1;34940:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;33905:25;;;;;;;;;;-1:-1:-1;33905:25:0;;;;;;;;;;;41659:182;;;;;;;;;;-1:-1:-1;41659:182:0;;;;;:::i;:::-;;:::i;33714:40::-;;;;;;;;;;-1:-1:-1;33714:40:0;;;;-1:-1:-1;;;;;33714:40:0;;;33763:29;;;;;;;;;;;;;;;;34095:32;;;;;;;;;;-1:-1:-1;34095:32:0;;;;;;;;39234:497;;;;;;;;;;-1:-1:-1;39234:497:0;;;;;:::i;:::-;;:::i;34271:27::-;;;;;;;;;;;;;;;;25232:198;;;;;;;;;;-1:-1:-1;25232:198:0;;;;;:::i;:::-;;:::i;34874:57::-;;;;;;;;;;-1:-1:-1;34874:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;33799:33;;;;;;;;;;;;;;;;43239:452;;;;;;;;;;-1:-1:-1;43239:452:0;;;;;:::i;:::-;;:::i;41141:510::-;;;;;;;;;;-1:-1:-1;41141:510:0;;;;;:::i;:::-;;:::i;39029:135::-;;;;;;;;;;;;;:::i;34730:35::-;;;;;;;;;;;;;;;;42491:197;;;;;;;;;;-1:-1:-1;42491:197:0;;;;;:::i;:::-;;:::i;34342:30::-;;;;;;;;;;;;;;;;3829:220;;;;;;;;;;-1:-1:-1;3829:220:0;;;;;:::i;:::-;;:::i;34531:31::-;;;;;;;;;;;;;;;;33555:75;;;;;;;;;;;;33588:42;33555:75;;33839:24;;;;;;;;;;;;;;;;34772:34;;;;;;;;;;;;;;;;42920:311;;;;;;;;;;-1:-1:-1;42920:311:0;;;;;:::i;:::-;;:::i;39739:265::-;2782:13;:11;:13::i;:::-;39878:4:::1;39870;39849:13;-1:-1:-1::0;;;;;;;;;;;24525:14:0;;24392:155;39849:13:::1;:17;::::0;39865:1:::1;39849:17;:::i;:::-;39848:26;;;;:::i;:::-;39847:35;;;;:::i;:::-;39837:6;:45;;39815:136;;;::::0;-1:-1:-1;;;39815:136:0;;8085:2:1;39815:136:0::1;::::0;::::1;8067:21:1::0;8124:2;8104:18;;;8097:30;8163:34;8143:18;;;8136:62;-1:-1:-1;;;8214:18:1;;;8207:39;8263:19;;39815:136:0::1;;;;;;;;;39979:17;:6:::0;39989::::1;39979:17;:::i;:::-;39962:14;:34:::0;-1:-1:-1;39739:265:0:o;23178:147::-;23310:7;23303:14;;23223:13;;-1:-1:-1;;;;;;;;;;;22886:20:0;23303:14;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23178:147;:::o;25749:188::-;25822:4;25855:10;25876:31;25855:10;25892:7;25901:5;25876:8;:31::i;:::-;25925:4;25918:11;;;25749:188;;;;;:::o;40012:250::-;2782:13;:11;:13::i;:::-;40146:4:::1;40138;40117:13;-1:-1:-1::0;;;;;;;;;;;24525:14:0;;24392:155;40117:13:::1;:17;::::0;40133:1:::1;40117:17;:::i;:::-;40116:26;;;;:::i;:::-;40115:35;;;;:::i;:::-;40105:6;:45;;40083:131;;;::::0;-1:-1:-1;;;40083:131:0;;8880:2:1;40083:131:0::1;::::0;::::1;8862:21:1::0;8919:2;8899:18;;;8892:30;8958:34;8938:18;;;8931:62;-1:-1:-1;;;9009:18:1;;;9002:34;9053:19;;40083:131:0::1;8678:400:1::0;40083:131:0::1;40237:17;:6:::0;40247::::1;40237:17;:::i;:::-;40225:9;:29:::0;-1:-1:-1;40012:250:0:o;26515:247::-;26602:4;26637:10;26658:37;26674:4;26637:10;26689:5;26658:15;:37::i;:::-;26706:26;26716:4;26722:2;26726:5;26706:9;:26::i;:::-;-1:-1:-1;26750:4:0;;26515:247;-1:-1:-1;;;;26515:247:0:o;40635:498::-;2782:13;:11;:13::i;:::-;40826:15:::1;:31:::0;;;40868:15:::1;:31:::0;;;40910:17:::1;:35:::0;;;40956:16:::1;:33:::0;;;40975:14;40930:15;41015:33:::1;40886:13:::0;40844;41015:33:::1;:::i;:::-;:53;;;;:::i;:::-;:72;;;;:::i;:::-;41000:12;:87:::0;;;41122:2:::1;-1:-1:-1::0;41106:18:0::1;41098:27;;;::::0;::::1;;40635:498:::0;;;;:::o;24610:174::-;-1:-1:-1;;;;;24756:20:0;24675:7;24756:20;;;-1:-1:-1;;;;;;;;;;;24756:20:0;;;;;;;24610:174::o;3571:103::-;2782:13;:11;:13::i;:::-;3636:30:::1;3663:1;3636:18;:30::i;:::-;3571:103::o:0;38847:121::-;38899:4;2782:13;:11;:13::i;:::-;-1:-1:-1;38916:14:0::1;:22:::0;;-1:-1:-1;;38916:22:0::1;::::0;;;38847:121;:::o;40270:161::-;2782:13;:11;:13::i;:::-;-1:-1:-1;;;;;40383:33:0;;;::::1;;::::0;;;:25:::1;:33;::::0;;;;:40;;-1:-1:-1;;40383:40:0::1;::::0;::::1;;::::0;;;::::1;::::0;;40270:161::o;38594:201::-;2782:13;:11;:13::i;:::-;38658::::1;::::0;::::1;::::0;::::1;;;38657:14;38649:41;;;::::0;-1:-1:-1;;;38649:41:0;;9415:2:1;38649:41:0::1;::::0;::::1;9397:21:1::0;9454:2;9434:18;;;9427:30;-1:-1:-1;;;9473:18:1;;;9466:44;9527:18;;38649:41:0::1;9213:338:1::0;38649:41:0::1;38701:13;:20:::0;;38746:12:::1;38732:11;:26:::0;-1:-1:-1;;38769:18:0;;;;;38594:201::o;40527:100::-;2782:13;:11;:13::i;:::-;40598:11:::1;:21:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;40598:21:0;;::::1;::::0;;;::::1;::::0;;40527:100::o;23444:151::-;23578:9;23571:16;;23491:13;;-1:-1:-1;;;;;;;;;;;22886:20:0;23571:16;;;:::i;41849:304::-;2782:13;:11;:13::i;:::-;41993::::1;::::0;-1:-1:-1;;;;;41993:13:0;;::::1;41985:21:::0;;::::1;::::0;41963:128:::1;;;::::0;-1:-1:-1;;;41963:128:0;;9758:2:1;41963:128:0::1;::::0;::::1;9740:21:1::0;9797:2;9777:18;;;9770:30;9836:34;9816:18;;;9809:62;9907:27;9887:18;;;9880:55;9952:19;;41963:128:0::1;9556:421:1::0;41963:128:0::1;42104:41;42133:4;42139:5;42104:28;:41::i;:::-;41849:304:::0;;:::o;24989:180::-;25058:4;25091:10;25112:27;25091:10;25129:2;25133:5;25112:9;:27::i;42696:216::-;2782:13;:11;:13::i;:::-;42841:15:::1;::::0;42798:59:::1;::::0;-1:-1:-1;;;;;42841:15:0;;::::1;::::0;42798:59;::::1;::::0;::::1;::::0;42841:15:::1;::::0;42798:59:::1;42868:15;:36:::0;;-1:-1:-1;;;;;;42868:36:0::1;-1:-1:-1::0;;;;;42868:36:0;;;::::1;::::0;;;::::1;::::0;;42696:216::o;41659:182::-;2782:13;:11;:13::i;:::-;-1:-1:-1;;;;;41744:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;41744:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;41799:34;;1348:41:1;;;41799:34:0::1;::::0;1321:18:1;41799:34:0::1;;;;;;;41659:182:::0;;:::o;39234:497::-;39342:4;2782:13;:11;:13::i;:::-;39421:6:::1;39400:13;-1:-1:-1::0;;;;;;;;;;;24525:14:0;;24392:155;39400:13:::1;:17;::::0;39416:1:::1;39400:17;:::i;:::-;39399:28;;;;:::i;:::-;39386:9;:41;;39364:144;;;::::0;-1:-1:-1;;;39364:144:0;;10184:2:1;39364:144:0::1;::::0;::::1;10166:21:1::0;10223:2;10203:18;;;10196:30;10262:34;10242:18;;;10235:62;-1:-1:-1;;;10313:18:1;;;10306:51;10374:19;;39364:144:0::1;9982:417:1::0;39364:144:0::1;39576:4;39555:13;-1:-1:-1::0;;;;;;;;;;;24525:14:0;;24392:155;39555:13:::1;:17;::::0;39571:1:::1;39555:17;:::i;:::-;39554:26;;;;:::i;:::-;39541:9;:39;;39519:141;;;::::0;-1:-1:-1;;;39519:141:0;;10606:2:1;39519:141:0::1;::::0;::::1;10588:21:1::0;10645:2;10625:18;;;10618:30;10684:34;10664:18;;;10657:62;-1:-1:-1;;;10735:18:1;;;10728:50;10795:19;;39519:141:0::1;10404:416:1::0;39519:141:0::1;-1:-1:-1::0;39671:18:0::1;:30:::0;;;39719:4:::1;2806:1;39234:497:::0;;;:::o;25232:198::-;-1:-1:-1;;;;;25393:20:0;;;25312:7;25393:20;;;:13;:20;;;;;;;;:29;;;;;;;;;;;;;25232:198::o;43239:452::-;43364:10;42423:4;42447:28;;;:19;:28;;;;;;;;43337:71;;;;-1:-1:-1;;;43337:71:0;;11027:2:1;43337:71:0;;;11009:21:1;11066:2;11046:18;;;11039:30;11105;11085:18;;;11078:58;11153:18;;43337:71:0;10825:352:1;43337:71:0;43424:9;43419:265;43443:6;:13;43439:1;:17;43419:265;;;43503:6;-1:-1:-1;;;;;43482:28:0;:6;43489:1;43482:9;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;43482:28:0;;43478:195;;43531:32;43537:10;43549;43560:1;43549:13;;;;;;;;:::i;:::-;;;;;;;43531:5;:32::i;:::-;43478:195;;;43604:53;43620:10;43632:6;43639:1;43632:9;;;;;;;;:::i;:::-;;;;;;;43643:10;43654:1;43643:13;;;;;;;;:::i;:::-;;;;;;;43604:15;:53::i;:::-;43458:3;;43419:265;;;;43239:452;;:::o;41141:510::-;2782:13;:11;:13::i;:::-;41333:16:::1;:32:::0;;;41376:16:::1;:32:::0;;;41419:18:::1;:36:::0;;;41466:17:::1;:34:::0;;;41486:14;41440:15;41527:35:::1;41395:13:::0;41352;41527:35:::1;:::i;:::-;:56;;;;:::i;:::-;:76;;;;:::i;:::-;41511:13;:92:::0;;;41639:2:::1;-1:-1:-1::0;41622:19:0::1;41614:28;;;::::0;::::1;39029:135:::0;39089:4;2782:13;:11;:13::i;:::-;-1:-1:-1;39106:20:0::1;:28:::0;;-1:-1:-1;;39106:28:0::1;::::0;;;39029:135;:::o;42491:197::-;2782:13;:11;:13::i;:::-;42622:17:::1;::::0;42586:54:::1;::::0;-1:-1:-1;;;;;42622:17:0;;::::1;::::0;42586:54;::::1;::::0;::::1;::::0;42622:17:::1;::::0;42586:54:::1;42651:17;:29:::0;;-1:-1:-1;;;;;;42651:29:0::1;-1:-1:-1::0;;;;;42651:29:0;;;::::1;::::0;;;::::1;::::0;;42491:197::o;3829:220::-;2782:13;:11;:13::i;:::-;-1:-1:-1;;;;;3914:22:0;::::1;3910:93;;3960:31;::::0;-1:-1:-1;;;3960:31:0;;3988:1:::1;3960:31;::::0;::::1;1572:51:1::0;1545:18;;3960:31:0::1;1400:229:1::0;3910:93:0::1;4013:28;4032:8;4013:18;:28::i;:::-;3829:220:::0;:::o;42920:311::-;43018:10;42423:4;42447:28;;;:19;:28;;;;;;;;42991:71;;;;-1:-1:-1;;;42991:71:0;;11027:2:1;42991:71:0;;;11009:21:1;11066:2;11046:18;;;11039:30;11105;11085:18;;;11078:58;11153:18;;42991:71:0;10825:352:1;42991:71:0;-1:-1:-1;;;;;;;43077:21:0;;;43073:151;;43115:25;43121:10;43133:6;43115:5;:25::i;43073:151::-;43173:39;43189:10;43201:2;43205:6;43173:15;:39::i;3061:166::-;2942:7;2969:6;-1:-1:-1;;;;;2969:6:0;930:10;3121:23;3117:103;;3168:40;;-1:-1:-1;;;3168:40:0;;930:10;3168:40;;;1572:51:1;1545:18;;3168:40:0;1400:229:1;31094:130:0;31179:37;31188:5;31195:7;31204:5;31211:4;31179:8;:37::i;32866:487::-;32966:24;32993:25;33003:5;33010:7;32993:9;:25::i;:::-;32966:52;;-1:-1:-1;;33033:16:0;:37;33029:317;;33110:5;33091:16;:24;33087:132;;;33143:60;;-1:-1:-1;;;33143:60:0;;-1:-1:-1;;;;;11534:32:1;;33143:60:0;;;11516:51:1;11583:18;;;11576:34;;;11626:18;;;11619:34;;;11489:18;;33143:60:0;11314:345:1;33087:132:0;33262:57;33271:5;33278:7;33306:5;33287:16;:24;33313:5;33262:8;:57::i;27147:308::-;-1:-1:-1;;;;;27231:18:0;;27227:88;;27273:30;;-1:-1:-1;;;27273:30:0;;27300:1;27273:30;;;1572:51:1;1545:18;;27273:30:0;1400:229:1;27227:88:0;-1:-1:-1;;;;;27329:16:0;;27325:88;;27369:32;;-1:-1:-1;;;27369:32:0;;27398:1;27369:32;;;1572:51:1;1545:18;;27369:32:0;1400:229:1;27325:88:0;27423:24;27431:4;27437:2;27441:5;27423:7;:24::i;4209:191::-;4283:16;4302:6;;-1:-1:-1;;;;;4319:17:0;;;-1:-1:-1;;;;;;4319:17:0;;;;;;4352:40;;4302:6;;;;;;;4352:40;;4283:16;4352:40;4272:128;4209:191;:::o;42161:188::-;-1:-1:-1;;;;;42244:31:0;;;;;;:25;:31;;;;;;:39;;-1:-1:-1;;42244:39:0;;;;;;;;;;42301:40;;42244:39;;:31;42301:40;;;42161:188;;:::o;29872:669::-;-1:-1:-1;;;;;29943:21:0;;29939:91;;29988:30;;-1:-1:-1;;;29988:30:0;;30015:1;29988:30;;;1572:51:1;1545:18;;29988:30:0;1400:229:1;29939:91:0;-1:-1:-1;;;;;30126:20:0;;30050:22;30126:20;;;-1:-1:-1;;;;;;;;;;;30126:20:0;;;;;;;;;;30281:19;;;30258:42;;;-1:-1:-1;;;;;;;;;;;30447:23:0;;;;;;;30497:36;;1780:25:1;;;22886:20:0;;30126;;30050:22;30126:20;;30497:36;;1753:18:1;30497:36:0;;;;;;;;29928:613;;29872:669;;:::o;32075:499::-;-1:-1:-1;;;;;;;;;;;;;;;;32242:19:0;;32238:91;;32285:32;;-1:-1:-1;;;32285:32:0;;32314:1;32285:32;;;1572:51:1;1545:18;;32285:32:0;1400:229:1;32238:91:0;-1:-1:-1;;;;;32343:21:0;;32339:92;;32388:31;;-1:-1:-1;;;32388:31:0;;32416:1;32388:31;;;1572:51:1;1545:18;;32388:31:0;1400:229:1;32339:92:0;-1:-1:-1;;;;;32441:20:0;;;;;;;:13;;;:20;;;;;;;;:29;;;;;;;;;:37;;;32489:78;;;;32540:7;-1:-1:-1;;;;;32524:31:0;32533:5;-1:-1:-1;;;;;32524:31:0;;32549:5;32524:31;;;;1780:25:1;;1768:2;1753:18;;1634:177;32524:31:0;;;;;;;;32489:78;32173:401;32075:499;;;;:::o;43699:4332::-;43825:6;43835:1;43825:11;43821:91;;43853:26;43867:4;43873:2;43877:1;43853:13;:26::i;43821:91::-;43939:15;;43929:26;;-1:-1:-1;;;;;43939:15:0;43929:9;:26::i;:::-;43922:4;:33;43970:14;;;;43966:2264;;;44006:8;;-1:-1:-1;;;44006:8:0;;;;44001:2218;;44040:13;;;;;;;44035:223;;-1:-1:-1;;;;;44112:25:0;;;;;;:19;:25;;;;;;;;;:52;;-1:-1:-1;;;;;;44141:23:0;;;;;;:19;:23;;;;;;;;44112:52;44078:160;;;;-1:-1:-1;;;44078:160:0;;11866:2:1;44078:160:0;;;11848:21:1;11905:2;11885:18;;;11878:30;-1:-1:-1;;;11924:18:1;;;11917:52;11986:18;;44078:160:0;11664:346:1;44078:160:0;44414:20;;;;44410:641;;;2942:7;2969:6;-1:-1:-1;;;;;44489:13:0;;;2969:6;;44489:13;;;;:72;;-1:-1:-1;44545:15:0;;-1:-1:-1;;;;;44531:30:0;;;44545:15;;44531:30;;44489:72;:129;;;;-1:-1:-1;44604:13:0;;-1:-1:-1;;;;;44590:28:0;;;44604:13;;44590:28;;44489:129;44459:573;;;44736:9;44707:39;;;;:28;:39;;;;;;44782:12;-1:-1:-1;44669:258:0;;;;-1:-1:-1;;;44669:258:0;;12217:2:1;44669:258:0;;;12199:21:1;12256:2;12236:18;;;12229:30;12295:34;12275:18;;;12268:62;12366:34;12346:18;;;12339:62;-1:-1:-1;;;12417:19:1;;;12410:40;12467:19;;44669:258:0;12015:477:1;44669:258:0;44983:9;44954:39;;;;:28;:39;;;;;44996:12;44954:54;;44459:573;-1:-1:-1;;;;;45125:31:0;;;;;;:25;:31;;;;;;;;:86;;;;-1:-1:-1;;;;;;45182:29:0;;;;;;:25;:29;;;;;;;;45181:30;45125:86;45099:1105;;;45298:14;;45288:6;:24;;45254:157;;;;-1:-1:-1;;;45254:157:0;;12699:2:1;45254:157:0;;;12681:21:1;12738:2;12718:18;;;12711:30;12777:34;12757:18;;;12750:62;-1:-1:-1;;;12828:18:1;;;12821:45;12883:19;;45254:157:0;12497:411:1;45254:157:0;45494:9;;45477:13;45487:2;45477:9;:13::i;:::-;45468:22;;:6;:22;:::i;:::-;:35;;45434:140;;;;-1:-1:-1;;;45434:140:0;;13115:2:1;45434:140:0;;;13097:21:1;13154:2;13134:18;;;13127:30;-1:-1:-1;;;13173:18:1;;;13166:49;13232:18;;45434:140:0;12913:343:1;45434:140:0;45099:1105;;;-1:-1:-1;;;;;45672:29:0;;;;;;:25;:29;;;;;;;;:86;;;;-1:-1:-1;;;;;;45727:31:0;;;;;;:25;:31;;;;;;;;45726:32;45672:86;45646:558;;;45845:14;;45835:6;:24;;45801:158;;;;-1:-1:-1;;;45801:158:0;;13463:2:1;45801:158:0;;;13445:21:1;13502:2;13482:18;;;13475:30;13541:34;13521:18;;;13514:62;-1:-1:-1;;;13592:18:1;;;13585:46;13648:19;;45801:158:0;13261:412:1;45646:558:0;-1:-1:-1;;;;;45990:29:0;;;;;;:25;:29;;;;;;;;45985:219;;46104:9;;46087:13;46097:2;46087:9;:13::i;:::-;46078:22;;:6;:22;:::i;:::-;:35;;46044:140;;;;-1:-1:-1;;;46044:140:0;;13115:2:1;46044:140:0;;;13097:21:1;13154:2;13134:18;;;13127:30;-1:-1:-1;;;13173:18:1;;;13166:49;13232:18;;46044:140:0;12913:343:1;46044:140:0;46242:28;46273:24;46291:4;46273:9;:24::i;:::-;46347:18;;46242:55;;-1:-1:-1;46323:42:0;;;;;;;46394:35;;-1:-1:-1;46418:11:0;;;;;;;46394:35;:61;;;;-1:-1:-1;46447:8:0;;-1:-1:-1;;;46447:8:0;;;;46446:9;46394:61;:110;;;;-1:-1:-1;;;;;;46473:31:0;;;;;;:25;:31;;;;;;;;46472:32;46394:110;:153;;;;-1:-1:-1;;;;;;46522:25:0;;;;;;:19;:25;;;;;;;;46521:26;46394:153;:194;;;;-1:-1:-1;;;;;;46565:23:0;;;;;;:19;:23;;;;;;;;46564:24;46394:194;46376:322;;;46615:8;:15;;-1:-1:-1;;;;46615:15:0;-1:-1:-1;;;46615:15:0;;;46645:10;:8;:10::i;:::-;46670:8;:16;;-1:-1:-1;;;;46670:16:0;;;46376:322;46724:8;;-1:-1:-1;;;;;46747:25:0;;46708:12;46747:25;;;:19;:25;;;;;;46724:8;-1:-1:-1;;;46724:8:0;;;;;46723:9;;46747:25;;:52;;-1:-1:-1;;;;;;46776:23:0;;;;;;:19;:23;;;;;;;;46747:52;46743:100;;;-1:-1:-1;46826:5:0;46743:100;46853:12;46884:7;46880:1102;;;-1:-1:-1;;;;;46912:29:0;;;;;;:25;:29;;;;;;;;:50;;;;;46961:1;46945:13;;:17;46912:50;46908:931;;;47015:3;46999:13;;46990:6;:22;;;;:::i;:::-;:28;;;;:::i;:::-;46983:35;;47087:13;;47067:16;;47060:4;:23;;;;:::i;:::-;47059:41;;;;:::i;:::-;47037:18;;:63;;;;;;;:::i;:::-;;;;-1:-1:-1;;47173:13:0;;47151:18;;47144:25;;:4;:25;:::i;:::-;47143:43;;;;:::i;:::-;47119:20;;:67;;;;;;;:::i;:::-;;;;-1:-1:-1;;47255:13:0;;47235:16;;47228:23;;:4;:23;:::i;:::-;47227:41;;;;:::i;:::-;47205:18;;:63;;;;;;;:::i;:::-;;;;-1:-1:-1;;47339:13:0;;47318:17;;47311:24;;:4;:24;:::i;:::-;47310:42;;;;:::i;:::-;47287:19;;:65;;;;;;;:::i;:::-;;;;-1:-1:-1;46908:931:0;;-1:-1:-1;46908:931:0;;-1:-1:-1;;;;;47391:31:0;;;;;;:25;:31;;;;;;;;:51;;;;;47441:1;47426:12;;:16;47391:51;47387:452;;;47494:3;47479:12;;47470:6;:21;;;;:::i;:::-;:27;;;;:::i;:::-;47463:34;;47565:12;;47546:15;;47539:4;:22;;;;:::i;:::-;47538:39;;;;:::i;:::-;47516:18;;:61;;;;;;;:::i;:::-;;;;-1:-1:-1;;47649:12:0;;47628:17;;47621:24;;:4;:24;:::i;:::-;47620:41;;;;:::i;:::-;47596:20;;:65;;;;;;;:::i;:::-;;;;-1:-1:-1;;47729:12:0;;47710:15;;47703:22;;:4;:22;:::i;:::-;47702:39;;;;:::i;:::-;47680:18;;:61;;;;;;;:::i;:::-;;;;-1:-1:-1;;47811:12:0;;47791:16;;47784:23;;:4;:23;:::i;:::-;47783:40;;;;:::i;:::-;47760:19;;:63;;;;;;;:::i;:::-;;;;-1:-1:-1;;47387:452:0;47857:8;;47853:89;;47886:40;47900:4;47914;47921;47886:13;:40::i;:::-;47956:14;47966:4;47956:14;;:::i;:::-;;;46880:1102;47992:31;48006:4;48012:2;48016:6;47992:13;:31::i;:::-;43810:4221;;;;43699:4332;;;:::o;27779:1199::-;-1:-1:-1;;;;;;;;;;;;;;;;27923:18:0;;27919:558;;28079:5;28061:1;:14;;;:23;;;;;;;:::i;:::-;;;;-1:-1:-1;27919:558:0;;-1:-1:-1;27919:558:0;;-1:-1:-1;;;;;28139:17:0;;28117:19;28139:17;;;;;;;;;;;28175:19;;;28171:117;;;28222:50;;-1:-1:-1;;;28222:50:0;;-1:-1:-1;;;;;11534:32:1;;28222:50:0;;;11516:51:1;11583:18;;;11576:34;;;11626:18;;;11619:34;;;11489:18;;28222:50:0;11314:345:1;28171:117:0;-1:-1:-1;;;;;28411:17:0;;:11;:17;;;;;;;;;;28431:19;;;;28411:39;;27919:558;-1:-1:-1;;;;;28493:16:0;;28489:439;;28659:14;;;:23;;;;;;;28489:439;;;-1:-1:-1;;;;;28877:15:0;;:11;:15;;;;;;;;;;:24;;;;;;28489:439;28960:2;-1:-1:-1;;;;;28945:25:0;28954:4;-1:-1:-1;;;;;28945:25:0;;28964:5;28945:25;;;;1780::1;;1768:2;1753:18;;1634:177;49165:2010:0;49204:23;49230:24;49248:4;49230:9;:24::i;:::-;49204:50;;49265:14;49291:4;;49282:6;;:13;;;;:::i;:::-;49265:30;;49319:6;49310;:15;49306:54;;;49342:7;;49165:2010::o;49306:54::-;49370:25;49502:19;;49466:20;;49432:18;;49398;;:52;;;;:::i;:::-;:88;;;;:::i;:::-;:123;;;;:::i;:::-;49370:151;-1:-1:-1;49532:12:0;49561:20;;;:46;;-1:-1:-1;49585:22:0;;49561:46;49557:85;;;49624:7;;;;49165:2010::o;49557:85::-;49676:18;;:23;;49697:2;49676:23;:::i;:::-;49658:15;:41;49654:115;;;49734:18;;:23;;49755:2;49734:23;:::i;:::-;49716:41;;49654:115;49830:23;49917:1;49897:17;49875:18;;49857:15;:36;;;;:::i;:::-;49856:58;;;;:::i;:::-;:62;;;;:::i;:::-;49830:88;-1:-1:-1;49929:26:0;49958:33;49830:88;49958:15;:33;:::i;:::-;49929:62;-1:-1:-1;50032:21:0;50066:36;49929:62;50066:16;:36::i;:::-;50115:18;50136:41;50160:17;50136:21;:41;:::i;:::-;50115:62;;50190:18;50245:17;50224:18;;50211:10;:31;;;;:::i;:::-;:51;;;;:::i;:::-;50190:72;;50273:25;50337:17;50314:20;;50301:10;:33;;;;:::i;:::-;:53;;;;:::i;:::-;50273:81;;50365:24;50427:17;50405:19;;50392:10;:32;;;;:::i;:::-;:52;;;;:::i;:::-;50365:79;-1:-1:-1;50457:23:0;50365:79;50509:17;50483:23;50496:10;50483;:23;:::i;:::-;:43;;;;:::i;:::-;:62;;;;:::i;:::-;50579:1;50558:18;:22;;;50591:18;:22;;;50624:20;:24;;;50659:19;:23;;;50717:17;;50709:61;;50457:88;;-1:-1:-1;;;;;;50717:17:0;;50748;;50709:61;50579:1;50709:61;50748:17;50717;50709:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50695:75:0;;-1:-1:-1;;50787:19:0;;;;;:42;;;50828:1;50810:15;:19;50787:42;50783:278;;;50846:46;50859:15;50876;50846:12;:46::i;:::-;51016:18;;50912:137;;;14223:25:1;;;14279:2;14264:18;;14257:34;;;14307:18;;;14300:34;;;;50912:137:0;;;;;;14211:2:1;50912:137:0;;;50783:278;51093:15;;51085:63;;-1:-1:-1;;;;;51093:15:0;;;;51122:21;;51085:63;;;;51122:21;51093:15;51085:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;51159:6:0;:8;;51071:77;;-1:-1:-1;51159:6:0;:8;;;:::i;:::-;;;;;;49193:1982;;;;;;;;;;;;49165:2010::o;48039:589::-;48189:16;;;48203:1;48189:16;;;;;;;;48165:21;;48189:16;;;;;;;;;;-1:-1:-1;48189:16:0;48165:40;;48234:4;48216;48221:1;48216:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;48216:23:0;;;:7;;;;;;;;;;:23;;;;48260:15;;:22;;;-1:-1:-1;;;48260:22:0;;;;:15;;;;;:20;;:22;;;;;48216:7;;48260:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48250:4;48255:1;48250:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;48250:32:0;;;:7;;;;;;;;;:32;48327:15;;48295:62;;48312:4;;48327:15;48345:11;48295:8;:62::i;:::-;48396:15;;:224;;-1:-1:-1;;;48396:224:0;;-1:-1:-1;;;;;48396:15:0;;;;:66;;:224;;48477:11;;48396:15;;48547:4;;48574;;48594:15;;48396:224;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48094:534;48039:589;:::o;48636:521::-;48816:15;;48784:62;;48801:4;;-1:-1:-1;;;;;48816:15:0;48834:11;48784:8;:62::i;:::-;48889:15;;:260;;-1:-1:-1;;;48889:260:0;;48961:4;48889:260;;;16067:34:1;16117:18;;;16110:34;;;48889:15:0;16160:18:1;;;16153:34;;;16203:18;;;16196:34;49101:6:0;16246:19:1;;;16239:44;49123:15:0;16299:19:1;;;16292:35;-1:-1:-1;;;;;48889:15:0;;;;:31;;48928:9;;16001:19:1;;48889:260:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;14:180:1:-;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;-1:-1:-1;165:23:1;;14:180;-1:-1:-1;14:180:1:o;199:548::-;311:4;340:2;369;358:9;351:21;401:6;395:13;444:6;439:2;428:9;424:18;417:34;469:1;479:140;493:6;490:1;487:13;479:140;;;588:14;;;584:23;;578:30;554:17;;;573:2;550:26;543:66;508:10;;479:140;;;483:3;668:1;663:2;654:6;643:9;639:22;635:31;628:42;738:2;731;727:7;722:2;714:6;710:15;706:29;695:9;691:45;687:54;679:62;;;;199:548;;;;:::o;752:131::-;-1:-1:-1;;;;;827:31:1;;817:42;;807:70;;873:1;870;863:12;888:315;956:6;964;1017:2;1005:9;996:7;992:23;988:32;985:52;;;1033:1;1030;1023:12;985:52;1072:9;1059:23;1091:31;1116:5;1091:31;:::i;:::-;1141:5;1193:2;1178:18;;;;1165:32;;-1:-1:-1;;;888:315:1:o;1816:456::-;1893:6;1901;1909;1962:2;1950:9;1941:7;1937:23;1933:32;1930:52;;;1978:1;1975;1968:12;1930:52;2017:9;2004:23;2036:31;2061:5;2036:31;:::i;:::-;2086:5;-1:-1:-1;2143:2:1;2128:18;;2115:32;2156:33;2115:32;2156:33;:::i;:::-;1816:456;;2208:7;;-1:-1:-1;;;2262:2:1;2247:18;;;;2234:32;;1816:456::o;2485:385::-;2571:6;2579;2587;2595;2648:3;2636:9;2627:7;2623:23;2619:33;2616:53;;;2665:1;2662;2655:12;2616:53;-1:-1:-1;;2688:23:1;;;2758:2;2743:18;;2730:32;;-1:-1:-1;2809:2:1;2794:18;;2781:32;;2860:2;2845:18;2832:32;;-1:-1:-1;2485:385:1;-1:-1:-1;2485:385:1:o;3064:247::-;3123:6;3176:2;3164:9;3155:7;3151:23;3147:32;3144:52;;;3192:1;3189;3182:12;3144:52;3231:9;3218:23;3250:31;3275:5;3250:31;:::i;:::-;3300:5;3064:247;-1:-1:-1;;;3064:247:1:o;3316:160::-;3381:20;;3437:13;;3430:21;3420:32;;3410:60;;3466:1;3463;3456:12;3481:315;3546:6;3554;3607:2;3595:9;3586:7;3582:23;3578:32;3575:52;;;3623:1;3620;3613:12;3575:52;3662:9;3649:23;3681:31;3706:5;3681:31;:::i;:::-;3731:5;-1:-1:-1;3755:35:1;3786:2;3771:18;;3755:35;:::i;:::-;3745:45;;3481:315;;;;;:::o;4025:180::-;4081:6;4134:2;4122:9;4113:7;4109:23;4105:32;4102:52;;;4150:1;4147;4140:12;4102:52;4173:26;4189:9;4173:26;:::i;4470:388::-;4538:6;4546;4599:2;4587:9;4578:7;4574:23;4570:32;4567:52;;;4615:1;4612;4605:12;4567:52;4654:9;4641:23;4673:31;4698:5;4673:31;:::i;:::-;4723:5;-1:-1:-1;4780:2:1;4765:18;;4752:32;4793:33;4752:32;4793:33;:::i;:::-;4845:7;4835:17;;;4470:388;;;;;:::o;4863:127::-;4924:10;4919:3;4915:20;4912:1;4905:31;4955:4;4952:1;4945:15;4979:4;4976:1;4969:15;4995:275;5066:2;5060:9;5131:2;5112:13;;-1:-1:-1;;5108:27:1;5096:40;;5166:18;5151:34;;5187:22;;;5148:62;5145:88;;;5213:18;;:::i;:::-;5249:2;5242:22;4995:275;;-1:-1:-1;4995:275:1:o;5275:183::-;5335:4;5368:18;5360:6;5357:30;5354:56;;;5390:18;;:::i;:::-;-1:-1:-1;5435:1:1;5431:14;5447:4;5427:25;;5275:183::o;5463:668::-;5517:5;5570:3;5563:4;5555:6;5551:17;5547:27;5537:55;;5588:1;5585;5578:12;5537:55;5624:6;5611:20;5650:4;5674:60;5690:43;5730:2;5690:43;:::i;:::-;5674:60;:::i;:::-;5756:3;5780:2;5775:3;5768:15;5808:4;5803:3;5799:14;5792:21;;5865:4;5859:2;5856:1;5852:10;5844:6;5840:23;5836:34;5822:48;;5893:3;5885:6;5882:15;5879:35;;;5910:1;5907;5900:12;5879:35;5946:4;5938:6;5934:17;5960:142;5976:6;5971:3;5968:15;5960:142;;;6042:17;;6030:30;;6080:12;;;;5993;;5960:142;;;-1:-1:-1;6120:5:1;5463:668;-1:-1:-1;;;;;;5463:668:1:o;6136:1215::-;6254:6;6262;6315:2;6303:9;6294:7;6290:23;6286:32;6283:52;;;6331:1;6328;6321:12;6283:52;6371:9;6358:23;6400:18;6441:2;6433:6;6430:14;6427:34;;;6457:1;6454;6447:12;6427:34;6495:6;6484:9;6480:22;6470:32;;6540:7;6533:4;6529:2;6525:13;6521:27;6511:55;;6562:1;6559;6552:12;6511:55;6598:2;6585:16;6620:4;6644:60;6660:43;6700:2;6660:43;:::i;6644:60::-;6738:15;;;6820:1;6816:10;;;;6808:19;;6804:28;;;6769:12;;;;6844:19;;;6841:39;;;6876:1;6873;6866:12;6841:39;6900:11;;;;6920:217;6936:6;6931:3;6928:15;6920:217;;;7016:3;7003:17;7033:31;7058:5;7033:31;:::i;:::-;7077:18;;6953:12;;;;7115;;;;6920:217;;;7156:5;-1:-1:-1;;7199:18:1;;7186:32;;-1:-1:-1;;7230:16:1;;;7227:36;;;7259:1;7256;7249:12;7227:36;;7282:63;7337:7;7326:8;7315:9;7311:24;7282:63;:::i;:::-;7272:73;;;6136:1215;;;;;:::o;7356:127::-;7417:10;7412:3;7408:20;7405:1;7398:31;7448:4;7445:1;7438:15;7472:4;7469:1;7462:15;7488:168;7561:9;;;7592;;7609:15;;;7603:22;;7589:37;7579:71;;7630:18;;:::i;7661:217::-;7701:1;7727;7717:132;;7771:10;7766:3;7762:20;7759:1;7752:31;7806:4;7803:1;7796:15;7834:4;7831:1;7824:15;7717:132;-1:-1:-1;7863:9:1;;7661:217::o;8293:380::-;8372:1;8368:12;;;;8415;;;8436:61;;8490:4;8482:6;8478:17;8468:27;;8436:61;8543:2;8535:6;8532:14;8512:18;8509:38;8506:161;;8589:10;8584:3;8580:20;8577:1;8570:31;8624:4;8621:1;8614:15;8652:4;8649:1;8642:15;8506:161;;8293:380;;;:::o;9083:125::-;9148:9;;;9169:10;;;9166:36;;;9182:18;;:::i;11182:127::-;11243:10;11238:3;11234:20;11231:1;11224:31;11274:4;11271:1;11264:15;11298:4;11295:1;11288:15;13678:128;13745:9;;;13766:11;;;13763:37;;;13780:18;;:::i;14345:135::-;14384:3;14405:17;;;14402:43;;14425:18;;:::i;:::-;-1:-1:-1;14472:1:1;14461:13;;14345:135::o;14485:251::-;14555:6;14608:2;14596:9;14587:7;14583:23;14579:32;14576:52;;;14624:1;14621;14614:12;14576:52;14656:9;14650:16;14675:31;14700:5;14675:31;:::i;14741:980::-;15003:4;15051:3;15040:9;15036:19;15082:6;15071:9;15064:25;15108:2;15146:6;15141:2;15130:9;15126:18;15119:34;15189:3;15184:2;15173:9;15169:18;15162:31;15213:6;15248;15242:13;15279:6;15271;15264:22;15317:3;15306:9;15302:19;15295:26;;15356:2;15348:6;15344:15;15330:29;;15377:1;15387:195;15401:6;15398:1;15395:13;15387:195;;;15466:13;;-1:-1:-1;;;;;15462:39:1;15450:52;;15557:15;;;;15522:12;;;;15498:1;15416:9;15387:195;;;-1:-1:-1;;;;;;;15638:32:1;;;;15633:2;15618:18;;15611:60;-1:-1:-1;;;15702:3:1;15687:19;15680:35;15599:3;14741:980;-1:-1:-1;;;14741:980:1:o;16338:306::-;16426:6;16434;16442;16495:2;16483:9;16474:7;16470:23;16466:32;16463:52;;;16511:1;16508;16501:12;16463:52;16540:9;16534:16;16524:26;;16590:2;16579:9;16575:18;16569:25;16559:35;;16634:2;16623:9;16619:18;16613:25;16603:35;;16338:306;;;;;:::o

Swarm Source

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