ETH Price: $2,474.86 (+1.50%)

Token

AIDOGE (AIDOGE)

Overview

Max Total Supply

210,000,000,000,000,000 AIDOGE

Holders

272,533 ( 0.004%)

Total Transfers

-

Market

Price

$0.00 @ 0.000000 ETH (+6.43%)

Onchain Market Cap

$84,000,000.00

Circulating Supply Market Cap

$67,564,292.22

Other Info

Token Contract (WITH 6 Decimals)

Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

#ArbDogeAI is created by #AI. 100% of the tokens belong to the community. Never consider #AIDOGE as a MEME.

Market

Volume (24H):$7,514,231.45
Market Capitalization:$67,564,292.22
Circulating Supply:174,455,896,934,211,000.00 AIDOGE
Market Data Source: Coinmarketcap

Contract Source Code Verified (Exact Match)

Contract Name:
AIDoge

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Arbiscan.io on 2023-04-11
*/

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @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 amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol

// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
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: @openzeppelin/contracts/utils/Context.sol

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

pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/contracts/token/ERC20/ERC20.sol

// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.0;



/**
 * @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}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * 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].
 *
 * 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.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

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

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless this function is
     * 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 override returns (uint8) {
        return 18;
    }

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

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

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

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

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `amount` 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 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        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 `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, allowance(owner, spender) + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        address owner = _msgSender();
        uint256 currentAllowance = allowance(owner, spender);
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `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.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
            // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
            // decrementing then incrementing.
            _balances[to] += amount;
        }

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        unchecked {
            // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
            _balances[account] += amount;
        }
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
            // Overflow not possible: amount <= accountBalance <= totalSupply.
            _totalSupply -= amount;
        }

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` 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.
     */
    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

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

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

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

// File: @openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol

// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
 * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
 *
 * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
 * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
 * need to send a transaction, and thus is not required to hold Ether at all.
 */
interface IERC20Permit {
    /**
     * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,
     * given ``owner``'s signed approval.
     *
     * IMPORTANT: The same issues {IERC20-approve} has related to transaction
     * ordering also apply here.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `deadline` must be a timestamp in the future.
     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
     * over the EIP712-formatted function arguments.
     * - the signature must use ``owner``'s current nonce (see {nonces}).
     *
     * For more information on the signature format, see the
     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
     * section].
     */
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

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

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

// File: @openzeppelin/contracts/utils/Address.sol

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

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
     *
     * _Available since v4.8._
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // Look for revert reason and bubble it up if present
        if (returndata.length > 0) {
            // The easiest way to bubble the revert reason is using memory via assembly
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert(errorMessage);
        }
    }
}

// File: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol

// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/utils/SafeERC20.sol)

pragma solidity ^0.8.0;



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

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

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

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

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

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

    function safePermit(
        IERC20Permit token,
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal {
        uint256 nonceBefore = token.nonces(owner);
        token.permit(owner, spender, value, deadline, v, r, s);
        uint256 nonceAfter = token.nonces(owner);
        require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed");
    }

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

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

// File: @openzeppelin/contracts/access/Ownable.sol

// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @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 {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

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

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

// File: @openzeppelin/contracts/utils/structs/EnumerableSet.sol

// OpenZeppelin Contracts (last updated v4.8.0) (utils/structs/EnumerableSet.sol)
// This file was procedurally generated from scripts/generate/templates/EnumerableSet.js.

pragma solidity ^0.8.0;

/**
 * @dev Library for managing
 * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
 * types.
 *
 * Sets have the following properties:
 *
 * - Elements are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Elements are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableSet for EnumerableSet.AddressSet;
 *
 *     // Declare a set state variable
 *     EnumerableSet.AddressSet private mySet;
 * }
 * ```
 *
 * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
 * and `uint256` (`UintSet`) are supported.
 *
 * [WARNING]
 * ====
 * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure
 * unusable.
 * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info.
 *
 * In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an
 * array of EnumerableSet.
 * ====
 */
library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;
        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping(bytes32 => uint256) _indexes;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) {
            // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            if (lastIndex != toDeleteIndex) {
                bytes32 lastValue = set._values[lastIndex];

                // Move the last value to the index where the value to delete is
                set._values[toDeleteIndex] = lastValue;
                // Update the index for the moved value
                set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex
            }

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        return set._values[index];
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function _values(Set storage set) private view returns (bytes32[] memory) {
        return set._values;
    }

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {
        bytes32[] memory store = _values(set._inner);
        bytes32[] memory result;

        /// @solidity memory-safe-assembly
        assembly {
            result := store
        }

        return result;
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(AddressSet storage set) internal view returns (address[] memory) {
        bytes32[] memory store = _values(set._inner);
        address[] memory result;

        /// @solidity memory-safe-assembly
        assembly {
            result := store
        }

        return result;
    }

    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(UintSet storage set) internal view returns (uint256[] memory) {
        bytes32[] memory store = _values(set._inner);
        uint256[] memory result;

        /// @solidity memory-safe-assembly
        assembly {
            result := store
        }

        return result;
    }
}

// File: contracts/interfaces/ICamelotFactory.sol


pragma solidity >=0.5.0;

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

    function owner() external view returns (address);

    function feePercentOwner() external view returns (address);

    function setStableOwner() external view returns (address);

    function feeTo() external view returns (address);

    function ownerFeeShare() external view returns (uint256);

    function referrersFeeShare(address) external view returns (uint256);

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

    function allPairs(uint256) external view returns (address pair);

    function allPairsLength() external view returns (uint256);

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

    function setFeeTo(address) external;

    function feeInfo()
        external
        view
        returns (uint _ownerFeeShare, address _feeTo);
}

// File: contracts/interfaces/IUniswapV2Router01.sol


pragma solidity >=0.6.2;

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

    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        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 quote(
        uint amountA,
        uint reserveA,
        uint reserveB
    ) external pure returns (uint amountB);

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

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

// File: contracts/interfaces/ICamelotRouter.sol


pragma solidity >=0.6.2;

interface ICamelotRouter 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,
        address referrer,
        uint deadline
    ) external;

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

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

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

// File: contracts/interfaces/IJackpot.sol


pragma solidity >=0.5.0;

interface IJackpot {
    function tradeEvent(address sender, uint256 amount) external;
}

// File: contracts/interfaces/IWETH.sol


pragma solidity >=0.5.0;

interface IWETH {
    function totalSupply() external view returns (uint256);

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

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

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

    function deposit() external payable;

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

    function withdraw(uint256) external;
}

// File: contracts/interfaces/IDogeBonusPool.sol


pragma solidity >=0.5.0;

interface IDogeBonusPool {
    function deposit(uint256 _pid, uint256 _amount) external;
    function withdraw(uint256 _pid, uint256 _amount) external;
    function emergencyWithdraw(uint256 _pid) external;
    function injectRewards(uint256 amount) external;
    function injectRewardsWithTime(uint256 amount, uint256 rewardsSeconds) external;
}

// File: contracts/token/AIDoge.sol


pragma solidity =0.8.19;











contract AIDoge is ERC20, Ownable {
    using SafeERC20 for IERC20;
    using EnumerableSet for EnumerableSet.AddressSet;

    event SwapBack(uint256 burn, uint256 gov1, uint256 gov2, uint256 liquidity, uint256 jackpot, uint256 bonus, uint256 dev, uint timestamp);
    event Trade(address user, address pair, uint256 amount, uint side, uint256 circulatingSupply, uint timestamp);
    event AddLiquidity(uint256 tokenAmount, uint256 ethAmount, uint256 timestamp);

    bool public swapEnabled = true;
    bool public addLiquidityEnabled = true;

    bool public inSwap;
    modifier swapping() {
        inSwap = true;
        _;
        inSwap = false;
    }

    mapping(address => bool) public isFeeExempt;
    mapping(address => bool) public canAddLiquidityBeforeLaunch;

    uint256 private burnFee;
    uint256 public gov1Fee;
    uint256 public gov2Fee;
    uint256 private liquidityFee;
    uint256 private jackpotFee;
    uint256 private bonusFee;
    uint256 private devFee;
    uint256 private totalFee;
    uint256 public feeDenominator = 10000;

    // Buy Fees
    uint256 public burnFeeBuy = 100;
    uint256 public gov1FeeBuy = 100;
    uint256 public gov2FeeBuy = 200;
    uint256 public liquidityFeeBuy = 200;
    uint256 public jackpotFeeBuy = 300;
    uint256 public bonusFeeBuy = 300;
    uint256 public devFeeBuy = 300;
    uint256 public totalFeeBuy = 1500;
    // Sell Fees
    uint256 public burnFeeSell = 100;
    uint256 public gov1FeeSell = 100;
    uint256 public gov2FeeSell = 200;
    uint256 public liquidityFeeSell = 200;
    uint256 public jackpotFeeSell = 300;
    uint256 public bonusFeeSell = 300;
    uint256 public devFeeSell = 300;
    uint256 public totalFeeSell = 1500;

    // Fees receivers
    address private gov1Wallet;
    address private gov2Wallet;
    address private bonusWallet;
    IJackpot public jackpotWallet;
    address private devWallet;

    IERC20 public backToken;
    uint256 public launchedAt;
    uint256 public launchedAtTimestamp;
    bool private initialized;

    ICamelotFactory private immutable factory;
    ICamelotRouter private immutable swapRouter;
    IWETH private immutable WETH;
    address private constant DEAD = 0x000000000000000000000000000000000000dEaD;
    address private constant ZERO = 0x0000000000000000000000000000000000000000;

    EnumerableSet.AddressSet private _pairs;

    constructor(
        IERC20 _backToken,
        address _factory,
        address _swapRouter,
        address _weth
    ) ERC20("AIDOGE", "AIDOGE") {
        uint256 _totalSupply = 210_000_000_000_000_000 * 1e6;
        backToken = _backToken;
        canAddLiquidityBeforeLaunch[_msgSender()] = true;
        canAddLiquidityBeforeLaunch[address(this)] = true;
        isFeeExempt[msg.sender] = true;
        isFeeExempt[address(this)] = true;
        factory = ICamelotFactory(_factory);
        swapRouter = ICamelotRouter(_swapRouter);
        WETH = IWETH(_weth);
        _mint(_msgSender(), _totalSupply);
    }

    function initializePair() external onlyOwner {
        require(!initialized, "Already initialized");
        address pair = factory.createPair(address(WETH), address(this));
        _pairs.add(pair);
        initialized = true;
    }

    function decimals() public view virtual override returns (uint8) {
        return 6;
    }

    function transfer(address to, uint256 amount) public virtual override returns (bool) {
        return _dogTransfer(_msgSender(), to, amount);
    }

    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(sender, spender, amount);
        return _dogTransfer(sender, recipient, amount);
    }

    function _dogTransfer(address sender, address recipient, uint256 amount) internal returns (bool) {
        if (inSwap) {
            _transfer(sender, recipient, amount);
            return true;
        }
        if (!canAddLiquidityBeforeLaunch[sender]) {
            require(launched(), "Trading not open yet");
        }

        bool shouldTakeFee = (!isFeeExempt[sender] && !isFeeExempt[recipient]) && launched();
        uint side = 0;
        address user_ = sender;
        address pair_ = recipient;
        // Set Fees
        if (isPair(sender)) {
            buyFees();
            side = 1;
            user_ = recipient;
            pair_ = sender;
            try jackpotWallet.tradeEvent(sender, amount) {} catch {}
        } else if (isPair(recipient)) {
            sellFees();
            side = 2;
        } else {
            shouldTakeFee = false;
        }

        if (shouldSwapBack()) {
            swapBack();
        }

        uint256 amountReceived = shouldTakeFee ? takeFee(sender, amount) : amount;
        _transfer(sender, recipient, amountReceived);

        if (side > 0) {
            emit Trade(user_, pair_, amount, side, getCirculatingSupply(), block.timestamp);
        }
        return true;
    }

    function shouldSwapBack() internal view returns (bool) {
        return !inSwap && swapEnabled && launched() && balanceOf(address(this)) > 0 && !isPair(_msgSender());
    }

    function swapBack() internal swapping {
        uint256 taxAmount = balanceOf(address(this));
        _approve(address(this), address(swapRouter), taxAmount);

        uint256 amountDogBurn = (taxAmount * burnFee) / (totalFee);
        uint256 amountDogLp = (taxAmount * liquidityFee) / (totalFee);
        uint256 amountDogBonus = (taxAmount * bonusFee) / (totalFee);
        taxAmount -= amountDogBurn;
        taxAmount -= amountDogLp;
        taxAmount -= amountDogBonus;
        

        address[] memory path = new address[](3);
        path[0] = address(this);
        path[1] = address(WETH);
        path[2] = address(backToken);

        bool success = false;
        uint256 balanceBefore = backToken.balanceOf(address(this));
        try swapRouter.swapExactTokensForTokensSupportingFeeOnTransferTokens(taxAmount,0,path,address(this),address(0),block.timestamp){
            success = true;
        } catch {
            try swapRouter.swapExactTokensForTokensSupportingFeeOnTransferTokens(taxAmount,0,path,address(this),block.timestamp) {
                success = true;
            } 
            catch {}
        }
        if (!success) {
            return;
        }

        _transfer(address(this), DEAD, amountDogBurn);
        _approve(address(this), address(bonusWallet), amountDogBonus);
        IDogeBonusPool(bonusWallet).injectRewards(amountDogBonus);
        
        uint256 amountBackToken = backToken.balanceOf(address(this)) - balanceBefore;
        uint256 backTokenTotalFee = totalFee - burnFee - liquidityFee - bonusFee;
        uint256 amountBackTokenGov1 = (amountBackToken * gov1Fee) / (backTokenTotalFee);
        uint256 amountBackTokenGov2 = (amountBackToken * gov2Fee) / (backTokenTotalFee);
        uint256 amountBackTokenJackpot = (amountBackToken * jackpotFee) / backTokenTotalFee;
        uint256 amountBackTokenDev = amountBackToken - amountBackTokenGov1 - amountBackTokenGov2 - amountBackTokenJackpot;

        backToken.transfer(gov1Wallet, amountBackTokenGov1);
        backToken.transfer(gov2Wallet, amountBackTokenGov2);
        backToken.transfer(address(jackpotWallet), amountBackTokenJackpot);
        backToken.transfer(devWallet, amountBackTokenDev);

        if (addLiquidityEnabled) {
            _doAddLp();
        }
        
        emit SwapBack(amountDogBurn, amountBackTokenGov1, amountBackTokenGov2, amountDogLp, amountBackTokenJackpot, amountDogBonus, amountBackTokenDev, block.timestamp);
    }

    function _doAddLp() internal {
        address[] memory pathEth = new address[](2);
        pathEth[0] = address(this);
        pathEth[1] = address(WETH);

        uint256 tokenAmount = balanceOf(address(this));
        uint256 half = tokenAmount / 2;
        if(half < 1000) return;

        uint256 ethAmountBefore = address(this).balance;
        bool success = false;
        try swapRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(half,0, pathEth,address(this),address(0),block.timestamp){
            success = true;
        } catch {
            try swapRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(half,0, pathEth,address(this),block.timestamp){
                success = true;
            } catch {}
        }
        if (!success) {
            return;
        }

        uint256 ethAmount = address(this).balance - ethAmountBefore;
        _addLiquidity(half, ethAmount);
    }

    function _addLiquidity(uint256 tokenAmount, uint256 ethAmount) internal {
        _approve(address(this), address(swapRouter), tokenAmount);
        try swapRouter.addLiquidityETH{value: ethAmount}(address(this), tokenAmount, 0, 0, address(0), block.timestamp) {
            emit AddLiquidity(tokenAmount, ethAmount, block.timestamp);
        } catch {}
    }

    function doSwapBack() public onlyOwner {
        swapBack();
    }

    function launched() internal view returns (bool) {
        return launchedAt != 0;
    }

    function buyFees() internal {
        burnFee = burnFeeBuy;
        gov1Fee = gov1FeeBuy;
        gov2Fee = gov2FeeBuy;
        liquidityFee = liquidityFeeBuy;
        jackpotFee = jackpotFeeBuy;
        bonusFee = bonusFeeBuy;
        devFee = devFeeBuy;
        totalFee = totalFeeBuy;
    }

    function sellFees() internal {
        burnFee = burnFeeSell;
        gov1Fee = gov1FeeSell;
        gov2Fee = gov2FeeSell;
        liquidityFee = liquidityFeeSell;
        jackpotFee = jackpotFeeSell;
        bonusFee = bonusFeeSell;
        devFee = devFeeSell;
        totalFee = totalFeeSell;
    }

    function takeFee(address sender, uint256 amount) internal returns (uint256) {
        uint256 feeAmount = (amount * totalFee) / feeDenominator;
        _transfer(sender, address(this), feeAmount);
        return amount - feeAmount;
    }

    function rescueToken(address tokenAddress) external onlyOwner {
        IERC20(tokenAddress).safeTransfer(msg.sender,IERC20(tokenAddress).balanceOf(address(this)));
    }

    function clearStuckEthBalance() external onlyOwner {
        uint256 amountETH = address(this).balance;
        (bool success, ) = payable(_msgSender()).call{value: amountETH}(new bytes(0));
        require(success, 'AIDOGE: ETH_TRANSFER_FAILED');
    }

    function clearStuckBalance() external onlyOwner {
        backToken.transfer(_msgSender(), backToken.balanceOf(address(this)));
    }

    function getCirculatingSupply() public view returns (uint256) {
        return totalSupply() - balanceOf(DEAD) - balanceOf(ZERO);
    }

    /*** ADMIN FUNCTIONS ***/
    function launch() public onlyOwner {
        require(launchedAt == 0, "Already launched");
        launchedAt = block.number;
        launchedAtTimestamp = block.timestamp;
    }

    function setBuyFees(
        uint256 _gov1Fee,
        uint256 _gov2Fee,
        uint256 _liquidityFee,
        uint256 _jackpotFee,
        uint256 _bonusFee,
        uint256 _devFee,
        uint256 _burnFee
    ) external onlyOwner {
        gov1FeeBuy = _gov1Fee;
        gov2FeeBuy = _gov2Fee;
        liquidityFeeBuy = _liquidityFee;
        jackpotFeeBuy = _jackpotFee;
        bonusFeeBuy = _bonusFee;
        devFeeBuy = _devFee;
        burnFeeBuy = _burnFee;
        totalFeeBuy = _liquidityFee + _jackpotFee + _bonusFee + _devFee + _burnFee;
    }

    function setSellFees(
        uint256 _gov1Fee,
        uint256 _gov2Fee,
        uint256 _liquidityFee,
        uint256 _jackpotFee,
        uint256 _bonusFee,
        uint256 _devFee,
        uint256 _burnFee
    ) external onlyOwner {
        gov1FeeSell = _gov1Fee;
        gov2FeeSell = _gov2Fee;
        liquidityFeeSell = _liquidityFee;
        jackpotFeeSell = _jackpotFee;
        bonusFeeSell = _bonusFee;
        devFeeSell = _devFee;
        burnFeeSell = _burnFee;
        totalFeeSell = _liquidityFee + _jackpotFee + _bonusFee + _devFee + _burnFee;
    }

    function setFeeReceivers(
        address _gov1Wallet,
        address _gov2Wallet,
        address _bonusWallet,
        address _jackpotWallet,
        address _devWallet
    ) external onlyOwner {
        gov1Wallet = _gov1Wallet;
        gov2Wallet = _gov2Wallet;
        bonusWallet = _bonusWallet;
        jackpotWallet = IJackpot(_jackpotWallet);
        devWallet = _devWallet;
        devWallet = _devWallet;
    }

    function setIsFeeExempt(address holder, bool exempt) external onlyOwner {
        isFeeExempt[holder] = exempt;
    }

    function setSwapBackSettings(bool _enabled) external onlyOwner {
        swapEnabled = _enabled;
    }

    function setAddLiquidityEnabled(bool _enabled) external onlyOwner {
        addLiquidityEnabled = _enabled;
    }

    function isPair(address account) public view returns (bool) {
        return _pairs.contains(account);
    }

    function addPair(address pair) public onlyOwner returns (bool) {
        require(pair != address(0), "AIDOGE: pair is the zero address");
        return _pairs.add(pair);
    }

    function delPair(address pair) public onlyOwner returns (bool) {
        require(pair != address(0), "AIDOGE: pair is the zero address");
        return _pairs.remove(pair);
    }

    function getMinterLength() public view returns (uint256) {
        return _pairs.length();
    }

    function getPair(uint256 index) public view returns (address) {
        require(index <= _pairs.length() - 1, "AIDOGE: index out of bounds");
        return _pairs.at(index);
    }

    receive() external payable {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"contract IERC20","name":"_backToken","type":"address"},{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_swapRouter","type":"address"},{"internalType":"address","name":"_weth","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"AddLiquidity","type":"event"},{"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":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"burn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"gov1","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"gov2","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"liquidity","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"jackpot","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"bonus","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"dev","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"SwapBack","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"address","name":"pair","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"side","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"circulatingSupply","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"Trade","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"addLiquidityEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"}],"name":"addPair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"backToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"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":"bonusFeeBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bonusFeeSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnFeeBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnFeeSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"canAddLiquidityBeforeLaunch","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"clearStuckBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"clearStuckEthBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"}],"name":"delPair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devFeeBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devFeeSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"doSwapBack","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeDenominator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCirculatingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMinterLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gov1Fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gov1FeeBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gov1FeeSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gov2Fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gov2FeeBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gov2FeeSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"inSwap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initializePair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isFeeExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isPair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"jackpotFeeBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"jackpotFeeSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"jackpotWallet","outputs":[{"internalType":"contract IJackpot","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"launchedAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launchedAtTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityFeeBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityFeeSell","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":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"rescueToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setAddLiquidityEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_gov1Fee","type":"uint256"},{"internalType":"uint256","name":"_gov2Fee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_jackpotFee","type":"uint256"},{"internalType":"uint256","name":"_bonusFee","type":"uint256"},{"internalType":"uint256","name":"_devFee","type":"uint256"},{"internalType":"uint256","name":"_burnFee","type":"uint256"}],"name":"setBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_gov1Wallet","type":"address"},{"internalType":"address","name":"_gov2Wallet","type":"address"},{"internalType":"address","name":"_bonusWallet","type":"address"},{"internalType":"address","name":"_jackpotWallet","type":"address"},{"internalType":"address","name":"_devWallet","type":"address"}],"name":"setFeeReceivers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"bool","name":"exempt","type":"bool"}],"name":"setIsFeeExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_gov1Fee","type":"uint256"},{"internalType":"uint256","name":"_gov2Fee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_jackpotFee","type":"uint256"},{"internalType":"uint256","name":"_bonusFee","type":"uint256"},{"internalType":"uint256","name":"_devFee","type":"uint256"},{"internalType":"uint256","name":"_burnFee","type":"uint256"}],"name":"setSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapBackSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFeeBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFeeSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60e06040526001600560146101000a81548160ff0219169083151502179055506001600560156101000a81548160ff0219169083151502179055506127106010556064601155606460125560c860135560c860145561012c60155561012c60165561012c6017556105dc60185560646019556064601a5560c8601b5560c8601c5561012c601d5561012c601e5561012c601f556105dc602055348015620000a557600080fd5b5060405162005d4a38038062005d4a8339818101604052810190620000cb9190620006f8565b6040518060400160405280600681526020017f4149444f474500000000000000000000000000000000000000000000000000008152506040518060400160405280600681526020017f4149444f474500000000000000000000000000000000000000000000000000008152508160039081620001489190620009e4565b5080600490816200015a9190620009e4565b5050506200017d620001716200040460201b60201c565b6200040c60201b60201c565b6000692c781f708c509f400000905084602660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160076000620001e36200040460201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600760003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600660003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508373ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250508273ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff16815250508173ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff1681525050620003f9620003ec6200040460201b60201c565b82620004d260201b60201c565b505050505062000be6565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000544576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200053b9062000b2c565b60405180910390fd5b62000558600083836200063f60201b60201c565b80600260008282546200056c919062000b7d565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200061f919062000bc9565b60405180910390a36200063b600083836200064460201b60201c565b5050565b505050565b505050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200067b826200064e565b9050919050565b60006200068f826200066e565b9050919050565b620006a18162000682565b8114620006ad57600080fd5b50565b600081519050620006c18162000696565b92915050565b620006d2816200066e565b8114620006de57600080fd5b50565b600081519050620006f281620006c7565b92915050565b6000806000806080858703121562000715576200071462000649565b5b60006200072587828801620006b0565b94505060206200073887828801620006e1565b93505060406200074b87828801620006e1565b92505060606200075e87828801620006e1565b91505092959194509250565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620007ec57607f821691505b602082108103620008025762000801620007a4565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200086c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200082d565b6200087886836200082d565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620008c5620008bf620008b98462000890565b6200089a565b62000890565b9050919050565b6000819050919050565b620008e183620008a4565b620008f9620008f082620008cc565b8484546200083a565b825550505050565b600090565b6200091062000901565b6200091d818484620008d6565b505050565b5b8181101562000945576200093960008262000906565b60018101905062000923565b5050565b601f82111562000994576200095e8162000808565b62000969846200081d565b8101602085101562000979578190505b6200099162000988856200081d565b83018262000922565b50505b505050565b600082821c905092915050565b6000620009b96000198460080262000999565b1980831691505092915050565b6000620009d48383620009a6565b9150826002028217905092915050565b620009ef826200076a565b67ffffffffffffffff81111562000a0b5762000a0a62000775565b5b62000a178254620007d3565b62000a2482828562000949565b600060209050601f83116001811462000a5c576000841562000a47578287015190505b62000a538582620009c6565b86555062000ac3565b601f19841662000a6c8662000808565b60005b8281101562000a965784890151825560018201915060208501945060208101905062000a6f565b8683101562000ab6578489015162000ab2601f891682620009a6565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b600062000b14601f8362000acb565b915062000b218262000adc565b602082019050919050565b6000602082019050818103600083015262000b478162000b05565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000b8a8262000890565b915062000b978362000890565b925082820190508082111562000bb25762000bb162000b4e565b5b92915050565b62000bc38162000890565b82525050565b600060208201905062000be0600083018462000bb8565b92915050565b60805160a05160c0516150fc62000c4e600039600081816114f70152818161261801526134b90152600081816124cd015281816127990152818161282d0152818161355f015281816135f30152818161384e0152613875015260006114bb01526150fc6000f3fe60806040526004361061039b5760003560e01c806382d20116116101dc578063b8c6113011610102578063cdba31fd116100a0578063e1e5a66d1161006f578063e1e5a66d14610d61578063e5e31b1314610d8c578063f2fde38b14610dc9578063fb5f27fb14610df2576103a2565b8063cdba31fd14610ca3578063d830678614610cce578063dbd6c48914610cf9578063dd62ed3e14610d24576103a2565b8063bfa382b5116100dc578063bfa382b514610bf9578063c2b7bbb614610c10578063c6d2577d14610c4d578063cb806e0714610c78576103a2565b8063b8c6113014610b68578063bdf391cc14610b91578063bf56b37114610bce576103a2565b806395d89b411161017a578063aac46c9511610149578063aac46c9514610abe578063ace1880114610ae7578063b6309f6814610b12578063b7eed4c414610b3d576103a2565b806395d89b41146109dc578063a457c2d714610a07578063a5bc508514610a44578063a9059cbb14610a81576103a2565b806386c8782f116101b657806386c8782f146109465780638da5cb5b146109715780638fbbd7501461099c5780639272293c146109b3576103a2565b806382d20116146108c557806386013940146108f0578063861faf5f1461091b576103a2565b80632d2f244b116102c1578063531484161161025f57806370a082311161022e57806370a082311461080957806370c8810e14610846578063715018a6146108715780638072250b14610888576103a2565b8063531484161461075f578063658d4b7f1461078a5780636c470595146107b35780636ddd1713146107de576103a2565b8063395093511161029b57806339509351146106a55780633f4218e0146106e25780634460d3cf1461071f5780634fab9e4c14610748576103a2565b80632d2f244b14610638578063313ce56714610663578063364333f41461068e576103a2565b806312835c5e1161033957806318abb6351161030857806318abb6351461057c578063234a2daa146105a557806323b872dd146105d05780632b112e491461060d576103a2565b806312835c5e146104d057806315674e8e146104fb578063180b0d7e1461052657806318160ddd14610551576103a2565b806306fdde031161037557806306fdde0314610414578063095ea7b31461043f5780630ca5979b1461047c5780631107b3a5146104a5576103a2565b806301339c21146103a7578063017e24e1146103be5780630323aac7146103e9576103a2565b366103a257005b600080fd5b3480156103b357600080fd5b506103bc610e1d565b005b3480156103ca57600080fd5b506103d3610e7a565b6040516103e09190613b2b565b60405180910390f35b3480156103f557600080fd5b506103fe610e80565b60405161040b9190613b2b565b60405180910390f35b34801561042057600080fd5b50610429610e91565b6040516104369190613bd6565b60405180910390f35b34801561044b57600080fd5b5061046660048036038101906104619190613c87565b610f23565b6040516104739190613ce2565b60405180910390f35b34801561048857600080fd5b506104a3600480360381019061049e9190613cfd565b610f46565b005b3480156104b157600080fd5b506104ba610fbb565b6040516104c79190613b2b565b60405180910390f35b3480156104dc57600080fd5b506104e5610fc1565b6040516104f29190613b2b565b60405180910390f35b34801561050757600080fd5b50610510610fc7565b60405161051d9190613b2b565b60405180910390f35b34801561053257600080fd5b5061053b610fcd565b6040516105489190613b2b565b60405180910390f35b34801561055d57600080fd5b50610566610fd3565b6040516105739190613b2b565b60405180910390f35b34801561058857600080fd5b506105a3600480360381019061059e9190613d9f565b610fdd565b005b3480156105b157600080fd5b506105ba611172565b6040516105c79190613b2b565b60405180910390f35b3480156105dc57600080fd5b506105f760048036038101906105f29190613e1a565b611178565b6040516106049190613ce2565b60405180910390f35b34801561061957600080fd5b506106226111a5565b60405161062f9190613b2b565b60405180910390f35b34801561064457600080fd5b5061064d6111dd565b60405161065a9190613ecc565b60405180910390f35b34801561066f57600080fd5b50610678611203565b6040516106859190613f03565b60405180910390f35b34801561069a57600080fd5b506106a361120c565b005b3480156106b157600080fd5b506106cc60048036038101906106c79190613c87565b611359565b6040516106d99190613ce2565b60405180910390f35b3480156106ee57600080fd5b5061070960048036038101906107049190613f1e565b611390565b6040516107169190613ce2565b60405180910390f35b34801561072b57600080fd5b5061074660048036038101906107419190613f1e565b6113b0565b005b34801561075457600080fd5b5061075d61145f565b005b34801561076b57600080fd5b506107746115ac565b6040516107819190613b2b565b60405180910390f35b34801561079657600080fd5b506107b160048036038101906107ac9190613f77565b6115b2565b005b3480156107bf57600080fd5b506107c8611615565b6040516107d59190613b2b565b60405180910390f35b3480156107ea57600080fd5b506107f361161b565b6040516108009190613ce2565b60405180910390f35b34801561081557600080fd5b50610830600480360381019061082b9190613f1e565b61162e565b60405161083d9190613b2b565b60405180910390f35b34801561085257600080fd5b5061085b611676565b6040516108689190613b2b565b60405180910390f35b34801561087d57600080fd5b5061088661167c565b005b34801561089457600080fd5b506108af60048036038101906108aa9190613f1e565b611690565b6040516108bc9190613ce2565b60405180910390f35b3480156108d157600080fd5b506108da6116b0565b6040516108e79190613b2b565b60405180910390f35b3480156108fc57600080fd5b506109056116b6565b6040516109129190613ce2565b60405180910390f35b34801561092757600080fd5b506109306116c9565b60405161093d9190613fd8565b60405180910390f35b34801561095257600080fd5b5061095b6116ef565b6040516109689190613b2b565b60405180910390f35b34801561097d57600080fd5b506109866116f5565b6040516109939190614002565b60405180910390f35b3480156109a857600080fd5b506109b161171f565b005b3480156109bf57600080fd5b506109da60048036038101906109d59190613cfd565b611731565b005b3480156109e857600080fd5b506109f16117a6565b6040516109fe9190613bd6565b60405180910390f35b348015610a1357600080fd5b50610a2e6004803603810190610a299190613c87565b611838565b604051610a3b9190613ce2565b60405180910390f35b348015610a5057600080fd5b50610a6b6004803603810190610a669190613f1e565b6118af565b604051610a789190613ce2565b60405180910390f35b348015610a8d57600080fd5b50610aa86004803603810190610aa39190613c87565b611943565b604051610ab59190613ce2565b60405180910390f35b348015610aca57600080fd5b50610ae56004803603810190610ae0919061401d565b61195f565b005b348015610af357600080fd5b50610afc611984565b604051610b099190613b2b565b60405180910390f35b348015610b1e57600080fd5b50610b2761198a565b604051610b349190613b2b565b60405180910390f35b348015610b4957600080fd5b50610b52611990565b604051610b5f9190613b2b565b60405180910390f35b348015610b7457600080fd5b50610b8f6004803603810190610b8a919061401d565b611996565b005b348015610b9d57600080fd5b50610bb86004803603810190610bb3919061404a565b6119bb565b604051610bc59190614002565b60405180910390f35b348015610bda57600080fd5b50610be3611a30565b604051610bf09190613b2b565b60405180910390f35b348015610c0557600080fd5b50610c0e611a36565b005b348015610c1c57600080fd5b50610c376004803603810190610c329190613f1e565b611b49565b604051610c449190613ce2565b60405180910390f35b348015610c5957600080fd5b50610c62611bdd565b604051610c6f9190613b2b565b60405180910390f35b348015610c8457600080fd5b50610c8d611be3565b604051610c9a9190613b2b565b60405180910390f35b348015610caf57600080fd5b50610cb8611be9565b604051610cc59190613b2b565b60405180910390f35b348015610cda57600080fd5b50610ce3611bef565b604051610cf09190613ce2565b60405180910390f35b348015610d0557600080fd5b50610d0e611c02565b604051610d1b9190613b2b565b60405180910390f35b348015610d3057600080fd5b50610d4b6004803603810190610d469190614077565b611c08565b604051610d589190613b2b565b60405180910390f35b348015610d6d57600080fd5b50610d76611c8f565b604051610d839190613b2b565b60405180910390f35b348015610d9857600080fd5b50610db36004803603810190610dae9190613f1e565b611c95565b604051610dc09190613ce2565b60405180910390f35b348015610dd557600080fd5b50610df06004803603810190610deb9190613f1e565b611cb2565b005b348015610dfe57600080fd5b50610e07611d35565b604051610e149190613b2b565b60405180910390f35b610e25611d3b565b600060275414610e6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6190614103565b60405180910390fd5b4360278190555042602881905550565b600a5481565b6000610e8c602a611db9565b905090565b606060038054610ea090614152565b80601f0160208091040260200160405190810160405280929190818152602001828054610ecc90614152565b8015610f195780601f10610eee57610100808354040283529160200191610f19565b820191906000526020600020905b815481529060010190602001808311610efc57829003601f168201915b5050505050905090565b600080610f2e611dce565b9050610f3b818585611dd6565b600191505092915050565b610f4e611d3b565b866012819055508560138190555084601481905550836015819055508260168190555081601781905550806011819055508082848688610f8e91906141b2565b610f9891906141b2565b610fa291906141b2565b610fac91906141b2565b60188190555050505050505050565b601c5481565b601f5481565b60115481565b60105481565b6000600254905090565b610fe5611d3b565b84602160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083602260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081602460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080602560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080602560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050565b60195481565b600080611183611dce565b9050611190858285611f9f565b61119b85858561202b565b9150509392505050565b60006111b1600061162e565b6111bc61dead61162e565b6111c4610fd3565b6111ce91906141e6565b6111d891906141e6565b905090565b602460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006006905090565b611214611d3b565b602660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb61125a611dce565b602660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016112b59190614002565b602060405180830381865afa1580156112d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112f6919061422f565b6040518363ffffffff1660e01b815260040161131392919061425c565b6020604051808303816000875af1158015611332573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611356919061429a565b50565b600080611364611dce565b90506113858185856113768589611c08565b61138091906141b2565b611dd6565b600191505092915050565b60066020528060005260406000206000915054906101000a900460ff1681565b6113b8611d3b565b61145c338273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016113f59190614002565b602060405180830381865afa158015611412573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611436919061422f565b8373ffffffffffffffffffffffffffffffffffffffff166123239092919063ffffffff16565b50565b611467611d3b565b602960009054906101000a900460ff16156114b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ae90614313565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663c9c653967f0000000000000000000000000000000000000000000000000000000000000000306040518363ffffffff1660e01b8152600401611534929190614333565b6020604051808303816000875af1158015611553573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115779190614371565b905061158d81602a6123a990919063ffffffff16565b506001602960006101000a81548160ff02191690831515021790555050565b60205481565b6115ba611d3b565b80600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60155481565b600560149054906101000a900460ff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60125481565b611684611d3b565b61168e60006123d9565b565b60076020528060005260406000206000915054906101000a900460ff1681565b60145481565b600560159054906101000a900460ff1681565b602660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60165481565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611727611d3b565b61172f61249f565b565b611739611d3b565b86601a8190555085601b8190555084601c8190555083601d8190555082601e8190555081601f8190555080601981905550808284868861177991906141b2565b61178391906141b2565b61178d91906141b2565b61179791906141b2565b60208190555050505050505050565b6060600480546117b590614152565b80601f01602080910402602001604051908101604052809291908181526020018280546117e190614152565b801561182e5780601f106118035761010080835404028352916020019161182e565b820191906000526020600020905b81548152906001019060200180831161181157829003601f168201915b5050505050905090565b600080611843611dce565b905060006118518286611c08565b905083811015611896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188d90614410565b60405180910390fd5b6118a38286868403611dd6565b60019250505092915050565b60006118b9611d3b565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611928576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191f9061447c565b60405180910390fd5b61193c82602a612e9490919063ffffffff16565b9050919050565b6000611957611950611dce565b848461202b565b905092915050565b611967611d3b565b80600560156101000a81548160ff02191690831515021790555050565b601e5481565b601b5481565b601d5481565b61199e611d3b565b80600560146101000a81548160ff02191690831515021790555050565b600060016119c9602a611db9565b6119d391906141e6565b821115611a15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0c906144e8565b60405180910390fd5b611a2982602a612ec490919063ffffffff16565b9050919050565b60275481565b611a3e611d3b565b60004790506000611a4d611dce565b73ffffffffffffffffffffffffffffffffffffffff1682600067ffffffffffffffff811115611a7f57611a7e614508565b5b6040519080825280601f01601f191660200182016040528015611ab15781602001600182028036833780820191505090505b50604051611abf919061457e565b60006040518083038185875af1925050503d8060008114611afc576040519150601f19603f3d011682016040523d82523d6000602084013e611b01565b606091505b5050905080611b45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3c906145e1565b60405180910390fd5b5050565b6000611b53611d3b565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611bc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb99061447c565b60405180910390fd5b611bd682602a6123a990919063ffffffff16565b9050919050565b60285481565b60095481565b60175481565b600560169054906101000a900460ff1681565b601a5481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60135481565b6000611cab82602a612ede90919063ffffffff16565b9050919050565b611cba611d3b565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611d29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2090614673565b60405180910390fd5b611d32816123d9565b50565b60185481565b611d43611dce565b73ffffffffffffffffffffffffffffffffffffffff16611d616116f5565b73ffffffffffffffffffffffffffffffffffffffff1614611db7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dae906146df565b60405180910390fd5b565b6000611dc782600001612f0e565b9050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611e45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3c90614771565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611eb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eab90614803565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611f929190613b2b565b60405180910390a3505050565b6000611fab8484611c08565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146120255781811015612017576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200e9061486f565b60405180910390fd5b6120248484848403611dd6565b5b50505050565b6000600560169054906101000a900460ff16156120565761204d848484612f1f565b6001905061231c565b600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166120ef576120af613195565b6120ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e5906148db565b60405180910390fd5b5b6000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156121955750600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156121a557506121a4613195565b5b905060008086905060008690506121bb88611c95565b15612260576121c86131a2565b60019250869150879050602460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166367d198a689886040518363ffffffff1660e01b815260040161222f92919061425c565b600060405180830381600087803b15801561224957600080fd5b505af192505050801561225a575060015b50612285565b61226987611c95565b1561227f576122766131ec565b60029250612284565b600093505b5b61228d613236565b1561229b5761229a61249f565b5b6000846122a857866122b3565b6122b289886132a3565b5b90506122c0898983612f1f565b6000841115612312577fe6f814da7244d1ae6c61b54b5684858ba39cad7b9a91884be10060664987d754838389876122f66111a5565b42604051612309969594939291906148fb565b60405180910390a15b6001955050505050505b9392505050565b6123a48363a9059cbb60e01b848460405160240161234292919061425c565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506132e3565b505050565b60006123d1836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6133aa565b905092915050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6001600560166101000a81548160ff02191690831515021790555060006124c53061162e565b90506124f2307f000000000000000000000000000000000000000000000000000000000000000083611dd6565b6000600f5460085483612505919061495c565b61250f91906149cd565b90506000600f54600b5484612524919061495c565b61252e91906149cd565b90506000600f54600d5485612543919061495c565b61254d91906149cd565b9050828461255b91906141e6565b9350818461256991906141e6565b9350808461257791906141e6565b93506000600367ffffffffffffffff81111561259657612595614508565b5b6040519080825280602002602001820160405280156125c45781602001602082028036833780820191505090505b50905030816000815181106125dc576125db6149fe565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f00000000000000000000000000000000000000000000000000000000000000008160018151811061264b5761264a6149fe565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050602660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16816002815181106126bc576126bb6149fe565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600080602660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016127549190614002565b602060405180830381865afa158015612771573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612795919061422f565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ac3893ba88600086306000426040518763ffffffff1660e01b81526004016127fc96959493929190614b26565b600060405180830381600087803b15801561281657600080fd5b505af1925050508015612827575060015b6128c7577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635c11d7958860008630426040518663ffffffff1660e01b815260040161288d959493929190614b8e565b600060405180830381600087803b1580156128a757600080fd5b505af19250505080156128b8575060015b156128c257600191505b6128cc565b600191505b816128dd5750505050505050612e77565b6128ea3061dead88612f1f565b61291730602360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1686611dd6565b602360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633bdc8a1f856040518263ffffffff1660e01b81526004016129729190613b2b565b600060405180830381600087803b15801561298c57600080fd5b505af11580156129a0573d6000803e3d6000fd5b50505050600081602660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612a029190614002565b602060405180830381865afa158015612a1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a43919061422f565b612a4d91906141e6565b90506000600d54600b54600854600f54612a6791906141e6565b612a7191906141e6565b612a7b91906141e6565b905060008160095484612a8e919061495c565b612a9891906149cd565b9050600082600a5485612aab919061495c565b612ab591906149cd565b9050600083600c5486612ac8919061495c565b612ad291906149cd565b9050600081838588612ae491906141e6565b612aee91906141e6565b612af891906141e6565b9050602660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb602160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16866040518363ffffffff1660e01b8152600401612b7992919061425c565b6020604051808303816000875af1158015612b98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bbc919061429a565b50602660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb602260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16856040518363ffffffff1660e01b8152600401612c3c92919061425c565b6020604051808303816000875af1158015612c5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c7f919061429a565b50602660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb602460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401612cff92919061425c565b6020604051808303816000875af1158015612d1e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d42919061429a565b50602660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb602560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401612dc292919061425c565b6020604051808303816000875af1158015612de1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e05919061429a565b50600560159054906101000a900460ff1615612e2457612e2361341a565b5b7f310a031bae0df2b1a8ba6de615833770c757a404a7395cc0121c13975e67c0b08c85858e868f8742604051612e61989796959493929190614be8565b60405180910390a1505050505050505050505050505b6000600560166101000a81548160ff021916908315150217905550565b6000612ebc836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6136c4565b905092915050565b6000612ed383600001836137d8565b60001c905092915050565b6000612f06836000018373ffffffffffffffffffffffffffffffffffffffff1660001b613803565b905092915050565b600081600001805490509050919050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612f8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f8590614cd8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612ffd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ff490614d6a565b60405180910390fd5b613008838383613826565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561308e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161308590614dfc565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161317c9190613b2b565b60405180910390a361318f84848461382b565b50505050565b6000806027541415905090565b601154600881905550601254600981905550601354600a81905550601454600b81905550601554600c81905550601654600d81905550601754600e81905550601854600f81905550565b601954600881905550601a54600981905550601b54600a81905550601c54600b81905550601d54600c81905550601e54600d81905550601f54600e81905550602054600f81905550565b6000600560169054906101000a900460ff161580156132615750600560149054906101000a900460ff165b80156132715750613270613195565b5b8015613285575060006132833061162e565b115b801561329e575061329c613297611dce565b611c95565b155b905090565b600080601054600f54846132b7919061495c565b6132c191906149cd565b90506132ce843083612f1f565b80836132da91906141e6565b91505092915050565b6000613345826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166138309092919063ffffffff16565b90506000815111156133a55780806020019051810190613365919061429a565b6133a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161339b90614e8e565b60405180910390fd5b5b505050565b60006133b68383613803565b61340f578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050613414565b600090505b92915050565b6000600267ffffffffffffffff81111561343757613436614508565b5b6040519080825280602002602001820160405280156134655781602001602082028036833780820191505090505b509050308160008151811061347d5761347c6149fe565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000000000000000000000000000000000000000000000816001815181106134ec576134eb6149fe565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060006135313061162e565b9050600060028261354291906149cd565b90506103e8811015613556575050506136c2565b600047905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166352aa4c2284600088306000426040518763ffffffff1660e01b81526004016135c296959493929190614b26565b600060405180830381600087803b1580156135dc57600080fd5b505af19250505080156135ed575060015b61368d577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663791ac9478460008830426040518663ffffffff1660e01b8152600401613653959493929190614b8e565b600060405180830381600087803b15801561366d57600080fd5b505af192505050801561367e575060015b1561368857600190505b613692565b600190505b806136a15750505050506136c2565b600082476136af91906141e6565b90506136bb8482613848565b5050505050505b565b600080836001016000848152602001908152602001600020549050600081146137cc5760006001826136f691906141e6565b905060006001866000018054905061370e91906141e6565b905081811461377d57600086600001828154811061372f5761372e6149fe565b5b9060005260206000200154905080876000018481548110613753576137526149fe565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b8560000180548061379157613790614eae565b5b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506137d2565b60009150505b92915050565b60008260000182815481106137f0576137ef6149fe565b5b9060005260206000200154905092915050565b600080836001016000848152602001908152602001600020541415905092915050565b505050565b505050565b606061383f848460008561395d565b90509392505050565b613873307f000000000000000000000000000000000000000000000000000000000000000084611dd6565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663f305d7198230856000806000426040518863ffffffff1660e01b81526004016138d996959493929190614edd565b60606040518083038185885af19350505050801561391557506040513d601f19601f820116820180604052508101906139129190614f3e565b60015b15613959575050507ff75993dbe1645872cbbea6395e1feebee76b435baf0e4d62d7eac269c6f57b2482824260405161395093929190614f91565b60405180910390a15b5050565b6060824710156139a2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139999061503a565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516139cb919061457e565b60006040518083038185875af1925050503d8060008114613a08576040519150601f19603f3d011682016040523d82523d6000602084013e613a0d565b606091505b5091509150613a1e87838387613a2a565b92505050949350505050565b60608315613a8c576000835103613a8457613a4485613a9f565b613a83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a7a906150a6565b60405180910390fd5b5b829050613a97565b613a968383613ac2565b5b949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600082511115613ad55781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b099190613bd6565b60405180910390fd5b6000819050919050565b613b2581613b12565b82525050565b6000602082019050613b406000830184613b1c565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613b80578082015181840152602081019050613b65565b60008484015250505050565b6000601f19601f8301169050919050565b6000613ba882613b46565b613bb28185613b51565b9350613bc2818560208601613b62565b613bcb81613b8c565b840191505092915050565b60006020820190508181036000830152613bf08184613b9d565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613c2882613bfd565b9050919050565b613c3881613c1d565b8114613c4357600080fd5b50565b600081359050613c5581613c2f565b92915050565b613c6481613b12565b8114613c6f57600080fd5b50565b600081359050613c8181613c5b565b92915050565b60008060408385031215613c9e57613c9d613bf8565b5b6000613cac85828601613c46565b9250506020613cbd85828601613c72565b9150509250929050565b60008115159050919050565b613cdc81613cc7565b82525050565b6000602082019050613cf76000830184613cd3565b92915050565b600080600080600080600060e0888a031215613d1c57613d1b613bf8565b5b6000613d2a8a828b01613c72565b9750506020613d3b8a828b01613c72565b9650506040613d4c8a828b01613c72565b9550506060613d5d8a828b01613c72565b9450506080613d6e8a828b01613c72565b93505060a0613d7f8a828b01613c72565b92505060c0613d908a828b01613c72565b91505092959891949750929550565b600080600080600060a08688031215613dbb57613dba613bf8565b5b6000613dc988828901613c46565b9550506020613dda88828901613c46565b9450506040613deb88828901613c46565b9350506060613dfc88828901613c46565b9250506080613e0d88828901613c46565b9150509295509295909350565b600080600060608486031215613e3357613e32613bf8565b5b6000613e4186828701613c46565b9350506020613e5286828701613c46565b9250506040613e6386828701613c72565b9150509250925092565b6000819050919050565b6000613e92613e8d613e8884613bfd565b613e6d565b613bfd565b9050919050565b6000613ea482613e77565b9050919050565b6000613eb682613e99565b9050919050565b613ec681613eab565b82525050565b6000602082019050613ee16000830184613ebd565b92915050565b600060ff82169050919050565b613efd81613ee7565b82525050565b6000602082019050613f186000830184613ef4565b92915050565b600060208284031215613f3457613f33613bf8565b5b6000613f4284828501613c46565b91505092915050565b613f5481613cc7565b8114613f5f57600080fd5b50565b600081359050613f7181613f4b565b92915050565b60008060408385031215613f8e57613f8d613bf8565b5b6000613f9c85828601613c46565b9250506020613fad85828601613f62565b9150509250929050565b6000613fc282613e99565b9050919050565b613fd281613fb7565b82525050565b6000602082019050613fed6000830184613fc9565b92915050565b613ffc81613c1d565b82525050565b60006020820190506140176000830184613ff3565b92915050565b60006020828403121561403357614032613bf8565b5b600061404184828501613f62565b91505092915050565b6000602082840312156140605761405f613bf8565b5b600061406e84828501613c72565b91505092915050565b6000806040838503121561408e5761408d613bf8565b5b600061409c85828601613c46565b92505060206140ad85828601613c46565b9150509250929050565b7f416c7265616479206c61756e6368656400000000000000000000000000000000600082015250565b60006140ed601083613b51565b91506140f8826140b7565b602082019050919050565b6000602082019050818103600083015261411c816140e0565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061416a57607f821691505b60208210810361417d5761417c614123565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006141bd82613b12565b91506141c883613b12565b92508282019050808211156141e0576141df614183565b5b92915050565b60006141f182613b12565b91506141fc83613b12565b925082820390508181111561421457614213614183565b5b92915050565b60008151905061422981613c5b565b92915050565b60006020828403121561424557614244613bf8565b5b60006142538482850161421a565b91505092915050565b60006040820190506142716000830185613ff3565b61427e6020830184613b1c565b9392505050565b60008151905061429481613f4b565b92915050565b6000602082840312156142b0576142af613bf8565b5b60006142be84828501614285565b91505092915050565b7f416c726561647920696e697469616c697a656400000000000000000000000000600082015250565b60006142fd601383613b51565b9150614308826142c7565b602082019050919050565b6000602082019050818103600083015261432c816142f0565b9050919050565b60006040820190506143486000830185613ff3565b6143556020830184613ff3565b9392505050565b60008151905061436b81613c2f565b92915050565b60006020828403121561438757614386613bf8565b5b60006143958482850161435c565b91505092915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006143fa602583613b51565b91506144058261439e565b604082019050919050565b60006020820190508181036000830152614429816143ed565b9050919050565b7f4149444f47453a207061697220697320746865207a65726f2061646472657373600082015250565b6000614466602083613b51565b915061447182614430565b602082019050919050565b6000602082019050818103600083015261449581614459565b9050919050565b7f4149444f47453a20696e646578206f7574206f6620626f756e64730000000000600082015250565b60006144d2601b83613b51565b91506144dd8261449c565b602082019050919050565b60006020820190508181036000830152614501816144c5565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600081519050919050565b600081905092915050565b600061455882614537565b6145628185614542565b9350614572818560208601613b62565b80840191505092915050565b600061458a828461454d565b915081905092915050565b7f4149444f47453a204554485f5452414e534645525f4641494c45440000000000600082015250565b60006145cb601b83613b51565b91506145d682614595565b602082019050919050565b600060208201905081810360008301526145fa816145be565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061465d602683613b51565b915061466882614601565b604082019050919050565b6000602082019050818103600083015261468c81614650565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006146c9602083613b51565b91506146d482614693565b602082019050919050565b600060208201905081810360008301526146f8816146bc565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061475b602483613b51565b9150614766826146ff565b604082019050919050565b6000602082019050818103600083015261478a8161474e565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006147ed602283613b51565b91506147f882614791565b604082019050919050565b6000602082019050818103600083015261481c816147e0565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000614859601d83613b51565b915061486482614823565b602082019050919050565b600060208201905081810360008301526148888161484c565b9050919050565b7f54726164696e67206e6f74206f70656e20796574000000000000000000000000600082015250565b60006148c5601483613b51565b91506148d08261488f565b602082019050919050565b600060208201905081810360008301526148f4816148b8565b9050919050565b600060c0820190506149106000830189613ff3565b61491d6020830188613ff3565b61492a6040830187613b1c565b6149376060830186613b1c565b6149446080830185613b1c565b61495160a0830184613b1c565b979650505050505050565b600061496782613b12565b915061497283613b12565b925082820261498081613b12565b9150828204841483151761499757614996614183565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006149d882613b12565b91506149e383613b12565b9250826149f3576149f261499e565b5b828204905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b6000614a52614a4d614a4884614a2d565b613e6d565b613b12565b9050919050565b614a6281614a37565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b614a9d81613c1d565b82525050565b6000614aaf8383614a94565b60208301905092915050565b6000602082019050919050565b6000614ad382614a68565b614add8185614a73565b9350614ae883614a84565b8060005b83811015614b19578151614b008882614aa3565b9750614b0b83614abb565b925050600181019050614aec565b5085935050505092915050565b600060c082019050614b3b6000830189613b1c565b614b486020830188614a59565b8181036040830152614b5a8187614ac8565b9050614b696060830186613ff3565b614b766080830185613ff3565b614b8360a0830184613b1c565b979650505050505050565b600060a082019050614ba36000830188613b1c565b614bb06020830187614a59565b8181036040830152614bc28186614ac8565b9050614bd16060830185613ff3565b614bde6080830184613b1c565b9695505050505050565b600061010082019050614bfe600083018b613b1c565b614c0b602083018a613b1c565b614c186040830189613b1c565b614c256060830188613b1c565b614c326080830187613b1c565b614c3f60a0830186613b1c565b614c4c60c0830185613b1c565b614c5960e0830184613b1c565b9998505050505050505050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000614cc2602583613b51565b9150614ccd82614c66565b604082019050919050565b60006020820190508181036000830152614cf181614cb5565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000614d54602383613b51565b9150614d5f82614cf8565b604082019050919050565b60006020820190508181036000830152614d8381614d47565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000614de6602683613b51565b9150614df182614d8a565b604082019050919050565b60006020820190508181036000830152614e1581614dd9565b9050919050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6000614e78602a83613b51565b9150614e8382614e1c565b604082019050919050565b60006020820190508181036000830152614ea781614e6b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600060c082019050614ef26000830189613ff3565b614eff6020830188613b1c565b614f0c6040830187614a59565b614f196060830186614a59565b614f266080830185613ff3565b614f3360a0830184613b1c565b979650505050505050565b600080600060608486031215614f5757614f56613bf8565b5b6000614f658682870161421a565b9350506020614f768682870161421a565b9250506040614f878682870161421a565b9150509250925092565b6000606082019050614fa66000830186613b1c565b614fb36020830185613b1c565b614fc06040830184613b1c565b949350505050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000615024602683613b51565b915061502f82614fc8565b604082019050919050565b6000602082019050818103600083015261505381615017565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000615090601d83613b51565b915061509b8261505a565b602082019050919050565b600060208201905081810360008301526150bf81615083565b905091905056fea2646970667358221220f7408e3ec91b5774681225e547dfe764a4366d26908b49f5338842d18fdba3b864736f6c63430008130033000000000000000000000000912ce59144191c1204e64559fe8253a0e49e65480000000000000000000000006eccab422d763ac031210895c81787e87b43a652000000000000000000000000c873fecbd354f5a56e00e710b90ef4201db2448d00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab1

Deployed Bytecode

0x60806040526004361061039b5760003560e01c806382d20116116101dc578063b8c6113011610102578063cdba31fd116100a0578063e1e5a66d1161006f578063e1e5a66d14610d61578063e5e31b1314610d8c578063f2fde38b14610dc9578063fb5f27fb14610df2576103a2565b8063cdba31fd14610ca3578063d830678614610cce578063dbd6c48914610cf9578063dd62ed3e14610d24576103a2565b8063bfa382b5116100dc578063bfa382b514610bf9578063c2b7bbb614610c10578063c6d2577d14610c4d578063cb806e0714610c78576103a2565b8063b8c6113014610b68578063bdf391cc14610b91578063bf56b37114610bce576103a2565b806395d89b411161017a578063aac46c9511610149578063aac46c9514610abe578063ace1880114610ae7578063b6309f6814610b12578063b7eed4c414610b3d576103a2565b806395d89b41146109dc578063a457c2d714610a07578063a5bc508514610a44578063a9059cbb14610a81576103a2565b806386c8782f116101b657806386c8782f146109465780638da5cb5b146109715780638fbbd7501461099c5780639272293c146109b3576103a2565b806382d20116146108c557806386013940146108f0578063861faf5f1461091b576103a2565b80632d2f244b116102c1578063531484161161025f57806370a082311161022e57806370a082311461080957806370c8810e14610846578063715018a6146108715780638072250b14610888576103a2565b8063531484161461075f578063658d4b7f1461078a5780636c470595146107b35780636ddd1713146107de576103a2565b8063395093511161029b57806339509351146106a55780633f4218e0146106e25780634460d3cf1461071f5780634fab9e4c14610748576103a2565b80632d2f244b14610638578063313ce56714610663578063364333f41461068e576103a2565b806312835c5e1161033957806318abb6351161030857806318abb6351461057c578063234a2daa146105a557806323b872dd146105d05780632b112e491461060d576103a2565b806312835c5e146104d057806315674e8e146104fb578063180b0d7e1461052657806318160ddd14610551576103a2565b806306fdde031161037557806306fdde0314610414578063095ea7b31461043f5780630ca5979b1461047c5780631107b3a5146104a5576103a2565b806301339c21146103a7578063017e24e1146103be5780630323aac7146103e9576103a2565b366103a257005b600080fd5b3480156103b357600080fd5b506103bc610e1d565b005b3480156103ca57600080fd5b506103d3610e7a565b6040516103e09190613b2b565b60405180910390f35b3480156103f557600080fd5b506103fe610e80565b60405161040b9190613b2b565b60405180910390f35b34801561042057600080fd5b50610429610e91565b6040516104369190613bd6565b60405180910390f35b34801561044b57600080fd5b5061046660048036038101906104619190613c87565b610f23565b6040516104739190613ce2565b60405180910390f35b34801561048857600080fd5b506104a3600480360381019061049e9190613cfd565b610f46565b005b3480156104b157600080fd5b506104ba610fbb565b6040516104c79190613b2b565b60405180910390f35b3480156104dc57600080fd5b506104e5610fc1565b6040516104f29190613b2b565b60405180910390f35b34801561050757600080fd5b50610510610fc7565b60405161051d9190613b2b565b60405180910390f35b34801561053257600080fd5b5061053b610fcd565b6040516105489190613b2b565b60405180910390f35b34801561055d57600080fd5b50610566610fd3565b6040516105739190613b2b565b60405180910390f35b34801561058857600080fd5b506105a3600480360381019061059e9190613d9f565b610fdd565b005b3480156105b157600080fd5b506105ba611172565b6040516105c79190613b2b565b60405180910390f35b3480156105dc57600080fd5b506105f760048036038101906105f29190613e1a565b611178565b6040516106049190613ce2565b60405180910390f35b34801561061957600080fd5b506106226111a5565b60405161062f9190613b2b565b60405180910390f35b34801561064457600080fd5b5061064d6111dd565b60405161065a9190613ecc565b60405180910390f35b34801561066f57600080fd5b50610678611203565b6040516106859190613f03565b60405180910390f35b34801561069a57600080fd5b506106a361120c565b005b3480156106b157600080fd5b506106cc60048036038101906106c79190613c87565b611359565b6040516106d99190613ce2565b60405180910390f35b3480156106ee57600080fd5b5061070960048036038101906107049190613f1e565b611390565b6040516107169190613ce2565b60405180910390f35b34801561072b57600080fd5b5061074660048036038101906107419190613f1e565b6113b0565b005b34801561075457600080fd5b5061075d61145f565b005b34801561076b57600080fd5b506107746115ac565b6040516107819190613b2b565b60405180910390f35b34801561079657600080fd5b506107b160048036038101906107ac9190613f77565b6115b2565b005b3480156107bf57600080fd5b506107c8611615565b6040516107d59190613b2b565b60405180910390f35b3480156107ea57600080fd5b506107f361161b565b6040516108009190613ce2565b60405180910390f35b34801561081557600080fd5b50610830600480360381019061082b9190613f1e565b61162e565b60405161083d9190613b2b565b60405180910390f35b34801561085257600080fd5b5061085b611676565b6040516108689190613b2b565b60405180910390f35b34801561087d57600080fd5b5061088661167c565b005b34801561089457600080fd5b506108af60048036038101906108aa9190613f1e565b611690565b6040516108bc9190613ce2565b60405180910390f35b3480156108d157600080fd5b506108da6116b0565b6040516108e79190613b2b565b60405180910390f35b3480156108fc57600080fd5b506109056116b6565b6040516109129190613ce2565b60405180910390f35b34801561092757600080fd5b506109306116c9565b60405161093d9190613fd8565b60405180910390f35b34801561095257600080fd5b5061095b6116ef565b6040516109689190613b2b565b60405180910390f35b34801561097d57600080fd5b506109866116f5565b6040516109939190614002565b60405180910390f35b3480156109a857600080fd5b506109b161171f565b005b3480156109bf57600080fd5b506109da60048036038101906109d59190613cfd565b611731565b005b3480156109e857600080fd5b506109f16117a6565b6040516109fe9190613bd6565b60405180910390f35b348015610a1357600080fd5b50610a2e6004803603810190610a299190613c87565b611838565b604051610a3b9190613ce2565b60405180910390f35b348015610a5057600080fd5b50610a6b6004803603810190610a669190613f1e565b6118af565b604051610a789190613ce2565b60405180910390f35b348015610a8d57600080fd5b50610aa86004803603810190610aa39190613c87565b611943565b604051610ab59190613ce2565b60405180910390f35b348015610aca57600080fd5b50610ae56004803603810190610ae0919061401d565b61195f565b005b348015610af357600080fd5b50610afc611984565b604051610b099190613b2b565b60405180910390f35b348015610b1e57600080fd5b50610b2761198a565b604051610b349190613b2b565b60405180910390f35b348015610b4957600080fd5b50610b52611990565b604051610b5f9190613b2b565b60405180910390f35b348015610b7457600080fd5b50610b8f6004803603810190610b8a919061401d565b611996565b005b348015610b9d57600080fd5b50610bb86004803603810190610bb3919061404a565b6119bb565b604051610bc59190614002565b60405180910390f35b348015610bda57600080fd5b50610be3611a30565b604051610bf09190613b2b565b60405180910390f35b348015610c0557600080fd5b50610c0e611a36565b005b348015610c1c57600080fd5b50610c376004803603810190610c329190613f1e565b611b49565b604051610c449190613ce2565b60405180910390f35b348015610c5957600080fd5b50610c62611bdd565b604051610c6f9190613b2b565b60405180910390f35b348015610c8457600080fd5b50610c8d611be3565b604051610c9a9190613b2b565b60405180910390f35b348015610caf57600080fd5b50610cb8611be9565b604051610cc59190613b2b565b60405180910390f35b348015610cda57600080fd5b50610ce3611bef565b604051610cf09190613ce2565b60405180910390f35b348015610d0557600080fd5b50610d0e611c02565b604051610d1b9190613b2b565b60405180910390f35b348015610d3057600080fd5b50610d4b6004803603810190610d469190614077565b611c08565b604051610d589190613b2b565b60405180910390f35b348015610d6d57600080fd5b50610d76611c8f565b604051610d839190613b2b565b60405180910390f35b348015610d9857600080fd5b50610db36004803603810190610dae9190613f1e565b611c95565b604051610dc09190613ce2565b60405180910390f35b348015610dd557600080fd5b50610df06004803603810190610deb9190613f1e565b611cb2565b005b348015610dfe57600080fd5b50610e07611d35565b604051610e149190613b2b565b60405180910390f35b610e25611d3b565b600060275414610e6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6190614103565b60405180910390fd5b4360278190555042602881905550565b600a5481565b6000610e8c602a611db9565b905090565b606060038054610ea090614152565b80601f0160208091040260200160405190810160405280929190818152602001828054610ecc90614152565b8015610f195780601f10610eee57610100808354040283529160200191610f19565b820191906000526020600020905b815481529060010190602001808311610efc57829003601f168201915b5050505050905090565b600080610f2e611dce565b9050610f3b818585611dd6565b600191505092915050565b610f4e611d3b565b866012819055508560138190555084601481905550836015819055508260168190555081601781905550806011819055508082848688610f8e91906141b2565b610f9891906141b2565b610fa291906141b2565b610fac91906141b2565b60188190555050505050505050565b601c5481565b601f5481565b60115481565b60105481565b6000600254905090565b610fe5611d3b565b84602160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083602260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081602460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080602560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080602560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050565b60195481565b600080611183611dce565b9050611190858285611f9f565b61119b85858561202b565b9150509392505050565b60006111b1600061162e565b6111bc61dead61162e565b6111c4610fd3565b6111ce91906141e6565b6111d891906141e6565b905090565b602460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006006905090565b611214611d3b565b602660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb61125a611dce565b602660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016112b59190614002565b602060405180830381865afa1580156112d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112f6919061422f565b6040518363ffffffff1660e01b815260040161131392919061425c565b6020604051808303816000875af1158015611332573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611356919061429a565b50565b600080611364611dce565b90506113858185856113768589611c08565b61138091906141b2565b611dd6565b600191505092915050565b60066020528060005260406000206000915054906101000a900460ff1681565b6113b8611d3b565b61145c338273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016113f59190614002565b602060405180830381865afa158015611412573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611436919061422f565b8373ffffffffffffffffffffffffffffffffffffffff166123239092919063ffffffff16565b50565b611467611d3b565b602960009054906101000a900460ff16156114b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ae90614313565b60405180910390fd5b60007f0000000000000000000000006eccab422d763ac031210895c81787e87b43a65273ffffffffffffffffffffffffffffffffffffffff1663c9c653967f00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab1306040518363ffffffff1660e01b8152600401611534929190614333565b6020604051808303816000875af1158015611553573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115779190614371565b905061158d81602a6123a990919063ffffffff16565b506001602960006101000a81548160ff02191690831515021790555050565b60205481565b6115ba611d3b565b80600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60155481565b600560149054906101000a900460ff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60125481565b611684611d3b565b61168e60006123d9565b565b60076020528060005260406000206000915054906101000a900460ff1681565b60145481565b600560159054906101000a900460ff1681565b602660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60165481565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611727611d3b565b61172f61249f565b565b611739611d3b565b86601a8190555085601b8190555084601c8190555083601d8190555082601e8190555081601f8190555080601981905550808284868861177991906141b2565b61178391906141b2565b61178d91906141b2565b61179791906141b2565b60208190555050505050505050565b6060600480546117b590614152565b80601f01602080910402602001604051908101604052809291908181526020018280546117e190614152565b801561182e5780601f106118035761010080835404028352916020019161182e565b820191906000526020600020905b81548152906001019060200180831161181157829003601f168201915b5050505050905090565b600080611843611dce565b905060006118518286611c08565b905083811015611896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188d90614410565b60405180910390fd5b6118a38286868403611dd6565b60019250505092915050565b60006118b9611d3b565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611928576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191f9061447c565b60405180910390fd5b61193c82602a612e9490919063ffffffff16565b9050919050565b6000611957611950611dce565b848461202b565b905092915050565b611967611d3b565b80600560156101000a81548160ff02191690831515021790555050565b601e5481565b601b5481565b601d5481565b61199e611d3b565b80600560146101000a81548160ff02191690831515021790555050565b600060016119c9602a611db9565b6119d391906141e6565b821115611a15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0c906144e8565b60405180910390fd5b611a2982602a612ec490919063ffffffff16565b9050919050565b60275481565b611a3e611d3b565b60004790506000611a4d611dce565b73ffffffffffffffffffffffffffffffffffffffff1682600067ffffffffffffffff811115611a7f57611a7e614508565b5b6040519080825280601f01601f191660200182016040528015611ab15781602001600182028036833780820191505090505b50604051611abf919061457e565b60006040518083038185875af1925050503d8060008114611afc576040519150601f19603f3d011682016040523d82523d6000602084013e611b01565b606091505b5050905080611b45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3c906145e1565b60405180910390fd5b5050565b6000611b53611d3b565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611bc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb99061447c565b60405180910390fd5b611bd682602a6123a990919063ffffffff16565b9050919050565b60285481565b60095481565b60175481565b600560169054906101000a900460ff1681565b601a5481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60135481565b6000611cab82602a612ede90919063ffffffff16565b9050919050565b611cba611d3b565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611d29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2090614673565b60405180910390fd5b611d32816123d9565b50565b60185481565b611d43611dce565b73ffffffffffffffffffffffffffffffffffffffff16611d616116f5565b73ffffffffffffffffffffffffffffffffffffffff1614611db7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dae906146df565b60405180910390fd5b565b6000611dc782600001612f0e565b9050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611e45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3c90614771565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611eb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eab90614803565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611f929190613b2b565b60405180910390a3505050565b6000611fab8484611c08565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146120255781811015612017576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200e9061486f565b60405180910390fd5b6120248484848403611dd6565b5b50505050565b6000600560169054906101000a900460ff16156120565761204d848484612f1f565b6001905061231c565b600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166120ef576120af613195565b6120ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e5906148db565b60405180910390fd5b5b6000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156121955750600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156121a557506121a4613195565b5b905060008086905060008690506121bb88611c95565b15612260576121c86131a2565b60019250869150879050602460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166367d198a689886040518363ffffffff1660e01b815260040161222f92919061425c565b600060405180830381600087803b15801561224957600080fd5b505af192505050801561225a575060015b50612285565b61226987611c95565b1561227f576122766131ec565b60029250612284565b600093505b5b61228d613236565b1561229b5761229a61249f565b5b6000846122a857866122b3565b6122b289886132a3565b5b90506122c0898983612f1f565b6000841115612312577fe6f814da7244d1ae6c61b54b5684858ba39cad7b9a91884be10060664987d754838389876122f66111a5565b42604051612309969594939291906148fb565b60405180910390a15b6001955050505050505b9392505050565b6123a48363a9059cbb60e01b848460405160240161234292919061425c565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506132e3565b505050565b60006123d1836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6133aa565b905092915050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6001600560166101000a81548160ff02191690831515021790555060006124c53061162e565b90506124f2307f000000000000000000000000c873fecbd354f5a56e00e710b90ef4201db2448d83611dd6565b6000600f5460085483612505919061495c565b61250f91906149cd565b90506000600f54600b5484612524919061495c565b61252e91906149cd565b90506000600f54600d5485612543919061495c565b61254d91906149cd565b9050828461255b91906141e6565b9350818461256991906141e6565b9350808461257791906141e6565b93506000600367ffffffffffffffff81111561259657612595614508565b5b6040519080825280602002602001820160405280156125c45781602001602082028036833780820191505090505b50905030816000815181106125dc576125db6149fe565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab18160018151811061264b5761264a6149fe565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050602660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16816002815181106126bc576126bb6149fe565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600080602660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016127549190614002565b602060405180830381865afa158015612771573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612795919061422f565b90507f000000000000000000000000c873fecbd354f5a56e00e710b90ef4201db2448d73ffffffffffffffffffffffffffffffffffffffff1663ac3893ba88600086306000426040518763ffffffff1660e01b81526004016127fc96959493929190614b26565b600060405180830381600087803b15801561281657600080fd5b505af1925050508015612827575060015b6128c7577f000000000000000000000000c873fecbd354f5a56e00e710b90ef4201db2448d73ffffffffffffffffffffffffffffffffffffffff16635c11d7958860008630426040518663ffffffff1660e01b815260040161288d959493929190614b8e565b600060405180830381600087803b1580156128a757600080fd5b505af19250505080156128b8575060015b156128c257600191505b6128cc565b600191505b816128dd5750505050505050612e77565b6128ea3061dead88612f1f565b61291730602360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1686611dd6565b602360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633bdc8a1f856040518263ffffffff1660e01b81526004016129729190613b2b565b600060405180830381600087803b15801561298c57600080fd5b505af11580156129a0573d6000803e3d6000fd5b50505050600081602660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612a029190614002565b602060405180830381865afa158015612a1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a43919061422f565b612a4d91906141e6565b90506000600d54600b54600854600f54612a6791906141e6565b612a7191906141e6565b612a7b91906141e6565b905060008160095484612a8e919061495c565b612a9891906149cd565b9050600082600a5485612aab919061495c565b612ab591906149cd565b9050600083600c5486612ac8919061495c565b612ad291906149cd565b9050600081838588612ae491906141e6565b612aee91906141e6565b612af891906141e6565b9050602660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb602160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16866040518363ffffffff1660e01b8152600401612b7992919061425c565b6020604051808303816000875af1158015612b98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bbc919061429a565b50602660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb602260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16856040518363ffffffff1660e01b8152600401612c3c92919061425c565b6020604051808303816000875af1158015612c5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c7f919061429a565b50602660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb602460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401612cff92919061425c565b6020604051808303816000875af1158015612d1e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d42919061429a565b50602660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb602560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401612dc292919061425c565b6020604051808303816000875af1158015612de1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e05919061429a565b50600560159054906101000a900460ff1615612e2457612e2361341a565b5b7f310a031bae0df2b1a8ba6de615833770c757a404a7395cc0121c13975e67c0b08c85858e868f8742604051612e61989796959493929190614be8565b60405180910390a1505050505050505050505050505b6000600560166101000a81548160ff021916908315150217905550565b6000612ebc836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6136c4565b905092915050565b6000612ed383600001836137d8565b60001c905092915050565b6000612f06836000018373ffffffffffffffffffffffffffffffffffffffff1660001b613803565b905092915050565b600081600001805490509050919050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612f8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f8590614cd8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612ffd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ff490614d6a565b60405180910390fd5b613008838383613826565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561308e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161308590614dfc565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161317c9190613b2b565b60405180910390a361318f84848461382b565b50505050565b6000806027541415905090565b601154600881905550601254600981905550601354600a81905550601454600b81905550601554600c81905550601654600d81905550601754600e81905550601854600f81905550565b601954600881905550601a54600981905550601b54600a81905550601c54600b81905550601d54600c81905550601e54600d81905550601f54600e81905550602054600f81905550565b6000600560169054906101000a900460ff161580156132615750600560149054906101000a900460ff165b80156132715750613270613195565b5b8015613285575060006132833061162e565b115b801561329e575061329c613297611dce565b611c95565b155b905090565b600080601054600f54846132b7919061495c565b6132c191906149cd565b90506132ce843083612f1f565b80836132da91906141e6565b91505092915050565b6000613345826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166138309092919063ffffffff16565b90506000815111156133a55780806020019051810190613365919061429a565b6133a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161339b90614e8e565b60405180910390fd5b5b505050565b60006133b68383613803565b61340f578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050613414565b600090505b92915050565b6000600267ffffffffffffffff81111561343757613436614508565b5b6040519080825280602002602001820160405280156134655781602001602082028036833780820191505090505b509050308160008151811061347d5761347c6149fe565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab1816001815181106134ec576134eb6149fe565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060006135313061162e565b9050600060028261354291906149cd565b90506103e8811015613556575050506136c2565b600047905060007f000000000000000000000000c873fecbd354f5a56e00e710b90ef4201db2448d73ffffffffffffffffffffffffffffffffffffffff166352aa4c2284600088306000426040518763ffffffff1660e01b81526004016135c296959493929190614b26565b600060405180830381600087803b1580156135dc57600080fd5b505af19250505080156135ed575060015b61368d577f000000000000000000000000c873fecbd354f5a56e00e710b90ef4201db2448d73ffffffffffffffffffffffffffffffffffffffff1663791ac9478460008830426040518663ffffffff1660e01b8152600401613653959493929190614b8e565b600060405180830381600087803b15801561366d57600080fd5b505af192505050801561367e575060015b1561368857600190505b613692565b600190505b806136a15750505050506136c2565b600082476136af91906141e6565b90506136bb8482613848565b5050505050505b565b600080836001016000848152602001908152602001600020549050600081146137cc5760006001826136f691906141e6565b905060006001866000018054905061370e91906141e6565b905081811461377d57600086600001828154811061372f5761372e6149fe565b5b9060005260206000200154905080876000018481548110613753576137526149fe565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b8560000180548061379157613790614eae565b5b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506137d2565b60009150505b92915050565b60008260000182815481106137f0576137ef6149fe565b5b9060005260206000200154905092915050565b600080836001016000848152602001908152602001600020541415905092915050565b505050565b505050565b606061383f848460008561395d565b90509392505050565b613873307f000000000000000000000000c873fecbd354f5a56e00e710b90ef4201db2448d84611dd6565b7f000000000000000000000000c873fecbd354f5a56e00e710b90ef4201db2448d73ffffffffffffffffffffffffffffffffffffffff1663f305d7198230856000806000426040518863ffffffff1660e01b81526004016138d996959493929190614edd565b60606040518083038185885af19350505050801561391557506040513d601f19601f820116820180604052508101906139129190614f3e565b60015b15613959575050507ff75993dbe1645872cbbea6395e1feebee76b435baf0e4d62d7eac269c6f57b2482824260405161395093929190614f91565b60405180910390a15b5050565b6060824710156139a2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139999061503a565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516139cb919061457e565b60006040518083038185875af1925050503d8060008114613a08576040519150601f19603f3d011682016040523d82523d6000602084013e613a0d565b606091505b5091509150613a1e87838387613a2a565b92505050949350505050565b60608315613a8c576000835103613a8457613a4485613a9f565b613a83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a7a906150a6565b60405180910390fd5b5b829050613a97565b613a968383613ac2565b5b949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600082511115613ad55781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b099190613bd6565b60405180910390fd5b6000819050919050565b613b2581613b12565b82525050565b6000602082019050613b406000830184613b1c565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613b80578082015181840152602081019050613b65565b60008484015250505050565b6000601f19601f8301169050919050565b6000613ba882613b46565b613bb28185613b51565b9350613bc2818560208601613b62565b613bcb81613b8c565b840191505092915050565b60006020820190508181036000830152613bf08184613b9d565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613c2882613bfd565b9050919050565b613c3881613c1d565b8114613c4357600080fd5b50565b600081359050613c5581613c2f565b92915050565b613c6481613b12565b8114613c6f57600080fd5b50565b600081359050613c8181613c5b565b92915050565b60008060408385031215613c9e57613c9d613bf8565b5b6000613cac85828601613c46565b9250506020613cbd85828601613c72565b9150509250929050565b60008115159050919050565b613cdc81613cc7565b82525050565b6000602082019050613cf76000830184613cd3565b92915050565b600080600080600080600060e0888a031215613d1c57613d1b613bf8565b5b6000613d2a8a828b01613c72565b9750506020613d3b8a828b01613c72565b9650506040613d4c8a828b01613c72565b9550506060613d5d8a828b01613c72565b9450506080613d6e8a828b01613c72565b93505060a0613d7f8a828b01613c72565b92505060c0613d908a828b01613c72565b91505092959891949750929550565b600080600080600060a08688031215613dbb57613dba613bf8565b5b6000613dc988828901613c46565b9550506020613dda88828901613c46565b9450506040613deb88828901613c46565b9350506060613dfc88828901613c46565b9250506080613e0d88828901613c46565b9150509295509295909350565b600080600060608486031215613e3357613e32613bf8565b5b6000613e4186828701613c46565b9350506020613e5286828701613c46565b9250506040613e6386828701613c72565b9150509250925092565b6000819050919050565b6000613e92613e8d613e8884613bfd565b613e6d565b613bfd565b9050919050565b6000613ea482613e77565b9050919050565b6000613eb682613e99565b9050919050565b613ec681613eab565b82525050565b6000602082019050613ee16000830184613ebd565b92915050565b600060ff82169050919050565b613efd81613ee7565b82525050565b6000602082019050613f186000830184613ef4565b92915050565b600060208284031215613f3457613f33613bf8565b5b6000613f4284828501613c46565b91505092915050565b613f5481613cc7565b8114613f5f57600080fd5b50565b600081359050613f7181613f4b565b92915050565b60008060408385031215613f8e57613f8d613bf8565b5b6000613f9c85828601613c46565b9250506020613fad85828601613f62565b9150509250929050565b6000613fc282613e99565b9050919050565b613fd281613fb7565b82525050565b6000602082019050613fed6000830184613fc9565b92915050565b613ffc81613c1d565b82525050565b60006020820190506140176000830184613ff3565b92915050565b60006020828403121561403357614032613bf8565b5b600061404184828501613f62565b91505092915050565b6000602082840312156140605761405f613bf8565b5b600061406e84828501613c72565b91505092915050565b6000806040838503121561408e5761408d613bf8565b5b600061409c85828601613c46565b92505060206140ad85828601613c46565b9150509250929050565b7f416c7265616479206c61756e6368656400000000000000000000000000000000600082015250565b60006140ed601083613b51565b91506140f8826140b7565b602082019050919050565b6000602082019050818103600083015261411c816140e0565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061416a57607f821691505b60208210810361417d5761417c614123565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006141bd82613b12565b91506141c883613b12565b92508282019050808211156141e0576141df614183565b5b92915050565b60006141f182613b12565b91506141fc83613b12565b925082820390508181111561421457614213614183565b5b92915050565b60008151905061422981613c5b565b92915050565b60006020828403121561424557614244613bf8565b5b60006142538482850161421a565b91505092915050565b60006040820190506142716000830185613ff3565b61427e6020830184613b1c565b9392505050565b60008151905061429481613f4b565b92915050565b6000602082840312156142b0576142af613bf8565b5b60006142be84828501614285565b91505092915050565b7f416c726561647920696e697469616c697a656400000000000000000000000000600082015250565b60006142fd601383613b51565b9150614308826142c7565b602082019050919050565b6000602082019050818103600083015261432c816142f0565b9050919050565b60006040820190506143486000830185613ff3565b6143556020830184613ff3565b9392505050565b60008151905061436b81613c2f565b92915050565b60006020828403121561438757614386613bf8565b5b60006143958482850161435c565b91505092915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006143fa602583613b51565b91506144058261439e565b604082019050919050565b60006020820190508181036000830152614429816143ed565b9050919050565b7f4149444f47453a207061697220697320746865207a65726f2061646472657373600082015250565b6000614466602083613b51565b915061447182614430565b602082019050919050565b6000602082019050818103600083015261449581614459565b9050919050565b7f4149444f47453a20696e646578206f7574206f6620626f756e64730000000000600082015250565b60006144d2601b83613b51565b91506144dd8261449c565b602082019050919050565b60006020820190508181036000830152614501816144c5565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600081519050919050565b600081905092915050565b600061455882614537565b6145628185614542565b9350614572818560208601613b62565b80840191505092915050565b600061458a828461454d565b915081905092915050565b7f4149444f47453a204554485f5452414e534645525f4641494c45440000000000600082015250565b60006145cb601b83613b51565b91506145d682614595565b602082019050919050565b600060208201905081810360008301526145fa816145be565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061465d602683613b51565b915061466882614601565b604082019050919050565b6000602082019050818103600083015261468c81614650565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006146c9602083613b51565b91506146d482614693565b602082019050919050565b600060208201905081810360008301526146f8816146bc565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061475b602483613b51565b9150614766826146ff565b604082019050919050565b6000602082019050818103600083015261478a8161474e565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006147ed602283613b51565b91506147f882614791565b604082019050919050565b6000602082019050818103600083015261481c816147e0565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000614859601d83613b51565b915061486482614823565b602082019050919050565b600060208201905081810360008301526148888161484c565b9050919050565b7f54726164696e67206e6f74206f70656e20796574000000000000000000000000600082015250565b60006148c5601483613b51565b91506148d08261488f565b602082019050919050565b600060208201905081810360008301526148f4816148b8565b9050919050565b600060c0820190506149106000830189613ff3565b61491d6020830188613ff3565b61492a6040830187613b1c565b6149376060830186613b1c565b6149446080830185613b1c565b61495160a0830184613b1c565b979650505050505050565b600061496782613b12565b915061497283613b12565b925082820261498081613b12565b9150828204841483151761499757614996614183565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006149d882613b12565b91506149e383613b12565b9250826149f3576149f261499e565b5b828204905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b6000614a52614a4d614a4884614a2d565b613e6d565b613b12565b9050919050565b614a6281614a37565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b614a9d81613c1d565b82525050565b6000614aaf8383614a94565b60208301905092915050565b6000602082019050919050565b6000614ad382614a68565b614add8185614a73565b9350614ae883614a84565b8060005b83811015614b19578151614b008882614aa3565b9750614b0b83614abb565b925050600181019050614aec565b5085935050505092915050565b600060c082019050614b3b6000830189613b1c565b614b486020830188614a59565b8181036040830152614b5a8187614ac8565b9050614b696060830186613ff3565b614b766080830185613ff3565b614b8360a0830184613b1c565b979650505050505050565b600060a082019050614ba36000830188613b1c565b614bb06020830187614a59565b8181036040830152614bc28186614ac8565b9050614bd16060830185613ff3565b614bde6080830184613b1c565b9695505050505050565b600061010082019050614bfe600083018b613b1c565b614c0b602083018a613b1c565b614c186040830189613b1c565b614c256060830188613b1c565b614c326080830187613b1c565b614c3f60a0830186613b1c565b614c4c60c0830185613b1c565b614c5960e0830184613b1c565b9998505050505050505050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000614cc2602583613b51565b9150614ccd82614c66565b604082019050919050565b60006020820190508181036000830152614cf181614cb5565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000614d54602383613b51565b9150614d5f82614cf8565b604082019050919050565b60006020820190508181036000830152614d8381614d47565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000614de6602683613b51565b9150614df182614d8a565b604082019050919050565b60006020820190508181036000830152614e1581614dd9565b9050919050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6000614e78602a83613b51565b9150614e8382614e1c565b604082019050919050565b60006020820190508181036000830152614ea781614e6b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600060c082019050614ef26000830189613ff3565b614eff6020830188613b1c565b614f0c6040830187614a59565b614f196060830186614a59565b614f266080830185613ff3565b614f3360a0830184613b1c565b979650505050505050565b600080600060608486031215614f5757614f56613bf8565b5b6000614f658682870161421a565b9350506020614f768682870161421a565b9250506040614f878682870161421a565b9150509250925092565b6000606082019050614fa66000830186613b1c565b614fb36020830185613b1c565b614fc06040830184613b1c565b949350505050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000615024602683613b51565b915061502f82614fc8565b604082019050919050565b6000602082019050818103600083015261505381615017565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000615090601d83613b51565b915061509b8261505a565b602082019050919050565b600060208201905081810360008301526150bf81615083565b905091905056fea2646970667358221220f7408e3ec91b5774681225e547dfe764a4366d26908b49f5338842d18fdba3b864736f6c63430008130033

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

000000000000000000000000912ce59144191c1204e64559fe8253a0e49e65480000000000000000000000006eccab422d763ac031210895c81787e87b43a652000000000000000000000000c873fecbd354f5a56e00e710b90ef4201db2448d00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab1

-----Decoded View---------------
Arg [0] : _backToken (address): 0x912CE59144191C1204E64559FE8253a0e49E6548
Arg [1] : _factory (address): 0x6EcCab422D763aC031210895C81787E87B43A652
Arg [2] : _swapRouter (address): 0xc873fEcbd354f5A56E00E710B90EF4201db2448d
Arg [3] : _weth (address): 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000912ce59144191c1204e64559fe8253a0e49e6548
Arg [1] : 0000000000000000000000006eccab422d763ac031210895c81787e87b43a652
Arg [2] : 000000000000000000000000c873fecbd354f5a56e00e710b90ef4201db2448d
Arg [3] : 00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab1


Deployed Bytecode Sourcemap

56880:13980:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67863:182;;;;;;;;;;;;;:::i;:::-;;57739:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70531:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6672:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9023:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68053:576;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58439:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58565:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57990;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57927:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7792:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69230:436;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58322:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60464:269;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67687:137;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58769:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60207:92;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67544:135;;;;;;;;;;;;;:::i;:::-;;10508:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57562:43;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67099:172;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59961:238;;;;;;;;;;;;;:::i;:::-;;58603:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69674:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58147:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57356:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7963:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58028:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36028:103;;;;;;;;;;;;;:::i;:::-;;57612:59;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58104:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57393:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58839:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58188:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35380:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66047:68;;;;;;;;;;;;;:::i;:::-;;68637:585;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6891:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11249:436;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70341:182;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60307:149;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69913:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58525:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58400:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58483:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69801:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70637:183;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58869:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67279:257;;;;;;;;;;;;;:::i;:::-;;70154:179;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58901:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57710:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58227:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57440:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58361:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8552:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58066:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70036:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36286:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58264:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67863:182;35266:13;:11;:13::i;:::-;67931:1:::1;67917:10;;:15;67909:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;67977:12;67964:10;:25;;;;68022:15;68000:19;:37;;;;67863:182::o:0;57739:22::-;;;;:::o;70531:98::-;70579:7;70606:15;:6;:13;:15::i;:::-;70599:22;;70531:98;:::o;6672:100::-;6726:13;6759:5;6752:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6672:100;:::o;9023:201::-;9106:4;9123:13;9139:12;:10;:12::i;:::-;9123:28;;9162:32;9171:5;9178:7;9187:6;9162:8;:32::i;:::-;9212:4;9205:11;;;9023:201;;;;:::o;68053:576::-;35266:13;:11;:13::i;:::-;68320:8:::1;68307:10;:21;;;;68352:8;68339:10;:21;;;;68389:13;68371:15;:31;;;;68429:11;68413:13;:27;;;;68465:9;68451:11;:23;;;;68497:7;68485:9;:19;;;;68528:8;68515:10;:21;;;;68613:8;68603:7;68591:9;68577:11;68561:13;:27;;;;:::i;:::-;:39;;;;:::i;:::-;:49;;;;:::i;:::-;:60;;;;:::i;:::-;68547:11;:74;;;;68053:576:::0;;;;;;;:::o;58439:37::-;;;;:::o;58565:31::-;;;;:::o;57990:::-;;;;:::o;57927:37::-;;;;:::o;7792:108::-;7853:7;7880:12;;7873:19;;7792:108;:::o;69230:436::-;35266:13;:11;:13::i;:::-;69458:11:::1;69445:10;;:24;;;;;;;;;;;;;;;;;;69493:11;69480:10;;:24;;;;;;;;;;;;;;;;;;69529:12;69515:11;;:26;;;;;;;;;;;;;;;;;;69577:14;69552:13;;:40;;;;;;;;;;;;;;;;;;69615:10;69603:9;;:22;;;;;;;;;;;;;;;;;;69648:10;69636:9;;:22;;;;;;;;;;;;;;;;;;69230:436:::0;;;;;:::o;58322:32::-;;;;:::o;60464:269::-;60570:4;60587:15;60605:12;:10;:12::i;:::-;60587:30;;60628:40;60644:6;60652:7;60661:6;60628:15;:40::i;:::-;60686:39;60699:6;60707:9;60718:6;60686:12;:39::i;:::-;60679:46;;;60464:269;;;;;:::o;67687:137::-;67740:7;67801:15;59221:42;67801:9;:15::i;:::-;67783;59140:42;67783:9;:15::i;:::-;67767:13;:11;:13::i;:::-;:31;;;;:::i;:::-;:49;;;;:::i;:::-;67760:56;;67687:137;:::o;58769:29::-;;;;;;;;;;;;;:::o;60207:92::-;60265:5;60290:1;60283:8;;60207:92;:::o;67544:135::-;35266:13;:11;:13::i;:::-;67603:9:::1;;;;;;;;;;;:18;;;67622:12;:10;:12::i;:::-;67636:9;;;;;;;;;;;:19;;;67664:4;67636:34;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;67603:68;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;67544:135::o:0;10508:238::-;10596:4;10613:13;10629:12;:10;:12::i;:::-;10613:28;;10652:64;10661:5;10668:7;10705:10;10677:25;10687:5;10694:7;10677:9;:25::i;:::-;:38;;;;:::i;:::-;10652:8;:64::i;:::-;10734:4;10727:11;;;10508:238;;;;:::o;57562:43::-;;;;;;;;;;;;;;;;;;;;;;:::o;67099:172::-;35266:13;:11;:13::i;:::-;67172:91:::1;67206:10;67224:12;67217:30;;;67256:4;67217:45;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;67179:12;67172:33;;;;:91;;;;;:::i;:::-;67099:172:::0;:::o;59961:238::-;35266:13;:11;:13::i;:::-;60026:11:::1;;;;;;;;;;;60025:12;60017:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;60072:12;60087:7;:18;;;60114:4;60129;60087:48;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60072:63;;60146:16;60157:4;60146:6;:10;;:16;;;;:::i;:::-;;60187:4;60173:11;;:18;;;;;;;;;;;;;;;;;;60006:193;59961:238::o:0;58603:34::-;;;;:::o;69674:119::-;35266:13;:11;:13::i;:::-;69779:6:::1;69757:11;:19;69769:6;69757:19;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;69674:119:::0;;:::o;58147:34::-;;;;:::o;57356:30::-;;;;;;;;;;;;;:::o;7963:127::-;8037:7;8064:9;:18;8074:7;8064:18;;;;;;;;;;;;;;;;8057:25;;7963:127;;;:::o;58028:31::-;;;;:::o;36028:103::-;35266:13;:11;:13::i;:::-;36093:30:::1;36120:1;36093:18;:30::i;:::-;36028:103::o:0;57612:59::-;;;;;;;;;;;;;;;;;;;;;;:::o;58104:36::-;;;;:::o;57393:38::-;;;;;;;;;;;;;:::o;58839:23::-;;;;;;;;;;;;;:::o;58188:32::-;;;;:::o;35380:87::-;35426:7;35453:6;;;;;;;;;;;35446:13;;35380:87;:::o;66047:68::-;35266:13;:11;:13::i;:::-;66097:10:::1;:8;:10::i;:::-;66047:68::o:0;68637:585::-;35266:13;:11;:13::i;:::-;68906:8:::1;68892:11;:22;;;;68939:8;68925:11;:22;;;;68977:13;68958:16;:32;;;;69018:11;69001:14;:28;;;;69055:9;69040:12;:24;;;;69088:7;69075:10;:20;;;;69120:8;69106:11;:22;;;;69206:8;69196:7;69184:9;69170:11;69154:13;:27;;;;:::i;:::-;:39;;;;:::i;:::-;:49;;;;:::i;:::-;:60;;;;:::i;:::-;69139:12;:75;;;;68637:585:::0;;;;;;;:::o;6891:104::-;6947:13;6980:7;6973:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6891:104;:::o;11249:436::-;11342:4;11359:13;11375:12;:10;:12::i;:::-;11359:28;;11398:24;11425:25;11435:5;11442:7;11425:9;:25::i;:::-;11398:52;;11489:15;11469:16;:35;;11461:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;11582:60;11591:5;11598:7;11626:15;11607:16;:34;11582:8;:60::i;:::-;11673:4;11666:11;;;;11249:436;;;;:::o;70341:182::-;70398:4;35266:13;:11;:13::i;:::-;70439:1:::1;70423:18;;:4;:18;;::::0;70415:63:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;70496:19;70510:4;70496:6;:13;;:19;;;;:::i;:::-;70489:26;;70341:182:::0;;;:::o;60307:149::-;60386:4;60410:38;60423:12;:10;:12::i;:::-;60437:2;60441:6;60410:12;:38::i;:::-;60403:45;;60307:149;;;;:::o;69913:115::-;35266:13;:11;:13::i;:::-;70012:8:::1;69990:19;;:30;;;;;;;;;;;;;;;;;;69913:115:::0;:::o;58525:33::-;;;;:::o;58400:32::-;;;;:::o;58483:35::-;;;;:::o;69801:104::-;35266:13;:11;:13::i;:::-;69889:8:::1;69875:11;;:22;;;;;;;;;;;;;;;;;;69801:104:::0;:::o;70637:183::-;70690:7;70745:1;70727:15;:6;:13;:15::i;:::-;:19;;;;:::i;:::-;70718:5;:28;;70710:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;70796:16;70806:5;70796:6;:9;;:16;;;;:::i;:::-;70789:23;;70637:183;;;:::o;58869:25::-;;;;:::o;67279:257::-;35266:13;:11;:13::i;:::-;67341:17:::1;67361:21;67341:41;;67394:12;67420;:10;:12::i;:::-;67412:26;;67446:9;67467:1;67457:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67412:58;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67393:77;;;67489:7;67481:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;67330:206;;67279:257::o:0;70154:179::-;70211:4;35266:13;:11;:13::i;:::-;70252:1:::1;70236:18;;:4;:18;;::::0;70228:63:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;70309:16;70320:4;70309:6;:10;;:16;;;;:::i;:::-;70302:23;;70154:179:::0;;;:::o;58901:34::-;;;;:::o;57710:22::-;;;;:::o;58227:30::-;;;;:::o;57440:18::-;;;;;;;;;;;;;:::o;58361:32::-;;;;:::o;8552:151::-;8641:7;8668:11;:18;8680:5;8668:18;;;;;;;;;;;;;;;:27;8687:7;8668:27;;;;;;;;;;;;;;;;8661:34;;8552:151;;;;:::o;58066:31::-;;;;:::o;70036:110::-;70090:4;70114:24;70130:7;70114:6;:15;;:24;;;;:::i;:::-;70107:31;;70036:110;;;:::o;36286:201::-;35266:13;:11;:13::i;:::-;36395:1:::1;36375:22;;:8;:22;;::::0;36367:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;36451:28;36470:8;36451:18;:28::i;:::-;36286:201:::0;:::o;58264:33::-;;;;:::o;35545:132::-;35620:12;:10;:12::i;:::-;35609:23;;:7;:5;:7::i;:::-;:23;;;35601:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35545:132::o;46244:117::-;46307:7;46334:19;46342:3;:10;;46334:7;:19::i;:::-;46327:26;;46244:117;;;:::o;4318:98::-;4371:7;4398:10;4391:17;;4318:98;:::o;15276:380::-;15429:1;15412:19;;:5;:19;;;15404:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15510:1;15491:21;;:7;:21;;;15483:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15594:6;15564:11;:18;15576:5;15564:18;;;;;;;;;;;;;;;:27;15583:7;15564:27;;;;;;;;;;;;;;;:36;;;;15632:7;15616:32;;15625:5;15616:32;;;15641:6;15616:32;;;;;;:::i;:::-;;;;;;;;15276:380;;;:::o;15947:453::-;16082:24;16109:25;16119:5;16126:7;16109:9;:25::i;:::-;16082:52;;16169:17;16149:16;:37;16145:248;;16231:6;16211:16;:26;;16203:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;16315:51;16324:5;16331:7;16359:6;16340:16;:25;16315:8;:51::i;:::-;16145:248;16071:329;15947:453;;;:::o;60741:1278::-;60832:4;60853:6;;;;;;;;;;;60849:101;;;60876:36;60886:6;60894:9;60905:6;60876:9;:36::i;:::-;60934:4;60927:11;;;;60849:101;60965:27;:35;60993:6;60965:35;;;;;;;;;;;;;;;;;;;;;;;;;60960:112;;61025:10;:8;:10::i;:::-;61017:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;60960:112;61084:18;61107:11;:19;61119:6;61107:19;;;;;;;;;;;;;;;;;;;;;;;;;61106:20;:47;;;;;61131:11;:22;61143:9;61131:22;;;;;;;;;;;;;;;;;;;;;;;;;61130:23;61106:47;61105:63;;;;;61158:10;:8;:10::i;:::-;61105:63;61084:84;;61179:9;61203:13;61219:6;61203:22;;61236:13;61252:9;61236:25;;61297:14;61304:6;61297;:14::i;:::-;61293:353;;;61328:9;:7;:9::i;:::-;61359:1;61352:8;;61383:9;61375:17;;61415:6;61407:14;;61440:13;;;;;;;;;;;:24;;;61465:6;61473;61440:40;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61436:56;61293:353;;;61513:17;61520:9;61513:6;:17::i;:::-;61509:137;;;61547:10;:8;:10::i;:::-;61579:1;61572:8;;61509:137;;;61629:5;61613:21;;61509:137;61293:353;61662:16;:14;:16::i;:::-;61658:59;;;61695:10;:8;:10::i;:::-;61658:59;61729:22;61754:13;:48;;61796:6;61754:48;;;61770:23;61778:6;61786;61770:7;:23::i;:::-;61754:48;61729:73;;61813:44;61823:6;61831:9;61842:14;61813:9;:44::i;:::-;61881:1;61874:4;:8;61870:120;;;61904:74;61910:5;61917;61924:6;61932:4;61938:22;:20;:22::i;:::-;61962:15;61904:74;;;;;;;;;;;:::i;:::-;;;;;;;;61870:120;62007:4;62000:11;;;;;;;60741:1278;;;;;;:::o;30359:211::-;30476:86;30496:5;30526:23;;;30551:2;30555:5;30503:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30476:19;:86::i;:::-;30359:211;;;:::o;45419:152::-;45489:4;45513:50;45518:3;:10;;45554:5;45538:23;;45530:32;;45513:4;:50::i;:::-;45506:57;;45419:152;;;;:::o;36647:191::-;36721:16;36740:6;;;;;;;;;;;36721:25;;36766:8;36757:6;;:17;;;;;;;;;;;;;;;;;;36821:8;36790:40;;36811:8;36790:40;;;;;;;;;;;;36710:128;36647:191;:::o;62209:2514::-;57505:4;57496:6;;:13;;;;;;;;;;;;;;;;;;62258:17:::1;62278:24;62296:4;62278:9;:24::i;:::-;62258:44;;62313:55;62330:4;62345:10;62358:9;62313:8;:55::i;:::-;62381:21;62430:8;;62418:7;;62406:9;:19;;;;:::i;:::-;62405:34;;;;:::i;:::-;62381:58;;62450:19;62502:8;;62485:12;;62473:9;:24;;;;:::i;:::-;62472:39;;;;:::i;:::-;62450:61;;62522:22;62573:8;;62560;;62548:9;:20;;;;:::i;:::-;62547:35;;;;:::i;:::-;62522:60;;62606:13;62593:26;;;;;:::i;:::-;;;62643:11;62630:24;;;;;:::i;:::-;;;62678:14;62665:27;;;;;:::i;:::-;;;62715:21;62753:1;62739:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62715:40;;62784:4;62766;62771:1;62766:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;::::0;::::1;62818:4;62800;62805:1;62800:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;::::0;::::1;62852:9;;;;;;;;;;;62834:4;62839:1;62834:7;;;;;;;;:::i;:::-;;;;;;;:28;;;;;;;;;::::0;::::1;62875:12;62906:21:::0;62930:9:::1;;;;;;;;;;;:19;;;62958:4;62930:34;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62906:58;;62979:10;:64;;;63044:9;63054:1;63056:4;63069;63083:1;63086:15;62979:123;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;62975:390;;63169:10;:64;;;63234:9;63244:1;63246:4;63259;63265:15;63169:112;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;63165:189:::0;::::1;;63311:4;63301:14;;63165:189;62975:390;;;63127:4;63117:14;;62975:390;63380:7;63375:47;;63404:7;;;;;;;;;63375:47;63434:45;63452:4;59140:42;63465:13;63434:9;:45::i;:::-;63490:61;63507:4;63522:11;;;;;;;;;;;63536:14;63490:8;:61::i;:::-;63577:11;;;;;;;;;;;63562:41;;;63604:14;63562:57;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;63640:23;63703:13;63666:9;;;;;;;;;;;:19;;;63694:4;63666:34;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:50;;;;:::i;:::-;63640:76;;63727:25;63791:8;;63776:12;;63766:7;;63755:8;;:18;;;;:::i;:::-;:33;;;;:::i;:::-;:44;;;;:::i;:::-;63727:72;;63810:27;63871:17;63859:7;;63841:15;:25;;;;:::i;:::-;63840:49;;;;:::i;:::-;63810:79;;63900:27;63961:17;63949:7;;63931:15;:25;;;;:::i;:::-;63930:49;;;;:::i;:::-;63900:79;;63990:30;64056:17;64042:10;;64024:15;:28;;;;:::i;:::-;64023:50;;;;:::i;:::-;63990:83;;64084:26;64175:22;64153:19;64131;64113:15;:37;;;;:::i;:::-;:59;;;;:::i;:::-;:84;;;;:::i;:::-;64084:113;;64210:9;;;;;;;;;;;:18;;;64229:10;;;;;;;;;;;64241:19;64210:51;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;64272:9;;;;;;;;;;;:18;;;64291:10;;;;;;;;;;;64303:19;64272:51;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;64334:9;;;;;;;;;;;:18;;;64361:13;;;;;;;;;;;64377:22;64334:66;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;64411:9;;;;;;;;;;;:18;;;64430:9;;;;;;;;;;;64441:18;64411:49;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;64477:19;;;;;;;;;;;64473:62;;;64513:10;:8;:10::i;:::-;64473:62;64560:155;64569:13;64584:19;64605;64626:11;64639:22;64663:14;64679:18;64699:15;64560:155;;;;;;;;;;;;;:::i;:::-;;;;;;;;62247:2476;;;;;;;;;;;;;57520:1;57541:5:::0;57532:6;;:14;;;;;;;;;;;;;;;;;;62209:2514::o;45747:158::-;45820:4;45844:53;45852:3;:10;;45888:5;45872:23;;45864:32;;45844:7;:53::i;:::-;45837:60;;45747:158;;;;:::o;46715:::-;46789:7;46840:22;46844:3;:10;;46856:5;46840:3;:22::i;:::-;46832:31;;46809:56;;46715:158;;;;:::o;45991:167::-;46071:4;46095:55;46105:3;:10;;46141:5;46125:23;;46117:32;;46095:9;:55::i;:::-;46088:62;;45991:167;;;;:::o;41461:109::-;41517:7;41544:3;:11;;:18;;;;41537:25;;41461:109;;;:::o;12155:840::-;12302:1;12286:18;;:4;:18;;;12278:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;12379:1;12365:16;;:2;:16;;;12357:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;12434:38;12455:4;12461:2;12465:6;12434:20;:38::i;:::-;12485:19;12507:9;:15;12517:4;12507:15;;;;;;;;;;;;;;;;12485:37;;12556:6;12541:11;:21;;12533:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;12673:6;12659:11;:20;12641:9;:15;12651:4;12641:15;;;;;;;;;;;;;;;:38;;;;12876:6;12859:9;:13;12869:2;12859:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;12926:2;12911:26;;12920:4;12911:26;;;12930:6;12911:26;;;;;;:::i;:::-;;;;;;;;12950:37;12970:4;12976:2;12980:6;12950:19;:37::i;:::-;12267:728;12155:840;;;:::o;66123:90::-;66166:4;66204:1;66190:10;;:15;;66183:22;;66123:90;:::o;66221:302::-;66270:10;;66260:7;:20;;;;66301:10;;66291:7;:20;;;;66332:10;;66322:7;:20;;;;66368:15;;66353:12;:30;;;;66407:13;;66394:10;:26;;;;66442:11;;66431:8;:22;;;;66473:9;;66464:6;:18;;;;66504:11;;66493:8;:22;;;;66221:302::o;66531:311::-;66581:11;;66571:7;:21;;;;66613:11;;66603:7;:21;;;;66645:11;;66635:7;:21;;;;66682:16;;66667:12;:31;;;;66722:14;;66709:10;:27;;;;66758:12;;66747:8;:23;;;;66790:10;;66781:6;:19;;;;66822:12;;66811:8;:23;;;;66531:311::o;62027:174::-;62076:4;62101:6;;;;;;;;;;;62100:7;:22;;;;;62111:11;;;;;;;;;;;62100:22;:36;;;;;62126:10;:8;:10::i;:::-;62100:36;:68;;;;;62167:1;62140:24;62158:4;62140:9;:24::i;:::-;:28;62100:68;:93;;;;;62173:20;62180:12;:10;:12::i;:::-;62173:6;:20::i;:::-;62172:21;62100:93;62093:100;;62027:174;:::o;66850:241::-;66917:7;66937:17;66979:14;;66967:8;;66958:6;:17;;;;:::i;:::-;66957:36;;;;:::i;:::-;66937:56;;67004:43;67014:6;67030:4;67037:9;67004;:43::i;:::-;67074:9;67065:6;:18;;;;:::i;:::-;67058:25;;;66850:241;;;;:::o;33426:716::-;33850:23;33876:69;33904:4;33876:69;;;;;;;;;;;;;;;;;33884:5;33876:27;;;;:69;;;;;:::i;:::-;33850:95;;33980:1;33960:10;:17;:21;33956:179;;;34057:10;34046:30;;;;;;;;;;;;:::i;:::-;34038:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;33956:179;33496:646;33426:716;;:::o;39150:414::-;39213:4;39235:21;39245:3;39250:5;39235:9;:21::i;:::-;39230:327;;39273:3;:11;;39290:5;39273:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39456:3;:11;;:18;;;;39434:3;:12;;:19;39447:5;39434:19;;;;;;;;;;;:40;;;;39496:4;39489:11;;;;39230:327;39540:5;39533:12;;39150:414;;;;;:::o;64731:936::-;64771:24;64812:1;64798:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64771:43;;64846:4;64825:7;64833:1;64825:10;;;;;;;;:::i;:::-;;;;;;;:26;;;;;;;;;;;64883:4;64862:7;64870:1;64862:10;;;;;;;;:::i;:::-;;;;;;;:26;;;;;;;;;;;64901:19;64923:24;64941:4;64923:9;:24::i;:::-;64901:46;;64958:12;64987:1;64973:11;:15;;;;:::i;:::-;64958:30;;65009:4;65002;:11;64999:23;;;65015:7;;;;;64999:23;65034;65060:21;65034:47;;65092:12;65127:10;:61;;;65189:4;65194:1;65197:7;65213:4;65227:1;65230:15;65127:119;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65123:367;;65313:10;:61;;;65375:4;65380:1;65383:7;65399:4;65405:15;65313:108;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65309:170;;;65450:4;65440:14;;65309:170;65123:367;;;65271:4;65261:14;;65123:367;65505:7;65500:47;;65529:7;;;;;;;65500:47;65559:17;65603:15;65579:21;:39;;;;:::i;:::-;65559:59;;65629:30;65643:4;65649:9;65629:13;:30::i;:::-;64760:907;;;;;;64731:936;:::o;39740:1420::-;39806:4;39924:18;39945:3;:12;;:19;39958:5;39945:19;;;;;;;;;;;;39924:40;;39995:1;39981:10;:15;39977:1176;;40356:21;40393:1;40380:10;:14;;;;:::i;:::-;40356:38;;40409:17;40450:1;40429:3;:11;;:18;;;;:22;;;;:::i;:::-;40409:42;;40485:13;40472:9;:26;40468:405;;40519:17;40539:3;:11;;40551:9;40539:22;;;;;;;;:::i;:::-;;;;;;;;;;40519:42;;40693:9;40664:3;:11;;40676:13;40664:26;;;;;;;;:::i;:::-;;;;;;;;;:38;;;;40804:10;40778:3;:12;;:23;40791:9;40778:23;;;;;;;;;;;:36;;;;40500:373;40468:405;40954:3;:11;;:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;41049:3;:12;;:19;41062:5;41049:19;;;;;;;;;;;41042:26;;;41092:4;41085:11;;;;;;;39977:1176;41136:5;41129:12;;;39740:1420;;;;;:::o;41924:120::-;41991:7;42018:3;:11;;42030:5;42018:18;;;;;;;;:::i;:::-;;;;;;;;;;42011:25;;41924:120;;;;:::o;41246:129::-;41319:4;41366:1;41343:3;:12;;:19;41356:5;41343:19;;;;;;;;;;;;:24;;41336:31;;41246:129;;;;:::o;17000:125::-;;;;:::o;17729:124::-;;;;:::o;24211:229::-;24348:12;24380:52;24402:6;24410:4;24416:1;24419:12;24380:21;:52::i;:::-;24373:59;;24211:229;;;;;:::o;65675:364::-;65758:57;65775:4;65790:10;65803:11;65758:8;:57::i;:::-;65830:10;:26;;;65864:9;65883:4;65890:11;65903:1;65906;65917;65921:15;65830:107;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;65826:206;;;;;;65958:53;65971:11;65984:9;65995:15;65958:53;;;;;;;;:::i;:::-;;;;;;;;65826:206;65675:364;;:::o;25331:455::-;25501:12;25559:5;25534:21;:30;;25526:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;25619:12;25633:23;25660:6;:11;;25679:5;25686:4;25660:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25618:73;;;;25709:69;25736:6;25744:7;25753:10;25765:12;25709:26;:69::i;:::-;25702:76;;;;25331:455;;;;;;:::o;27904:644::-;28089:12;28118:7;28114:427;;;28167:1;28146:10;:17;:22;28142:290;;28364:18;28375:6;28364:10;:18::i;:::-;28356:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;28142:290;28453:10;28446:17;;;;28114:427;28496:33;28504:10;28516:12;28496:7;:33::i;:::-;27904:644;;;;;;;:::o;21454:326::-;21514:4;21771:1;21749:7;:19;;;:23;21742:30;;21454:326;;;:::o;29090:552::-;29271:1;29251:10;:17;:21;29247:388;;;29483:10;29477:17;29540:15;29527:10;29523:2;29519:19;29512:44;29247:388;29610:12;29603:20;;;;;;;;;;;:::i;:::-;;;;;;;;7:77:1;44:7;73:5;62:16;;7:77;;;:::o;90:118::-;177:24;195:5;177:24;:::i;:::-;172:3;165:37;90:118;;:::o;214:222::-;307:4;345:2;334:9;330:18;322:26;;358:71;426:1;415:9;411:17;402:6;358:71;:::i;:::-;214:222;;;;:::o;442:99::-;494:6;528:5;522:12;512:22;;442:99;;;:::o;547:169::-;631:11;665:6;660:3;653:19;705:4;700:3;696:14;681:29;;547:169;;;;:::o;722:246::-;803:1;813:113;827:6;824:1;821:13;813:113;;;912:1;907:3;903:11;897:18;893:1;888:3;884:11;877:39;849:2;846:1;842:10;837:15;;813:113;;;960:1;951:6;946:3;942:16;935:27;784:184;722:246;;;:::o;974:102::-;1015:6;1066:2;1062:7;1057:2;1050:5;1046:14;1042:28;1032:38;;974:102;;;:::o;1082:377::-;1170:3;1198:39;1231:5;1198:39;:::i;:::-;1253:71;1317:6;1312:3;1253:71;:::i;:::-;1246:78;;1333:65;1391:6;1386:3;1379:4;1372:5;1368:16;1333:65;:::i;:::-;1423:29;1445:6;1423:29;:::i;:::-;1418:3;1414:39;1407:46;;1174:285;1082:377;;;;:::o;1465:313::-;1578:4;1616:2;1605:9;1601:18;1593:26;;1665:9;1659:4;1655:20;1651:1;1640:9;1636:17;1629:47;1693:78;1766:4;1757:6;1693:78;:::i;:::-;1685:86;;1465:313;;;;:::o;1865:117::-;1974:1;1971;1964:12;2111:126;2148:7;2188:42;2181:5;2177:54;2166:65;;2111:126;;;:::o;2243:96::-;2280:7;2309:24;2327:5;2309:24;:::i;:::-;2298:35;;2243:96;;;:::o;2345:122::-;2418:24;2436:5;2418:24;:::i;:::-;2411:5;2408:35;2398:63;;2457:1;2454;2447:12;2398:63;2345:122;:::o;2473:139::-;2519:5;2557:6;2544:20;2535:29;;2573:33;2600:5;2573:33;:::i;:::-;2473:139;;;;:::o;2618:122::-;2691:24;2709:5;2691:24;:::i;:::-;2684:5;2681:35;2671:63;;2730:1;2727;2720:12;2671:63;2618:122;:::o;2746:139::-;2792:5;2830:6;2817:20;2808:29;;2846:33;2873:5;2846:33;:::i;:::-;2746:139;;;;:::o;2891:474::-;2959:6;2967;3016:2;3004:9;2995:7;2991:23;2987:32;2984:119;;;3022:79;;:::i;:::-;2984:119;3142:1;3167:53;3212:7;3203:6;3192:9;3188:22;3167:53;:::i;:::-;3157:63;;3113:117;3269:2;3295:53;3340:7;3331:6;3320:9;3316:22;3295:53;:::i;:::-;3285:63;;3240:118;2891:474;;;;;:::o;3371:90::-;3405:7;3448:5;3441:13;3434:21;3423:32;;3371:90;;;:::o;3467:109::-;3548:21;3563:5;3548:21;:::i;:::-;3543:3;3536:34;3467:109;;:::o;3582:210::-;3669:4;3707:2;3696:9;3692:18;3684:26;;3720:65;3782:1;3771:9;3767:17;3758:6;3720:65;:::i;:::-;3582:210;;;;:::o;3798:1203::-;3911:6;3919;3927;3935;3943;3951;3959;4008:3;3996:9;3987:7;3983:23;3979:33;3976:120;;;4015:79;;:::i;:::-;3976:120;4135:1;4160:53;4205:7;4196:6;4185:9;4181:22;4160:53;:::i;:::-;4150:63;;4106:117;4262:2;4288:53;4333:7;4324:6;4313:9;4309:22;4288:53;:::i;:::-;4278:63;;4233:118;4390:2;4416:53;4461:7;4452:6;4441:9;4437:22;4416:53;:::i;:::-;4406:63;;4361:118;4518:2;4544:53;4589:7;4580:6;4569:9;4565:22;4544:53;:::i;:::-;4534:63;;4489:118;4646:3;4673:53;4718:7;4709:6;4698:9;4694:22;4673:53;:::i;:::-;4663:63;;4617:119;4775:3;4802:53;4847:7;4838:6;4827:9;4823:22;4802:53;:::i;:::-;4792:63;;4746:119;4904:3;4931:53;4976:7;4967:6;4956:9;4952:22;4931:53;:::i;:::-;4921:63;;4875:119;3798:1203;;;;;;;;;;:::o;5007:911::-;5102:6;5110;5118;5126;5134;5183:3;5171:9;5162:7;5158:23;5154:33;5151:120;;;5190:79;;:::i;:::-;5151:120;5310:1;5335:53;5380:7;5371:6;5360:9;5356:22;5335:53;:::i;:::-;5325:63;;5281:117;5437:2;5463:53;5508:7;5499:6;5488:9;5484:22;5463:53;:::i;:::-;5453:63;;5408:118;5565:2;5591:53;5636:7;5627:6;5616:9;5612:22;5591:53;:::i;:::-;5581:63;;5536:118;5693:2;5719:53;5764:7;5755:6;5744:9;5740:22;5719:53;:::i;:::-;5709:63;;5664:118;5821:3;5848:53;5893:7;5884:6;5873:9;5869:22;5848:53;:::i;:::-;5838:63;;5792:119;5007:911;;;;;;;;:::o;5924:619::-;6001:6;6009;6017;6066:2;6054:9;6045:7;6041:23;6037:32;6034:119;;;6072:79;;:::i;:::-;6034:119;6192:1;6217:53;6262:7;6253:6;6242:9;6238:22;6217:53;:::i;:::-;6207:63;;6163:117;6319:2;6345:53;6390:7;6381:6;6370:9;6366:22;6345:53;:::i;:::-;6335:63;;6290:118;6447:2;6473:53;6518:7;6509:6;6498:9;6494:22;6473:53;:::i;:::-;6463:63;;6418:118;5924:619;;;;;:::o;6549:60::-;6577:3;6598:5;6591:12;;6549:60;;;:::o;6615:142::-;6665:9;6698:53;6716:34;6725:24;6743:5;6725:24;:::i;:::-;6716:34;:::i;:::-;6698:53;:::i;:::-;6685:66;;6615:142;;;:::o;6763:126::-;6813:9;6846:37;6877:5;6846:37;:::i;:::-;6833:50;;6763:126;;;:::o;6895:143::-;6962:9;6995:37;7026:5;6995:37;:::i;:::-;6982:50;;6895:143;;;:::o;7044:165::-;7148:54;7196:5;7148:54;:::i;:::-;7143:3;7136:67;7044:165;;:::o;7215:256::-;7325:4;7363:2;7352:9;7348:18;7340:26;;7376:88;7461:1;7450:9;7446:17;7437:6;7376:88;:::i;:::-;7215:256;;;;:::o;7477:86::-;7512:7;7552:4;7545:5;7541:16;7530:27;;7477:86;;;:::o;7569:112::-;7652:22;7668:5;7652:22;:::i;:::-;7647:3;7640:35;7569:112;;:::o;7687:214::-;7776:4;7814:2;7803:9;7799:18;7791:26;;7827:67;7891:1;7880:9;7876:17;7867:6;7827:67;:::i;:::-;7687:214;;;;:::o;7907:329::-;7966:6;8015:2;8003:9;7994:7;7990:23;7986:32;7983:119;;;8021:79;;:::i;:::-;7983:119;8141:1;8166:53;8211:7;8202:6;8191:9;8187:22;8166:53;:::i;:::-;8156:63;;8112:117;7907:329;;;;:::o;8242:116::-;8312:21;8327:5;8312:21;:::i;:::-;8305:5;8302:32;8292:60;;8348:1;8345;8338:12;8292:60;8242:116;:::o;8364:133::-;8407:5;8445:6;8432:20;8423:29;;8461:30;8485:5;8461:30;:::i;:::-;8364:133;;;;:::o;8503:468::-;8568:6;8576;8625:2;8613:9;8604:7;8600:23;8596:32;8593:119;;;8631:79;;:::i;:::-;8593:119;8751:1;8776:53;8821:7;8812:6;8801:9;8797:22;8776:53;:::i;:::-;8766:63;;8722:117;8878:2;8904:50;8946:7;8937:6;8926:9;8922:22;8904:50;:::i;:::-;8894:60;;8849:115;8503:468;;;;;:::o;8977:139::-;9040:9;9073:37;9104:5;9073:37;:::i;:::-;9060:50;;8977:139;;;:::o;9122:157::-;9222:50;9266:5;9222:50;:::i;:::-;9217:3;9210:63;9122:157;;:::o;9285:248::-;9391:4;9429:2;9418:9;9414:18;9406:26;;9442:84;9523:1;9512:9;9508:17;9499:6;9442:84;:::i;:::-;9285:248;;;;:::o;9539:118::-;9626:24;9644:5;9626:24;:::i;:::-;9621:3;9614:37;9539:118;;:::o;9663:222::-;9756:4;9794:2;9783:9;9779:18;9771:26;;9807:71;9875:1;9864:9;9860:17;9851:6;9807:71;:::i;:::-;9663:222;;;;:::o;9891:323::-;9947:6;9996:2;9984:9;9975:7;9971:23;9967:32;9964:119;;;10002:79;;:::i;:::-;9964:119;10122:1;10147:50;10189:7;10180:6;10169:9;10165:22;10147:50;:::i;:::-;10137:60;;10093:114;9891:323;;;;:::o;10220:329::-;10279:6;10328:2;10316:9;10307:7;10303:23;10299:32;10296:119;;;10334:79;;:::i;:::-;10296:119;10454:1;10479:53;10524:7;10515:6;10504:9;10500:22;10479:53;:::i;:::-;10469:63;;10425:117;10220:329;;;;:::o;10555:474::-;10623:6;10631;10680:2;10668:9;10659:7;10655:23;10651:32;10648:119;;;10686:79;;:::i;:::-;10648:119;10806:1;10831:53;10876:7;10867:6;10856:9;10852:22;10831:53;:::i;:::-;10821:63;;10777:117;10933:2;10959:53;11004:7;10995:6;10984:9;10980:22;10959:53;:::i;:::-;10949:63;;10904:118;10555:474;;;;;:::o;11035:166::-;11175:18;11171:1;11163:6;11159:14;11152:42;11035:166;:::o;11207:366::-;11349:3;11370:67;11434:2;11429:3;11370:67;:::i;:::-;11363:74;;11446:93;11535:3;11446:93;:::i;:::-;11564:2;11559:3;11555:12;11548:19;;11207:366;;;:::o;11579:419::-;11745:4;11783:2;11772:9;11768:18;11760:26;;11832:9;11826:4;11822:20;11818:1;11807:9;11803:17;11796:47;11860:131;11986:4;11860:131;:::i;:::-;11852:139;;11579:419;;;:::o;12004:180::-;12052:77;12049:1;12042:88;12149:4;12146:1;12139:15;12173:4;12170:1;12163:15;12190:320;12234:6;12271:1;12265:4;12261:12;12251:22;;12318:1;12312:4;12308:12;12339:18;12329:81;;12395:4;12387:6;12383:17;12373:27;;12329:81;12457:2;12449:6;12446:14;12426:18;12423:38;12420:84;;12476:18;;:::i;:::-;12420:84;12241:269;12190:320;;;:::o;12516:180::-;12564:77;12561:1;12554:88;12661:4;12658:1;12651:15;12685:4;12682:1;12675:15;12702:191;12742:3;12761:20;12779:1;12761:20;:::i;:::-;12756:25;;12795:20;12813:1;12795:20;:::i;:::-;12790:25;;12838:1;12835;12831:9;12824:16;;12859:3;12856:1;12853:10;12850:36;;;12866:18;;:::i;:::-;12850:36;12702:191;;;;:::o;12899:194::-;12939:4;12959:20;12977:1;12959:20;:::i;:::-;12954:25;;12993:20;13011:1;12993:20;:::i;:::-;12988:25;;13037:1;13034;13030:9;13022:17;;13061:1;13055:4;13052:11;13049:37;;;13066:18;;:::i;:::-;13049:37;12899:194;;;;:::o;13099:143::-;13156:5;13187:6;13181:13;13172:22;;13203:33;13230:5;13203:33;:::i;:::-;13099:143;;;;:::o;13248:351::-;13318:6;13367:2;13355:9;13346:7;13342:23;13338:32;13335:119;;;13373:79;;:::i;:::-;13335:119;13493:1;13518:64;13574:7;13565:6;13554:9;13550:22;13518:64;:::i;:::-;13508:74;;13464:128;13248:351;;;;:::o;13605:332::-;13726:4;13764:2;13753:9;13749:18;13741:26;;13777:71;13845:1;13834:9;13830:17;13821:6;13777:71;:::i;:::-;13858:72;13926:2;13915:9;13911:18;13902:6;13858:72;:::i;:::-;13605:332;;;;;:::o;13943:137::-;13997:5;14028:6;14022:13;14013:22;;14044:30;14068:5;14044:30;:::i;:::-;13943:137;;;;:::o;14086:345::-;14153:6;14202:2;14190:9;14181:7;14177:23;14173:32;14170:119;;;14208:79;;:::i;:::-;14170:119;14328:1;14353:61;14406:7;14397:6;14386:9;14382:22;14353:61;:::i;:::-;14343:71;;14299:125;14086:345;;;;:::o;14437:169::-;14577:21;14573:1;14565:6;14561:14;14554:45;14437:169;:::o;14612:366::-;14754:3;14775:67;14839:2;14834:3;14775:67;:::i;:::-;14768:74;;14851:93;14940:3;14851:93;:::i;:::-;14969:2;14964:3;14960:12;14953:19;;14612:366;;;:::o;14984:419::-;15150:4;15188:2;15177:9;15173:18;15165:26;;15237:9;15231:4;15227:20;15223:1;15212:9;15208:17;15201:47;15265:131;15391:4;15265:131;:::i;:::-;15257:139;;14984:419;;;:::o;15409:332::-;15530:4;15568:2;15557:9;15553:18;15545:26;;15581:71;15649:1;15638:9;15634:17;15625:6;15581:71;:::i;:::-;15662:72;15730:2;15719:9;15715:18;15706:6;15662:72;:::i;:::-;15409:332;;;;;:::o;15747:143::-;15804:5;15835:6;15829:13;15820:22;;15851:33;15878:5;15851:33;:::i;:::-;15747:143;;;;:::o;15896:351::-;15966:6;16015:2;16003:9;15994:7;15990:23;15986:32;15983:119;;;16021:79;;:::i;:::-;15983:119;16141:1;16166:64;16222:7;16213:6;16202:9;16198:22;16166:64;:::i;:::-;16156:74;;16112:128;15896:351;;;;:::o;16253:224::-;16393:34;16389:1;16381:6;16377:14;16370:58;16462:7;16457:2;16449:6;16445:15;16438:32;16253:224;:::o;16483:366::-;16625:3;16646:67;16710:2;16705:3;16646:67;:::i;:::-;16639:74;;16722:93;16811:3;16722:93;:::i;:::-;16840:2;16835:3;16831:12;16824:19;;16483:366;;;:::o;16855:419::-;17021:4;17059:2;17048:9;17044:18;17036:26;;17108:9;17102:4;17098:20;17094:1;17083:9;17079:17;17072:47;17136:131;17262:4;17136:131;:::i;:::-;17128:139;;16855:419;;;:::o;17280:182::-;17420:34;17416:1;17408:6;17404:14;17397:58;17280:182;:::o;17468:366::-;17610:3;17631:67;17695:2;17690:3;17631:67;:::i;:::-;17624:74;;17707:93;17796:3;17707:93;:::i;:::-;17825:2;17820:3;17816:12;17809:19;;17468:366;;;:::o;17840:419::-;18006:4;18044:2;18033:9;18029:18;18021:26;;18093:9;18087:4;18083:20;18079:1;18068:9;18064:17;18057:47;18121:131;18247:4;18121:131;:::i;:::-;18113:139;;17840:419;;;:::o;18265:177::-;18405:29;18401:1;18393:6;18389:14;18382:53;18265:177;:::o;18448:366::-;18590:3;18611:67;18675:2;18670:3;18611:67;:::i;:::-;18604:74;;18687:93;18776:3;18687:93;:::i;:::-;18805:2;18800:3;18796:12;18789:19;;18448:366;;;:::o;18820:419::-;18986:4;19024:2;19013:9;19009:18;19001:26;;19073:9;19067:4;19063:20;19059:1;19048:9;19044:17;19037:47;19101:131;19227:4;19101:131;:::i;:::-;19093:139;;18820:419;;;:::o;19245:180::-;19293:77;19290:1;19283:88;19390:4;19387:1;19380:15;19414:4;19411:1;19404:15;19431:98;19482:6;19516:5;19510:12;19500:22;;19431:98;;;:::o;19535:147::-;19636:11;19673:3;19658:18;;19535:147;;;;:::o;19688:386::-;19792:3;19820:38;19852:5;19820:38;:::i;:::-;19874:88;19955:6;19950:3;19874:88;:::i;:::-;19867:95;;19971:65;20029:6;20024:3;20017:4;20010:5;20006:16;19971:65;:::i;:::-;20061:6;20056:3;20052:16;20045:23;;19796:278;19688:386;;;;:::o;20080:271::-;20210:3;20232:93;20321:3;20312:6;20232:93;:::i;:::-;20225:100;;20342:3;20335:10;;20080:271;;;;:::o;20357:177::-;20497:29;20493:1;20485:6;20481:14;20474:53;20357:177;:::o;20540:366::-;20682:3;20703:67;20767:2;20762:3;20703:67;:::i;:::-;20696:74;;20779:93;20868:3;20779:93;:::i;:::-;20897:2;20892:3;20888:12;20881:19;;20540:366;;;:::o;20912:419::-;21078:4;21116:2;21105:9;21101:18;21093:26;;21165:9;21159:4;21155:20;21151:1;21140:9;21136:17;21129:47;21193:131;21319:4;21193:131;:::i;:::-;21185:139;;20912:419;;;:::o;21337:225::-;21477:34;21473:1;21465:6;21461:14;21454:58;21546:8;21541:2;21533:6;21529:15;21522:33;21337:225;:::o;21568:366::-;21710:3;21731:67;21795:2;21790:3;21731:67;:::i;:::-;21724:74;;21807:93;21896:3;21807:93;:::i;:::-;21925:2;21920:3;21916:12;21909:19;;21568:366;;;:::o;21940:419::-;22106:4;22144:2;22133:9;22129:18;22121:26;;22193:9;22187:4;22183:20;22179:1;22168:9;22164:17;22157:47;22221:131;22347:4;22221:131;:::i;:::-;22213:139;;21940:419;;;:::o;22365:182::-;22505:34;22501:1;22493:6;22489:14;22482:58;22365:182;:::o;22553:366::-;22695:3;22716:67;22780:2;22775:3;22716:67;:::i;:::-;22709:74;;22792:93;22881:3;22792:93;:::i;:::-;22910:2;22905:3;22901:12;22894:19;;22553:366;;;:::o;22925:419::-;23091:4;23129:2;23118:9;23114:18;23106:26;;23178:9;23172:4;23168:20;23164:1;23153:9;23149:17;23142:47;23206:131;23332:4;23206:131;:::i;:::-;23198:139;;22925:419;;;:::o;23350:223::-;23490:34;23486:1;23478:6;23474:14;23467:58;23559:6;23554:2;23546:6;23542:15;23535:31;23350:223;:::o;23579:366::-;23721:3;23742:67;23806:2;23801:3;23742:67;:::i;:::-;23735:74;;23818:93;23907:3;23818:93;:::i;:::-;23936:2;23931:3;23927:12;23920:19;;23579:366;;;:::o;23951:419::-;24117:4;24155:2;24144:9;24140:18;24132:26;;24204:9;24198:4;24194:20;24190:1;24179:9;24175:17;24168:47;24232:131;24358:4;24232:131;:::i;:::-;24224:139;;23951:419;;;:::o;24376:221::-;24516:34;24512:1;24504:6;24500:14;24493:58;24585:4;24580:2;24572:6;24568:15;24561:29;24376:221;:::o;24603:366::-;24745:3;24766:67;24830:2;24825:3;24766:67;:::i;:::-;24759:74;;24842:93;24931:3;24842:93;:::i;:::-;24960:2;24955:3;24951:12;24944:19;;24603:366;;;:::o;24975:419::-;25141:4;25179:2;25168:9;25164:18;25156:26;;25228:9;25222:4;25218:20;25214:1;25203:9;25199:17;25192:47;25256:131;25382:4;25256:131;:::i;:::-;25248:139;;24975:419;;;:::o;25400:179::-;25540:31;25536:1;25528:6;25524:14;25517:55;25400:179;:::o;25585:366::-;25727:3;25748:67;25812:2;25807:3;25748:67;:::i;:::-;25741:74;;25824:93;25913:3;25824:93;:::i;:::-;25942:2;25937:3;25933:12;25926:19;;25585:366;;;:::o;25957:419::-;26123:4;26161:2;26150:9;26146:18;26138:26;;26210:9;26204:4;26200:20;26196:1;26185:9;26181:17;26174:47;26238:131;26364:4;26238:131;:::i;:::-;26230:139;;25957:419;;;:::o;26382:170::-;26522:22;26518:1;26510:6;26506:14;26499:46;26382:170;:::o;26558:366::-;26700:3;26721:67;26785:2;26780:3;26721:67;:::i;:::-;26714:74;;26797:93;26886:3;26797:93;:::i;:::-;26915:2;26910:3;26906:12;26899:19;;26558:366;;;:::o;26930:419::-;27096:4;27134:2;27123:9;27119:18;27111:26;;27183:9;27177:4;27173:20;27169:1;27158:9;27154:17;27147:47;27211:131;27337:4;27211:131;:::i;:::-;27203:139;;26930:419;;;:::o;27355:775::-;27588:4;27626:3;27615:9;27611:19;27603:27;;27640:71;27708:1;27697:9;27693:17;27684:6;27640:71;:::i;:::-;27721:72;27789:2;27778:9;27774:18;27765:6;27721:72;:::i;:::-;27803;27871:2;27860:9;27856:18;27847:6;27803:72;:::i;:::-;27885;27953:2;27942:9;27938:18;27929:6;27885:72;:::i;:::-;27967:73;28035:3;28024:9;28020:19;28011:6;27967:73;:::i;:::-;28050;28118:3;28107:9;28103:19;28094:6;28050:73;:::i;:::-;27355:775;;;;;;;;;:::o;28136:410::-;28176:7;28199:20;28217:1;28199:20;:::i;:::-;28194:25;;28233:20;28251:1;28233:20;:::i;:::-;28228:25;;28288:1;28285;28281:9;28310:30;28328:11;28310:30;:::i;:::-;28299:41;;28489:1;28480:7;28476:15;28473:1;28470:22;28450:1;28443:9;28423:83;28400:139;;28519:18;;:::i;:::-;28400:139;28184:362;28136:410;;;;:::o;28552:180::-;28600:77;28597:1;28590:88;28697:4;28694:1;28687:15;28721:4;28718:1;28711:15;28738:185;28778:1;28795:20;28813:1;28795:20;:::i;:::-;28790:25;;28829:20;28847:1;28829:20;:::i;:::-;28824:25;;28868:1;28858:35;;28873:18;;:::i;:::-;28858:35;28915:1;28912;28908:9;28903:14;;28738:185;;;;:::o;28929:180::-;28977:77;28974:1;28967:88;29074:4;29071:1;29064:15;29098:4;29095:1;29088:15;29115:85;29160:7;29189:5;29178:16;;29115:85;;;:::o;29206:158::-;29264:9;29297:61;29315:42;29324:32;29350:5;29324:32;:::i;:::-;29315:42;:::i;:::-;29297:61;:::i;:::-;29284:74;;29206:158;;;:::o;29370:147::-;29465:45;29504:5;29465:45;:::i;:::-;29460:3;29453:58;29370:147;;:::o;29523:114::-;29590:6;29624:5;29618:12;29608:22;;29523:114;;;:::o;29643:184::-;29742:11;29776:6;29771:3;29764:19;29816:4;29811:3;29807:14;29792:29;;29643:184;;;;:::o;29833:132::-;29900:4;29923:3;29915:11;;29953:4;29948:3;29944:14;29936:22;;29833:132;;;:::o;29971:108::-;30048:24;30066:5;30048:24;:::i;:::-;30043:3;30036:37;29971:108;;:::o;30085:179::-;30154:10;30175:46;30217:3;30209:6;30175:46;:::i;:::-;30253:4;30248:3;30244:14;30230:28;;30085:179;;;;:::o;30270:113::-;30340:4;30372;30367:3;30363:14;30355:22;;30270:113;;;:::o;30419:732::-;30538:3;30567:54;30615:5;30567:54;:::i;:::-;30637:86;30716:6;30711:3;30637:86;:::i;:::-;30630:93;;30747:56;30797:5;30747:56;:::i;:::-;30826:7;30857:1;30842:284;30867:6;30864:1;30861:13;30842:284;;;30943:6;30937:13;30970:63;31029:3;31014:13;30970:63;:::i;:::-;30963:70;;31056:60;31109:6;31056:60;:::i;:::-;31046:70;;30902:224;30889:1;30886;30882:9;30877:14;;30842:284;;;30846:14;31142:3;31135:10;;30543:608;;;30419:732;;;;:::o;31157:942::-;31448:4;31486:3;31475:9;31471:19;31463:27;;31500:71;31568:1;31557:9;31553:17;31544:6;31500:71;:::i;:::-;31581:80;31657:2;31646:9;31642:18;31633:6;31581:80;:::i;:::-;31708:9;31702:4;31698:20;31693:2;31682:9;31678:18;31671:48;31736:108;31839:4;31830:6;31736:108;:::i;:::-;31728:116;;31854:72;31922:2;31911:9;31907:18;31898:6;31854:72;:::i;:::-;31936:73;32004:3;31993:9;31989:19;31980:6;31936:73;:::i;:::-;32019;32087:3;32076:9;32072:19;32063:6;32019:73;:::i;:::-;31157:942;;;;;;;;;:::o;32105:831::-;32368:4;32406:3;32395:9;32391:19;32383:27;;32420:71;32488:1;32477:9;32473:17;32464:6;32420:71;:::i;:::-;32501:80;32577:2;32566:9;32562:18;32553:6;32501:80;:::i;:::-;32628:9;32622:4;32618:20;32613:2;32602:9;32598:18;32591:48;32656:108;32759:4;32750:6;32656:108;:::i;:::-;32648:116;;32774:72;32842:2;32831:9;32827:18;32818:6;32774:72;:::i;:::-;32856:73;32924:3;32913:9;32909:19;32900:6;32856:73;:::i;:::-;32105:831;;;;;;;;:::o;32942:997::-;33231:4;33269:3;33258:9;33254:19;33246:27;;33283:71;33351:1;33340:9;33336:17;33327:6;33283:71;:::i;:::-;33364:72;33432:2;33421:9;33417:18;33408:6;33364:72;:::i;:::-;33446;33514:2;33503:9;33499:18;33490:6;33446:72;:::i;:::-;33528;33596:2;33585:9;33581:18;33572:6;33528:72;:::i;:::-;33610:73;33678:3;33667:9;33663:19;33654:6;33610:73;:::i;:::-;33693;33761:3;33750:9;33746:19;33737:6;33693:73;:::i;:::-;33776;33844:3;33833:9;33829:19;33820:6;33776:73;:::i;:::-;33859;33927:3;33916:9;33912:19;33903:6;33859:73;:::i;:::-;32942:997;;;;;;;;;;;:::o;33945:224::-;34085:34;34081:1;34073:6;34069:14;34062:58;34154:7;34149:2;34141:6;34137:15;34130:32;33945:224;:::o;34175:366::-;34317:3;34338:67;34402:2;34397:3;34338:67;:::i;:::-;34331:74;;34414:93;34503:3;34414:93;:::i;:::-;34532:2;34527:3;34523:12;34516:19;;34175:366;;;:::o;34547:419::-;34713:4;34751:2;34740:9;34736:18;34728:26;;34800:9;34794:4;34790:20;34786:1;34775:9;34771:17;34764:47;34828:131;34954:4;34828:131;:::i;:::-;34820:139;;34547:419;;;:::o;34972:222::-;35112:34;35108:1;35100:6;35096:14;35089:58;35181:5;35176:2;35168:6;35164:15;35157:30;34972:222;:::o;35200:366::-;35342:3;35363:67;35427:2;35422:3;35363:67;:::i;:::-;35356:74;;35439:93;35528:3;35439:93;:::i;:::-;35557:2;35552:3;35548:12;35541:19;;35200:366;;;:::o;35572:419::-;35738:4;35776:2;35765:9;35761:18;35753:26;;35825:9;35819:4;35815:20;35811:1;35800:9;35796:17;35789:47;35853:131;35979:4;35853:131;:::i;:::-;35845:139;;35572:419;;;:::o;35997:225::-;36137:34;36133:1;36125:6;36121:14;36114:58;36206:8;36201:2;36193:6;36189:15;36182:33;35997:225;:::o;36228:366::-;36370:3;36391:67;36455:2;36450:3;36391:67;:::i;:::-;36384:74;;36467:93;36556:3;36467:93;:::i;:::-;36585:2;36580:3;36576:12;36569:19;;36228:366;;;:::o;36600:419::-;36766:4;36804:2;36793:9;36789:18;36781:26;;36853:9;36847:4;36843:20;36839:1;36828:9;36824:17;36817:47;36881:131;37007:4;36881:131;:::i;:::-;36873:139;;36600:419;;;:::o;37025:229::-;37165:34;37161:1;37153:6;37149:14;37142:58;37234:12;37229:2;37221:6;37217:15;37210:37;37025:229;:::o;37260:366::-;37402:3;37423:67;37487:2;37482:3;37423:67;:::i;:::-;37416:74;;37499:93;37588:3;37499:93;:::i;:::-;37617:2;37612:3;37608:12;37601:19;;37260:366;;;:::o;37632:419::-;37798:4;37836:2;37825:9;37821:18;37813:26;;37885:9;37879:4;37875:20;37871:1;37860:9;37856:17;37849:47;37913:131;38039:4;37913:131;:::i;:::-;37905:139;;37632:419;;;:::o;38057:180::-;38105:77;38102:1;38095:88;38202:4;38199:1;38192:15;38226:4;38223:1;38216:15;38243:807;38492:4;38530:3;38519:9;38515:19;38507:27;;38544:71;38612:1;38601:9;38597:17;38588:6;38544:71;:::i;:::-;38625:72;38693:2;38682:9;38678:18;38669:6;38625:72;:::i;:::-;38707:80;38783:2;38772:9;38768:18;38759:6;38707:80;:::i;:::-;38797;38873:2;38862:9;38858:18;38849:6;38797:80;:::i;:::-;38887:73;38955:3;38944:9;38940:19;38931:6;38887:73;:::i;:::-;38970;39038:3;39027:9;39023:19;39014:6;38970:73;:::i;:::-;38243:807;;;;;;;;;:::o;39056:663::-;39144:6;39152;39160;39209:2;39197:9;39188:7;39184:23;39180:32;39177:119;;;39215:79;;:::i;:::-;39177:119;39335:1;39360:64;39416:7;39407:6;39396:9;39392:22;39360:64;:::i;:::-;39350:74;;39306:128;39473:2;39499:64;39555:7;39546:6;39535:9;39531:22;39499:64;:::i;:::-;39489:74;;39444:129;39612:2;39638:64;39694:7;39685:6;39674:9;39670:22;39638:64;:::i;:::-;39628:74;;39583:129;39056:663;;;;;:::o;39725:442::-;39874:4;39912:2;39901:9;39897:18;39889:26;;39925:71;39993:1;39982:9;39978:17;39969:6;39925:71;:::i;:::-;40006:72;40074:2;40063:9;40059:18;40050:6;40006:72;:::i;:::-;40088;40156:2;40145:9;40141:18;40132:6;40088:72;:::i;:::-;39725:442;;;;;;:::o;40173:225::-;40313:34;40309:1;40301:6;40297:14;40290:58;40382:8;40377:2;40369:6;40365:15;40358:33;40173:225;:::o;40404:366::-;40546:3;40567:67;40631:2;40626:3;40567:67;:::i;:::-;40560:74;;40643:93;40732:3;40643:93;:::i;:::-;40761:2;40756:3;40752:12;40745:19;;40404:366;;;:::o;40776:419::-;40942:4;40980:2;40969:9;40965:18;40957:26;;41029:9;41023:4;41019:20;41015:1;41004:9;41000:17;40993:47;41057:131;41183:4;41057:131;:::i;:::-;41049:139;;40776:419;;;:::o;41201:179::-;41341:31;41337:1;41329:6;41325:14;41318:55;41201:179;:::o;41386:366::-;41528:3;41549:67;41613:2;41608:3;41549:67;:::i;:::-;41542:74;;41625:93;41714:3;41625:93;:::i;:::-;41743:2;41738:3;41734:12;41727:19;;41386:366;;;:::o;41758:419::-;41924:4;41962:2;41951:9;41947:18;41939:26;;42011:9;42005:4;42001:20;41997:1;41986:9;41982:17;41975:47;42039:131;42165:4;42039:131;:::i;:::-;42031:139;;41758:419;;;:::o

Swarm Source

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