ETH Price: $3,487.05 (+2.01%)

Token

DeFi Girls (DFGIRL)
 

Overview

Max Total Supply

6,765 DFGIRL

Holders

2,175

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
3 DFGIRL
0x9c3196f8c884c2f7cb2bb3c769fff8d7e479cd82
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
DeFiGirls

Compiler Version
v0.8.16+commit.07a7930e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-09-24
*/

// SPDX-License-Identifier: GPL-3.0
/**
*    ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣤⣶⣶⣶⣶⣶⣦⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
*⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢰⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
*⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⢿⣿⣿⡿⣿⣿⣿⣿⣿⣿⣿⣿⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
*⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣰⣿⣿⣿⣿⡇⣿⣷⣿⣿⣿⣿⣿⣿⣯⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
*⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡰⣿⣿⣿⣇⣿⣀⠸⡟⢹⣿⣿⣿⣿⣿⣿⣷⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
*⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⢡⣿⣿⣿⡇⠝⠋⠀⠀⠀⢿⢿⣿⣿⣿⣿⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
*⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠸⢸⠸⣿⣿⣇⠀⠀⠀⠀⠀⠀⠊⣽⣿⣿⣿⠁⣷⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
*⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢿⣿⣿⣷⣄⠀⠀⠀⢠⣴⣿⣿⣿⠋⣠⡏⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
*⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠐⠾⣿⣟⡻⠉⠀⠀⠀⠈⢿⠋⣿⡿⠚⠋⠁⡁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
*⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣴⣶⣾⣿⣿⡄⠀⣳⡶⡦⡀⣿⣿⣷⣶⣤⡾⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
*⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⣿⣿⣿⣿⣿⡆⠀⡇⡿⠉⣺⣿⣿⣿⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
*⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⣿⣿⣿⣿⣯⠽⢲⠇⠣⠐⠚⢻⣿⣿⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
*⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⡐⣾⡏⣷⠀⠀⣼⣷⡧⣿⣿⣦⣄⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀
*⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣻⣿⣿⣿⣿⣿⣮⠳⣿⣇⢈⣿⠟⣬⣿⣿⣿⣿⣿⡦⢄⠀⠀⠀⠀⠀⠀⠀
*⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⢄⣾⣿⣿⣿⣿⣿⣿⣿⣷⣜⢿⣼⢏⣾⣿⣿⣿⢻⣿⣝⣿⣦⡑⢄⠀⠀⠀⠀⠀
*⠀⠀⠀⠀⠀⠀⠀⣠⣶⣷⣿⣿⠃⠘⣿⣿⣿⣿⣿⣿⣿⡷⣥⣿⣿⣿⣿⣿⠀⠹⣿⣿⣿⣷⡀⠀⠀⠀⠀⠀
*⠀⠀⠀⠀⣇⣤⣾⣿⣿⡿⠻⡏⠀⠀⠸⣿⣿⣿⣿⣿⣿⣮⣾⣿⣿⣿⣿⡇⠀⠀⠙⣿⣿⡿⡇⠀⠀⠀⠀⠀
*⠀⠀⢀⡴⣫⣿⣿⣿⠋⠀⠀⡇⠀⠀⢰⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇⠀⠀⠀⢘⣿⣿⣟⢦⡸⠀⠀⠀
*⠀⡰⠋⣴⣿⣟⣿⠃⠀⠀⠀⠈⠀⠀⣸⣿⣿⣿⣿⣿⣿⣇⣽⣿⣿⣿⣿⣇⠀⠀⠀⠁⠸⣿⢻⣦⠉⢆⠀⠀
*⢠⠇⡔⣿⠏⠏⠙⠆⠀⠀⠀⠀⢀⣜⣛⡻⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⡀⠀⠀⠀⠀⡇⡇⠹⣷⡈⡄⠀
*⠀⡸⣴⡏⠀⠀⠀⠀⠀⠀⠀⢀⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣻⣿⣿⣿⣿⣿⣿⡄⠀⠀⠀⡇⡇⠀⢻⡿⡇⠀
*⠀⣿⣿⣆⠀⠀⠀⠀⠀⠀⢀⣼⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡀⠀⣰⠿⠤⠒⡛⢹⣿⠄
*⠀⣿⣷⡆⠁⠀⠀⠀⠀⢠⣿⣿⠟⠻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡟⠻⢷⡀⠀⠀⠀⠀⠀⣸⣿⠀
*⠀⠈⠿⢿⣄⠀⠀⠀⢞⠌⡹⠁⠀⠀⢻⡇⠹⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠁⢳⠀⠀⠁⠀⠀⠀⠀⢠⣿⡏⠀
*⠀⠀⠀⠈⠂⠀⠀⠀⠈⣿⠁⠀⠀⠀⡇⠁⠀⠘⢿⣿⣿⠿⠟⠋⠛⠛⠛⠀⢸⠀⠀⡀⠂⠀⠀⠐⠛⠉⠀⠀
*⠀⠀⠀⠀⠀⠀⠀⠀⠀⠐⠕⣠⡄⣰⡇⠀⠀⠀⢸⣧⠀⠀⠀⠀⠀⠀⠀⢀⣸⠠⡪⠊⠀⠀⠀⠀⠀⠀⠀⠀
*⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⢫⣽⡋⠭⠶⠮⢽⣿⣆⠀⠀⠀⠀⢠⣿⣓⣽⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
*⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣿⣿⢹⣶⣦⣾⣿⣿⣿⡏⠀⠀⠀⠀⠀⠀⠀⠀⠀
*
*        ____       _______    _______      __    
*       / __ \___  / ____(_)  / ____(_)____/ /____
*      / / / / _ \/ /_  / /  / / __/ / ___/ / ___/
*     / /_/ /  __/ __/ / /  / /_/ / / /  / (__  ) 
*    /_____/\___/_/   /_/   \____/_/_/  /_/____/  
*
*    Free Mint, Launched via https://DeFiGirls.io
*               Twitter: @DeFiGirlsNFT           
**/

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v4.7/contracts/security/ReentrancyGuard.sol


// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v4.7/contracts/utils/Strings.sol


// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
    uint8 private constant _ADDRESS_LENGTH = 20;

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v4.7/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v4.7/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v4.7/contracts/utils/Address.sol


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v4.7/contracts/token/ERC721/IERC721Receiver.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v4.7/contracts/utils/introspection/IERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v4.7/contracts/utils/introspection/ERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;


/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v4.7/contracts/token/ERC721/IERC721.sol


// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v4.7/contracts/token/ERC721/extensions/IERC721Enumerable.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v4.7/contracts/token/ERC721/extensions/IERC721Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

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

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v4.7/contracts/token/ERC721/ERC721.sol


// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;








/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: address zero is not a valid owner");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: invalid token ID");
        return owner;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        _requireMinted(tokenId);

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overridden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not token owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        _requireMinted(tokenId);

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved");

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved");
        _safeTransfer(from, to, tokenId, data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);

        _afterTokenTransfer(address(0), to, tokenId);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);

        _afterTokenTransfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits an {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits an {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Reverts if the `tokenId` has not been minted yet.
     */
    function _requireMinted(uint256 tokenId) internal view virtual {
        require(_exists(tokenId), "ERC721: invalid token ID");
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    /// @solidity memory-safe-assembly
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` 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 tokenId
    ) 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.
     * - `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 tokenId
    ) internal virtual {}
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v4.7/contracts/token/ERC721/extensions/ERC721Enumerable.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol)

pragma solidity ^0.8.0;



/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) {
        return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

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

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

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

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

pragma solidity 0.8.16;






contract DeFiGirls is ERC721Enumerable, ReentrancyGuard, Ownable {
    using Strings for uint;

    string public baseURI;

    bool public earlyBirdLive = false;
    bool public publicMintLive = false;
    bool public walletMintingLimits = true;

    uint public constant maxSupply = 6765;
    uint public constant maxInHouseMint = maxSupply / 20;
    uint public inHouseMinted = 0;

    mapping(address => bool) public earlyBirds;
    mapping(address => uint) public walletMints;
    mapping(address => uint) public lastMintBlock;

    event inHouseMintComplete(uint blockNum, uint minted, uint totalInHouseMints);
    event earlyBirdOpen(uint blockNum);
    event publicMintOpen(uint blockNum);
    event earlyBirdSet(address birb, bool status);
    event earlyBirdGroupSet(address[] birbs, bool status);
    event walletMintingLimitsSet(bool status);

    constructor(string memory _uri) ERC721("DeFi Girls", "DFGIRL") { 
        setURI(_uri);
    }

    function inHouseMint(uint _amt) external onlyOwner nonReentrant {
        uint s = totalSupply();
        require(_amt + inHouseMinted < maxInHouseMint, "Maximum in-house mint amount exceeded");
        require(s + _amt < maxSupply, "Max supply reached!");
        for (uint i = 0; i < _amt; i++) {
            _safeMint(msg.sender, s + i);
        }
        inHouseMinted += _amt;
        emit inHouseMintComplete(block.number, _amt, inHouseMinted);
    }

    function mint() public nonReentrant {
        uint s = totalSupply();
        require(s < maxSupply, "Max supply reached!");
        require(tx.origin == msg.sender, "Humans only please!");

        if (!publicMintLive) {
            require(earlyBirdLive, "Early Bird mints not yet live!");
            require(isEarlyBird(msg.sender), "You're not on the Early Bird list!");
            require(walletMints[msg.sender] < 2, "Only two mints per Early Bird during the premint phase!");
        }

        //Not using a require/revert, ensuring there's no un-needed gas exhaustion
        if (walletMintingLimits) {
            if (walletMints[msg.sender] < 3) {
                walletMints[msg.sender]++;
                _safeMint(msg.sender, s);
            }
        } else {
            walletMints[msg.sender]++;
            _safeMint(msg.sender, s);
        }
        
    }

    function setwalletMintingLimits(bool _status) external onlyOwner {
        walletMintingLimits = _status;
        emit walletMintingLimitsSet(_status);
    }

    function setEarlyBird(address _birb, bool _status) external onlyOwner {
        earlyBirds[_birb] = _status;
        emit earlyBirdSet(_birb, _status);
    }

    function setEarlyBirdGroup(address[] memory _birbs, bool _status) external onlyOwner {
        for (uint i = 0; i < _birbs.length; i++) {
            earlyBirds[_birbs[i]] = _status;
        }
        emit earlyBirdGroupSet(_birbs, _status);
    }

    function openEarlyBird() external onlyOwner() {
        earlyBirdLive = true;
        emit earlyBirdOpen(block.number);
    }

    function openPublicMint() external onlyOwner() {
        publicMintLive = true;
        emit publicMintOpen(block.number);
    }

    function _baseURI() internal view virtual override returns (string memory) {
        return baseURI;
    }

    function tokenURI(uint tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "Token ID Does not exist!");
        string memory currentBaseURI = _baseURI();
        return bytes(currentBaseURI).length > 0	? string(abi.encodePacked(currentBaseURI, tokenId.toString())) : "";
    }

    //write metadata
    function setURI(string memory _newBaseURI) public onlyOwner {
        baseURI = _newBaseURI;
    }

    function isEarlyBird(address _birb) public view returns(bool) {
        return earlyBirds[_birb];
    }

    //warning: gassy!
    function tokensOfOwner(address _owner) public view returns (uint256[] memory) {
        uint balance = balanceOf(_owner);
        uint[] memory tokens = new uint[](balance);

        for (uint i=0; i<balance; i++) {
            tokens[i] = tokenOfOwnerByIndex(_owner, i);
        }

        return tokens;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"birbs","type":"address[]"},{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"earlyBirdGroupSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"blockNum","type":"uint256"}],"name":"earlyBirdOpen","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"birb","type":"address"},{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"earlyBirdSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"blockNum","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"minted","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalInHouseMints","type":"uint256"}],"name":"inHouseMintComplete","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"blockNum","type":"uint256"}],"name":"publicMintOpen","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"walletMintingLimitsSet","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"earlyBirdLive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"earlyBirds","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amt","type":"uint256"}],"name":"inHouseMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"inHouseMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_birb","type":"address"}],"name":"isEarlyBird","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastMintBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxInHouseMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openEarlyBird","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"openPublicMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMintLive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_birb","type":"address"},{"internalType":"bool","name":"_status","type":"bool"}],"name":"setEarlyBird","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_birbs","type":"address[]"},{"internalType":"bool","name":"_status","type":"bool"}],"name":"setEarlyBirdGroup","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_status","type":"bool"}],"name":"setwalletMintingLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"walletMintingLimits","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"walletMints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

60806040526000600d60006101000a81548160ff0219169083151502179055506000600d60016101000a81548160ff0219169083151502179055506001600d60026101000a81548160ff0219169083151502179055506000600e553480156200006757600080fd5b50604051620051303803806200513083398181016040528101906200008d9190620004a0565b6040518060400160405280600a81526020017f44654669204769726c73000000000000000000000000000000000000000000008152506040518060400160405280600681526020017f44464749524c000000000000000000000000000000000000000000000000000081525081600090816200010a91906200073c565b5080600190816200011c91906200073c565b5050506001600a81905550620001476200013b6200015f60201b60201c565b6200016760201b60201c565b62000158816200022d60201b60201c565b50620008a6565b600033905090565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200023d6200025260201b60201c565b80600c90816200024e91906200073c565b5050565b620002626200015f60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1662000288620002e360201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620002e1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002d89062000884565b60405180910390fd5b565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b62000376826200032b565b810181811067ffffffffffffffff821117156200039857620003976200033c565b5b80604052505050565b6000620003ad6200030d565b9050620003bb82826200036b565b919050565b600067ffffffffffffffff821115620003de57620003dd6200033c565b5b620003e9826200032b565b9050602081019050919050565b60005b8381101562000416578082015181840152602081019050620003f9565b60008484015250505050565b6000620004396200043384620003c0565b620003a1565b90508281526020810184848401111562000458576200045762000326565b5b62000465848285620003f6565b509392505050565b600082601f83011262000485576200048462000321565b5b81516200049784826020860162000422565b91505092915050565b600060208284031215620004b957620004b862000317565b5b600082015167ffffffffffffffff811115620004da57620004d96200031c565b5b620004e8848285016200046d565b91505092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200054457607f821691505b6020821081036200055a5762000559620004fc565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620005c47fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000585565b620005d0868362000585565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200061d620006176200061184620005e8565b620005f2565b620005e8565b9050919050565b6000819050919050565b6200063983620005fc565b62000651620006488262000624565b84845462000592565b825550505050565b600090565b6200066862000659565b620006758184846200062e565b505050565b5b818110156200069d57620006916000826200065e565b6001810190506200067b565b5050565b601f821115620006ec57620006b68162000560565b620006c18462000575565b81016020851015620006d1578190505b620006e9620006e08562000575565b8301826200067a565b50505b505050565b600082821c905092915050565b60006200071160001984600802620006f1565b1980831691505092915050565b60006200072c8383620006fe565b9150826002028217905092915050565b6200074782620004f1565b67ffffffffffffffff8111156200076357620007626200033c565b5b6200076f82546200052b565b6200077c828285620006a1565b600060209050601f831160018114620007b457600084156200079f578287015190505b620007ab85826200071e565b8655506200081b565b601f198416620007c48662000560565b60005b82811015620007ee57848901518255600182019150602085019450602081019050620007c7565b868310156200080e57848901516200080a601f891682620006fe565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006200086c60208362000823565b9150620008798262000834565b602082019050919050565b600060208201905081810360008301526200089f816200085d565b9050919050565b61487a80620008b66000396000f3fe608060405234801561001057600080fd5b506004361061023d5760003560e01c80636c0360eb1161013b578063a22cb465116100b8578063caf349b51161007c578063caf349b5146106a0578063d5abeb01146106be578063e985e9c5146106dc578063f0293fd31461070c578063f2fde38b1461073c5761023d565b8063a22cb465146105fe578063a32e9bc71461061a578063ad3fefb614610636578063b88d4fde14610654578063c87b56dd146106705761023d565b8063891c0075116100ff578063891c0075146105445780638b185b35146105625780638da5cb5b14610592578063911806f0146105b057806395d89b41146105e05761023d565b80636c0360eb1461048c57806370a08231146104aa578063715018a6146104da57806375549490146104e45780638462151c146105145761023d565b806327c7dde7116101c95780634f6ccce71161018d5780634f6ccce7146103d657806356b7dd59146104065780635b2ce4f1146104245780636352211e146104405780636aa0aae7146104705761023d565b806327c7dde7146103585780632f745c591461037657806342842e0e146103a657806345d2dcd6146103c257806345f7e06e146103cc5761023d565b8063095ea7b311610210578063095ea7b3146102dc5780630d9eaa8c146102f85780631249c58b1461031457806318160ddd1461031e57806323b872dd1461033c5761023d565b806301ffc9a71461024257806302fe53051461027257806306fdde031461028e578063081812fc146102ac575b600080fd5b61025c60048036038101906102579190612cfc565b610758565b6040516102699190612d44565b60405180910390f35b61028c60048036038101906102879190612ea5565b6107d2565b005b6102966107ed565b6040516102a39190612f6d565b60405180910390f35b6102c660048036038101906102c19190612fc5565b61087f565b6040516102d39190613033565b60405180910390f35b6102f660048036038101906102f1919061307a565b6108c5565b005b610312600480360381019061030d9190612fc5565b6109dc565b005b61031c610b7f565b005b610326610ee5565b60405161033391906130c9565b60405180910390f35b610356600480360381019061035191906130e4565b610ef2565b005b610360610f52565b60405161036d9190612d44565b60405180910390f35b610390600480360381019061038b919061307a565b610f65565b60405161039d91906130c9565b60405180910390f35b6103c060048036038101906103bb91906130e4565b61100a565b005b6103ca61102a565b005b6103d4611086565b005b6103f060048036038101906103eb9190612fc5565b6110e2565b6040516103fd91906130c9565b60405180910390f35b61040e611153565b60405161041b9190612d44565b60405180910390f35b61043e6004803603810190610439919061322b565b611166565b005b61045a60048036038101906104559190612fc5565b61123c565b6040516104679190613033565b60405180910390f35b61048a60048036038101906104859190613287565b6112ed565b005b610494611349565b6040516104a19190612f6d565b60405180910390f35b6104c460048036038101906104bf91906132b4565b6113d7565b6040516104d191906130c9565b60405180910390f35b6104e261148e565b005b6104fe60048036038101906104f991906132b4565b6114a2565b60405161050b9190612d44565b60405180910390f35b61052e600480360381019061052991906132b4565b6114f8565b60405161053b919061339f565b60405180910390f35b61054c6115a6565b60405161055991906130c9565b60405180910390f35b61057c600480360381019061057791906132b4565b6115ac565b60405161058991906130c9565b60405180910390f35b61059a6115c4565b6040516105a79190613033565b60405180910390f35b6105ca60048036038101906105c591906132b4565b6115ee565b6040516105d79190612d44565b60405180910390f35b6105e861160e565b6040516105f59190612f6d565b60405180910390f35b610618600480360381019061061391906133c1565b6116a0565b005b610634600480360381019061062f91906133c1565b6116b6565b005b61063e611752565b60405161064b9190612d44565b60405180910390f35b61066e600480360381019061066991906134a2565b611765565b005b61068a60048036038101906106859190612fc5565b6117c7565b6040516106979190612f6d565b60405180910390f35b6106a861186e565b6040516106b591906130c9565b60405180910390f35b6106c6611880565b6040516106d391906130c9565b60405180910390f35b6106f660048036038101906106f19190613525565b611886565b6040516107039190612d44565b60405180910390f35b610726600480360381019061072191906132b4565b61191a565b60405161073391906130c9565b60405180910390f35b610756600480360381019061075191906132b4565b611932565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107cb57506107ca826119b5565b5b9050919050565b6107da611a97565b80600c90816107e99190613771565b5050565b6060600080546107fc90613594565b80601f016020809104026020016040519081016040528092919081815260200182805461082890613594565b80156108755780601f1061084a57610100808354040283529160200191610875565b820191906000526020600020905b81548152906001019060200180831161085857829003601f168201915b5050505050905090565b600061088a82611b15565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108d08261123c565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610940576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610937906138b5565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661095f611b60565b73ffffffffffffffffffffffffffffffffffffffff16148061098e575061098d81610988611b60565b611886565b5b6109cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c490613947565b60405180910390fd5b6109d78383611b68565b505050565b6109e4611a97565b6002600a5403610a29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a20906139b3565b60405180910390fd5b6002600a819055506000610a3b610ee5565b90506014611a6d610a4c9190613a31565b600e5483610a5a9190613a62565b10610a9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9190613b08565b60405180910390fd5b611a6d8282610aa99190613a62565b10610ae9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae090613b74565b60405180910390fd5b60005b82811015610b1c57610b09338284610b049190613a62565b611c21565b8080610b1490613b94565b915050610aec565b5081600e6000828254610b2f9190613a62565b925050819055507f12b0149b7f4ee0db24c39bac09f66e4935647fe685e79ce1e09beaa80a98d4f04383600e54604051610b6b93929190613bdc565b60405180910390a1506001600a8190555050565b6002600a5403610bc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bbb906139b3565b60405180910390fd5b6002600a819055506000610bd6610ee5565b9050611a6d8110610c1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1390613b74565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614610c8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8190613c5f565b60405180910390fd5b600d60019054906101000a900460ff16610db857600d60009054906101000a900460ff16610ced576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce490613ccb565b60405180910390fd5b610cf6336114a2565b610d35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2c90613d5d565b60405180910390fd5b6002601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410610db7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dae90613def565b60405180910390fd5b5b600d60029054906101000a900460ff1615610e7a576003601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610e7557601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190610e6590613b94565b9190505550610e743382611c21565b5b610eda565b601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190610eca90613b94565b9190505550610ed93382611c21565b5b506001600a81905550565b6000600880549050905090565b610f03610efd611b60565b82611c3f565b610f42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3990613e81565b60405180910390fd5b610f4d838383611cd4565b505050565b600d60019054906101000a900460ff1681565b6000610f70836113d7565b8210610fb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa890613f13565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b61102583838360405180602001604052806000815250611765565b505050565b611032611a97565b6001600d60006101000a81548160ff0219169083151502179055507f8ce3e7c43ac91668b24688614d1d06826293f36cb514e97a7ed14a033deb4e9c4360405161107c91906130c9565b60405180910390a1565b61108e611a97565b6001600d60016101000a81548160ff0219169083151502179055507f85ae28479c6cecaae64dafedce362b84f5d56e54a947fd749e4084e2b99fea75436040516110d891906130c9565b60405180910390a1565b60006110ec610ee5565b821061112d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112490613fa5565b60405180910390fd5b6008828154811061114157611140613fc5565b5b90600052602060002001549050919050565b600d60029054906101000a900460ff1681565b61116e611a97565b60005b82518110156111fe5781600f600085848151811061119257611191613fc5565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806111f690613b94565b915050611171565b507f3430a520f24d8605eea4588aabd6d5e935923126f623c69a6466beeff2d616f082826040516112309291906140b2565b60405180910390a15050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036112e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112db9061412e565b60405180910390fd5b80915050919050565b6112f5611a97565b80600d60026101000a81548160ff0219169083151502179055507fd78c438d1ec98f20a84833d9bb61e4252e293f412c5c788c0773df8c8989c0ce8160405161133e9190612d44565b60405180910390a150565b600c805461135690613594565b80601f016020809104026020016040519081016040528092919081815260200182805461138290613594565b80156113cf5780601f106113a4576101008083540402835291602001916113cf565b820191906000526020600020905b8154815290600101906020018083116113b257829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611447576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143e906141c0565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611496611a97565b6114a06000611f3a565b565b6000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60606000611505836113d7565b905060008167ffffffffffffffff81111561152357611522612d7a565b5b6040519080825280602002602001820160405280156115515781602001602082028036833780820191505090505b50905060005b8281101561159b576115698582610f65565b82828151811061157c5761157b613fc5565b5b602002602001018181525050808061159390613b94565b915050611557565b508092505050919050565b600e5481565b60116020528060005260406000206000915090505481565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600f6020528060005260406000206000915054906101000a900460ff1681565b60606001805461161d90613594565b80601f016020809104026020016040519081016040528092919081815260200182805461164990613594565b80156116965780601f1061166b57610100808354040283529160200191611696565b820191906000526020600020905b81548152906001019060200180831161167957829003601f168201915b5050505050905090565b6116b26116ab611b60565b8383612000565b5050565b6116be611a97565b80600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507fef96c1947c2a0166d1e922ed04e6c6db2129fef5163a2e3b86531c87a799830282826040516117469291906141e0565b60405180910390a15050565b600d60009054906101000a900460ff1681565b611776611770611b60565b83611c3f565b6117b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ac90613e81565b60405180910390fd5b6117c18484848461216c565b50505050565b60606117d2826121c8565b611811576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180890614255565b60405180910390fd5b600061181b612234565b9050600081511161183b5760405180602001604052806000815250611866565b80611845846122c6565b6040516020016118569291906142b1565b6040516020818303038152906040525b915050919050565b6014611a6d61187d9190613a31565b81565b611a6d81565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60106020528060005260406000206000915090505481565b61193a611a97565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036119a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a090614347565b60405180910390fd5b6119b281611f3a565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611a8057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611a905750611a8f82612426565b5b9050919050565b611a9f611b60565b73ffffffffffffffffffffffffffffffffffffffff16611abd6115c4565b73ffffffffffffffffffffffffffffffffffffffff1614611b13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0a906143b3565b60405180910390fd5b565b611b1e816121c8565b611b5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b549061412e565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611bdb8361123c565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b611c3b828260405180602001604052806000815250612490565b5050565b600080611c4b8361123c565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611c8d5750611c8c8185611886565b5b80611ccb57508373ffffffffffffffffffffffffffffffffffffffff16611cb38461087f565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611cf48261123c565b73ffffffffffffffffffffffffffffffffffffffff1614611d4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4190614445565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611db9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db0906144d7565b60405180910390fd5b611dc48383836124eb565b611dcf600082611b68565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e1f91906144f7565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e769190613a62565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611f358383836125fd565b505050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361206e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206590614577565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161215f9190612d44565b60405180910390a3505050565b612177848484611cd4565b61218384848484612602565b6121c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b990614609565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6060600c805461224390613594565b80601f016020809104026020016040519081016040528092919081815260200182805461226f90613594565b80156122bc5780601f10612291576101008083540402835291602001916122bc565b820191906000526020600020905b81548152906001019060200180831161229f57829003601f168201915b5050505050905090565b60606000820361230d576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612421565b600082905060005b6000821461233f57808061232890613b94565b915050600a826123389190613a31565b9150612315565b60008167ffffffffffffffff81111561235b5761235a612d7a565b5b6040519080825280601f01601f19166020018201604052801561238d5781602001600182028036833780820191505090505b5090505b6000851461241a576001826123a691906144f7565b9150600a856123b59190614629565b60306123c19190613a62565b60f81b8183815181106123d7576123d6613fc5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856124139190613a31565b9450612391565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61249a8383612789565b6124a76000848484612602565b6124e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124dd90614609565b60405180910390fd5b505050565b6124f6838383612962565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036125385761253381612967565b612577565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146125765761257583826129b0565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036125b9576125b481612b1d565b6125f8565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146125f7576125f68282612bee565b5b5b505050565b505050565b60006126238473ffffffffffffffffffffffffffffffffffffffff16612c6d565b1561277c578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261264c611b60565b8786866040518563ffffffff1660e01b815260040161266e94939291906146af565b6020604051808303816000875af19250505080156126aa57506040513d601f19601f820116820180604052508101906126a79190614710565b60015b61272c573d80600081146126da576040519150601f19603f3d011682016040523d82523d6000602084013e6126df565b606091505b506000815103612724576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271b90614609565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612781565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036127f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127ef90614789565b60405180910390fd5b612801816121c8565b15612841576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612838906147f5565b60405180910390fd5b61284d600083836124eb565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461289d9190613a62565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461295e600083836125fd565b5050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016129bd846113d7565b6129c791906144f7565b9050600060076000848152602001908152602001600020549050818114612aac576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612b3191906144f7565b9050600060096000848152602001908152602001600020549050600060088381548110612b6157612b60613fc5565b5b906000526020600020015490508060088381548110612b8357612b82613fc5565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612bd257612bd1614815565b5b6001900381819060005260206000200160009055905550505050565b6000612bf9836113d7565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612cd981612ca4565b8114612ce457600080fd5b50565b600081359050612cf681612cd0565b92915050565b600060208284031215612d1257612d11612c9a565b5b6000612d2084828501612ce7565b91505092915050565b60008115159050919050565b612d3e81612d29565b82525050565b6000602082019050612d596000830184612d35565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612db282612d69565b810181811067ffffffffffffffff82111715612dd157612dd0612d7a565b5b80604052505050565b6000612de4612c90565b9050612df08282612da9565b919050565b600067ffffffffffffffff821115612e1057612e0f612d7a565b5b612e1982612d69565b9050602081019050919050565b82818337600083830152505050565b6000612e48612e4384612df5565b612dda565b905082815260208101848484011115612e6457612e63612d64565b5b612e6f848285612e26565b509392505050565b600082601f830112612e8c57612e8b612d5f565b5b8135612e9c848260208601612e35565b91505092915050565b600060208284031215612ebb57612eba612c9a565b5b600082013567ffffffffffffffff811115612ed957612ed8612c9f565b5b612ee584828501612e77565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612f28578082015181840152602081019050612f0d565b60008484015250505050565b6000612f3f82612eee565b612f498185612ef9565b9350612f59818560208601612f0a565b612f6281612d69565b840191505092915050565b60006020820190508181036000830152612f878184612f34565b905092915050565b6000819050919050565b612fa281612f8f565b8114612fad57600080fd5b50565b600081359050612fbf81612f99565b92915050565b600060208284031215612fdb57612fda612c9a565b5b6000612fe984828501612fb0565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061301d82612ff2565b9050919050565b61302d81613012565b82525050565b60006020820190506130486000830184613024565b92915050565b61305781613012565b811461306257600080fd5b50565b6000813590506130748161304e565b92915050565b6000806040838503121561309157613090612c9a565b5b600061309f85828601613065565b92505060206130b085828601612fb0565b9150509250929050565b6130c381612f8f565b82525050565b60006020820190506130de60008301846130ba565b92915050565b6000806000606084860312156130fd576130fc612c9a565b5b600061310b86828701613065565b935050602061311c86828701613065565b925050604061312d86828701612fb0565b9150509250925092565b600067ffffffffffffffff82111561315257613151612d7a565b5b602082029050602081019050919050565b600080fd5b600061317b61317684613137565b612dda565b9050808382526020820190506020840283018581111561319e5761319d613163565b5b835b818110156131c757806131b38882613065565b8452602084019350506020810190506131a0565b5050509392505050565b600082601f8301126131e6576131e5612d5f565b5b81356131f6848260208601613168565b91505092915050565b61320881612d29565b811461321357600080fd5b50565b600081359050613225816131ff565b92915050565b6000806040838503121561324257613241612c9a565b5b600083013567ffffffffffffffff8111156132605761325f612c9f565b5b61326c858286016131d1565b925050602061327d85828601613216565b9150509250929050565b60006020828403121561329d5761329c612c9a565b5b60006132ab84828501613216565b91505092915050565b6000602082840312156132ca576132c9612c9a565b5b60006132d884828501613065565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61331681612f8f565b82525050565b6000613328838361330d565b60208301905092915050565b6000602082019050919050565b600061334c826132e1565b61335681856132ec565b9350613361836132fd565b8060005b83811015613392578151613379888261331c565b975061338483613334565b925050600181019050613365565b5085935050505092915050565b600060208201905081810360008301526133b98184613341565b905092915050565b600080604083850312156133d8576133d7612c9a565b5b60006133e685828601613065565b92505060206133f785828601613216565b9150509250929050565b600067ffffffffffffffff82111561341c5761341b612d7a565b5b61342582612d69565b9050602081019050919050565b600061344561344084613401565b612dda565b90508281526020810184848401111561346157613460612d64565b5b61346c848285612e26565b509392505050565b600082601f83011261348957613488612d5f565b5b8135613499848260208601613432565b91505092915050565b600080600080608085870312156134bc576134bb612c9a565b5b60006134ca87828801613065565b94505060206134db87828801613065565b93505060406134ec87828801612fb0565b925050606085013567ffffffffffffffff81111561350d5761350c612c9f565b5b61351987828801613474565b91505092959194509250565b6000806040838503121561353c5761353b612c9a565b5b600061354a85828601613065565b925050602061355b85828601613065565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806135ac57607f821691505b6020821081036135bf576135be613565565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026136277fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826135ea565b61363186836135ea565b95508019841693508086168417925050509392505050565b6000819050919050565b600061366e61366961366484612f8f565b613649565b612f8f565b9050919050565b6000819050919050565b61368883613653565b61369c61369482613675565b8484546135f7565b825550505050565b600090565b6136b16136a4565b6136bc81848461367f565b505050565b5b818110156136e0576136d56000826136a9565b6001810190506136c2565b5050565b601f821115613725576136f6816135c5565b6136ff846135da565b8101602085101561370e578190505b61372261371a856135da565b8301826136c1565b50505b505050565b600082821c905092915050565b60006137486000198460080261372a565b1980831691505092915050565b60006137618383613737565b9150826002028217905092915050565b61377a82612eee565b67ffffffffffffffff81111561379357613792612d7a565b5b61379d8254613594565b6137a88282856136e4565b600060209050601f8311600181146137db57600084156137c9578287015190505b6137d38582613755565b86555061383b565b601f1984166137e9866135c5565b60005b82811015613811578489015182556001820191506020850194506020810190506137ec565b8683101561382e578489015161382a601f891682613737565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b600061389f602183612ef9565b91506138aa82613843565b604082019050919050565b600060208201905081810360008301526138ce81613892565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b6000613931603e83612ef9565b915061393c826138d5565b604082019050919050565b6000602082019050818103600083015261396081613924565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b600061399d601f83612ef9565b91506139a882613967565b602082019050919050565b600060208201905081810360008301526139cc81613990565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613a3c82612f8f565b9150613a4783612f8f565b925082613a5757613a566139d3565b5b828204905092915050565b6000613a6d82612f8f565b9150613a7883612f8f565b9250828201905080821115613a9057613a8f613a02565b5b92915050565b7f4d6178696d756d20696e2d686f757365206d696e7420616d6f756e742065786360008201527f6565646564000000000000000000000000000000000000000000000000000000602082015250565b6000613af2602583612ef9565b9150613afd82613a96565b604082019050919050565b60006020820190508181036000830152613b2181613ae5565b9050919050565b7f4d617820737570706c7920726561636865642100000000000000000000000000600082015250565b6000613b5e601383612ef9565b9150613b6982613b28565b602082019050919050565b60006020820190508181036000830152613b8d81613b51565b9050919050565b6000613b9f82612f8f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613bd157613bd0613a02565b5b600182019050919050565b6000606082019050613bf160008301866130ba565b613bfe60208301856130ba565b613c0b60408301846130ba565b949350505050565b7f48756d616e73206f6e6c7920706c656173652100000000000000000000000000600082015250565b6000613c49601383612ef9565b9150613c5482613c13565b602082019050919050565b60006020820190508181036000830152613c7881613c3c565b9050919050565b7f4561726c792042697264206d696e7473206e6f7420796574206c697665210000600082015250565b6000613cb5601e83612ef9565b9150613cc082613c7f565b602082019050919050565b60006020820190508181036000830152613ce481613ca8565b9050919050565b7f596f75277265206e6f74206f6e20746865204561726c792042697264206c697360008201527f7421000000000000000000000000000000000000000000000000000000000000602082015250565b6000613d47602283612ef9565b9150613d5282613ceb565b604082019050919050565b60006020820190508181036000830152613d7681613d3a565b9050919050565b7f4f6e6c792074776f206d696e747320706572204561726c79204269726420647560008201527f72696e6720746865207072656d696e7420706861736521000000000000000000602082015250565b6000613dd9603783612ef9565b9150613de482613d7d565b604082019050919050565b60006020820190508181036000830152613e0881613dcc565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b6000613e6b602e83612ef9565b9150613e7682613e0f565b604082019050919050565b60006020820190508181036000830152613e9a81613e5e565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000613efd602b83612ef9565b9150613f0882613ea1565b604082019050919050565b60006020820190508181036000830152613f2c81613ef0565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000613f8f602c83612ef9565b9150613f9a82613f33565b604082019050919050565b60006020820190508181036000830152613fbe81613f82565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61402981613012565b82525050565b600061403b8383614020565b60208301905092915050565b6000602082019050919050565b600061405f82613ff4565b6140698185613fff565b935061407483614010565b8060005b838110156140a557815161408c888261402f565b975061409783614047565b925050600181019050614078565b5085935050505092915050565b600060408201905081810360008301526140cc8185614054565b90506140db6020830184612d35565b9392505050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000614118601883612ef9565b9150614123826140e2565b602082019050919050565b600060208201905081810360008301526141478161410b565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b60006141aa602983612ef9565b91506141b58261414e565b604082019050919050565b600060208201905081810360008301526141d98161419d565b9050919050565b60006040820190506141f56000830185613024565b6142026020830184612d35565b9392505050565b7f546f6b656e20494420446f6573206e6f74206578697374210000000000000000600082015250565b600061423f601883612ef9565b915061424a82614209565b602082019050919050565b6000602082019050818103600083015261426e81614232565b9050919050565b600081905092915050565b600061428b82612eee565b6142958185614275565b93506142a5818560208601612f0a565b80840191505092915050565b60006142bd8285614280565b91506142c98284614280565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614331602683612ef9565b915061433c826142d5565b604082019050919050565b6000602082019050818103600083015261436081614324565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061439d602083612ef9565b91506143a882614367565b602082019050919050565b600060208201905081810360008301526143cc81614390565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b600061442f602583612ef9565b915061443a826143d3565b604082019050919050565b6000602082019050818103600083015261445e81614422565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006144c1602483612ef9565b91506144cc82614465565b604082019050919050565b600060208201905081810360008301526144f0816144b4565b9050919050565b600061450282612f8f565b915061450d83612f8f565b925082820390508181111561452557614524613a02565b5b92915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614561601983612ef9565b915061456c8261452b565b602082019050919050565b6000602082019050818103600083015261459081614554565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006145f3603283612ef9565b91506145fe82614597565b604082019050919050565b60006020820190508181036000830152614622816145e6565b9050919050565b600061463482612f8f565b915061463f83612f8f565b92508261464f5761464e6139d3565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b60006146818261465a565b61468b8185614665565b935061469b818560208601612f0a565b6146a481612d69565b840191505092915050565b60006080820190506146c46000830187613024565b6146d16020830186613024565b6146de60408301856130ba565b81810360608301526146f08184614676565b905095945050505050565b60008151905061470a81612cd0565b92915050565b60006020828403121561472657614725612c9a565b5b6000614734848285016146fb565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614773602083612ef9565b915061477e8261473d565b602082019050919050565b600060208201905081810360008301526147a281614766565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006147df601c83612ef9565b91506147ea826147a9565b602082019050919050565b6000602082019050818103600083015261480e816147d2565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea2646970667358221220b3f1cc6dcf38576fbc0e4265121d57ece5fc2dbe47ea4350239fd8714fb4161964736f6c634300081000330000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001968747470733a2f2f6e66742e646566696769726c732e696f2f00000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061023d5760003560e01c80636c0360eb1161013b578063a22cb465116100b8578063caf349b51161007c578063caf349b5146106a0578063d5abeb01146106be578063e985e9c5146106dc578063f0293fd31461070c578063f2fde38b1461073c5761023d565b8063a22cb465146105fe578063a32e9bc71461061a578063ad3fefb614610636578063b88d4fde14610654578063c87b56dd146106705761023d565b8063891c0075116100ff578063891c0075146105445780638b185b35146105625780638da5cb5b14610592578063911806f0146105b057806395d89b41146105e05761023d565b80636c0360eb1461048c57806370a08231146104aa578063715018a6146104da57806375549490146104e45780638462151c146105145761023d565b806327c7dde7116101c95780634f6ccce71161018d5780634f6ccce7146103d657806356b7dd59146104065780635b2ce4f1146104245780636352211e146104405780636aa0aae7146104705761023d565b806327c7dde7146103585780632f745c591461037657806342842e0e146103a657806345d2dcd6146103c257806345f7e06e146103cc5761023d565b8063095ea7b311610210578063095ea7b3146102dc5780630d9eaa8c146102f85780631249c58b1461031457806318160ddd1461031e57806323b872dd1461033c5761023d565b806301ffc9a71461024257806302fe53051461027257806306fdde031461028e578063081812fc146102ac575b600080fd5b61025c60048036038101906102579190612cfc565b610758565b6040516102699190612d44565b60405180910390f35b61028c60048036038101906102879190612ea5565b6107d2565b005b6102966107ed565b6040516102a39190612f6d565b60405180910390f35b6102c660048036038101906102c19190612fc5565b61087f565b6040516102d39190613033565b60405180910390f35b6102f660048036038101906102f1919061307a565b6108c5565b005b610312600480360381019061030d9190612fc5565b6109dc565b005b61031c610b7f565b005b610326610ee5565b60405161033391906130c9565b60405180910390f35b610356600480360381019061035191906130e4565b610ef2565b005b610360610f52565b60405161036d9190612d44565b60405180910390f35b610390600480360381019061038b919061307a565b610f65565b60405161039d91906130c9565b60405180910390f35b6103c060048036038101906103bb91906130e4565b61100a565b005b6103ca61102a565b005b6103d4611086565b005b6103f060048036038101906103eb9190612fc5565b6110e2565b6040516103fd91906130c9565b60405180910390f35b61040e611153565b60405161041b9190612d44565b60405180910390f35b61043e6004803603810190610439919061322b565b611166565b005b61045a60048036038101906104559190612fc5565b61123c565b6040516104679190613033565b60405180910390f35b61048a60048036038101906104859190613287565b6112ed565b005b610494611349565b6040516104a19190612f6d565b60405180910390f35b6104c460048036038101906104bf91906132b4565b6113d7565b6040516104d191906130c9565b60405180910390f35b6104e261148e565b005b6104fe60048036038101906104f991906132b4565b6114a2565b60405161050b9190612d44565b60405180910390f35b61052e600480360381019061052991906132b4565b6114f8565b60405161053b919061339f565b60405180910390f35b61054c6115a6565b60405161055991906130c9565b60405180910390f35b61057c600480360381019061057791906132b4565b6115ac565b60405161058991906130c9565b60405180910390f35b61059a6115c4565b6040516105a79190613033565b60405180910390f35b6105ca60048036038101906105c591906132b4565b6115ee565b6040516105d79190612d44565b60405180910390f35b6105e861160e565b6040516105f59190612f6d565b60405180910390f35b610618600480360381019061061391906133c1565b6116a0565b005b610634600480360381019061062f91906133c1565b6116b6565b005b61063e611752565b60405161064b9190612d44565b60405180910390f35b61066e600480360381019061066991906134a2565b611765565b005b61068a60048036038101906106859190612fc5565b6117c7565b6040516106979190612f6d565b60405180910390f35b6106a861186e565b6040516106b591906130c9565b60405180910390f35b6106c6611880565b6040516106d391906130c9565b60405180910390f35b6106f660048036038101906106f19190613525565b611886565b6040516107039190612d44565b60405180910390f35b610726600480360381019061072191906132b4565b61191a565b60405161073391906130c9565b60405180910390f35b610756600480360381019061075191906132b4565b611932565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107cb57506107ca826119b5565b5b9050919050565b6107da611a97565b80600c90816107e99190613771565b5050565b6060600080546107fc90613594565b80601f016020809104026020016040519081016040528092919081815260200182805461082890613594565b80156108755780601f1061084a57610100808354040283529160200191610875565b820191906000526020600020905b81548152906001019060200180831161085857829003601f168201915b5050505050905090565b600061088a82611b15565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108d08261123c565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610940576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610937906138b5565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661095f611b60565b73ffffffffffffffffffffffffffffffffffffffff16148061098e575061098d81610988611b60565b611886565b5b6109cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c490613947565b60405180910390fd5b6109d78383611b68565b505050565b6109e4611a97565b6002600a5403610a29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a20906139b3565b60405180910390fd5b6002600a819055506000610a3b610ee5565b90506014611a6d610a4c9190613a31565b600e5483610a5a9190613a62565b10610a9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9190613b08565b60405180910390fd5b611a6d8282610aa99190613a62565b10610ae9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae090613b74565b60405180910390fd5b60005b82811015610b1c57610b09338284610b049190613a62565b611c21565b8080610b1490613b94565b915050610aec565b5081600e6000828254610b2f9190613a62565b925050819055507f12b0149b7f4ee0db24c39bac09f66e4935647fe685e79ce1e09beaa80a98d4f04383600e54604051610b6b93929190613bdc565b60405180910390a1506001600a8190555050565b6002600a5403610bc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bbb906139b3565b60405180910390fd5b6002600a819055506000610bd6610ee5565b9050611a6d8110610c1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1390613b74565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614610c8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8190613c5f565b60405180910390fd5b600d60019054906101000a900460ff16610db857600d60009054906101000a900460ff16610ced576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce490613ccb565b60405180910390fd5b610cf6336114a2565b610d35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2c90613d5d565b60405180910390fd5b6002601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410610db7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dae90613def565b60405180910390fd5b5b600d60029054906101000a900460ff1615610e7a576003601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610e7557601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190610e6590613b94565b9190505550610e743382611c21565b5b610eda565b601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190610eca90613b94565b9190505550610ed93382611c21565b5b506001600a81905550565b6000600880549050905090565b610f03610efd611b60565b82611c3f565b610f42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3990613e81565b60405180910390fd5b610f4d838383611cd4565b505050565b600d60019054906101000a900460ff1681565b6000610f70836113d7565b8210610fb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa890613f13565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b61102583838360405180602001604052806000815250611765565b505050565b611032611a97565b6001600d60006101000a81548160ff0219169083151502179055507f8ce3e7c43ac91668b24688614d1d06826293f36cb514e97a7ed14a033deb4e9c4360405161107c91906130c9565b60405180910390a1565b61108e611a97565b6001600d60016101000a81548160ff0219169083151502179055507f85ae28479c6cecaae64dafedce362b84f5d56e54a947fd749e4084e2b99fea75436040516110d891906130c9565b60405180910390a1565b60006110ec610ee5565b821061112d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112490613fa5565b60405180910390fd5b6008828154811061114157611140613fc5565b5b90600052602060002001549050919050565b600d60029054906101000a900460ff1681565b61116e611a97565b60005b82518110156111fe5781600f600085848151811061119257611191613fc5565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806111f690613b94565b915050611171565b507f3430a520f24d8605eea4588aabd6d5e935923126f623c69a6466beeff2d616f082826040516112309291906140b2565b60405180910390a15050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036112e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112db9061412e565b60405180910390fd5b80915050919050565b6112f5611a97565b80600d60026101000a81548160ff0219169083151502179055507fd78c438d1ec98f20a84833d9bb61e4252e293f412c5c788c0773df8c8989c0ce8160405161133e9190612d44565b60405180910390a150565b600c805461135690613594565b80601f016020809104026020016040519081016040528092919081815260200182805461138290613594565b80156113cf5780601f106113a4576101008083540402835291602001916113cf565b820191906000526020600020905b8154815290600101906020018083116113b257829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611447576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143e906141c0565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611496611a97565b6114a06000611f3a565b565b6000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60606000611505836113d7565b905060008167ffffffffffffffff81111561152357611522612d7a565b5b6040519080825280602002602001820160405280156115515781602001602082028036833780820191505090505b50905060005b8281101561159b576115698582610f65565b82828151811061157c5761157b613fc5565b5b602002602001018181525050808061159390613b94565b915050611557565b508092505050919050565b600e5481565b60116020528060005260406000206000915090505481565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600f6020528060005260406000206000915054906101000a900460ff1681565b60606001805461161d90613594565b80601f016020809104026020016040519081016040528092919081815260200182805461164990613594565b80156116965780601f1061166b57610100808354040283529160200191611696565b820191906000526020600020905b81548152906001019060200180831161167957829003601f168201915b5050505050905090565b6116b26116ab611b60565b8383612000565b5050565b6116be611a97565b80600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507fef96c1947c2a0166d1e922ed04e6c6db2129fef5163a2e3b86531c87a799830282826040516117469291906141e0565b60405180910390a15050565b600d60009054906101000a900460ff1681565b611776611770611b60565b83611c3f565b6117b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ac90613e81565b60405180910390fd5b6117c18484848461216c565b50505050565b60606117d2826121c8565b611811576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180890614255565b60405180910390fd5b600061181b612234565b9050600081511161183b5760405180602001604052806000815250611866565b80611845846122c6565b6040516020016118569291906142b1565b6040516020818303038152906040525b915050919050565b6014611a6d61187d9190613a31565b81565b611a6d81565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60106020528060005260406000206000915090505481565b61193a611a97565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036119a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a090614347565b60405180910390fd5b6119b281611f3a565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611a8057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611a905750611a8f82612426565b5b9050919050565b611a9f611b60565b73ffffffffffffffffffffffffffffffffffffffff16611abd6115c4565b73ffffffffffffffffffffffffffffffffffffffff1614611b13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0a906143b3565b60405180910390fd5b565b611b1e816121c8565b611b5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b549061412e565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611bdb8361123c565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b611c3b828260405180602001604052806000815250612490565b5050565b600080611c4b8361123c565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611c8d5750611c8c8185611886565b5b80611ccb57508373ffffffffffffffffffffffffffffffffffffffff16611cb38461087f565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611cf48261123c565b73ffffffffffffffffffffffffffffffffffffffff1614611d4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4190614445565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611db9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db0906144d7565b60405180910390fd5b611dc48383836124eb565b611dcf600082611b68565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e1f91906144f7565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e769190613a62565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611f358383836125fd565b505050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361206e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206590614577565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161215f9190612d44565b60405180910390a3505050565b612177848484611cd4565b61218384848484612602565b6121c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b990614609565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6060600c805461224390613594565b80601f016020809104026020016040519081016040528092919081815260200182805461226f90613594565b80156122bc5780601f10612291576101008083540402835291602001916122bc565b820191906000526020600020905b81548152906001019060200180831161229f57829003601f168201915b5050505050905090565b60606000820361230d576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612421565b600082905060005b6000821461233f57808061232890613b94565b915050600a826123389190613a31565b9150612315565b60008167ffffffffffffffff81111561235b5761235a612d7a565b5b6040519080825280601f01601f19166020018201604052801561238d5781602001600182028036833780820191505090505b5090505b6000851461241a576001826123a691906144f7565b9150600a856123b59190614629565b60306123c19190613a62565b60f81b8183815181106123d7576123d6613fc5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856124139190613a31565b9450612391565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61249a8383612789565b6124a76000848484612602565b6124e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124dd90614609565b60405180910390fd5b505050565b6124f6838383612962565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036125385761253381612967565b612577565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146125765761257583826129b0565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036125b9576125b481612b1d565b6125f8565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146125f7576125f68282612bee565b5b5b505050565b505050565b60006126238473ffffffffffffffffffffffffffffffffffffffff16612c6d565b1561277c578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261264c611b60565b8786866040518563ffffffff1660e01b815260040161266e94939291906146af565b6020604051808303816000875af19250505080156126aa57506040513d601f19601f820116820180604052508101906126a79190614710565b60015b61272c573d80600081146126da576040519150601f19603f3d011682016040523d82523d6000602084013e6126df565b606091505b506000815103612724576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271b90614609565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612781565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036127f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127ef90614789565b60405180910390fd5b612801816121c8565b15612841576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612838906147f5565b60405180910390fd5b61284d600083836124eb565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461289d9190613a62565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461295e600083836125fd565b5050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016129bd846113d7565b6129c791906144f7565b9050600060076000848152602001908152602001600020549050818114612aac576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612b3191906144f7565b9050600060096000848152602001908152602001600020549050600060088381548110612b6157612b60613fc5565b5b906000526020600020015490508060088381548110612b8357612b82613fc5565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612bd257612bd1614815565b5b6001900381819060005260206000200160009055905550505050565b6000612bf9836113d7565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612cd981612ca4565b8114612ce457600080fd5b50565b600081359050612cf681612cd0565b92915050565b600060208284031215612d1257612d11612c9a565b5b6000612d2084828501612ce7565b91505092915050565b60008115159050919050565b612d3e81612d29565b82525050565b6000602082019050612d596000830184612d35565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612db282612d69565b810181811067ffffffffffffffff82111715612dd157612dd0612d7a565b5b80604052505050565b6000612de4612c90565b9050612df08282612da9565b919050565b600067ffffffffffffffff821115612e1057612e0f612d7a565b5b612e1982612d69565b9050602081019050919050565b82818337600083830152505050565b6000612e48612e4384612df5565b612dda565b905082815260208101848484011115612e6457612e63612d64565b5b612e6f848285612e26565b509392505050565b600082601f830112612e8c57612e8b612d5f565b5b8135612e9c848260208601612e35565b91505092915050565b600060208284031215612ebb57612eba612c9a565b5b600082013567ffffffffffffffff811115612ed957612ed8612c9f565b5b612ee584828501612e77565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612f28578082015181840152602081019050612f0d565b60008484015250505050565b6000612f3f82612eee565b612f498185612ef9565b9350612f59818560208601612f0a565b612f6281612d69565b840191505092915050565b60006020820190508181036000830152612f878184612f34565b905092915050565b6000819050919050565b612fa281612f8f565b8114612fad57600080fd5b50565b600081359050612fbf81612f99565b92915050565b600060208284031215612fdb57612fda612c9a565b5b6000612fe984828501612fb0565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061301d82612ff2565b9050919050565b61302d81613012565b82525050565b60006020820190506130486000830184613024565b92915050565b61305781613012565b811461306257600080fd5b50565b6000813590506130748161304e565b92915050565b6000806040838503121561309157613090612c9a565b5b600061309f85828601613065565b92505060206130b085828601612fb0565b9150509250929050565b6130c381612f8f565b82525050565b60006020820190506130de60008301846130ba565b92915050565b6000806000606084860312156130fd576130fc612c9a565b5b600061310b86828701613065565b935050602061311c86828701613065565b925050604061312d86828701612fb0565b9150509250925092565b600067ffffffffffffffff82111561315257613151612d7a565b5b602082029050602081019050919050565b600080fd5b600061317b61317684613137565b612dda565b9050808382526020820190506020840283018581111561319e5761319d613163565b5b835b818110156131c757806131b38882613065565b8452602084019350506020810190506131a0565b5050509392505050565b600082601f8301126131e6576131e5612d5f565b5b81356131f6848260208601613168565b91505092915050565b61320881612d29565b811461321357600080fd5b50565b600081359050613225816131ff565b92915050565b6000806040838503121561324257613241612c9a565b5b600083013567ffffffffffffffff8111156132605761325f612c9f565b5b61326c858286016131d1565b925050602061327d85828601613216565b9150509250929050565b60006020828403121561329d5761329c612c9a565b5b60006132ab84828501613216565b91505092915050565b6000602082840312156132ca576132c9612c9a565b5b60006132d884828501613065565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61331681612f8f565b82525050565b6000613328838361330d565b60208301905092915050565b6000602082019050919050565b600061334c826132e1565b61335681856132ec565b9350613361836132fd565b8060005b83811015613392578151613379888261331c565b975061338483613334565b925050600181019050613365565b5085935050505092915050565b600060208201905081810360008301526133b98184613341565b905092915050565b600080604083850312156133d8576133d7612c9a565b5b60006133e685828601613065565b92505060206133f785828601613216565b9150509250929050565b600067ffffffffffffffff82111561341c5761341b612d7a565b5b61342582612d69565b9050602081019050919050565b600061344561344084613401565b612dda565b90508281526020810184848401111561346157613460612d64565b5b61346c848285612e26565b509392505050565b600082601f83011261348957613488612d5f565b5b8135613499848260208601613432565b91505092915050565b600080600080608085870312156134bc576134bb612c9a565b5b60006134ca87828801613065565b94505060206134db87828801613065565b93505060406134ec87828801612fb0565b925050606085013567ffffffffffffffff81111561350d5761350c612c9f565b5b61351987828801613474565b91505092959194509250565b6000806040838503121561353c5761353b612c9a565b5b600061354a85828601613065565b925050602061355b85828601613065565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806135ac57607f821691505b6020821081036135bf576135be613565565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026136277fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826135ea565b61363186836135ea565b95508019841693508086168417925050509392505050565b6000819050919050565b600061366e61366961366484612f8f565b613649565b612f8f565b9050919050565b6000819050919050565b61368883613653565b61369c61369482613675565b8484546135f7565b825550505050565b600090565b6136b16136a4565b6136bc81848461367f565b505050565b5b818110156136e0576136d56000826136a9565b6001810190506136c2565b5050565b601f821115613725576136f6816135c5565b6136ff846135da565b8101602085101561370e578190505b61372261371a856135da565b8301826136c1565b50505b505050565b600082821c905092915050565b60006137486000198460080261372a565b1980831691505092915050565b60006137618383613737565b9150826002028217905092915050565b61377a82612eee565b67ffffffffffffffff81111561379357613792612d7a565b5b61379d8254613594565b6137a88282856136e4565b600060209050601f8311600181146137db57600084156137c9578287015190505b6137d38582613755565b86555061383b565b601f1984166137e9866135c5565b60005b82811015613811578489015182556001820191506020850194506020810190506137ec565b8683101561382e578489015161382a601f891682613737565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b600061389f602183612ef9565b91506138aa82613843565b604082019050919050565b600060208201905081810360008301526138ce81613892565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b6000613931603e83612ef9565b915061393c826138d5565b604082019050919050565b6000602082019050818103600083015261396081613924565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b600061399d601f83612ef9565b91506139a882613967565b602082019050919050565b600060208201905081810360008301526139cc81613990565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613a3c82612f8f565b9150613a4783612f8f565b925082613a5757613a566139d3565b5b828204905092915050565b6000613a6d82612f8f565b9150613a7883612f8f565b9250828201905080821115613a9057613a8f613a02565b5b92915050565b7f4d6178696d756d20696e2d686f757365206d696e7420616d6f756e742065786360008201527f6565646564000000000000000000000000000000000000000000000000000000602082015250565b6000613af2602583612ef9565b9150613afd82613a96565b604082019050919050565b60006020820190508181036000830152613b2181613ae5565b9050919050565b7f4d617820737570706c7920726561636865642100000000000000000000000000600082015250565b6000613b5e601383612ef9565b9150613b6982613b28565b602082019050919050565b60006020820190508181036000830152613b8d81613b51565b9050919050565b6000613b9f82612f8f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613bd157613bd0613a02565b5b600182019050919050565b6000606082019050613bf160008301866130ba565b613bfe60208301856130ba565b613c0b60408301846130ba565b949350505050565b7f48756d616e73206f6e6c7920706c656173652100000000000000000000000000600082015250565b6000613c49601383612ef9565b9150613c5482613c13565b602082019050919050565b60006020820190508181036000830152613c7881613c3c565b9050919050565b7f4561726c792042697264206d696e7473206e6f7420796574206c697665210000600082015250565b6000613cb5601e83612ef9565b9150613cc082613c7f565b602082019050919050565b60006020820190508181036000830152613ce481613ca8565b9050919050565b7f596f75277265206e6f74206f6e20746865204561726c792042697264206c697360008201527f7421000000000000000000000000000000000000000000000000000000000000602082015250565b6000613d47602283612ef9565b9150613d5282613ceb565b604082019050919050565b60006020820190508181036000830152613d7681613d3a565b9050919050565b7f4f6e6c792074776f206d696e747320706572204561726c79204269726420647560008201527f72696e6720746865207072656d696e7420706861736521000000000000000000602082015250565b6000613dd9603783612ef9565b9150613de482613d7d565b604082019050919050565b60006020820190508181036000830152613e0881613dcc565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b6000613e6b602e83612ef9565b9150613e7682613e0f565b604082019050919050565b60006020820190508181036000830152613e9a81613e5e565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000613efd602b83612ef9565b9150613f0882613ea1565b604082019050919050565b60006020820190508181036000830152613f2c81613ef0565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000613f8f602c83612ef9565b9150613f9a82613f33565b604082019050919050565b60006020820190508181036000830152613fbe81613f82565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61402981613012565b82525050565b600061403b8383614020565b60208301905092915050565b6000602082019050919050565b600061405f82613ff4565b6140698185613fff565b935061407483614010565b8060005b838110156140a557815161408c888261402f565b975061409783614047565b925050600181019050614078565b5085935050505092915050565b600060408201905081810360008301526140cc8185614054565b90506140db6020830184612d35565b9392505050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000614118601883612ef9565b9150614123826140e2565b602082019050919050565b600060208201905081810360008301526141478161410b565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b60006141aa602983612ef9565b91506141b58261414e565b604082019050919050565b600060208201905081810360008301526141d98161419d565b9050919050565b60006040820190506141f56000830185613024565b6142026020830184612d35565b9392505050565b7f546f6b656e20494420446f6573206e6f74206578697374210000000000000000600082015250565b600061423f601883612ef9565b915061424a82614209565b602082019050919050565b6000602082019050818103600083015261426e81614232565b9050919050565b600081905092915050565b600061428b82612eee565b6142958185614275565b93506142a5818560208601612f0a565b80840191505092915050565b60006142bd8285614280565b91506142c98284614280565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614331602683612ef9565b915061433c826142d5565b604082019050919050565b6000602082019050818103600083015261436081614324565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061439d602083612ef9565b91506143a882614367565b602082019050919050565b600060208201905081810360008301526143cc81614390565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b600061442f602583612ef9565b915061443a826143d3565b604082019050919050565b6000602082019050818103600083015261445e81614422565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006144c1602483612ef9565b91506144cc82614465565b604082019050919050565b600060208201905081810360008301526144f0816144b4565b9050919050565b600061450282612f8f565b915061450d83612f8f565b925082820390508181111561452557614524613a02565b5b92915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614561601983612ef9565b915061456c8261452b565b602082019050919050565b6000602082019050818103600083015261459081614554565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006145f3603283612ef9565b91506145fe82614597565b604082019050919050565b60006020820190508181036000830152614622816145e6565b9050919050565b600061463482612f8f565b915061463f83612f8f565b92508261464f5761464e6139d3565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b60006146818261465a565b61468b8185614665565b935061469b818560208601612f0a565b6146a481612d69565b840191505092915050565b60006080820190506146c46000830187613024565b6146d16020830186613024565b6146de60408301856130ba565b81810360608301526146f08184614676565b905095945050505050565b60008151905061470a81612cd0565b92915050565b60006020828403121561472657614725612c9a565b5b6000614734848285016146fb565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614773602083612ef9565b915061477e8261473d565b602082019050919050565b600060208201905081810360008301526147a281614766565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006147df601c83612ef9565b91506147ea826147a9565b602082019050919050565b6000602082019050818103600083015261480e816147d2565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea2646970667358221220b3f1cc6dcf38576fbc0e4265121d57ece5fc2dbe47ea4350239fd8714fb4161964736f6c63430008100033

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

0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001968747470733a2f2f6e66742e646566696769726c732e696f2f00000000000000

-----Decoded View---------------
Arg [0] : _uri (string): https://nft.defigirls.io/

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000019
Arg [2] : 68747470733a2f2f6e66742e646566696769726c732e696f2f00000000000000


Deployed Bytecode Sourcemap

53568:4279:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47383:224;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57280:100;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34058;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35571:171;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35088:417;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54555:465;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55028:900;;;:::i;:::-;;48023:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36271:336;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53741:34;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47691:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36678:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56532:128;;;:::i;:::-;;56668:131;;;:::i;:::-;;48213:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53782:38;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56272:252;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33769:222;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55936:160;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53671:21;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33500:207;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12115:103;;;:::i;:::-;;57388:105;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57524:320;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53932:29;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54069:45;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11467:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53970:42;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34227:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35814:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56104:160;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53701:33;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36934:323;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56923:327;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53873:52;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53829:37;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36040:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54019:43;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12373:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47383:224;47485:4;47524:35;47509:50;;;:11;:50;;;;:90;;;;47563:36;47587:11;47563:23;:36::i;:::-;47509:90;47502:97;;47383:224;;;:::o;57280:100::-;11353:13;:11;:13::i;:::-;57361:11:::1;57351:7;:21;;;;;;:::i;:::-;;57280:100:::0;:::o;34058:::-;34112:13;34145:5;34138:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34058:100;:::o;35571:171::-;35647:7;35667:23;35682:7;35667:14;:23::i;:::-;35710:15;:24;35726:7;35710:24;;;;;;;;;;;;;;;;;;;;;35703:31;;35571:171;;;:::o;35088:417::-;35169:13;35185:23;35200:7;35185:14;:23::i;:::-;35169:39;;35233:5;35227:11;;:2;:11;;;35219:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;35327:5;35311:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;35336:37;35353:5;35360:12;:10;:12::i;:::-;35336:16;:37::i;:::-;35311:62;35289:174;;;;;;;;;;;;:::i;:::-;;;;;;;;;35476:21;35485:2;35489:7;35476:8;:21::i;:::-;35158:347;35088:417;;:::o;54555:465::-;11353:13;:11;:13::i;:::-;5718:1:::1;6316:7;;:19:::0;6308:63:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;5718:1;6449:7;:18;;;;54630:6:::2;54639:13;:11;:13::i;:::-;54630:22;;53923:2;53862:4;53911:14;;;;:::i;:::-;54678:13;;54671:4;:20;;;;:::i;:::-;:37;54663:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;53862:4;54773;54769:1;:8;;;;:::i;:::-;:20;54761:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;54829:6;54824:87;54845:4;54841:1;:8;54824:87;;;54871:28;54881:10;54897:1;54893;:5;;;;:::i;:::-;54871:9;:28::i;:::-;54851:3;;;;;:::i;:::-;;;;54824:87;;;;54938:4;54921:13;;:21;;;;;;;:::i;:::-;;;;;;;;54958:54;54978:12;54992:4;54998:13;;54958:54;;;;;;;;:::i;:::-;;;;;;;;54619:401;5674:1:::1;6628:7;:22;;;;54555:465:::0;:::o;55028:900::-;5718:1;6316:7;;:19;6308:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;5718:1;6449:7;:18;;;;55075:6:::1;55084:13;:11;:13::i;:::-;55075:22;;53862:4;55116:1;:13;55108:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;55185:10;55172:23;;:9;:23;;;55164:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;55237:14;;;;;;;;;;;55232:299;;55276:13;;;;;;;;;;;55268:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;55347:23;55359:10;55347:11;:23::i;:::-;55339:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;55458:1;55432:11;:23;55444:10;55432:23;;;;;;;;;;;;;;;;:27;55424:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;55232:299;55631:19;;;;;;;;;;;55627:284;;;55697:1;55671:11;:23;55683:10;55671:23;;;;;;;;;;;;;;;;:27;55667:136;;;55719:11;:23;55731:10;55719:23;;;;;;;;;;;;;;;;:25;;;;;;;;;:::i;:::-;;;;;;55763:24;55773:10;55785:1;55763:9;:24::i;:::-;55667:136;55627:284;;;55835:11;:23;55847:10;55835:23;;;;;;;;;;;;;;;;:25;;;;;;;;;:::i;:::-;;;;;;55875:24;55885:10;55897:1;55875:9;:24::i;:::-;55627:284;55064:864;5674:1:::0;6628:7;:22;;;;55028:900::o;48023:113::-;48084:7;48111:10;:17;;;;48104:24;;48023:113;:::o;36271:336::-;36466:41;36485:12;:10;:12::i;:::-;36499:7;36466:18;:41::i;:::-;36458:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;36571:28;36581:4;36587:2;36591:7;36571:9;:28::i;:::-;36271:336;;;:::o;53741:34::-;;;;;;;;;;;;;:::o;47691:256::-;47788:7;47824:23;47841:5;47824:16;:23::i;:::-;47816:5;:31;47808:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;47913:12;:19;47926:5;47913:19;;;;;;;;;;;;;;;:26;47933:5;47913:26;;;;;;;;;;;;47906:33;;47691:256;;;;:::o;36678:185::-;36816:39;36833:4;36839:2;36843:7;36816:39;;;;;;;;;;;;:16;:39::i;:::-;36678:185;;;:::o;56532:128::-;11353:13;:11;:13::i;:::-;56605:4:::1;56589:13;;:20;;;;;;;;;;;;;;;;;;56625:27;56639:12;56625:27;;;;;;:::i;:::-;;;;;;;;56532:128::o:0;56668:131::-;11353:13;:11;:13::i;:::-;56743:4:::1;56726:14;;:21;;;;;;;;;;;;;;;;;;56763:28;56778:12;56763:28;;;;;;:::i;:::-;;;;;;;;56668:131::o:0;48213:233::-;48288:7;48324:30;:28;:30::i;:::-;48316:5;:38;48308:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;48421:10;48432:5;48421:17;;;;;;;;:::i;:::-;;;;;;;;;;48414:24;;48213:233;;;:::o;53782:38::-;;;;;;;;;;;;;:::o;56272:252::-;11353:13;:11;:13::i;:::-;56373:6:::1;56368:99;56389:6;:13;56385:1;:17;56368:99;;;56448:7;56424:10;:21;56435:6;56442:1;56435:9;;;;;;;;:::i;:::-;;;;;;;;56424:21;;;;;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;56404:3;;;;;:::i;:::-;;;;56368:99;;;;56482:34;56500:6;56508:7;56482:34;;;;;;;:::i;:::-;;;;;;;;56272:252:::0;;:::o;33769:222::-;33841:7;33861:13;33877:7;:16;33885:7;33877:16;;;;;;;;;;;;;;;;;;;;;33861:32;;33929:1;33912:19;;:5;:19;;;33904:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;33978:5;33971:12;;;33769:222;;;:::o;55936:160::-;11353:13;:11;:13::i;:::-;56034:7:::1;56012:19;;:29;;;;;;;;;;;;;;;;;;56057:31;56080:7;56057:31;;;;;;:::i;:::-;;;;;;;;55936:160:::0;:::o;53671:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;33500:207::-;33572:7;33617:1;33600:19;;:5;:19;;;33592:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;33683:9;:16;33693:5;33683:16;;;;;;;;;;;;;;;;33676:23;;33500:207;;;:::o;12115:103::-;11353:13;:11;:13::i;:::-;12180:30:::1;12207:1;12180:18;:30::i;:::-;12115:103::o:0;57388:105::-;57444:4;57468:10;:17;57479:5;57468:17;;;;;;;;;;;;;;;;;;;;;;;;;57461:24;;57388:105;;;:::o;57524:320::-;57584:16;57613:12;57628:17;57638:6;57628:9;:17::i;:::-;57613:32;;57656:20;57690:7;57679:19;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57656:42;;57716:6;57711:100;57728:7;57726:1;:9;57711:100;;;57769:30;57789:6;57797:1;57769:19;:30::i;:::-;57757:6;57764:1;57757:9;;;;;;;;:::i;:::-;;;;;;;:42;;;;;57737:3;;;;;:::i;:::-;;;;57711:100;;;;57830:6;57823:13;;;;57524:320;;;:::o;53932:29::-;;;;:::o;54069:45::-;;;;;;;;;;;;;;;;;:::o;11467:87::-;11513:7;11540:6;;;;;;;;;;;11533:13;;11467:87;:::o;53970:42::-;;;;;;;;;;;;;;;;;;;;;;:::o;34227:104::-;34283:13;34316:7;34309:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34227:104;:::o;35814:155::-;35909:52;35928:12;:10;:12::i;:::-;35942:8;35952;35909:18;:52::i;:::-;35814:155;;:::o;56104:160::-;11353:13;:11;:13::i;:::-;56205:7:::1;56185:10;:17;56196:5;56185:17;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;56228:28;56241:5;56248:7;56228:28;;;;;;;:::i;:::-;;;;;;;;56104:160:::0;;:::o;53701:33::-;;;;;;;;;;;;;:::o;36934:323::-;37108:41;37127:12;:10;:12::i;:::-;37141:7;37108:18;:41::i;:::-;37100:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;37211:38;37225:4;37231:2;37235:7;37244:4;37211:13;:38::i;:::-;36934:323;;;;:::o;56923:327::-;56993:13;57027:16;57035:7;57027;:16::i;:::-;57019:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;57083:28;57114:10;:8;:10::i;:::-;57083:41;;57173:1;57148:14;57142:28;:32;:100;;;;;;;;;;;;;;;;;57201:14;57217:18;:7;:16;:18::i;:::-;57184:52;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57142:100;57135:107;;;56923:327;;;:::o;53873:52::-;53923:2;53862:4;53911:14;;;;:::i;:::-;53873:52;:::o;53829:37::-;53862:4;53829:37;:::o;36040:164::-;36137:4;36161:18;:25;36180:5;36161:25;;;;;;;;;;;;;;;:35;36187:8;36161:35;;;;;;;;;;;;;;;;;;;;;;;;;36154:42;;36040:164;;;;:::o;54019:43::-;;;;;;;;;;;;;;;;;:::o;12373:201::-;11353:13;:11;:13::i;:::-;12482:1:::1;12462:22;;:8;:22;;::::0;12454:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;12538:28;12557:8;12538:18;:28::i;:::-;12373:201:::0;:::o;33131:305::-;33233:4;33285:25;33270:40;;;:11;:40;;;;:105;;;;33342:33;33327:48;;;:11;:48;;;;33270:105;:158;;;;33392:36;33416:11;33392:23;:36::i;:::-;33270:158;33250:178;;33131:305;;;:::o;11632:132::-;11707:12;:10;:12::i;:::-;11696:23;;:7;:5;:7::i;:::-;:23;;;11688:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;11632:132::o;43546:135::-;43628:16;43636:7;43628;:16::i;:::-;43620:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;43546:135;:::o;9959:98::-;10012:7;10039:10;10032:17;;9959:98;:::o;42825:174::-;42927:2;42900:15;:24;42916:7;42900:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;42983:7;42979:2;42945:46;;42954:23;42969:7;42954:14;:23::i;:::-;42945:46;;;;;;;;;;;;42825:174;;:::o;39664:110::-;39740:26;39750:2;39754:7;39740:26;;;;;;;;;;;;:9;:26::i;:::-;39664:110;;:::o;39058:264::-;39151:4;39168:13;39184:23;39199:7;39184:14;:23::i;:::-;39168:39;;39237:5;39226:16;;:7;:16;;;:52;;;;39246:32;39263:5;39270:7;39246:16;:32::i;:::-;39226:52;:87;;;;39306:7;39282:31;;:20;39294:7;39282:11;:20::i;:::-;:31;;;39226:87;39218:96;;;39058:264;;;;:::o;42081:625::-;42240:4;42213:31;;:23;42228:7;42213:14;:23::i;:::-;:31;;;42205:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;42319:1;42305:16;;:2;:16;;;42297:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;42375:39;42396:4;42402:2;42406:7;42375:20;:39::i;:::-;42479:29;42496:1;42500:7;42479:8;:29::i;:::-;42540:1;42521:9;:15;42531:4;42521:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;42569:1;42552:9;:13;42562:2;42552:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;42600:2;42581:7;:16;42589:7;42581:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;42639:7;42635:2;42620:27;;42629:4;42620:27;;;;;;;;;;;;42660:38;42680:4;42686:2;42690:7;42660:19;:38::i;:::-;42081:625;;;:::o;12734:191::-;12808:16;12827:6;;;;;;;;;;;12808:25;;12853:8;12844:6;;:17;;;;;;;;;;;;;;;;;;12908:8;12877:40;;12898:8;12877:40;;;;;;;;;;;;12797:128;12734:191;:::o;43142:315::-;43297:8;43288:17;;:5;:17;;;43280:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;43384:8;43346:18;:25;43365:5;43346:25;;;;;;;;;;;;;;;:35;43372:8;43346:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;43430:8;43408:41;;43423:5;43408:41;;;43440:8;43408:41;;;;;;:::i;:::-;;;;;;;;43142:315;;;:::o;38138:313::-;38294:28;38304:4;38310:2;38314:7;38294:9;:28::i;:::-;38341:47;38364:4;38370:2;38374:7;38383:4;38341:22;:47::i;:::-;38333:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;38138:313;;;;:::o;38764:127::-;38829:4;38881:1;38853:30;;:7;:16;38861:7;38853:16;;;;;;;;;;;;;;;;;;;;;:30;;;;38846:37;;38764:127;;;:::o;56807:108::-;56867:13;56900:7;56893:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56807:108;:::o;7154:723::-;7210:13;7440:1;7431:5;:10;7427:53;;7458:10;;;;;;;;;;;;;;;;;;;;;7427:53;7490:12;7505:5;7490:20;;7521:14;7546:78;7561:1;7553:4;:9;7546:78;;7579:8;;;;;:::i;:::-;;;;7610:2;7602:10;;;;;:::i;:::-;;;7546:78;;;7634:19;7666:6;7656:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7634:39;;7684:154;7700:1;7691:5;:10;7684:154;;7728:1;7718:11;;;;;:::i;:::-;;;7795:2;7787:5;:10;;;;:::i;:::-;7774:2;:24;;;;:::i;:::-;7761:39;;7744:6;7751;7744:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;7824:2;7815:11;;;;;:::i;:::-;;;7684:154;;;7862:6;7848:21;;;;;7154:723;;;;:::o;24557:157::-;24642:4;24681:25;24666:40;;;:11;:40;;;;24659:47;;24557:157;;;:::o;40001:319::-;40130:18;40136:2;40140:7;40130:5;:18::i;:::-;40181:53;40212:1;40216:2;40220:7;40229:4;40181:22;:53::i;:::-;40159:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;40001:319;;;:::o;49059:589::-;49203:45;49230:4;49236:2;49240:7;49203:26;:45::i;:::-;49281:1;49265:18;;:4;:18;;;49261:187;;49300:40;49332:7;49300:31;:40::i;:::-;49261:187;;;49370:2;49362:10;;:4;:10;;;49358:90;;49389:47;49422:4;49428:7;49389:32;:47::i;:::-;49358:90;49261:187;49476:1;49462:16;;:2;:16;;;49458:183;;49495:45;49532:7;49495:36;:45::i;:::-;49458:183;;;49568:4;49562:10;;:2;:10;;;49558:83;;49589:40;49617:2;49621:7;49589:27;:40::i;:::-;49558:83;49458:183;49059:589;;;:::o;46181:125::-;;;;:::o;44245:853::-;44399:4;44420:15;:2;:13;;;:15::i;:::-;44416:675;;;44472:2;44456:36;;;44493:12;:10;:12::i;:::-;44507:4;44513:7;44522:4;44456:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;44452:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44714:1;44697:6;:13;:18;44693:328;;44740:60;;;;;;;;;;:::i;:::-;;;;;;;;44693:328;44971:6;44965:13;44956:6;44952:2;44948:15;44941:38;44452:584;44588:41;;;44578:51;;;:6;:51;;;;44571:58;;;;;44416:675;45075:4;45068:11;;44245:853;;;;;;;:::o;40656:439::-;40750:1;40736:16;;:2;:16;;;40728:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;40809:16;40817:7;40809;:16::i;:::-;40808:17;40800:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;40871:45;40900:1;40904:2;40908:7;40871:20;:45::i;:::-;40946:1;40929:9;:13;40939:2;40929:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;40977:2;40958:7;:16;40966:7;40958:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;41022:7;41018:2;40997:33;;41014:1;40997:33;;;;;;;;;;;;41043:44;41071:1;41075:2;41079:7;41043:19;:44::i;:::-;40656:439;;:::o;45670:126::-;;;;:::o;50371:164::-;50475:10;:17;;;;50448:15;:24;50464:7;50448:24;;;;;;;;;;;:44;;;;50503:10;50519:7;50503:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50371:164;:::o;51162:988::-;51428:22;51478:1;51453:22;51470:4;51453:16;:22::i;:::-;:26;;;;:::i;:::-;51428:51;;51490:18;51511:17;:26;51529:7;51511:26;;;;;;;;;;;;51490:47;;51658:14;51644:10;:28;51640:328;;51689:19;51711:12;:18;51724:4;51711:18;;;;;;;;;;;;;;;:34;51730:14;51711:34;;;;;;;;;;;;51689:56;;51795:11;51762:12;:18;51775:4;51762:18;;;;;;;;;;;;;;;:30;51781:10;51762:30;;;;;;;;;;;:44;;;;51912:10;51879:17;:30;51897:11;51879:30;;;;;;;;;;;:43;;;;51674:294;51640:328;52064:17;:26;52082:7;52064:26;;;;;;;;;;;52057:33;;;52108:12;:18;52121:4;52108:18;;;;;;;;;;;;;;;:34;52127:14;52108:34;;;;;;;;;;;52101:41;;;51243:907;;51162:988;;:::o;52445:1079::-;52698:22;52743:1;52723:10;:17;;;;:21;;;;:::i;:::-;52698:46;;52755:18;52776:15;:24;52792:7;52776:24;;;;;;;;;;;;52755:45;;53127:19;53149:10;53160:14;53149:26;;;;;;;;:::i;:::-;;;;;;;;;;53127:48;;53213:11;53188:10;53199;53188:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;53324:10;53293:15;:28;53309:11;53293:28;;;;;;;;;;;:41;;;;53465:15;:24;53481:7;53465:24;;;;;;;;;;;53458:31;;;53500:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;52516:1008;;;52445:1079;:::o;49949:221::-;50034:14;50051:20;50068:2;50051:16;:20::i;:::-;50034:37;;50109:7;50082:12;:16;50095:2;50082:16;;;;;;;;;;;;;;;:24;50099:6;50082:24;;;;;;;;;;;:34;;;;50156:6;50127:17;:26;50145:7;50127:26;;;;;;;;;;;:35;;;;50023:147;49949:221;;:::o;14224:326::-;14284:4;14541:1;14519:7;:19;;;:23;14512:30;;14224:326;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:117::-;1627:1;1624;1617:12;1641:117;1750:1;1747;1740:12;1764:102;1805:6;1856:2;1852:7;1847:2;1840:5;1836:14;1832:28;1822:38;;1764:102;;;:::o;1872:180::-;1920:77;1917:1;1910:88;2017:4;2014:1;2007:15;2041:4;2038:1;2031:15;2058:281;2141:27;2163:4;2141:27;:::i;:::-;2133:6;2129:40;2271:6;2259:10;2256:22;2235:18;2223:10;2220:34;2217:62;2214:88;;;2282:18;;:::i;:::-;2214:88;2322:10;2318:2;2311:22;2101:238;2058:281;;:::o;2345:129::-;2379:6;2406:20;;:::i;:::-;2396:30;;2435:33;2463:4;2455:6;2435:33;:::i;:::-;2345:129;;;:::o;2480:308::-;2542:4;2632:18;2624:6;2621:30;2618:56;;;2654:18;;:::i;:::-;2618:56;2692:29;2714:6;2692:29;:::i;:::-;2684:37;;2776:4;2770;2766:15;2758:23;;2480:308;;;:::o;2794:146::-;2891:6;2886:3;2881;2868:30;2932:1;2923:6;2918:3;2914:16;2907:27;2794:146;;;:::o;2946:425::-;3024:5;3049:66;3065:49;3107:6;3065:49;:::i;:::-;3049:66;:::i;:::-;3040:75;;3138:6;3131:5;3124:21;3176:4;3169:5;3165:16;3214:3;3205:6;3200:3;3196:16;3193:25;3190:112;;;3221:79;;:::i;:::-;3190:112;3311:54;3358:6;3353:3;3348;3311:54;:::i;:::-;3030:341;2946:425;;;;;:::o;3391:340::-;3447:5;3496:3;3489:4;3481:6;3477:17;3473:27;3463:122;;3504:79;;:::i;:::-;3463:122;3621:6;3608:20;3646:79;3721:3;3713:6;3706:4;3698:6;3694:17;3646:79;:::i;:::-;3637:88;;3453:278;3391:340;;;;:::o;3737:509::-;3806:6;3855:2;3843:9;3834:7;3830:23;3826:32;3823:119;;;3861:79;;:::i;:::-;3823:119;4009:1;3998:9;3994:17;3981:31;4039:18;4031:6;4028:30;4025:117;;;4061:79;;:::i;:::-;4025:117;4166:63;4221:7;4212:6;4201:9;4197:22;4166:63;:::i;:::-;4156:73;;3952:287;3737:509;;;;:::o;4252:99::-;4304:6;4338:5;4332:12;4322:22;;4252:99;;;:::o;4357:169::-;4441:11;4475:6;4470:3;4463:19;4515:4;4510:3;4506:14;4491:29;;4357:169;;;;:::o;4532:246::-;4613:1;4623:113;4637:6;4634:1;4631:13;4623:113;;;4722:1;4717:3;4713:11;4707:18;4703:1;4698:3;4694:11;4687:39;4659:2;4656:1;4652:10;4647:15;;4623:113;;;4770:1;4761:6;4756:3;4752:16;4745:27;4594:184;4532:246;;;:::o;4784:377::-;4872:3;4900:39;4933:5;4900:39;:::i;:::-;4955:71;5019:6;5014:3;4955:71;:::i;:::-;4948:78;;5035:65;5093:6;5088:3;5081:4;5074:5;5070:16;5035:65;:::i;:::-;5125:29;5147:6;5125:29;:::i;:::-;5120:3;5116:39;5109:46;;4876:285;4784:377;;;;:::o;5167:313::-;5280:4;5318:2;5307:9;5303:18;5295:26;;5367:9;5361:4;5357:20;5353:1;5342:9;5338:17;5331:47;5395:78;5468:4;5459:6;5395:78;:::i;:::-;5387:86;;5167:313;;;;:::o;5486:77::-;5523:7;5552:5;5541:16;;5486:77;;;:::o;5569:122::-;5642:24;5660:5;5642:24;:::i;:::-;5635:5;5632:35;5622:63;;5681:1;5678;5671:12;5622:63;5569:122;:::o;5697:139::-;5743:5;5781:6;5768:20;5759:29;;5797:33;5824:5;5797:33;:::i;:::-;5697:139;;;;:::o;5842:329::-;5901:6;5950:2;5938:9;5929:7;5925:23;5921:32;5918:119;;;5956:79;;:::i;:::-;5918:119;6076:1;6101:53;6146:7;6137:6;6126:9;6122:22;6101:53;:::i;:::-;6091:63;;6047:117;5842:329;;;;:::o;6177:126::-;6214:7;6254:42;6247:5;6243:54;6232:65;;6177:126;;;:::o;6309:96::-;6346:7;6375:24;6393:5;6375:24;:::i;:::-;6364:35;;6309:96;;;:::o;6411:118::-;6498:24;6516:5;6498:24;:::i;:::-;6493:3;6486:37;6411:118;;:::o;6535:222::-;6628:4;6666:2;6655:9;6651:18;6643:26;;6679:71;6747:1;6736:9;6732:17;6723:6;6679:71;:::i;:::-;6535:222;;;;:::o;6763:122::-;6836:24;6854:5;6836:24;:::i;:::-;6829:5;6826:35;6816:63;;6875:1;6872;6865:12;6816:63;6763:122;:::o;6891:139::-;6937:5;6975:6;6962:20;6953:29;;6991:33;7018:5;6991:33;:::i;:::-;6891:139;;;;:::o;7036:474::-;7104:6;7112;7161:2;7149:9;7140:7;7136:23;7132:32;7129:119;;;7167:79;;:::i;:::-;7129:119;7287:1;7312:53;7357:7;7348:6;7337:9;7333:22;7312:53;:::i;:::-;7302:63;;7258:117;7414:2;7440:53;7485:7;7476:6;7465:9;7461:22;7440:53;:::i;:::-;7430:63;;7385:118;7036:474;;;;;:::o;7516:118::-;7603:24;7621:5;7603:24;:::i;:::-;7598:3;7591:37;7516:118;;:::o;7640:222::-;7733:4;7771:2;7760:9;7756:18;7748:26;;7784:71;7852:1;7841:9;7837:17;7828:6;7784:71;:::i;:::-;7640:222;;;;:::o;7868:619::-;7945:6;7953;7961;8010:2;7998:9;7989:7;7985:23;7981:32;7978:119;;;8016:79;;:::i;:::-;7978:119;8136:1;8161:53;8206:7;8197:6;8186:9;8182:22;8161:53;:::i;:::-;8151:63;;8107:117;8263:2;8289:53;8334:7;8325:6;8314:9;8310:22;8289:53;:::i;:::-;8279:63;;8234:118;8391:2;8417:53;8462:7;8453:6;8442:9;8438:22;8417:53;:::i;:::-;8407:63;;8362:118;7868:619;;;;;:::o;8493:311::-;8570:4;8660:18;8652:6;8649:30;8646:56;;;8682:18;;:::i;:::-;8646:56;8732:4;8724:6;8720:17;8712:25;;8792:4;8786;8782:15;8774:23;;8493:311;;;:::o;8810:117::-;8919:1;8916;8909:12;8950:710;9046:5;9071:81;9087:64;9144:6;9087:64;:::i;:::-;9071:81;:::i;:::-;9062:90;;9172:5;9201:6;9194:5;9187:21;9235:4;9228:5;9224:16;9217:23;;9288:4;9280:6;9276:17;9268:6;9264:30;9317:3;9309:6;9306:15;9303:122;;;9336:79;;:::i;:::-;9303:122;9451:6;9434:220;9468:6;9463:3;9460:15;9434:220;;;9543:3;9572:37;9605:3;9593:10;9572:37;:::i;:::-;9567:3;9560:50;9639:4;9634:3;9630:14;9623:21;;9510:144;9494:4;9489:3;9485:14;9478:21;;9434:220;;;9438:21;9052:608;;8950:710;;;;;:::o;9683:370::-;9754:5;9803:3;9796:4;9788:6;9784:17;9780:27;9770:122;;9811:79;;:::i;:::-;9770:122;9928:6;9915:20;9953:94;10043:3;10035:6;10028:4;10020:6;10016:17;9953:94;:::i;:::-;9944:103;;9760:293;9683:370;;;;:::o;10059:116::-;10129:21;10144:5;10129:21;:::i;:::-;10122:5;10119:32;10109:60;;10165:1;10162;10155:12;10109:60;10059:116;:::o;10181:133::-;10224:5;10262:6;10249:20;10240:29;;10278:30;10302:5;10278:30;:::i;:::-;10181:133;;;;:::o;10320:678::-;10410:6;10418;10467:2;10455:9;10446:7;10442:23;10438:32;10435:119;;;10473:79;;:::i;:::-;10435:119;10621:1;10610:9;10606:17;10593:31;10651:18;10643:6;10640:30;10637:117;;;10673:79;;:::i;:::-;10637:117;10778:78;10848:7;10839:6;10828:9;10824:22;10778:78;:::i;:::-;10768:88;;10564:302;10905:2;10931:50;10973:7;10964:6;10953:9;10949:22;10931:50;:::i;:::-;10921:60;;10876:115;10320:678;;;;;:::o;11004:323::-;11060:6;11109:2;11097:9;11088:7;11084:23;11080:32;11077:119;;;11115:79;;:::i;:::-;11077:119;11235:1;11260:50;11302:7;11293:6;11282:9;11278:22;11260:50;:::i;:::-;11250:60;;11206:114;11004:323;;;;:::o;11333:329::-;11392:6;11441:2;11429:9;11420:7;11416:23;11412:32;11409:119;;;11447:79;;:::i;:::-;11409:119;11567:1;11592:53;11637:7;11628:6;11617:9;11613:22;11592:53;:::i;:::-;11582:63;;11538:117;11333:329;;;;:::o;11668:114::-;11735:6;11769:5;11763:12;11753:22;;11668:114;;;:::o;11788:184::-;11887:11;11921:6;11916:3;11909:19;11961:4;11956:3;11952:14;11937:29;;11788:184;;;;:::o;11978:132::-;12045:4;12068:3;12060:11;;12098:4;12093:3;12089:14;12081:22;;11978:132;;;:::o;12116:108::-;12193:24;12211:5;12193:24;:::i;:::-;12188:3;12181:37;12116:108;;:::o;12230:179::-;12299:10;12320:46;12362:3;12354:6;12320:46;:::i;:::-;12398:4;12393:3;12389:14;12375:28;;12230:179;;;;:::o;12415:113::-;12485:4;12517;12512:3;12508:14;12500:22;;12415:113;;;:::o;12564:732::-;12683:3;12712:54;12760:5;12712:54;:::i;:::-;12782:86;12861:6;12856:3;12782:86;:::i;:::-;12775:93;;12892:56;12942:5;12892:56;:::i;:::-;12971:7;13002:1;12987:284;13012:6;13009:1;13006:13;12987:284;;;13088:6;13082:13;13115:63;13174:3;13159:13;13115:63;:::i;:::-;13108:70;;13201:60;13254:6;13201:60;:::i;:::-;13191:70;;13047:224;13034:1;13031;13027:9;13022:14;;12987:284;;;12991:14;13287:3;13280:10;;12688:608;;;12564:732;;;;:::o;13302:373::-;13445:4;13483:2;13472:9;13468:18;13460:26;;13532:9;13526:4;13522:20;13518:1;13507:9;13503:17;13496:47;13560:108;13663:4;13654:6;13560:108;:::i;:::-;13552:116;;13302:373;;;;:::o;13681:468::-;13746:6;13754;13803:2;13791:9;13782:7;13778:23;13774:32;13771:119;;;13809:79;;:::i;:::-;13771:119;13929:1;13954:53;13999:7;13990:6;13979:9;13975:22;13954:53;:::i;:::-;13944:63;;13900:117;14056:2;14082:50;14124:7;14115:6;14104:9;14100:22;14082:50;:::i;:::-;14072:60;;14027:115;13681:468;;;;;:::o;14155:307::-;14216:4;14306:18;14298:6;14295:30;14292:56;;;14328:18;;:::i;:::-;14292:56;14366:29;14388:6;14366:29;:::i;:::-;14358:37;;14450:4;14444;14440:15;14432:23;;14155:307;;;:::o;14468:423::-;14545:5;14570:65;14586:48;14627:6;14586:48;:::i;:::-;14570:65;:::i;:::-;14561:74;;14658:6;14651:5;14644:21;14696:4;14689:5;14685:16;14734:3;14725:6;14720:3;14716:16;14713:25;14710:112;;;14741:79;;:::i;:::-;14710:112;14831:54;14878:6;14873:3;14868;14831:54;:::i;:::-;14551:340;14468:423;;;;;:::o;14910:338::-;14965:5;15014:3;15007:4;14999:6;14995:17;14991:27;14981:122;;15022:79;;:::i;:::-;14981:122;15139:6;15126:20;15164:78;15238:3;15230:6;15223:4;15215:6;15211:17;15164:78;:::i;:::-;15155:87;;14971:277;14910:338;;;;:::o;15254:943::-;15349:6;15357;15365;15373;15422:3;15410:9;15401:7;15397:23;15393:33;15390:120;;;15429:79;;:::i;:::-;15390:120;15549:1;15574:53;15619:7;15610:6;15599:9;15595:22;15574:53;:::i;:::-;15564:63;;15520:117;15676:2;15702:53;15747:7;15738:6;15727:9;15723:22;15702:53;:::i;:::-;15692:63;;15647:118;15804:2;15830:53;15875:7;15866:6;15855:9;15851:22;15830:53;:::i;:::-;15820:63;;15775:118;15960:2;15949:9;15945:18;15932:32;15991:18;15983:6;15980:30;15977:117;;;16013:79;;:::i;:::-;15977:117;16118:62;16172:7;16163:6;16152:9;16148:22;16118:62;:::i;:::-;16108:72;;15903:287;15254:943;;;;;;;:::o;16203:474::-;16271:6;16279;16328:2;16316:9;16307:7;16303:23;16299:32;16296:119;;;16334:79;;:::i;:::-;16296:119;16454:1;16479:53;16524:7;16515:6;16504:9;16500:22;16479:53;:::i;:::-;16469:63;;16425:117;16581:2;16607:53;16652:7;16643:6;16632:9;16628:22;16607:53;:::i;:::-;16597:63;;16552:118;16203:474;;;;;:::o;16683:180::-;16731:77;16728:1;16721:88;16828:4;16825:1;16818:15;16852:4;16849:1;16842:15;16869:320;16913:6;16950:1;16944:4;16940:12;16930:22;;16997:1;16991:4;16987:12;17018:18;17008:81;;17074:4;17066:6;17062:17;17052:27;;17008:81;17136:2;17128:6;17125:14;17105:18;17102:38;17099:84;;17155:18;;:::i;:::-;17099:84;16920:269;16869:320;;;:::o;17195:141::-;17244:4;17267:3;17259:11;;17290:3;17287:1;17280:14;17324:4;17321:1;17311:18;17303:26;;17195:141;;;:::o;17342:93::-;17379:6;17426:2;17421;17414:5;17410:14;17406:23;17396:33;;17342:93;;;:::o;17441:107::-;17485:8;17535:5;17529:4;17525:16;17504:37;;17441:107;;;;:::o;17554:393::-;17623:6;17673:1;17661:10;17657:18;17696:97;17726:66;17715:9;17696:97;:::i;:::-;17814:39;17844:8;17833:9;17814:39;:::i;:::-;17802:51;;17886:4;17882:9;17875:5;17871:21;17862:30;;17935:4;17925:8;17921:19;17914:5;17911:30;17901:40;;17630:317;;17554:393;;;;;:::o;17953:60::-;17981:3;18002:5;17995:12;;17953:60;;;:::o;18019:142::-;18069:9;18102:53;18120:34;18129:24;18147:5;18129:24;:::i;:::-;18120:34;:::i;:::-;18102:53;:::i;:::-;18089:66;;18019:142;;;:::o;18167:75::-;18210:3;18231:5;18224:12;;18167:75;;;:::o;18248:269::-;18358:39;18389:7;18358:39;:::i;:::-;18419:91;18468:41;18492:16;18468:41;:::i;:::-;18460:6;18453:4;18447:11;18419:91;:::i;:::-;18413:4;18406:105;18324:193;18248:269;;;:::o;18523:73::-;18568:3;18523:73;:::o;18602:189::-;18679:32;;:::i;:::-;18720:65;18778:6;18770;18764:4;18720:65;:::i;:::-;18655:136;18602:189;;:::o;18797:186::-;18857:120;18874:3;18867:5;18864:14;18857:120;;;18928:39;18965:1;18958:5;18928:39;:::i;:::-;18901:1;18894:5;18890:13;18881:22;;18857:120;;;18797:186;;:::o;18989:543::-;19090:2;19085:3;19082:11;19079:446;;;19124:38;19156:5;19124:38;:::i;:::-;19208:29;19226:10;19208:29;:::i;:::-;19198:8;19194:44;19391:2;19379:10;19376:18;19373:49;;;19412:8;19397:23;;19373:49;19435:80;19491:22;19509:3;19491:22;:::i;:::-;19481:8;19477:37;19464:11;19435:80;:::i;:::-;19094:431;;19079:446;18989:543;;;:::o;19538:117::-;19592:8;19642:5;19636:4;19632:16;19611:37;;19538:117;;;;:::o;19661:169::-;19705:6;19738:51;19786:1;19782:6;19774:5;19771:1;19767:13;19738:51;:::i;:::-;19734:56;19819:4;19813;19809:15;19799:25;;19712:118;19661:169;;;;:::o;19835:295::-;19911:4;20057:29;20082:3;20076:4;20057:29;:::i;:::-;20049:37;;20119:3;20116:1;20112:11;20106:4;20103:21;20095:29;;19835:295;;;;:::o;20135:1395::-;20252:37;20285:3;20252:37;:::i;:::-;20354:18;20346:6;20343:30;20340:56;;;20376:18;;:::i;:::-;20340:56;20420:38;20452:4;20446:11;20420:38;:::i;:::-;20505:67;20565:6;20557;20551:4;20505:67;:::i;:::-;20599:1;20623:4;20610:17;;20655:2;20647:6;20644:14;20672:1;20667:618;;;;21329:1;21346:6;21343:77;;;21395:9;21390:3;21386:19;21380:26;21371:35;;21343:77;21446:67;21506:6;21499:5;21446:67;:::i;:::-;21440:4;21433:81;21302:222;20637:887;;20667:618;20719:4;20715:9;20707:6;20703:22;20753:37;20785:4;20753:37;:::i;:::-;20812:1;20826:208;20840:7;20837:1;20834:14;20826:208;;;20919:9;20914:3;20910:19;20904:26;20896:6;20889:42;20970:1;20962:6;20958:14;20948:24;;21017:2;21006:9;21002:18;20989:31;;20863:4;20860:1;20856:12;20851:17;;20826:208;;;21062:6;21053:7;21050:19;21047:179;;;21120:9;21115:3;21111:19;21105:26;21163:48;21205:4;21197:6;21193:17;21182:9;21163:48;:::i;:::-;21155:6;21148:64;21070:156;21047:179;21272:1;21268;21260:6;21256:14;21252:22;21246:4;21239:36;20674:611;;;20637:887;;20227:1303;;;20135:1395;;:::o;21536:220::-;21676:34;21672:1;21664:6;21660:14;21653:58;21745:3;21740:2;21732:6;21728:15;21721:28;21536:220;:::o;21762:366::-;21904:3;21925:67;21989:2;21984:3;21925:67;:::i;:::-;21918:74;;22001:93;22090:3;22001:93;:::i;:::-;22119:2;22114:3;22110:12;22103:19;;21762:366;;;:::o;22134:419::-;22300:4;22338:2;22327:9;22323:18;22315:26;;22387:9;22381:4;22377:20;22373:1;22362:9;22358:17;22351:47;22415:131;22541:4;22415:131;:::i;:::-;22407:139;;22134:419;;;:::o;22559:249::-;22699:34;22695:1;22687:6;22683:14;22676:58;22768:32;22763:2;22755:6;22751:15;22744:57;22559:249;:::o;22814:366::-;22956:3;22977:67;23041:2;23036:3;22977:67;:::i;:::-;22970:74;;23053:93;23142:3;23053:93;:::i;:::-;23171:2;23166:3;23162:12;23155:19;;22814:366;;;:::o;23186:419::-;23352:4;23390:2;23379:9;23375:18;23367:26;;23439:9;23433:4;23429:20;23425:1;23414:9;23410:17;23403:47;23467:131;23593:4;23467:131;:::i;:::-;23459:139;;23186:419;;;:::o;23611:181::-;23751:33;23747:1;23739:6;23735:14;23728:57;23611:181;:::o;23798:366::-;23940:3;23961:67;24025:2;24020:3;23961:67;:::i;:::-;23954:74;;24037:93;24126:3;24037:93;:::i;:::-;24155:2;24150:3;24146:12;24139:19;;23798:366;;;:::o;24170:419::-;24336:4;24374:2;24363:9;24359:18;24351:26;;24423:9;24417:4;24413:20;24409:1;24398:9;24394:17;24387:47;24451:131;24577:4;24451:131;:::i;:::-;24443:139;;24170:419;;;:::o;24595:180::-;24643:77;24640:1;24633:88;24740:4;24737:1;24730:15;24764:4;24761:1;24754:15;24781:180;24829:77;24826:1;24819:88;24926:4;24923:1;24916:15;24950:4;24947:1;24940:15;24967:185;25007:1;25024:20;25042:1;25024:20;:::i;:::-;25019:25;;25058:20;25076:1;25058:20;:::i;:::-;25053:25;;25097:1;25087:35;;25102:18;;:::i;:::-;25087:35;25144:1;25141;25137:9;25132:14;;24967:185;;;;:::o;25158:191::-;25198:3;25217:20;25235:1;25217:20;:::i;:::-;25212:25;;25251:20;25269:1;25251:20;:::i;:::-;25246:25;;25294:1;25291;25287:9;25280:16;;25315:3;25312:1;25309:10;25306:36;;;25322:18;;:::i;:::-;25306:36;25158:191;;;;:::o;25355:224::-;25495:34;25491:1;25483:6;25479:14;25472:58;25564:7;25559:2;25551:6;25547:15;25540:32;25355:224;:::o;25585:366::-;25727:3;25748:67;25812:2;25807:3;25748:67;:::i;:::-;25741:74;;25824:93;25913:3;25824:93;:::i;:::-;25942:2;25937:3;25933:12;25926:19;;25585:366;;;:::o;25957:419::-;26123:4;26161:2;26150:9;26146:18;26138:26;;26210:9;26204:4;26200:20;26196:1;26185:9;26181:17;26174:47;26238:131;26364:4;26238:131;:::i;:::-;26230:139;;25957:419;;;:::o;26382:169::-;26522:21;26518:1;26510:6;26506:14;26499:45;26382:169;:::o;26557:366::-;26699:3;26720:67;26784:2;26779:3;26720:67;:::i;:::-;26713:74;;26796:93;26885:3;26796:93;:::i;:::-;26914:2;26909:3;26905:12;26898:19;;26557:366;;;:::o;26929:419::-;27095:4;27133:2;27122:9;27118:18;27110:26;;27182:9;27176:4;27172:20;27168:1;27157:9;27153:17;27146:47;27210:131;27336:4;27210:131;:::i;:::-;27202:139;;26929:419;;;:::o;27354:233::-;27393:3;27416:24;27434:5;27416:24;:::i;:::-;27407:33;;27462:66;27455:5;27452:77;27449:103;;27532:18;;:::i;:::-;27449:103;27579:1;27572:5;27568:13;27561:20;;27354:233;;;:::o;27593:442::-;27742:4;27780:2;27769:9;27765:18;27757:26;;27793:71;27861:1;27850:9;27846:17;27837:6;27793:71;:::i;:::-;27874:72;27942:2;27931:9;27927:18;27918:6;27874:72;:::i;:::-;27956;28024:2;28013:9;28009:18;28000:6;27956:72;:::i;:::-;27593:442;;;;;;:::o;28041:169::-;28181:21;28177:1;28169:6;28165:14;28158:45;28041:169;:::o;28216:366::-;28358:3;28379:67;28443:2;28438:3;28379:67;:::i;:::-;28372:74;;28455:93;28544:3;28455:93;:::i;:::-;28573:2;28568:3;28564:12;28557:19;;28216:366;;;:::o;28588:419::-;28754:4;28792:2;28781:9;28777:18;28769:26;;28841:9;28835:4;28831:20;28827:1;28816:9;28812:17;28805:47;28869:131;28995:4;28869:131;:::i;:::-;28861:139;;28588:419;;;:::o;29013:180::-;29153:32;29149:1;29141:6;29137:14;29130:56;29013:180;:::o;29199:366::-;29341:3;29362:67;29426:2;29421:3;29362:67;:::i;:::-;29355:74;;29438:93;29527:3;29438:93;:::i;:::-;29556:2;29551:3;29547:12;29540:19;;29199:366;;;:::o;29571:419::-;29737:4;29775:2;29764:9;29760:18;29752:26;;29824:9;29818:4;29814:20;29810:1;29799:9;29795:17;29788:47;29852:131;29978:4;29852:131;:::i;:::-;29844:139;;29571:419;;;:::o;29996:221::-;30136:34;30132:1;30124:6;30120:14;30113:58;30205:4;30200:2;30192:6;30188:15;30181:29;29996:221;:::o;30223:366::-;30365:3;30386:67;30450:2;30445:3;30386:67;:::i;:::-;30379:74;;30462:93;30551:3;30462:93;:::i;:::-;30580:2;30575:3;30571:12;30564:19;;30223:366;;;:::o;30595:419::-;30761:4;30799:2;30788:9;30784:18;30776:26;;30848:9;30842:4;30838:20;30834:1;30823:9;30819:17;30812:47;30876:131;31002:4;30876:131;:::i;:::-;30868:139;;30595:419;;;:::o;31020:242::-;31160:34;31156:1;31148:6;31144:14;31137:58;31229:25;31224:2;31216:6;31212:15;31205:50;31020:242;:::o;31268:366::-;31410:3;31431:67;31495:2;31490:3;31431:67;:::i;:::-;31424:74;;31507:93;31596:3;31507:93;:::i;:::-;31625:2;31620:3;31616:12;31609:19;;31268:366;;;:::o;31640:419::-;31806:4;31844:2;31833:9;31829:18;31821:26;;31893:9;31887:4;31883:20;31879:1;31868:9;31864:17;31857:47;31921:131;32047:4;31921:131;:::i;:::-;31913:139;;31640:419;;;:::o;32065:233::-;32205:34;32201:1;32193:6;32189:14;32182:58;32274:16;32269:2;32261:6;32257:15;32250:41;32065:233;:::o;32304:366::-;32446:3;32467:67;32531:2;32526:3;32467:67;:::i;:::-;32460:74;;32543:93;32632:3;32543:93;:::i;:::-;32661:2;32656:3;32652:12;32645:19;;32304:366;;;:::o;32676:419::-;32842:4;32880:2;32869:9;32865:18;32857:26;;32929:9;32923:4;32919:20;32915:1;32904:9;32900:17;32893:47;32957:131;33083:4;32957:131;:::i;:::-;32949:139;;32676:419;;;:::o;33101:230::-;33241:34;33237:1;33229:6;33225:14;33218:58;33310:13;33305:2;33297:6;33293:15;33286:38;33101:230;:::o;33337:366::-;33479:3;33500:67;33564:2;33559:3;33500:67;:::i;:::-;33493:74;;33576:93;33665:3;33576:93;:::i;:::-;33694:2;33689:3;33685:12;33678:19;;33337:366;;;:::o;33709:419::-;33875:4;33913:2;33902:9;33898:18;33890:26;;33962:9;33956:4;33952:20;33948:1;33937:9;33933:17;33926:47;33990:131;34116:4;33990:131;:::i;:::-;33982:139;;33709:419;;;:::o;34134:231::-;34274:34;34270:1;34262:6;34258:14;34251:58;34343:14;34338:2;34330:6;34326:15;34319:39;34134:231;:::o;34371:366::-;34513:3;34534:67;34598:2;34593:3;34534:67;:::i;:::-;34527:74;;34610:93;34699:3;34610:93;:::i;:::-;34728:2;34723:3;34719:12;34712:19;;34371:366;;;:::o;34743:419::-;34909:4;34947:2;34936:9;34932:18;34924:26;;34996:9;34990:4;34986:20;34982:1;34971:9;34967:17;34960:47;35024:131;35150:4;35024:131;:::i;:::-;35016:139;;34743:419;;;:::o;35168:180::-;35216:77;35213:1;35206:88;35313:4;35310:1;35303:15;35337:4;35334:1;35327:15;35354:114;35421:6;35455:5;35449:12;35439:22;;35354:114;;;:::o;35474:184::-;35573:11;35607:6;35602:3;35595:19;35647:4;35642:3;35638:14;35623:29;;35474:184;;;;:::o;35664:132::-;35731:4;35754:3;35746:11;;35784:4;35779:3;35775:14;35767:22;;35664:132;;;:::o;35802:108::-;35879:24;35897:5;35879:24;:::i;:::-;35874:3;35867:37;35802:108;;:::o;35916:179::-;35985:10;36006:46;36048:3;36040:6;36006:46;:::i;:::-;36084:4;36079:3;36075:14;36061:28;;35916:179;;;;:::o;36101:113::-;36171:4;36203;36198:3;36194:14;36186:22;;36101:113;;;:::o;36250:732::-;36369:3;36398:54;36446:5;36398:54;:::i;:::-;36468:86;36547:6;36542:3;36468:86;:::i;:::-;36461:93;;36578:56;36628:5;36578:56;:::i;:::-;36657:7;36688:1;36673:284;36698:6;36695:1;36692:13;36673:284;;;36774:6;36768:13;36801:63;36860:3;36845:13;36801:63;:::i;:::-;36794:70;;36887:60;36940:6;36887:60;:::i;:::-;36877:70;;36733:224;36720:1;36717;36713:9;36708:14;;36673:284;;;36677:14;36973:3;36966:10;;36374:608;;;36250:732;;;;:::o;36988:471::-;37153:4;37191:2;37180:9;37176:18;37168:26;;37240:9;37234:4;37230:20;37226:1;37215:9;37211:17;37204:47;37268:108;37371:4;37362:6;37268:108;:::i;:::-;37260:116;;37386:66;37448:2;37437:9;37433:18;37424:6;37386:66;:::i;:::-;36988:471;;;;;:::o;37465:174::-;37605:26;37601:1;37593:6;37589:14;37582:50;37465:174;:::o;37645:366::-;37787:3;37808:67;37872:2;37867:3;37808:67;:::i;:::-;37801:74;;37884:93;37973:3;37884:93;:::i;:::-;38002:2;37997:3;37993:12;37986:19;;37645:366;;;:::o;38017:419::-;38183:4;38221:2;38210:9;38206:18;38198:26;;38270:9;38264:4;38260:20;38256:1;38245:9;38241:17;38234:47;38298:131;38424:4;38298:131;:::i;:::-;38290:139;;38017:419;;;:::o;38442:228::-;38582:34;38578:1;38570:6;38566:14;38559:58;38651:11;38646:2;38638:6;38634:15;38627:36;38442:228;:::o;38676:366::-;38818:3;38839:67;38903:2;38898:3;38839:67;:::i;:::-;38832:74;;38915:93;39004:3;38915:93;:::i;:::-;39033:2;39028:3;39024:12;39017:19;;38676:366;;;:::o;39048:419::-;39214:4;39252:2;39241:9;39237:18;39229:26;;39301:9;39295:4;39291:20;39287:1;39276:9;39272:17;39265:47;39329:131;39455:4;39329:131;:::i;:::-;39321:139;;39048:419;;;:::o;39473:320::-;39588:4;39626:2;39615:9;39611:18;39603:26;;39639:71;39707:1;39696:9;39692:17;39683:6;39639:71;:::i;:::-;39720:66;39782:2;39771:9;39767:18;39758:6;39720:66;:::i;:::-;39473:320;;;;;:::o;39799:174::-;39939:26;39935:1;39927:6;39923:14;39916:50;39799:174;:::o;39979:366::-;40121:3;40142:67;40206:2;40201:3;40142:67;:::i;:::-;40135:74;;40218:93;40307:3;40218:93;:::i;:::-;40336:2;40331:3;40327:12;40320:19;;39979:366;;;:::o;40351:419::-;40517:4;40555:2;40544:9;40540:18;40532:26;;40604:9;40598:4;40594:20;40590:1;40579:9;40575:17;40568:47;40632:131;40758:4;40632:131;:::i;:::-;40624:139;;40351:419;;;:::o;40776:148::-;40878:11;40915:3;40900:18;;40776:148;;;;:::o;40930:390::-;41036:3;41064:39;41097:5;41064:39;:::i;:::-;41119:89;41201:6;41196:3;41119:89;:::i;:::-;41112:96;;41217:65;41275:6;41270:3;41263:4;41256:5;41252:16;41217:65;:::i;:::-;41307:6;41302:3;41298:16;41291:23;;41040:280;40930:390;;;;:::o;41326:435::-;41506:3;41528:95;41619:3;41610:6;41528:95;:::i;:::-;41521:102;;41640:95;41731:3;41722:6;41640:95;:::i;:::-;41633:102;;41752:3;41745:10;;41326:435;;;;;:::o;41767:225::-;41907:34;41903:1;41895:6;41891:14;41884:58;41976:8;41971:2;41963:6;41959:15;41952:33;41767:225;:::o;41998:366::-;42140:3;42161:67;42225:2;42220:3;42161:67;:::i;:::-;42154:74;;42237:93;42326:3;42237:93;:::i;:::-;42355:2;42350:3;42346:12;42339:19;;41998:366;;;:::o;42370:419::-;42536:4;42574:2;42563:9;42559:18;42551:26;;42623:9;42617:4;42613:20;42609:1;42598:9;42594:17;42587:47;42651:131;42777:4;42651:131;:::i;:::-;42643:139;;42370:419;;;:::o;42795:182::-;42935:34;42931:1;42923:6;42919:14;42912:58;42795:182;:::o;42983:366::-;43125:3;43146:67;43210:2;43205:3;43146:67;:::i;:::-;43139:74;;43222:93;43311:3;43222:93;:::i;:::-;43340:2;43335:3;43331:12;43324:19;;42983:366;;;:::o;43355:419::-;43521:4;43559:2;43548:9;43544:18;43536:26;;43608:9;43602:4;43598:20;43594:1;43583:9;43579:17;43572:47;43636:131;43762:4;43636:131;:::i;:::-;43628:139;;43355:419;;;:::o;43780:224::-;43920:34;43916:1;43908:6;43904:14;43897:58;43989:7;43984:2;43976:6;43972:15;43965:32;43780:224;:::o;44010:366::-;44152:3;44173:67;44237:2;44232:3;44173:67;:::i;:::-;44166:74;;44249:93;44338:3;44249:93;:::i;:::-;44367:2;44362:3;44358:12;44351:19;;44010:366;;;:::o;44382:419::-;44548:4;44586:2;44575:9;44571:18;44563:26;;44635:9;44629:4;44625:20;44621:1;44610:9;44606:17;44599:47;44663:131;44789:4;44663:131;:::i;:::-;44655:139;;44382:419;;;:::o;44807:223::-;44947:34;44943:1;44935:6;44931:14;44924:58;45016:6;45011:2;45003:6;44999:15;44992:31;44807:223;:::o;45036:366::-;45178:3;45199:67;45263:2;45258:3;45199:67;:::i;:::-;45192:74;;45275:93;45364:3;45275:93;:::i;:::-;45393:2;45388:3;45384:12;45377:19;;45036:366;;;:::o;45408:419::-;45574:4;45612:2;45601:9;45597:18;45589:26;;45661:9;45655:4;45651:20;45647:1;45636:9;45632:17;45625:47;45689:131;45815:4;45689:131;:::i;:::-;45681:139;;45408:419;;;:::o;45833:194::-;45873:4;45893:20;45911:1;45893:20;:::i;:::-;45888:25;;45927:20;45945:1;45927:20;:::i;:::-;45922:25;;45971:1;45968;45964:9;45956:17;;45995:1;45989:4;45986:11;45983:37;;;46000:18;;:::i;:::-;45983:37;45833:194;;;;:::o;46033:175::-;46173:27;46169:1;46161:6;46157:14;46150:51;46033:175;:::o;46214:366::-;46356:3;46377:67;46441:2;46436:3;46377:67;:::i;:::-;46370:74;;46453:93;46542:3;46453:93;:::i;:::-;46571:2;46566:3;46562:12;46555:19;;46214:366;;;:::o;46586:419::-;46752:4;46790:2;46779:9;46775:18;46767:26;;46839:9;46833:4;46829:20;46825:1;46814:9;46810:17;46803:47;46867:131;46993:4;46867:131;:::i;:::-;46859:139;;46586:419;;;:::o;47011:237::-;47151:34;47147:1;47139:6;47135:14;47128:58;47220:20;47215:2;47207:6;47203:15;47196:45;47011:237;:::o;47254:366::-;47396:3;47417:67;47481:2;47476:3;47417:67;:::i;:::-;47410:74;;47493:93;47582:3;47493:93;:::i;:::-;47611:2;47606:3;47602:12;47595:19;;47254:366;;;:::o;47626:419::-;47792:4;47830:2;47819:9;47815:18;47807:26;;47879:9;47873:4;47869:20;47865:1;47854:9;47850:17;47843:47;47907:131;48033:4;47907:131;:::i;:::-;47899:139;;47626:419;;;:::o;48051:176::-;48083:1;48100:20;48118:1;48100:20;:::i;:::-;48095:25;;48134:20;48152:1;48134:20;:::i;:::-;48129:25;;48173:1;48163:35;;48178:18;;:::i;:::-;48163:35;48219:1;48216;48212:9;48207:14;;48051:176;;;;:::o;48233:98::-;48284:6;48318:5;48312:12;48302:22;;48233:98;;;:::o;48337:168::-;48420:11;48454:6;48449:3;48442:19;48494:4;48489:3;48485:14;48470:29;;48337:168;;;;:::o;48511:373::-;48597:3;48625:38;48657:5;48625:38;:::i;:::-;48679:70;48742:6;48737:3;48679:70;:::i;:::-;48672:77;;48758:65;48816:6;48811:3;48804:4;48797:5;48793:16;48758:65;:::i;:::-;48848:29;48870:6;48848:29;:::i;:::-;48843:3;48839:39;48832:46;;48601:283;48511:373;;;;:::o;48890:640::-;49085:4;49123:3;49112:9;49108:19;49100:27;;49137:71;49205:1;49194:9;49190:17;49181:6;49137:71;:::i;:::-;49218:72;49286:2;49275:9;49271:18;49262:6;49218:72;:::i;:::-;49300;49368:2;49357:9;49353:18;49344:6;49300:72;:::i;:::-;49419:9;49413:4;49409:20;49404:2;49393:9;49389:18;49382:48;49447:76;49518:4;49509:6;49447:76;:::i;:::-;49439:84;;48890:640;;;;;;;:::o;49536:141::-;49592:5;49623:6;49617:13;49608:22;;49639:32;49665:5;49639:32;:::i;:::-;49536:141;;;;:::o;49683:349::-;49752:6;49801:2;49789:9;49780:7;49776:23;49772:32;49769:119;;;49807:79;;:::i;:::-;49769:119;49927:1;49952:63;50007:7;49998:6;49987:9;49983:22;49952:63;:::i;:::-;49942:73;;49898:127;49683:349;;;;:::o;50038:182::-;50178:34;50174:1;50166:6;50162:14;50155:58;50038:182;:::o;50226:366::-;50368:3;50389:67;50453:2;50448:3;50389:67;:::i;:::-;50382:74;;50465:93;50554:3;50465:93;:::i;:::-;50583:2;50578:3;50574:12;50567:19;;50226:366;;;:::o;50598:419::-;50764:4;50802:2;50791:9;50787:18;50779:26;;50851:9;50845:4;50841:20;50837:1;50826:9;50822:17;50815:47;50879:131;51005:4;50879:131;:::i;:::-;50871:139;;50598:419;;;:::o;51023:178::-;51163:30;51159:1;51151:6;51147:14;51140:54;51023:178;:::o;51207:366::-;51349:3;51370:67;51434:2;51429:3;51370:67;:::i;:::-;51363:74;;51446:93;51535:3;51446:93;:::i;:::-;51564:2;51559:3;51555:12;51548:19;;51207:366;;;:::o;51579:419::-;51745:4;51783:2;51772:9;51768:18;51760:26;;51832:9;51826:4;51822:20;51818:1;51807:9;51803:17;51796:47;51860:131;51986:4;51860:131;:::i;:::-;51852:139;;51579:419;;;:::o;52004:180::-;52052:77;52049:1;52042:88;52149:4;52146:1;52139:15;52173:4;52170:1;52163:15

Swarm Source

ipfs://b3f1cc6dcf38576fbc0e4265121d57ece5fc2dbe47ea4350239fd8714fb41619
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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