ETH Price: $3,296.30 (-1.02%)

Token

Puffer Gang (PUFF)
 

Overview

Max Total Supply

7,415 PUFF

Holders

1,200

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
roasthk.eth
Balance
5 PUFF
0xdfb69e04e0c8af30a99f5839ebaa3e923191ee5f
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Welcome to the Puffer Gang - 9876 generative PFP NFTs with utility on the Ethereum Blockchain.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
PufferGang

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-07-04
*/

// File: @openzeppelin/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: @openzeppelin/contracts/token/ERC721/IERC721.sol


// OpenZeppelin Contracts (last updated v4.6.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 be 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: @openzeppelin/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/chiru-labs/ERC721A/contracts/IERC721A.sol


// ERC721A Contracts v3.3.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;



/**
 * @dev Interface of an ERC721A compliant contract.
 */
interface IERC721A is IERC721, IERC721Metadata {
    /**
     * The caller must own the token or be an approved operator.
     */
    error ApprovalCallerNotOwnerNorApproved();

    /**
     * The token does not exist.
     */
    error ApprovalQueryForNonexistentToken();

    /**
     * The caller cannot approve to their own address.
     */
    error ApproveToCaller();

    /**
     * The caller cannot approve to the current owner.
     */
    error ApprovalToCurrentOwner();

    /**
     * Cannot query the balance for the zero address.
     */
    error BalanceQueryForZeroAddress();

    /**
     * Cannot mint to the zero address.
     */
    error MintToZeroAddress();

    /**
     * The quantity of tokens minted must be more than zero.
     */
    error MintZeroQuantity();

    /**
     * The token does not exist.
     */
    error OwnerQueryForNonexistentToken();

    /**
     * The caller must own the token or be an approved operator.
     */
    error TransferCallerNotOwnerNorApproved();

    /**
     * The token must be owned by `from`.
     */
    error TransferFromIncorrectOwner();

    /**
     * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface.
     */
    error TransferToNonERC721ReceiverImplementer();

    /**
     * Cannot transfer to the zero address.
     */
    error TransferToZeroAddress();

    /**
     * The token does not exist.
     */
    error URIQueryForNonexistentToken();

    // Compiler will pack this into a single 256bit word.
    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
        // For miscellaneous variable(s) pertaining to the address
        // (e.g. number of whitelist mint slots used).
        // If there are multiple variables, please pack them into a uint64.
        uint64 aux;
    }

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     * 
     * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens.
     */
    function totalSupply() external view returns (uint256);
}

// File: @openzeppelin/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: @openzeppelin/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: @openzeppelin/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: @openzeppelin/contracts/utils/Address.sol


// OpenZeppelin Contracts (last updated v4.5.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

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

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


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

pragma solidity ^0.8.0;

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

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

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


// OpenZeppelin Contracts v4.4.1 (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 Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

// File: https://github.com/chiru-labs/ERC721A/contracts/ERC721A.sol


// ERC721A Contracts v3.3.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;







/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is Context, ERC165, IERC721A {
    using Address for address;
    using Strings for uint256;

    // The tokenId of the next token to be minted.
    uint256 internal _currentIndex;

    // The number of tokens burned.
    uint256 internal _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned. See _ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;

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

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
        _currentIndex = _startTokenId();
    }

    /**
     * To change the starting tokenId, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 0;
    }

    /**
     * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.
     */
    function totalSupply() public view override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex - _startTokenId() times
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view returns (uint256) {
        // Counter underflow is impossible as _currentIndex does not decrement,
        // and it is initialized to _startTokenId()
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

    /**
     * @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 override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberBurned);
    }

    /**
     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return _addressData[owner].aux;
    }

    /**
     * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        _addressData[owner].aux = aux;
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr) if (curr < _currentIndex) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (!ownership.burned) {
                    if (ownership.addr != address(0)) {
                        return ownership;
                    }
                    // Invariant:
                    // There will always be an ownership that has an address and is not burned
                    // before an ownership that does not have an address and is not burned.
                    // Hence, curr will not underflow.
                    while (true) {
                        curr--;
                        ownership = _ownerships[curr];
                        if (ownership.addr != address(0)) {
                            return ownership;
                        }
                    }
                }
            }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return _ownershipOf(tokenId).addr;
    }

    /**
     * @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) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

        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 overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return '';
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = ERC721A.ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();

        if (_msgSender() != owner) if(!isApprovedForAll(owner, _msgSender())) {
            revert ApprovalCallerNotOwnerNorApproved();
        }

        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

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

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_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 {
        _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 {
        _transfer(from, to, tokenId);
        if (to.isContract()) if(!_checkContractOnERC721Received(from, to, tokenId, _data)) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

    /**
     * @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`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return _startTokenId() <= tokenId && tokenId < _currentIndex && !_ownerships[tokenId].burned;
    }

    /**
     * @dev Equivalent to `_safeMint(to, quantity, '')`.
     */
    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');
    }

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement
     *   {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            if (to.isContract()) {
                do {
                    emit Transfer(address(0), to, updatedIndex);
                    if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (updatedIndex < end);
                // Reentrancy protection
                if (_currentIndex != startTokenId) revert();
            } else {
                do {
                    emit Transfer(address(0), to, updatedIndex++);
                } while (updatedIndex < end);
            }
            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 quantity) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            do {
                emit Transfer(address(0), to, updatedIndex++);
            } while (updatedIndex < end);

            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * 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
    ) private {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();

        bool isApprovedOrOwner = (_msgSender() == from ||
            isApprovedForAll(from, _msgSender()) ||
            getApproved(tokenId) == _msgSender());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner.
        delete _tokenApprovals[tokenId];

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = to;
            currSlot.startTimestamp = uint64(block.timestamp);

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

    /**
     * @dev Equivalent to `_burn(tokenId, false)`.
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        address from = prevOwnership.addr;

        if (approvalCheck) {
            bool isApprovedOrOwner = (_msgSender() == from ||
                isApprovedForAll(from, _msgSender()) ||
                getApproved(tokenId) == _msgSender());

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

        _beforeTokenTransfers(from, address(0), tokenId, 1);

        // Clear approvals from the previous owner.
        delete _tokenApprovals[tokenId];

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            AddressData storage addressData = _addressData[from];
            addressData.balance -= 1;
            addressData.numberBurned += 1;

            // Keep track of who burned the token, and the timestamp of burning.
            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = from;
            currSlot.startTimestamp = uint64(block.timestamp);
            currSlot.burned = true;

            // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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 _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
            return retval == IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * 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, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     * And also called after one token has been burned.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}

// File: PufferGs.sol



// Puffer Gang NFT contract created by NickNack using ERC-721A
// Puffer Gang has become a free-to-mint NFT however, we reserve the right to amend this at any point.
// This is not currently the intention

pragma solidity >=0.8.0 <0.9.0;










//Interface with the $FISH token to allow NFT minters to receive rewards upon mint.

interface FishToken {
    function updateRewardOnMint(address _to, uint256 _amount) external;
    function updateReward(address _from, address _to) external;
    function getReward(address _to) external;
    function spend(address _from, uint256 _amount) external;
}

contract PufferGang is ERC721A, Ownable {
    using Strings for uint256;

    string public baseURI;
    string public notRevealedUri;

    bool public isPaused = true;
    bool public isRevealed = false;

    uint256 public constant MAX_SUPPLY = 9876;
    uint256 public constant MAX_TX_MINT_AMOUNT = 5;
    uint256 public maxMintAmount = 5;
    uint256 public cost = 0 ether;
    uint256 public marketingSupply = 500;

    FishToken public fishToken;

    event NewPufferMinted(address sender, uint256 mintAmount);

    constructor(
        string memory _name,
        string memory _symbol,
        string memory _initNotRevealedUri
    ) ERC721A(_name, _symbol) {
        setNotRevealedURI(_initNotRevealedUri);
    }

// Check that minter meets conditions before mint and set minting conditions.

    modifier checks(uint256 _mintAmount) {
        require(
            (!isPaused || msg.sender == owner()) &&
                _mintAmount > 0 &&
                (_mintAmount <= MAX_TX_MINT_AMOUNT) &&
                totalSupply() + _mintAmount <= MAX_SUPPLY - marketingSupply,
            isPaused
                ? "Sale is paused"
                : (
                            _mintAmount > MAX_TX_MINT_AMOUNT
                                ? "Maximum mint amount exceeded"
                                : "Supply limit exceeded"
                        )
                );

            require(
                _numberMinted(msg.sender) + _mintAmount <= maxMintAmount,
                "Maximum mint amount exceeded"
            );
        _;
    }

// Set initial token ID

    function _startTokenId() internal view virtual override returns (uint256) {
        return 1;
    }

// Set base URI for fully revealed NFT

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

    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        require(_exists(tokenId));
        if (isRevealed == false) {
            return notRevealedUri;
        }
        string memory currentBaseURI = _baseURI();
        return
            bytes(currentBaseURI).length > 0
                ? string(
                    abi.encodePacked(
                        currentBaseURI,
                        tokenId.toString(),
                        ".json"
                    )
                )
                : "";
    }

// Mint and award $FISH tokens

    function _processMint(uint256 _mintAmount) internal {
        _safeMint(msg.sender, _mintAmount);
        emit NewPufferMinted(msg.sender, _mintAmount);
        fishToken.updateRewardOnMint(msg.sender, _mintAmount);
    }

    function mint(uint256 _mintAmount)
        public
        payable
        checks(_mintAmount)
    {
        _processMint(_mintAmount);
    }

    function walletOfOwner(address _owner)
        public
        view
        returns (uint256[] memory)
    {
        uint256 ownerTokenCount = balanceOf(_owner);
        uint256[] memory ownedTokenIds = new uint256[](ownerTokenCount);
        uint256 currentTokenId = _startTokenId();
        uint256 ownedTokenIndex = 0;
        address latestOwnerAddress;

        while (
            ownedTokenIndex < ownerTokenCount && currentTokenId <= MAX_SUPPLY
        ) {
            TokenOwnership memory ownership = _ownerships[currentTokenId];

            if (!ownership.burned && ownership.addr != address(0)) {
                latestOwnerAddress = ownership.addr;
            }

            if (latestOwnerAddress == _owner) {
                ownedTokenIds[ownedTokenIndex] = currentTokenId;

                ownedTokenIndex++;
            }

            currentTokenId++;
        }
        return ownedTokenIds;
    }

    function mintedTotalOf(address _owner) public view returns (uint256) {
        return _numberMinted(_owner);
    }

    function toggleIsPaused() public onlyOwner {
        isPaused = !isPaused;
    }

    function toggleIsRevealed() public onlyOwner {
        if (!isRevealed) require(bytes(baseURI).length > 0, "BaseURI not set");
        isRevealed = !isRevealed;
    }

    function setToken(address _contract) external onlyOwner {
        fishToken = FishToken(_contract);
    }

    function setCost(uint256 _newCost) public onlyOwner {
        cost = _newCost;
    }

    function setMaxMintAmount(uint256 _newMaxMintAmount) public onlyOwner {
        maxMintAmount = _newMaxMintAmount;
    }

    function setMarketingSupply(uint256 _newMarketingSupply) public onlyOwner {
        require(
            _newMarketingSupply <= MAX_SUPPLY - totalSupply(),
            "Must be less than remaining supply"
        );
        marketingSupply = _newMarketingSupply;
    }

//URI for pre-reveal - directs to a singular token IF

    function setNotRevealedURI(string memory _notRevealedURI) public onlyOwner {
        notRevealedUri = _notRevealedURI;
    }

//URI for revealed NFT

    function setBaseURI(string memory _newBaseURI) public onlyOwner {
        baseURI = _newBaseURI;
    }

// Airdrop tokens for marketing or rewards

    function airdrop(address[] calldata _users) public payable onlyOwner {
        require(
            marketingSupply > 0 &&
                _users.length <= marketingSupply &&
                _users.length > 0 &&
                (totalSupply() + _users.length < MAX_SUPPLY - marketingSupply),
            marketingSupply <= 0
                ? "Marketing supply empty"
                : (
                    _users.length > marketingSupply
                        ? "Addresses exceed marketing supply"
                        : (
                            _users.length == 0
                                ? "At least 1 address required"
                                : "Supply limit exceeded"
                        )
                )
        );

        for (uint256 i = 0; i < _users.length; i++) {
            _safeMint(_users[i], 1);
            emit NewPufferMinted(_users[i], 1);
            --marketingSupply;
            fishToken.updateReward(address(0), _users[i]);
        }
    //Withdraw function for contract (if required)

    }
     function withdrawMoneyTo(address payable _to) public onlyOwner {
        _to.transfer(getBalanceContract());
    }
    function getBalanceContract() public view onlyOwner returns(uint){
        return address(this).balance;
    }

    function claimTokens() external {
        fishToken.updateReward(msg.sender, address(0));
        fishToken.getReward(msg.sender);
    }

    function spendTokens(uint256 _amount) external {
        fishToken.spend(msg.sender, _amount);
    }

    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 tokenId,
        uint256 quantity
    ) internal virtual override {
        super._beforeTokenTransfers(from, to, tokenId, quantity);
        if (from != address(0)) {
            fishToken.updateReward(from, to);
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_initNotRevealedUri","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"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":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"mintAmount","type":"uint256"}],"name":"NewPufferMinted","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"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_TX_MINT_AMOUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"}],"name":"airdrop","outputs":[],"stateMutability":"payable","type":"function"},{"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":"claimTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fishToken","outputs":[{"internalType":"contract FishToken","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBalanceContract","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":[],"name":"isPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isRevealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"mintedTotalOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMarketingSupply","type":"uint256"}],"name":"setMarketingSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxMintAmount","type":"uint256"}],"name":"setMaxMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"}],"name":"setToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"spendTokens","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":[],"name":"toggleIsPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleIsRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"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":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"_to","type":"address"}],"name":"withdrawMoneyTo","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526001600b60006101000a81548160ff0219169083151502179055506000600b60016101000a81548160ff0219169083151502179055506005600c556000600d556101f4600e553480156200005757600080fd5b506040516200505c3803806200505c83398181016040528101906200007d9190620003dd565b8282816002908051906020019062000097929190620002af565b508060039080519060200190620000b0929190620002af565b50620000c16200010360201b60201c565b6000819055505050620000e9620000dd6200010c60201b60201c565b6200011460201b60201c565b620000fa81620001da60201b60201c565b5050506200069d565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620001ea6200010c60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002106200028560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000269576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200026090620004bd565b60405180910390fd5b80600a908051906020019062000281929190620002af565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620002bd9062000585565b90600052602060002090601f016020900481019282620002e157600085556200032d565b82601f10620002fc57805160ff19168380011785556200032d565b828001600101855582156200032d579182015b828111156200032c5782518255916020019190600101906200030f565b5b5090506200033c919062000340565b5090565b5b808211156200035b57600081600090555060010162000341565b5090565b600062000376620003708462000508565b620004df565b90508281526020810184848401111562000395576200039462000654565b5b620003a28482856200054f565b509392505050565b600082601f830112620003c257620003c16200064f565b5b8151620003d48482602086016200035f565b91505092915050565b600080600060608486031215620003f957620003f86200065e565b5b600084015167ffffffffffffffff8111156200041a576200041962000659565b5b6200042886828701620003aa565b935050602084015167ffffffffffffffff8111156200044c576200044b62000659565b5b6200045a86828701620003aa565b925050604084015167ffffffffffffffff8111156200047e576200047d62000659565b5b6200048c86828701620003aa565b9150509250925092565b6000620004a56020836200053e565b9150620004b28262000674565b602082019050919050565b60006020820190508181036000830152620004d88162000496565b9050919050565b6000620004eb620004fe565b9050620004f98282620005bb565b919050565b6000604051905090565b600067ffffffffffffffff82111562000526576200052562000620565b5b620005318262000663565b9050602081019050919050565b600082825260208201905092915050565b60005b838110156200056f57808201518184015260208101905062000552565b838111156200057f576000848401525b50505050565b600060028204905060018216806200059e57607f821691505b60208210811415620005b557620005b4620005f1565b5b50919050565b620005c68262000663565b810181811067ffffffffffffffff82111715620005e857620005e762000620565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6149af80620006ad6000396000f3fe60806040526004361061025c5760003560e01c8063624bb58f11610144578063a0712d68116100b6578063c87b56dd1161007a578063c87b56dd14610894578063e0bd29eb146108d1578063e985e9c5146108fa578063f2c4ce1e14610937578063f2fde38b14610960578063f9613d7f146109895761025c565b8063a0712d68146107d0578063a22cb465146107ec578063aba458b314610815578063b187bd2614610840578063b88d4fde1461086b5761025c565b806370a082311161010857806370a08231146106e1578063715018a61461071e578063729ad39e146107355780638da5cb5b146107515780638e39f5151461077c57806395d89b41146107a55761025c565b8063624bb58f146105f85780636352211e1461062357806366bd78fd146106605780636a1e2dc11461068b5780636c0360eb146106b65761025c565b806321b80420116101dd578063438b6300116101a1578063438b6300146104ea5780634432fcd51461052757806344a0d68a1461056457806348c54b9d1461058d57806354214f69146105a457806355f804b3146105cf5761025c565b806321b804201461042b578063239c70ae1461044257806323b872dd1461046d57806332cb6b0c1461049657806342842e0e146104c15761025c565b8063095ea7b311610224578063095ea7b31461035a5780630ff8d8a51461038357806313faede6146103ac578063144fa6d7146103d757806318160ddd146104005761025c565b806301ffc9a71461026157806306fdde031461029e578063081812fc146102c9578063081c8c4414610306578063088a4ed014610331575b600080fd5b34801561026d57600080fd5b5061028860048036038101906102839190613d59565b6109a0565b60405161029591906141a1565b60405180910390f35b3480156102aa57600080fd5b506102b3610a82565b6040516102c091906141d7565b60405180910390f35b3480156102d557600080fd5b506102f060048036038101906102eb9190613dfc565b610b14565b6040516102fd919061409d565b60405180910390f35b34801561031257600080fd5b5061031b610b90565b60405161032891906141d7565b60405180910390f35b34801561033d57600080fd5b5061035860048036038101906103539190613dfc565b610c1e565b005b34801561036657600080fd5b50610381600480360381019061037c9190613ccc565b610ca4565b005b34801561038f57600080fd5b506103aa60048036038101906103a59190613b49565b610e4b565b005b3480156103b857600080fd5b506103c1610f18565b6040516103ce9190614299565b60405180910390f35b3480156103e357600080fd5b506103fe60048036038101906103f99190613b1c565b610f1e565b005b34801561040c57600080fd5b50610415610fde565b6040516104229190614299565b60405180910390f35b34801561043757600080fd5b50610440610ff5565b005b34801561044e57600080fd5b50610457611103565b6040516104649190614299565b60405180910390f35b34801561047957600080fd5b50610494600480360381019061048f9190613bb6565b611109565b005b3480156104a257600080fd5b506104ab611119565b6040516104b89190614299565b60405180910390f35b3480156104cd57600080fd5b506104e860048036038101906104e39190613bb6565b61111f565b005b3480156104f657600080fd5b50610511600480360381019061050c9190613b1c565b61113f565b60405161051e919061417f565b60405180910390f35b34801561053357600080fd5b5061054e60048036038101906105499190613b1c565b61135a565b60405161055b9190614299565b60405180910390f35b34801561057057600080fd5b5061058b60048036038101906105869190613dfc565b61136c565b005b34801561059957600080fd5b506105a26113f2565b005b3480156105b057600080fd5b506105b9611511565b6040516105c691906141a1565b60405180910390f35b3480156105db57600080fd5b506105f660048036038101906105f19190613db3565b611524565b005b34801561060457600080fd5b5061060d6115ba565b60405161061a9190614299565b60405180910390f35b34801561062f57600080fd5b5061064a60048036038101906106459190613dfc565b6115c0565b604051610657919061409d565b60405180910390f35b34801561066c57600080fd5b506106756115d6565b6040516106829190614299565b60405180910390f35b34801561069757600080fd5b506106a061165a565b6040516106ad91906141bc565b60405180910390f35b3480156106c257600080fd5b506106cb611680565b6040516106d891906141d7565b60405180910390f35b3480156106ed57600080fd5b5061070860048036038101906107039190613b1c565b61170e565b6040516107159190614299565b60405180910390f35b34801561072a57600080fd5b506107336117de565b005b61074f600480360381019061074a9190613d0c565b611866565b005b34801561075d57600080fd5b50610766611bee565b604051610773919061409d565b60405180910390f35b34801561078857600080fd5b506107a3600480360381019061079e9190613dfc565b611c18565b005b3480156107b157600080fd5b506107ba611caa565b6040516107c791906141d7565b60405180910390f35b6107ea60048036038101906107e59190613dfc565b611d3c565b005b3480156107f857600080fd5b50610813600480360381019061080e9190613c8c565b611f42565b005b34801561082157600080fd5b5061082a6120ba565b6040516108379190614299565b60405180910390f35b34801561084c57600080fd5b506108556120bf565b60405161086291906141a1565b60405180910390f35b34801561087757600080fd5b50610892600480360381019061088d9190613c09565b6120d2565b005b3480156108a057600080fd5b506108bb60048036038101906108b69190613dfc565b61214a565b6040516108c891906141d7565b60405180910390f35b3480156108dd57600080fd5b506108f860048036038101906108f39190613dfc565b61226a565b005b34801561090657600080fd5b50610921600480360381019061091c9190613b76565b612347565b60405161092e91906141a1565b60405180910390f35b34801561094357600080fd5b5061095e60048036038101906109599190613db3565b6123db565b005b34801561096c57600080fd5b5061098760048036038101906109829190613b1c565b612471565b005b34801561099557600080fd5b5061099e612569565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a6b57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a7b5750610a7a82612611565b5b9050919050565b606060028054610a91906145ac565b80601f0160208091040260200160405190810160405280929190818152602001828054610abd906145ac565b8015610b0a5780601f10610adf57610100808354040283529160200191610b0a565b820191906000526020600020905b815481529060010190602001808311610aed57829003601f168201915b5050505050905090565b6000610b1f8261267b565b610b55576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600a8054610b9d906145ac565b80601f0160208091040260200160405190810160405280929190818152602001828054610bc9906145ac565b8015610c165780601f10610beb57610100808354040283529160200191610c16565b820191906000526020600020905b815481529060010190602001808311610bf957829003601f168201915b505050505081565b610c266126c9565b73ffffffffffffffffffffffffffffffffffffffff16610c44611bee565b73ffffffffffffffffffffffffffffffffffffffff1614610c9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9190614279565b60405180910390fd5b80600c8190555050565b6000610caf826115c0565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d17576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d366126c9565b73ffffffffffffffffffffffffffffffffffffffff1614610d9957610d6281610d5d6126c9565b612347565b610d98576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b610e536126c9565b73ffffffffffffffffffffffffffffffffffffffff16610e71611bee565b73ffffffffffffffffffffffffffffffffffffffff1614610ec7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ebe90614279565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108fc610ee96115d6565b9081150290604051600060405180830381858888f19350505050158015610f14573d6000803e3d6000fd5b5050565b600d5481565b610f266126c9565b73ffffffffffffffffffffffffffffffffffffffff16610f44611bee565b73ffffffffffffffffffffffffffffffffffffffff1614610f9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9190614279565b60405180910390fd5b80600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000610fe86126d1565b6001546000540303905090565b610ffd6126c9565b73ffffffffffffffffffffffffffffffffffffffff1661101b611bee565b73ffffffffffffffffffffffffffffffffffffffff1614611071576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106890614279565b60405180910390fd5b600b60019054906101000a900460ff166110d757600060098054611094906145ac565b9050116110d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110cd90614239565b60405180910390fd5b5b600b60019054906101000a900460ff1615600b60016101000a81548160ff021916908315150217905550565b600c5481565b6111148383836126da565b505050565b61269481565b61113a838383604051806020016040528060008152506120d2565b505050565b6060600061114c8361170e565b905060008167ffffffffffffffff81111561116a57611169614745565b5b6040519080825280602002602001820160405280156111985781602001602082028036833780820191505090505b50905060006111a56126d1565b90506000805b84821080156111bc57506126948311155b1561134d576000600460008581526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001511580156112c95750600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614155b156112d657806000015191505b8773ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611339578385848151811061131e5761131d614716565b5b60200260200101818152505082806113359061460f565b9350505b83806113449061460f565b945050506111ab565b8395505050505050919050565b600061136582612bba565b9050919050565b6113746126c9565b73ffffffffffffffffffffffffffffffffffffffff16611392611bee565b73ffffffffffffffffffffffffffffffffffffffff16146113e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113df90614279565b60405180910390fd5b80600d8190555050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d230af3a3360006040518363ffffffff1660e01b81526004016114509291906140b8565b600060405180830381600087803b15801561146a57600080fd5b505af115801561147e573d6000803e3d6000fd5b50505050600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c00007b0336040518263ffffffff1660e01b81526004016114dd919061409d565b600060405180830381600087803b1580156114f757600080fd5b505af115801561150b573d6000803e3d6000fd5b50505050565b600b60019054906101000a900460ff1681565b61152c6126c9565b73ffffffffffffffffffffffffffffffffffffffff1661154a611bee565b73ffffffffffffffffffffffffffffffffffffffff16146115a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159790614279565b60405180910390fd5b80600990805190602001906115b6929190613882565b5050565b600e5481565b60006115cb82612c24565b600001519050919050565b60006115e06126c9565b73ffffffffffffffffffffffffffffffffffffffff166115fe611bee565b73ffffffffffffffffffffffffffffffffffffffff1614611654576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164b90614279565b60405180910390fd5b47905090565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6009805461168d906145ac565b80601f01602080910402602001604051908101604052809291908181526020018280546116b9906145ac565b80156117065780601f106116db57610100808354040283529160200191611706565b820191906000526020600020905b8154815290600101906020018083116116e957829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611776576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6117e66126c9565b73ffffffffffffffffffffffffffffffffffffffff16611804611bee565b73ffffffffffffffffffffffffffffffffffffffff161461185a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185190614279565b60405180910390fd5b6118646000612eaf565b565b61186e6126c9565b73ffffffffffffffffffffffffffffffffffffffff1661188c611bee565b73ffffffffffffffffffffffffffffffffffffffff16146118e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d990614279565b60405180910390fd5b6000600e541180156118f95750600e548282905011155b80156119085750600082829050115b80156119375750600e5461269461191f919061443e565b8282905061192b610fde565b61193591906143b7565b105b6000600e5411156119ef57600e5483839050116119d05760008383905014611994576040518060400160405280601581526020017f537570706c79206c696d697420657863656564656400000000000000000000008152506119cb565b6040518060400160405280601b81526020017f4174206c656173742031206164647265737320726571756972656400000000008152505b6119ea565b604051806060016040528060218152602001614959602191395b611a26565b6040518060400160405280601681526020017f4d61726b6574696e6720737570706c7920656d707479000000000000000000008152505b90611a67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5e91906141d7565b60405180910390fd5b5060005b82829050811015611be957611aa8838383818110611a8c57611a8b614716565b5b9050602002016020810190611aa19190613b1c565b6001612f75565b7f8ee66ed32e32adbaaea2e70ae59d03ecf5f8471a7912adad12a629bfd7f68a00838383818110611adc57611adb614716565b5b9050602002016020810190611af19190613b1c565b6001604051611b0192919061412d565b60405180910390a1600e60008154611b1890614582565b91905081905550600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d230af3a6000858585818110611b7257611b71614716565b5b9050602002016020810190611b879190613b1c565b6040518363ffffffff1660e01b8152600401611ba49291906140b8565b600060405180830381600087803b158015611bbe57600080fd5b505af1158015611bd2573d6000803e3d6000fd5b505050508080611be19061460f565b915050611a6b565b505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663af7d6ca333836040518363ffffffff1660e01b8152600401611c75929190614156565b600060405180830381600087803b158015611c8f57600080fd5b505af1158015611ca3573d6000803e3d6000fd5b5050505050565b606060038054611cb9906145ac565b80601f0160208091040260200160405190810160405280929190818152602001828054611ce5906145ac565b8015611d325780601f10611d0757610100808354040283529160200191611d32565b820191906000526020600020905b815481529060010190602001808311611d1557829003601f168201915b5050505050905090565b80600b60009054906101000a900460ff161580611d8b5750611d5c611bee565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b8015611d975750600081115b8015611da4575060058111155b8015611dd15750600e54612694611dbb919061443e565b81611dc4610fde565b611dce91906143b7565b11155b600b60009054906101000a900460ff16611e645760058211611e28576040518060400160405280601581526020017f537570706c79206c696d69742065786365656465640000000000000000000000815250611e5f565b6040518060400160405280601c81526020017f4d6178696d756d206d696e7420616d6f756e74206578636565646564000000008152505b611e9b565b6040518060400160405280600e81526020017f53616c65206973207061757365640000000000000000000000000000000000008152505b90611edc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed391906141d7565b60405180910390fd5b50600c5481611eea33612bba565b611ef491906143b7565b1115611f35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2c90614259565b60405180910390fd5b611f3e82612f93565b5050565b611f4a6126c9565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611faf576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611fbc6126c9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166120696126c9565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516120ae91906141a1565b60405180910390a35050565b600581565b600b60009054906101000a900460ff1681565b6120dd8484846126da565b6120fc8373ffffffffffffffffffffffffffffffffffffffff16613068565b156121445761210d8484848461308b565b612143576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b60606121558261267b565b61215e57600080fd5b60001515600b60019054906101000a900460ff161515141561220c57600a8054612187906145ac565b80601f01602080910402602001604051908101604052809291908181526020018280546121b3906145ac565b80156122005780601f106121d557610100808354040283529160200191612200565b820191906000526020600020905b8154815290600101906020018083116121e357829003601f168201915b50505050509050612265565b60006122166131eb565b905060008151116122365760405180602001604052806000815250612261565b806122408461327d565b60405160200161225192919061406e565b6040516020818303038152906040525b9150505b919050565b6122726126c9565b73ffffffffffffffffffffffffffffffffffffffff16612290611bee565b73ffffffffffffffffffffffffffffffffffffffff16146122e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122dd90614279565b60405180910390fd5b6122ee610fde565b6126946122fb919061443e565b81111561233d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612334906141f9565b60405180910390fd5b80600e8190555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6123e36126c9565b73ffffffffffffffffffffffffffffffffffffffff16612401611bee565b73ffffffffffffffffffffffffffffffffffffffff1614612457576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244e90614279565b60405180910390fd5b80600a908051906020019061246d929190613882565b5050565b6124796126c9565b73ffffffffffffffffffffffffffffffffffffffff16612497611bee565b73ffffffffffffffffffffffffffffffffffffffff16146124ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e490614279565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561255d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255490614219565b60405180910390fd5b61256681612eaf565b50565b6125716126c9565b73ffffffffffffffffffffffffffffffffffffffff1661258f611bee565b73ffffffffffffffffffffffffffffffffffffffff16146125e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125dc90614279565b60405180910390fd5b600b60009054906101000a900460ff1615600b60006101000a81548160ff021916908315150217905550565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000816126866126d1565b11158015612695575060005482105b80156126c2575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b60006001905090565b60006126e582612c24565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612750576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166127716126c9565b73ffffffffffffffffffffffffffffffffffffffff1614806127a0575061279f8561279a6126c9565b612347565b5b806127e557506127ae6126c9565b73ffffffffffffffffffffffffffffffffffffffff166127cd84610b14565b73ffffffffffffffffffffffffffffffffffffffff16145b90508061281e576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612885576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61289285858560016133de565b6006600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612b48576000548214612b4757878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612bb385858560016134b4565b5050505050565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b612c2c613908565b600082905080612c3a6126d1565b11612e7857600054811015612e77576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151612e7557600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612d59578092505050612eaa565b5b600115612e7457818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612e6f578092505050612eaa565b612d5a565b5b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612f8f8282604051806020016040528060008152506134ba565b5050565b612f9d3382612f75565b7f8ee66ed32e32adbaaea2e70ae59d03ecf5f8471a7912adad12a629bfd7f68a003382604051612fce929190614156565b60405180910390a1600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cc240c0133836040518363ffffffff1660e01b8152600401613033929190614156565b600060405180830381600087803b15801561304d57600080fd5b505af1158015613061573d6000803e3d6000fd5b5050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026130b16126c9565b8786866040518563ffffffff1660e01b81526004016130d394939291906140e1565b602060405180830381600087803b1580156130ed57600080fd5b505af192505050801561311e57506040513d601f19601f8201168201806040525081019061311b9190613d86565b60015b613198573d806000811461314e576040519150601f19603f3d011682016040523d82523d6000602084013e613153565b606091505b50600081511415613190576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600980546131fa906145ac565b80601f0160208091040260200160405190810160405280929190818152602001828054613226906145ac565b80156132735780601f1061324857610100808354040283529160200191613273565b820191906000526020600020905b81548152906001019060200180831161325657829003601f168201915b5050505050905090565b606060008214156132c5576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506133d9565b600082905060005b600082146132f75780806132e09061460f565b915050600a826132f0919061440d565b91506132cd565b60008167ffffffffffffffff81111561331357613312614745565b5b6040519080825280601f01601f1916602001820160405280156133455781602001600182028036833780820191505090505b5090505b600085146133d25760018261335e919061443e565b9150600a8561336d9190614658565b603061337991906143b7565b60f81b81838151811061338f5761338e614716565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856133cb919061440d565b9450613349565b8093505050505b919050565b6133ea8484848461387c565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146134ae57600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d230af3a85856040518363ffffffff1660e01b815260040161347b9291906140b8565b600060405180830381600087803b15801561349557600080fd5b505af11580156134a9573d6000803e3d6000fd5b505050505b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415613527576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000831415613562576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61356f60008583866133de565b82600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555082600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600084820190506137308673ffffffffffffffffffffffffffffffffffffffff16613068565b156137f5575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46137a5600087848060010195508761308b565b6137db576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082106137365782600054146137f057600080fd5b613860565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082106137f6575b81600081905550505061387660008583866134b4565b50505050565b50505050565b82805461388e906145ac565b90600052602060002090601f0160209004810192826138b057600085556138f7565b82601f106138c957805160ff19168380011785556138f7565b828001600101855582156138f7579182015b828111156138f65782518255916020019190600101906138db565b5b509050613904919061394b565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b8082111561396457600081600090555060010161394c565b5090565b600061397b613976846142d9565b6142b4565b90508281526020810184848401111561399757613996614783565b5b6139a2848285614540565b509392505050565b60006139bd6139b88461430a565b6142b4565b9050828152602081018484840111156139d9576139d8614783565b5b6139e4848285614540565b509392505050565b6000813590506139fb816148e5565b92915050565b600081359050613a10816148fc565b92915050565b60008083601f840112613a2c57613a2b614779565b5b8235905067ffffffffffffffff811115613a4957613a48614774565b5b602083019150836020820283011115613a6557613a6461477e565b5b9250929050565b600081359050613a7b81614913565b92915050565b600081359050613a908161492a565b92915050565b600081519050613aa58161492a565b92915050565b600082601f830112613ac057613abf614779565b5b8135613ad0848260208601613968565b91505092915050565b600082601f830112613aee57613aed614779565b5b8135613afe8482602086016139aa565b91505092915050565b600081359050613b1681614941565b92915050565b600060208284031215613b3257613b3161478d565b5b6000613b40848285016139ec565b91505092915050565b600060208284031215613b5f57613b5e61478d565b5b6000613b6d84828501613a01565b91505092915050565b60008060408385031215613b8d57613b8c61478d565b5b6000613b9b858286016139ec565b9250506020613bac858286016139ec565b9150509250929050565b600080600060608486031215613bcf57613bce61478d565b5b6000613bdd868287016139ec565b9350506020613bee868287016139ec565b9250506040613bff86828701613b07565b9150509250925092565b60008060008060808587031215613c2357613c2261478d565b5b6000613c31878288016139ec565b9450506020613c42878288016139ec565b9350506040613c5387828801613b07565b925050606085013567ffffffffffffffff811115613c7457613c73614788565b5b613c8087828801613aab565b91505092959194509250565b60008060408385031215613ca357613ca261478d565b5b6000613cb1858286016139ec565b9250506020613cc285828601613a6c565b9150509250929050565b60008060408385031215613ce357613ce261478d565b5b6000613cf1858286016139ec565b9250506020613d0285828601613b07565b9150509250929050565b60008060208385031215613d2357613d2261478d565b5b600083013567ffffffffffffffff811115613d4157613d40614788565b5b613d4d85828601613a16565b92509250509250929050565b600060208284031215613d6f57613d6e61478d565b5b6000613d7d84828501613a81565b91505092915050565b600060208284031215613d9c57613d9b61478d565b5b6000613daa84828501613a96565b91505092915050565b600060208284031215613dc957613dc861478d565b5b600082013567ffffffffffffffff811115613de757613de6614788565b5b613df384828501613ad9565b91505092915050565b600060208284031215613e1257613e1161478d565b5b6000613e2084828501613b07565b91505092915050565b6000613e358383614050565b60208301905092915050565b613e4a81614472565b82525050565b6000613e5b8261434b565b613e658185614379565b9350613e708361433b565b8060005b83811015613ea1578151613e888882613e29565b9750613e938361436c565b925050600181019050613e74565b5085935050505092915050565b613eb781614496565b82525050565b6000613ec882614356565b613ed2818561438a565b9350613ee281856020860161454f565b613eeb81614792565b840191505092915050565b613eff816144f8565b82525050565b613f0e8161450a565b82525050565b6000613f1f82614361565b613f29818561439b565b9350613f3981856020860161454f565b613f4281614792565b840191505092915050565b6000613f5882614361565b613f6281856143ac565b9350613f7281856020860161454f565b80840191505092915050565b6000613f8b60228361439b565b9150613f96826147a3565b604082019050919050565b6000613fae60268361439b565b9150613fb9826147f2565b604082019050919050565b6000613fd1600f8361439b565b9150613fdc82614841565b602082019050919050565b6000613ff4601c8361439b565b9150613fff8261486a565b602082019050919050565b60006140176005836143ac565b915061402282614893565b600582019050919050565b600061403a60208361439b565b9150614045826148bc565b602082019050919050565b614059816144ee565b82525050565b614068816144ee565b82525050565b600061407a8285613f4d565b91506140868284613f4d565b91506140918261400a565b91508190509392505050565b60006020820190506140b26000830184613e41565b92915050565b60006040820190506140cd6000830185613e41565b6140da6020830184613e41565b9392505050565b60006080820190506140f66000830187613e41565b6141036020830186613e41565b614110604083018561405f565b81810360608301526141228184613ebd565b905095945050505050565b60006040820190506141426000830185613e41565b61414f6020830184613f05565b9392505050565b600060408201905061416b6000830185613e41565b614178602083018461405f565b9392505050565b600060208201905081810360008301526141998184613e50565b905092915050565b60006020820190506141b66000830184613eae565b92915050565b60006020820190506141d16000830184613ef6565b92915050565b600060208201905081810360008301526141f18184613f14565b905092915050565b6000602082019050818103600083015261421281613f7e565b9050919050565b6000602082019050818103600083015261423281613fa1565b9050919050565b6000602082019050818103600083015261425281613fc4565b9050919050565b6000602082019050818103600083015261427281613fe7565b9050919050565b600060208201905081810360008301526142928161402d565b9050919050565b60006020820190506142ae600083018461405f565b92915050565b60006142be6142cf565b90506142ca82826145de565b919050565b6000604051905090565b600067ffffffffffffffff8211156142f4576142f3614745565b5b6142fd82614792565b9050602081019050919050565b600067ffffffffffffffff82111561432557614324614745565b5b61432e82614792565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006143c2826144ee565b91506143cd836144ee565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561440257614401614689565b5b828201905092915050565b6000614418826144ee565b9150614423836144ee565b925082614433576144326146b8565b5b828204905092915050565b6000614449826144ee565b9150614454836144ee565b92508282101561446757614466614689565b5b828203905092915050565b600061447d826144ce565b9050919050565b600061448f826144ce565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006145038261451c565b9050919050565b6000614515826144ee565b9050919050565b60006145278261452e565b9050919050565b6000614539826144ce565b9050919050565b82818337600083830152505050565b60005b8381101561456d578082015181840152602081019050614552565b8381111561457c576000848401525b50505050565b600061458d826144ee565b915060008214156145a1576145a0614689565b5b600182039050919050565b600060028204905060018216806145c457607f821691505b602082108114156145d8576145d76146e7565b5b50919050565b6145e782614792565b810181811067ffffffffffffffff8211171561460657614605614745565b5b80604052505050565b600061461a826144ee565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561464d5761464c614689565b5b600182019050919050565b6000614663826144ee565b915061466e836144ee565b92508261467e5761467d6146b8565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4d757374206265206c657373207468616e2072656d61696e696e67207375707060008201527f6c79000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f42617365555249206e6f74207365740000000000000000000000000000000000600082015250565b7f4d6178696d756d206d696e7420616d6f756e7420657863656564656400000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6148ee81614472565b81146148f957600080fd5b50565b61490581614484565b811461491057600080fd5b50565b61491c81614496565b811461492757600080fd5b50565b614933816144a2565b811461493e57600080fd5b50565b61494a816144ee565b811461495557600080fd5b5056fe41646472657373657320657863656564206d61726b6574696e6720737570706c79a2646970667358221220f995ee3d01d26f8bca0f55f6b6b2b31a8ae330112c30aef76b2e412a616fa00264736f6c63430008070033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000b5075666665722047616e67000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000450554646000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x60806040526004361061025c5760003560e01c8063624bb58f11610144578063a0712d68116100b6578063c87b56dd1161007a578063c87b56dd14610894578063e0bd29eb146108d1578063e985e9c5146108fa578063f2c4ce1e14610937578063f2fde38b14610960578063f9613d7f146109895761025c565b8063a0712d68146107d0578063a22cb465146107ec578063aba458b314610815578063b187bd2614610840578063b88d4fde1461086b5761025c565b806370a082311161010857806370a08231146106e1578063715018a61461071e578063729ad39e146107355780638da5cb5b146107515780638e39f5151461077c57806395d89b41146107a55761025c565b8063624bb58f146105f85780636352211e1461062357806366bd78fd146106605780636a1e2dc11461068b5780636c0360eb146106b65761025c565b806321b80420116101dd578063438b6300116101a1578063438b6300146104ea5780634432fcd51461052757806344a0d68a1461056457806348c54b9d1461058d57806354214f69146105a457806355f804b3146105cf5761025c565b806321b804201461042b578063239c70ae1461044257806323b872dd1461046d57806332cb6b0c1461049657806342842e0e146104c15761025c565b8063095ea7b311610224578063095ea7b31461035a5780630ff8d8a51461038357806313faede6146103ac578063144fa6d7146103d757806318160ddd146104005761025c565b806301ffc9a71461026157806306fdde031461029e578063081812fc146102c9578063081c8c4414610306578063088a4ed014610331575b600080fd5b34801561026d57600080fd5b5061028860048036038101906102839190613d59565b6109a0565b60405161029591906141a1565b60405180910390f35b3480156102aa57600080fd5b506102b3610a82565b6040516102c091906141d7565b60405180910390f35b3480156102d557600080fd5b506102f060048036038101906102eb9190613dfc565b610b14565b6040516102fd919061409d565b60405180910390f35b34801561031257600080fd5b5061031b610b90565b60405161032891906141d7565b60405180910390f35b34801561033d57600080fd5b5061035860048036038101906103539190613dfc565b610c1e565b005b34801561036657600080fd5b50610381600480360381019061037c9190613ccc565b610ca4565b005b34801561038f57600080fd5b506103aa60048036038101906103a59190613b49565b610e4b565b005b3480156103b857600080fd5b506103c1610f18565b6040516103ce9190614299565b60405180910390f35b3480156103e357600080fd5b506103fe60048036038101906103f99190613b1c565b610f1e565b005b34801561040c57600080fd5b50610415610fde565b6040516104229190614299565b60405180910390f35b34801561043757600080fd5b50610440610ff5565b005b34801561044e57600080fd5b50610457611103565b6040516104649190614299565b60405180910390f35b34801561047957600080fd5b50610494600480360381019061048f9190613bb6565b611109565b005b3480156104a257600080fd5b506104ab611119565b6040516104b89190614299565b60405180910390f35b3480156104cd57600080fd5b506104e860048036038101906104e39190613bb6565b61111f565b005b3480156104f657600080fd5b50610511600480360381019061050c9190613b1c565b61113f565b60405161051e919061417f565b60405180910390f35b34801561053357600080fd5b5061054e60048036038101906105499190613b1c565b61135a565b60405161055b9190614299565b60405180910390f35b34801561057057600080fd5b5061058b60048036038101906105869190613dfc565b61136c565b005b34801561059957600080fd5b506105a26113f2565b005b3480156105b057600080fd5b506105b9611511565b6040516105c691906141a1565b60405180910390f35b3480156105db57600080fd5b506105f660048036038101906105f19190613db3565b611524565b005b34801561060457600080fd5b5061060d6115ba565b60405161061a9190614299565b60405180910390f35b34801561062f57600080fd5b5061064a60048036038101906106459190613dfc565b6115c0565b604051610657919061409d565b60405180910390f35b34801561066c57600080fd5b506106756115d6565b6040516106829190614299565b60405180910390f35b34801561069757600080fd5b506106a061165a565b6040516106ad91906141bc565b60405180910390f35b3480156106c257600080fd5b506106cb611680565b6040516106d891906141d7565b60405180910390f35b3480156106ed57600080fd5b5061070860048036038101906107039190613b1c565b61170e565b6040516107159190614299565b60405180910390f35b34801561072a57600080fd5b506107336117de565b005b61074f600480360381019061074a9190613d0c565b611866565b005b34801561075d57600080fd5b50610766611bee565b604051610773919061409d565b60405180910390f35b34801561078857600080fd5b506107a3600480360381019061079e9190613dfc565b611c18565b005b3480156107b157600080fd5b506107ba611caa565b6040516107c791906141d7565b60405180910390f35b6107ea60048036038101906107e59190613dfc565b611d3c565b005b3480156107f857600080fd5b50610813600480360381019061080e9190613c8c565b611f42565b005b34801561082157600080fd5b5061082a6120ba565b6040516108379190614299565b60405180910390f35b34801561084c57600080fd5b506108556120bf565b60405161086291906141a1565b60405180910390f35b34801561087757600080fd5b50610892600480360381019061088d9190613c09565b6120d2565b005b3480156108a057600080fd5b506108bb60048036038101906108b69190613dfc565b61214a565b6040516108c891906141d7565b60405180910390f35b3480156108dd57600080fd5b506108f860048036038101906108f39190613dfc565b61226a565b005b34801561090657600080fd5b50610921600480360381019061091c9190613b76565b612347565b60405161092e91906141a1565b60405180910390f35b34801561094357600080fd5b5061095e60048036038101906109599190613db3565b6123db565b005b34801561096c57600080fd5b5061098760048036038101906109829190613b1c565b612471565b005b34801561099557600080fd5b5061099e612569565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a6b57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a7b5750610a7a82612611565b5b9050919050565b606060028054610a91906145ac565b80601f0160208091040260200160405190810160405280929190818152602001828054610abd906145ac565b8015610b0a5780601f10610adf57610100808354040283529160200191610b0a565b820191906000526020600020905b815481529060010190602001808311610aed57829003601f168201915b5050505050905090565b6000610b1f8261267b565b610b55576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600a8054610b9d906145ac565b80601f0160208091040260200160405190810160405280929190818152602001828054610bc9906145ac565b8015610c165780601f10610beb57610100808354040283529160200191610c16565b820191906000526020600020905b815481529060010190602001808311610bf957829003601f168201915b505050505081565b610c266126c9565b73ffffffffffffffffffffffffffffffffffffffff16610c44611bee565b73ffffffffffffffffffffffffffffffffffffffff1614610c9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9190614279565b60405180910390fd5b80600c8190555050565b6000610caf826115c0565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d17576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d366126c9565b73ffffffffffffffffffffffffffffffffffffffff1614610d9957610d6281610d5d6126c9565b612347565b610d98576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b610e536126c9565b73ffffffffffffffffffffffffffffffffffffffff16610e71611bee565b73ffffffffffffffffffffffffffffffffffffffff1614610ec7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ebe90614279565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108fc610ee96115d6565b9081150290604051600060405180830381858888f19350505050158015610f14573d6000803e3d6000fd5b5050565b600d5481565b610f266126c9565b73ffffffffffffffffffffffffffffffffffffffff16610f44611bee565b73ffffffffffffffffffffffffffffffffffffffff1614610f9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9190614279565b60405180910390fd5b80600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000610fe86126d1565b6001546000540303905090565b610ffd6126c9565b73ffffffffffffffffffffffffffffffffffffffff1661101b611bee565b73ffffffffffffffffffffffffffffffffffffffff1614611071576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106890614279565b60405180910390fd5b600b60019054906101000a900460ff166110d757600060098054611094906145ac565b9050116110d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110cd90614239565b60405180910390fd5b5b600b60019054906101000a900460ff1615600b60016101000a81548160ff021916908315150217905550565b600c5481565b6111148383836126da565b505050565b61269481565b61113a838383604051806020016040528060008152506120d2565b505050565b6060600061114c8361170e565b905060008167ffffffffffffffff81111561116a57611169614745565b5b6040519080825280602002602001820160405280156111985781602001602082028036833780820191505090505b50905060006111a56126d1565b90506000805b84821080156111bc57506126948311155b1561134d576000600460008581526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001511580156112c95750600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614155b156112d657806000015191505b8773ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611339578385848151811061131e5761131d614716565b5b60200260200101818152505082806113359061460f565b9350505b83806113449061460f565b945050506111ab565b8395505050505050919050565b600061136582612bba565b9050919050565b6113746126c9565b73ffffffffffffffffffffffffffffffffffffffff16611392611bee565b73ffffffffffffffffffffffffffffffffffffffff16146113e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113df90614279565b60405180910390fd5b80600d8190555050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d230af3a3360006040518363ffffffff1660e01b81526004016114509291906140b8565b600060405180830381600087803b15801561146a57600080fd5b505af115801561147e573d6000803e3d6000fd5b50505050600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c00007b0336040518263ffffffff1660e01b81526004016114dd919061409d565b600060405180830381600087803b1580156114f757600080fd5b505af115801561150b573d6000803e3d6000fd5b50505050565b600b60019054906101000a900460ff1681565b61152c6126c9565b73ffffffffffffffffffffffffffffffffffffffff1661154a611bee565b73ffffffffffffffffffffffffffffffffffffffff16146115a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159790614279565b60405180910390fd5b80600990805190602001906115b6929190613882565b5050565b600e5481565b60006115cb82612c24565b600001519050919050565b60006115e06126c9565b73ffffffffffffffffffffffffffffffffffffffff166115fe611bee565b73ffffffffffffffffffffffffffffffffffffffff1614611654576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164b90614279565b60405180910390fd5b47905090565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6009805461168d906145ac565b80601f01602080910402602001604051908101604052809291908181526020018280546116b9906145ac565b80156117065780601f106116db57610100808354040283529160200191611706565b820191906000526020600020905b8154815290600101906020018083116116e957829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611776576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6117e66126c9565b73ffffffffffffffffffffffffffffffffffffffff16611804611bee565b73ffffffffffffffffffffffffffffffffffffffff161461185a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185190614279565b60405180910390fd5b6118646000612eaf565b565b61186e6126c9565b73ffffffffffffffffffffffffffffffffffffffff1661188c611bee565b73ffffffffffffffffffffffffffffffffffffffff16146118e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d990614279565b60405180910390fd5b6000600e541180156118f95750600e548282905011155b80156119085750600082829050115b80156119375750600e5461269461191f919061443e565b8282905061192b610fde565b61193591906143b7565b105b6000600e5411156119ef57600e5483839050116119d05760008383905014611994576040518060400160405280601581526020017f537570706c79206c696d697420657863656564656400000000000000000000008152506119cb565b6040518060400160405280601b81526020017f4174206c656173742031206164647265737320726571756972656400000000008152505b6119ea565b604051806060016040528060218152602001614959602191395b611a26565b6040518060400160405280601681526020017f4d61726b6574696e6720737570706c7920656d707479000000000000000000008152505b90611a67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5e91906141d7565b60405180910390fd5b5060005b82829050811015611be957611aa8838383818110611a8c57611a8b614716565b5b9050602002016020810190611aa19190613b1c565b6001612f75565b7f8ee66ed32e32adbaaea2e70ae59d03ecf5f8471a7912adad12a629bfd7f68a00838383818110611adc57611adb614716565b5b9050602002016020810190611af19190613b1c565b6001604051611b0192919061412d565b60405180910390a1600e60008154611b1890614582565b91905081905550600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d230af3a6000858585818110611b7257611b71614716565b5b9050602002016020810190611b879190613b1c565b6040518363ffffffff1660e01b8152600401611ba49291906140b8565b600060405180830381600087803b158015611bbe57600080fd5b505af1158015611bd2573d6000803e3d6000fd5b505050508080611be19061460f565b915050611a6b565b505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663af7d6ca333836040518363ffffffff1660e01b8152600401611c75929190614156565b600060405180830381600087803b158015611c8f57600080fd5b505af1158015611ca3573d6000803e3d6000fd5b5050505050565b606060038054611cb9906145ac565b80601f0160208091040260200160405190810160405280929190818152602001828054611ce5906145ac565b8015611d325780601f10611d0757610100808354040283529160200191611d32565b820191906000526020600020905b815481529060010190602001808311611d1557829003601f168201915b5050505050905090565b80600b60009054906101000a900460ff161580611d8b5750611d5c611bee565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b8015611d975750600081115b8015611da4575060058111155b8015611dd15750600e54612694611dbb919061443e565b81611dc4610fde565b611dce91906143b7565b11155b600b60009054906101000a900460ff16611e645760058211611e28576040518060400160405280601581526020017f537570706c79206c696d69742065786365656465640000000000000000000000815250611e5f565b6040518060400160405280601c81526020017f4d6178696d756d206d696e7420616d6f756e74206578636565646564000000008152505b611e9b565b6040518060400160405280600e81526020017f53616c65206973207061757365640000000000000000000000000000000000008152505b90611edc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed391906141d7565b60405180910390fd5b50600c5481611eea33612bba565b611ef491906143b7565b1115611f35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2c90614259565b60405180910390fd5b611f3e82612f93565b5050565b611f4a6126c9565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611faf576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611fbc6126c9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166120696126c9565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516120ae91906141a1565b60405180910390a35050565b600581565b600b60009054906101000a900460ff1681565b6120dd8484846126da565b6120fc8373ffffffffffffffffffffffffffffffffffffffff16613068565b156121445761210d8484848461308b565b612143576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b60606121558261267b565b61215e57600080fd5b60001515600b60019054906101000a900460ff161515141561220c57600a8054612187906145ac565b80601f01602080910402602001604051908101604052809291908181526020018280546121b3906145ac565b80156122005780601f106121d557610100808354040283529160200191612200565b820191906000526020600020905b8154815290600101906020018083116121e357829003601f168201915b50505050509050612265565b60006122166131eb565b905060008151116122365760405180602001604052806000815250612261565b806122408461327d565b60405160200161225192919061406e565b6040516020818303038152906040525b9150505b919050565b6122726126c9565b73ffffffffffffffffffffffffffffffffffffffff16612290611bee565b73ffffffffffffffffffffffffffffffffffffffff16146122e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122dd90614279565b60405180910390fd5b6122ee610fde565b6126946122fb919061443e565b81111561233d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612334906141f9565b60405180910390fd5b80600e8190555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6123e36126c9565b73ffffffffffffffffffffffffffffffffffffffff16612401611bee565b73ffffffffffffffffffffffffffffffffffffffff1614612457576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244e90614279565b60405180910390fd5b80600a908051906020019061246d929190613882565b5050565b6124796126c9565b73ffffffffffffffffffffffffffffffffffffffff16612497611bee565b73ffffffffffffffffffffffffffffffffffffffff16146124ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e490614279565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561255d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255490614219565b60405180910390fd5b61256681612eaf565b50565b6125716126c9565b73ffffffffffffffffffffffffffffffffffffffff1661258f611bee565b73ffffffffffffffffffffffffffffffffffffffff16146125e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125dc90614279565b60405180910390fd5b600b60009054906101000a900460ff1615600b60006101000a81548160ff021916908315150217905550565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000816126866126d1565b11158015612695575060005482105b80156126c2575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b60006001905090565b60006126e582612c24565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612750576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166127716126c9565b73ffffffffffffffffffffffffffffffffffffffff1614806127a0575061279f8561279a6126c9565b612347565b5b806127e557506127ae6126c9565b73ffffffffffffffffffffffffffffffffffffffff166127cd84610b14565b73ffffffffffffffffffffffffffffffffffffffff16145b90508061281e576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612885576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61289285858560016133de565b6006600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612b48576000548214612b4757878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612bb385858560016134b4565b5050505050565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b612c2c613908565b600082905080612c3a6126d1565b11612e7857600054811015612e77576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151612e7557600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612d59578092505050612eaa565b5b600115612e7457818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612e6f578092505050612eaa565b612d5a565b5b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612f8f8282604051806020016040528060008152506134ba565b5050565b612f9d3382612f75565b7f8ee66ed32e32adbaaea2e70ae59d03ecf5f8471a7912adad12a629bfd7f68a003382604051612fce929190614156565b60405180910390a1600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cc240c0133836040518363ffffffff1660e01b8152600401613033929190614156565b600060405180830381600087803b15801561304d57600080fd5b505af1158015613061573d6000803e3d6000fd5b5050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026130b16126c9565b8786866040518563ffffffff1660e01b81526004016130d394939291906140e1565b602060405180830381600087803b1580156130ed57600080fd5b505af192505050801561311e57506040513d601f19601f8201168201806040525081019061311b9190613d86565b60015b613198573d806000811461314e576040519150601f19603f3d011682016040523d82523d6000602084013e613153565b606091505b50600081511415613190576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600980546131fa906145ac565b80601f0160208091040260200160405190810160405280929190818152602001828054613226906145ac565b80156132735780601f1061324857610100808354040283529160200191613273565b820191906000526020600020905b81548152906001019060200180831161325657829003601f168201915b5050505050905090565b606060008214156132c5576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506133d9565b600082905060005b600082146132f75780806132e09061460f565b915050600a826132f0919061440d565b91506132cd565b60008167ffffffffffffffff81111561331357613312614745565b5b6040519080825280601f01601f1916602001820160405280156133455781602001600182028036833780820191505090505b5090505b600085146133d25760018261335e919061443e565b9150600a8561336d9190614658565b603061337991906143b7565b60f81b81838151811061338f5761338e614716565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856133cb919061440d565b9450613349565b8093505050505b919050565b6133ea8484848461387c565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146134ae57600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d230af3a85856040518363ffffffff1660e01b815260040161347b9291906140b8565b600060405180830381600087803b15801561349557600080fd5b505af11580156134a9573d6000803e3d6000fd5b505050505b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415613527576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000831415613562576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61356f60008583866133de565b82600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555082600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600084820190506137308673ffffffffffffffffffffffffffffffffffffffff16613068565b156137f5575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46137a5600087848060010195508761308b565b6137db576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082106137365782600054146137f057600080fd5b613860565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082106137f6575b81600081905550505061387660008583866134b4565b50505050565b50505050565b82805461388e906145ac565b90600052602060002090601f0160209004810192826138b057600085556138f7565b82601f106138c957805160ff19168380011785556138f7565b828001600101855582156138f7579182015b828111156138f65782518255916020019190600101906138db565b5b509050613904919061394b565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b8082111561396457600081600090555060010161394c565b5090565b600061397b613976846142d9565b6142b4565b90508281526020810184848401111561399757613996614783565b5b6139a2848285614540565b509392505050565b60006139bd6139b88461430a565b6142b4565b9050828152602081018484840111156139d9576139d8614783565b5b6139e4848285614540565b509392505050565b6000813590506139fb816148e5565b92915050565b600081359050613a10816148fc565b92915050565b60008083601f840112613a2c57613a2b614779565b5b8235905067ffffffffffffffff811115613a4957613a48614774565b5b602083019150836020820283011115613a6557613a6461477e565b5b9250929050565b600081359050613a7b81614913565b92915050565b600081359050613a908161492a565b92915050565b600081519050613aa58161492a565b92915050565b600082601f830112613ac057613abf614779565b5b8135613ad0848260208601613968565b91505092915050565b600082601f830112613aee57613aed614779565b5b8135613afe8482602086016139aa565b91505092915050565b600081359050613b1681614941565b92915050565b600060208284031215613b3257613b3161478d565b5b6000613b40848285016139ec565b91505092915050565b600060208284031215613b5f57613b5e61478d565b5b6000613b6d84828501613a01565b91505092915050565b60008060408385031215613b8d57613b8c61478d565b5b6000613b9b858286016139ec565b9250506020613bac858286016139ec565b9150509250929050565b600080600060608486031215613bcf57613bce61478d565b5b6000613bdd868287016139ec565b9350506020613bee868287016139ec565b9250506040613bff86828701613b07565b9150509250925092565b60008060008060808587031215613c2357613c2261478d565b5b6000613c31878288016139ec565b9450506020613c42878288016139ec565b9350506040613c5387828801613b07565b925050606085013567ffffffffffffffff811115613c7457613c73614788565b5b613c8087828801613aab565b91505092959194509250565b60008060408385031215613ca357613ca261478d565b5b6000613cb1858286016139ec565b9250506020613cc285828601613a6c565b9150509250929050565b60008060408385031215613ce357613ce261478d565b5b6000613cf1858286016139ec565b9250506020613d0285828601613b07565b9150509250929050565b60008060208385031215613d2357613d2261478d565b5b600083013567ffffffffffffffff811115613d4157613d40614788565b5b613d4d85828601613a16565b92509250509250929050565b600060208284031215613d6f57613d6e61478d565b5b6000613d7d84828501613a81565b91505092915050565b600060208284031215613d9c57613d9b61478d565b5b6000613daa84828501613a96565b91505092915050565b600060208284031215613dc957613dc861478d565b5b600082013567ffffffffffffffff811115613de757613de6614788565b5b613df384828501613ad9565b91505092915050565b600060208284031215613e1257613e1161478d565b5b6000613e2084828501613b07565b91505092915050565b6000613e358383614050565b60208301905092915050565b613e4a81614472565b82525050565b6000613e5b8261434b565b613e658185614379565b9350613e708361433b565b8060005b83811015613ea1578151613e888882613e29565b9750613e938361436c565b925050600181019050613e74565b5085935050505092915050565b613eb781614496565b82525050565b6000613ec882614356565b613ed2818561438a565b9350613ee281856020860161454f565b613eeb81614792565b840191505092915050565b613eff816144f8565b82525050565b613f0e8161450a565b82525050565b6000613f1f82614361565b613f29818561439b565b9350613f3981856020860161454f565b613f4281614792565b840191505092915050565b6000613f5882614361565b613f6281856143ac565b9350613f7281856020860161454f565b80840191505092915050565b6000613f8b60228361439b565b9150613f96826147a3565b604082019050919050565b6000613fae60268361439b565b9150613fb9826147f2565b604082019050919050565b6000613fd1600f8361439b565b9150613fdc82614841565b602082019050919050565b6000613ff4601c8361439b565b9150613fff8261486a565b602082019050919050565b60006140176005836143ac565b915061402282614893565b600582019050919050565b600061403a60208361439b565b9150614045826148bc565b602082019050919050565b614059816144ee565b82525050565b614068816144ee565b82525050565b600061407a8285613f4d565b91506140868284613f4d565b91506140918261400a565b91508190509392505050565b60006020820190506140b26000830184613e41565b92915050565b60006040820190506140cd6000830185613e41565b6140da6020830184613e41565b9392505050565b60006080820190506140f66000830187613e41565b6141036020830186613e41565b614110604083018561405f565b81810360608301526141228184613ebd565b905095945050505050565b60006040820190506141426000830185613e41565b61414f6020830184613f05565b9392505050565b600060408201905061416b6000830185613e41565b614178602083018461405f565b9392505050565b600060208201905081810360008301526141998184613e50565b905092915050565b60006020820190506141b66000830184613eae565b92915050565b60006020820190506141d16000830184613ef6565b92915050565b600060208201905081810360008301526141f18184613f14565b905092915050565b6000602082019050818103600083015261421281613f7e565b9050919050565b6000602082019050818103600083015261423281613fa1565b9050919050565b6000602082019050818103600083015261425281613fc4565b9050919050565b6000602082019050818103600083015261427281613fe7565b9050919050565b600060208201905081810360008301526142928161402d565b9050919050565b60006020820190506142ae600083018461405f565b92915050565b60006142be6142cf565b90506142ca82826145de565b919050565b6000604051905090565b600067ffffffffffffffff8211156142f4576142f3614745565b5b6142fd82614792565b9050602081019050919050565b600067ffffffffffffffff82111561432557614324614745565b5b61432e82614792565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006143c2826144ee565b91506143cd836144ee565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561440257614401614689565b5b828201905092915050565b6000614418826144ee565b9150614423836144ee565b925082614433576144326146b8565b5b828204905092915050565b6000614449826144ee565b9150614454836144ee565b92508282101561446757614466614689565b5b828203905092915050565b600061447d826144ce565b9050919050565b600061448f826144ce565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006145038261451c565b9050919050565b6000614515826144ee565b9050919050565b60006145278261452e565b9050919050565b6000614539826144ce565b9050919050565b82818337600083830152505050565b60005b8381101561456d578082015181840152602081019050614552565b8381111561457c576000848401525b50505050565b600061458d826144ee565b915060008214156145a1576145a0614689565b5b600182039050919050565b600060028204905060018216806145c457607f821691505b602082108114156145d8576145d76146e7565b5b50919050565b6145e782614792565b810181811067ffffffffffffffff8211171561460657614605614745565b5b80604052505050565b600061461a826144ee565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561464d5761464c614689565b5b600182019050919050565b6000614663826144ee565b915061466e836144ee565b92508261467e5761467d6146b8565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4d757374206265206c657373207468616e2072656d61696e696e67207375707060008201527f6c79000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f42617365555249206e6f74207365740000000000000000000000000000000000600082015250565b7f4d6178696d756d206d696e7420616d6f756e7420657863656564656400000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6148ee81614472565b81146148f957600080fd5b50565b61490581614484565b811461491057600080fd5b50565b61491c81614496565b811461492757600080fd5b50565b614933816144a2565b811461493e57600080fd5b50565b61494a816144ee565b811461495557600080fd5b5056fe41646472657373657320657863656564206d61726b6574696e6720737570706c79a2646970667358221220f995ee3d01d26f8bca0f55f6b6b2b31a8ae330112c30aef76b2e412a616fa00264736f6c63430008070033

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

000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000b5075666665722047616e67000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000450554646000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): Puffer Gang
Arg [1] : _symbol (string): PUFF
Arg [2] : _initNotRevealedUri (string):

-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [3] : 000000000000000000000000000000000000000000000000000000000000000b
Arg [4] : 5075666665722047616e67000000000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [6] : 5055464600000000000000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

48878:7226:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29685:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32800:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34349:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48987:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53401:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33866:417;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55273:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49237:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53192:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28925:312;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53015:169;;;;;;;;;;;;;:::i;:::-;;49198:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35214:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49097:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35455:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51848:945;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52801:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53307:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55515:139;;;;;;;;;;;;;:::i;:::-;;49058:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54030:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49273:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32608:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55395:112;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49318:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48959:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30054:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23865:103;;;;;;;;;;;;;:::i;:::-;;54188:1078;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23214:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55662:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32969:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51694:146;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34625:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49145:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49024:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35711:370;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50790:629;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53531:274;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34983:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53870:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24123:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52925:82;;;;;;;;;;;;;:::i;:::-;;29685:305;29787:4;29839:25;29824:40;;;:11;:40;;;;:105;;;;29896:33;29881:48;;;:11;:48;;;;29824:105;:158;;;;29946:36;29970:11;29946:23;:36::i;:::-;29824:158;29804:178;;29685:305;;;:::o;32800:100::-;32854:13;32887:5;32880:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32800:100;:::o;34349:204::-;34417:7;34442:16;34450:7;34442;:16::i;:::-;34437:64;;34467:34;;;;;;;;;;;;;;34437:64;34521:15;:24;34537:7;34521:24;;;;;;;;;;;;;;;;;;;;;34514:31;;34349:204;;;:::o;48987:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;53401:122::-;23445:12;:10;:12::i;:::-;23434:23;;:7;:5;:7::i;:::-;:23;;;23426:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53498:17:::1;53482:13;:33;;;;53401:122:::0;:::o;33866:417::-;33939:13;33955:24;33971:7;33955:15;:24::i;:::-;33939:40;;34000:5;33994:11;;:2;:11;;;33990:48;;;34014:24;;;;;;;;;;;;;;33990:48;34071:5;34055:21;;:12;:10;:12::i;:::-;:21;;;34051:139;;34082:37;34099:5;34106:12;:10;:12::i;:::-;34082:16;:37::i;:::-;34078:112;;34143:35;;;;;;;;;;;;;;34078:112;34051:139;34229:2;34202:15;:24;34218:7;34202:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;34267:7;34263:2;34247:28;;34256:5;34247:28;;;;;;;;;;;;33928:355;33866:417;;:::o;55273:116::-;23445:12;:10;:12::i;:::-;23434:23;;:7;:5;:7::i;:::-;:23;;;23426:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55347:3:::1;:12;;:34;55360:20;:18;:20::i;:::-;55347:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;55273:116:::0;:::o;49237:29::-;;;;:::o;53192:107::-;23445:12;:10;:12::i;:::-;23434:23;;:7;:5;:7::i;:::-;:23;;;23426:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53281:9:::1;53259;;:32;;;;;;;;;;;;;;;;;;53192:107:::0;:::o;28925:312::-;28978:7;29203:15;:13;:15::i;:::-;29188:12;;29172:13;;:28;:46;29165:53;;28925:312;:::o;53015:169::-;23445:12;:10;:12::i;:::-;23434:23;;:7;:5;:7::i;:::-;:23;;;23426:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53076:10:::1;;;;;;;;;;;53071:70;;53120:1;53102:7;53096:21;;;;;:::i;:::-;;;:25;53088:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;53071:70;53166:10;;;;;;;;;;;53165:11;53152:10;;:24;;;;;;;;;;;;;;;;;;53015:169::o:0;49198:32::-;;;;:::o;35214:170::-;35348:28;35358:4;35364:2;35368:7;35348:9;:28::i;:::-;35214:170;;;:::o;49097:41::-;49134:4;49097:41;:::o;35455:185::-;35593:39;35610:4;35616:2;35620:7;35593:39;;;;;;;;;;;;:16;:39::i;:::-;35455:185;;;:::o;51848:945::-;51935:16;51969:23;51995:17;52005:6;51995:9;:17::i;:::-;51969:43;;52023:30;52070:15;52056:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52023:63;;52097:22;52122:15;:13;:15::i;:::-;52097:40;;52148:23;52186:26;52225:530;52264:15;52246;:33;:65;;;;;49134:4;52283:14;:28;;52246:65;52225:530;;;52338:31;52372:11;:27;52384:14;52372:27;;;;;;;;;;;52338:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52421:9;:16;;;52420:17;:49;;;;;52467:1;52441:28;;:9;:14;;;:28;;;;52420:49;52416:125;;;52511:9;:14;;;52490:35;;52416:125;52583:6;52561:28;;:18;:28;;;52557:154;;;52643:14;52610:13;52624:15;52610:30;;;;;;;;:::i;:::-;;;;;;;:47;;;;;52678:17;;;;;:::i;:::-;;;;52557:154;52727:16;;;;;:::i;:::-;;;;52323:432;52225:530;;;52772:13;52765:20;;;;;;;51848:945;;;:::o;52801:116::-;52861:7;52888:21;52902:6;52888:13;:21::i;:::-;52881:28;;52801:116;;;:::o;53307:86::-;23445:12;:10;:12::i;:::-;23434:23;;:7;:5;:7::i;:::-;:23;;;23426:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53377:8:::1;53370:4;:15;;;;53307:86:::0;:::o;55515:139::-;55558:9;;;;;;;;;;;:22;;;55581:10;55601:1;55558:46;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55615:9;;;;;;;;;;;:19;;;55635:10;55615:31;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55515:139::o;49058:30::-;;;;;;;;;;;;;:::o;54030:104::-;23445:12;:10;:12::i;:::-;23434:23;;:7;:5;:7::i;:::-;:23;;;23426:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54115:11:::1;54105:7;:21;;;;;;;;;;;;:::i;:::-;;54030:104:::0;:::o;49273:36::-;;;;:::o;32608:125::-;32672:7;32699:21;32712:7;32699:12;:21::i;:::-;:26;;;32692:33;;32608:125;;;:::o;55395:112::-;55455:4;23445:12;:10;:12::i;:::-;23434:23;;:7;:5;:7::i;:::-;:23;;;23426:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55478:21:::1;55471:28;;55395:112:::0;:::o;49318:26::-;;;;;;;;;;;;;:::o;48959:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;30054:206::-;30118:7;30159:1;30142:19;;:5;:19;;;30138:60;;;30170:28;;;;;;;;;;;;;;30138:60;30224:12;:19;30237:5;30224:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;30216:36;;30209:43;;30054:206;;;:::o;23865:103::-;23445:12;:10;:12::i;:::-;23434:23;;:7;:5;:7::i;:::-;:23;;;23426:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;23930:30:::1;23957:1;23930:18;:30::i;:::-;23865:103::o:0;54188:1078::-;23445:12;:10;:12::i;:::-;23434:23;;:7;:5;:7::i;:::-;:23;;;23426:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54308:1:::1;54290:15;;:19;:72;;;;;54347:15;;54330:6;;:13;;:32;;54290:72;:110;;;;;54399:1;54383:6;;:13;;:17;54290:110;:193;;;;;54467:15;;49134:4;54454:28;;;;:::i;:::-;54438:6;;:13;;54422;:11;:13::i;:::-;:29;;;;:::i;:::-;:60;54290:193;54517:1;54498:15;;:20;;:448;;54621:15;;54605:6;;:13;;:31;:322;;54775:1;54758:6;;:13;;:18;:142;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;54605:322;;;;;;;;;;;;;;;;;;;;;54498:448;;;;;;;;;;;;;;;;;;;::::0;::::1;54268:689;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;54975:9;54970:235;54994:6;;:13;;54990:1;:17;54970:235;;;55029:23;55039:6;;55046:1;55039:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;55050:1;55029:9;:23::i;:::-;55072:29;55088:6;;55095:1;55088:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;55099:1;55072:29;;;;;;;:::i;:::-;;;;;;;;55118:15;;55116:17;;;;;:::i;:::-;;;;;;;;55148:9;;;;;;;;;;;:22;;;55179:1;55183:6;;55190:1;55183:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;55148:45;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;55009:3;;;;;:::i;:::-;;;;54970:235;;;;54188:1078:::0;;:::o;23214:87::-;23260:7;23287:6;;;;;;;;;;;23280:13;;23214:87;:::o;55662:102::-;55720:9;;;;;;;;;;;:15;;;55736:10;55748:7;55720:36;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55662:102;:::o;32969:104::-;33025:13;33058:7;33051:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32969:104;:::o;51694:146::-;51778:11;49786:8;;;;;;;;;;;49785:9;:34;;;;49812:7;:5;:7::i;:::-;49798:21;;:10;:21;;;49785:34;49784:72;;;;;49855:1;49841:11;:15;49784:72;:128;;;;;49190:1;49878:11;:33;;49784:128;:208;;;;;49977:15;;49134:4;49964:28;;;;:::i;:::-;49949:11;49933:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:59;;49784:208;50007:8;;;;;;;;;;;:279;;49190:1;50102:11;:32;:157;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50007:279;;;;;;;;;;;;;;;;;;;;;49762:543;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;50391:13;;50376:11;50348:25;50362:10;50348:13;:25::i;:::-;:39;;;;:::i;:::-;:56;;50322:146;;;;;;;;;;;;:::i;:::-;;;;;;;;;51807:25:::1;51820:11;51807:12;:25::i;:::-;51694:146:::0;;:::o;34625:287::-;34736:12;:10;:12::i;:::-;34724:24;;:8;:24;;;34720:54;;;34757:17;;;;;;;;;;;;;;34720:54;34832:8;34787:18;:32;34806:12;:10;:12::i;:::-;34787:32;;;;;;;;;;;;;;;:42;34820:8;34787:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;34885:8;34856:48;;34871:12;:10;:12::i;:::-;34856:48;;;34895:8;34856:48;;;;;;:::i;:::-;;;;;;;;34625:287;;:::o;49145:46::-;49190:1;49145:46;:::o;49024:27::-;;;;;;;;;;;;;:::o;35711:370::-;35878:28;35888:4;35894:2;35898:7;35878:9;:28::i;:::-;35921:15;:2;:13;;;:15::i;:::-;35917:157;;;35942:56;35973:4;35979:2;35983:7;35992:5;35942:30;:56::i;:::-;35938:136;;36022:40;;;;;;;;;;;;;;35938:136;35917:157;35711:370;;;;:::o;50790:629::-;50908:13;50947:16;50955:7;50947;:16::i;:::-;50939:25;;;;;;50993:5;50979:19;;:10;;;;;;;;;;;:19;;;50975:73;;;51022:14;51015:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50975:73;51058:28;51089:10;:8;:10::i;:::-;51058:41;;51161:1;51136:14;51130:28;:32;:281;;;;;;;;;;;;;;;;;51254:14;51295:18;:7;:16;:18::i;:::-;51211:159;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51130:281;51110:301;;;50790:629;;;;:::o;53531:274::-;23445:12;:10;:12::i;:::-;23434:23;;:7;:5;:7::i;:::-;:23;;;23426:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53674:13:::1;:11;:13::i;:::-;49134:4;53661:26;;;;:::i;:::-;53638:19;:49;;53616:133;;;;;;;;;;;;:::i;:::-;;;;;;;;;53778:19;53760:15;:37;;;;53531:274:::0;:::o;34983:164::-;35080:4;35104:18;:25;35123:5;35104:25;;;;;;;;;;;;;;;:35;35130:8;35104:35;;;;;;;;;;;;;;;;;;;;;;;;;35097:42;;34983:164;;;;:::o;53870:126::-;23445:12;:10;:12::i;:::-;23434:23;;:7;:5;:7::i;:::-;:23;;;23426:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53973:15:::1;53956:14;:32;;;;;;;;;;;;:::i;:::-;;53870:126:::0;:::o;24123:201::-;23445:12;:10;:12::i;:::-;23434:23;;:7;:5;:7::i;:::-;:23;;;23426:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;24232:1:::1;24212:22;;:8;:22;;;;24204:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;24288:28;24307:8;24288:18;:28::i;:::-;24123:201:::0;:::o;52925:82::-;23445:12;:10;:12::i;:::-;23434:23;;:7;:5;:7::i;:::-;:23;;;23426:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52991:8:::1;;;;;;;;;;;52990:9;52979:8;;:20;;;;;;;;;;;;;;;;;;52925:82::o:0;11538:157::-;11623:4;11662:25;11647:40;;;:11;:40;;;;11640:47;;11538:157;;;:::o;36336:174::-;36393:4;36436:7;36417:15;:13;:15::i;:::-;:26;;:53;;;;;36457:13;;36447:7;:23;36417:53;:85;;;;;36475:11;:20;36487:7;36475:20;;;;;;;;;;;:27;;;;;;;;;;;;36474:28;36417:85;36410:92;;36336:174;;;:::o;21938:98::-;21991:7;22018:10;22011:17;;21938:98;:::o;50523:101::-;50588:7;50615:1;50608:8;;50523:101;:::o;40506:2127::-;40621:35;40659:21;40672:7;40659:12;:21::i;:::-;40621:59;;40719:4;40697:26;;:13;:18;;;:26;;;40693:67;;40732:28;;;;;;;;;;;;;;40693:67;40773:22;40815:4;40799:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;40836:36;40853:4;40859:12;:10;:12::i;:::-;40836:16;:36::i;:::-;40799:73;:126;;;;40913:12;:10;:12::i;:::-;40889:36;;:20;40901:7;40889:11;:20::i;:::-;:36;;;40799:126;40773:153;;40944:17;40939:66;;40970:35;;;;;;;;;;;;;;40939:66;41034:1;41020:16;;:2;:16;;;41016:52;;;41045:23;;;;;;;;;;;;;;41016:52;41081:43;41103:4;41109:2;41113:7;41122:1;41081:21;:43::i;:::-;41197:15;:24;41213:7;41197:24;;;;;;;;;;;;41190:31;;;;;;;;;;;41547:1;41517:12;:18;41530:4;41517:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41591:1;41563:12;:16;41576:2;41563:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41609:31;41643:11;:20;41655:7;41643:20;;;;;;;;;;;41609:54;;41694:2;41678:8;:13;;;:18;;;;;;;;;;;;;;;;;;41744:15;41711:8;:23;;;:49;;;;;;;;;;;;;;;;;;42012:19;42044:1;42034:7;:11;42012:33;;42060:31;42094:11;:24;42106:11;42094:24;;;;;;;;;;;42060:58;;42162:1;42137:27;;:8;:13;;;;;;;;;;;;:27;;;42133:384;;;42347:13;;42332:11;:28;42328:174;;42401:4;42385:8;:13;;;:20;;;;;;;;;;;;;;;;;;42454:13;:28;;;42428:8;:23;;;:54;;;;;;;;;;;;;;;;;;42328:174;42133:384;41492:1036;;;42564:7;42560:2;42545:27;;42554:4;42545:27;;;;;;;;;;;;42583:42;42604:4;42610:2;42614:7;42623:1;42583:20;:42::i;:::-;40610:2023;;40506:2127;;;:::o;30342:137::-;30403:7;30438:12;:19;30451:5;30438:19;;;;;;;;;;;;;;;:32;;;;;;;;;;;;30430:41;;30423:48;;30342:137;;;:::o;31435:1111::-;31497:21;;:::i;:::-;31531:12;31546:7;31531:22;;31614:4;31595:15;:13;:15::i;:::-;:23;31591:888;;31631:13;;31624:4;:20;31620:859;;;31665:31;31699:11;:17;31711:4;31699:17;;;;;;;;;;;31665:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31740:9;:16;;;31735:729;;31811:1;31785:28;;:9;:14;;;:28;;;31781:101;;31849:9;31842:16;;;;;;31781:101;32184:261;32191:4;32184:261;;;32224:6;;;;;;;;32269:11;:17;32281:4;32269:17;;;;;;;;;;;32257:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32343:1;32317:28;;:9;:14;;;:28;;;32313:109;;32385:9;32378:16;;;;;;32313:109;32184:261;;;31735:729;31646:833;31620:859;31591:888;32507:31;;;;;;;;;;;;;;31435:1111;;;;:::o;24484:191::-;24558:16;24577:6;;;;;;;;;;;24558:25;;24603:8;24594:6;;:17;;;;;;;;;;;;;;;;;;24658:8;24627:40;;24648:8;24627:40;;;;;;;;;;;;24547:128;24484:191;:::o;36594:104::-;36663:27;36673:2;36677:8;36663:27;;;;;;;;;;;;:9;:27::i;:::-;36594:104;;:::o;51461:225::-;51524:34;51534:10;51546:11;51524:9;:34::i;:::-;51574:40;51590:10;51602:11;51574:40;;;;;;;:::i;:::-;;;;;;;;51625:9;;;;;;;;;;;:28;;;51654:10;51666:11;51625:53;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51461:225;:::o;13989:326::-;14049:4;14306:1;14284:7;:19;;;:23;14277:30;;13989:326;;;:::o;45926:667::-;46089:4;46126:2;46110:36;;;46147:12;:10;:12::i;:::-;46161:4;46167:7;46176:5;46110:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;46106:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46361:1;46344:6;:13;:18;46340:235;;;46390:40;;;;;;;;;;;;;;46340:235;46533:6;46527:13;46518:6;46514:2;46510:15;46503:38;46106:480;46239:45;;;46229:55;;;:6;:55;;;;46222:62;;;45926:667;;;;;;:::o;50674:108::-;50734:13;50767:7;50760:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50674:108;:::o;25047:723::-;25103:13;25333:1;25324:5;:10;25320:53;;;25351:10;;;;;;;;;;;;;;;;;;;;;25320:53;25383:12;25398:5;25383:20;;25414:14;25439:78;25454:1;25446:4;:9;25439:78;;25472:8;;;;;:::i;:::-;;;;25503:2;25495:10;;;;;:::i;:::-;;;25439:78;;;25527:19;25559:6;25549:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25527:39;;25577:154;25593:1;25584:5;:10;25577:154;;25621:1;25611:11;;;;;:::i;:::-;;;25688:2;25680:5;:10;;;;:::i;:::-;25667:2;:24;;;;:::i;:::-;25654:39;;25637:6;25644;25637:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;25717:2;25708:11;;;;;:::i;:::-;;;25577:154;;;25755:6;25741:21;;;;;25047:723;;;;:::o;55772:329::-;55944:56;55972:4;55978:2;55982:7;55991:8;55944:27;:56::i;:::-;56031:1;56015:18;;:4;:18;;;56011:83;;56050:9;;;;;;;;;;;:22;;;56073:4;56079:2;56050:32;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56011:83;55772:329;;;;:::o;48059:158::-;;;;;:::o;37071:1749::-;37194:20;37217:13;;37194:36;;37259:1;37245:16;;:2;:16;;;37241:48;;;37270:19;;;;;;;;;;;;;;37241:48;37316:1;37304:8;:13;37300:44;;;37326:18;;;;;;;;;;;;;;37300:44;37357:61;37387:1;37391:2;37395:12;37409:8;37357:21;:61::i;:::-;37730:8;37695:12;:16;37708:2;37695:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37794:8;37754:12;:16;37767:2;37754:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37853:2;37820:11;:25;37832:12;37820:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;37920:15;37870:11;:25;37882:12;37870:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;37953:20;37976:12;37953:35;;38003:11;38032:8;38017:12;:23;38003:37;;38061:15;:2;:13;;;:15::i;:::-;38057:631;;;38097:313;38153:12;38149:2;38128:38;;38145:1;38128:38;;;;;;;;;;;;38194:69;38233:1;38237:2;38241:14;;;;;;38257:5;38194:30;:69::i;:::-;38189:174;;38299:40;;;;;;;;;;;;;;38189:174;38405:3;38390:12;:18;38097:313;;38491:12;38474:13;;:29;38470:43;;38505:8;;;38470:43;38057:631;;;38554:119;38610:14;;;;;;38606:2;38585:40;;38602:1;38585:40;;;;;;;;;;;;38668:3;38653:12;:18;38554:119;;38057:631;38718:12;38702:13;:28;;;;37670:1072;;38752:60;38781:1;38785:2;38789:12;38803:8;38752:20;:60::i;:::-;37183:1637;37071:1749;;;:::o;47241:159::-;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:155::-;1040:5;1078:6;1065:20;1056:29;;1094:41;1129:5;1094:41;:::i;:::-;986:155;;;;:::o;1164:568::-;1237:8;1247:6;1297:3;1290:4;1282:6;1278:17;1274:27;1264:122;;1305:79;;:::i;:::-;1264:122;1418:6;1405:20;1395:30;;1448:18;1440:6;1437:30;1434:117;;;1470:79;;:::i;:::-;1434:117;1584:4;1576:6;1572:17;1560:29;;1638:3;1630:4;1622:6;1618:17;1608:8;1604:32;1601:41;1598:128;;;1645:79;;:::i;:::-;1598:128;1164:568;;;;;:::o;1738:133::-;1781:5;1819:6;1806:20;1797:29;;1835:30;1859:5;1835:30;:::i;:::-;1738:133;;;;:::o;1877:137::-;1922:5;1960:6;1947:20;1938:29;;1976:32;2002:5;1976:32;:::i;:::-;1877:137;;;;:::o;2020:141::-;2076:5;2107:6;2101:13;2092:22;;2123:32;2149:5;2123:32;:::i;:::-;2020:141;;;;:::o;2180:338::-;2235:5;2284:3;2277:4;2269:6;2265:17;2261:27;2251:122;;2292:79;;:::i;:::-;2251:122;2409:6;2396:20;2434:78;2508:3;2500:6;2493:4;2485:6;2481:17;2434:78;:::i;:::-;2425:87;;2241:277;2180:338;;;;:::o;2538:340::-;2594:5;2643:3;2636:4;2628:6;2624:17;2620:27;2610:122;;2651:79;;:::i;:::-;2610:122;2768:6;2755:20;2793:79;2868:3;2860:6;2853:4;2845:6;2841:17;2793:79;:::i;:::-;2784:88;;2600:278;2538:340;;;;:::o;2884:139::-;2930:5;2968:6;2955:20;2946:29;;2984:33;3011:5;2984:33;:::i;:::-;2884:139;;;;:::o;3029:329::-;3088:6;3137:2;3125:9;3116:7;3112:23;3108:32;3105:119;;;3143:79;;:::i;:::-;3105:119;3263:1;3288:53;3333:7;3324:6;3313:9;3309:22;3288:53;:::i;:::-;3278:63;;3234:117;3029:329;;;;:::o;3364:345::-;3431:6;3480:2;3468:9;3459:7;3455:23;3451:32;3448:119;;;3486:79;;:::i;:::-;3448:119;3606:1;3631:61;3684:7;3675:6;3664:9;3660:22;3631:61;:::i;:::-;3621:71;;3577:125;3364:345;;;;:::o;3715:474::-;3783:6;3791;3840:2;3828:9;3819:7;3815:23;3811:32;3808:119;;;3846:79;;:::i;:::-;3808:119;3966:1;3991:53;4036:7;4027:6;4016:9;4012:22;3991:53;:::i;:::-;3981:63;;3937:117;4093:2;4119:53;4164:7;4155:6;4144:9;4140:22;4119:53;:::i;:::-;4109:63;;4064:118;3715:474;;;;;:::o;4195:619::-;4272:6;4280;4288;4337:2;4325:9;4316:7;4312:23;4308:32;4305:119;;;4343:79;;:::i;:::-;4305:119;4463:1;4488:53;4533:7;4524:6;4513:9;4509:22;4488:53;:::i;:::-;4478:63;;4434:117;4590:2;4616:53;4661:7;4652:6;4641:9;4637:22;4616:53;:::i;:::-;4606:63;;4561:118;4718:2;4744:53;4789:7;4780:6;4769:9;4765:22;4744:53;:::i;:::-;4734:63;;4689:118;4195:619;;;;;:::o;4820:943::-;4915:6;4923;4931;4939;4988:3;4976:9;4967:7;4963:23;4959:33;4956:120;;;4995:79;;:::i;:::-;4956:120;5115:1;5140:53;5185:7;5176:6;5165:9;5161:22;5140:53;:::i;:::-;5130:63;;5086:117;5242:2;5268:53;5313:7;5304:6;5293:9;5289:22;5268:53;:::i;:::-;5258:63;;5213:118;5370:2;5396:53;5441:7;5432:6;5421:9;5417:22;5396:53;:::i;:::-;5386:63;;5341:118;5526:2;5515:9;5511:18;5498:32;5557:18;5549:6;5546:30;5543:117;;;5579:79;;:::i;:::-;5543:117;5684:62;5738:7;5729:6;5718:9;5714:22;5684:62;:::i;:::-;5674:72;;5469:287;4820:943;;;;;;;:::o;5769:468::-;5834:6;5842;5891:2;5879:9;5870:7;5866:23;5862:32;5859:119;;;5897:79;;:::i;:::-;5859:119;6017:1;6042:53;6087:7;6078:6;6067:9;6063:22;6042:53;:::i;:::-;6032:63;;5988:117;6144:2;6170:50;6212:7;6203:6;6192:9;6188:22;6170:50;:::i;:::-;6160:60;;6115:115;5769:468;;;;;:::o;6243:474::-;6311:6;6319;6368:2;6356:9;6347:7;6343:23;6339:32;6336:119;;;6374:79;;:::i;:::-;6336:119;6494:1;6519:53;6564:7;6555:6;6544:9;6540:22;6519:53;:::i;:::-;6509:63;;6465:117;6621:2;6647:53;6692:7;6683:6;6672:9;6668:22;6647:53;:::i;:::-;6637:63;;6592:118;6243:474;;;;;:::o;6723:559::-;6809:6;6817;6866:2;6854:9;6845:7;6841:23;6837:32;6834:119;;;6872:79;;:::i;:::-;6834:119;7020:1;7009:9;7005:17;6992:31;7050:18;7042:6;7039:30;7036:117;;;7072:79;;:::i;:::-;7036:117;7185:80;7257:7;7248:6;7237:9;7233:22;7185:80;:::i;:::-;7167:98;;;;6963:312;6723:559;;;;;:::o;7288:327::-;7346:6;7395:2;7383:9;7374:7;7370:23;7366:32;7363:119;;;7401:79;;:::i;:::-;7363:119;7521:1;7546:52;7590:7;7581:6;7570:9;7566:22;7546:52;:::i;:::-;7536:62;;7492:116;7288:327;;;;:::o;7621:349::-;7690:6;7739:2;7727:9;7718:7;7714:23;7710:32;7707:119;;;7745:79;;:::i;:::-;7707:119;7865:1;7890:63;7945:7;7936:6;7925:9;7921:22;7890:63;:::i;:::-;7880:73;;7836:127;7621:349;;;;:::o;7976:509::-;8045:6;8094:2;8082:9;8073:7;8069:23;8065:32;8062:119;;;8100:79;;:::i;:::-;8062:119;8248:1;8237:9;8233:17;8220:31;8278:18;8270:6;8267:30;8264:117;;;8300:79;;:::i;:::-;8264:117;8405:63;8460:7;8451:6;8440:9;8436:22;8405:63;:::i;:::-;8395:73;;8191:287;7976:509;;;;:::o;8491:329::-;8550:6;8599:2;8587:9;8578:7;8574:23;8570:32;8567:119;;;8605:79;;:::i;:::-;8567:119;8725:1;8750:53;8795:7;8786:6;8775:9;8771:22;8750:53;:::i;:::-;8740:63;;8696:117;8491:329;;;;:::o;8826:179::-;8895:10;8916:46;8958:3;8950:6;8916:46;:::i;:::-;8994:4;8989:3;8985:14;8971:28;;8826:179;;;;:::o;9011:118::-;9098:24;9116:5;9098:24;:::i;:::-;9093:3;9086:37;9011:118;;:::o;9165:732::-;9284:3;9313:54;9361:5;9313:54;:::i;:::-;9383:86;9462:6;9457:3;9383:86;:::i;:::-;9376:93;;9493:56;9543:5;9493:56;:::i;:::-;9572:7;9603:1;9588:284;9613:6;9610:1;9607:13;9588:284;;;9689:6;9683:13;9716:63;9775:3;9760:13;9716:63;:::i;:::-;9709:70;;9802:60;9855:6;9802:60;:::i;:::-;9792:70;;9648:224;9635:1;9632;9628:9;9623:14;;9588:284;;;9592:14;9888:3;9881:10;;9289:608;;;9165:732;;;;:::o;9903:109::-;9984:21;9999:5;9984:21;:::i;:::-;9979:3;9972:34;9903:109;;:::o;10018:360::-;10104:3;10132:38;10164:5;10132:38;:::i;:::-;10186:70;10249:6;10244:3;10186:70;:::i;:::-;10179:77;;10265:52;10310:6;10305:3;10298:4;10291:5;10287:16;10265:52;:::i;:::-;10342:29;10364:6;10342:29;:::i;:::-;10337:3;10333:39;10326:46;;10108:270;10018:360;;;;:::o;10384:167::-;10489:55;10538:5;10489:55;:::i;:::-;10484:3;10477:68;10384:167;;:::o;10557:147::-;10652:45;10691:5;10652:45;:::i;:::-;10647:3;10640:58;10557:147;;:::o;10710:364::-;10798:3;10826:39;10859:5;10826:39;:::i;:::-;10881:71;10945:6;10940:3;10881:71;:::i;:::-;10874:78;;10961:52;11006:6;11001:3;10994:4;10987:5;10983:16;10961:52;:::i;:::-;11038:29;11060:6;11038:29;:::i;:::-;11033:3;11029:39;11022:46;;10802:272;10710:364;;;;:::o;11080:377::-;11186:3;11214:39;11247:5;11214:39;:::i;:::-;11269:89;11351:6;11346:3;11269:89;:::i;:::-;11262:96;;11367:52;11412:6;11407:3;11400:4;11393:5;11389:16;11367:52;:::i;:::-;11444:6;11439:3;11435:16;11428:23;;11190:267;11080:377;;;;:::o;11463:366::-;11605:3;11626:67;11690:2;11685:3;11626:67;:::i;:::-;11619:74;;11702:93;11791:3;11702:93;:::i;:::-;11820:2;11815:3;11811:12;11804:19;;11463:366;;;:::o;11835:::-;11977:3;11998:67;12062:2;12057:3;11998:67;:::i;:::-;11991:74;;12074:93;12163:3;12074:93;:::i;:::-;12192:2;12187:3;12183:12;12176:19;;11835:366;;;:::o;12207:::-;12349:3;12370:67;12434:2;12429:3;12370:67;:::i;:::-;12363:74;;12446:93;12535:3;12446:93;:::i;:::-;12564:2;12559:3;12555:12;12548:19;;12207:366;;;:::o;12579:::-;12721:3;12742:67;12806:2;12801:3;12742:67;:::i;:::-;12735:74;;12818:93;12907:3;12818:93;:::i;:::-;12936:2;12931:3;12927:12;12920:19;;12579:366;;;:::o;12951:400::-;13111:3;13132:84;13214:1;13209:3;13132:84;:::i;:::-;13125:91;;13225:93;13314:3;13225:93;:::i;:::-;13343:1;13338:3;13334:11;13327:18;;12951:400;;;:::o;13357:366::-;13499:3;13520:67;13584:2;13579:3;13520:67;:::i;:::-;13513:74;;13596:93;13685:3;13596:93;:::i;:::-;13714:2;13709:3;13705:12;13698:19;;13357:366;;;:::o;13729:108::-;13806:24;13824:5;13806:24;:::i;:::-;13801:3;13794:37;13729:108;;:::o;13843:118::-;13930:24;13948:5;13930:24;:::i;:::-;13925:3;13918:37;13843:118;;:::o;13967:701::-;14248:3;14270:95;14361:3;14352:6;14270:95;:::i;:::-;14263:102;;14382:95;14473:3;14464:6;14382:95;:::i;:::-;14375:102;;14494:148;14638:3;14494:148;:::i;:::-;14487:155;;14659:3;14652:10;;13967:701;;;;;:::o;14674:222::-;14767:4;14805:2;14794:9;14790:18;14782:26;;14818:71;14886:1;14875:9;14871:17;14862:6;14818:71;:::i;:::-;14674:222;;;;:::o;14902:332::-;15023:4;15061:2;15050:9;15046:18;15038:26;;15074:71;15142:1;15131:9;15127:17;15118:6;15074:71;:::i;:::-;15155:72;15223:2;15212:9;15208:18;15199:6;15155:72;:::i;:::-;14902:332;;;;;:::o;15240:640::-;15435:4;15473:3;15462:9;15458:19;15450:27;;15487:71;15555:1;15544:9;15540:17;15531:6;15487:71;:::i;:::-;15568:72;15636:2;15625:9;15621:18;15612:6;15568:72;:::i;:::-;15650;15718:2;15707:9;15703:18;15694:6;15650:72;:::i;:::-;15769:9;15763:4;15759:20;15754:2;15743:9;15739:18;15732:48;15797:76;15868:4;15859:6;15797:76;:::i;:::-;15789:84;;15240:640;;;;;;;:::o;15886:348::-;16015:4;16053:2;16042:9;16038:18;16030:26;;16066:71;16134:1;16123:9;16119:17;16110:6;16066:71;:::i;:::-;16147:80;16223:2;16212:9;16208:18;16199:6;16147:80;:::i;:::-;15886:348;;;;;:::o;16240:332::-;16361:4;16399:2;16388:9;16384:18;16376:26;;16412:71;16480:1;16469:9;16465:17;16456:6;16412:71;:::i;:::-;16493:72;16561:2;16550:9;16546:18;16537:6;16493:72;:::i;:::-;16240:332;;;;;:::o;16578:373::-;16721:4;16759:2;16748:9;16744:18;16736:26;;16808:9;16802:4;16798:20;16794:1;16783:9;16779:17;16772:47;16836:108;16939:4;16930:6;16836:108;:::i;:::-;16828:116;;16578:373;;;;:::o;16957:210::-;17044:4;17082:2;17071:9;17067:18;17059:26;;17095:65;17157:1;17146:9;17142:17;17133:6;17095:65;:::i;:::-;16957:210;;;;:::o;17173:258::-;17284:4;17322:2;17311:9;17307:18;17299:26;;17335:89;17421:1;17410:9;17406:17;17397:6;17335:89;:::i;:::-;17173:258;;;;:::o;17437:313::-;17550:4;17588:2;17577:9;17573:18;17565:26;;17637:9;17631:4;17627:20;17623:1;17612:9;17608:17;17601:47;17665:78;17738:4;17729:6;17665:78;:::i;:::-;17657:86;;17437:313;;;;:::o;17756:419::-;17922:4;17960:2;17949:9;17945:18;17937:26;;18009:9;18003:4;17999:20;17995:1;17984:9;17980:17;17973:47;18037:131;18163:4;18037:131;:::i;:::-;18029:139;;17756:419;;;:::o;18181:::-;18347:4;18385:2;18374:9;18370:18;18362:26;;18434:9;18428:4;18424:20;18420:1;18409:9;18405:17;18398:47;18462:131;18588:4;18462:131;:::i;:::-;18454:139;;18181:419;;;:::o;18606:::-;18772:4;18810:2;18799:9;18795:18;18787:26;;18859:9;18853:4;18849:20;18845:1;18834:9;18830:17;18823:47;18887:131;19013:4;18887:131;:::i;:::-;18879:139;;18606:419;;;:::o;19031:::-;19197:4;19235:2;19224:9;19220:18;19212:26;;19284:9;19278:4;19274:20;19270:1;19259:9;19255:17;19248:47;19312:131;19438:4;19312:131;:::i;:::-;19304:139;;19031:419;;;:::o;19456:::-;19622:4;19660:2;19649:9;19645:18;19637:26;;19709:9;19703:4;19699:20;19695:1;19684:9;19680:17;19673:47;19737:131;19863:4;19737:131;:::i;:::-;19729:139;;19456:419;;;:::o;19881:222::-;19974:4;20012:2;20001:9;19997:18;19989:26;;20025:71;20093:1;20082:9;20078:17;20069:6;20025:71;:::i;:::-;19881:222;;;;:::o;20109:129::-;20143:6;20170:20;;:::i;:::-;20160:30;;20199:33;20227:4;20219:6;20199:33;:::i;:::-;20109:129;;;:::o;20244:75::-;20277:6;20310:2;20304:9;20294:19;;20244:75;:::o;20325:307::-;20386:4;20476:18;20468:6;20465:30;20462:56;;;20498:18;;:::i;:::-;20462:56;20536:29;20558:6;20536:29;:::i;:::-;20528:37;;20620:4;20614;20610:15;20602:23;;20325:307;;;:::o;20638:308::-;20700:4;20790:18;20782:6;20779:30;20776:56;;;20812:18;;:::i;:::-;20776:56;20850:29;20872:6;20850:29;:::i;:::-;20842:37;;20934:4;20928;20924:15;20916:23;;20638:308;;;:::o;20952:132::-;21019:4;21042:3;21034:11;;21072:4;21067:3;21063:14;21055:22;;20952:132;;;:::o;21090:114::-;21157:6;21191:5;21185:12;21175:22;;21090:114;;;:::o;21210:98::-;21261:6;21295:5;21289:12;21279:22;;21210:98;;;:::o;21314:99::-;21366:6;21400:5;21394:12;21384:22;;21314:99;;;:::o;21419:113::-;21489:4;21521;21516:3;21512:14;21504:22;;21419:113;;;:::o;21538:184::-;21637:11;21671:6;21666:3;21659:19;21711:4;21706:3;21702:14;21687:29;;21538:184;;;;:::o;21728:168::-;21811:11;21845:6;21840:3;21833:19;21885:4;21880:3;21876:14;21861:29;;21728:168;;;;:::o;21902:169::-;21986:11;22020:6;22015:3;22008:19;22060:4;22055:3;22051:14;22036:29;;21902:169;;;;:::o;22077:148::-;22179:11;22216:3;22201:18;;22077:148;;;;:::o;22231:305::-;22271:3;22290:20;22308:1;22290:20;:::i;:::-;22285:25;;22324:20;22342:1;22324:20;:::i;:::-;22319:25;;22478:1;22410:66;22406:74;22403:1;22400:81;22397:107;;;22484:18;;:::i;:::-;22397:107;22528:1;22525;22521:9;22514:16;;22231:305;;;;:::o;22542:185::-;22582:1;22599:20;22617:1;22599:20;:::i;:::-;22594:25;;22633:20;22651:1;22633:20;:::i;:::-;22628:25;;22672:1;22662:35;;22677:18;;:::i;:::-;22662:35;22719:1;22716;22712:9;22707:14;;22542:185;;;;:::o;22733:191::-;22773:4;22793:20;22811:1;22793:20;:::i;:::-;22788:25;;22827:20;22845:1;22827:20;:::i;:::-;22822:25;;22866:1;22863;22860:8;22857:34;;;22871:18;;:::i;:::-;22857:34;22916:1;22913;22909:9;22901:17;;22733:191;;;;:::o;22930:96::-;22967:7;22996:24;23014:5;22996:24;:::i;:::-;22985:35;;22930:96;;;:::o;23032:104::-;23077:7;23106:24;23124:5;23106:24;:::i;:::-;23095:35;;23032:104;;;:::o;23142:90::-;23176:7;23219:5;23212:13;23205:21;23194:32;;23142:90;;;:::o;23238:149::-;23274:7;23314:66;23307:5;23303:78;23292:89;;23238:149;;;:::o;23393:126::-;23430:7;23470:42;23463:5;23459:54;23448:65;;23393:126;;;:::o;23525:77::-;23562:7;23591:5;23580:16;;23525:77;;;:::o;23608:144::-;23676:9;23709:37;23740:5;23709:37;:::i;:::-;23696:50;;23608:144;;;:::o;23758:121::-;23816:9;23849:24;23867:5;23849:24;:::i;:::-;23836:37;;23758:121;;;:::o;23885:126::-;23935:9;23968:37;23999:5;23968:37;:::i;:::-;23955:50;;23885:126;;;:::o;24017:113::-;24067:9;24100:24;24118:5;24100:24;:::i;:::-;24087:37;;24017:113;;;:::o;24136:154::-;24220:6;24215:3;24210;24197:30;24282:1;24273:6;24268:3;24264:16;24257:27;24136:154;;;:::o;24296:307::-;24364:1;24374:113;24388:6;24385:1;24382:13;24374:113;;;24473:1;24468:3;24464:11;24458:18;24454:1;24449:3;24445:11;24438:39;24410:2;24407:1;24403:10;24398:15;;24374:113;;;24505:6;24502:1;24499:13;24496:101;;;24585:1;24576:6;24571:3;24567:16;24560:27;24496:101;24345:258;24296:307;;;:::o;24609:171::-;24648:3;24671:24;24689:5;24671:24;:::i;:::-;24662:33;;24717:4;24710:5;24707:15;24704:41;;;24725:18;;:::i;:::-;24704:41;24772:1;24765:5;24761:13;24754:20;;24609:171;;;:::o;24786:320::-;24830:6;24867:1;24861:4;24857:12;24847:22;;24914:1;24908:4;24904:12;24935:18;24925:81;;24991:4;24983:6;24979:17;24969:27;;24925:81;25053:2;25045:6;25042:14;25022:18;25019:38;25016:84;;;25072:18;;:::i;:::-;25016:84;24837:269;24786:320;;;:::o;25112:281::-;25195:27;25217:4;25195:27;:::i;:::-;25187:6;25183:40;25325:6;25313:10;25310:22;25289:18;25277:10;25274:34;25271:62;25268:88;;;25336:18;;:::i;:::-;25268:88;25376:10;25372:2;25365:22;25155:238;25112:281;;:::o;25399:233::-;25438:3;25461:24;25479:5;25461:24;:::i;:::-;25452:33;;25507:66;25500:5;25497:77;25494:103;;;25577:18;;:::i;:::-;25494:103;25624:1;25617:5;25613:13;25606:20;;25399:233;;;:::o;25638:176::-;25670:1;25687:20;25705:1;25687:20;:::i;:::-;25682:25;;25721:20;25739:1;25721:20;:::i;:::-;25716:25;;25760:1;25750:35;;25765:18;;:::i;:::-;25750:35;25806:1;25803;25799:9;25794:14;;25638:176;;;;:::o;25820:180::-;25868:77;25865:1;25858:88;25965:4;25962:1;25955:15;25989:4;25986:1;25979:15;26006:180;26054:77;26051:1;26044:88;26151:4;26148:1;26141:15;26175:4;26172:1;26165:15;26192:180;26240:77;26237:1;26230:88;26337:4;26334:1;26327:15;26361:4;26358:1;26351:15;26378:180;26426:77;26423:1;26416:88;26523:4;26520:1;26513:15;26547:4;26544:1;26537:15;26564:180;26612:77;26609:1;26602:88;26709:4;26706:1;26699:15;26733:4;26730:1;26723:15;26750:117;26859:1;26856;26849:12;26873:117;26982:1;26979;26972:12;26996:117;27105:1;27102;27095:12;27119:117;27228:1;27225;27218:12;27242:117;27351:1;27348;27341:12;27365:117;27474:1;27471;27464:12;27488:102;27529:6;27580:2;27576:7;27571:2;27564:5;27560:14;27556:28;27546:38;;27488:102;;;:::o;27596:221::-;27736:34;27732:1;27724:6;27720:14;27713:58;27805:4;27800:2;27792:6;27788:15;27781:29;27596:221;:::o;27823:225::-;27963:34;27959:1;27951:6;27947:14;27940:58;28032:8;28027:2;28019:6;28015:15;28008:33;27823:225;:::o;28054:165::-;28194:17;28190:1;28182:6;28178:14;28171:41;28054:165;:::o;28225:178::-;28365:30;28361:1;28353:6;28349:14;28342:54;28225:178;:::o;28409:155::-;28549:7;28545:1;28537:6;28533:14;28526:31;28409:155;:::o;28570:182::-;28710:34;28706:1;28698:6;28694:14;28687:58;28570:182;:::o;28758:122::-;28831:24;28849:5;28831:24;:::i;:::-;28824:5;28821:35;28811:63;;28870:1;28867;28860:12;28811:63;28758:122;:::o;28886:138::-;28967:32;28993:5;28967:32;:::i;:::-;28960:5;28957:43;28947:71;;29014:1;29011;29004:12;28947:71;28886:138;:::o;29030:116::-;29100:21;29115:5;29100:21;:::i;:::-;29093:5;29090:32;29080:60;;29136:1;29133;29126:12;29080:60;29030:116;:::o;29152:120::-;29224:23;29241:5;29224:23;:::i;:::-;29217:5;29214:34;29204:62;;29262:1;29259;29252:12;29204:62;29152:120;:::o;29278:122::-;29351:24;29369:5;29351:24;:::i;:::-;29344:5;29341:35;29331:63;;29390:1;29387;29380:12;29331:63;29278:122;:::o

Swarm Source

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