Token AIPEOPLE

 

Overview ERC20

Price
$0.00 @ 0.000000 ETH
Fully Diluted Market Cap
Total Supply:
250,000,000,000,000,000 AIPEOPLE

Holders:
15,258 addresses

Transfers:
-

Loading
[ Download CSV Export  ] 
Loading
[ Download CSV Export  ] 
Loading

OVERVIEW

AIPEOPLE is an AI-driven token that enhances people's livelihoods by providing access to state-of-the-art technologies. Through the use of AIPEOPLE, individuals can overcome intricate challenges, make informed judgments, and accomplish their objectives more efficiently.

Market

Volume (24H):$5.12
Market Capitalization:$0.00
Circulating Supply:0.00 AIPEOPLE
Market Data Source: Coinmarketcap


Update? Click here to update the token ICO / general information
# Exchange Pair Price  24H Volume % Volume
1
Camelot
0X72BD2BC9AD82C010434A5C4B5322AE18AC4F0087-0X82AF49447D8A07E3BD95BD0D56F35241523FBAB1$0.00
0.0000000 Btc
$5.09
28,808,443,867,402.300 0X72BD2BC9AD82C010434A5C4B5322AE18AC4F0087
100.0000%

Contract Source Code Verified (Exact Match)

Contract Name:
AIPEOPLE

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

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

// SPDX-License-Identifier: MIT

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/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/token/AIPEOPLE.sol


pragma solidity =0.8.19;

contract AIPEOPLE 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 = 100;
    uint256 private gov1Fee = 200;
    uint256 private gov2Fee = 200;
    uint256 private liquidityFee = 200;
    uint256 private nftFee = 200;
    uint256 private bonusFee = 300;
    uint256 private devFee = 300;
    uint256 private totalFee = 1500;
    uint256 public feeDenominator = 10000;

    // Fees receivers
    address private gov1Wallet;
    address private gov2Wallet;
    address private bonusWallet;
    address private bonusNFT;
    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("AIPEOPLE", "AIPEOPLE") {
        uint256 _totalSupply = 250_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 decimals() public view virtual override returns (uint8) {
        return 6;
    }

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

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

    function _peopleTransfer(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;

        if (isPair(sender)) {
            side = 1;
            user_ = recipient;
            pair_ = sender;
        } else if (isPair(recipient)) {
            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 amountPeopleBurn = (taxAmount * burnFee) / (totalFee);
        uint256 amountPeopleLp = (taxAmount * liquidityFee) / (totalFee);
        uint256 amountPeopleBonus = (taxAmount * bonusFee) / (totalFee);
        uint256 amountPeopleNFT = (taxAmount * nftFee) / (totalFee);

        taxAmount -= amountPeopleBurn;
        taxAmount -= amountPeopleLp;
        taxAmount -= amountPeopleBonus;
        taxAmount -= amountPeopleNFT;
        
        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, amountPeopleBurn);
        _transfer(address(this), address(bonusWallet), amountPeopleBonus);
        _transfer(address(this), address(bonusNFT), amountPeopleNFT);

        uint256 amountBackToken = backToken.balanceOf(address(this)) - balanceBefore;
        uint256 backTokenTotalFee = totalFee - burnFee - liquidityFee - bonusFee - nftFee;
        uint256 amountBackTokenGov1 = (amountBackToken * gov1Fee) / (backTokenTotalFee);
        uint256 amountBackTokenGov2 = (amountBackToken * gov2Fee) / (backTokenTotalFee);
        uint256 amountBackTokenDev = amountBackToken - amountBackTokenGov1 - amountBackTokenGov2;

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

        if (addLiquidityEnabled) {
            _doAddLp();
        }
        
        emit SwapBack(amountPeopleBurn, amountBackTokenGov1, amountBackTokenGov2, amountPeopleLp, amountPeopleNFT, amountPeopleBonus, 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 launched() internal view returns (bool) {
        return launchedAt != 0;
    }

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

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

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

    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, "AIPEOPLE: ETH_TRANSFER_FAILED");
    }

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

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

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

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

    function setFees(
        uint256 _gov1Fee,
        uint256 _gov2Fee,
        uint256 _liquidityFee,
        uint256 _nftFee,
        uint256 _bonusFee,
        uint256 _devFee,
        uint256 _burnFee
    ) external onlyOwner {
       burnFee = _burnFee;
       gov1Fee = _gov1Fee;
       gov2Fee = _gov2Fee;
       liquidityFee = _liquidityFee;
       nftFee = _nftFee;
       bonusFee = _bonusFee;
       devFee = _devFee;
       totalFee = _burnFee + _gov1Fee +  _gov2Fee + _liquidityFee + _nftFee + _bonusFee + _devFee;
    }

    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), "AIPEOPLE: pair is the zero address");
        return _pairs.add(pair);
    }

    function delPair(address pair) public onlyOwner returns (bool) {
        require(pair != address(0), "AIPEOPLE: 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, "AIPEOPLE: 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":[{"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":"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":"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":"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":"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":"address","name":"_gov1Wallet","type":"address"},{"internalType":"address","name":"_gov2Wallet","type":"address"},{"internalType":"address","name":"_bonusWallet","type":"address"},{"internalType":"address","name":"_bonusNFT","type":"address"},{"internalType":"address","name":"_devWallet","type":"address"}],"name":"setFeeReceivers","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":"_nftFee","type":"uint256"},{"internalType":"uint256","name":"_bonusFee","type":"uint256"},{"internalType":"uint256","name":"_devFee","type":"uint256"},{"internalType":"uint256","name":"_burnFee","type":"uint256"}],"name":"setFees","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":"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":"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"}]

60e06040526005805461ffff60a01b191661010160a01b179055606460085560c86009819055600a819055600b819055600c5561012c600d819055600e556105dc600f556127106010553480156200005657600080fd5b5060405162002f4238038062002f428339810160408190526200007991620002eb565b604080518082018252600880825267414950454f504c4560c01b6020808401829052845180860190955291845290830152906003620000b98382620003f7565b506004620000c88282620003f7565b505050620000e5620000df620001b160201b60201c565b620001b5565b601680546001600160a01b0319166001600160a01b0386161790556934f086f3b33b68400000600160076000620001193390565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff19968716179055308082526007855283822080548716600190811790915533835260069095528382208054871686179055815291909120805490931690911790915584811660805283811660a052821660c052620001a66200019f3390565b8262000207565b5050505050620004eb565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216620002625760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640160405180910390fd5b8060026000828254620002769190620004c3565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b505050565b6001600160a01b0381168114620002e857600080fd5b50565b600080600080608085870312156200030257600080fd5b84516200030f81620002d2565b60208601519094506200032281620002d2565b60408601519093506200033581620002d2565b60608601519092506200034881620002d2565b939692955090935050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200037e57607f821691505b6020821081036200039f57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620002cd57600081815260208120601f850160051c81016020861015620003ce5750805b601f850160051c820191505b81811015620003ef57828155600101620003da565b505050505050565b81516001600160401b0381111562000413576200041362000353565b6200042b8162000424845462000369565b84620003a5565b602080601f8311600181146200046357600084156200044a5750858301515b600019600386901b1c1916600185901b178555620003ef565b600085815260208120601f198616915b82811015620004945788860151825594840194600190910190840162000473565b5085821015620004b35787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b80820180821115620004e557634e487b7160e01b600052601160045260246000fd5b92915050565b60805160a05160c0516129ef6200055360003960008181610b43015281816115ff0152611f5d0152600081816114d3015281816116f90152818161177f01528181611fef015281816120740152818161224d01526122a901526000610b7401526129ef6000f3fe60806040526004361061023f5760003560e01c8063860139401161012e578063bdf391cc116100ab578063d83067861161006f578063d830678614610690578063da2e3bad146106b1578063dd62ed3e146106d1578063e5e31b13146106f1578063f2fde38b1461071157600080fd5b8063bdf391cc1461060f578063bf56b3711461062f578063bfa382b514610645578063c2b7bbb61461065a578063c6d2577d1461067a57600080fd5b8063a457c2d7116100f2578063a457c2d71461056f578063a5bc50851461058f578063a9059cbb146105af578063aac46c95146105cf578063b8c61130146105ef57600080fd5b806386013940146104ce578063861faf5f146104ef5780638da5cb5b146105275780638fbbd7501461054557806395d89b411461055a57600080fd5b8063364333f4116101bc578063658d4b7f11610180578063658d4b7f146104125780636ddd17131461043257806370a0823114610453578063715018a6146104895780638072250b1461049e57600080fd5b8063364333f414610378578063395093511461038d5780633f4218e0146103ad5780634460d3cf146103dd5780634fab9e4c146103fd57600080fd5b806318160ddd1161020357806318160ddd146102f257806318abb6351461030757806323b872dd146103275780632b112e4914610347578063313ce5671461035c57600080fd5b806301339c211461024b5780630323aac71461026257806306fdde031461028a578063095ea7b3146102ac578063180b0d7e146102dc57600080fd5b3661024657005b600080fd5b34801561025757600080fd5b50610260610731565b005b34801561026e57600080fd5b5061027761078b565b6040519081526020015b60405180910390f35b34801561029657600080fd5b5061029f61079c565b6040516102819190612501565b3480156102b857600080fd5b506102cc6102c7366004612549565b61082e565b6040519015158152602001610281565b3480156102e857600080fd5b5061027760105481565b3480156102fe57600080fd5b50600254610277565b34801561031357600080fd5b50610260610322366004612575565b610848565b34801561033357600080fd5b506102cc6103423660046125e6565b6108af565b34801561035357600080fd5b506102776108d3565b34801561036857600080fd5b5060405160068152602001610281565b34801561038457600080fd5b5061026061093a565b34801561039957600080fd5b506102cc6103a8366004612549565b610a32565b3480156103b957600080fd5b506102cc6103c8366004612627565b60066020526000908152604090205460ff1681565b3480156103e957600080fd5b506102606103f8366004612627565b610a54565b34801561040957600080fd5b50610260610adb565b34801561041e57600080fd5b5061026061042d366004612652565b610c01565b34801561043e57600080fd5b506005546102cc90600160a01b900460ff1681565b34801561045f57600080fd5b5061027761046e366004612627565b6001600160a01b031660009081526020819052604090205490565b34801561049557600080fd5b50610260610c34565b3480156104aa57600080fd5b506102cc6104b9366004612627565b60076020526000908152604090205460ff1681565b3480156104da57600080fd5b506005546102cc90600160a81b900460ff1681565b3480156104fb57600080fd5b5060165461050f906001600160a01b031681565b6040516001600160a01b039091168152602001610281565b34801561053357600080fd5b506005546001600160a01b031661050f565b34801561055157600080fd5b50610260610c48565b34801561056657600080fd5b5061029f610c58565b34801561057b57600080fd5b506102cc61058a366004612549565b610c67565b34801561059b57600080fd5b506102cc6105aa366004612627565b610ced565b3480156105bb57600080fd5b506102cc6105ca366004612549565b610d28565b3480156105db57600080fd5b506102606105ea36600461268b565b610d35565b3480156105fb57600080fd5b5061026061060a36600461268b565b610d5b565b34801561061b57600080fd5b5061050f61062a3660046126a8565b610d81565b34801561063b57600080fd5b5061027760175481565b34801561065157600080fd5b50610260610df3565b34801561066657600080fd5b506102cc610675366004612627565b610eb4565b34801561068657600080fd5b5061027760185481565b34801561069c57600080fd5b506005546102cc90600160b01b900460ff1681565b3480156106bd57600080fd5b506102606106cc3660046126c1565b610eef565b3480156106dd57600080fd5b506102776106ec36600461270d565b610f67565b3480156106fd57600080fd5b506102cc61070c366004612627565b610f92565b34801561071d57600080fd5b5061026061072c366004612627565b610f9f565b610739611015565b601754156107815760405162461bcd60e51b815260206004820152601060248201526f105b1c9958591e481b185d5b98da195960821b60448201526064015b60405180910390fd5b4360175542601855565b6000610797601a61106f565b905090565b6060600380546107ab9061273b565b80601f01602080910402602001604051908101604052809291908181526020018280546107d79061273b565b80156108245780601f106107f957610100808354040283529160200191610824565b820191906000526020600020905b81548152906001019060200180831161080757829003601f168201915b5050505050905090565b60003361083c818585611079565b60019150505b92915050565b610850611015565b601180546001600160a01b03199081166001600160a01b03978816179091556012805482169587169590951790945560138054851693861693909317909255601480548416918516919091179055601580549092169216919091179055565b6000336108bd85828561119d565b6108c8858585611217565b9150505b9392505050565b600060208190527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb55461dead82527f44ad89ba62b98ff34f51403ac22759b55759460c0bb5521eb4b6ee3cff49cf8354600254610930919061278b565b610797919061278b565b610942611015565b6016546001600160a01b031663a9059cbb336016546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa15801561099c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109c0919061279e565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015610a0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a2f91906127b7565b50565b60003361083c818585610a458383610f67565b610a4f91906127d4565b611079565b610a5c611015565b6040516370a0823160e01b8152306004820152610a2f9033906001600160a01b038416906370a0823190602401602060405180830381865afa158015610aa6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aca919061279e565b6001600160a01b03841691906113ea565b610ae3611015565b60195460ff1615610b2c5760405162461bcd60e51b8152602060048201526013602482015272105b1c9958591e481a5b9a5d1a585b1a5e9959606a1b6044820152606401610778565b6040516364e329cb60e11b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301523060248301526000917f00000000000000000000000000000000000000000000000000000000000000009091169063c9c65396906044016020604051808303816000875af1158015610bbf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610be391906127e7565b9050610bf0601a82611441565b50506019805460ff19166001179055565b610c09611015565b6001600160a01b03919091166000908152600660205260409020805460ff1916911515919091179055565b610c3c611015565b610c466000611456565b565b610c50611015565b610c466114a8565b6060600480546107ab9061273b565b60003381610c758286610f67565b905083811015610cd55760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610778565b610ce28286868403611079565b506001949350505050565b6000610cf7611015565b6001600160a01b038216610d1d5760405162461bcd60e51b815260040161077890612804565b610842601a83611b5f565b60006108cc338484611217565b610d3d611015565b60058054911515600160a81b0260ff60a81b19909216919091179055565b610d63611015565b60058054911515600160a01b0260ff60a01b19909216919091179055565b60006001610d8f601a61106f565b610d99919061278b565b821115610de85760405162461bcd60e51b815260206004820152601d60248201527f414950454f504c453a20696e646578206f7574206f6620626f756e64730000006044820152606401610778565b610842601a83611b74565b610dfb611015565b60408051600080825260208201928390524792909133918491610e1d91612846565b60006040518083038185875af1925050503d8060008114610e5a576040519150601f19603f3d011682016040523d82523d6000602084013e610e5f565b606091505b5050905080610eb05760405162461bcd60e51b815260206004820152601d60248201527f414950454f504c453a204554485f5452414e534645525f4641494c45440000006044820152606401610778565b5050565b6000610ebe611015565b6001600160a01b038216610ee45760405162461bcd60e51b815260040161077890612804565b610842601a83611441565b610ef7611015565b60088190556009879055600a869055600b859055600c849055600d839055600e8290558183858789610f298c876127d4565b610f3391906127d4565b610f3d91906127d4565b610f4791906127d4565b610f5191906127d4565b610f5b91906127d4565b600f5550505050505050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6000610842601a83611b80565b610fa7611015565b6001600160a01b03811661100c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610778565b610a2f81611456565b6005546001600160a01b03163314610c465760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610778565b6000610842825490565b6001600160a01b0383166110db5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610778565b6001600160a01b03821661113c5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610778565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60006111a98484610f67565b9050600019811461121157818110156112045760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610778565b6112118484848403611079565b50505050565b600554600090600160b01b900460ff161561123f57611237848484611ba2565b5060016108cc565b6001600160a01b03841660009081526007602052604090205460ff166112a5576017546112a55760405162461bcd60e51b8152602060048201526014602482015273151c98591a5b99c81b9bdd081bdc195b881e595d60621b6044820152606401610778565b6001600160a01b03841660009081526006602052604081205460ff161580156112e757506001600160a01b03841660009081526006602052604090205460ff16155b80156112f4575060175415155b90506000858561130382610f92565b1561131657506001915085905086611332565b61131f87610f92565b1561132d5760029250611332565b600093505b61133a611d46565b15611347576113476114a8565b600084611354578661135e565b61135e8988611da8565b905061136b898983611ba2565b83156113db577fe6f814da7244d1ae6c61b54b5684858ba39cad7b9a91884be10060664987d7548383898761139e6108d3565b604080516001600160a01b03968716815295909416602086015292840191909152606083015260808201524260a082015260c00160405180910390a15b50600198975050505050505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261143c908490611de5565b505050565b60006108cc836001600160a01b038416611eb7565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6005805460ff60b01b1916600160b01b1790553060009081526020819052604081205490506114f8307f000000000000000000000000000000000000000000000000000000000000000083611079565b6000600f546008548361150b9190612862565b6115159190612879565b90506000600f54600b548461152a9190612862565b6115349190612879565b90506000600f54600d54856115499190612862565b6115539190612879565b90506000600f54600c54866115689190612862565b6115729190612879565b905061157e848661278b565b945061158a838661278b565b9450611596828661278b565b94506115a2818661278b565b60408051600380825260808201909252919650600091906020820160608036833701905050905030816000815181106115dd576115dd61289b565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000000000000000000000000000000000000000000000816001815181106116315761163161289b565b6001600160a01b0392831660209182029290920101526016548251911690829060029081106116625761166261289b565b6001600160a01b0392831660209182029290920101526016546040516370a0823160e01b8152306004820152600092839216906370a0823190602401602060405180830381865afa1580156116bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116df919061279e565b60405163561c49dd60e11b81529091506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063ac3893ba90611739908b9060009088903090839042906004016128f5565b600060405180830381600087803b15801561175357600080fd5b505af1925050508015611764575060015b6117f757604051635c11d79560e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690635c11d795906117bd908b90600090889030904290600401612939565b600060405180830381600087803b1580156117d757600080fd5b505af19250505080156117e8575060015b156117f257600191505b6117fc565b600191505b8161180e575050505050505050611b50565b61181b3061dead89611ba2565b6013546118339030906001600160a01b031687611ba2565b60145461184b9030906001600160a01b031686611ba2565b6016546040516370a0823160e01b815230600482015260009183916001600160a01b03909116906370a0823190602401602060405180830381865afa158015611898573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118bc919061279e565b6118c6919061278b565b90506000600c54600d54600b54600854600f546118e3919061278b565b6118ed919061278b565b6118f7919061278b565b611901919061278b565b9050600081600954846119149190612862565b61191e9190612879565b9050600082600a54856119319190612862565b61193b9190612879565b905060008161194a848761278b565b611954919061278b565b60165460115460405163a9059cbb60e01b81526001600160a01b03918216600482015260248101879052929350169063a9059cbb906044016020604051808303816000875af11580156119ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119cf91906127b7565b5060165460125460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810185905291169063a9059cbb906044016020604051808303816000875af1158015611a25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a4991906127b7565b5060165460155460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810184905291169063a9059cbb906044016020604051808303816000875af1158015611a9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ac391906127b7565b50600554600160a81b900460ff1615611ade57611ade611f06565b604080518d815260208101859052908101839052606081018c9052608081018a905260a081018b905260c081018290524260e08201527f310a031bae0df2b1a8ba6de615833770c757a404a7395cc0121c13975e67c0b0906101000160405180910390a1505050505050505050505050505b6005805460ff60b01b19169055565b60006108cc836001600160a01b03841661211b565b60006108cc838361220e565b6001600160a01b038116600090815260018301602052604081205415156108cc565b6001600160a01b038316611c065760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610778565b6001600160a01b038216611c685760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610778565b6001600160a01b03831660009081526020819052604090205481811015611ce05760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610778565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3611211565b600554600090600160b01b900460ff16158015611d6c5750600554600160a01b900460ff165b8015611d79575060175415155b8015611d92575030600090815260208190526040812054115b80156107975750611da233610f92565b15905090565b600080601054600f5484611dbc9190612862565b611dc69190612879565b9050611dd3843083611ba2565b611ddd818461278b565b949350505050565b6000611e3a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166122389092919063ffffffff16565b80519091501561143c5780806020019051810190611e5891906127b7565b61143c5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610778565b6000818152600183016020526040812054611efe57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610842565b506000610842565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110611f3b57611f3b61289b565b60200260200101906001600160a01b031690816001600160a01b0316815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110611f8f57611f8f61289b565b6001600160a01b039290921660209283029190910182015230600090815290819052604081205490611fc2600283612879565b90506103e8811015611fd357505050565b604051632955261160e11b815247906000906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906352aa4c229061202e90869085908a903090839042906004016128f5565b600060405180830381600087803b15801561204857600080fd5b505af1925050508015612059575060015b6120eb5760405163791ac94760e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063791ac947906120b29086906000908a9030904290600401612939565b600060405180830381600087803b1580156120cc57600080fd5b505af19250505080156120dd575060015b156120e6575060015b6120ef565b5060015b806120fb575050505050565b6000612107834761278b565b90506121138482612247565b505050505050565b6000818152600183016020526040812054801561220457600061213f60018361278b565b85549091506000906121539060019061278b565b90508181146121b85760008660000182815481106121735761217361289b565b90600052602060002001549050808760000184815481106121965761219661289b565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806121c9576121c9612975565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610842565b6000915050610842565b60008260000182815481106122255761222561289b565b9060005260206000200154905092915050565b6060611ddd8484600085612364565b612272307f000000000000000000000000000000000000000000000000000000000000000084611079565b60405163f305d71960e01b8152306004820152602481018390526000604482018190526064820181905260848201524260a48201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063f305d71990839060c40160606040518083038185885af193505050508015612318575060408051601f3d908101601f191682019092526123159181019061298b565b60015b15610eb05750506040805184815260208101849052428183015290517ff75993dbe1645872cbbea6395e1feebee76b435baf0e4d62d7eac269c6f57b2492509081900360600190a15050565b6060824710156123c55760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610778565b600080866001600160a01b031685876040516123e19190612846565b60006040518083038185875af1925050503d806000811461241e576040519150601f19603f3d011682016040523d82523d6000602084013e612423565b606091505b50915091506124348783838761243f565b979650505050505050565b606083156124ae5782516000036124a7576001600160a01b0385163b6124a75760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610778565b5081611ddd565b611ddd83838151156124c35781518083602001fd5b8060405162461bcd60e51b81526004016107789190612501565b60005b838110156124f85781810151838201526020016124e0565b50506000910152565b60208152600082518060208401526125208160408501602087016124dd565b601f01601f19169190910160400192915050565b6001600160a01b0381168114610a2f57600080fd5b6000806040838503121561255c57600080fd5b823561256781612534565b946020939093013593505050565b600080600080600060a0868803121561258d57600080fd5b853561259881612534565b945060208601356125a881612534565b935060408601356125b881612534565b925060608601356125c881612534565b915060808601356125d881612534565b809150509295509295909350565b6000806000606084860312156125fb57600080fd5b833561260681612534565b9250602084013561261681612534565b929592945050506040919091013590565b60006020828403121561263957600080fd5b81356108cc81612534565b8015158114610a2f57600080fd5b6000806040838503121561266557600080fd5b823561267081612534565b9150602083013561268081612644565b809150509250929050565b60006020828403121561269d57600080fd5b81356108cc81612644565b6000602082840312156126ba57600080fd5b5035919050565b600080600080600080600060e0888a0312156126dc57600080fd5b505085359760208701359750604087013596606081013596506080810135955060a0810135945060c0013592509050565b6000806040838503121561272057600080fd5b823561272b81612534565b9150602083013561268081612534565b600181811c9082168061274f57607f821691505b60208210810361276f57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561084257610842612775565b6000602082840312156127b057600080fd5b5051919050565b6000602082840312156127c957600080fd5b81516108cc81612644565b8082018082111561084257610842612775565b6000602082840312156127f957600080fd5b81516108cc81612534565b60208082526022908201527f414950454f504c453a207061697220697320746865207a65726f206164647265604082015261737360f01b606082015260800190565b600082516128588184602087016124dd565b9190910192915050565b808202811582820484141761084257610842612775565b60008261289657634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b600081518084526020808501945080840160005b838110156128ea5781516001600160a01b0316875295820195908201906001016128c5565b509495945050505050565b86815285602082015260c06040820152600061291460c08301876128b1565b6001600160a01b03958616606084015293909416608082015260a00152949350505050565b85815284602082015260a06040820152600061295860a08301866128b1565b6001600160a01b0394909416606083015250608001529392505050565b634e487b7160e01b600052603160045260246000fd5b6000806000606084860312156129a057600080fd5b835192506020840151915060408401519050925092509256fea2646970667358221220af4a2970ece3987e2e32c00a3776eaffbfc988697a15d741cbac499f1b652c7264736f6c63430008130033000000000000000000000000912ce59144191c1204e64559fe8253a0e49e65480000000000000000000000006eccab422d763ac031210895c81787e87b43a652000000000000000000000000c873fecbd354f5a56e00e710b90ef4201db2448d00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab1

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

56180:11913:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65769:182;;;;;;;;;;;;;:::i;:::-;;67762:98;;;;;;;;;;;;;:::i;:::-;;;160:25:1;;;148:2;133:18;67762:98:0;;;;;;;;6598:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;8949:201::-;;;;;;;;;;-1:-1:-1;8949:201:0;;;;;:::i;:::-;;:::i;:::-;;;1473:14:1;;1466:22;1448:41;;1436:2;1421:18;8949:201:0;1308:187:1;57282:37:0;;;;;;;;;;;;;;;;7718:108;;;;;;;;;;-1:-1:-1;7806:12:0;;7718:108;;65959:378;;;;;;;;;;-1:-1:-1;65959:378:0;;;;;:::i;:::-;;:::i;58902:272::-;;;;;;;;;;-1:-1:-1;58902:272:0;;;;;:::i;:::-;;:::i;64681:137::-;;;;;;;;;;;;;:::i;58642:92::-;;;;;;;;;;-1:-1:-1;58642:92:0;;58725:1;2921:36:1;;2909:2;2894:18;58642:92:0;2779:184:1;65550:135:0;;;;;;;;;;;;;:::i;10434:238::-;;;;;;;;;;-1:-1:-1;10434:238:0;;;;;:::i;:::-;;:::i;56868:43::-;;;;;;;;;;-1:-1:-1;56868:43:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;65103:172;;;;;;;;;;-1:-1:-1;65103:172:0;;;;;:::i;:::-;;:::i;64857:238::-;;;;;;;;;;;;;:::i;66901:119::-;;;;;;;;;;-1:-1:-1;66901:119:0;;;;;:::i;:::-;;:::i;56658:30::-;;;;;;;;;;-1:-1:-1;56658:30:0;;;;-1:-1:-1;;;56658:30:0;;;;;;7889:127;;;;;;;;;;-1:-1:-1;7889:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;7990:18:0;7963:7;7990:18;;;;;;;;;;;;7889:127;35954:103;;;;;;;;;;;;;:::i;56920:59::-;;;;;;;;;;-1:-1:-1;56920:59:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;56697:38;;;;;;;;;;-1:-1:-1;56697:38:0;;;;-1:-1:-1;;;56697:38:0;;;;;;57516:23;;;;;;;;;;-1:-1:-1;57516:23:0;;;;-1:-1:-1;;;;;57516:23:0;;;;;;-1:-1:-1;;;;;3907:32:1;;;3889:51;;3877:2;3862:18;57516:23:0;3730:216:1;35306:87:0;;;;;;;;;;-1:-1:-1;35379:6:0;;-1:-1:-1;;;;;35379:6:0;35306:87;;65693:68;;;;;;;;;;;;;:::i;6817:104::-;;;;;;;;;;;;;:::i;11175:436::-;;;;;;;;;;-1:-1:-1;11175:436:0;;;;;:::i;:::-;;:::i;67570:184::-;;;;;;;;;;-1:-1:-1;67570:184:0;;;;;:::i;:::-;;:::i;58742:152::-;;;;;;;;;;-1:-1:-1;58742:152:0;;;;;:::i;:::-;;:::i;67140:115::-;;;;;;;;;;-1:-1:-1;67140:115:0;;;;;:::i;:::-;;:::i;67028:104::-;;;;;;;;;;-1:-1:-1;67028:104:0;;;;;:::i;:::-;;:::i;67868:185::-;;;;;;;;;;-1:-1:-1;67868:185:0;;;;;:::i;:::-;;:::i;57546:25::-;;;;;;;;;;;;;;;;65283:259;;;;;;;;;;;;;:::i;67381:181::-;;;;;;;;;;-1:-1:-1;67381:181:0;;;;;:::i;:::-;;:::i;57578:34::-;;;;;;;;;;;;;;;;56744:18;;;;;;;;;;-1:-1:-1;56744:18:0;;;;-1:-1:-1;;;56744:18:0;;;;;;66345:548;;;;;;;;;;-1:-1:-1;66345:548:0;;;;;:::i;:::-;;:::i;8478:151::-;;;;;;;;;;-1:-1:-1;8478:151:0;;;;;:::i;:::-;;:::i;67263:110::-;;;;;;;;;;-1:-1:-1;67263:110:0;;;;;:::i;:::-;;:::i;36212:201::-;;;;;;;;;;-1:-1:-1;36212:201:0;;;;;:::i;:::-;;:::i;65769:182::-;35192:13;:11;:13::i;:::-;65823:10:::1;::::0;:15;65815:44:::1;;;::::0;-1:-1:-1;;;65815:44:0;;5782:2:1;65815:44:0::1;::::0;::::1;5764:21:1::0;5821:2;5801:18;;;5794:30;-1:-1:-1;;;5840:18:1;;;5833:46;5896:18;;65815:44:0::1;;;;;;;;;65883:12;65870:10;:25:::0;65928:15:::1;65906:19;:37:::0;65769:182::o;67762:98::-;67810:7;67837:15;:6;:13;:15::i;:::-;67830:22;;67762:98;:::o;6598:100::-;6652:13;6685:5;6678:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6598:100;:::o;8949:201::-;9032:4;4324:10;9088:32;4324:10;9104:7;9113:6;9088:8;:32::i;:::-;9138:4;9131:11;;;8949:201;;;;;:::o;65959:378::-;35192:13;:11;:13::i;:::-;66169:10:::1;:24:::0;;-1:-1:-1;;;;;;66169:24:0;;::::1;-1:-1:-1::0;;;;;66169:24:0;;::::1;;::::0;;;66204:10:::1;:24:::0;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;66239:11:::1;:26:::0;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;66276:8:::1;:20:::0;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;66307:9:::1;:22:::0;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;65959:378::o;58902:272::-;59008:4;4324:10;59066:40;59082:6;4324:10;59099:6;59066:15;:40::i;:::-;59124:42;59140:6;59148:9;59159:6;59124:15;:42::i;:::-;59117:49;;;58902:272;;;;;;:::o;64681:137::-;64734:7;7990:18;;;;;;57817:42;7990:18;;;;7806:12;;64761:31;;7990:18;64761:31;:::i;:::-;:49;;;;:::i;65550:135::-;35192:13;:11;:13::i;:::-;65609:9:::1;::::0;-1:-1:-1;;;;;65609:9:0::1;:18;4324:10:::0;65642:9:::1;::::0;:34:::1;::::0;-1:-1:-1;;;65642:34:0;;65670:4:::1;65642:34;::::0;::::1;3889:51:1::0;-1:-1:-1;;;;;65642:9:0;;::::1;::::0;:19:::1;::::0;3862:18:1;;65642:34:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;65609:68;::::0;-1:-1:-1;;;;;;65609:68:0::1;::::0;;;;;;-1:-1:-1;;;;;6956:32:1;;;65609:68:0::1;::::0;::::1;6938:51:1::0;7005:18;;;6998:34;6911:18;;65609:68:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;65550:135::o:0;10434:238::-;10522:4;4324:10;10578:64;4324:10;10594:7;10631:10;10603:25;4324:10;10594:7;10603:9;:25::i;:::-;:38;;;;:::i;:::-;10578:8;:64::i;65103:172::-;35192:13;:11;:13::i;:::-;65221:45:::1;::::0;-1:-1:-1;;;65221:45:0;;65260:4:::1;65221:45;::::0;::::1;3889:51:1::0;65176:91:0::1;::::0;65210:10:::1;::::0;-1:-1:-1;;;;;65221:30:0;::::1;::::0;::::1;::::0;3862:18:1;;65221:45:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;65176:33:0;::::1;::::0;:91;:33:::1;:91::i;64857:238::-:0;35192:13;:11;:13::i;:::-;64922:11:::1;::::0;::::1;;64921:12;64913:44;;;::::0;-1:-1:-1;;;64913:44:0;;7625:2:1;64913:44:0::1;::::0;::::1;7607:21:1::0;7664:2;7644:18;;;7637:30;-1:-1:-1;;;7683:18:1;;;7676:49;7742:18;;64913:44:0::1;7423:343:1::0;64913:44:0::1;64983:48;::::0;-1:-1:-1;;;64983:48:0;;-1:-1:-1;;;;;65010:4:0::1;8001:15:1::0;;64983:48:0::1;::::0;::::1;7983:34:1::0;65025:4:0::1;8033:18:1::0;;;8026:43;-1:-1:-1;;64983:7:0::1;:18:::0;;::::1;::::0;::::1;::::0;7918::1;;64983:48:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;64968:63:::0;-1:-1:-1;65042:16:0::1;:6;64968:63:::0;65042:10:::1;:16::i;:::-;-1:-1:-1::0;;65069:11:0::1;:18:::0;;-1:-1:-1;;65069:18:0::1;65083:4;65069:18;::::0;;64857:238::o;66901:119::-;35192:13;:11;:13::i;:::-;-1:-1:-1;;;;;66984:19:0;;;::::1;;::::0;;;:11:::1;:19;::::0;;;;:28;;-1:-1:-1;;66984:28:0::1;::::0;::::1;;::::0;;;::::1;::::0;;66901:119::o;35954:103::-;35192:13;:11;:13::i;:::-;36019:30:::1;36046:1;36019:18;:30::i;:::-;35954:103::o:0;65693:68::-;35192:13;:11;:13::i;:::-;65743:10:::1;:8;:10::i;6817:104::-:0;6873:13;6906:7;6899:14;;;;;:::i;11175:436::-;11268:4;4324:10;11268:4;11351:25;4324:10;11368:7;11351:9;:25::i;:::-;11324:52;;11415:15;11395:16;:35;;11387:85;;;;-1:-1:-1;;;11387:85:0;;8538:2:1;11387:85:0;;;8520:21:1;8577:2;8557:18;;;8550:30;8616:34;8596:18;;;8589:62;-1:-1:-1;;;8667:18:1;;;8660:35;8712:19;;11387:85:0;8336:401:1;11387:85:0;11508:60;11517:5;11524:7;11552:15;11533:16;:34;11508:8;:60::i;:::-;-1:-1:-1;11599:4:0;;11175:436;-1:-1:-1;;;;11175:436:0:o;67570:184::-;67627:4;35192:13;:11;:13::i;:::-;-1:-1:-1;;;;;67652:18:0;::::1;67644:65;;;;-1:-1:-1::0;;;67644:65:0::1;;;;;;;:::i;:::-;67727:19;:6;67741:4:::0;67727:13:::1;:19::i;58742:152::-:0;58821:4;58845:41;4324:10;58875:2;58879:6;58845:15;:41::i;67140:115::-;35192:13;:11;:13::i;:::-;67217:19:::1;:30:::0;;;::::1;;-1:-1:-1::0;;;67217:30:0::1;-1:-1:-1::0;;;;67217:30:0;;::::1;::::0;;;::::1;::::0;;67140:115::o;67028:104::-;35192:13;:11;:13::i;:::-;67102:11:::1;:22:::0;;;::::1;;-1:-1:-1::0;;;67102:22:0::1;-1:-1:-1::0;;;;67102:22:0;;::::1;::::0;;;::::1;::::0;;67028:104::o;67868:185::-;67921:7;67976:1;67958:15;:6;:13;:15::i;:::-;:19;;;;:::i;:::-;67949:5;:28;;67941:70;;;;-1:-1:-1;;;67941:70:0;;9347:2:1;67941:70:0;;;9329:21:1;9386:2;9366:18;;;9359:30;9425:31;9405:18;;;9398:59;9474:18;;67941:70:0;9145:353:1;67941:70:0;68029:16;:6;68039:5;68029:9;:16::i;65283:259::-;35192:13;:11;:13::i;:::-;65461:12:::1;::::0;;65345:17:::1;65461:12:::0;;;::::1;::::0;::::1;::::0;;;;65365:21:::1;::::0;65345:17;;4324:10;;65365:21;;65416:58:::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65397:77;;;65493:7;65485:49;;;::::0;-1:-1:-1;;;65485:49:0;;10129:2:1;65485:49:0::1;::::0;::::1;10111:21:1::0;10168:2;10148:18;;;10141:30;10207:31;10187:18;;;10180:59;10256:18;;65485:49:0::1;9927:353:1::0;65485:49:0::1;65334:208;;65283:259::o:0;67381:181::-;67438:4;35192:13;:11;:13::i;:::-;-1:-1:-1;;;;;67463:18:0;::::1;67455:65;;;;-1:-1:-1::0;;;67455:65:0::1;;;;;;;:::i;:::-;67538:16;:6;67549:4:::0;67538:10:::1;:16::i;66345:548::-:0;35192:13;:11;:13::i;:::-;66591:7:::1;:18:::0;;;66619:7:::1;:18:::0;;;66647:7:::1;:18:::0;;;66675:12:::1;:28:::0;;;66713:6:::1;:16:::0;;;66739:8:::1;:20:::0;;;66769:6:::1;:16:::0;;;66778:7;66750:9;66722:7;66690:13;66657:8;66806:19:::1;66629:8:::0;66601;66806:19:::1;:::i;:::-;:31;;;;:::i;:::-;:47;;;;:::i;:::-;:57;;;;:::i;:::-;:69;;;;:::i;:::-;:79;;;;:::i;:::-;66795:8;:90:::0;-1:-1:-1;;;;;;;66345:548:0:o;8478:151::-;-1:-1:-1;;;;;8594:18:0;;;8567:7;8594:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;8478:151::o;67263:110::-;67317:4;67341:24;:6;67357:7;67341:15;:24::i;36212:201::-;35192:13;:11;:13::i;:::-;-1:-1:-1;;;;;36301:22:0;::::1;36293:73;;;::::0;-1:-1:-1;;;36293:73:0;;10487:2:1;36293:73:0::1;::::0;::::1;10469:21:1::0;10526:2;10506:18;;;10499:30;10565:34;10545:18;;;10538:62;-1:-1:-1;;;10616:18:1;;;10609:36;10662:19;;36293:73:0::1;10285:402:1::0;36293:73:0::1;36377:28;36396:8;36377:18;:28::i;35471:132::-:0;35379:6;;-1:-1:-1;;;;;35379:6:0;4324:10;35535:23;35527:68;;;;-1:-1:-1;;;35527:68:0;;10894:2:1;35527:68:0;;;10876:21:1;;;10913:18;;;10906:30;10972:34;10952:18;;;10945:62;11024:18;;35527:68:0;10692:356:1;46170:117:0;46233:7;46260:19;46268:3;41470:18;;41387:109;15202:380;-1:-1:-1;;;;;15338:19:0;;15330:68;;;;-1:-1:-1;;;15330:68:0;;11255:2:1;15330:68:0;;;11237:21:1;11294:2;11274:18;;;11267:30;11333:34;11313:18;;;11306:62;-1:-1:-1;;;11384:18:1;;;11377:34;11428:19;;15330:68:0;11053:400:1;15330:68:0;-1:-1:-1;;;;;15417:21:0;;15409:68;;;;-1:-1:-1;;;15409:68:0;;11660:2:1;15409:68:0;;;11642:21:1;11699:2;11679:18;;;11672:30;11738:34;11718:18;;;11711:62;-1:-1:-1;;;11789:18:1;;;11782:32;11831:19;;15409:68:0;11458:398:1;15409:68:0;-1:-1:-1;;;;;15490:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;15542:32;;160:25:1;;;15542:32:0;;133:18:1;15542:32:0;;;;;;;15202:380;;;:::o;15873:453::-;16008:24;16035:25;16045:5;16052:7;16035:9;:25::i;:::-;16008:52;;-1:-1:-1;;16075:16:0;:37;16071:248;;16157:6;16137:16;:26;;16129:68;;;;-1:-1:-1;;;16129:68:0;;12063:2:1;16129:68:0;;;12045:21:1;12102:2;12082:18;;;12075:30;12141:31;12121:18;;;12114:59;12190:18;;16129:68:0;11861:353:1;16129:68:0;16241:51;16250:5;16257:7;16285:6;16266:16;:25;16241:8;:51::i;:::-;15997:329;15873:453;;;:::o;59182:1143::-;59297:6;;59276:4;;-1:-1:-1;;;59297:6:0;;;;59293:101;;;59320:36;59330:6;59338:9;59349:6;59320:9;:36::i;:::-;-1:-1:-1;59378:4:0;59371:11;;59293:101;-1:-1:-1;;;;;59409:35:0;;;;;;:27;:35;;;;;;;;59404:112;;64401:10;;59461:43;;;;-1:-1:-1;;;59461:43:0;;12421:2:1;59461:43:0;;;12403:21:1;12460:2;12440:18;;;12433:30;-1:-1:-1;;;12479:18:1;;;12472:50;12539:18;;59461:43:0;12219:344:1;59461:43:0;-1:-1:-1;;;;;59551:19:0;;59528:18;59551:19;;;:11;:19;;;;;;;;59550:20;:47;;;;-1:-1:-1;;;;;;59575:22:0;;;;;;:11;:22;;;;;;;;59574:23;59550:47;59549:63;;;;-1:-1:-1;64401:10:0;;:15;;59602:10;59528:84;-1:-1:-1;59623:9:0;59663:6;59696:9;59722:14;59663:6;59722;:14::i;:::-;59718:234;;;-1:-1:-1;59760:1:0;;-1:-1:-1;59784:9:0;;-1:-1:-1;59816:6:0;59718:234;;;59844:17;59851:9;59844:6;:17::i;:::-;59840:112;;;59885:1;59878:8;;59840:112;;;59935:5;59919:21;;59840:112;59968:16;:14;:16::i;:::-;59964:59;;;60001:10;:8;:10::i;:::-;60035:22;60060:13;:48;;60102:6;60060:48;;;60076:23;60084:6;60092;60076:7;:23::i;:::-;60035:73;;60119:44;60129:6;60137:9;60148:14;60119:9;:44::i;:::-;60180:8;;60176:120;;60210:74;60216:5;60223;60230:6;60238:4;60244:22;:20;:22::i;:::-;60210:74;;;-1:-1:-1;;;;;12911:15:1;;;12893:34;;12963:15;;;;12958:2;12943:18;;12936:43;12995:18;;;12988:34;;;;13053:2;13038:18;;13031:34;13096:3;13081:19;;13074:35;60268:15:0;12873:3:1;13125:19;;13118:35;12842:3;12827:19;60210:74:0;;;;;;;60176:120;-1:-1:-1;60313:4:0;;59182:1143;-1:-1:-1;;;;;;;;59182:1143:0:o;30285:211::-;30429:58;;;-1:-1:-1;;;;;6956:32:1;;30429:58:0;;;6938:51:1;7005:18;;;;6998:34;;;30429:58:0;;;;;;;;;;6911:18:1;;;;30429:58:0;;;;;;;;-1:-1:-1;;;;;30429:58:0;-1:-1:-1;;;30429:58:0;;;30402:86;;30422:5;;30402:19;:86::i;:::-;30285:211;;;:::o;45345:152::-;45415:4;45439:50;45444:3;-1:-1:-1;;;;;45464:23:0;;45439:4;:50::i;36573:191::-;36666:6;;;-1:-1:-1;;;;;36683:17:0;;;-1:-1:-1;;;;;;36683:17:0;;;;;;;36716:40;;36666:6;;;36683:17;36666:6;;36716:40;;36647:16;;36716:40;36636:128;36573:191;:::o;60515:2481::-;56802:6;:13;;-1:-1:-1;;;;56802:13:0;-1:-1:-1;;;56802:13:0;;;60602:4:::1;-1:-1:-1::0;7990:18:0;;;;;;;;;;;60564:44:::1;;60629:55;60646:4;60661:10;60674:9;60629:8;:55::i;:::-;60697:24;60749:8;;60737:7;;60725:9;:19;;;;:::i;:::-;60724:34;;;;:::i;:::-;60697:61;;60769:22;60824:8;;60807:12;;60795:9;:24;;;;:::i;:::-;60794:39;;;;:::i;:::-;60769:64;;60844:25;60898:8;;60885;;60873:9;:20;;;;:::i;:::-;60872:35;;;;:::i;:::-;60844:63;;60918:23;60968:8;;60957:6;;60945:9;:18;;;;:::i;:::-;60944:33;;;;:::i;:::-;60918:59:::0;-1:-1:-1;60990:29:0::1;61003:16:::0;60990:29;::::1;:::i;:::-;::::0;-1:-1:-1;61030:27:0::1;61043:14:::0;60990:29;61030:27:::1;:::i;:::-;::::0;-1:-1:-1;61068:30:0::1;61081:17:::0;61030:27;61068:30:::1;:::i;:::-;::::0;-1:-1:-1;61109:28:0::1;61122:15:::0;61068:30;61109:28:::1;:::i;:::-;61182:16;::::0;;61196:1:::1;61182:16:::0;;;;;::::1;::::0;;;61109:28;;-1:-1:-1;61158:21:0::1;::::0;61182:16;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;61182:16:0::1;61158:40;;61227:4;61209;61214:1;61209:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1::0;;;;;61209:23:0::1;;;-1:-1:-1::0;;;;;61209:23:0::1;;;::::0;::::1;61261:4;61243;61248:1;61243:7;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;61243:23:0;;::::1;:7;::::0;;::::1;::::0;;;;;:23;61295:9:::1;::::0;61277:7;;61295:9;::::1;::::0;61277:4;;61282:1:::1;::::0;61277:7;::::1;;;;;:::i;:::-;-1:-1:-1::0;;;;;61277:28:0;;::::1;:7;::::0;;::::1;::::0;;;;;:28;61373:9:::1;::::0;:34:::1;::::0;-1:-1:-1;;;61373:34:0;;61401:4:::1;61373:34;::::0;::::1;3889:51:1::0;61318:12:0::1;::::0;;;61373:9:::1;::::0;:19:::1;::::0;3862:18:1;;61373:34:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61424:128;::::0;-1:-1:-1;;;61424:128:0;;61349:58;;-1:-1:-1;;;;;;61424:10:0::1;:64;::::0;::::1;::::0;:128:::1;::::0;61489:9;;61500:1:::1;::::0;61503:4;;61517::::1;::::0;61500:1;;61536:15:::1;::::0;61424:128:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;61420:399;;61619:116;::::0;-1:-1:-1;;;61619:116:0;;-1:-1:-1;;;;;61619:10:0::1;:64;::::0;::::1;::::0;:116:::1;::::0;61684:9;;61695:1:::1;::::0;61698:4;;61712::::1;::::0;61719:15:::1;::::0;61619:116:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;61615:193:::0;::::1;;61765:4;61755:14;;61615:193;61420:399;;;61577:4;61567:14;;61420:399;61836:7;61831:47;;61860:7;;;;;;;;;;61831:47;61890:48;61908:4;57817:42;61921:16;61890:9;:48::i;:::-;61982:11;::::0;61949:65:::1;::::0;61967:4:::1;::::0;-1:-1:-1;;;;;61982:11:0::1;61996:17:::0;61949:9:::1;:65::i;:::-;62058:8;::::0;62025:60:::1;::::0;62043:4:::1;::::0;-1:-1:-1;;;;;62058:8:0::1;62069:15:::0;62025:9:::1;:60::i;:::-;62124:9;::::0;:34:::1;::::0;-1:-1:-1;;;62124:34:0;;62152:4:::1;62124:34;::::0;::::1;3889:51:1::0;62098:23:0::1;::::0;62161:13;;-1:-1:-1;;;;;62124:9:0;;::::1;::::0;:19:::1;::::0;3862:18:1;;62124:34:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:50;;;;:::i;:::-;62098:76;;62185:25;62260:6;;62249:8;;62234:12;;62224:7;;62213:8;;:18;;;;:::i;:::-;:33;;;;:::i;:::-;:44;;;;:::i;:::-;:53;;;;:::i;:::-;62185:81;;62277:27;62338:17;62326:7;;62308:15;:25;;;;:::i;:::-;62307:49;;;;:::i;:::-;62277:79;;62367:27;62428:17;62416:7;;62398:15;:25;;;;:::i;:::-;62397:49;;;;:::i;:::-;62367:79:::0;-1:-1:-1;62457:26:0::1;62367:79:::0;62486:37:::1;62504:19:::0;62486:15;:37:::1;:::i;:::-;:59;;;;:::i;:::-;62558:9;::::0;62577:10:::1;::::0;62558:51:::1;::::0;-1:-1:-1;;;62558:51:0;;-1:-1:-1;;;;;62577:10:0;;::::1;62558:51;::::0;::::1;6938::1::0;7005:18;;;6998:34;;;62457:88:0;;-1:-1:-1;62558:9:0::1;::::0;:18:::1;::::0;6911::1;;62558:51:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;62620:9:0::1;::::0;62639:10:::1;::::0;62620:51:::1;::::0;-1:-1:-1;;;62620:51:0;;-1:-1:-1;;;;;62639:10:0;;::::1;62620:51;::::0;::::1;6938::1::0;7005:18;;;6998:34;;;62620:9:0;::::1;::::0;:18:::1;::::0;6911::1;;62620:51:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;62682:9:0::1;::::0;62701::::1;::::0;62682:49:::1;::::0;-1:-1:-1;;;62682:49:0;;-1:-1:-1;;;;;62701:9:0;;::::1;62682:49;::::0;::::1;6938:51:1::0;7005:18;;;6998:34;;;62682:9:0;::::1;::::0;:18:::1;::::0;6911::1;;62682:49:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;62748:19:0::1;::::0;-1:-1:-1;;;62748:19:0;::::1;;;62744:62;;;62784:10;:8;:10::i;:::-;62831:157;::::0;;15776:25:1;;;15832:2;15817:18;;15810:34;;;15860:18;;;15853:34;;;15918:2;15903:18;;15896:34;;;15961:3;15946:19;;15939:35;;;16005:3;15990:19;;15983:35;;;16049:3;16034:19;;16027:35;;;62972:15:0::1;16093:3:1::0;16078:19;;16071:35;62831:157:0::1;::::0;15763:3:1;15748:19;62831:157:0::1;;;;;;;60553:2443;;;;;;;;;;;;;56826:1;56838:6:::0;:14;;-1:-1:-1;;;;56838:14:0;;;60515:2481::o;45673:158::-;45746:4;45770:53;45778:3;-1:-1:-1;;;;;45798:23:0;;45770:7;:53::i;46641:158::-;46715:7;46766:22;46770:3;46782:5;46766:3;:22::i;45917:167::-;-1:-1:-1;;;;;46051:23:0;;45997:4;41269:19;;;:12;;;:19;;;;;;:24;;46021:55;41172:129;12081:840;-1:-1:-1;;;;;12212:18:0;;12204:68;;;;-1:-1:-1;;;12204:68:0;;16319:2:1;12204:68:0;;;16301:21:1;16358:2;16338:18;;;16331:30;16397:34;16377:18;;;16370:62;-1:-1:-1;;;16448:18:1;;;16441:35;16493:19;;12204:68:0;16117:401:1;12204:68:0;-1:-1:-1;;;;;12291:16:0;;12283:64;;;;-1:-1:-1;;;12283:64:0;;16725:2:1;12283:64:0;;;16707:21:1;16764:2;16744:18;;;16737:30;16803:34;16783:18;;;16776:62;-1:-1:-1;;;16854:18:1;;;16847:33;16897:19;;12283:64:0;16523:399:1;12283:64:0;-1:-1:-1;;;;;12433:15:0;;12411:19;12433:15;;;;;;;;;;;12467:21;;;;12459:72;;;;-1:-1:-1;;;12459:72:0;;17129:2:1;12459:72:0;;;17111:21:1;17168:2;17148:18;;;17141:30;17207:34;17187:18;;;17180:62;-1:-1:-1;;;17258:18:1;;;17251:36;17304:19;;12459:72:0;16927:402:1;12459:72:0;-1:-1:-1;;;;;12567:15:0;;;:9;:15;;;;;;;;;;;12585:20;;;12567:38;;12785:13;;;;;;;;;;:23;;;;;;12837:26;;160:25:1;;;12785:13:0;;12837:26;;133:18:1;12837:26:0;;;;;;;12876:37;30285:211;60333:174;60407:6;;60382:4;;-1:-1:-1;;;60407:6:0;;;;60406:7;:22;;;;-1:-1:-1;60417:11:0;;-1:-1:-1;;;60417:11:0;;;;60406:22;:36;;;;-1:-1:-1;64401:10:0;;:15;;60432:10;60406:68;;;;-1:-1:-1;60464:4:0;60473:1;7990:18;;;;;;;;;;;60446:28;60406:68;:93;;;;-1:-1:-1;60479:20:0;4324:10;67263:110;:::i;60479:20::-;60478:21;60399:100;;60333:174;:::o;64432:241::-;64499:7;64519:17;64561:14;;64549:8;;64540:6;:17;;;;:::i;:::-;64539:36;;;;:::i;:::-;64519:56;;64586:43;64596:6;64612:4;64619:9;64586;:43::i;:::-;64647:18;64656:9;64647:6;:18;:::i;:::-;64640:25;64432:241;-1:-1:-1;;;;64432:241:0:o;33352:716::-;33776:23;33802:69;33830:4;33802:69;;;;;;;;;;;;;;;;;33810:5;-1:-1:-1;;;;;33802:27:0;;;:69;;;;;:::i;:::-;33886:17;;33776:95;;-1:-1:-1;33886:21:0;33882:179;;33983:10;33972:30;;;;;;;;;;;;:::i;:::-;33964:85;;;;-1:-1:-1;;;33964:85:0;;17536:2:1;33964:85:0;;;17518:21:1;17575:2;17555:18;;;17548:30;17614:34;17594:18;;;17587:62;-1:-1:-1;;;17665:18:1;;;17658:40;17715:19;;33964:85:0;17334:406:1;39076:414:0;39139:4;41269:19;;;:12;;;:19;;;;;;39156:327;;-1:-1:-1;39199:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;39382:18;;39360:19;;;:12;;;:19;;;;;;:40;;;;39415:11;;39156:327;-1:-1:-1;39466:5:0;39459:12;;63004:946;63071:16;;;63085:1;63071:16;;;;;;;;63044:24;;63071:16;;;;;;;;;;-1:-1:-1;63071:16:0;63044:43;;63119:4;63098:7;63106:1;63098:10;;;;;;;;:::i;:::-;;;;;;:26;-1:-1:-1;;;;;63098:26:0;;;-1:-1:-1;;;;;63098:26:0;;;;;63156:4;63135:7;63143:1;63135:10;;;;;;;;:::i;:::-;-1:-1:-1;;;;;63135:26:0;;;;:10;;;;;;;;;;:26;63214:4;63174:19;7990:18;;;;;;;;;;;;63248:15;63262:1;7990:18;63248:15;:::i;:::-;63233:30;;63284:4;63277;:11;63274:23;;;63290:7;;;63004:946::o;63274:23::-;63402:122;;-1:-1:-1;;;63402:122:0;;63335:21;;63309:23;;-1:-1:-1;;;;;63402:10:0;:61;;;;:122;;63464:4;;63309:23;;63473:7;;63490:4;;63309:23;;63508:15;;63402:122;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63398:373;;63591:111;;-1:-1:-1;;;63591:111:0;;-1:-1:-1;;;;;63591:10:0;:61;;;;:111;;63653:4;;63659:1;;63662:7;;63679:4;;63686:15;;63591:111;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63587:173;;;-1:-1:-1;63731:4:0;63587:173;63398:373;;;-1:-1:-1;63549:4:0;63398:373;63786:7;63781:47;;63810:7;;;;;63004:946::o;63781:47::-;63840:17;63860:39;63884:15;63860:21;:39;:::i;:::-;63840:59;;63912:30;63926:4;63932:9;63912:13;:30::i;:::-;63033:917;;;;;;63004:946::o;39666:1420::-;39732:4;39871:19;;;:12;;;:19;;;;;;39907:15;;39903:1176;;40282:21;40306:14;40319:1;40306:10;:14;:::i;:::-;40355:18;;40282:38;;-1:-1:-1;40335:17:0;;40355:22;;40376:1;;40355:22;:::i;:::-;40335:42;;40411:13;40398:9;:26;40394:405;;40445:17;40465:3;:11;;40477:9;40465:22;;;;;;;;:::i;:::-;;;;;;;;;40445:42;;40619:9;40590:3;:11;;40602:13;40590:26;;;;;;;;:::i;:::-;;;;;;;;;;;;:38;;;;40704:23;;;:12;;;:23;;;;;:36;;;40394:405;40880:17;;:3;;:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;40975:3;:12;;:19;40988:5;40975:19;;;;;;;;;;;40968:26;;;41018:4;41011:11;;;;;;;39903:1176;41062:5;41055:12;;;;;41850:120;41917:7;41944:3;:11;;41956:5;41944:18;;;;;;;;:::i;:::-;;;;;;;;;41937:25;;41850:120;;;;:::o;24137:229::-;24274:12;24306:52;24328:6;24336:4;24342:1;24345:12;24306:21;:52::i;63958:368::-;64043:57;64060:4;64075:10;64088:11;64043:8;:57::i;:::-;64117:107;;-1:-1:-1;;;64117:107:0;;64170:4;64117:107;;;18218:34:1;18268:18;;;18261:34;;;64190:1:0;18311:18:1;;;18304:34;;;18354:18;;;18347:34;;;18397:19;;;18390:44;64208:15:0;18450:19:1;;;18443:35;64117:10:0;-1:-1:-1;;;;;64117:26:0;;;;64151:9;;18152:19:1;;64117:107:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;64117:107:0;;;;;;;;-1:-1:-1;;64117:107:0;;;;;;;;;;;;:::i;:::-;;;64113:206;;;-1:-1:-1;;64245:53:0;;;19002:25:1;;;19058:2;19043:18;;19036:34;;;64282:15:0;19086:18:1;;;19079:34;64245:53:0;;;;-1:-1:-1;64245:53:0;;;;18990:2:1;64245:53:0;;;63958:368;;:::o;25257:455::-;25427:12;25485:5;25460:21;:30;;25452:81;;;;-1:-1:-1;;;25452:81:0;;19326:2:1;25452:81:0;;;19308:21:1;19365:2;19345:18;;;19338:30;19404:34;19384:18;;;19377:62;-1:-1:-1;;;19455:18:1;;;19448:36;19501:19;;25452:81:0;19124:402:1;25452:81:0;25545:12;25559:23;25586:6;-1:-1:-1;;;;;25586:11:0;25605:5;25612:4;25586:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25544:73;;;;25635:69;25662:6;25670:7;25679:10;25691:12;25635:26;:69::i;:::-;25628:76;25257:455;-1:-1:-1;;;;;;;25257:455:0:o;27830:644::-;28015:12;28044:7;28040:427;;;28072:10;:17;28093:1;28072:22;28068:290;;-1:-1:-1;;;;;21675:19:0;;;28282:60;;;;-1:-1:-1;;;28282:60:0;;19733:2:1;28282:60:0;;;19715:21:1;19772:2;19752:18;;;19745:30;19811:31;19791:18;;;19784:59;19860:18;;28282:60:0;19531:353:1;28282:60:0;-1:-1:-1;28379:10:0;28372:17;;28040:427;28422:33;28430:10;28442:12;29177:17;;:21;29173:388;;29409:10;29403:17;29466:15;29453:10;29449:2;29445:19;29438:44;29173:388;29536:12;29529:20;;-1:-1:-1;;;29529:20:0;;;;;;;;:::i;196:250:1:-;281:1;291:113;305:6;302:1;299:13;291:113;;;381:11;;;375:18;362:11;;;355:39;327:2;320:10;291:113;;;-1:-1:-1;;438:1:1;420:16;;413:27;196:250::o;451:396::-;600:2;589:9;582:21;563:4;632:6;626:13;675:6;670:2;659:9;655:18;648:34;691:79;763:6;758:2;747:9;743:18;738:2;730:6;726:15;691:79;:::i;:::-;831:2;810:15;-1:-1:-1;;806:29:1;791:45;;;;838:2;787:54;;451:396;-1:-1:-1;;451:396:1:o;852:131::-;-1:-1:-1;;;;;927:31:1;;917:42;;907:70;;973:1;970;963:12;988:315;1056:6;1064;1117:2;1105:9;1096:7;1092:23;1088:32;1085:52;;;1133:1;1130;1123:12;1085:52;1172:9;1159:23;1191:31;1216:5;1191:31;:::i;:::-;1241:5;1293:2;1278:18;;;;1265:32;;-1:-1:-1;;;988:315:1:o;1500:813::-;1595:6;1603;1611;1619;1627;1680:3;1668:9;1659:7;1655:23;1651:33;1648:53;;;1697:1;1694;1687:12;1648:53;1736:9;1723:23;1755:31;1780:5;1755:31;:::i;:::-;1805:5;-1:-1:-1;1862:2:1;1847:18;;1834:32;1875:33;1834:32;1875:33;:::i;:::-;1927:7;-1:-1:-1;1986:2:1;1971:18;;1958:32;1999:33;1958:32;1999:33;:::i;:::-;2051:7;-1:-1:-1;2110:2:1;2095:18;;2082:32;2123:33;2082:32;2123:33;:::i;:::-;2175:7;-1:-1:-1;2234:3:1;2219:19;;2206:33;2248;2206;2248;:::i;:::-;2300:7;2290:17;;;1500:813;;;;;;;;:::o;2318:456::-;2395:6;2403;2411;2464:2;2452:9;2443:7;2439:23;2435:32;2432:52;;;2480:1;2477;2470:12;2432:52;2519:9;2506:23;2538:31;2563:5;2538:31;:::i;:::-;2588:5;-1:-1:-1;2645:2:1;2630:18;;2617:32;2658:33;2617:32;2658:33;:::i;:::-;2318:456;;2710:7;;-1:-1:-1;;;2764:2:1;2749:18;;;;2736:32;;2318:456::o;2968:247::-;3027:6;3080:2;3068:9;3059:7;3055:23;3051:32;3048:52;;;3096:1;3093;3086:12;3048:52;3135:9;3122:23;3154:31;3179:5;3154:31;:::i;3220:118::-;3306:5;3299:13;3292:21;3285:5;3282:32;3272:60;;3328:1;3325;3318:12;3343:382;3408:6;3416;3469:2;3457:9;3448:7;3444:23;3440:32;3437:52;;;3485:1;3482;3475:12;3437:52;3524:9;3511:23;3543:31;3568:5;3543:31;:::i;:::-;3593:5;-1:-1:-1;3650:2:1;3635:18;;3622:32;3663:30;3622:32;3663:30;:::i;:::-;3712:7;3702:17;;;3343:382;;;;;:::o;4159:241::-;4215:6;4268:2;4256:9;4247:7;4243:23;4239:32;4236:52;;;4284:1;4281;4274:12;4236:52;4323:9;4310:23;4342:28;4364:5;4342:28;:::i;4405:180::-;4464:6;4517:2;4505:9;4496:7;4492:23;4488:32;4485:52;;;4533:1;4530;4523:12;4485:52;-1:-1:-1;4556:23:1;;4405:180;-1:-1:-1;4405:180:1:o;4590:592::-;4703:6;4711;4719;4727;4735;4743;4751;4804:3;4792:9;4783:7;4779:23;4775:33;4772:53;;;4821:1;4818;4811:12;4772:53;-1:-1:-1;;4844:23:1;;;4914:2;4899:18;;4886:32;;-1:-1:-1;4965:2:1;4950:18;;4937:32;;5016:2;5001:18;;4988:32;;-1:-1:-1;5067:3:1;5052:19;;5039:33;;-1:-1:-1;5119:3:1;5104:19;;5091:33;;-1:-1:-1;5171:3:1;5156:19;5143:33;;-1:-1:-1;4590:592:1;-1:-1:-1;4590:592:1:o;5187:388::-;5255:6;5263;5316:2;5304:9;5295:7;5291:23;5287:32;5284:52;;;5332:1;5329;5322:12;5284:52;5371:9;5358:23;5390:31;5415:5;5390:31;:::i;:::-;5440:5;-1:-1:-1;5497:2:1;5482:18;;5469:32;5510:33;5469:32;5510:33;:::i;5925:380::-;6004:1;6000:12;;;;6047;;;6068:61;;6122:4;6114:6;6110:17;6100:27;;6068:61;6175:2;6167:6;6164:14;6144:18;6141:38;6138:161;;6221:10;6216:3;6212:20;6209:1;6202:31;6256:4;6253:1;6246:15;6284:4;6281:1;6274:15;6138:161;;5925:380;;;:::o;6310:127::-;6371:10;6366:3;6362:20;6359:1;6352:31;6402:4;6399:1;6392:15;6426:4;6423:1;6416:15;6442:128;6509:9;;;6530:11;;;6527:37;;;6544:18;;:::i;6575:184::-;6645:6;6698:2;6686:9;6677:7;6673:23;6669:32;6666:52;;;6714:1;6711;6704:12;6666:52;-1:-1:-1;6737:16:1;;6575:184;-1:-1:-1;6575:184:1:o;7043:245::-;7110:6;7163:2;7151:9;7142:7;7138:23;7134:32;7131:52;;;7179:1;7176;7169:12;7131:52;7211:9;7205:16;7230:28;7252:5;7230:28;:::i;7293:125::-;7358:9;;;7379:10;;;7376:36;;;7392:18;;:::i;8080:251::-;8150:6;8203:2;8191:9;8182:7;8178:23;8174:32;8171:52;;;8219:1;8216;8209:12;8171:52;8251:9;8245:16;8270:31;8295:5;8270:31;:::i;8742:398::-;8944:2;8926:21;;;8983:2;8963:18;;;8956:30;9022:34;9017:2;9002:18;;8995:62;-1:-1:-1;;;9088:2:1;9073:18;;9066:32;9130:3;9115:19;;8742:398::o;9635:287::-;9764:3;9802:6;9796:13;9818:66;9877:6;9872:3;9865:4;9857:6;9853:17;9818:66;:::i;:::-;9900:16;;;;;9635:287;-1:-1:-1;;9635:287:1:o;13164:168::-;13237:9;;;13268;;13285:15;;;13279:22;;13265:37;13255:71;;13306:18;;:::i;13337:217::-;13377:1;13403;13393:132;;13447:10;13442:3;13438:20;13435:1;13428:31;13482:4;13479:1;13472:15;13510:4;13507:1;13500:15;13393:132;-1:-1:-1;13539:9:1;;13337:217::o;13559:127::-;13620:10;13615:3;13611:20;13608:1;13601:31;13651:4;13648:1;13641:15;13675:4;13672:1;13665:15;13691:461;13744:3;13782:5;13776:12;13809:6;13804:3;13797:19;13835:4;13864:2;13859:3;13855:12;13848:19;;13901:2;13894:5;13890:14;13922:1;13932:195;13946:6;13943:1;13940:13;13932:195;;;14011:13;;-1:-1:-1;;;;;14007:39:1;13995:52;;14067:12;;;;14102:15;;;;14043:1;13961:9;13932:195;;;-1:-1:-1;14143:3:1;;13691:461;-1:-1:-1;;;;;13691:461:1:o;14157:684::-;14484:6;14473:9;14466:25;14527:6;14522:2;14511:9;14507:18;14500:34;14570:3;14565:2;14554:9;14550:18;14543:31;14447:4;14591:57;14643:3;14632:9;14628:19;14620:6;14591:57;:::i;:::-;-1:-1:-1;;;;;14722:15:1;;;14717:2;14702:18;;14695:43;14775:15;;;;14769:3;14754:19;;14747:44;14675:3;14807:19;14800:35;14583:65;14157:684;-1:-1:-1;;;;14157:684:1:o;14846:582::-;15145:6;15134:9;15127:25;15188:6;15183:2;15172:9;15168:18;15161:34;15231:3;15226:2;15215:9;15211:18;15204:31;15108:4;15252:57;15304:3;15293:9;15289:19;15281:6;15252:57;:::i;:::-;-1:-1:-1;;;;;15345:32:1;;;;15340:2;15325:18;;15318:60;-1:-1:-1;15409:3:1;15394:19;15387:35;15244:65;14846:582;-1:-1:-1;;;14846:582:1:o;17745:127::-;17806:10;17801:3;17797:20;17794:1;17787:31;17837:4;17834:1;17827:15;17861:4;17858:1;17851:15;18489:306;18577:6;18585;18593;18646:2;18634:9;18625:7;18621:23;18617:32;18614:52;;;18662:1;18659;18652:12;18614:52;18691:9;18685:16;18675:26;;18741:2;18730:9;18726:18;18720:25;18710:35;;18785:2;18774:9;18770:18;18764:25;18754:35;;18489:306;;;;;:::o

Metadata Hash

ipfs://af4a2970ece3987e2e32c00a3776eaffbfc988697a15d741cbac499f1b652c72
Loading